@x0rium/devkit-cli 0.7.0 → 0.10.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 (62) hide show
  1. package/dist/advance.d.ts.map +1 -1
  2. package/dist/advance.js +1 -8
  3. package/dist/advance.js.map +1 -1
  4. package/dist/brief.d.ts +14 -0
  5. package/dist/brief.d.ts.map +1 -0
  6. package/dist/brief.js +235 -0
  7. package/dist/brief.js.map +1 -0
  8. package/dist/coverage.d.ts.map +1 -1
  9. package/dist/coverage.js +26 -15
  10. package/dist/coverage.js.map +1 -1
  11. package/dist/dashboard.d.ts +1 -1
  12. package/dist/dashboard.d.ts.map +1 -1
  13. package/dist/dashboard.js +44 -31
  14. package/dist/dashboard.js.map +1 -1
  15. package/dist/diff.d.ts.map +1 -1
  16. package/dist/diff.js +36 -3
  17. package/dist/diff.js.map +1 -1
  18. package/dist/escalate.js +1 -1
  19. package/dist/escalate.js.map +1 -1
  20. package/dist/gate.d.ts.map +1 -1
  21. package/dist/gate.js +12 -11
  22. package/dist/gate.js.map +1 -1
  23. package/dist/impact.d.ts.map +1 -1
  24. package/dist/impact.js +2 -5
  25. package/dist/impact.js.map +1 -1
  26. package/dist/index.js +92 -9
  27. package/dist/index.js.map +1 -1
  28. package/dist/inject.d.ts +26 -0
  29. package/dist/inject.d.ts.map +1 -0
  30. package/dist/inject.js +161 -0
  31. package/dist/inject.js.map +1 -0
  32. package/dist/investigate.d.ts.map +1 -1
  33. package/dist/investigate.js +13 -19
  34. package/dist/investigate.js.map +1 -1
  35. package/dist/rfc.d.ts.map +1 -1
  36. package/dist/rfc.js +12 -14
  37. package/dist/rfc.js.map +1 -1
  38. package/dist/scaffold.js +2 -2
  39. package/dist/scaffold.js.map +1 -1
  40. package/dist/status.d.ts.map +1 -1
  41. package/dist/status.js +1 -8
  42. package/dist/status.js.map +1 -1
  43. package/dist/utils.d.ts +6 -0
  44. package/dist/utils.d.ts.map +1 -0
  45. package/dist/utils.js +45 -0
  46. package/dist/utils.js.map +1 -0
  47. package/package.json +2 -2
  48. package/skills/spec-kit/commands/speckit.analyze.md +201 -0
  49. package/skills/spec-kit/commands/speckit.checklist.md +304 -0
  50. package/skills/spec-kit/commands/speckit.clarify.md +199 -0
  51. package/skills/spec-kit/commands/speckit.implement.md +163 -0
  52. package/skills/spec-kit/commands/speckit.plan.md +119 -0
  53. package/skills/spec-kit/commands/speckit.specify.md +298 -0
  54. package/skills/spec-kit/commands/speckit.tasks.md +153 -0
  55. package/skills/spec-kit/hooks/analyze.coverage-pass.md +14 -0
  56. package/skills/spec-kit/hooks/checklist.invariant-category.md +7 -0
  57. package/skills/spec-kit/hooks/clarify.invariant-check.md +15 -0
  58. package/skills/spec-kit/hooks/implement.phase-guards.md +25 -0
  59. package/skills/spec-kit/hooks/plan.constitution-precheck.md +7 -0
  60. package/skills/spec-kit/hooks/plan.plan-postcheck.md +17 -0
  61. package/skills/spec-kit/hooks/specify.invariant-guard.md +37 -0
  62. package/skills/spec-kit/hooks/tasks.validate-checkpoints.md +13 -0
