Developer Docs

Tower DevOps Monitoring

The Tower dashboard surfaces project health telemetry directly in the admin UI, providing a single pane of glass for platform operations. Three widgets give platform admins real-time visibility into development progress, commit activity, and test coverage.

NOTE

These widgets are powered by the Tower Rust subgraph's devops module, which reads local markdown files and git history. In containerized environments, the relevant directories must be volume-mounted.


Widgets

TODO Aggregation

The Project Status widget parses BACKEND_TODO.md and FRONTEND_TODO.md to display:

  • Overall progress bar โ€” Aggregate completion percentage across all TODO files
  • Per-file breakdown โ€” Expandable sections showing open/completed counts per ### section
  • Checkbox states: - [ ] (open), - [x] (completed), - [/] (in-progress, counted as open)

GraphQL Query:

query {
  projectStatus {
    totalOpen
    totalCompleted
    overallCompletionPct
    reports {
      file
      total
      open
      completed
      completionPct
      sections { name total open completed }
    }
  }
}

Git Activity Feed

Recent commits across all 4 Ngwenya repositories, merged and sorted by timestamp (newest first):

Repository Default Path
ngwenya-federation ../../
ngwenya-front ../../../ngwenya-front
ngwenya-dev ../../../ngwenya-dev
ngwenya-support ../../../ngwenya-support

Each commit displays: short hash, author name, first line of message, relative timestamp, and a color-coded repo badge.

GraphQL Query:

query {
  gitActivity(limit: 15) {
    reposScanned
    reposAvailable
    commits { hash author message timestamp repo }
  }
}

Test Coverage Heatmap

Visual heatmap parsed from COVERAGE_REPORT.md:

  • Aggregate metrics โ€” Statement, branch, function, and line coverage percentages
  • Per-service rows โ€” Color-coded cells: ๐ŸŸข >70%, ๐ŸŸก 40-70%, ๐Ÿ”ด <40%
  • Sortable columns โ€” Click any metric header to sort ascending/descending
  • Tier badges โ€” Excellent, Good, Moderate, Low classifications

GraphQL Query:

query {
  coverageOverview {
    aggregateStatements
    aggregateBranches
    aggregateFunctions
    aggregateLines
    lastAudited
    totalTests
    services { name statements branches functions lines suites tier }
  }
}

Architecture

Backend Module

The devops module in the Tower Rust subgraph consists of 3 file-system parsers:

apps/tower/src/devops/
โ”œโ”€โ”€ mod.rs              # Module root + DevOpsConfig struct
โ”œโ”€โ”€ todo_parser.rs      # Markdown checkbox regex parser
โ”œโ”€โ”€ git_feed.rs         # git2-based commit log reader
โ””โ”€โ”€ coverage_parser.rs  # Coverage report table parser

All parsers are synchronous and file-system bound โ€” no network I/O. They read from paths configured via environment variables and return parsed structs that are converted to GraphQL types via From implementations.

Configuration

Variable Default Description
TOWER_DOCS_DIR ../../docs Path to the docs/ directory containing TODO and coverage files
TOWER_GIT_REPOS ../../,../../../ngwenya-front,../../../ngwenya-dev,../../../ngwenya-support Comma-separated paths to git repositories

Paths are relative to the Tower binary's working directory. For Docker environments, use absolute paths with volume mounts.

Security

All 3 queries are gated by require_auth() โ€” the same authentication guard used by all existing Tower queries. Only users with the user header (set by the Gateway's propagateHeaders) can access these endpoints.

Graceful Degradation

Each parser handles missing files/repos gracefully:

  • TODO parser: Returns empty reports if files don't exist
  • Git feed: Skips repos that can't be opened, reports reposScanned vs reposAvailable
  • Coverage parser: Returns zeroed overview if COVERAGE_REPORT.md is missing

Frontend Components

Component Path Purpose
ProjectStatusWidget.svelte src/lib/components/admin/ TODO progress bars + Git commit timeline
CoverageHeatmap.svelte src/lib/components/admin/ Sortable coverage table with color-coded cells
towerDevOps.ts src/lib/queries/ GraphQL queries and TypeScript interfaces

Both widgets are mounted on the Tower Overview tab, positioned between the Error Tracking and Quick Actions sections.