@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.
- package/dist/advance.d.ts.map +1 -1
- package/dist/advance.js +1 -8
- package/dist/advance.js.map +1 -1
- package/dist/brief.d.ts +14 -0
- package/dist/brief.d.ts.map +1 -0
- package/dist/brief.js +235 -0
- package/dist/brief.js.map +1 -0
- package/dist/coverage.d.ts.map +1 -1
- package/dist/coverage.js +26 -15
- package/dist/coverage.js.map +1 -1
- package/dist/dashboard.d.ts +1 -1
- package/dist/dashboard.d.ts.map +1 -1
- package/dist/dashboard.js +44 -31
- package/dist/dashboard.js.map +1 -1
- package/dist/diff.d.ts.map +1 -1
- package/dist/diff.js +36 -3
- package/dist/diff.js.map +1 -1
- package/dist/escalate.js +1 -1
- package/dist/escalate.js.map +1 -1
- package/dist/gate.d.ts.map +1 -1
- package/dist/gate.js +12 -11
- package/dist/gate.js.map +1 -1
- package/dist/impact.d.ts.map +1 -1
- package/dist/impact.js +2 -5
- package/dist/impact.js.map +1 -1
- package/dist/index.js +92 -9
- package/dist/index.js.map +1 -1
- package/dist/inject.d.ts +26 -0
- package/dist/inject.d.ts.map +1 -0
- package/dist/inject.js +161 -0
- package/dist/inject.js.map +1 -0
- package/dist/investigate.d.ts.map +1 -1
- package/dist/investigate.js +13 -19
- package/dist/investigate.js.map +1 -1
- package/dist/rfc.d.ts.map +1 -1
- package/dist/rfc.js +12 -14
- package/dist/rfc.js.map +1 -1
- package/dist/scaffold.js +2 -2
- package/dist/scaffold.js.map +1 -1
- package/dist/status.d.ts.map +1 -1
- package/dist/status.js +1 -8
- package/dist/status.js.map +1 -1
- package/dist/utils.d.ts +6 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +45 -0
- package/dist/utils.js.map +1 -0
- package/package.json +2 -2
- package/skills/spec-kit/commands/speckit.analyze.md +201 -0
- package/skills/spec-kit/commands/speckit.checklist.md +304 -0
- package/skills/spec-kit/commands/speckit.clarify.md +199 -0
- package/skills/spec-kit/commands/speckit.implement.md +163 -0
- package/skills/spec-kit/commands/speckit.plan.md +119 -0
- package/skills/spec-kit/commands/speckit.specify.md +298 -0
- package/skills/spec-kit/commands/speckit.tasks.md +153 -0
- package/skills/spec-kit/hooks/analyze.coverage-pass.md +14 -0
- package/skills/spec-kit/hooks/checklist.invariant-category.md +7 -0
- package/skills/spec-kit/hooks/clarify.invariant-check.md +15 -0
- package/skills/spec-kit/hooks/implement.phase-guards.md +25 -0
- package/skills/spec-kit/hooks/plan.constitution-precheck.md +7 -0
- package/skills/spec-kit/hooks/plan.plan-postcheck.md +17 -0
- package/skills/spec-kit/hooks/specify.invariant-guard.md +37 -0
- package/skills/spec-kit/hooks/tasks.validate-checkpoints.md +13 -0
package/dist/inject.js
ADDED
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';
|
|
2
|
+
import { join, dirname } from 'node:path';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
const MARKER_START = (hookName) => `<!-- DEVKIT:START:${hookName} -->`;
|
|
5
|
+
const MARKER_END = (hookName) => `<!-- DEVKIT:END:${hookName} -->`;
|
|
6
|
+
/**
|
|
7
|
+
* Command → hook mappings.
|
|
8
|
+
* Each entry: [commandBaseName, hookName, hookFragmentFile]
|
|
9
|
+
*/
|
|
10
|
+
const HOOK_MAP = [
|
|
11
|
+
['speckit.specify', 'invariant-guard'],
|
|
12
|
+
['speckit.clarify', 'invariant-check'],
|
|
13
|
+
['speckit.plan', 'constitution-precheck'],
|
|
14
|
+
['speckit.plan', 'plan-postcheck'],
|
|
15
|
+
['speckit.tasks', 'validate-checkpoints'],
|
|
16
|
+
['speckit.implement', 'phase-guards'],
|
|
17
|
+
['speckit.analyze', 'coverage-pass'],
|
|
18
|
+
['speckit.checklist', 'invariant-category'],
|
|
19
|
+
];
|
|
20
|
+
/** All unique command names that have hooks */
|
|
21
|
+
const COMMAND_NAMES = [...new Set(HOOK_MAP.map(([cmd]) => cmd))];
|
|
22
|
+
function getSpecKitDir() {
|
|
23
|
+
const thisFile = fileURLToPath(import.meta.url);
|
|
24
|
+
const distDir = dirname(thisFile); // cli/dist/
|
|
25
|
+
const cliRoot = dirname(distDir); // cli/
|
|
26
|
+
const specKitDir = join(cliRoot, 'skills', 'spec-kit');
|
|
27
|
+
if (existsSync(specKitDir))
|
|
28
|
+
return specKitDir;
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
function getBundledCommandPath(specKitDir, commandName) {
|
|
32
|
+
return join(specKitDir, 'commands', `${commandName}.md`);
|
|
33
|
+
}
|
|
34
|
+
function getHookFragmentPath(specKitDir, commandName, hookName) {
|
|
35
|
+
// Hook files follow: {commandBaseName}.{hookName}.md
|
|
36
|
+
// e.g. specify.invariant-guard.md (strip 'speckit.' prefix)
|
|
37
|
+
const baseName = commandName.replace('speckit.', '');
|
|
38
|
+
return join(specKitDir, 'hooks', `${baseName}.${hookName}.md`);
|
|
39
|
+
}
|
|
40
|
+
function getTargetCommandPath(cwd, commandName) {
|
|
41
|
+
return join(cwd, '.claude', 'commands', `${commandName}.md`);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Extract content between DEVKIT markers in a file.
|
|
45
|
+
* Returns null if markers not found.
|
|
46
|
+
*/
|
|
47
|
+
function extractMarkerContent(content, hookName) {
|
|
48
|
+
const startMarker = MARKER_START(hookName);
|
|
49
|
+
const endMarker = MARKER_END(hookName);
|
|
50
|
+
const startIdx = content.indexOf(startMarker);
|
|
51
|
+
const endIdx = content.indexOf(endMarker);
|
|
52
|
+
if (startIdx === -1 || endIdx === -1 || endIdx <= startIdx)
|
|
53
|
+
return null;
|
|
54
|
+
const afterStart = startIdx + startMarker.length;
|
|
55
|
+
return content.substring(afterStart, endIdx);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Replace content between DEVKIT markers, or return null if markers not found.
|
|
59
|
+
*/
|
|
60
|
+
function replaceMarkerContent(content, hookName, newInnerContent) {
|
|
61
|
+
const startMarker = MARKER_START(hookName);
|
|
62
|
+
const endMarker = MARKER_END(hookName);
|
|
63
|
+
const startIdx = content.indexOf(startMarker);
|
|
64
|
+
const endIdx = content.indexOf(endMarker);
|
|
65
|
+
if (startIdx === -1 || endIdx === -1 || endIdx <= startIdx)
|
|
66
|
+
return null;
|
|
67
|
+
const before = content.substring(0, startIdx + startMarker.length);
|
|
68
|
+
const after = content.substring(endIdx);
|
|
69
|
+
return before + newInnerContent + after;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Inject DevKit hooks into speckit commands in .claude/commands/.
|
|
73
|
+
*
|
|
74
|
+
* For each of 7 commands:
|
|
75
|
+
* 1. No file exists → copy from bundle → "created"
|
|
76
|
+
* 2. File exists + no markers → copy from bundle (overwrite with enhanced version) → "injected"
|
|
77
|
+
* 3. File exists + markers + content matches → "skipped"
|
|
78
|
+
* 4. File exists + markers + content differs → replace between markers → "injected"
|
|
79
|
+
*/
|
|
80
|
+
export function injectDevkitHooks(cwd, opts) {
|
|
81
|
+
const result = {
|
|
82
|
+
injected: [],
|
|
83
|
+
created: [],
|
|
84
|
+
skipped: [],
|
|
85
|
+
errors: [],
|
|
86
|
+
};
|
|
87
|
+
const specKitDir = getSpecKitDir();
|
|
88
|
+
if (!specKitDir) {
|
|
89
|
+
result.errors.push('Could not locate cli/skills/spec-kit/ directory');
|
|
90
|
+
return result;
|
|
91
|
+
}
|
|
92
|
+
// Ensure .claude/commands/ exists
|
|
93
|
+
const commandsDir = join(cwd, '.claude', 'commands');
|
|
94
|
+
mkdirSync(commandsDir, { recursive: true });
|
|
95
|
+
// Process each command
|
|
96
|
+
for (const commandName of COMMAND_NAMES) {
|
|
97
|
+
const targetPath = getTargetCommandPath(cwd, commandName);
|
|
98
|
+
const bundledPath = getBundledCommandPath(specKitDir, commandName);
|
|
99
|
+
if (!existsSync(bundledPath)) {
|
|
100
|
+
result.errors.push(`Bundled command not found: ${commandName}`);
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
const bundledContent = readFileSync(bundledPath, 'utf-8');
|
|
104
|
+
// Case 1: Target file doesn't exist → copy from bundle
|
|
105
|
+
if (!existsSync(targetPath)) {
|
|
106
|
+
writeFileSync(targetPath, bundledContent, 'utf-8');
|
|
107
|
+
result.created.push(commandName);
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
// File exists — check each hook for this command
|
|
111
|
+
let currentContent = readFileSync(targetPath, 'utf-8');
|
|
112
|
+
const hooksForCommand = HOOK_MAP.filter(([cmd]) => cmd === commandName);
|
|
113
|
+
let commandModified = false;
|
|
114
|
+
let allHooksCurrent = true;
|
|
115
|
+
for (const [, hookName] of hooksForCommand) {
|
|
116
|
+
const existingHookContent = extractMarkerContent(currentContent, hookName);
|
|
117
|
+
const bundledHookContent = extractMarkerContent(bundledContent, hookName);
|
|
118
|
+
if (bundledHookContent === null) {
|
|
119
|
+
// No hook in bundle — shouldn't happen but skip
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
if (existingHookContent === null) {
|
|
123
|
+
// No markers in target — need to copy the full bundled version
|
|
124
|
+
// This replaces the entire file with the enhanced version
|
|
125
|
+
if (opts?.force || !commandModified) {
|
|
126
|
+
currentContent = bundledContent;
|
|
127
|
+
commandModified = true;
|
|
128
|
+
allHooksCurrent = false;
|
|
129
|
+
}
|
|
130
|
+
break; // No point checking other hooks since we're replacing the whole file
|
|
131
|
+
}
|
|
132
|
+
// Markers exist — compare content
|
|
133
|
+
if (existingHookContent.trim() === bundledHookContent.trim() && !opts?.force) {
|
|
134
|
+
// Content matches — skip this hook
|
|
135
|
+
continue;
|
|
136
|
+
}
|
|
137
|
+
// Content differs or force mode — replace between markers
|
|
138
|
+
const updated = replaceMarkerContent(currentContent, hookName, bundledHookContent);
|
|
139
|
+
if (updated) {
|
|
140
|
+
currentContent = updated;
|
|
141
|
+
commandModified = true;
|
|
142
|
+
allHooksCurrent = false;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
if (commandModified) {
|
|
146
|
+
writeFileSync(targetPath, currentContent, 'utf-8');
|
|
147
|
+
result.injected.push(commandName);
|
|
148
|
+
}
|
|
149
|
+
else if (allHooksCurrent) {
|
|
150
|
+
result.skipped.push(commandName);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
return result;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Get the list of hook fragment files available.
|
|
157
|
+
*/
|
|
158
|
+
export function listHookFragments() {
|
|
159
|
+
return HOOK_MAP.map(([cmd, hook]) => ({ command: cmd, hook }));
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=inject.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inject.js","sourceRoot":"","sources":["../src/inject.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"investigate.d.ts","sourceRoot":"","sources":["../src/investigate.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"investigate.d.ts","sourceRoot":"","sources":["../src/investigate.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,mBAAmB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AA4DD,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,mBAAmB,CAmGzF;AAED,wBAAgB,kBAAkB,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,CAmB7G;AAED,wBAAgB,oBAAoB,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,CAmCzI"}
|
package/dist/investigate.js
CHANGED
|
@@ -1,18 +1,6 @@
|
|
|
1
1
|
import { readFileSync, writeFileSync, existsSync, readdirSync, mkdirSync } from 'node:fs';
|
|
2
|
-
import { join } from 'node:path';
|
|
3
|
-
|
|
4
|
-
if (!existsSync(dir))
|
|
5
|
-
return `${prefix}001`;
|
|
6
|
-
const files = readdirSync(dir)
|
|
7
|
-
.filter(f => f.startsWith(prefix) && f.endsWith('.md'));
|
|
8
|
-
let maxNum = 0;
|
|
9
|
-
for (const f of files) {
|
|
10
|
-
const m = f.match(new RegExp(`${prefix}(\\d+)`));
|
|
11
|
-
if (m)
|
|
12
|
-
maxNum = Math.max(maxNum, parseInt(m[1], 10));
|
|
13
|
-
}
|
|
14
|
-
return `${prefix}${(maxNum + 1).toString().padStart(3, '0')}`;
|
|
15
|
-
}
|
|
2
|
+
import { join, resolve } from 'node:path';
|
|
3
|
+
import { getNextId, extractKeywords } from './utils.js';
|
|
16
4
|
function findBrokenAssumption(cwd, keywords) {
|
|
17
5
|
const decisionsDir = join(cwd, '.devkit', 'arch', 'decisions');
|
|
18
6
|
if (!existsSync(decisionsDir))
|
|
@@ -71,11 +59,7 @@ export function createInvestigation(cwd, description) {
|
|
|
71
59
|
}
|
|
72
60
|
mkdirSync(decisionsDir, { recursive: true });
|
|
73
61
|
// Extract keywords
|
|
74
|
-
const keywords = description
|
|
75
|
-
.toLowerCase()
|
|
76
|
-
.split(/[\s,;]+/)
|
|
77
|
-
.filter(w => w.length > 2)
|
|
78
|
-
.filter(w => !['the', 'and', 'for', 'with', 'from', 'that', 'this', 'into', 'bug', 'found', 'does', 'not'].includes(w));
|
|
62
|
+
const keywords = extractKeywords(description);
|
|
79
63
|
// Try to find broken assumption in ADRs
|
|
80
64
|
const broken = findBrokenAssumption(cwd, keywords);
|
|
81
65
|
// Find invariants at risk
|
|
@@ -172,8 +156,18 @@ export function listInvestigations(cwd) {
|
|
|
172
156
|
});
|
|
173
157
|
}
|
|
174
158
|
export function resolveInvestigation(cwd, invId, option, rationale) {
|
|
159
|
+
// Validate ID: only alphanumeric characters and hyphens allowed
|
|
160
|
+
if (!/^[A-Za-z0-9-]+$/.test(invId)) {
|
|
161
|
+
return { resolved: false, error: `Invalid Investigation ID "${invId}": only alphanumeric characters and hyphens are allowed.` };
|
|
162
|
+
}
|
|
175
163
|
const decisionsDir = join(cwd, '.devkit', 'arch', 'decisions');
|
|
176
164
|
const filePath = join(decisionsDir, `${invId}.md`);
|
|
165
|
+
// Verify resolved path stays within decisionsDir (defense-in-depth)
|
|
166
|
+
const resolvedDecisionsDir = resolve(decisionsDir);
|
|
167
|
+
const resolvedFilePath = resolve(filePath);
|
|
168
|
+
if (!resolvedFilePath.startsWith(resolvedDecisionsDir + '/')) {
|
|
169
|
+
return { resolved: false, error: `Invalid Investigation ID "${invId}": path traversal detected.` };
|
|
170
|
+
}
|
|
177
171
|
if (!existsSync(filePath)) {
|
|
178
172
|
return { resolved: false, error: `${invId}.md not found in .devkit/arch/decisions/` };
|
|
179
173
|
}
|
package/dist/investigate.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"investigate.js","sourceRoot":"","sources":["../src/investigate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAC1F,OAAO,EAAE,IAAI,EAAE,
|
|
1
|
+
{"version":3,"file":"investigate.js","sourceRoot":"","sources":["../src/investigate.ts"],"names":[],"mappings":"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"}
|
package/dist/rfc.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rfc.d.ts","sourceRoot":"","sources":["../src/rfc.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"rfc.d.ts","sourceRoot":"","sources":["../src/rfc.ts"],"names":[],"mappings":"AAKA,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;AAED,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,CAmC/H"}
|
package/dist/rfc.js
CHANGED
|
@@ -1,19 +1,7 @@
|
|
|
1
1
|
import { readFileSync, writeFileSync, existsSync, readdirSync, mkdirSync } from 'node:fs';
|
|
2
|
-
import { join } from 'node:path';
|
|
2
|
+
import { join, resolve } from 'node:path';
|
|
3
3
|
import { analyzeImpact } from './impact.js';
|
|
4
|
-
|
|
5
|
-
if (!existsSync(dir))
|
|
6
|
-
return `${prefix}001`;
|
|
7
|
-
const files = readdirSync(dir)
|
|
8
|
-
.filter(f => f.startsWith(prefix) && f.endsWith('.md'));
|
|
9
|
-
let maxNum = 0;
|
|
10
|
-
for (const f of files) {
|
|
11
|
-
const m = f.match(new RegExp(`${prefix}(\\d+)`));
|
|
12
|
-
if (m)
|
|
13
|
-
maxNum = Math.max(maxNum, parseInt(m[1], 10));
|
|
14
|
-
}
|
|
15
|
-
return `${prefix}${(maxNum + 1).toString().padStart(3, '0')}`;
|
|
16
|
-
}
|
|
4
|
+
import { getNextId } from './utils.js';
|
|
17
5
|
export function createRfc(cwd, description) {
|
|
18
6
|
const devkitDir = join(cwd, '.devkit');
|
|
19
7
|
const decisionsDir = join(devkitDir, 'arch', 'decisions');
|
|
@@ -124,8 +112,18 @@ export function listRfcs(cwd) {
|
|
|
124
112
|
});
|
|
125
113
|
}
|
|
126
114
|
export function resolveRfc(cwd, rfcId, option, rationale) {
|
|
115
|
+
// Validate ID: only alphanumeric characters and hyphens allowed
|
|
116
|
+
if (!/^[A-Za-z0-9-]+$/.test(rfcId)) {
|
|
117
|
+
return { resolved: false, error: `Invalid RFC ID "${rfcId}": only alphanumeric characters and hyphens are allowed.` };
|
|
118
|
+
}
|
|
127
119
|
const decisionsDir = join(cwd, '.devkit', 'arch', 'decisions');
|
|
128
120
|
const filePath = join(decisionsDir, `${rfcId}.md`);
|
|
121
|
+
// Verify resolved path stays within decisionsDir (defense-in-depth)
|
|
122
|
+
const resolvedDecisionsDir = resolve(decisionsDir);
|
|
123
|
+
const resolvedFilePath = resolve(filePath);
|
|
124
|
+
if (!resolvedFilePath.startsWith(resolvedDecisionsDir + '/')) {
|
|
125
|
+
return { resolved: false, error: `Invalid RFC ID "${rfcId}": path traversal detected.` };
|
|
126
|
+
}
|
|
129
127
|
if (!existsSync(filePath)) {
|
|
130
128
|
return { resolved: false, error: `${rfcId}.md not found in .devkit/arch/decisions/` };
|
|
131
129
|
}
|
package/dist/rfc.js.map
CHANGED
|
@@ -1 +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;
|
|
1
|
+
{"version":3,"file":"rfc.js","sourceRoot":"","sources":["../src/rfc.ts"],"names":[],"mappings":"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"}
|
package/dist/scaffold.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { mkdirSync, writeFileSync, existsSync, cpSync } from 'node:fs';
|
|
2
2
|
import { join, dirname } from 'node:path';
|
|
3
3
|
import { fileURLToPath } from 'node:url';
|
|
4
|
-
import {
|
|
4
|
+
import { execFileSync } from 'node:child_process';
|
|
5
5
|
const STATUS_TEMPLATE = `# DevKit Status
|
|
6
6
|
|
|
7
7
|
MODE: {mode}
|
|
@@ -91,7 +91,7 @@ export function scaffoldDevkit(cwd, mode) {
|
|
|
91
91
|
// Check for spec-kit
|
|
92
92
|
const specKitFound = existsSync(join(cwd, '.specify')) ||
|
|
93
93
|
(() => { try {
|
|
94
|
-
|
|
94
|
+
execFileSync('which', ['specify'], { stdio: 'ignore' });
|
|
95
95
|
return true;
|
|
96
96
|
}
|
|
97
97
|
catch {
|
package/dist/scaffold.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,EAAe,MAAM,SAAS,CAAC;AACpF,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"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"}
|
package/dist/status.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../src/status.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../src/status.ts"],"names":[],"mappings":"AAIA,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;AAU7D,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;AAgBD,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CA8D1D;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CA4BzD"}
|
package/dist/status.js
CHANGED
|
@@ -1,13 +1,6 @@
|
|
|
1
1
|
import { readFileSync, existsSync, readdirSync } from 'node:fs';
|
|
2
2
|
import { join } from 'node:path';
|
|
3
|
-
|
|
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
|
const PHASE_NEXT_STEP = {
|
|
12
5
|
research: 'Define your idea. Run /research-kit or create artifacts in .devkit/research/',
|
|
13
6
|
product: 'Define users and UX invariants. Run /product-kit or create artifacts in .devkit/product/',
|
package/dist/status.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.js","sourceRoot":"","sources":["../src/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../src/status.ts"],"names":[],"mappings":"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"}
|
package/dist/utils.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { Phase } from './status.js';
|
|
2
|
+
export declare const PHASE_ORDER: Phase[];
|
|
3
|
+
export declare const PHASE_LABELS: Record<Phase | 'production', string>;
|
|
4
|
+
export declare function getNextId(dir: string, prefix: string): string;
|
|
5
|
+
export declare function extractKeywords(description: string): string[];
|
|
6
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAMzC,eAAO,MAAM,WAAW,EAAE,KAAK,EAAkD,CAAC;AAElF,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,KAAK,GAAG,YAAY,EAAE,MAAM,CAO7D,CAAC;AAMF,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAa7D;AAYD,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,CAM7D"}
|
package/dist/utils.js
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { existsSync, readdirSync } from 'node:fs';
|
|
2
|
+
// ──────────────────────── Phase Constants ────────────────────────
|
|
3
|
+
// Single source of truth for phase ordering and labels.
|
|
4
|
+
// Previously duplicated in status.ts, advance.ts, gate.ts, index.ts.
|
|
5
|
+
export const PHASE_ORDER = ['research', 'product', 'arch', 'spec', 'qa'];
|
|
6
|
+
export const PHASE_LABELS = {
|
|
7
|
+
research: 'ResearchKit',
|
|
8
|
+
product: 'ProductKit',
|
|
9
|
+
arch: 'ArchKit',
|
|
10
|
+
spec: 'SpecKit',
|
|
11
|
+
qa: 'QAKit',
|
|
12
|
+
production: 'Production',
|
|
13
|
+
};
|
|
14
|
+
// ──────────────────────── ID Generation ────────────────────────
|
|
15
|
+
// Shared ID generator using max-scan pattern.
|
|
16
|
+
// Previously duplicated in rfc.ts and investigate.ts.
|
|
17
|
+
export function getNextId(dir, prefix) {
|
|
18
|
+
if (!existsSync(dir))
|
|
19
|
+
return `${prefix}001`;
|
|
20
|
+
const files = readdirSync(dir)
|
|
21
|
+
.filter(f => f.startsWith(prefix) && f.endsWith('.md'));
|
|
22
|
+
let maxNum = 0;
|
|
23
|
+
for (const f of files) {
|
|
24
|
+
const m = f.match(new RegExp(`${prefix}(\\d+)`));
|
|
25
|
+
if (m)
|
|
26
|
+
maxNum = Math.max(maxNum, parseInt(m[1], 10));
|
|
27
|
+
}
|
|
28
|
+
return `${prefix}${(maxNum + 1).toString().padStart(3, '0')}`;
|
|
29
|
+
}
|
|
30
|
+
// ──────────────────────── Keyword Extraction ────────────────────────
|
|
31
|
+
// Shared keyword extractor for impact analysis and investigations.
|
|
32
|
+
// Unified stop-word list — previously inconsistent across files.
|
|
33
|
+
const STOP_WORDS = new Set([
|
|
34
|
+
'the', 'and', 'for', 'with', 'from', 'that', 'this', 'into',
|
|
35
|
+
'add', 'new', 'use', 'bug', 'found', 'does', 'not', 'has',
|
|
36
|
+
'was', 'are', 'but', 'can', 'all', 'will', 'our', 'any',
|
|
37
|
+
]);
|
|
38
|
+
export function extractKeywords(description) {
|
|
39
|
+
return description
|
|
40
|
+
.toLowerCase()
|
|
41
|
+
.split(/[\s,;]+/)
|
|
42
|
+
.filter(w => w.length > 2)
|
|
43
|
+
.filter(w => !STOP_WORDS.has(w));
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAGlD,oEAAoE;AACpE,wDAAwD;AACxD,qEAAqE;AAErE,MAAM,CAAC,MAAM,WAAW,GAAY,CAAC,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;AAElF,MAAM,CAAC,MAAM,YAAY,GAAyC;IAC9D,QAAQ,EAAE,aAAa;IACvB,OAAO,EAAE,YAAY;IACrB,IAAI,EAAE,SAAS;IACf,IAAI,EAAE,SAAS;IACf,EAAE,EAAE,OAAO;IACX,UAAU,EAAE,YAAY;CAC3B,CAAC;AAEF,kEAAkE;AAClE,8CAA8C;AAC9C,sDAAsD;AAEtD,MAAM,UAAU,SAAS,CAAC,GAAW,EAAE,MAAc;IACjD,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,CAAC;IAE5D,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACpB,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,GAAG,MAAM,QAAQ,CAAC,CAAC,CAAC;QACjD,IAAI,CAAC;YAAE,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IAC1D,CAAC;IAED,OAAO,GAAG,MAAM,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;AAClE,CAAC;AAED,uEAAuE;AACvE,mEAAmE;AACnE,iEAAiE;AAEjE,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC;IACvB,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAC3D,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK;IACzD,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK;CAC1D,CAAC,CAAC;AAEH,MAAM,UAAU,eAAe,CAAC,WAAmB;IAC/C,OAAO,WAAW;SACb,WAAW,EAAE;SACb,KAAK,CAAC,SAAS,CAAC;SAChB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;SACzB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AACzC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@x0rium/devkit-cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.10.0",
|
|
4
4
|
"description": "CLI for DevKit — AI-Native Development Methodology",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"files": [
|
|
@@ -43,4 +43,4 @@
|
|
|
43
43
|
"typescript": "^5.7.0",
|
|
44
44
|
"vitest": "^3.0.0"
|
|
45
45
|
}
|
|
46
|
-
}
|
|
46
|
+
}
|