@@ -1 +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"}
1
+ {"version":3,"file":"advance.d.ts","sourceRoot":"","sources":["../src/advance.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAGzC,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"}
package/dist/advance.js CHANGED
@@ -1,13 +1,6 @@
1
1
  import { readFileSync, writeFileSync, existsSync } from 'node:fs';
2
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
- };
3
+ import { PHASE_ORDER, PHASE_LABELS } from './utils.js';
11
4
  export function advancePhase(cwd, currentPhase) {
12
5
  const statusPath = join(cwd, '.devkit', 'STATUS.md');
13
6
  if (!existsSync(statusPath)) {
@@ -1 +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"}
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;AAEjC,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AASvD,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,14 @@
1
+ export interface BriefResult {
2
+ generated: boolean;
3
+ outputPath: string;
4
+ content: string;
5
+ stats: {
6
+ techInvariants: number;
7
+ uxInvariants: number;
8
+ openItems: number;
9
+ totalLines: number;
10
+ };
11
+ error?: string;
12
+ }
13
+ export declare function generateBrief(cwd: string): BriefResult;
14
+ //# sourceMappingURL=brief.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brief.d.ts","sourceRoot":"","sources":["../src/brief.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,WAAW;IACxB,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE;QACH,cAAc,EAAE,MAAM,CAAC;QACvB,YAAY,EAAE,MAAM,CAAC;QACrB,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAqGD,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,CA8JtD"}
package/dist/brief.js ADDED
@@ -0,0 +1,235 @@
1
+ import { readFileSync, writeFileSync, existsSync, readdirSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { getStatus } from './status.js';
4
+ import { listRfcs } from './rfc.js';
5
+ import { listInvestigations } from './investigate.js';
6
+ import { PHASE_ORDER, PHASE_LABELS } from './utils.js';
7
+ function extractInvariantOneLiner(content, prefix) {
8
+ const entries = [];
9
+ const regex = new RegExp(`^## (${prefix}\\d+):\\s*(.+)`, 'gm');
10
+ let match;
11
+ while ((match = regex.exec(content)) !== null) {
12
+ const id = match[1];
13
+ // Try to get STATEMENT field first for a cleaner one-liner
14
+ const start = match.index;
15
+ const rest = content.slice(start);
16
+ const nextSection = rest.indexOf('\n## ', 3);
17
+ const section = nextSection > 0 ? rest.slice(0, nextSection) : rest;
18
+ const stmtMatch = section.match(/STATEMENT:\s*(.+)/);
19
+ const statement = stmtMatch ? stmtMatch[1].trim() : match[2].trim();
20
+ entries.push({ id, statement });
21
+ }
22
+ return entries;
23
+ }
24
+ function listEscalations(cwd) {
25
+ const escalationsDir = join(cwd, '.devkit', 'qa', 'escalations');
26
+ if (!existsSync(escalationsDir))
27
+ return [];
28
+ return readdirSync(escalationsDir)
29
+ .filter(f => f.startsWith('ESC-') && f.endsWith('.md'))
30
+ .sort()
31
+ .map(f => {
32
+ const content = readFileSync(join(escalationsDir, f), 'utf-8');
33
+ const titleMatch = content.match(/^# (.+)/m);
34
+ const statusMatch = content.match(/^STATUS:\s*(.+)/m);
35
+ return {
36
+ id: f.replace('.md', ''),
37
+ title: titleMatch?.[1] ?? f,
38
+ status: statusMatch?.[1]?.trim() ?? 'unknown',
39
+ };
40
+ });
41
+ }
42
+ function detectProjectStructure(cwd) {
43
+ const lines = [];
44
+ try {
45
+ const entries = readdirSync(cwd, { withFileTypes: true });
46
+ // Known DevKit dirs with descriptions
47
+ const descriptions = {
48
+ 'cli': 'CLI source (TypeScript)',
49
+ '.devkit': 'DevKit artifacts',
50
+ '.specify': 'spec-kit workspace',
51
+ '.agent': 'Agent Skills',
52
+ '.claude': 'Claude agent config',
53
+ '.gemini': 'Gemini agent config',
54
+ 'src': 'Source code',
55
+ 'tests': 'Tests',
56
+ 'docs': 'Documentation',
57
+ 'dist': 'Build output',
58
+ 'node_modules': 'Dependencies',
59
+ };
60
+ for (const entry of entries) {
61
+ if (!entry.isDirectory())
62
+ continue;
63
+ if (entry.name.startsWith('.git') && entry.name !== '.gitignore')
64
+ continue;
65
+ if (entry.name === 'node_modules')
66
+ continue;
67
+ if (entry.name === '.snapshots')
68
+ continue;
69
+ const desc = descriptions[entry.name];
70
+ if (desc) {
71
+ lines.push(` ${entry.name.padEnd(14)} — ${desc}`);
72
+ }
73
+ else {
74
+ lines.push(` ${entry.name}/`);
75
+ }
76
+ }
77
+ }
78
+ catch { /* ignore */ }
79
+ return lines;
80
+ }
81
+ function detectDevCommands(cwd) {
82
+ const lines = [];
83
+ const pkgPath = join(cwd, 'package.json');
84
+ if (existsSync(pkgPath)) {
85
+ try {
86
+ const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));
87
+ if (pkg.scripts) {
88
+ for (const [name, cmd] of Object.entries(pkg.scripts)) {
89
+ lines.push(` npm run ${name.padEnd(12)} — ${cmd}`);
90
+ }
91
+ }
92
+ }
93
+ catch { /* ignore */ }
94
+ }
95
+ return lines;
96
+ }
97
+ export function generateBrief(cwd) {
98
+ const devkitDir = join(cwd, '.devkit');
99
+ const outputPath = join(devkitDir, 'BRIEF.md');
100
+ if (!existsSync(devkitDir)) {
101
+ return {
102
+ generated: false,
103
+ outputPath,
104
+ content: '',
105
+ stats: { techInvariants: 0, uxInvariants: 0, openItems: 0, totalLines: 0 },
106
+ error: '.devkit/ not found. Run "devkit init" first.',
107
+ };
108
+ }
109
+ const lines = [];
110
+ const now = new Date().toISOString().split('T')[0];
111
+ // ── Header ──
112
+ lines.push('# Project Brief');
113
+ lines.push(`> Auto-generated by \`devkit brief\`. Last updated: ${now}`);
114
+ lines.push('> For details on any item, see the referenced file.');
115
+ lines.push('');
116
+ // ── Phase & Progress ──
117
+ const status = getStatus(cwd);
118
+ if (status) {
119
+ const phaseIdx = PHASE_ORDER.indexOf(status.phase) + 1;
120
+ lines.push(`## Phase: ${PHASE_LABELS[status.phase]} (${phaseIdx}/${PHASE_ORDER.length})`);
121
+ lines.push('');
122
+ for (const phase of PHASE_ORDER) {
123
+ const s = status.phaseProgress[phase];
124
+ const icon = s === 'done' ? '✅' : s === 'in_progress' ? '🔄' : '⬜';
125
+ const pointer = phase === status.phase ? ' ◀ current' : '';
126
+ lines.push(` ${icon} ${PHASE_LABELS[phase]}${pointer}`);
127
+ }
128
+ lines.push('');
129
+ }
130
+ // ── Invariants ──
131
+ const archInvariantsPath = join(devkitDir, 'arch', 'invariants.md');
132
+ const uxInvariantsPath = join(devkitDir, 'product', 'ux_invariants.md');
133
+ const techInvariants = existsSync(archInvariantsPath)
134
+ ? extractInvariantOneLiner(readFileSync(archInvariantsPath, 'utf-8'), 'I')
135
+ : [];
136
+ const uxInvariants = existsSync(uxInvariantsPath)
137
+ ? extractInvariantOneLiner(readFileSync(uxInvariantsPath, 'utf-8'), 'U')
138
+ : [];
139
+ if (techInvariants.length > 0 || uxInvariants.length > 0) {
140
+ lines.push('## Invariants');
141
+ lines.push('');
142
+ if (techInvariants.length > 0) {
143
+ lines.push('### Technical');
144
+ for (const inv of techInvariants) {
145
+ lines.push(` - ${inv.id}: ${inv.statement}`);
146
+ }
147
+ lines.push('');
148
+ }
149
+ if (uxInvariants.length > 0) {
150
+ lines.push('### UX');
151
+ for (const inv of uxInvariants) {
152
+ lines.push(` - ${inv.id}: ${inv.statement}`);
153
+ }
154
+ lines.push('');
155
+ }
156
+ }
157
+ // ── Open Items ──
158
+ const rfcs = listRfcs(cwd);
159
+ const investigations = listInvestigations(cwd);
160
+ const escalations = listEscalations(cwd);
161
+ const openRfcs = rfcs.filter(r => r.status === 'open');
162
+ const openInvs = investigations.filter(i => i.status === 'open');
163
+ const openEscs = escalations.filter(e => e.status === 'open');
164
+ const totalOpen = openRfcs.length + openInvs.length + openEscs.length;
165
+ if (totalOpen > 0) {
166
+ lines.push('## Open Items');
167
+ lines.push('');
168
+ for (const r of openRfcs) {
169
+ lines.push(` - 📋 ${r.id}: ${r.title.replace(/^RFC-\d+:\s*/, '')} → .devkit/arch/decisions/${r.id}.md`);
170
+ }
171
+ for (const i of openInvs) {
172
+ lines.push(` - 🔬 ${i.id}: ${i.title.replace(/^INV-\d+:\s*/, '')} → .devkit/arch/decisions/${i.id}.md`);
173
+ }
174
+ for (const e of openEscs) {
175
+ lines.push(` - 🚨 ${e.id}: ${e.title.replace(/^ESC-\d+:\s*/, '')} → .devkit/qa/escalations/${e.id}.md`);
176
+ }
177
+ lines.push('');
178
+ }
179
+ // ── Resolved Decisions (recent, max 5) ──
180
+ const resolvedRfcs = rfcs.filter(r => r.status === 'accepted').slice(-5);
181
+ const resolvedInvs = investigations.filter(i => i.status === 'resolved').slice(-5);
182
+ if (resolvedRfcs.length > 0 || resolvedInvs.length > 0) {
183
+ lines.push('## Recent Decisions');
184
+ lines.push('');
185
+ for (const r of resolvedRfcs) {
186
+ lines.push(` - ✅ ${r.id}: ${r.title.replace(/^RFC-\d+:\s*/, '')} [accepted]`);
187
+ }
188
+ for (const i of resolvedInvs) {
189
+ lines.push(` - ✅ ${i.id}: ${i.title.replace(/^INV-\d+:\s*/, '')} [resolved]`);
190
+ }
191
+ lines.push('');
192
+ }
193
+ // ── Project Structure ──
194
+ const structureLines = detectProjectStructure(cwd);
195
+ if (structureLines.length > 0) {
196
+ lines.push('## Project Structure');
197
+ lines.push('');
198
+ lines.push(...structureLines);
199
+ lines.push('');
200
+ }
201
+ // ── Dev Commands ──
202
+ const devCmdLines = detectDevCommands(cwd);
203
+ if (devCmdLines.length > 0) {
204
+ lines.push('## Dev Commands');
205
+ lines.push('');
206
+ lines.push(...devCmdLines);
207
+ lines.push('');
208
+ }
209
+ // ── DevKit Commands ──
210
+ lines.push('## DevKit Commands');
211
+ lines.push('');
212
+ lines.push(' devkit status — Current phase and progress');
213
+ lines.push(' devkit validate — Check artifact correctness');
214
+ lines.push(' devkit gate — Check phase transition');
215
+ lines.push(' devkit advance — Move to next phase');
216
+ lines.push(' devkit impact — Analyze change impact');
217
+ lines.push(' devkit coverage — Invariant test coverage');
218
+ lines.push(' devkit brief — Regenerate this file');
219
+ lines.push('');
220
+ const content = lines.join('\n');
221
+ // Write file
222
+ writeFileSync(outputPath, content, 'utf-8');
223
+ return {
224
+ generated: true,
225
+ outputPath,
226
+ content,
227
+ stats: {
228
+ techInvariants: techInvariants.length,
229
+ uxInvariants: uxInvariants.length,
230
+ openItems: totalOpen,
231
+ totalLines: lines.length,
232
+ },
233
+ };
234
+ }
235
+ //# sourceMappingURL=brief.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brief.js","sourceRoot":"","sources":["../src/brief.ts"],"names":[],"mappings":"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"}
@@ -1 +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"}
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;AAiGD,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,CAoD3D;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAoD7D"}
package/dist/coverage.js CHANGED
@@ -45,23 +45,28 @@ function findTestMentions(cwd, invariantId, invariantName) {
45
45
  mentions.push('qa/assumption_checks.md');
46
46
  }
47
47
  }
48
- // Search test files in project (common patterns)
48
+ // Search test files in project (common patterns) — recursive up to 3 levels
49
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;
50
+ function collectTestFiles(dir, relPrefix, depth) {
51
+ if (depth > 3)
52
+ return;
54
53
  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}`);
54
+ const entries = readdirSync(dir, { withFileTypes: true });
55
+ for (const entry of entries) {
56
+ const fullPath = join(dir, entry.name);
57
+ const relPath = relPrefix ? `${relPrefix}/${entry.name}` : entry.name;
58
+ if (entry.isDirectory()) {
59
+ collectTestFiles(fullPath, relPath, depth + 1);
60
+ }
61
+ else if (entry.name.endsWith('.test.ts') || entry.name.endsWith('.test.js') ||
62
+ entry.name.endsWith('.spec.ts') || entry.name.endsWith('.spec.js')) {
63
+ const content = readFileSync(fullPath, 'utf-8');
64
+ const keywords = invariantName.toLowerCase().split(/[\s\-_:]+/).filter(w => w.length > 3);
65
+ const hasId = content.includes(invariantId);
66
+ const hasKeywords = keywords.some(kw => content.toLowerCase().includes(kw));
67
+ if (hasId || hasKeywords) {
68
+ mentions.push(relPath);
69
+ }
65
70
  }
66
71
  }
67
72
  }
@@ -69,6 +74,12 @@ function findTestMentions(cwd, invariantId, invariantName) {
69
74
  // Skip unreadable dirs
70
75
  }
71
76
  }
77
+ for (const dir of testDirs) {
78
+ const testDir = join(cwd, dir);
79
+ if (!existsSync(testDir))
80
+ continue;
81
+ collectTestFiles(testDir, dir, 0);
82
+ }
72
83
  return [...new Set(mentions)]; // dedupe
73
84
  }
74
85
  export function analyzeCoverage(cwd) {
@@ -1 +1 @@
1
- {"version":3,"file":"coverage.js","sourceRoot":"","sources":["../src/coverage.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"coverage.js","sourceRoot":"","sources":["../src/coverage.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- export declare function startDashboard(cwd: string, port: number): void;
1
+ export declare function startDashboard(cwd: string, port: number, version: string): void;
2
2
  //# sourceMappingURL=dashboard.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../src/dashboard.ts"],"names":[],"mappings":"AAcA,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAgB9D"}
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,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAwB/E"}
package/dist/dashboard.js CHANGED
@@ -5,12 +5,8 @@ import { analyzeCoverage } from './coverage.js';
5
5
  import { listRfcs } from './rfc.js';
6
6
  import { listInvestigations } from './investigate.js';
7
7
  import { existsSync, readdirSync, readFileSync } from 'node:fs';
8
- import { join, dirname } from 'node:path';
9
- import { fileURLToPath } from 'node:url';
10
- const __dirname = dirname(fileURLToPath(import.meta.url));
11
- const pkg = JSON.parse(readFileSync(join(__dirname, '..', 'package.json'), 'utf-8'));
12
- const VERSION = pkg.version;
13
- export function startDashboard(cwd, port) {
8
+ import { join } from 'node:path';
9
+ export function startDashboard(cwd, port, version) {
14
10
  const server = createServer((req, res) => {
15
11
  if (req.url === '/api/data') {
16
12
  res.writeHead(200, { 'Content-Type': 'application/json' });
@@ -18,12 +14,19 @@ export function startDashboard(cwd, port) {
18
14
  return;
19
15
  }
20
16
  res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
21
- res.end(generateHtml());
17
+ res.end(generateHtml(version));
22
18
  });
23
19
  server.listen(port, () => {
24
20
  console.log(`\n🌐 Dashboard running at http://localhost:${port}\n`);
25
21
  console.log(` Press Ctrl+C to stop.\n`);
26
22
  });
