@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,309 @@
1
+ /**
2
+ * Staleness detection for the intent graph.
3
+ *
4
+ * Detects when graph nodes are stale due to upstream changes:
5
+ * - Plan staleness: source specs/constraints have changed
6
+ * - Trace staleness: artifact files have changed
7
+ * - Derived staleness: nodes that depend on stale nodes
8
+ *
9
+ * @see req:graph:staleness-detection
10
+ */
11
+ import { readFileSync, existsSync } from 'node:fs';
12
+ import { join } from 'node:path';
13
+ import { computeHash, sha256 } from './hash.js';
14
+ // ============================================================================
15
+ // File Hash Utilities
16
+ // ============================================================================
17
+ /**
18
+ * Compute the hash of a file's raw contents.
19
+ *
20
+ * This hashes the raw file bytes, unlike watcher.computeFileHash which
21
+ * parses YAML and computes a canonical hash. Used for artifact staleness.
22
+ *
23
+ * @param filePath - Absolute or relative path to the file
24
+ * @param projectRoot - Project root for resolving relative paths
25
+ * @returns Hash of file contents, or null if file doesn't exist
26
+ */
27
+ export function computeArtifactHash(filePath, projectRoot = process.cwd()) {
28
+ const absolutePath = filePath.startsWith('/')
29
+ ? filePath
30
+ : join(projectRoot, filePath);
31
+ try {
32
+ if (!existsSync(absolutePath)) {
33
+ return null;
34
+ }
35
+ const content = readFileSync(absolutePath, 'utf8');
36
+ const fullHash = sha256(content);
37
+ return `sha256:${fullHash.slice(0, 12)}`;
38
+ }
39
+ catch {
40
+ return null;
41
+ }
42
+ }
43
+ // ============================================================================
44
+ // Direct Staleness Detection
45
+ // ============================================================================
46
+ /**
47
+ * Check if a plan is stale due to source changes.
48
+ *
49
+ * A plan is stale if any of its source specs/constraints have changed
50
+ * (i.e., current hash differs from the hash recorded at plan creation).
51
+ *
52
+ * @param plan - The plan to check
53
+ * @param graph - The intent graph containing source nodes
54
+ * @returns Staleness info for the plan
55
+ */
56
+ export function checkPlanStaleness(plan, graph) {
57
+ const reasons = [];
58
+ for (const source of plan.sources) {
59
+ const sourceNode = graph.getNode(source.id);
60
+ if (sourceNode === undefined) {
61
+ // Source node no longer exists
62
+ reasons.push({
63
+ type: 'source_missing',
64
+ sourceId: source.id,
65
+ });
66
+ continue;
67
+ }
68
+ // Compute current hash of the source
69
+ const currentHash = sourceNode.hash ?? computeHash(sourceNode.data);
70
+ if (currentHash !== source.hash) {
71
+ reasons.push({
72
+ type: 'source_changed',
73
+ sourceId: source.id,
74
+ expectedHash: source.hash,
75
+ actualHash: currentHash,
76
+ });
77
+ }
78
+ }
79
+ return {
80
+ id: plan.id,
81
+ stale: reasons.length > 0,
82
+ reasons,
83
+ };
84
+ }
85
+ /**
86
+ * Check if a trace is stale due to artifact changes.
87
+ *
88
+ * A trace is stale if:
89
+ * - The artifact file no longer exists
90
+ * - The artifact file's hash differs from the recorded hash
91
+ *
92
+ * @param trace - The trace to check
93
+ * @param projectRoot - Project root for resolving file paths
94
+ * @returns Staleness info for the trace
95
+ */
96
+ export function checkTraceStaleness(trace, projectRoot = process.cwd()) {
97
+ const reasons = [];
98
+ const currentHash = computeArtifactHash(trace.artifact.path, projectRoot);
99
+ if (currentHash === null) {
100
+ // File no longer exists
101
+ reasons.push({
102
+ type: 'artifact_missing',
103
+ path: trace.artifact.path,
104
+ });
105
+ }
106
+ else if (currentHash !== trace.artifactHash) {
107
+ reasons.push({
108
+ type: 'artifact_changed',
109
+ path: trace.artifact.path,
110
+ expectedHash: trace.artifactHash,
111
+ actualHash: currentHash,
112
+ });
113
+ }
114
+ return {
115
+ id: trace.id,
116
+ stale: reasons.length > 0,
117
+ reasons,
118
+ };
119
+ }
120
+ // ============================================================================
121
+ // Transitive Staleness Detection
122
+ // ============================================================================
123
+ /**
124
+ * Find all nodes that are transitively stale.
125
+ *
126
+ * A node is transitively stale if any of its upstream nodes are stale.
127
+ * Uses forward traversal from stale nodes to find all affected downstream nodes.
128
+ *
129
+ * @param graph - The intent graph
130
+ * @param directlyStale - Set of directly stale node IDs
131
+ * @returns Set of transitively stale node IDs (excluding directly stale)
132
+ */
133
+ export function findTransitivelyStale(graph, directlyStale) {
134
+ const transitivelyStale = new Set();
135
+ for (const staleId of directlyStale) {
136
+ // Find all downstream nodes
137
+ const downstream = graph.traverseForward(staleId, {
138
+ includeStart: false,
139
+ });
140
+ for (const downstreamId of downstream) {
141
+ if (!directlyStale.has(downstreamId)) {
142
+ transitivelyStale.add(downstreamId);
143
+ }
144
+ }
145
+ }
146
+ return transitivelyStale;
147
+ }
148
+ // ============================================================================
149
+ // Full Graph Staleness Detection
150
+ // ============================================================================
151
+ /**
152
+ * Detect staleness across the entire intent graph.
153
+ *
154
+ * @param graph - The intent graph to check
155
+ * @param options - Detection options
156
+ * @returns Comprehensive staleness result
157
+ */
158
+ export function detectStaleness(graph, options = {}) {
159
+ const { projectRoot = process.cwd(), nodeTypes, includeTransitive = true, } = options;
160
+ const nodes = new Map();
161
+ const directlyStaleSet = new Set();
162
+ // Check plans for source staleness
163
+ if (nodeTypes === undefined || nodeTypes.includes('plan')) {
164
+ for (const node of graph.getNodesByType('plan')) {
165
+ const plan = node.data;
166
+ const info = checkPlanStaleness(plan, graph);
167
+ nodes.set(plan.id, info);
168
+ if (info.stale) {
169
+ directlyStaleSet.add(plan.id);
170
+ }
171
+ }
172
+ }
173
+ // Check artifacts (traces) for file staleness
174
+ if (nodeTypes === undefined || nodeTypes.includes('artifact')) {
175
+ for (const node of graph.getNodesByType('artifact')) {
176
+ const trace = node.data;
177
+ const info = checkTraceStaleness(trace, projectRoot);
178
+ nodes.set(trace.id, info);
179
+ if (info.stale) {
180
+ directlyStaleSet.add(trace.id);
181
+ }
182
+ }
183
+ }
184
+ // Find transitively stale nodes
185
+ let transitivelyStaleSet = new Set();
186
+ if (includeTransitive && directlyStaleSet.size > 0) {
187
+ transitivelyStaleSet = findTransitivelyStale(graph, directlyStaleSet);
188
+ // Add transitive staleness info to nodes map
189
+ for (const id of transitivelyStaleSet) {
190
+ const existingInfo = nodes.get(id);
191
+ if (existingInfo === undefined) {
192
+ // Find which upstream node caused this to be stale
193
+ const upstreamStale = findUpstreamStale(graph, id, directlyStaleSet);
194
+ nodes.set(id, {
195
+ id,
196
+ stale: true,
197
+ reasons: upstreamStale.map((upstreamId) => ({
198
+ type: 'derived_from_stale',
199
+ upstreamId,
200
+ })),
201
+ });
202
+ }
203
+ }
204
+ }
205
+ const directlyStale = Array.from(directlyStaleSet);
206
+ const transitivelyStale = Array.from(transitivelyStaleSet);
207
+ return {
208
+ totalNodes: graph.nodeCount,
209
+ staleCount: directlyStale.length + transitivelyStale.length,
210
+ nodes,
211
+ directlyStale,
212
+ transitivelyStale,
213
+ };
214
+ }
215
+ /**
216
+ * Find the upstream stale nodes that cause a node to be transitively stale.
217
+ */
218
+ function findUpstreamStale(graph, nodeId, directlyStale) {
219
+ const upstream = graph.traverseBackward(nodeId, {
220
+ includeStart: false,
221
+ });
222
+ return upstream.filter((id) => directlyStale.has(id));
223
+ }
224
+ // ============================================================================
225
+ // Convenience Functions
226
+ // ============================================================================
227
+ /**
228
+ * Check if a specific node is stale.
229
+ *
230
+ * @param graph - The intent graph
231
+ * @param nodeId - ID of the node to check
232
+ * @param options - Detection options
233
+ * @returns Staleness info for the node, or null if node not found
234
+ */
235
+ export function isNodeStale(graph, nodeId, options = {}) {
236
+ const node = graph.getNode(nodeId);
237
+ if (node === undefined) {
238
+ return null;
239
+ }
240
+ const { projectRoot = process.cwd() } = options;
241
+ // Check direct staleness based on node type
242
+ if (node.type === 'plan') {
243
+ return checkPlanStaleness(node.data, graph);
244
+ }
245
+ if (node.type === 'artifact') {
246
+ return checkTraceStaleness(node.data, projectRoot);
247
+ }
248
+ // For other node types, check if they're transitively stale
249
+ const result = detectStaleness(graph, { ...options, includeTransitive: true });
250
+ return result.nodes.get(nodeId) ?? {
251
+ id: nodeId,
252
+ stale: false,
253
+ reasons: [],
254
+ };
255
+ }
256
+ /**
257
+ * Get all stale nodes in the graph.
258
+ *
259
+ * @param graph - The intent graph
260
+ * @param options - Detection options
261
+ * @returns Array of stale node IDs
262
+ */
263
+ export function getStaleNodes(graph, options = {}) {
264
+ const result = detectStaleness(graph, options);
265
+ return [...result.directlyStale, ...result.transitivelyStale];
266
+ }
267
+ /**
268
+ * Get stale plans and their reasons.
269
+ *
270
+ * @param graph - The intent graph
271
+ * @returns Array of staleness info for stale plans only
272
+ */
273
+ export function getStalePlans(graph) {
274
+ const result = detectStaleness(graph, { nodeTypes: ['plan'], includeTransitive: false });
275
+ return Array.from(result.nodes.values()).filter((info) => info.stale);
276
+ }
277
+ /**
278
+ * Get stale traces and their reasons.
279
+ *
280
+ * @param graph - The intent graph
281
+ * @param projectRoot - Project root for resolving file paths
282
+ * @returns Array of staleness info for stale traces only
283
+ */
284
+ export function getStaleTraces(graph, projectRoot = process.cwd()) {
285
+ const result = detectStaleness(graph, {
286
+ projectRoot,
287
+ nodeTypes: ['artifact'],
288
+ includeTransitive: false,
289
+ });
290
+ return Array.from(result.nodes.values()).filter((info) => info.stale);
291
+ }
292
+ /**
293
+ * Format staleness reason as human-readable string.
294
+ */
295
+ export function formatStalenessReason(reason) {
296
+ switch (reason.type) {
297
+ case 'source_changed':
298
+ return `Source ${reason.sourceId} changed (was ${reason.expectedHash}, now ${reason.actualHash})`;
299
+ case 'artifact_changed':
300
+ return `Artifact ${reason.path} changed (was ${reason.expectedHash}, now ${reason.actualHash})`;
301
+ case 'artifact_missing':
302
+ return `Artifact ${reason.path} no longer exists`;
303
+ case 'derived_from_stale':
304
+ return `Derived from stale node ${reason.upstreamId}`;
305
+ case 'source_missing':
306
+ return `Source ${reason.sourceId} no longer exists`;
307
+ }
308
+ }
309
+ //# sourceMappingURL=staleness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"staleness.js","sourceRoot":"","sources":["../src/staleness.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=staleness.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"staleness.test.d.ts","sourceRoot":"","sources":["../src/staleness.test.ts"],"names":[],"mappings":""}