@rengler33/prov 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +314 -0
- package/dist/cli.d.ts +26 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +381 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/agent.d.ts +107 -0
- package/dist/commands/agent.d.ts.map +1 -0
- package/dist/commands/agent.js +197 -0
- package/dist/commands/agent.js.map +1 -0
- package/dist/commands/agent.test.d.ts +5 -0
- package/dist/commands/agent.test.d.ts.map +1 -0
- package/dist/commands/agent.test.js +199 -0
- package/dist/commands/agent.test.js.map +1 -0
- package/dist/commands/constraint.d.ts +100 -0
- package/dist/commands/constraint.d.ts.map +1 -0
- package/dist/commands/constraint.js +763 -0
- package/dist/commands/constraint.js.map +1 -0
- package/dist/commands/constraint.test.d.ts +9 -0
- package/dist/commands/constraint.test.d.ts.map +1 -0
- package/dist/commands/constraint.test.js +470 -0
- package/dist/commands/constraint.test.js.map +1 -0
- package/dist/commands/graph.d.ts +99 -0
- package/dist/commands/graph.d.ts.map +1 -0
- package/dist/commands/graph.js +552 -0
- package/dist/commands/graph.js.map +1 -0
- package/dist/commands/graph.test.d.ts +2 -0
- package/dist/commands/graph.test.d.ts.map +1 -0
- package/dist/commands/graph.test.js +258 -0
- package/dist/commands/graph.test.js.map +1 -0
- package/dist/commands/impact.d.ts +83 -0
- package/dist/commands/impact.d.ts.map +1 -0
- package/dist/commands/impact.js +319 -0
- package/dist/commands/impact.js.map +1 -0
- package/dist/commands/impact.test.d.ts +2 -0
- package/dist/commands/impact.test.d.ts.map +1 -0
- package/dist/commands/impact.test.js +234 -0
- package/dist/commands/impact.test.js.map +1 -0
- package/dist/commands/init.d.ts +45 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +94 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/init.test.d.ts +7 -0
- package/dist/commands/init.test.d.ts.map +1 -0
- package/dist/commands/init.test.js +174 -0
- package/dist/commands/init.test.js.map +1 -0
- package/dist/commands/integration.test.d.ts +10 -0
- package/dist/commands/integration.test.d.ts.map +1 -0
- package/dist/commands/integration.test.js +456 -0
- package/dist/commands/integration.test.js.map +1 -0
- package/dist/commands/mcp.d.ts +21 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +616 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/mcp.test.d.ts +7 -0
- package/dist/commands/mcp.test.d.ts.map +1 -0
- package/dist/commands/mcp.test.js +132 -0
- package/dist/commands/mcp.test.js.map +1 -0
- package/dist/commands/plan.d.ts +218 -0
- package/dist/commands/plan.d.ts.map +1 -0
- package/dist/commands/plan.js +1307 -0
- package/dist/commands/plan.js.map +1 -0
- package/dist/commands/plan.test.d.ts +9 -0
- package/dist/commands/plan.test.d.ts.map +1 -0
- package/dist/commands/plan.test.js +569 -0
- package/dist/commands/plan.test.js.map +1 -0
- package/dist/commands/spec.d.ts +94 -0
- package/dist/commands/spec.d.ts.map +1 -0
- package/dist/commands/spec.js +635 -0
- package/dist/commands/spec.js.map +1 -0
- package/dist/commands/spec.test.d.ts +9 -0
- package/dist/commands/spec.test.d.ts.map +1 -0
- package/dist/commands/spec.test.js +407 -0
- package/dist/commands/spec.test.js.map +1 -0
- package/dist/commands/trace.d.ts +157 -0
- package/dist/commands/trace.d.ts.map +1 -0
- package/dist/commands/trace.js +847 -0
- package/dist/commands/trace.js.map +1 -0
- package/dist/commands/trace.test.d.ts +9 -0
- package/dist/commands/trace.test.d.ts.map +1 -0
- package/dist/commands/trace.test.js +524 -0
- package/dist/commands/trace.test.js.map +1 -0
- package/dist/graph.d.ts +204 -0
- package/dist/graph.d.ts.map +1 -0
- package/dist/graph.js +496 -0
- package/dist/graph.js.map +1 -0
- package/dist/graph.test.d.ts +2 -0
- package/dist/graph.test.d.ts.map +1 -0
- package/dist/graph.test.js +382 -0
- package/dist/graph.test.js.map +1 -0
- package/dist/hash.d.ts +72 -0
- package/dist/hash.d.ts.map +1 -0
- package/dist/hash.js +137 -0
- package/dist/hash.js.map +1 -0
- package/dist/hash.test.d.ts +2 -0
- package/dist/hash.test.d.ts.map +1 -0
- package/dist/hash.test.js +227 -0
- package/dist/hash.test.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +64 -0
- package/dist/index.js.map +1 -0
- package/dist/index.test.d.ts +2 -0
- package/dist/index.test.d.ts.map +1 -0
- package/dist/index.test.js +11 -0
- package/dist/index.test.js.map +1 -0
- package/dist/output.d.ts +84 -0
- package/dist/output.d.ts.map +1 -0
- package/dist/output.js +175 -0
- package/dist/output.js.map +1 -0
- package/dist/output.test.d.ts +7 -0
- package/dist/output.test.d.ts.map +1 -0
- package/dist/output.test.js +146 -0
- package/dist/output.test.js.map +1 -0
- package/dist/staleness.d.ts +162 -0
- package/dist/staleness.d.ts.map +1 -0
- package/dist/staleness.js +309 -0
- package/dist/staleness.js.map +1 -0
- package/dist/staleness.test.d.ts +2 -0
- package/dist/staleness.test.d.ts.map +1 -0
- package/dist/staleness.test.js +448 -0
- package/dist/staleness.test.js.map +1 -0
- package/dist/storage.d.ts +267 -0
- package/dist/storage.d.ts.map +1 -0
- package/dist/storage.js +623 -0
- package/dist/storage.js.map +1 -0
- package/dist/storage.test.d.ts +5 -0
- package/dist/storage.test.d.ts.map +1 -0
- package/dist/storage.test.js +434 -0
- package/dist/storage.test.js.map +1 -0
- package/dist/types.d.ts +270 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +12 -0
- package/dist/types.js.map +1 -0
- package/dist/types.test.d.ts +2 -0
- package/dist/types.test.d.ts.map +1 -0
- package/dist/types.test.js +232 -0
- package/dist/types.test.js.map +1 -0
- package/dist/watcher.d.ts +139 -0
- package/dist/watcher.d.ts.map +1 -0
- package/dist/watcher.js +406 -0
- package/dist/watcher.js.map +1 -0
- package/dist/watcher.test.d.ts +5 -0
- package/dist/watcher.test.d.ts.map +1 -0
- package/dist/watcher.test.js +327 -0
- package/dist/watcher.test.js.map +1 -0
- package/package.json +53 -0
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* prov graph commands implementation.
|
|
3
|
+
*
|
|
4
|
+
* Commands for visualizing and analyzing the intent graph:
|
|
5
|
+
* - graph show: Display ASCII graph in terminal
|
|
6
|
+
* - graph export: Export graph for external tools (dot, json, mermaid)
|
|
7
|
+
* - graph orphans: Find untraced code
|
|
8
|
+
*
|
|
9
|
+
* @see req:cli:graph-show
|
|
10
|
+
* @see req:cli:graph-export
|
|
11
|
+
* @see req:cli:graph-orphans
|
|
12
|
+
*/
|
|
13
|
+
import { type GlobalOptions } from '../cli.js';
|
|
14
|
+
import type { EntityId, NodeType } from '../types.js';
|
|
15
|
+
/**
|
|
16
|
+
* Options for graph show command.
|
|
17
|
+
*/
|
|
18
|
+
export interface GraphShowOptions {
|
|
19
|
+
depth?: number;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Result of graph show command.
|
|
23
|
+
*/
|
|
24
|
+
export interface GraphShowResult {
|
|
25
|
+
success: boolean;
|
|
26
|
+
nodeCount?: number;
|
|
27
|
+
edgeCount?: number;
|
|
28
|
+
tree?: string;
|
|
29
|
+
error?: string;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Options for graph export command.
|
|
33
|
+
*/
|
|
34
|
+
export interface GraphExportOptions {
|
|
35
|
+
format: 'dot' | 'json' | 'mermaid';
|
|
36
|
+
output?: string;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Result of graph export command.
|
|
40
|
+
*/
|
|
41
|
+
export interface GraphExportResult {
|
|
42
|
+
success: boolean;
|
|
43
|
+
format?: string;
|
|
44
|
+
outputFile?: string;
|
|
45
|
+
content?: string;
|
|
46
|
+
error?: string;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Options for graph orphans command.
|
|
50
|
+
*/
|
|
51
|
+
export interface GraphOrphansOptions {
|
|
52
|
+
scan?: string[];
|
|
53
|
+
format?: string;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Orphan entry.
|
|
57
|
+
*/
|
|
58
|
+
export interface OrphanEntry {
|
|
59
|
+
id: EntityId;
|
|
60
|
+
type: NodeType;
|
|
61
|
+
description: string;
|
|
62
|
+
reason: string;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Result of graph orphans command.
|
|
66
|
+
*/
|
|
67
|
+
export interface GraphOrphansResult {
|
|
68
|
+
success: boolean;
|
|
69
|
+
orphanRequirements?: OrphanEntry[];
|
|
70
|
+
orphanArtifacts?: OrphanEntry[];
|
|
71
|
+
totalOrphans?: number;
|
|
72
|
+
error?: string;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Execute the graph show command.
|
|
76
|
+
*
|
|
77
|
+
* Displays an ASCII representation of the intent graph in the terminal.
|
|
78
|
+
*
|
|
79
|
+
* @see req:cli:graph-show
|
|
80
|
+
*/
|
|
81
|
+
export declare function runGraphShow(globalOpts: GlobalOptions, options: GraphShowOptions): void;
|
|
82
|
+
/**
|
|
83
|
+
* Execute the graph export command.
|
|
84
|
+
*
|
|
85
|
+
* Exports the intent graph to DOT, JSON, or Mermaid format.
|
|
86
|
+
*
|
|
87
|
+
* @see req:cli:graph-export
|
|
88
|
+
*/
|
|
89
|
+
export declare function runGraphExport(globalOpts: GlobalOptions, options: GraphExportOptions): void;
|
|
90
|
+
/**
|
|
91
|
+
* Execute the graph orphans command.
|
|
92
|
+
*
|
|
93
|
+
* Finds untraced requirements (no step traces to them) and orphan artifacts
|
|
94
|
+
* (no step implements them).
|
|
95
|
+
*
|
|
96
|
+
* @see req:cli:graph-orphans
|
|
97
|
+
*/
|
|
98
|
+
export declare function runGraphOrphans(globalOpts: GlobalOptions, _options: GraphOrphansOptions): void;
|
|
99
|
+
//# sourceMappingURL=graph.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../../src/commands/graph.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,WAAW,CAAC;AAI/C,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAuB,MAAM,aAAa,CAAC;AAM3E;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,SAAS,CAAC;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,QAAQ,CAAC;IACb,IAAI,EAAE,QAAQ,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,kBAAkB,CAAC,EAAE,WAAW,EAAE,CAAC;IACnC,eAAe,CAAC,EAAE,WAAW,EAAE,CAAC;IAChC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAwRD;;;;;;GAMG;AACH,wBAAgB,YAAY,CAC1B,UAAU,EAAE,aAAa,EACzB,OAAO,EAAE,gBAAgB,GACxB,IAAI,CAwDN;AAMD;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,UAAU,EAAE,aAAa,EACzB,OAAO,EAAE,kBAAkB,GAC1B,IAAI,CAqGN;AAMD;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAC7B,UAAU,EAAE,aAAa,EACzB,QAAQ,EAAE,mBAAmB,GAC5B,IAAI,CAoHN"}
|
|
@@ -0,0 +1,552 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* prov graph commands implementation.
|
|
3
|
+
*
|
|
4
|
+
* Commands for visualizing and analyzing the intent graph:
|
|
5
|
+
* - graph show: Display ASCII graph in terminal
|
|
6
|
+
* - graph export: Export graph for external tools (dot, json, mermaid)
|
|
7
|
+
* - graph orphans: Find untraced code
|
|
8
|
+
*
|
|
9
|
+
* @see req:cli:graph-show
|
|
10
|
+
* @see req:cli:graph-export
|
|
11
|
+
* @see req:cli:graph-orphans
|
|
12
|
+
*/
|
|
13
|
+
import { writeFileSync } from 'node:fs';
|
|
14
|
+
import { isInitialized, loadGraph } from '../storage.js';
|
|
15
|
+
import { output, error, resolveFormat } from '../output.js';
|
|
16
|
+
// ============================================================================
|
|
17
|
+
// Graph Visualization Helpers
|
|
18
|
+
// ============================================================================
|
|
19
|
+
/**
|
|
20
|
+
* Get display symbol for a node type.
|
|
21
|
+
*/
|
|
22
|
+
function getNodeTypeSymbol(type) {
|
|
23
|
+
const symbols = {
|
|
24
|
+
spec: '📜',
|
|
25
|
+
requirement: '📋',
|
|
26
|
+
constraint: '⚖️',
|
|
27
|
+
invariant: '🔒',
|
|
28
|
+
plan: '📝',
|
|
29
|
+
decision: '🔀',
|
|
30
|
+
step: '📌',
|
|
31
|
+
artifact: '📄',
|
|
32
|
+
};
|
|
33
|
+
return symbols[type];
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Get display label for an edge type.
|
|
37
|
+
*/
|
|
38
|
+
function getEdgeTypeLabel(type) {
|
|
39
|
+
const labels = {
|
|
40
|
+
contains: 'contains',
|
|
41
|
+
derives_from: 'derives from',
|
|
42
|
+
traces_to: 'traces to',
|
|
43
|
+
implements: 'implements',
|
|
44
|
+
depends_on: 'depends on',
|
|
45
|
+
};
|
|
46
|
+
return labels[type];
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Build ASCII tree representation of the graph.
|
|
50
|
+
*/
|
|
51
|
+
function buildAsciiTree(graph, maxDepth) {
|
|
52
|
+
const lines = [];
|
|
53
|
+
const visited = new Set();
|
|
54
|
+
// Find root nodes (specs and constraints - top-level entities)
|
|
55
|
+
const specs = graph.getNodesByType('spec');
|
|
56
|
+
const constraints = graph.getNodesByType('constraint');
|
|
57
|
+
const plans = graph.getNodesByType('plan');
|
|
58
|
+
lines.push('Intent Graph');
|
|
59
|
+
lines.push('════════════════════════════════════════');
|
|
60
|
+
lines.push('');
|
|
61
|
+
// Display summary
|
|
62
|
+
lines.push(`Nodes: ${graph.nodeCount} Edges: ${graph.edgeCount}`);
|
|
63
|
+
lines.push(`Specs: ${specs.length} Constraints: ${constraints.length} Plans: ${plans.length}`);
|
|
64
|
+
lines.push('');
|
|
65
|
+
// Render each spec tree
|
|
66
|
+
for (const spec of specs) {
|
|
67
|
+
renderNode(graph, spec, lines, visited, '', true, 0, maxDepth);
|
|
68
|
+
lines.push('');
|
|
69
|
+
}
|
|
70
|
+
// Render each constraint tree
|
|
71
|
+
for (const constraint of constraints) {
|
|
72
|
+
if (!visited.has(constraint.id)) {
|
|
73
|
+
renderNode(graph, constraint, lines, visited, '', true, 0, maxDepth);
|
|
74
|
+
lines.push('');
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
// Render plans that weren't visited through other paths
|
|
78
|
+
for (const plan of plans) {
|
|
79
|
+
if (!visited.has(plan.id)) {
|
|
80
|
+
renderNode(graph, plan, lines, visited, '', true, 0, maxDepth);
|
|
81
|
+
lines.push('');
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return lines.join('\n');
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Recursively render a node and its children.
|
|
88
|
+
*/
|
|
89
|
+
function renderNode(graph, node, lines, visited, prefix, isLast, depth, maxDepth) {
|
|
90
|
+
if (visited.has(node.id)) {
|
|
91
|
+
// Already visited - show reference
|
|
92
|
+
const connector = isLast ? '└─' : '├─';
|
|
93
|
+
const symbol = getNodeTypeSymbol(node.type);
|
|
94
|
+
lines.push(`${prefix}${connector} ${symbol} ${node.id} (ref)`);
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
visited.add(node.id);
|
|
98
|
+
const connector = isLast ? '└─' : '├─';
|
|
99
|
+
const symbol = getNodeTypeSymbol(node.type);
|
|
100
|
+
const label = getNodeLabel(node);
|
|
101
|
+
lines.push(`${prefix}${connector} ${symbol} ${node.id}`);
|
|
102
|
+
if (label) {
|
|
103
|
+
const labelPrefix = prefix + (isLast ? ' ' : '│ ');
|
|
104
|
+
lines.push(`${labelPrefix} ${label}`);
|
|
105
|
+
}
|
|
106
|
+
// Check depth limit
|
|
107
|
+
if (maxDepth !== undefined && depth >= maxDepth) {
|
|
108
|
+
const outgoing = graph.getOutgoingEdges(node.id);
|
|
109
|
+
if (outgoing.length > 0) {
|
|
110
|
+
const childPrefix = prefix + (isLast ? ' ' : '│ ');
|
|
111
|
+
lines.push(`${childPrefix}└─ ... (${outgoing.length} children)`);
|
|
112
|
+
}
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
// Get children (outgoing edges)
|
|
116
|
+
const outgoing = graph.getOutgoingEdges(node.id);
|
|
117
|
+
const childPrefix = prefix + (isLast ? ' ' : '│ ');
|
|
118
|
+
for (let i = 0; i < outgoing.length; i++) {
|
|
119
|
+
const edge = outgoing[i];
|
|
120
|
+
const childNode = graph.getNode(edge.to);
|
|
121
|
+
if (childNode !== undefined) {
|
|
122
|
+
const isChildLast = i === outgoing.length - 1;
|
|
123
|
+
renderNode(graph, childNode, lines, visited, childPrefix, isChildLast, depth + 1, maxDepth);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Get a label for display from node data.
|
|
129
|
+
*/
|
|
130
|
+
function getNodeLabel(node) {
|
|
131
|
+
const data = node.data;
|
|
132
|
+
if (data['title'] !== undefined && typeof data['title'] === 'string') {
|
|
133
|
+
return data['title'];
|
|
134
|
+
}
|
|
135
|
+
if (data['description'] !== undefined && typeof data['description'] === 'string') {
|
|
136
|
+
const desc = data['description'];
|
|
137
|
+
return desc.length > 50 ? desc.slice(0, 47) + '...' : desc;
|
|
138
|
+
}
|
|
139
|
+
if (data['action'] !== undefined && typeof data['action'] === 'string') {
|
|
140
|
+
return data['action'];
|
|
141
|
+
}
|
|
142
|
+
if (data['rule'] !== undefined && typeof data['rule'] === 'string') {
|
|
143
|
+
return data['rule'];
|
|
144
|
+
}
|
|
145
|
+
return '';
|
|
146
|
+
}
|
|
147
|
+
// ============================================================================
|
|
148
|
+
// Graph Export Helpers
|
|
149
|
+
// ============================================================================
|
|
150
|
+
/**
|
|
151
|
+
* Export graph to DOT format (Graphviz).
|
|
152
|
+
*/
|
|
153
|
+
function exportToDot(graph) {
|
|
154
|
+
const lines = [];
|
|
155
|
+
lines.push('digraph intent_graph {');
|
|
156
|
+
lines.push(' rankdir=TB;');
|
|
157
|
+
lines.push(' node [shape=box, fontname="Arial"];');
|
|
158
|
+
lines.push(' edge [fontname="Arial", fontsize=10];');
|
|
159
|
+
lines.push('');
|
|
160
|
+
// Define node styles by type
|
|
161
|
+
lines.push(' // Node styles');
|
|
162
|
+
lines.push(' node [style=filled];');
|
|
163
|
+
lines.push('');
|
|
164
|
+
// Add nodes grouped by type
|
|
165
|
+
const nodesByType = new Map();
|
|
166
|
+
for (const node of graph.getAllNodes()) {
|
|
167
|
+
const nodes = nodesByType.get(node.type) ?? [];
|
|
168
|
+
nodes.push(node);
|
|
169
|
+
nodesByType.set(node.type, nodes);
|
|
170
|
+
}
|
|
171
|
+
const typeColors = {
|
|
172
|
+
spec: '#e3f2fd',
|
|
173
|
+
requirement: '#fff3e0',
|
|
174
|
+
constraint: '#fce4ec',
|
|
175
|
+
invariant: '#f3e5f5',
|
|
176
|
+
plan: '#e8f5e9',
|
|
177
|
+
decision: '#fff8e1',
|
|
178
|
+
step: '#e0f7fa',
|
|
179
|
+
artifact: '#f5f5f5',
|
|
180
|
+
};
|
|
181
|
+
for (const [type, nodes] of nodesByType) {
|
|
182
|
+
lines.push(` // ${type} nodes`);
|
|
183
|
+
for (const node of nodes) {
|
|
184
|
+
const label = getNodeLabel(node) || node.id;
|
|
185
|
+
const escapedId = node.id.replace(/:/g, '_').replace(/-/g, '_');
|
|
186
|
+
const escapedLabel = label.replace(/"/g, '\\"');
|
|
187
|
+
const color = typeColors[type];
|
|
188
|
+
lines.push(` ${escapedId} [label="${escapedLabel}\\n[${type}]", fillcolor="${color}"];`);
|
|
189
|
+
}
|
|
190
|
+
lines.push('');
|
|
191
|
+
}
|
|
192
|
+
// Add edges
|
|
193
|
+
lines.push(' // Edges');
|
|
194
|
+
for (const edge of graph.getAllEdges()) {
|
|
195
|
+
const from = edge.from.replace(/:/g, '_').replace(/-/g, '_');
|
|
196
|
+
const to = edge.to.replace(/:/g, '_').replace(/-/g, '_');
|
|
197
|
+
const label = getEdgeTypeLabel(edge.type);
|
|
198
|
+
lines.push(` ${from} -> ${to} [label="${label}"];`);
|
|
199
|
+
}
|
|
200
|
+
lines.push('}');
|
|
201
|
+
return lines.join('\n');
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Export graph to Mermaid format.
|
|
205
|
+
*/
|
|
206
|
+
function exportToMermaid(graph) {
|
|
207
|
+
const lines = [];
|
|
208
|
+
lines.push('graph TD');
|
|
209
|
+
lines.push('');
|
|
210
|
+
// Add nodes with styles
|
|
211
|
+
const nodeShapes = {
|
|
212
|
+
spec: ['[[', ']]'],
|
|
213
|
+
requirement: ['{{', '}}'],
|
|
214
|
+
constraint: ['[/', '\\]'],
|
|
215
|
+
invariant: ['((', '))'],
|
|
216
|
+
plan: ['[', ']'],
|
|
217
|
+
decision: ['{', '}'],
|
|
218
|
+
step: ['([', '])'],
|
|
219
|
+
artifact: ['[(', ')]'],
|
|
220
|
+
};
|
|
221
|
+
// Add all nodes
|
|
222
|
+
for (const node of graph.getAllNodes()) {
|
|
223
|
+
const label = getNodeLabel(node) || node.id;
|
|
224
|
+
const escapedId = node.id.replace(/:/g, '_').replace(/-/g, '_');
|
|
225
|
+
const escapedLabel = label.replace(/"/g, "'").replace(/[[\]{}()]/g, '');
|
|
226
|
+
const [open, close] = nodeShapes[node.type];
|
|
227
|
+
lines.push(` ${escapedId}${open}"${escapedLabel}"${close}`);
|
|
228
|
+
}
|
|
229
|
+
lines.push('');
|
|
230
|
+
// Add edges
|
|
231
|
+
for (const edge of graph.getAllEdges()) {
|
|
232
|
+
const from = edge.from.replace(/:/g, '_').replace(/-/g, '_');
|
|
233
|
+
const to = edge.to.replace(/:/g, '_').replace(/-/g, '_');
|
|
234
|
+
const label = getEdgeTypeLabel(edge.type);
|
|
235
|
+
lines.push(` ${from} -->|${label}| ${to}`);
|
|
236
|
+
}
|
|
237
|
+
return lines.join('\n');
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Export graph to JSON format.
|
|
241
|
+
*/
|
|
242
|
+
function exportToJson(graph) {
|
|
243
|
+
return JSON.stringify(graph.toJSON(), null, 2);
|
|
244
|
+
}
|
|
245
|
+
// ============================================================================
|
|
246
|
+
// graph show Command
|
|
247
|
+
// ============================================================================
|
|
248
|
+
/**
|
|
249
|
+
* Execute the graph show command.
|
|
250
|
+
*
|
|
251
|
+
* Displays an ASCII representation of the intent graph in the terminal.
|
|
252
|
+
*
|
|
253
|
+
* @see req:cli:graph-show
|
|
254
|
+
*/
|
|
255
|
+
export function runGraphShow(globalOpts, options) {
|
|
256
|
+
const projectRoot = globalOpts.dir ?? process.cwd();
|
|
257
|
+
const fmt = resolveFormat({ format: globalOpts.format });
|
|
258
|
+
// Check if prov is initialized
|
|
259
|
+
if (!isInitialized(projectRoot)) {
|
|
260
|
+
const result = {
|
|
261
|
+
success: false,
|
|
262
|
+
error: 'prov is not initialized. Run "prov init" first.',
|
|
263
|
+
};
|
|
264
|
+
if (fmt === 'json') {
|
|
265
|
+
output(result, { format: 'json' });
|
|
266
|
+
}
|
|
267
|
+
else if (fmt === 'yaml') {
|
|
268
|
+
output(result, { format: 'yaml' });
|
|
269
|
+
}
|
|
270
|
+
else {
|
|
271
|
+
error(result.error);
|
|
272
|
+
}
|
|
273
|
+
process.exit(1);
|
|
274
|
+
}
|
|
275
|
+
// Load graph
|
|
276
|
+
const loadResult = loadGraph(projectRoot);
|
|
277
|
+
if (!loadResult.success || loadResult.data === undefined) {
|
|
278
|
+
const result = {
|
|
279
|
+
success: false,
|
|
280
|
+
error: loadResult.error ?? 'Failed to load graph',
|
|
281
|
+
};
|
|
282
|
+
if (fmt === 'json') {
|
|
283
|
+
output(result, { format: 'json' });
|
|
284
|
+
}
|
|
285
|
+
else if (fmt === 'yaml') {
|
|
286
|
+
output(result, { format: 'yaml' });
|
|
287
|
+
}
|
|
288
|
+
else {
|
|
289
|
+
error(result.error);
|
|
290
|
+
}
|
|
291
|
+
process.exit(1);
|
|
292
|
+
}
|
|
293
|
+
const graph = loadResult.data;
|
|
294
|
+
// Build ASCII tree
|
|
295
|
+
const tree = buildAsciiTree(graph, options.depth);
|
|
296
|
+
const result = {
|
|
297
|
+
success: true,
|
|
298
|
+
nodeCount: graph.nodeCount,
|
|
299
|
+
edgeCount: graph.edgeCount,
|
|
300
|
+
tree,
|
|
301
|
+
};
|
|
302
|
+
if (fmt === 'json') {
|
|
303
|
+
output(result, { format: 'json' });
|
|
304
|
+
}
|
|
305
|
+
else if (fmt === 'yaml') {
|
|
306
|
+
output(result, { format: 'yaml' });
|
|
307
|
+
}
|
|
308
|
+
else {
|
|
309
|
+
process.stdout.write('\n' + tree + '\n');
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
// ============================================================================
|
|
313
|
+
// graph export Command
|
|
314
|
+
// ============================================================================
|
|
315
|
+
/**
|
|
316
|
+
* Execute the graph export command.
|
|
317
|
+
*
|
|
318
|
+
* Exports the intent graph to DOT, JSON, or Mermaid format.
|
|
319
|
+
*
|
|
320
|
+
* @see req:cli:graph-export
|
|
321
|
+
*/
|
|
322
|
+
export function runGraphExport(globalOpts, options) {
|
|
323
|
+
const projectRoot = globalOpts.dir ?? process.cwd();
|
|
324
|
+
const fmt = resolveFormat({ format: globalOpts.format });
|
|
325
|
+
// Check if prov is initialized
|
|
326
|
+
if (!isInitialized(projectRoot)) {
|
|
327
|
+
const result = {
|
|
328
|
+
success: false,
|
|
329
|
+
error: 'prov is not initialized. Run "prov init" first.',
|
|
330
|
+
};
|
|
331
|
+
if (fmt === 'json') {
|
|
332
|
+
output(result, { format: 'json' });
|
|
333
|
+
}
|
|
334
|
+
else if (fmt === 'yaml') {
|
|
335
|
+
output(result, { format: 'yaml' });
|
|
336
|
+
}
|
|
337
|
+
else {
|
|
338
|
+
error(result.error);
|
|
339
|
+
}
|
|
340
|
+
process.exit(1);
|
|
341
|
+
}
|
|
342
|
+
// Load graph
|
|
343
|
+
const loadResult = loadGraph(projectRoot);
|
|
344
|
+
if (!loadResult.success || loadResult.data === undefined) {
|
|
345
|
+
const result = {
|
|
346
|
+
success: false,
|
|
347
|
+
error: loadResult.error ?? 'Failed to load graph',
|
|
348
|
+
};
|
|
349
|
+
if (fmt === 'json') {
|
|
350
|
+
output(result, { format: 'json' });
|
|
351
|
+
}
|
|
352
|
+
else if (fmt === 'yaml') {
|
|
353
|
+
output(result, { format: 'yaml' });
|
|
354
|
+
}
|
|
355
|
+
else {
|
|
356
|
+
error(result.error);
|
|
357
|
+
}
|
|
358
|
+
process.exit(1);
|
|
359
|
+
}
|
|
360
|
+
const graph = loadResult.data;
|
|
361
|
+
// Generate export content
|
|
362
|
+
let content;
|
|
363
|
+
switch (options.format) {
|
|
364
|
+
case 'dot':
|
|
365
|
+
content = exportToDot(graph);
|
|
366
|
+
break;
|
|
367
|
+
case 'mermaid':
|
|
368
|
+
content = exportToMermaid(graph);
|
|
369
|
+
break;
|
|
370
|
+
case 'json':
|
|
371
|
+
content = exportToJson(graph);
|
|
372
|
+
break;
|
|
373
|
+
}
|
|
374
|
+
// Output or write to file
|
|
375
|
+
if (options.output !== undefined) {
|
|
376
|
+
try {
|
|
377
|
+
writeFileSync(options.output, content);
|
|
378
|
+
const result = {
|
|
379
|
+
success: true,
|
|
380
|
+
format: options.format,
|
|
381
|
+
outputFile: options.output,
|
|
382
|
+
};
|
|
383
|
+
if (fmt === 'json') {
|
|
384
|
+
output(result, { format: 'json' });
|
|
385
|
+
}
|
|
386
|
+
else if (fmt === 'yaml') {
|
|
387
|
+
output(result, { format: 'yaml' });
|
|
388
|
+
}
|
|
389
|
+
else {
|
|
390
|
+
process.stdout.write(`Exported graph to ${options.output} (${options.format} format)\n`);
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
catch (err) {
|
|
394
|
+
const result = {
|
|
395
|
+
success: false,
|
|
396
|
+
error: `Failed to write file: ${err instanceof Error ? err.message : String(err)}`,
|
|
397
|
+
};
|
|
398
|
+
if (fmt === 'json') {
|
|
399
|
+
output(result, { format: 'json' });
|
|
400
|
+
}
|
|
401
|
+
else if (fmt === 'yaml') {
|
|
402
|
+
output(result, { format: 'yaml' });
|
|
403
|
+
}
|
|
404
|
+
else {
|
|
405
|
+
error(result.error);
|
|
406
|
+
}
|
|
407
|
+
process.exit(1);
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
else {
|
|
411
|
+
// Output to stdout
|
|
412
|
+
const result = {
|
|
413
|
+
success: true,
|
|
414
|
+
format: options.format,
|
|
415
|
+
content,
|
|
416
|
+
};
|
|
417
|
+
if (fmt === 'json') {
|
|
418
|
+
output(result, { format: 'json' });
|
|
419
|
+
}
|
|
420
|
+
else if (fmt === 'yaml') {
|
|
421
|
+
output(result, { format: 'yaml' });
|
|
422
|
+
}
|
|
423
|
+
else {
|
|
424
|
+
process.stdout.write(content + '\n');
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
// ============================================================================
|
|
429
|
+
// graph orphans Command
|
|
430
|
+
// ============================================================================
|
|
431
|
+
/**
|
|
432
|
+
* Execute the graph orphans command.
|
|
433
|
+
*
|
|
434
|
+
* Finds untraced requirements (no step traces to them) and orphan artifacts
|
|
435
|
+
* (no step implements them).
|
|
436
|
+
*
|
|
437
|
+
* @see req:cli:graph-orphans
|
|
438
|
+
*/
|
|
439
|
+
export function runGraphOrphans(globalOpts, _options) {
|
|
440
|
+
const projectRoot = globalOpts.dir ?? process.cwd();
|
|
441
|
+
const fmt = resolveFormat({ format: globalOpts.format });
|
|
442
|
+
// Check if prov is initialized
|
|
443
|
+
if (!isInitialized(projectRoot)) {
|
|
444
|
+
const result = {
|
|
445
|
+
success: false,
|
|
446
|
+
error: 'prov is not initialized. Run "prov init" first.',
|
|
447
|
+
};
|
|
448
|
+
if (fmt === 'json') {
|
|
449
|
+
output(result, { format: 'json' });
|
|
450
|
+
}
|
|
451
|
+
else if (fmt === 'yaml') {
|
|
452
|
+
output(result, { format: 'yaml' });
|
|
453
|
+
}
|
|
454
|
+
else {
|
|
455
|
+
error(result.error);
|
|
456
|
+
}
|
|
457
|
+
process.exit(1);
|
|
458
|
+
}
|
|
459
|
+
// Load graph
|
|
460
|
+
const loadResult = loadGraph(projectRoot);
|
|
461
|
+
if (!loadResult.success || loadResult.data === undefined) {
|
|
462
|
+
const result = {
|
|
463
|
+
success: false,
|
|
464
|
+
error: loadResult.error ?? 'Failed to load graph',
|
|
465
|
+
};
|
|
466
|
+
if (fmt === 'json') {
|
|
467
|
+
output(result, { format: 'json' });
|
|
468
|
+
}
|
|
469
|
+
else if (fmt === 'yaml') {
|
|
470
|
+
output(result, { format: 'yaml' });
|
|
471
|
+
}
|
|
472
|
+
else {
|
|
473
|
+
error(result.error);
|
|
474
|
+
}
|
|
475
|
+
process.exit(1);
|
|
476
|
+
}
|
|
477
|
+
const graph = loadResult.data;
|
|
478
|
+
// Find orphan requirements (no step traces to them)
|
|
479
|
+
const orphanRequirements = [];
|
|
480
|
+
for (const reqId of graph.getOrphanRequirements()) {
|
|
481
|
+
const node = graph.getNode(reqId);
|
|
482
|
+
if (node !== undefined) {
|
|
483
|
+
const data = node.data;
|
|
484
|
+
orphanRequirements.push({
|
|
485
|
+
id: reqId,
|
|
486
|
+
type: 'requirement',
|
|
487
|
+
description: data.description ?? '',
|
|
488
|
+
reason: 'No plan step traces to this requirement',
|
|
489
|
+
});
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
// Find orphan artifacts (no step implements them)
|
|
493
|
+
const orphanArtifacts = [];
|
|
494
|
+
for (const artId of graph.getOrphanArtifacts()) {
|
|
495
|
+
const node = graph.getNode(artId);
|
|
496
|
+
if (node !== undefined) {
|
|
497
|
+
const data = node.data;
|
|
498
|
+
orphanArtifacts.push({
|
|
499
|
+
id: artId,
|
|
500
|
+
type: 'artifact',
|
|
501
|
+
description: data.artifact?.path ?? '',
|
|
502
|
+
reason: 'No step implements this artifact',
|
|
503
|
+
});
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
const totalOrphans = orphanRequirements.length + orphanArtifacts.length;
|
|
507
|
+
const result = {
|
|
508
|
+
success: true,
|
|
509
|
+
orphanRequirements,
|
|
510
|
+
orphanArtifacts,
|
|
511
|
+
totalOrphans,
|
|
512
|
+
};
|
|
513
|
+
if (fmt === 'json') {
|
|
514
|
+
output(result, { format: 'json' });
|
|
515
|
+
}
|
|
516
|
+
else if (fmt === 'yaml') {
|
|
517
|
+
output(result, { format: 'yaml' });
|
|
518
|
+
}
|
|
519
|
+
else {
|
|
520
|
+
process.stdout.write('\nOrphan Analysis\n');
|
|
521
|
+
process.stdout.write('════════════════════════════════════════\n\n');
|
|
522
|
+
if (orphanRequirements.length > 0) {
|
|
523
|
+
process.stdout.write(`Unimplemented Requirements (${orphanRequirements.length}):\n`);
|
|
524
|
+
process.stdout.write('─'.repeat(40) + '\n');
|
|
525
|
+
for (const orphan of orphanRequirements) {
|
|
526
|
+
process.stdout.write(` 📋 ${orphan.id}\n`);
|
|
527
|
+
if (orphan.description) {
|
|
528
|
+
process.stdout.write(` ${orphan.description}\n`);
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
process.stdout.write('\n');
|
|
532
|
+
}
|
|
533
|
+
if (orphanArtifacts.length > 0) {
|
|
534
|
+
process.stdout.write(`Orphan Artifacts (${orphanArtifacts.length}):\n`);
|
|
535
|
+
process.stdout.write('─'.repeat(40) + '\n');
|
|
536
|
+
for (const orphan of orphanArtifacts) {
|
|
537
|
+
process.stdout.write(` 📄 ${orphan.id}\n`);
|
|
538
|
+
if (orphan.description) {
|
|
539
|
+
process.stdout.write(` ${orphan.description}\n`);
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
process.stdout.write('\n');
|
|
543
|
+
}
|
|
544
|
+
if (totalOrphans === 0) {
|
|
545
|
+
process.stdout.write('No orphans found. All requirements have implementations.\n\n');
|
|
546
|
+
}
|
|
547
|
+
else {
|
|
548
|
+
process.stdout.write(`Total: ${totalOrphans} orphans found\n\n`);
|
|
549
|
+
}
|
|
550
|
+
}
|
|
551
|
+
}
|
|
552
|
+
//# sourceMappingURL=graph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph.js","sourceRoot":"","sources":["../../src/commands/graph.ts"],"names":[],"mappings":"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"}
|