23
+ function shutdown() {
24
+ console.log('\n Shutting down dashboard...');
25
+ server.close();
26
+ process.exit(0);
27
+ }
28
+ process.on('SIGINT', shutdown);
29
+ process.on('SIGTERM', shutdown);
27
30
  }
28
31
  function collectData(cwd) {
29
32
  const status = getStatus(cwd);
@@ -68,7 +71,7 @@ function collectData(cwd) {
68
71
  escalations,
69
72
  };
70
73
  }
71
- function generateHtml() {
74
+ function generateHtml(version) {
72
75
  return `<!DOCTYPE html>
73
76
  <html lang="en">
74
77
  <head>
@@ -267,7 +270,7 @@ function generateHtml() {
267
270
  <body>
268
271
  <div class="header">
269
272
  <h1>⬡ DevKit Dashboard</h1>
270
- <span class="version">v${VERSION}</span>
273
+ <span class="version">v${version}</span>
271
274
  <span class="refresh" id="refresh-time">Loading...</span>
272
275
  </div>
273
276
 
@@ -285,6 +288,16 @@ async function loadData() {
285
288
  render(data);
286
289
  }
287
290
 
291
+ function esc(str) {
292
+ if (str == null) return '';
293
+ return String(str)
294
+ .replace(/&/g, '&amp;')
295
+ .replace(/</g, '&lt;')
296
+ .replace(/>/g, '&gt;')
297
+ .replace(/"/g, '&quot;')
298
+ .replace(/'/g, '&#39;');
299
+ }
300
+
288
301
  function render(d) {
289
302
  const s = d.status;
290
303
  const phases = ['research', 'product', 'arch', 'spec', 'qa'];
@@ -301,46 +314,46 @@ function render(d) {
301
314
  }).join('<span class="phase-arrow">→</span>');
302
315
 
303
316
  // Coverage color
304
- const pct = d.coverage.percentage;
317
+ const pct = Number(d.coverage.percentage) || 0;
305
318
  const covColor = pct >= 80 ? 'var(--green)' : pct >= 50 ? 'var(--yellow)' : 'var(--red)';
306
319
 
307
320
  // Coverage entries
308
321
  const covHtml = d.coverage.entries.map(e => {
309
- const tests = e.coveredBy.length > 0 ? e.coveredBy.join(', ') : 'none';
310
- return '<div class="cov-entry ' + e.status + '">' +
322
+ const tests = e.coveredBy.length > 0 ? esc(e.coveredBy.join(', ')) : 'none';
323
+ return '<div class="cov-entry ' + esc(e.status) + '">' +
311
324
  '<span>' + (e.status === 'covered' ? '✅' : e.status === 'partial' ? '🟡' : '❌') + '</span>' +
312
- '<span>' + e.invariant + '</span>' +
325
+ '<span>' + esc(e.invariant) + '</span>' +
313
326
  '<span class="tests">' + tests + '</span></div>';
314
327
  }).join('') || '<div class="empty">No invariants found</div>';
315
328
 
316
329
  // RFCs
317
330
  const rfcHtml = d.rfcs.map(r => {
318
331
  const title = r.title.replace(r.id + ': ', '');
319
- return '<div class="item"><span class="item-id">' + r.id + '</span>' +
320
- '<span class="item-text">' + title + '</span>' +
321
- '<span class="item-status ' + r.status + '">' + r.status + '</span></div>';
332
+ return '<div class="item"><span class="item-id">' + esc(r.id) + '</span>' +
333
+ '<span class="item-text">' + esc(title) + '</span>' +
334
+ '<span class="item-status ' + esc(r.status) + '">' + esc(r.status) + '</span></div>';
322
335
  }).join('') || '<div class="empty">No RFCs created</div>';
323
336
 
324
337
  // Investigations
325
338
  const invHtml = d.investigations.map(i => {
326
339
  const title = i.title.replace(i.id + ': ', '');
327
- return '<div class="item"><span class="item-id">' + i.id + '</span>' +
328
- '<span class="item-text">' + title + '</span>' +
329
- '<span class="item-status ' + i.status + '">' + i.status + '</span></div>';
340
+ return '<div class="item"><span class="item-id">' + esc(i.id) + '</span>' +
341
+ '<span class="item-text">' + esc(title) + '</span>' +
342
+ '<span class="item-status ' + esc(i.status) + '">' + esc(i.status) + '</span></div>';
330
343
  }).join('') || '<div class="empty">No investigations</div>';
331
344
 
332
345
  // Escalations
333
346
  const escHtml = d.escalations.map(e =>
334
- '<div class="item"><span class="item-id">' + e.id + '</span>' +
335
- '<span class="flow-node ' + e.level + '">' + e.level + '</span>' +
336
- '<span class="item-status ' + e.status + '">' + e.status + '</span></div>'
347
+ '<div class="item"><span class="item-id">' + esc(e.id) + '</span>' +
348
+ '<span class="flow-node ' + esc(e.level) + '">' + esc(e.level) + '</span>' +
349
+ '<span class="item-status ' + esc(e.status) + '">' + esc(e.status) + '</span></div>'
337
350
  ).join('') || '<div class="empty">No escalations</div>';
338
351
 
339
352
  // Validation errors
340
353
  const errHtml = d.validation.errorList.map(e =>
341
- '<div class="error-item"><div class="error-file">' + e.file + ':' + e.line + '</div>' +
342
- '<div class="error-msg">' + e.message + '</div>' +
343
- '<div class="error-fix">Fix: ' + e.fix + '</div></div>'
354
+ '<div class="error-item"><div class="error-file">' + esc(e.file) + ':' + esc(e.line) + '</div>' +
355
+ '<div class="error-msg">' + esc(e.message) + '</div>' +
356
+ '<div class="error-fix">Fix: ' + esc(e.fix) + '</div></div>'
344
357
  ).join('') || '<div class="empty" style="color: var(--green);">✅ All artifacts valid</div>';
345
358
 
346
359
  document.getElementById('content').innerHTML =
@@ -349,19 +362,19 @@ function render(d) {
349
362
 
350
363
  // Row 2: Stats + Coverage + Validation
351
364
  '<div class="card"><div class="card-title">Overview</div><div class="stats">' +
352
- '<div><div class="stat-value green">' + d.coverage.covered + '</div><div class="stat-label">Covered</div></div>' +
353
- '<div><div class="stat-value yellow">' + d.coverage.partial + '</div><div class="stat-label">Partial</div></div>' +
354
- '<div><div class="stat-value red">' + d.coverage.uncovered + '</div><div class="stat-label">Uncovered</div></div>' +
365
+ '<div><div class="stat-value green">' + esc(d.coverage.covered) + '</div><div class="stat-label">Covered</div></div>' +
366
+ '<div><div class="stat-value yellow">' + esc(d.coverage.partial) + '</div><div class="stat-label">Partial</div></div>' +
367
+ '<div><div class="stat-value red">' + esc(d.coverage.uncovered) + '</div><div class="stat-label">Uncovered</div></div>' +
355
368
  '</div></div>' +
356
369
 
357
370
  '<div class="card"><div class="card-title">Coverage</div>' +
358
371
  '<div class="coverage-pct" style="color:' + covColor + '">' + pct + '%</div>' +
359
372
  '<div class="coverage-bar-container"><div class="coverage-bar"><div class="coverage-fill" style="width:' + pct + '%; background:' + covColor + '"></div></div></div>' +
360
- '<div class="stat-label">' + d.coverage.covered + ' of ' + d.coverage.total + ' invariants fully tested</div></div>' +
373
+ '<div class="stat-label">' + esc(d.coverage.covered) + ' of ' + esc(d.coverage.total) + ' invariants fully tested</div></div>' +
361
374
 
362
375
  '<div class="card"><div class="card-title">Validation</div>' +
363
- '<div class="stat-value ' + (d.validation.errors > 0 ? 'red' : 'green') + '">' + d.validation.errors + '</div>' +
364
- '<div class="stat-label">errors in ' + d.validation.total + ' artifacts</div></div>' +
376
+ '<div class="stat-value ' + (d.validation.errors > 0 ? 'red' : 'green') + '">' + esc(d.validation.errors) + '</div>' +
377
+ '<div class="stat-label">errors in ' + esc(d.validation.total) + ' artifacts</div></div>' +
365
378
 
366
379
  // Row 3: Coverage + Errors
367
380
  '<div class="card wide"><div class="card-title">Invariant Coverage Map</div><div class="items">' + covHtml + '</div></div>' +
@@ -1 +1 @@
1
- {"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../src/dashboard.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../src/dashboard.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../src/diff.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,QAAQ;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,UAAU;IACvB,IAAI,EAAE,QAAQ,CAAC;IACf,EAAE,EAAE,QAAQ,CAAC;IACb,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,EAAE;QACH,eAAe,EAAE,MAAM,CAAC;QACxB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,aAAa,EAAE,MAAM,CAAC;KACzB,CAAC;CACL;AAoCD,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,CA0BlD;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAUpE;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAInD;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,QAAQ,CAGpE;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,GAAG,UAAU,CAuBtE;AAQD,wBAAgB,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAgDrD"}
1
+ {"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../src/diff.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,QAAQ;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,UAAU;IACvB,IAAI,EAAE,QAAQ,CAAC;IACf,EAAE,EAAE,QAAQ,CAAC;IACb,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,EAAE;QACH,eAAe,EAAE,MAAM,CAAC;QACxB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,aAAa,EAAE,MAAM,CAAC;KACzB,CAAC;CACL;AAoCD,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,CA0BlD;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAUpE;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAInD;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,QAAQ,CA0CpE;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,GAAG,UAAU,CAuBtE;AAQD,wBAAgB,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAgDrD"}