@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.
- package/dist/advance.d.ts +9 -0
- package/dist/advance.d.ts.map +1 -0
- package/dist/advance.js +47 -0
- package/dist/advance.js.map +1 -0
- package/dist/constitution.d.ts +16 -0
- package/dist/constitution.d.ts.map +1 -0
- package/dist/constitution.js +186 -0
- package/dist/constitution.js.map +1 -0
- package/dist/coverage.d.ts +18 -0
- package/dist/coverage.d.ts.map +1 -0
- package/dist/coverage.js +167 -0
- package/dist/coverage.js.map +1 -0
- package/dist/dashboard.d.ts +2 -0
- package/dist/dashboard.d.ts.map +1 -0
- package/dist/dashboard.js +380 -0
- package/dist/dashboard.js.map +1 -0
- package/dist/detector.d.ts +3 -0
- package/dist/detector.d.ts.map +1 -0
- package/dist/detector.js +45 -0
- package/dist/detector.js.map +1 -0
- package/dist/escalate.d.ts +11 -0
- package/dist/escalate.d.ts.map +1 -0
- package/dist/escalate.js +133 -0
- package/dist/escalate.js.map +1 -0
- package/dist/gate.d.ts +15 -0
- package/dist/gate.d.ts.map +1 -0
- package/dist/gate.js +244 -0
- package/dist/gate.js.map +1 -0
- package/dist/impact.d.ts +17 -0
- package/dist/impact.d.ts.map +1 -0
- package/dist/impact.js +192 -0
- package/dist/impact.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +494 -0
- package/dist/index.js.map +1 -0
- package/dist/investigate.d.ts +21 -0
- package/dist/investigate.d.ts.map +1 -0
- package/dist/investigate.js +200 -0
- package/dist/investigate.js.map +1 -0
- package/dist/rfc.d.ts +21 -0
- package/dist/rfc.d.ts.map +1 -0
- package/dist/rfc.js +152 -0
- package/dist/rfc.js.map +1 -0
- package/dist/scaffold.d.ts +7 -0
- package/dist/scaffold.d.ts.map +1 -0
- package/dist/scaffold.js +54 -0
- package/dist/scaffold.js.map +1 -0
- package/dist/schemas.d.ts +11 -0
- package/dist/schemas.d.ts.map +1 -0
- package/dist/schemas.js +103 -0
- package/dist/schemas.js.map +1 -0
- package/dist/status.d.ts +13 -0
- package/dist/status.d.ts.map +1 -0
- package/dist/status.js +112 -0
- package/dist/status.js.map +1 -0
- package/dist/validator.d.ts +16 -0
- package/dist/validator.d.ts.map +1 -0
- package/dist/validator.js +185 -0
- package/dist/validator.js.map +1 -0
- package/dist/watch.d.ts +2 -0
- package/dist/watch.d.ts.map +1 -0
- package/dist/watch.js +48 -0
- package/dist/watch.js.map +1 -0
- 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
|
package/dist/rfc.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rfc.js","sourceRoot":"","sources":["../src/rfc.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAC1F,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAY5C,SAAS,SAAS,CAAC,GAAW,EAAE,MAAc;IAC1C,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,MAAM,KAAK,CAAC;IAE5C,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC;SACzB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;SACtD,IAAI,EAAE,CAAC;IAEZ,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,GAAG,MAAM,KAAK,CAAC;IAE9C,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC;IACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,GAAG,MAAM,QAAQ,CAAC,CAAC,CAAC;IAC3D,IAAI,CAAC,QAAQ;QAAE,OAAO,GAAG,MAAM,KAAK,CAAC;IAErC,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAE,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;IAC5C,OAAO,GAAG,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,GAAW,EAAE,WAAmB;IACtD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IACvC,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;IAE1D,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QACzB,OAAO;YACH,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,kBAAkB,EAAE,EAAE;YACxD,aAAa,EAAE,EAAE,EAAE,SAAS,EAAE,SAAS;YACvC,KAAK,EAAE,8CAA8C;SACxD,CAAC;IACN,CAAC;IAED,oCAAoC;IACpC,SAAS,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE7C,sBAAsB;IACtB,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IAE/C,kBAAkB;IAClB,MAAM,EAAE,GAAG,SAAS,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IAC3C,MAAM,QAAQ,GAAG,GAAG,EAAE,KAAK,CAAC;IAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;IAC9C,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAErD,kCAAkC;IAClC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,WAAW,EAAE,CAAC,CAAC;IACtC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,SAAS,KAAK,EAAE,CAAC,CAAC;IAC7B,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,iBAAiB,WAAW,EAAE,CAAC,CAAC;IAC3C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,4DAA4D;IAC5D,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;IACrC,IAAI,MAAM,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvC,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,kBAAkB,EAAE,CAAC;YAC1C,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;QAC3B,CAAC;IACL,CAAC;SAAM,CAAC;QACJ,KAAK,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAC;IAChF,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,iBAAiB;IACjB,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAChC,IAAI,MAAM,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClC,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;YACtC,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;QAC5B,CAAC;IACL,CAAC;SAAM,CAAC;QACJ,KAAK,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC;IACnE,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,cAAc;IACd,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAC7B,KAAK,CAAC,IAAI,CAAC,oBAAoB,MAAM,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC;IAC9D,KAAK,CAAC,IAAI,CAAC,yBAAyB,MAAM,CAAC,kBAAkB,CAAC,MAAM,EAAE,CAAC,CAAC;IACxE,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;IACrC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,kCAAkC;IAClC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACzB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IACnC,KAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;IACtC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IACnC,KAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;IACtC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,0BAA0B;IAC1B,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC1B,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACvB,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC1B,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAC7B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,0BAA0B;IAC1B,KAAK,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;IACvC,KAAK,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;IACzC,KAAK,CAAC,IAAI,CAAC,gEAAgE,CAAC,CAAC;IAC7E,KAAK,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;IACtD,KAAK,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;IAC1D,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IACnC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,aAAa,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;IAEnD,OAAO;QACH,OAAO,EAAE,IAAI;QACb,EAAE;QACF,IAAI,EAAE,kBAAkB,QAAQ,EAAE;QAClC,kBAAkB,EAAE,MAAM,CAAC,kBAAkB;QAC7C,aAAa,EAAE,MAAM,CAAC,aAAa;QACnC,SAAS,EAAE,MAAM,CAAC,SAAS;KAC9B,CAAC;AACN,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,GAAW;IAChC,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;IAC/D,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC;QAAE,OAAO,EAAE,CAAC;IAEzC,OAAO,WAAW,CAAC,YAAY,CAAC;SAC3B,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;SACtD,IAAI,EAAE;SACN,GAAG,CAAC,CAAC,CAAC,EAAE;QACL,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QAC7D,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAC7C,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;QACtD,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QAClD,OAAO;YACH,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;YACxB,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;YAC3B,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,SAAS;YAC7C,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,SAAS;SAC5C,CAAC;IACN,CAAC,CAAC,CAAC;AACX,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,GAAW,EAAE,KAAa,EAAE,MAAc,EAAE,SAAiB;IACpF,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;IAC/D,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,EAAE,GAAG,KAAK,KAAK,CAAC,CAAC;IAEnD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACxB,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,KAAK,0CAA0C,EAAE,CAAC;IAC1F,CAAC;IAED,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAChD,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAErD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;QACzC,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;YAAE,OAAO,kBAAkB,CAAC;QAC1D,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;YAAE,OAAO,WAAW,MAAM,EAAE,CAAC;QAC3D,IAAI,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC;YAAE,OAAO,cAAc,SAAS,EAAE,CAAC;QACpE,IAAI,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC;YAAE,OAAO,uBAAuB,CAAC;QACnE,IAAI,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC;YAAE,OAAO,iBAAiB,KAAK,EAAE,CAAC;QACtE,OAAO,IAAI,CAAC;IAChB,CAAC,CAAC,CAAC;IAEH,aAAa,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;IAEnD,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAC9B,CAAC"}
|
|
@@ -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"}
|
package/dist/scaffold.js
ADDED
|
@@ -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"}
|
package/dist/schemas.js
ADDED
|
@@ -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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"}
|
package/dist/status.d.ts
ADDED
|
@@ -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"}
|