Break the @alkdev/taskgraph architecture specs into dependency-ordered implementation tasks across 8 component directories: setup, schema, error, graph, analysis, cost-benefit, frontmatter, api, and review. Each task has clear acceptance criteria referencing specific architecture docs. Three review tasks serve as quality gates at critical junction points (schemas-and-errors, graph-complete, complete-library). The dependency graph is validated acyclic with 9 topological levels enabling significant parallelism across independent work streams.
2.6 KiB
2.6 KiB
id, name, status, depends_on, scope, risk, impact, level
| id | name | status | depends_on | scope | risk | impact | level | |
|---|---|---|---|---|---|---|---|---|
| graph/queries | Implement TaskGraph query methods (hasCycles, findCycles, topologicalOrder, dependencies, dependents, taskCount, getTask) | pending |
|
moderate | medium | component | implementation |
Description
Implement query methods in src/graph/queries.ts and integrate on TaskGraph. The findCycles implementation requires a custom 3-color DFS since graphology-components only gives SCCs, not cycle paths.
Per errors-validation.md:
hasCycles()returns boolean (usesgraphology-dagorgraphology-componentsfor fast check)findCycles()returnsstring[][]— each inner array is an ordered cycle pathtopologicalOrder()throwsCircularDependencyErrorwithcyclespopulated when graph is cyclic (per ADR-003)
Acceptance Criteria
hasCycles(): boolean— usesgraphology-dag.hasCycle()orgraphology-componentsSCC check as fast pre-checkfindCycles(): string[][]:- Uses
stronglyConnectedComponents()as pre-check: if zero multi-node SCCs and no self-loops, skip DFS - Custom 3-color DFS (WHITE/GREY/BLACK) to extract cycle paths
- Returns one representative cycle per back edge, not exhaustive enumeration
- Each inner array is an ordered node sequence where last node has edge back to first
- Uses
topologicalOrder(): string[]:- Uses
graphology-dag.topologicalSort()for the actual sort - Throws
CircularDependencyError(withcyclesfromfindCycles()) when graph is cyclic - Returns
string[]of task IDs in prerequisite→dependent order
- Uses
dependencies(taskId: string): string[]— returns prerequisite task IDs (inNeighbors). ThrowsTaskNotFoundErrorif ID doesn't exist.dependents(taskId: string): string[]— returns dependent task IDs (outNeighbors). ThrowsTaskNotFoundErrorif ID doesn't exist.taskCount(): number— returns number of nodesgetTask(taskId: string): TaskGraphNodeAttributes | undefined— returns node attributes or undefined- Unit tests: cycle detection on known cyclic/acyclic graphs, topologicalOrder on DAG, topologicalOrder throws on cyclic graph, dependency/dependent queries
References
- docs/architecture/api-surface.md — query methods
- docs/architecture/errors-validation.md — cycle handling, CircularDependencyError
- docs/architecture/cost-benefit.md — findCycles algorithm description
- docs/architecture/decisions/003-topo-order-throws-on-cycle.md — ADR-003
Notes
To be filled by implementation agent
Summary
To be filled on completion