@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,9 @@
1
+ import type { Phase } from './status.js';
2
+ export interface AdvanceResult {
3
+ advanced: boolean;
4
+ from: Phase;
5
+ to: Phase;
6
+ error?: string;
7
+ }
8
+ export declare function advancePhase(cwd: string, currentPhase: Phase): AdvanceResult;
9
+ //# sourceMappingURL=advance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"advance.d.ts","sourceRoot":"","sources":["../src/advance.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAYzC,MAAM,WAAW,aAAa;IAC1B,QAAQ,EAAE,OAAO,CAAC;IAClB,IAAI,EAAE,KAAK,CAAC;IACZ,EAAE,EAAE,KAAK,CAAC;IACV,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,GAAG,aAAa,CAoD5E"}
@@ -0,0 +1,47 @@
1
+ import { readFileSync, writeFileSync, existsSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ const PHASE_ORDER = ['research', 'product', 'arch', 'spec', 'qa'];
4
+ const PHASE_LABELS = {
5
+ research: 'ResearchKit',
6
+ product: 'ProductKit',
7
+ arch: 'ArchKit',
8
+ spec: 'SpecKit',
9
+ qa: 'QAKit',
10
+ };
11
+ export function advancePhase(cwd, currentPhase) {
12
+ const statusPath = join(cwd, '.devkit', 'STATUS.md');
13
+ if (!existsSync(statusPath)) {
14
+ return {
15
+ advanced: false,
16
+ from: currentPhase,
17
+ to: currentPhase,
18
+ error: '.devkit/STATUS.md not found. Run "devkit init" first.',
19
+ };
20
+ }
21
+ const idx = PHASE_ORDER.indexOf(currentPhase);
22
+ if (idx === PHASE_ORDER.length - 1) {
23
+ return {
24
+ advanced: false,
25
+ from: currentPhase,
26
+ to: currentPhase,
27
+ error: `Already at the final phase (${PHASE_LABELS[currentPhase]}). No further phases.`,
28
+ };
29
+ }
30
+ const nextPhase = PHASE_ORDER[idx + 1];
31
+ let content = readFileSync(statusPath, 'utf-8');
32
+ // Update CURRENT_PHASE
33
+ content = content.replace(/CURRENT_PHASE:\s*.+/, `CURRENT_PHASE: ${nextPhase}`);
34
+ // Mark current phase as done
35
+ const currentLabel = PHASE_LABELS[currentPhase];
36
+ content = content.replace(new RegExp(`- \\[.\\] ${currentLabel}`), `- [x] ${currentLabel}`);
37
+ // Mark next phase as in-progress
38
+ const nextLabel = PHASE_LABELS[nextPhase];
39
+ content = content.replace(new RegExp(`- \\[.\\] ${nextLabel}`), `- [/] ${nextLabel}`);
40
+ writeFileSync(statusPath, content, 'utf-8');
41
+ return {
42
+ advanced: true,
43
+ from: currentPhase,
44
+ to: nextPhase,
45
+ };
46
+ }
47
+ //# sourceMappingURL=advance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"advance.js","sourceRoot":"","sources":["../src/advance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAClE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,MAAM,WAAW,GAAY,CAAC,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;AAE3E,MAAM,YAAY,GAA0B;IACxC,QAAQ,EAAE,aAAa;IACvB,OAAO,EAAE,YAAY;IACrB,IAAI,EAAE,SAAS;IACf,IAAI,EAAE,SAAS;IACf,EAAE,EAAE,OAAO;CACd,CAAC;AASF,MAAM,UAAU,YAAY,CAAC,GAAW,EAAE,YAAmB;IACzD,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;IAErD,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC1B,OAAO;YACH,QAAQ,EAAE,KAAK;YACf,IAAI,EAAE,YAAY;YAClB,EAAE,EAAE,YAAY;YAChB,KAAK,EAAE,uDAAuD;SACjE,CAAC;IACN,CAAC;IAED,MAAM,GAAG,GAAG,WAAW,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAC9C,IAAI,GAAG,KAAK,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjC,OAAO;YACH,QAAQ,EAAE,KAAK;YACf,IAAI,EAAE,YAAY;YAClB,EAAE,EAAE,YAAY;YAChB,KAAK,EAAE,+BAA+B,YAAY,CAAC,YAAY,CAAC,uBAAuB;SAC1F,CAAC;IACN,CAAC;IAED,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,GAAG,CAAC,CAAE,CAAC;IACxC,IAAI,OAAO,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAEhD,uBAAuB;IACvB,OAAO,GAAG,OAAO,CAAC,OAAO,CACrB,qBAAqB,EACrB,kBAAkB,SAAS,EAAE,CAChC,CAAC;IAEF,6BAA6B;IAC7B,MAAM,YAAY,GAAG,YAAY,CAAC,YAAY,CAAE,CAAC;IACjD,OAAO,GAAG,OAAO,CAAC,OAAO,CACrB,IAAI,MAAM,CAAC,aAAa,YAAY,EAAE,CAAC,EACvC,SAAS,YAAY,EAAE,CAC1B,CAAC;IAEF,iCAAiC;IACjC,MAAM,SAAS,GAAG,YAAY,CAAC,SAAS,CAAE,CAAC;IAC3C,OAAO,GAAG,OAAO,CAAC,OAAO,CACrB,IAAI,MAAM,CAAC,aAAa,SAAS,EAAE,CAAC,EACpC,SAAS,SAAS,EAAE,CACvB,CAAC;IAEF,aAAa,CAAC,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAE5C,OAAO;QACH,QAAQ,EAAE,IAAI;QACd,IAAI,EAAE,YAAY;QAClB,EAAE,EAAE,SAAS;KAChB,CAAC;AACN,CAAC"}
@@ -0,0 +1,16 @@
1
+ export interface ConstitutionResult {
2
+ generated: boolean;
3
+ invariantsCount: number;
4
+ uxInvariantsCount: number;
5
+ decisionsCount: number;
6
+ outputPath: string;
7
+ error?: string;
8
+ }
9
+ export declare function generateConstitution(cwd: string): ConstitutionResult;
10
+ export declare function syncConstitution(cwd: string): {
11
+ synced: boolean;
12
+ from: string;
13
+ to: string;
14
+ error?: string;
15
+ };
16
+ //# sourceMappingURL=constitution.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constitution.d.ts","sourceRoot":"","sources":["../src/constitution.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,kBAAkB;IAC/B,SAAS,EAAE,OAAO,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAwBD,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,kBAAkB,CA2KpE;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAiB3G"}
@@ -0,0 +1,186 @@
1
+ import { readFileSync, writeFileSync, existsSync, readdirSync, mkdirSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ function extractSections(content, prefix) {
4
+ const sections = [];
5
+ const regex = new RegExp(`^## ${prefix}(.+)`, 'gm');
6
+ let match;
7
+ while ((match = regex.exec(content)) !== null) {
8
+ // Extract from this ## to the next ##
9
+ const start = match.index;
10
+ const rest = content.slice(start);
11
+ const nextSection = rest.indexOf('\n## ', 3);
12
+ const section = nextSection > 0 ? rest.slice(0, nextSection) : rest;
13
+ sections.push(section.trim());
14
+ }
15
+ return sections;
16
+ }
17
+ function readIfExists(path) {
18
+ if (!existsSync(path))
19
+ return null;
20
+ return readFileSync(path, 'utf-8');
21
+ }
22
+ export function generateConstitution(cwd) {
23
+ const devkitDir = join(cwd, '.devkit');
24
+ const archDir = join(devkitDir, 'arch');
25
+ const productDir = join(devkitDir, 'product');
26
+ const outputPath = join(archDir, 'constitution.md');
27
+ // Check preconditions
28
+ const invariantsContent = readIfExists(join(archDir, 'invariants.md'));
29
+ const uxInvariantsContent = readIfExists(join(productDir, 'ux_invariants.md'));
30
+ if (!invariantsContent && !uxInvariantsContent) {
31
+ return {
32
+ generated: false,
33
+ invariantsCount: 0,
34
+ uxInvariantsCount: 0,
35
+ decisionsCount: 0,
36
+ outputPath,
37
+ error: 'No invariants found. Create invariants.md in .devkit/arch/ or ux_invariants.md in .devkit/product/',
38
+ };
39
+ }
40
+ const lines = [];
41
+ const now = new Date().toISOString().split('T')[0];
42
+ // Ensure arch directory exists
43
+ mkdirSync(archDir, { recursive: true });
44
+ lines.push('# Constitution');
45
+ lines.push('');
46
+ lines.push('> Auto-generated by DevKit CLI. DO NOT EDIT MANUALLY.');
47
+ lines.push(`> Generated: ${now}`);
48
+ lines.push(`> Source: .devkit/arch/invariants.md + .devkit/product/ux_invariants.md + .devkit/arch/decisions/`);
49
+ lines.push('');
50
+ // === Technical Invariants ===
51
+ let invariantsCount = 0;
52
+ if (invariantsContent) {
53
+ const sections = extractSections(invariantsContent, 'I\\d+');
54
+ invariantsCount = sections.length;
55
+ if (sections.length > 0) {
56
+ lines.push('---');
57
+ lines.push('');
58
+ lines.push('## Technical Invariants');
59
+ lines.push('');
60
+ lines.push('The system MUST guarantee the following:');
61
+ lines.push('');
62
+ for (const section of sections) {
63
+ // Extract key fields
64
+ const stmtMatch = section.match(/STATEMENT:\s*(.+)/);
65
+ const failMatch = section.match(/FAILURE_MODE:\s*(.+)/);
66
+ const headerMatch = section.match(/^## (.+)/);
67
+ if (headerMatch && stmtMatch) {
68
+ lines.push(`### ${headerMatch[1]}`);
69
+ lines.push(`- **Guarantee**: ${stmtMatch[1]}`);
70
+ if (failMatch) {
71
+ lines.push(`- **On violation**: ${failMatch[1]}`);
72
+ }
73
+ lines.push('');
74
+ }
75
+ }
76
+ }
77
+ }
78
+ // === UX Invariants ===
79
+ let uxInvariantsCount = 0;
80
+ if (uxInvariantsContent) {
81
+ const sections = extractSections(uxInvariantsContent, 'U\\d+');
82
+ uxInvariantsCount = sections.length;
83
+ if (sections.length > 0) {
84
+ lines.push('---');
85
+ lines.push('');
86
+ lines.push('## UX Invariants');
87
+ lines.push('');
88
+ lines.push('The system MUST provide the following user experience guarantees:');
89
+ lines.push('');
90
+ for (const section of sections) {
91
+ const stmtMatch = section.match(/STATEMENT:\s*(.+)/);
92
+ const priorityMatch = section.match(/PRIORITY:\s*(.+)/);
93
+ const headerMatch = section.match(/^## (.+)/);
94
+ if (headerMatch && stmtMatch) {
95
+ const priority = priorityMatch ? ` [${priorityMatch[1]}]` : '';
96
+ lines.push(`### ${headerMatch[1]}${priority}`);
97
+ lines.push(`- **Promise**: ${stmtMatch[1]}`);
98
+ lines.push('');
99
+ }
100
+ }
101
+ }
102
+ }
103
+ // === Architecture Decisions ===
104
+ let decisionsCount = 0;
105
+ const decisionsDir = join(archDir, 'decisions');
106
+ if (existsSync(decisionsDir)) {
107
+ const files = readdirSync(decisionsDir)
108
+ .filter(f => f.endsWith('.md') && f.startsWith('ADR-'))
109
+ .sort();
110
+ decisionsCount = files.length;
111
+ if (files.length > 0) {
112
+ lines.push('---');
113
+ lines.push('');
114
+ lines.push('## Architecture Decisions');
115
+ lines.push('');
116
+ for (const file of files) {
117
+ const content = readFileSync(join(decisionsDir, file), 'utf-8');
118
+ const titleMatch = content.match(/^# (.+)/m);
119
+ const decisionMatch = content.match(/DECISION:\s*(.+)/);
120
+ const rationaleMatch = content.match(/RATIONALE:\s*(.+)/);
121
+ const title = titleMatch ? titleMatch[1] : file.replace('.md', '');
122
+ lines.push(`### ${title}`);
123
+ if (decisionMatch)
124
+ lines.push(`- **Decision**: ${decisionMatch[1]}`);
125
+ if (rationaleMatch)
126
+ lines.push(`- **Rationale**: ${rationaleMatch[1]}`);
127
+ lines.push('');
128
+ }
129
+ }
130
+ }
131
+ // === Active RFCs ===
132
+ if (existsSync(decisionsDir)) {
133
+ const rfcs = readdirSync(decisionsDir)
134
+ .filter(f => f.endsWith('.md') && f.startsWith('RFC-'))
135
+ .sort();
136
+ if (rfcs.length > 0) {
137
+ lines.push('---');
138
+ lines.push('');
139
+ lines.push('## Active RFCs');
140
+ lines.push('');
141
+ for (const file of rfcs) {
142
+ const content = readFileSync(join(decisionsDir, file), 'utf-8');
143
+ const titleMatch = content.match(/^# (.+)/m);
144
+ const statusMatch = content.match(/STATUS:\s*(.+)/);
145
+ const title = titleMatch ? titleMatch[1] : file.replace('.md', '');
146
+ const status = statusMatch ? statusMatch[1] : 'unknown';
147
+ lines.push(`- **${title}** — ${status}`);
148
+ }
149
+ lines.push('');
150
+ }
151
+ }
152
+ // === Footer ===
153
+ lines.push('---');
154
+ lines.push('');
155
+ lines.push('## Development Guidelines');
156
+ lines.push('');
157
+ lines.push('1. Any deviation from the invariants above requires an RFC through ArchKit');
158
+ lines.push('2. New requirements that touch invariants must go through impact analysis');
159
+ lines.push('3. Test contracts in QAKit map 1:1 to invariants — every invariant must be testable');
160
+ lines.push('4. This file is regenerated when invariants or decisions change — do not edit manually');
161
+ lines.push('');
162
+ const output = lines.join('\n');
163
+ writeFileSync(outputPath, output, 'utf-8');
164
+ return {
165
+ generated: true,
166
+ invariantsCount,
167
+ uxInvariantsCount,
168
+ decisionsCount,
169
+ outputPath,
170
+ };
171
+ }
172
+ export function syncConstitution(cwd) {
173
+ const from = join(cwd, '.devkit', 'arch', 'constitution.md');
174
+ const specifyDir = join(cwd, '.specify');
175
+ const to = join(specifyDir, 'constitution.md');
176
+ if (!existsSync(from)) {
177
+ return { synced: false, from, to, error: 'constitution.md not found. Run "devkit generate-constitution" first.' };
178
+ }
179
+ if (!existsSync(specifyDir)) {
180
+ mkdirSync(specifyDir, { recursive: true });
181
+ }
182
+ const content = readFileSync(from, 'utf-8');
183
+ writeFileSync(to, content, 'utf-8');
184
+ return { synced: true, from: '.devkit/arch/constitution.md', to: '.specify/constitution.md' };
185
+ }
186
+ //# sourceMappingURL=constitution.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constitution.js","sourceRoot":"","sources":["../src/constitution.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ export interface CoverageEntry {
2
+ invariant: string;
3
+ id: string;
4
+ type: 'technical' | 'ux';
5
+ coveredBy: string[];
6
+ status: 'covered' | 'partial' | 'uncovered';
7
+ }
8
+ export interface CoverageResult {
9
+ entries: CoverageEntry[];
10
+ totalInvariants: number;
11
+ covered: number;
12
+ partial: number;
13
+ uncovered: number;
14
+ percentage: number;
15
+ }
16
+ export declare function analyzeCoverage(cwd: string): CoverageResult;
17
+ export declare function formatCoverage(result: CoverageResult): string;
18
+ //# sourceMappingURL=coverage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coverage.d.ts","sourceRoot":"","sources":["../src/coverage.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,aAAa;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,WAAW,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,WAAW,CAAC;CAC/C;AAED,MAAM,WAAW,cAAc;IAC3B,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACtB;AAuFD,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,CAoD3D;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAoD7D"}
@@ -0,0 +1,167 @@
1
+ import { readFileSync, existsSync, readdirSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ function extractInvariants(content, type) {
4
+ const results = [];
5
+ const prefix = type === 'technical' ? 'I' : 'U';
6
+ const regex = new RegExp(`^## (${prefix}\\d+):\\s*(.+)`, 'gm');
7
+ let match;
8
+ while ((match = regex.exec(content)) !== null) {
9
+ const id = match[1];
10
+ const name = match[2].trim();
11
+ // Get statement
12
+ const start = match.index;
13
+ const rest = content.slice(start);
14
+ const nextSection = rest.indexOf('\n## ', 3);
15
+ const section = nextSection > 0 ? rest.slice(0, nextSection) : rest;
16
+ const stmtMatch = section.match(/STATEMENT:\s*(.+)/);
17
+ const statement = stmtMatch?.[1]?.trim() ?? name;
18
+ results.push({ id, name, statement });
19
+ }
20
+ return results;
21
+ }
22
+ function findTestMentions(cwd, invariantId, invariantName) {
23
+ const mentions = [];
24
+ // Check test_contracts.md
25
+ const testContracts = join(cwd, '.devkit', 'qa', 'test_contracts.md');
26
+ if (existsSync(testContracts)) {
27
+ const content = readFileSync(testContracts, 'utf-8');
28
+ if (content.includes(invariantId) || content.toLowerCase().includes(invariantName.toLowerCase())) {
29
+ mentions.push('qa/test_contracts.md');
30
+ }
31
+ }
32
+ // Check coverage_map.md
33
+ const coverageMap = join(cwd, '.devkit', 'qa', 'coverage_map.md');
34
+ if (existsSync(coverageMap)) {
35
+ const content = readFileSync(coverageMap, 'utf-8');
36
+ if (content.includes(invariantId) || content.toLowerCase().includes(invariantName.toLowerCase())) {
37
+ mentions.push('qa/coverage_map.md');
38
+ }
39
+ }
40
+ // Check assumption_checks.md
41
+ const assumptionChecks = join(cwd, '.devkit', 'qa', 'assumption_checks.md');
42
+ if (existsSync(assumptionChecks)) {
43
+ const content = readFileSync(assumptionChecks, 'utf-8');
44
+ if (content.includes(invariantId)) {
45
+ mentions.push('qa/assumption_checks.md');
46
+ }
47
+ }
48
+ // Search test files in project (common patterns)
49
+ const testDirs = ['tests', 'test', '__tests__', 'spec', 'cli/tests'];
50
+ for (const dir of testDirs) {
51
+ const testDir = join(cwd, dir);
52
+ if (!existsSync(testDir))
53
+ continue;
54
+ try {
55
+ const files = readdirSync(testDir).filter(f => f.endsWith('.test.ts') || f.endsWith('.test.js') ||
56
+ f.endsWith('.spec.ts') || f.endsWith('.spec.js'));
57
+ for (const file of files) {
58
+ const content = readFileSync(join(testDir, file), 'utf-8');
59
+ // Search for invariant ID or keywords from the invariant name
60
+ const keywords = invariantName.toLowerCase().split(/[\s\-_:]+/).filter(w => w.length > 3);
61
+ const hasId = content.includes(invariantId);
62
+ const hasKeywords = keywords.some(kw => content.toLowerCase().includes(kw));
63
+ if (hasId || hasKeywords) {
64
+ mentions.push(`${dir}/${file}`);
65
+ }
66
+ }
67
+ }
68
+ catch {
69
+ // Skip unreadable dirs
70
+ }
71
+ }
72
+ return [...new Set(mentions)]; // dedupe
73
+ }
74
+ export function analyzeCoverage(cwd) {
75
+ const entries = [];
76
+ // Technical invariants
77
+ const invPath = join(cwd, '.devkit', 'arch', 'invariants.md');
78
+ if (existsSync(invPath)) {
79
+ const content = readFileSync(invPath, 'utf-8');
80
+ const invariants = extractInvariants(content, 'technical');
81
+ for (const inv of invariants) {
82
+ const coveredBy = findTestMentions(cwd, inv.id, inv.name);
83
+ entries.push({
84
+ invariant: `${inv.id}: ${inv.name}`,
85
+ id: inv.id,
86
+ type: 'technical',
87
+ coveredBy,
88
+ status: coveredBy.length >= 2 ? 'covered' : coveredBy.length === 1 ? 'partial' : 'uncovered',
89
+ });
90
+ }
91
+ }
92
+ // UX invariants
93
+ const uxPath = join(cwd, '.devkit', 'product', 'ux_invariants.md');
94
+ if (existsSync(uxPath)) {
95
+ const content = readFileSync(uxPath, 'utf-8');
96
+ const invariants = extractInvariants(content, 'ux');
97
+ for (const inv of invariants) {
98
+ const coveredBy = findTestMentions(cwd, inv.id, inv.name);
99
+ entries.push({
100
+ invariant: `${inv.id}: ${inv.name}`,
101
+ id: inv.id,
102
+ type: 'ux',
103
+ coveredBy,
104
+ status: coveredBy.length >= 2 ? 'covered' : coveredBy.length === 1 ? 'partial' : 'uncovered',
105
+ });
106
+ }
107
+ }
108
+ const covered = entries.filter(e => e.status === 'covered').length;
109
+ const partial = entries.filter(e => e.status === 'partial').length;
110
+ const uncovered = entries.filter(e => e.status === 'uncovered').length;
111
+ const total = entries.length;
112
+ return {
113
+ entries,
114
+ totalInvariants: total,
115
+ covered,
116
+ partial,
117
+ uncovered,
118
+ percentage: total > 0 ? Math.round((covered / total) * 100) : 0,
119
+ };
120
+ }
121
+ export function formatCoverage(result) {
122
+ const lines = [];
123
+ lines.push(`Coverage: ${result.covered}/${result.totalInvariants} invariants fully covered (${result.percentage}%)`);
124
+ lines.push('');
125
+ // Progress bar
126
+ const barWidth = 30;
127
+ const filledCount = Math.round((result.percentage / 100) * barWidth);
128
+ const bar = '█'.repeat(filledCount) + '░'.repeat(barWidth - filledCount);
129
+ lines.push(` [${bar}] ${result.percentage}%`);
130
+ lines.push('');
131
+ // Group by type
132
+ const technical = result.entries.filter(e => e.type === 'technical');
133
+ const ux = result.entries.filter(e => e.type === 'ux');
134
+ if (technical.length > 0) {
135
+ lines.push(' Technical Invariants:');
136
+ for (const e of technical) {
137
+ const icon = e.status === 'covered' ? '✅' : e.status === 'partial' ? '🟡' : '❌';
138
+ lines.push(` ${icon} ${e.invariant}`);
139
+ if (e.coveredBy.length > 0) {
140
+ for (const by of e.coveredBy) {
141
+ lines.push(` ↳ ${by}`);
142
+ }
143
+ }
144
+ }
145
+ lines.push('');
146
+ }
147
+ if (ux.length > 0) {
148
+ lines.push(' UX Invariants:');
149
+ for (const e of ux) {
150
+ const icon = e.status === 'covered' ? '✅' : e.status === 'partial' ? '🟡' : '❌';
151
+ lines.push(` ${icon} ${e.invariant}`);
152
+ if (e.coveredBy.length > 0) {
153
+ for (const by of e.coveredBy) {
154
+ lines.push(` ↳ ${by}`);
155
+ }
156
+ }
157
+ }
158
+ lines.push('');
159
+ }
160
+ if (result.uncovered > 0) {
161
+ lines.push(` ⚠️ ${result.uncovered} invariant(s) have NO test coverage.`);
162
+ lines.push(' Add tests or reference invariant IDs in test_contracts.md');
163
+ lines.push('');
164
+ }
165
+ return lines.join('\n');
166
+ }
167
+ //# sourceMappingURL=coverage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coverage.js","sourceRoot":"","sources":["../src/coverage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function startDashboard(cwd: string, port: number): void;
2
+ //# sourceMappingURL=dashboard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../src/dashboard.ts"],"names":[],"mappings":"AASA,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAgB9D"}