@x0rium/devkit-cli 0.4.0

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 (65) hide show
  1. package/dist/advance.d.ts +9 -0
  2. package/dist/advance.d.ts.map +1 -0
  3. package/dist/advance.js +47 -0
  4. package/dist/advance.js.map +1 -0
  5. package/dist/constitution.d.ts +16 -0
  6. package/dist/constitution.d.ts.map +1 -0
  7. package/dist/constitution.js +186 -0
  8. package/dist/constitution.js.map +1 -0
  9. package/dist/coverage.d.ts +18 -0
  10. package/dist/coverage.d.ts.map +1 -0
  11. package/dist/coverage.js +167 -0
  12. package/dist/coverage.js.map +1 -0
  13. package/dist/dashboard.d.ts +2 -0
  14. package/dist/dashboard.d.ts.map +1 -0
  15. package/dist/dashboard.js +380 -0
  16. package/dist/dashboard.js.map +1 -0
  17. package/dist/detector.d.ts +3 -0
  18. package/dist/detector.d.ts.map +1 -0
  19. package/dist/detector.js +45 -0
  20. package/dist/detector.js.map +1 -0
  21. package/dist/escalate.d.ts +11 -0
  22. package/dist/escalate.d.ts.map +1 -0
  23. package/dist/escalate.js +133 -0
  24. package/dist/escalate.js.map +1 -0
  25. package/dist/gate.d.ts +15 -0
  26. package/dist/gate.d.ts.map +1 -0
  27. package/dist/gate.js +244 -0
  28. package/dist/gate.js.map +1 -0
  29. package/dist/impact.d.ts +17 -0
  30. package/dist/impact.d.ts.map +1 -0
  31. package/dist/impact.js +192 -0
  32. package/dist/impact.js.map +1 -0
  33. package/dist/index.d.ts +3 -0
  34. package/dist/index.d.ts.map +1 -0
  35. package/dist/index.js +494 -0
  36. package/dist/index.js.map +1 -0
  37. package/dist/investigate.d.ts +21 -0
  38. package/dist/investigate.d.ts.map +1 -0
  39. package/dist/investigate.js +200 -0
  40. package/dist/investigate.js.map +1 -0
  41. package/dist/rfc.d.ts +21 -0
  42. package/dist/rfc.d.ts.map +1 -0
  43. package/dist/rfc.js +152 -0
  44. package/dist/rfc.js.map +1 -0
  45. package/dist/scaffold.d.ts +7 -0
  46. package/dist/scaffold.d.ts.map +1 -0
  47. package/dist/scaffold.js +54 -0
  48. package/dist/scaffold.js.map +1 -0
  49. package/dist/schemas.d.ts +11 -0
  50. package/dist/schemas.d.ts.map +1 -0
  51. package/dist/schemas.js +103 -0
  52. package/dist/schemas.js.map +1 -0
  53. package/dist/status.d.ts +13 -0
  54. package/dist/status.d.ts.map +1 -0
  55. package/dist/status.js +112 -0
  56. package/dist/status.js.map +1 -0
  57. package/dist/validator.d.ts +16 -0
  58. package/dist/validator.d.ts.map +1 -0
  59. package/dist/validator.js +185 -0
  60. package/dist/validator.js.map +1 -0
  61. package/dist/watch.d.ts +2 -0
  62. package/dist/watch.d.ts.map +1 -0
  63. package/dist/watch.js +48 -0
  64. package/dist/watch.js.map +1 -0
  65. package/package.json +47 -0
