@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
package/dist/gate.js ADDED
@@ -0,0 +1,244 @@
1
+ import { readFileSync, existsSync, readdirSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ const PHASE_MAP = {
4
+ research: 'product',
5
+ product: 'arch',
6
+ arch: 'spec',
7
+ spec: 'qa',
8
+ qa: 'production',
9
+ };
10
+ // --- ResearchKit Gate ---
11
+ function checkResearchGate(devkitDir) {
12
+ const conditions = [];
13
+ const researchDir = join(devkitDir, 'research');
14
+ // Check market.md exists
15
+ const marketExists = existsSync(join(researchDir, 'market.md'));
16
+ conditions.push({
17
+ description: 'Market research completed (market.md)',
18
+ satisfied: marketExists,
19
+ });
20
+ // Check feasibility.md exists and has verdict
21
+ const feasPath = join(researchDir, 'feasibility.md');
22
+ if (existsSync(feasPath)) {
23
+ const content = readFileSync(feasPath, 'utf-8');
24
+ const feasibleMatch = content.match(/FEASIBLE:\s*(yes|conditional)/i);
25
+ conditions.push({
26
+ description: 'Feasibility is "yes" or "conditional"',
27
+ satisfied: !!feasibleMatch,
28
+ detail: feasibleMatch ? `FEASIBLE: ${feasibleMatch[1]}` : 'FEASIBLE field not found or is "no"',
29
+ });
30
+ }
31
+ else {
32
+ conditions.push({
33
+ description: 'Feasibility assessment completed (feasibility.md)',
34
+ satisfied: false,
35
+ });
36
+ }
37
+ // Check unknowns.md — no open blockers
38
+ const unknownsPath = join(researchDir, 'unknowns.md');
39
+ if (existsSync(unknownsPath)) {
40
+ const content = readFileSync(unknownsPath, 'utf-8');
41
+ const sections = content.split(/^## /m).slice(1);
42
+ let openBlockers = 0;
43
+ for (const section of sections) {
44
+ const isBlocker = /BLOCKER:\s*yes/i.test(section);
45
+ const isOpen = /STATUS:\s*open/i.test(section);
46
+ if (isBlocker && isOpen)
47
+ openBlockers++;
48
+ }
49
+ conditions.push({
50
+ description: 'No open BLOCKER unknowns',
51
+ satisfied: openBlockers === 0,
52
+ detail: openBlockers > 0 ? `${openBlockers} open blocker(s) found` : undefined,
53
+ });
54
+ }
55
+ else {
56
+ conditions.push({
57
+ description: 'Unknowns mapped (unknowns.md)',
58
+ satisfied: false,
59
+ });
60
+ }
61
+ // Check assumptions.md exists
62
+ conditions.push({
63
+ description: 'Assumptions documented (assumptions.md)',
64
+ satisfied: existsSync(join(researchDir, 'assumptions.md')),
65
+ });
66
+ return conditions;
67
+ }
68
+ // --- ProductKit Gate ---
69
+ function checkProductGate(devkitDir) {
70
+ const conditions = [];
71
+ const productDir = join(devkitDir, 'product');
72
+ // Users defined
73
+ const usersPath = join(productDir, 'users.md');
74
+ if (existsSync(usersPath)) {
75
+ const content = readFileSync(usersPath, 'utf-8');
76
+ const hasPrimary = /## Primary User/i.test(content);
77
+ const hasHappyPath = /HAPPY_PATH:/i.test(content);
78
+ conditions.push({
79
+ description: 'Primary user defined with happy path',
80
+ satisfied: hasPrimary && hasHappyPath,
81
+ });
82
+ }
83
+ else {
84
+ conditions.push({ description: 'User definition completed (users.md)', satisfied: false });
85
+ }
86
+ // UX invariants
87
+ const uxPath = join(productDir, 'ux_invariants.md');
88
+ if (existsSync(uxPath)) {
89
+ const content = readFileSync(uxPath, 'utf-8');
90
+ const invariants = content.split(/^## U\d+/m).length - 1;
91
+ conditions.push({
92
+ description: 'UX invariants established',
93
+ satisfied: invariants > 0,
94
+ detail: `${invariants} UX invariant(s) defined`,
95
+ });
96
+ }
97
+ else {
98
+ conditions.push({ description: 'UX invariants defined (ux_invariants.md)', satisfied: false });
99
+ }
100
+ // Roadmap with anti-scope
101
+ const roadmapPath = join(productDir, 'roadmap.md');
102
+ if (existsSync(roadmapPath)) {
103
+ const content = readFileSync(roadmapPath, 'utf-8');
104
+ const hasMvp = /## MVP/i.test(content);
105
+ const hasAntiScope = /## Never/i.test(content) || /anti-scope/i.test(content);
106
+ conditions.push({
107
+ description: 'Roadmap has MVP and anti-scope',
108
+ satisfied: hasMvp && hasAntiScope,
109
+ });
110
+ }
111
+ else {
112
+ conditions.push({ description: 'Roadmap defined (roadmap.md)', satisfied: false });
113
+ }
114
+ return conditions;
115
+ }
116
+ // --- ArchKit Gate ---
117
+ function checkArchGate(devkitDir) {
118
+ const conditions = [];
119
+ const archDir = join(devkitDir, 'arch');
120
+ // Invariants exist
121
+ const invPath = join(archDir, 'invariants.md');
122
+ conditions.push({
123
+ description: 'Technical invariants defined (invariants.md)',
124
+ satisfied: existsSync(invPath),
125
+ });
126
+ // Constitution generated
127
+ const constPath = join(archDir, 'constitution.md');
128
+ conditions.push({
129
+ description: 'Constitution generated (constitution.md)',
130
+ satisfied: existsSync(constPath),
131
+ });
132
+ // No unresolved open questions in invariants
133
+ if (existsSync(invPath)) {
134
+ const content = readFileSync(invPath, 'utf-8');
135
+ const hasOpenQuestions = /OPEN_QUESTION|STATUS:\s*unverified/i.test(content);
136
+ conditions.push({
137
+ description: 'No unverified invariants or open questions',
138
+ satisfied: !hasOpenQuestions,
139
+ });
140
+ }
141
+ return conditions;
142
+ }
143
+ // --- SpecKit Gate ---
144
+ function checkSpecGate(devkitDir) {
145
+ const conditions = [];
146
+ // At least one spec implemented
147
+ const specifyDir = join(devkitDir, '..', '.specify', 'specs');
148
+ if (existsSync(specifyDir)) {
149
+ const specs = readdirSync(specifyDir).filter(f => f.endsWith('.md'));
150
+ conditions.push({
151
+ description: 'At least one spec implemented',
152
+ satisfied: specs.length > 0,
153
+ detail: `${specs.length} spec(s) found`,
154
+ });
155
+ }
156
+ else {
157
+ conditions.push({
158
+ description: 'Implementation specs exist (.specify/specs/)',
159
+ satisfied: false,
160
+ });
161
+ }
162
+ return conditions;
163
+ }
164
+ // --- QAKit Gate ---
165
+ function checkQaGate(devkitDir) {
166
+ const conditions = [];
167
+ const qaDir = join(devkitDir, 'qa');
168
+ conditions.push({
169
+ description: 'Test contracts generated (test_contracts.md)',
170
+ satisfied: existsSync(join(qaDir, 'test_contracts.md')),
171
+ });
172
+ conditions.push({
173
+ description: 'Coverage map generated (coverage_map.md)',
174
+ satisfied: existsSync(join(qaDir, 'coverage_map.md')),
175
+ });
176
+ // No open blocker escalations
177
+ const escDir = join(qaDir, 'escalations');
178
+ if (existsSync(escDir)) {
179
+ const files = readdirSync(escDir).filter(f => f.endsWith('.md'));
180
+ let openBlockers = 0;
181
+ for (const file of files) {
182
+ const content = readFileSync(join(escDir, file), 'utf-8');
183
+ if (/STATUS:\s*open/i.test(content) && /blocker/i.test(content)) {
184
+ openBlockers++;
185
+ }
186
+ }
187
+ conditions.push({
188
+ description: 'No open blocker escalations',
189
+ satisfied: openBlockers === 0,
190
+ detail: openBlockers > 0 ? `${openBlockers} open blocker escalation(s)` : undefined,
191
+ });
192
+ }
193
+ return conditions;
194
+ }
195
+ export function checkGate(cwd, currentPhase) {
196
+ const devkitDir = join(cwd, '.devkit');
197
+ const checkers = {
198
+ research: checkResearchGate,
199
+ product: checkProductGate,
200
+ arch: checkArchGate,
201
+ spec: checkSpecGate,
202
+ qa: checkQaGate,
203
+ };
204
+ const checker = checkers[currentPhase];
205
+ const conditions = checker ? checker(devkitDir) : [];
206
+ const allowed = conditions.length > 0 && conditions.every(c => c.satisfied);
207
+ return {
208
+ allowed,
209
+ currentPhase,
210
+ nextPhase: PHASE_MAP[currentPhase],
211
+ conditions,
212
+ };
213
+ }
214
+ const PHASE_LABELS = {
215
+ research: 'ResearchKit',
216
+ product: 'ProductKit',
217
+ arch: 'ArchKit',
218
+ spec: 'SpecKit',
219
+ qa: 'QAKit',
220
+ production: 'Production',
221
+ };
222
+ export function formatGate(result) {
223
+ const lines = [];
224
+ const from = PHASE_LABELS[result.currentPhase];
225
+ const to = PHASE_LABELS[result.nextPhase];
226
+ lines.push(`Gate: ${from} → ${to}\n`);
227
+ for (const cond of result.conditions) {
228
+ const icon = cond.satisfied ? '✅' : '❌';
229
+ lines.push(` ${icon} ${cond.description}`);
230
+ if (cond.detail) {
231
+ lines.push(` ${cond.detail}`);
232
+ }
233
+ }
234
+ lines.push('');
235
+ if (result.allowed) {
236
+ lines.push(`🟢 ALLOWED — ready to proceed to ${to}`);
237
+ }
238
+ else {
239
+ const unsatisfied = result.conditions.filter(c => !c.satisfied).length;
240
+ lines.push(`🔴 BLOCKED — ${unsatisfied} condition(s) not met`);
241
+ }
242
+ return lines.join('\n');
243
+ }
244
+ //# sourceMappingURL=gate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gate.js","sourceRoot":"","sources":["../src/gate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ export interface ImpactEntity {
2
+ name: string;
3
+ dependsOn: string[];
4
+ dependedBy: string[];
5
+ invariants: string[];
6
+ }
7
+ export interface ImpactResult {
8
+ description: string;
9
+ affectedInvariants: string[];
10
+ affectedComponents: string[];
11
+ affectedSpecs: string[];
12
+ riskLevel: 'low' | 'medium' | 'high';
13
+ recommendation: string;
14
+ }
15
+ export declare function analyzeImpact(cwd: string, description: string): ImpactResult;
16
+ export declare function formatImpact(result: ImpactResult): string;
17
+ //# sourceMappingURL=impact.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"impact.d.ts","sourceRoot":"","sources":["../src/impact.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,YAAY;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,UAAU,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,YAAY;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,SAAS,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IACrC,cAAc,EAAE,MAAM,CAAC;CAC1B;AA6ED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,YAAY,CA4G5E;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CA0CzD"}
package/dist/impact.js ADDED
@@ -0,0 +1,192 @@
1
+ import { readFileSync, existsSync, readdirSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ function parseImpactMap(content) {
4
+ const entities = [];
5
+ const sections = content.split(/^## /m).slice(1);
6
+ for (const section of sections) {
7
+ const lines = section.split('\n');
8
+ const name = lines[0]?.trim() ?? '';
9
+ const dependsOn = [];
10
+ const dependedBy = [];
11
+ const invariants = [];
12
+ for (const line of lines) {
13
+ const depOnMatch = line.match(/DEPENDS_ON:\s*\[(.+)\]/);
14
+ if (depOnMatch) {
15
+ dependsOn.push(...depOnMatch[1].split(',').map(s => s.trim()).filter(Boolean));
16
+ }
17
+ const depByMatch = line.match(/DEPENDED_BY:\s*\[(.+)\]/);
18
+ if (depByMatch) {
19
+ dependedBy.push(...depByMatch[1].split(',').map(s => s.trim()).filter(Boolean));
20
+ }
21
+ const invMatch = line.match(/INVARIANTS:\s*\[(.+)\]/);
22
+ if (invMatch) {
23
+ invariants.push(...invMatch[1].split(',').map(s => s.trim()).filter(Boolean));
24
+ }
25
+ }
26
+ entities.push({ name, dependsOn, dependedBy, invariants });
27
+ }
28
+ return entities;
29
+ }
30
+ function findAffected(entities, keywords) {
31
+ const components = new Set();
32
+ const invariants = new Set();
33
+ const visited = new Set();
34
+ function walk(name) {
35
+ if (visited.has(name))
36
+ return;
37
+ visited.add(name);
38
+ components.add(name);
39
+ const entity = entities.find(e => e.name.toLowerCase().includes(name.toLowerCase()));
40
+ if (!entity)
41
+ return;
42
+ for (const inv of entity.invariants) {
43
+ invariants.add(inv);
44
+ }
45
+ // Walk dependedBy (things that depend on this)
46
+ for (const dep of entity.dependedBy) {
47
+ walk(dep);
48
+ }
49
+ }
50
+ // Start from entities that match keywords
51
+ for (const entity of entities) {
52
+ for (const keyword of keywords) {
53
+ if (entity.name.toLowerCase().includes(keyword.toLowerCase())) {
54
+ walk(entity.name);
55
+ }
56
+ }
57
+ }
58
+ return { components, invariants };
59
+ }
60
+ export function analyzeImpact(cwd, description) {
61
+ const devkitDir = join(cwd, '.devkit');
62
+ const impactPath = join(devkitDir, 'arch', 'impact.md');
63
+ // Extract keywords from description
64
+ const keywords = description
65
+ .toLowerCase()
66
+ .split(/[\s,;]+/)
67
+ .filter(w => w.length > 2)
68
+ .filter(w => !['the', 'and', 'for', 'with', 'from', 'that', 'this', 'into', 'add', 'new', 'use'].includes(w));
69
+ if (!existsSync(impactPath)) {
70
+ // No impact map — do best-effort analysis from invariants
71
+ const invPath = join(devkitDir, 'arch', 'invariants.md');
72
+ const uxPath = join(devkitDir, 'product', 'ux_invariants.md');
73
+ const affectedInvariants = [];
74
+ for (const path of [invPath, uxPath]) {
75
+ if (!existsSync(path))
76
+ continue;
77
+ const content = readFileSync(path, 'utf-8');
78
+ // Find invariants whose text mentions any keyword
79
+ const sections = content.split(/^## /m).slice(1);
80
+ for (const section of sections) {
81
+ const header = section.split('\n')[0]?.trim() ?? '';
82
+ for (const keyword of keywords) {
83
+ if (section.toLowerCase().includes(keyword)) {
84
+ affectedInvariants.push(header);
85
+ break;
86
+ }
87
+ }
88
+ }
89
+ }
90
+ // Check specs
91
+ const affectedSpecs = [];
92
+ const specsDir = join(cwd, '.specify', 'specs');
93
+ if (existsSync(specsDir)) {
94
+ const specs = readdirSync(specsDir).filter(f => f.endsWith('.md'));
95
+ for (const spec of specs) {
96
+ const content = readFileSync(join(specsDir, spec), 'utf-8');
97
+ for (const keyword of keywords) {
98
+ if (content.toLowerCase().includes(keyword)) {
99
+ affectedSpecs.push(spec.replace('.md', ''));
100
+ break;
101
+ }
102
+ }
103
+ }
104
+ }
105
+ const riskLevel = affectedInvariants.length >= 3
106
+ ? 'high'
107
+ : affectedInvariants.length >= 1
108
+ ? 'medium'
109
+ : 'low';
110
+ const recommendation = affectedInvariants.length > 0
111
+ ? `This change touches ${affectedInvariants.length} invariant(s). Open an RFC via "devkit rfc" before proceeding.`
112
+ : 'No invariants directly affected. Proceed with caution and validate after implementation.';
113
+ return {
114
+ description,
115
+ affectedInvariants,
116
+ affectedComponents: [],
117
+ affectedSpecs,
118
+ riskLevel,
119
+ recommendation,
120
+ };
121
+ }
122
+ // Full analysis with impact map
123
+ const impactContent = readFileSync(impactPath, 'utf-8');
124
+ const entities = parseImpactMap(impactContent);
125
+ const { components, invariants } = findAffected(entities, keywords);
126
+ const affectedSpecs = [];
127
+ const specsDir = join(cwd, '.specify', 'specs');
128
+ if (existsSync(specsDir)) {
129
+ const specs = readdirSync(specsDir).filter(f => f.endsWith('.md'));
130
+ for (const spec of specs) {
131
+ const content = readFileSync(join(specsDir, spec), 'utf-8');
132
+ for (const keyword of keywords) {
133
+ if (content.toLowerCase().includes(keyword)) {
134
+ affectedSpecs.push(spec.replace('.md', ''));
135
+ break;
136
+ }
137
+ }
138
+ }
139
+ }
140
+ const riskLevel = invariants.size >= 3
141
+ ? 'high'
142
+ : invariants.size >= 1
143
+ ? 'medium'
144
+ : 'low';
145
+ const recommendation = invariants.size > 0
146
+ ? `This change touches ${invariants.size} invariant(s) across ${components.size} component(s). Open an RFC via "devkit rfc" before proceeding.`
147
+ : 'No invariants directly affected. Proceed with normal spec-kit workflow.';
148
+ return {
149
+ description,
150
+ affectedInvariants: [...invariants],
151
+ affectedComponents: [...components],
152
+ affectedSpecs,
153
+ riskLevel,
154
+ recommendation,
155
+ };
156
+ }
157
+ export function formatImpact(result) {
158
+ const lines = [];
159
+ const riskEmoji = result.riskLevel === 'high' ? '🔴' :
160
+ result.riskLevel === 'medium' ? '🟡' : '🟢';
161
+ lines.push(`Impact Analysis: "${result.description}"`);
162
+ lines.push(`Risk: ${riskEmoji} ${result.riskLevel.toUpperCase()}`);
163
+ lines.push('');
164
+ if (result.affectedInvariants.length > 0) {
165
+ lines.push(' Affected invariants:');
166
+ for (const inv of result.affectedInvariants) {
167
+ lines.push(` ⚡ ${inv}`);
168
+ }
169
+ lines.push('');
170
+ }
171
+ if (result.affectedComponents.length > 0) {
172
+ lines.push(' Affected components:');
173
+ for (const comp of result.affectedComponents) {
174
+ lines.push(` 📦 ${comp}`);
175
+ }
176
+ lines.push('');
177
+ }
178
+ if (result.affectedSpecs.length > 0) {
179
+ lines.push(' Affected specs:');
180
+ for (const spec of result.affectedSpecs) {
181
+ lines.push(` 📄 ${spec}`);
182
+ }
183
+ lines.push('');
184
+ }
185
+ if (result.affectedInvariants.length === 0 && result.affectedComponents.length === 0) {
186
+ lines.push(' No direct impact detected on existing invariants or components.');
187
+ lines.push('');
188
+ }
189
+ lines.push(` 💡 ${result.recommendation}`);
190
+ return lines.join('\n');
191
+ }
192
+ //# sourceMappingURL=impact.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"impact.js","sourceRoot":"","sources":["../src/impact.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}