@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,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* prov init command implementation.
|
|
3
|
+
*
|
|
4
|
+
* Initializes provenance tracking in a directory by creating the
|
|
5
|
+
* .prov/ directory structure.
|
|
6
|
+
*
|
|
7
|
+
* @see req:cli:init
|
|
8
|
+
*/
|
|
9
|
+
import { isInitialized, initialize, saveGraph, getProvDir, } from '../storage.js';
|
|
10
|
+
import { IntentGraph } from '../graph.js';
|
|
11
|
+
import { output, error, success } from '../output.js';
|
|
12
|
+
/**
|
|
13
|
+
* Execute the init command.
|
|
14
|
+
*
|
|
15
|
+
* Creates .prov/ directory structure:
|
|
16
|
+
* - .prov/
|
|
17
|
+
* - .prov/graph.json (empty graph)
|
|
18
|
+
* - .prov/mappings/
|
|
19
|
+
* - .prov/cache/
|
|
20
|
+
*
|
|
21
|
+
* Idempotent - safe to run multiple times.
|
|
22
|
+
* Does not overwrite existing data.
|
|
23
|
+
*
|
|
24
|
+
* @see req:cli:init
|
|
25
|
+
*/
|
|
26
|
+
export function runInit(globalOpts, options) {
|
|
27
|
+
const projectRoot = globalOpts.dir ?? process.cwd();
|
|
28
|
+
const provDir = getProvDir(projectRoot);
|
|
29
|
+
const alreadyInitialized = isInitialized(projectRoot);
|
|
30
|
+
// Check if already initialized
|
|
31
|
+
if (alreadyInitialized && options.force !== true) {
|
|
32
|
+
const result = {
|
|
33
|
+
success: true,
|
|
34
|
+
provDir,
|
|
35
|
+
alreadyInitialized: true,
|
|
36
|
+
};
|
|
37
|
+
if (globalOpts.format === 'json') {
|
|
38
|
+
output(result, { format: 'json' });
|
|
39
|
+
}
|
|
40
|
+
else if (globalOpts.format === 'yaml') {
|
|
41
|
+
output(result, { format: 'yaml' });
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
success(`Already initialized at ${provDir}`);
|
|
45
|
+
}
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
// Initialize directory structure
|
|
49
|
+
const initResult = initialize(projectRoot);
|
|
50
|
+
if (!initResult.success) {
|
|
51
|
+
if (globalOpts.format === 'json') {
|
|
52
|
+
output({ success: false, error: initResult.error }, { format: 'json' });
|
|
53
|
+
}
|
|
54
|
+
else if (globalOpts.format === 'yaml') {
|
|
55
|
+
output({ success: false, error: initResult.error }, { format: 'yaml' });
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
error(initResult.error ?? 'Unknown error during initialization');
|
|
59
|
+
}
|
|
60
|
+
process.exit(1);
|
|
61
|
+
}
|
|
62
|
+
// Create empty graph file if it doesn't already exist
|
|
63
|
+
if (!alreadyInitialized) {
|
|
64
|
+
const emptyGraph = new IntentGraph();
|
|
65
|
+
const saveResult = saveGraph(emptyGraph, projectRoot);
|
|
66
|
+
if (!saveResult.success) {
|
|
67
|
+
if (globalOpts.format === 'json') {
|
|
68
|
+
output({ success: false, error: saveResult.error }, { format: 'json' });
|
|
69
|
+
}
|
|
70
|
+
else if (globalOpts.format === 'yaml') {
|
|
71
|
+
output({ success: false, error: saveResult.error }, { format: 'yaml' });
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
error(saveResult.error ?? 'Failed to create graph file');
|
|
75
|
+
}
|
|
76
|
+
process.exit(1);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
const result = {
|
|
80
|
+
success: true,
|
|
81
|
+
provDir,
|
|
82
|
+
alreadyInitialized: false,
|
|
83
|
+
};
|
|
84
|
+
if (globalOpts.format === 'json') {
|
|
85
|
+
output(result, { format: 'json' });
|
|
86
|
+
}
|
|
87
|
+
else if (globalOpts.format === 'yaml') {
|
|
88
|
+
output(result, { format: 'yaml' });
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
success(`Initialized prov at ${provDir}`);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.test.d.ts","sourceRoot":"","sources":["../../src/commands/init.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for prov init command.
|
|
3
|
+
*
|
|
4
|
+
* @see req:cli:init
|
|
5
|
+
*/
|
|
6
|
+
import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
|
|
7
|
+
import { existsSync, rmSync, readFileSync, mkdirSync, writeFileSync } from 'node:fs';
|
|
8
|
+
import { join } from 'node:path';
|
|
9
|
+
import { tmpdir } from 'node:os';
|
|
10
|
+
import { runInit } from './init.js';
|
|
11
|
+
import { PROV_DIR, GRAPH_FILE, MAPPINGS_DIR, CACHE_DIR } from '../storage.js';
|
|
12
|
+
describe('init command', () => {
|
|
13
|
+
let testDir;
|
|
14
|
+
let mockStdout;
|
|
15
|
+
let mockStderr;
|
|
16
|
+
beforeEach(() => {
|
|
17
|
+
// Create a unique test directory
|
|
18
|
+
testDir = join(tmpdir(), `prov-init-test-${Date.now()}-${Math.random().toString(36).slice(2)}`);
|
|
19
|
+
mkdirSync(testDir, { recursive: true });
|
|
20
|
+
// Capture stdout/stderr
|
|
21
|
+
mockStdout = [];
|
|
22
|
+
mockStderr = [];
|
|
23
|
+
vi.spyOn(process.stdout, 'write').mockImplementation((msg) => {
|
|
24
|
+
mockStdout.push(String(msg));
|
|
25
|
+
return true;
|
|
26
|
+
});
|
|
27
|
+
vi.spyOn(process.stderr, 'write').mockImplementation((msg) => {
|
|
28
|
+
mockStderr.push(String(msg));
|
|
29
|
+
return true;
|
|
30
|
+
});
|
|
31
|
+
// Mock process.exit to throw instead of exiting
|
|
32
|
+
vi.spyOn(process, 'exit').mockImplementation((code) => {
|
|
33
|
+
throw new Error(`Process exited with code ${String(code)}`);
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
afterEach(() => {
|
|
37
|
+
// Clean up test directory
|
|
38
|
+
if (existsSync(testDir)) {
|
|
39
|
+
rmSync(testDir, { recursive: true, force: true });
|
|
40
|
+
}
|
|
41
|
+
vi.restoreAllMocks();
|
|
42
|
+
});
|
|
43
|
+
describe('fresh initialization', () => {
|
|
44
|
+
it('should create .prov directory structure', () => {
|
|
45
|
+
const globalOpts = { dir: testDir };
|
|
46
|
+
const options = {};
|
|
47
|
+
runInit(globalOpts, options);
|
|
48
|
+
// Verify directory structure
|
|
49
|
+
expect(existsSync(join(testDir, PROV_DIR))).toBe(true);
|
|
50
|
+
expect(existsSync(join(testDir, PROV_DIR, MAPPINGS_DIR))).toBe(true);
|
|
51
|
+
expect(existsSync(join(testDir, PROV_DIR, CACHE_DIR))).toBe(true);
|
|
52
|
+
});
|
|
53
|
+
it('should create empty graph.json', () => {
|
|
54
|
+
const globalOpts = { dir: testDir };
|
|
55
|
+
const options = {};
|
|
56
|
+
runInit(globalOpts, options);
|
|
57
|
+
const graphPath = join(testDir, PROV_DIR, GRAPH_FILE);
|
|
58
|
+
expect(existsSync(graphPath)).toBe(true);
|
|
59
|
+
const graphContent = JSON.parse(readFileSync(graphPath, 'utf8'));
|
|
60
|
+
expect(graphContent).toHaveProperty('schemaVersion');
|
|
61
|
+
expect(graphContent).toHaveProperty('nodes');
|
|
62
|
+
expect(graphContent).toHaveProperty('edges');
|
|
63
|
+
expect(Object.keys(graphContent.nodes)).toHaveLength(0);
|
|
64
|
+
expect(graphContent.edges).toHaveLength(0);
|
|
65
|
+
});
|
|
66
|
+
it('should create cache .gitignore', () => {
|
|
67
|
+
const globalOpts = { dir: testDir };
|
|
68
|
+
const options = {};
|
|
69
|
+
runInit(globalOpts, options);
|
|
70
|
+
const gitignorePath = join(testDir, PROV_DIR, CACHE_DIR, '.gitignore');
|
|
71
|
+
expect(existsSync(gitignorePath)).toBe(true);
|
|
72
|
+
const content = readFileSync(gitignorePath, 'utf8');
|
|
73
|
+
expect(content).toContain('*');
|
|
74
|
+
expect(content).toContain('!.gitignore');
|
|
75
|
+
});
|
|
76
|
+
it('should output success message in table format', () => {
|
|
77
|
+
const globalOpts = { dir: testDir };
|
|
78
|
+
const options = {};
|
|
79
|
+
runInit(globalOpts, options);
|
|
80
|
+
const output = mockStdout.join('');
|
|
81
|
+
expect(output).toContain('Initialized prov');
|
|
82
|
+
});
|
|
83
|
+
it('should output JSON when format is json', () => {
|
|
84
|
+
const globalOpts = { dir: testDir, format: 'json' };
|
|
85
|
+
const options = {};
|
|
86
|
+
runInit(globalOpts, options);
|
|
87
|
+
const output = mockStdout.join('');
|
|
88
|
+
const result = JSON.parse(output);
|
|
89
|
+
expect(result.success).toBe(true);
|
|
90
|
+
expect(result.provDir).toContain(PROV_DIR);
|
|
91
|
+
expect(result.alreadyInitialized).toBe(false);
|
|
92
|
+
});
|
|
93
|
+
it('should output YAML when format is yaml', () => {
|
|
94
|
+
const globalOpts = { dir: testDir, format: 'yaml' };
|
|
95
|
+
const options = {};
|
|
96
|
+
runInit(globalOpts, options);
|
|
97
|
+
const output = mockStdout.join('');
|
|
98
|
+
expect(output).toContain('success: true');
|
|
99
|
+
expect(output).toContain('alreadyInitialized: false');
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
describe('idempotent behavior', () => {
|
|
103
|
+
it('should be safe to run multiple times', () => {
|
|
104
|
+
const globalOpts = { dir: testDir };
|
|
105
|
+
const options = {};
|
|
106
|
+
// Run init twice
|
|
107
|
+
runInit(globalOpts, options);
|
|
108
|
+
mockStdout = [];
|
|
109
|
+
runInit(globalOpts, options);
|
|
110
|
+
// Should still succeed
|
|
111
|
+
const output = mockStdout.join('');
|
|
112
|
+
expect(output).toContain('Already initialized');
|
|
113
|
+
});
|
|
114
|
+
it('should report alreadyInitialized in JSON output', () => {
|
|
115
|
+
const globalOpts = { dir: testDir };
|
|
116
|
+
const options = {};
|
|
117
|
+
// First init
|
|
118
|
+
runInit(globalOpts, options);
|
|
119
|
+
// Second init with JSON output
|
|
120
|
+
mockStdout = [];
|
|
121
|
+
const globalOptsJson = { dir: testDir, format: 'json' };
|
|
122
|
+
runInit(globalOptsJson, options);
|
|
123
|
+
const output = mockStdout.join('');
|
|
124
|
+
const result = JSON.parse(output);
|
|
125
|
+
expect(result.success).toBe(true);
|
|
126
|
+
expect(result.alreadyInitialized).toBe(true);
|
|
127
|
+
});
|
|
128
|
+
it('should not overwrite existing data', () => {
|
|
129
|
+
const globalOpts = { dir: testDir };
|
|
130
|
+
const options = {};
|
|
131
|
+
// First init
|
|
132
|
+
runInit(globalOpts, options);
|
|
133
|
+
// Modify the graph file
|
|
134
|
+
const graphPath = join(testDir, PROV_DIR, GRAPH_FILE);
|
|
135
|
+
const originalContent = readFileSync(graphPath, 'utf8');
|
|
136
|
+
const modified = JSON.parse(originalContent);
|
|
137
|
+
modified.customField = 'test';
|
|
138
|
+
writeFileSync(graphPath, JSON.stringify(modified));
|
|
139
|
+
// Second init
|
|
140
|
+
runInit(globalOpts, options);
|
|
141
|
+
// Verify data was not overwritten
|
|
142
|
+
const afterContent = readFileSync(graphPath, 'utf8');
|
|
143
|
+
const afterData = JSON.parse(afterContent);
|
|
144
|
+
expect(afterData.customField).toBe('test');
|
|
145
|
+
});
|
|
146
|
+
});
|
|
147
|
+
describe('--dir option', () => {
|
|
148
|
+
it('should initialize in specified directory', () => {
|
|
149
|
+
const subDir = join(testDir, 'subproject');
|
|
150
|
+
mkdirSync(subDir, { recursive: true });
|
|
151
|
+
const globalOpts = { dir: subDir };
|
|
152
|
+
const options = {};
|
|
153
|
+
runInit(globalOpts, options);
|
|
154
|
+
expect(existsSync(join(subDir, PROV_DIR))).toBe(true);
|
|
155
|
+
expect(existsSync(join(testDir, PROV_DIR))).toBe(false);
|
|
156
|
+
});
|
|
157
|
+
});
|
|
158
|
+
describe('--force option', () => {
|
|
159
|
+
it('should reinitialize with --force', () => {
|
|
160
|
+
const globalOpts = { dir: testDir };
|
|
161
|
+
const options = {};
|
|
162
|
+
// First init
|
|
163
|
+
runInit(globalOpts, options);
|
|
164
|
+
// Second init with force
|
|
165
|
+
mockStdout = [];
|
|
166
|
+
const forceOptions = { force: true };
|
|
167
|
+
runInit(globalOpts, forceOptions);
|
|
168
|
+
// Should still succeed without "Already initialized" message
|
|
169
|
+
// (with force it reinitializes but preserves data)
|
|
170
|
+
expect(existsSync(join(testDir, PROV_DIR))).toBe(true);
|
|
171
|
+
});
|
|
172
|
+
});
|
|
173
|
+
});
|
|
174
|
+
//# sourceMappingURL=init.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.test.js","sourceRoot":"","sources":["../../src/commands/init.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Integration tests for agent workflows.
|
|
3
|
+
*
|
|
4
|
+
* These tests simulate end-to-end agent interactions with the prov system,
|
|
5
|
+
* covering the complete workflow from initialization through trace completion.
|
|
6
|
+
*
|
|
7
|
+
* @see prov-4c9 Phase 6: Polish - Write integration tests covering agent workflows
|
|
8
|
+
*/
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=integration.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"integration.test.d.ts","sourceRoot":"","sources":["../../src/commands/integration.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
|