@@ -0,0 +1,200 @@
1
+ import { readFileSync, writeFileSync, existsSync, readdirSync, mkdirSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ function getNextId(dir, prefix) {
4
+ if (!existsSync(dir))
5
+ return `${prefix}001`;
6
+ const files = readdirSync(dir)
7
+ .filter(f => f.startsWith(prefix) && f.endsWith('.md'))
8
+ .sort();
9
+ if (files.length === 0)
10
+ return `${prefix}001`;
11
+ const last = files[files.length - 1];
12
+ const numMatch = last.match(new RegExp(`${prefix}(\\d+)`));
13
+ if (!numMatch)
14
+ return `${prefix}001`;
15
+ const next = parseInt(numMatch[1], 10) + 1;
16
+ return `${prefix}${next.toString().padStart(3, '0')}`;
17
+ }
18
+ function findBrokenAssumption(cwd, keywords) {
19
+ const decisionsDir = join(cwd, '.devkit', 'arch', 'decisions');
20
+ if (!existsSync(decisionsDir))
21
+ return null;
22
+ const adrs = readdirSync(decisionsDir)
23
+ .filter(f => f.startsWith('ADR-') && f.endsWith('.md'));
24
+ for (const adrFile of adrs) {
25
+ const content = readFileSync(join(decisionsDir, adrFile), 'utf-8');
26
+ // Check if any keyword appears in the Assumptions section
27
+ const assumptionSection = content.split(/^## Assumptions/m)[1];
28
+ if (!assumptionSection)
29
+ continue;
30
+ // Only check up to the next ## section
31
+ const endIdx = assumptionSection.indexOf('\n## ');
32
+ const assumptionText = endIdx > 0 ? assumptionSection.slice(0, endIdx) : assumptionSection;
33
+ for (const keyword of keywords) {
34
+ if (assumptionText.toLowerCase().includes(keyword.toLowerCase())) {
35
+ return {
36
+ adr: adrFile.replace('.md', ''),
37
+ assumption: assumptionText.trim().split('\n')[0]?.trim() ?? '(see ADR)',
38
+ };
39
+ }
40
+ }
41
+ }
42
+ return null;
43
+ }
44
+ function findInvariantsAtRisk(cwd, keywords) {
45
+ const results = [];
46
+ for (const relPath of ['arch/invariants.md', 'product/ux_invariants.md']) {
47
+ const fullPath = join(cwd, '.devkit', relPath);
48
+ if (!existsSync(fullPath))
49
+ continue;
50
+ const content = readFileSync(fullPath, 'utf-8');
51
+ const sections = content.split(/^## /m).slice(1);
52
+ for (const section of sections) {
53
+ const header = section.split('\n')[0]?.trim() ?? '';
54
+ for (const keyword of keywords) {
55
+ if (section.toLowerCase().includes(keyword.toLowerCase())) {
56
+ results.push(header);
57
+ break;
58
+ }
59
+ }
60
+ }
61
+ }
62
+ return results;
63
+ }
64
+ export function createInvestigation(cwd, description) {
65
+ const devkitDir = join(cwd, '.devkit');
66
+ const decisionsDir = join(devkitDir, 'arch', 'decisions');
67
+ if (!existsSync(devkitDir)) {
68
+ return {
69
+ created: false, id: '', path: '', brokenAssumption: null,
70
+ adrSource: null, invariantsAtRisk: [],
71
+ error: '.devkit/ not found. Run "devkit init" first.',
72
+ };
73
+ }
74
+ mkdirSync(decisionsDir, { recursive: true });
75
+ // Extract keywords
76
+ const keywords = description
77
+ .toLowerCase()
78
+ .split(/[\s,;]+/)
79
+ .filter(w => w.length > 2)
80
+ .filter(w => !['the', 'and', 'for', 'with', 'from', 'that', 'this', 'into', 'bug', 'found', 'does', 'not'].includes(w));
81
+ // Try to find broken assumption in ADRs
82
+ const broken = findBrokenAssumption(cwd, keywords);
83
+ // Find invariants at risk
84
+ const invariantsAtRisk = findInvariantsAtRisk(cwd, keywords);
85
+ // Generate ID
86
+ const id = getNextId(decisionsDir, 'INV-');
87
+ const filename = `${id}.md`;
88
+ const filePath = join(decisionsDir, filename);
89
+ const today = new Date().toISOString().split('T')[0];
90
+ const lines = [];
91
+ lines.push(`# ${id}: ${description}`);
92
+ lines.push('');
93
+ lines.push(`DATE: ${today}`);
94
+ lines.push('STATUS: open');
95
+ lines.push(`TRIGGERED_BY: ${description}`);
96
+ lines.push('');
97
+ // Broken assumption
98
+ lines.push('## Broken Assumption');
99
+ if (broken) {
100
+ lines.push(`ASSUMPTION_IN: ${broken.adr}`);
101
+ lines.push(`ASSUMPTION_WAS: ${broken.assumption}`);
102
+ }
103
+ else {
104
+ lines.push('ASSUMPTION_IN: _not auto-detected — check ADRs manually_');
105
+ lines.push('ASSUMPTION_WAS: ');
106
+ }
107
+ lines.push('REALITY: ');
108
+ lines.push('');
109
+ // Impact
110
+ lines.push('## Impact');
111
+ if (invariantsAtRisk.length > 0) {
112
+ lines.push(`INVARIANTS_AT_RISK: [${invariantsAtRisk.join(', ')}]`);
113
+ }
114
+ else {
115
+ lines.push('INVARIANTS_AT_RISK: _none auto-detected_');
116
+ }
117
+ lines.push('SPECS_AFFECTED: []');
118
+ lines.push('');
119
+ // Options
120
+ lines.push('## Options');
121
+ lines.push('');
122
+ lines.push('### Option A: [workaround]');
123
+ lines.push('Description. Cost. Technical debt introduced.');
124
+ lines.push('');
125
+ lines.push('### Option B: [alternative approach]');
126
+ lines.push('Description. Cost. Technical debt introduced.');
127
+ lines.push('');
128
+ lines.push('### Option C: [accept limitation]');
129
+ lines.push('Description. Cost. Technical debt introduced.');
130
+ lines.push('');
131
+ // Decision
132
+ lines.push('## Decision');
133
+ lines.push('CHOSEN: ');
134
+ lines.push('RATIONALE: ');
135
+ lines.push('DECIDED_BY: ');
136
+ lines.push(`DATE_DECIDED: `);
137
+ lines.push('');
138
+ // Post-decision
139
+ lines.push('## Post-Decision Actions');
140
+ lines.push('- [ ] Update affected ADR or create new one');
141
+ lines.push('- [ ] Update invariants.md if changed');
142
+ lines.push('- [ ] Regenerate constitution (`devkit generate-constitution`)');
143
+ lines.push('- [ ] Update affected specs');
144
+ lines.push('- [ ] Document any technical debt');
145
+ lines.push('');
146
+ writeFileSync(filePath, lines.join('\n'), 'utf-8');
147
+ return {
148
+ created: true,
149
+ id,
150
+ path: `arch/decisions/${filename}`,
151
+ brokenAssumption: broken?.assumption ?? null,
152
+ adrSource: broken?.adr ?? null,
153
+ invariantsAtRisk,
154
+ };
155
+ }
156
+ export function listInvestigations(cwd) {
157
+ const decisionsDir = join(cwd, '.devkit', 'arch', 'decisions');
158
+ if (!existsSync(decisionsDir))
159
+ return [];
160
+ return readdirSync(decisionsDir)
161
+ .filter(f => f.startsWith('INV-') && f.endsWith('.md'))
162
+ .sort()
163
+ .map(f => {
164
+ const content = readFileSync(join(decisionsDir, f), 'utf-8');
165
+ const titleMatch = content.match(/^# (.+)/m);
166
+ const statusMatch = content.match(/^STATUS:\s*(.+)/m);
167
+ const dateMatch = content.match(/^DATE:\s*(.+)/m);
168
+ return {
169
+ id: f.replace('.md', ''),
170
+ title: titleMatch?.[1] ?? f,
171
+ status: statusMatch?.[1]?.trim() ?? 'unknown',
172
+ date: dateMatch?.[1]?.trim() ?? 'unknown',
173
+ };
174
+ });
175
+ }
176
+ export function resolveInvestigation(cwd, invId, option, rationale) {
177
+ const decisionsDir = join(cwd, '.devkit', 'arch', 'decisions');
178
+ const filePath = join(decisionsDir, `${invId}.md`);
179
+ if (!existsSync(filePath)) {
180
+ return { resolved: false, error: `${invId}.md not found in .devkit/arch/decisions/` };
181
+ }
182
+ const content = readFileSync(filePath, 'utf-8');
183
+ const today = new Date().toISOString().split('T')[0];
184
+ const lines = content.split('\n').map(line => {
185
+ if (line.startsWith('STATUS:'))
186
+ return 'STATUS: resolved';
187
+ if (line.startsWith('CHOSEN:'))
188
+ return `CHOSEN: ${option}`;
189
+ if (line.startsWith('RATIONALE:'))
190
+ return `RATIONALE: ${rationale}`;
191
+ if (line.startsWith('DECIDED_BY:'))
192
+ return 'DECIDED_BY: developer';
193
+ if (line.startsWith('DATE_DECIDED:'))
194
+ return `DATE_DECIDED: ${today}`;
195
+ return line;
196
+ });
197
+ writeFileSync(filePath, lines.join('\n'), 'utf-8');
198
+ return { resolved: true };
199
+ }
200
+ //# sourceMappingURL=investigate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"investigate.js","sourceRoot":"","sources":["../src/investigate.ts"],"names":[],"mappings":"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"}
package/dist/rfc.d.ts ADDED
@@ -0,0 +1,21 @@
1
+ export interface RfcResult {
2
+ created: boolean;
3
+ id: string;
4
+ path: string;
5
+ affectedInvariants: string[];
6
+ affectedSpecs: string[];
7
+ riskLevel: string;
8
+ error?: string;
9
+ }
10
+ export declare function createRfc(cwd: string, description: string): RfcResult;
11
+ export declare function listRfcs(cwd: string): {
12
+ id: string;
13
+ title: string;
14
+ status: string;
15
+ date: string;
16
+ }[];
17
+ export declare function resolveRfc(cwd: string, rfcId: string, option: string, rationale: string): {
18
+ resolved: boolean;
19
+ error?: string;
20
+ };
21
+ //# sourceMappingURL=rfc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rfc.d.ts","sourceRoot":"","sources":["../src/rfc.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,SAAS;IACtB,OAAO,EAAE,OAAO,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAmBD,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,SAAS,CAmGrE;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,CAmBnG;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG;IAAE,QAAQ,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAuB/H"}
package/dist/rfc.js ADDED
@@ -0,0 +1,152 @@
1
+ import { readFileSync, writeFileSync, existsSync, readdirSync, mkdirSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { analyzeImpact } from './impact.js';
4
+ function getNextId(dir, prefix) {
5
+ if (!existsSync(dir))
6
+ return `${prefix}001`;
7
+ const files = readdirSync(dir)
8
+ .filter(f => f.startsWith(prefix) && f.endsWith('.md'))
9
+ .sort();
10
+ if (files.length === 0)
11
+ return `${prefix}001`;
12
+ const last = files[files.length - 1];
13
+ const numMatch = last.match(new RegExp(`${prefix}(\\d+)`));
14
+ if (!numMatch)
15
+ return `${prefix}001`;
16
+ const next = parseInt(numMatch[1], 10) + 1;
17
+ return `${prefix}${next.toString().padStart(3, '0')}`;
18
+ }
19
+ export function createRfc(cwd, description) {
20
+ const devkitDir = join(cwd, '.devkit');
21
+ const decisionsDir = join(devkitDir, 'arch', 'decisions');
22
+ if (!existsSync(devkitDir)) {
23
+ return {
24
+ created: false, id: '', path: '', affectedInvariants: [],
25
+ affectedSpecs: [], riskLevel: 'unknown',
26
+ error: '.devkit/ not found. Run "devkit init" first.',
27
+ };
28
+ }
29
+ // Ensure decisions directory exists
30
+ mkdirSync(decisionsDir, { recursive: true });
31
+ // Run impact analysis
32
+ const impact = analyzeImpact(cwd, description);
33
+ // Generate RFC ID
34
+ const id = getNextId(decisionsDir, 'RFC-');
35
+ const filename = `${id}.md`;
36
+ const filePath = join(decisionsDir, filename);
37
+ const today = new Date().toISOString().split('T')[0];
38
+ // Build RFC content from template
39
+ const lines = [];
40
+ lines.push(`# ${id}: ${description}`);
41
+ lines.push('');
42
+ lines.push(`DATE: ${today}`);
43
+ lines.push('STATUS: open');
44
+ lines.push(`TRIGGERED_BY: ${description}`);
45
+ lines.push('');
46
+ // Affected invariants (auto-populated from impact analysis)
47
+ lines.push('## Affected Invariants');
48
+ if (impact.affectedInvariants.length > 0) {
49
+ for (const inv of impact.affectedInvariants) {
50
+ lines.push(`- ${inv}`);
51
+ }
52
+ }
53
+ else {
54
+ lines.push('_No invariants directly affected (manual review recommended)_');
55
+ }
56
+ lines.push('');
57
+ // Affected specs
58
+ lines.push('## Affected Specs');
59
+ if (impact.affectedSpecs.length > 0) {
60
+ for (const spec of impact.affectedSpecs) {
61
+ lines.push(`- ${spec}`);
62
+ }
63
+ }
64
+ else {
65
+ lines.push('_No specs identified (check .specify/ manually)_');
66
+ }
67
+ lines.push('');
68
+ // Change cost
69
+ lines.push('## Change Cost');
70
+ lines.push(`SPECS_TO_REVISE: ${impact.affectedSpecs.length}`);
71
+ lines.push(`INVARIANTS_TO_CHANGE: ${impact.affectedInvariants.length}`);
72
+ lines.push('ESTIMATED_EFFORT: TODO');
73
+ lines.push('');
74
+ // Options (developer fills these)
75
+ lines.push('## Options');
76
+ lines.push('');
77
+ lines.push('### Option A: [name]');
78
+ lines.push('Description, pros, cons');
79
+ lines.push('');
80
+ lines.push('### Option B: [name]');
81
+ lines.push('Description, pros, cons');
82
+ lines.push('');
83
+ // Decision (to be filled)
84
+ lines.push('## Decision');
85
+ lines.push('CHOSEN: ');
86
+ lines.push('RATIONALE: ');
87
+ lines.push('DECIDED_BY: ');
88
+ lines.push(`DATE_DECIDED: `);
89
+ lines.push('');
90
+ // Post-decision checklist
91
+ lines.push('## Post-Decision Actions');
92
+ lines.push('- [ ] Update invariants.md');
93
+ lines.push('- [ ] Regenerate constitution (`devkit generate-constitution`)');
94
+ lines.push('- [ ] Sync constitution (`devkit sync`)');
95
+ lines.push('- [ ] Mark affected specs as NEEDS_REVISION');
96
+ lines.push('- [ ] Resume SpecKit');
97
+ lines.push('');
98
+ writeFileSync(filePath, lines.join('\n'), 'utf-8');
99
+ return {
100
+ created: true,
101
+ id,
102
+ path: `arch/decisions/${filename}`,
103
+ affectedInvariants: impact.affectedInvariants,
104
+ affectedSpecs: impact.affectedSpecs,
105
+ riskLevel: impact.riskLevel,
106
+ };
107
+ }
108
+ export function listRfcs(cwd) {
109
+ const decisionsDir = join(cwd, '.devkit', 'arch', 'decisions');
110
+ if (!existsSync(decisionsDir))
111
+ return [];
112
+ return readdirSync(decisionsDir)
113
+ .filter(f => f.startsWith('RFC-') && f.endsWith('.md'))
114
+ .sort()
115
+ .map(f => {
116
+ const content = readFileSync(join(decisionsDir, f), 'utf-8');
117
+ const titleMatch = content.match(/^# (.+)/m);
118
+ const statusMatch = content.match(/^STATUS:\s*(.+)/m);
119
+ const dateMatch = content.match(/^DATE:\s*(.+)/m);
120
+ return {
121
+ id: f.replace('.md', ''),
122
+ title: titleMatch?.[1] ?? f,
123
+ status: statusMatch?.[1]?.trim() ?? 'unknown',
124
+ date: dateMatch?.[1]?.trim() ?? 'unknown',
125
+ };
126
+ });
127
+ }
128
+ export function resolveRfc(cwd, rfcId, option, rationale) {
129
+ const decisionsDir = join(cwd, '.devkit', 'arch', 'decisions');
130
+ const filePath = join(decisionsDir, `${rfcId}.md`);
131
+ if (!existsSync(filePath)) {
132
+ return { resolved: false, error: `${rfcId}.md not found in .devkit/arch/decisions/` };
133
+ }
134
+ const content = readFileSync(filePath, 'utf-8');
135
+ const today = new Date().toISOString().split('T')[0];
136
+ const lines = content.split('\n').map(line => {
137
+ if (line.startsWith('STATUS:'))
138
+ return 'STATUS: accepted';
139
+ if (line.startsWith('CHOSEN:'))
140
+ return `CHOSEN: ${option}`;
141
+ if (line.startsWith('RATIONALE:'))
142
+ return `RATIONALE: ${rationale}`;
143
+ if (line.startsWith('DECIDED_BY:'))
144
+ return 'DECIDED_BY: developer';
145
+ if (line.startsWith('DATE_DECIDED:'))
146
+ return `DATE_DECIDED: ${today}`;
147
+ return line;
148
+ });
149
+ writeFileSync(filePath, lines.join('\n'), 'utf-8');
150
+ return { resolved: true };
151
+ }
152
+ //# sourceMappingURL=rfc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rfc.js","sourceRoot":"","sources":["../src/rfc.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export interface ScaffoldResult {
2
+ created: string[];
3
+ skipped: string[];
4
+ mode: string;
5
+ }
6
+ export declare function scaffoldDevkit(cwd: string, mode: string): ScaffoldResult;
7
+ //# sourceMappingURL=scaffold.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"AA2BA,MAAM,WAAW,cAAc;IAC3B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,cAAc,CA6BxE"}
@@ -0,0 +1,54 @@
1
+ import { mkdirSync, writeFileSync, existsSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ const STATUS_TEMPLATE = `# DevKit Status
4
+
5
+ MODE: {mode}
6
+ INITIALIZED: {date}
7
+ CURRENT_PHASE: research
8
+
9
+ ## Phase Status
10
+ - [ ] ResearchKit
11
+ - [ ] ProductKit
12
+ - [ ] ArchKit
13
+ - [ ] SpecKit
14
+ - [ ] QAKit
15
+ `;
16
+ const DIRECTORIES = [
17
+ '.devkit',
18
+ '.devkit/research',
19
+ '.devkit/product',
20
+ '.devkit/arch',
21
+ '.devkit/arch/decisions',
22
+ '.devkit/qa',
23
+ '.devkit/qa/escalations',
24
+ ];
25
+ export function scaffoldDevkit(cwd, mode) {
26
+ const created = [];
27
+ const skipped = [];
28
+ // Create directories
29
+ for (const dir of DIRECTORIES) {
30
+ const fullPath = join(cwd, dir);
31
+ if (!existsSync(fullPath)) {
32
+ mkdirSync(fullPath, { recursive: true });
33
+ created.push(dir + '/');
34
+ }
35
+ else {
36
+ skipped.push(dir + '/');
37
+ }
38
+ }
39
+ // Create STATUS.md
40
+ const statusPath = join(cwd, '.devkit', 'STATUS.md');
41
+ if (!existsSync(statusPath)) {
42
+ const today = new Date().toISOString().split('T')[0];
43
+ const content = STATUS_TEMPLATE
44
+ .replace('{mode}', mode)
45
+ .replace('{date}', today);
46
+ writeFileSync(statusPath, content, 'utf-8');
47
+ created.push('.devkit/STATUS.md');
48
+ }
49
+ else {
50
+ skipped.push('.devkit/STATUS.md');
51
+ }
52
+ return { created, skipped, mode };
53
+ }
54
+ //# sourceMappingURL=scaffold.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,eAAe,GAAG;;;;;;;;;;;;CAYvB,CAAC;AAEF,MAAM,WAAW,GAAG;IAChB,SAAS;IACT,kBAAkB;IAClB,iBAAiB;IACjB,cAAc;IACd,wBAAwB;IACxB,YAAY;IACZ,wBAAwB;CAC3B,CAAC;AAQF,MAAM,UAAU,cAAc,CAAC,GAAW,EAAE,IAAY;IACpD,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,qBAAqB;IACrB,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAChC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YACxB,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACzC,OAAO,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;QAC5B,CAAC;aAAM,CAAC;YACJ,OAAO,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;QAC5B,CAAC;IACL,CAAC;IAED,mBAAmB;IACnB,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;IACrD,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACrD,MAAM,OAAO,GAAG,eAAe;aAC1B,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC;aACvB,OAAO,CAAC,QAAQ,EAAE,KAAM,CAAC,CAAC;QAC/B,aAAa,CAAC,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAC5C,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IACtC,CAAC;SAAM,CAAC;QACJ,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IACtC,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AACtC,CAAC"}
@@ -0,0 +1,11 @@
1
+ export interface ArtifactSchema {
2
+ id: string;
3
+ file: string;
4
+ directory: string;
5
+ requiredSections: string[];
6
+ optionalSections?: string[];
7
+ }
8
+ export declare const SCHEMAS: ArtifactSchema[];
9
+ export declare const STRUCTURED_FIELDS: Record<string, string[]>;
10
+ export declare function getSchemaForFile(filename: string, directory: string): ArtifactSchema | undefined;
11
+ //# sourceMappingURL=schemas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,cAAc;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC/B;AAED,eAAO,MAAM,OAAO,EAAE,cAAc,EAwFnC,CAAC;AAGF,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAStD,CAAC;AAEF,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAEhG"}
@@ -0,0 +1,103 @@
1
+ // JSON Schemas for DevKit artifact validation
2
+ // Each schema validates YAML frontmatter of the corresponding artifact
3
+ export const SCHEMAS = [
4
+ // ResearchKit
5
+ {
6
+ id: 'research.market',
7
+ file: 'market.md',
8
+ directory: 'research',
9
+ requiredSections: ['Analogues', 'Unoccupied Space', 'Potential User'],
10
+ },
11
+ {
12
+ id: 'research.feasibility',
13
+ file: 'feasibility.md',
14
+ directory: 'research',
15
+ requiredSections: ['Known Approaches', 'Known Limitations', 'Verdict'],
16
+ },
17
+ {
18
+ id: 'research.unknowns',
19
+ file: 'unknowns.md',
20
+ directory: 'research',
21
+ requiredSections: [], // dynamic: each Unknown section has structured fields
22
+ },
23
+ {
24
+ id: 'research.assumptions',
25
+ file: 'assumptions.md',
26
+ directory: 'research',
27
+ requiredSections: [], // dynamic: each Assumption section has structured fields
28
+ },
29
+ // ProductKit
30
+ {
31
+ id: 'product.users',
32
+ file: 'users.md',
33
+ directory: 'product',
34
+ requiredSections: ['Primary User'],
35
+ optionalSections: ['Secondary User', 'Edge Cases'],
36
+ },
37
+ {
38
+ id: 'product.ux_invariants',
39
+ file: 'ux_invariants.md',
40
+ directory: 'product',
41
+ requiredSections: [], // dynamic: each U_N section has structured fields
42
+ },
43
+ {
44
+ id: 'product.roadmap',
45
+ file: 'roadmap.md',
46
+ directory: 'product',
47
+ requiredSections: ['MVP'],
48
+ optionalSections: ['V1', 'Later', 'Never'],
49
+ },
50
+ // ArchKit
51
+ {
52
+ id: 'arch.invariants',
53
+ file: 'invariants.md',
54
+ directory: 'arch',
55
+ requiredSections: [], // dynamic
56
+ },
57
+ {
58
+ id: 'arch.impact',
59
+ file: 'impact.md',
60
+ directory: 'arch',
61
+ requiredSections: [],
62
+ },
63
+ {
64
+ id: 'arch.constitution',
65
+ file: 'constitution.md',
66
+ directory: 'arch',
67
+ requiredSections: [],
68
+ },
69
+ // QAKit
70
+ {
71
+ id: 'qa.test_contracts',
72
+ file: 'test_contracts.md',
73
+ directory: 'qa',
74
+ requiredSections: [],
75
+ },
76
+ {
77
+ id: 'qa.coverage_map',
78
+ file: 'coverage_map.md',
79
+ directory: 'qa',
80
+ requiredSections: [],
81
+ },
82
+ {
83
+ id: 'qa.assumption_checks',
84
+ file: 'assumption_checks.md',
85
+ directory: 'qa',
86
+ requiredSections: [],
87
+ },
88
+ ];
89
+ // Fields that should be present in structured sections (Unknown, Assumption, Invariant, etc.)
90
+ export const STRUCTURED_FIELDS = {
91
+ 'unknown': ['DESCRIPTION', 'RISK', 'VALIDATION', 'BLOCKER', 'STATUS'],
92
+ 'assumption': ['STATEMENT', 'BASIS', 'RISK', 'VALIDATION_METHOD', 'STATUS'],
93
+ 'invariant': ['STATEMENT', 'RATIONALE', 'VERIFICATION', 'FAILURE_MODE', 'STATUS'],
94
+ 'ux_invariant': ['STATEMENT', 'RATIONALE', 'VALIDATION', 'PRIORITY', 'STATUS'],
95
+ 'adr': ['CONTEXT', 'DECISION', 'CONSEQUENCES'],
96
+ 'rfc': ['TRIGGER', 'AFFECTED_INVARIANTS', 'OPTIONS', 'STATUS'],
97
+ 'investigation': ['TRIGGER', 'AFFECTED_ASSUMPTION', 'FINDING', 'OPTIONS', 'STATUS'],
98
+ 'test_contract': ['INVARIANT', 'WHAT', 'HOW', 'VIOLATION', 'CRITICALITY'],
99
+ };
100
+ export function getSchemaForFile(filename, directory) {
101
+ return SCHEMAS.find(s => s.file === filename && s.directory === directory);
102
+ }
103
+ //# sourceMappingURL=schemas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas.js","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export type Phase = 'research' | 'product' | 'arch' | 'spec' | 'qa';
2
+ export type PhaseStatus = 'pending' | 'in_progress' | 'done';
3
+ export interface DevKitStatus {
4
+ phase: Phase;
5
+ mode: string;
6
+ initialized: string;
7
+ phaseProgress: Record<Phase, PhaseStatus>;
8
+ nextStep: string;
9
+ artifactCounts: Record<string, number>;
10
+ }
11
+ export declare function getStatus(cwd: string): DevKitStatus | null;
12
+ export declare function formatStatus(status: DevKitStatus): string;
13
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../src/status.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,KAAK,GAAG,UAAU,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;AACpE,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,aAAa,GAAG,MAAM,CAAC;AAoB7D,MAAM,WAAW,YAAY;IACzB,KAAK,EAAE,KAAK,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IAC1C,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC1C;AAiBD,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAyD1D;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CA4BzD"}