@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.
Files changed (146) hide show
  1. package/README.md +314 -0
  2. package/dist/cli.d.ts +26 -0
  3. package/dist/cli.d.ts.map +1 -0
  4. package/dist/cli.js +381 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/commands/agent.d.ts +107 -0
  7. package/dist/commands/agent.d.ts.map +1 -0
  8. package/dist/commands/agent.js +197 -0
  9. package/dist/commands/agent.js.map +1 -0
  10. package/dist/commands/agent.test.d.ts +5 -0
  11. package/dist/commands/agent.test.d.ts.map +1 -0
  12. package/dist/commands/agent.test.js +199 -0
  13. package/dist/commands/agent.test.js.map +1 -0
  14. package/dist/commands/constraint.d.ts +100 -0
  15. package/dist/commands/constraint.d.ts.map +1 -0
  16. package/dist/commands/constraint.js +763 -0
  17. package/dist/commands/constraint.js.map +1 -0
  18. package/dist/commands/constraint.test.d.ts +9 -0
  19. package/dist/commands/constraint.test.d.ts.map +1 -0
  20. package/dist/commands/constraint.test.js +470 -0
  21. package/dist/commands/constraint.test.js.map +1 -0
  22. package/dist/commands/graph.d.ts +99 -0
  23. package/dist/commands/graph.d.ts.map +1 -0
  24. package/dist/commands/graph.js +552 -0
  25. package/dist/commands/graph.js.map +1 -0
  26. package/dist/commands/graph.test.d.ts +2 -0
  27. package/dist/commands/graph.test.d.ts.map +1 -0
  28. package/dist/commands/graph.test.js +258 -0
  29. package/dist/commands/graph.test.js.map +1 -0
  30. package/dist/commands/impact.d.ts +83 -0
  31. package/dist/commands/impact.d.ts.map +1 -0
  32. package/dist/commands/impact.js +319 -0
  33. package/dist/commands/impact.js.map +1 -0
  34. package/dist/commands/impact.test.d.ts +2 -0
  35. package/dist/commands/impact.test.d.ts.map +1 -0
  36. package/dist/commands/impact.test.js +234 -0
  37. package/dist/commands/impact.test.js.map +1 -0
  38. package/dist/commands/init.d.ts +45 -0
  39. package/dist/commands/init.d.ts.map +1 -0
  40. package/dist/commands/init.js +94 -0
  41. package/dist/commands/init.js.map +1 -0
  42. package/dist/commands/init.test.d.ts +7 -0
  43. package/dist/commands/init.test.d.ts.map +1 -0
  44. package/dist/commands/init.test.js +174 -0
  45. package/dist/commands/init.test.js.map +1 -0
  46. package/dist/commands/integration.test.d.ts +10 -0
  47. package/dist/commands/integration.test.d.ts.map +1 -0
  48. package/dist/commands/integration.test.js +456 -0
  49. package/dist/commands/integration.test.js.map +1 -0
  50. package/dist/commands/mcp.d.ts +21 -0
  51. package/dist/commands/mcp.d.ts.map +1 -0
  52. package/dist/commands/mcp.js +616 -0
  53. package/dist/commands/mcp.js.map +1 -0
  54. package/dist/commands/mcp.test.d.ts +7 -0
  55. package/dist/commands/mcp.test.d.ts.map +1 -0
  56. package/dist/commands/mcp.test.js +132 -0
  57. package/dist/commands/mcp.test.js.map +1 -0
  58. package/dist/commands/plan.d.ts +218 -0
  59. package/dist/commands/plan.d.ts.map +1 -0
  60. package/dist/commands/plan.js +1307 -0
  61. package/dist/commands/plan.js.map +1 -0
  62. package/dist/commands/plan.test.d.ts +9 -0
  63. package/dist/commands/plan.test.d.ts.map +1 -0
  64. package/dist/commands/plan.test.js +569 -0
  65. package/dist/commands/plan.test.js.map +1 -0
  66. package/dist/commands/spec.d.ts +94 -0
  67. package/dist/commands/spec.d.ts.map +1 -0
  68. package/dist/commands/spec.js +635 -0
  69. package/dist/commands/spec.js.map +1 -0
  70. package/dist/commands/spec.test.d.ts +9 -0
  71. package/dist/commands/spec.test.d.ts.map +1 -0
  72. package/dist/commands/spec.test.js +407 -0
  73. package/dist/commands/spec.test.js.map +1 -0
  74. package/dist/commands/trace.d.ts +157 -0
  75. package/dist/commands/trace.d.ts.map +1 -0
  76. package/dist/commands/trace.js +847 -0
  77. package/dist/commands/trace.js.map +1 -0
  78. package/dist/commands/trace.test.d.ts +9 -0
  79. package/dist/commands/trace.test.d.ts.map +1 -0
  80. package/dist/commands/trace.test.js +524 -0
  81. package/dist/commands/trace.test.js.map +1 -0
  82. package/dist/graph.d.ts +204 -0
  83. package/dist/graph.d.ts.map +1 -0
  84. package/dist/graph.js +496 -0
  85. package/dist/graph.js.map +1 -0
  86. package/dist/graph.test.d.ts +2 -0
  87. package/dist/graph.test.d.ts.map +1 -0
  88. package/dist/graph.test.js +382 -0
  89. package/dist/graph.test.js.map +1 -0
  90. package/dist/hash.d.ts +72 -0
  91. package/dist/hash.d.ts.map +1 -0
  92. package/dist/hash.js +137 -0
  93. package/dist/hash.js.map +1 -0
  94. package/dist/hash.test.d.ts +2 -0
  95. package/dist/hash.test.d.ts.map +1 -0
  96. package/dist/hash.test.js +227 -0
  97. package/dist/hash.test.js.map +1 -0
  98. package/dist/index.d.ts +18 -0
  99. package/dist/index.d.ts.map +1 -0
  100. package/dist/index.js +64 -0
  101. package/dist/index.js.map +1 -0
  102. package/dist/index.test.d.ts +2 -0
  103. package/dist/index.test.d.ts.map +1 -0
  104. package/dist/index.test.js +11 -0
  105. package/dist/index.test.js.map +1 -0
  106. package/dist/output.d.ts +84 -0
  107. package/dist/output.d.ts.map +1 -0
  108. package/dist/output.js +175 -0
  109. package/dist/output.js.map +1 -0
  110. package/dist/output.test.d.ts +7 -0
  111. package/dist/output.test.d.ts.map +1 -0
  112. package/dist/output.test.js +146 -0
  113. package/dist/output.test.js.map +1 -0
  114. package/dist/staleness.d.ts +162 -0
  115. package/dist/staleness.d.ts.map +1 -0
  116. package/dist/staleness.js +309 -0
  117. package/dist/staleness.js.map +1 -0
  118. package/dist/staleness.test.d.ts +2 -0
  119. package/dist/staleness.test.d.ts.map +1 -0
  120. package/dist/staleness.test.js +448 -0
  121. package/dist/staleness.test.js.map +1 -0
  122. package/dist/storage.d.ts +267 -0
  123. package/dist/storage.d.ts.map +1 -0
  124. package/dist/storage.js +623 -0
  125. package/dist/storage.js.map +1 -0
  126. package/dist/storage.test.d.ts +5 -0
  127. package/dist/storage.test.d.ts.map +1 -0
  128. package/dist/storage.test.js +434 -0
  129. package/dist/storage.test.js.map +1 -0
  130. package/dist/types.d.ts +270 -0
  131. package/dist/types.d.ts.map +1 -0
  132. package/dist/types.js +12 -0
  133. package/dist/types.js.map +1 -0
  134. package/dist/types.test.d.ts +2 -0
  135. package/dist/types.test.d.ts.map +1 -0
  136. package/dist/types.test.js +232 -0
  137. package/dist/types.test.js.map +1 -0
  138. package/dist/watcher.d.ts +139 -0
  139. package/dist/watcher.d.ts.map +1 -0
  140. package/dist/watcher.js +406 -0
  141. package/dist/watcher.js.map +1 -0
  142. package/dist/watcher.test.d.ts +5 -0
  143. package/dist/watcher.test.d.ts.map +1 -0
  144. package/dist/watcher.test.js +327 -0
  145. package/dist/watcher.test.js.map +1 -0
  146. 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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"}