@specsafe/cli 0.8.0 → 2.0.3
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/README.md +100 -279
- package/canonical/personas/bolt-zane.md +29 -0
- package/canonical/personas/forge-reva.md +29 -0
- package/canonical/personas/herald-cass.md +30 -0
- package/canonical/personas/mason-kai.md +30 -0
- package/canonical/personas/scout-elena.md +27 -0
- package/canonical/personas/warden-lyra.md +30 -0
- package/canonical/rules/.cursorrules.mdc +53 -0
- package/canonical/rules/.rules +48 -0
- package/canonical/rules/AGENTS.md +48 -0
- package/canonical/rules/CLAUDE.md +48 -0
- package/canonical/rules/CONVENTIONS.md +41 -0
- package/canonical/rules/GEMINI.md +50 -0
- package/canonical/rules/continue-config.yaml +5 -0
- package/canonical/skills/specsafe-archive/SKILL.md +63 -0
- package/canonical/skills/specsafe-code/SKILL.md +7 -0
- package/canonical/skills/specsafe-code/workflow.md +212 -0
- package/canonical/skills/specsafe-complete/SKILL.md +7 -0
- package/canonical/skills/specsafe-complete/workflow.md +130 -0
- package/canonical/skills/specsafe-doctor/SKILL.md +103 -0
- package/canonical/skills/specsafe-explore/SKILL.md +7 -0
- package/canonical/skills/specsafe-explore/workflow.md +100 -0
- package/canonical/skills/specsafe-init/SKILL.md +119 -0
- package/canonical/skills/specsafe-new/SKILL.md +7 -0
- package/canonical/skills/specsafe-new/workflow.md +156 -0
- package/canonical/skills/specsafe-qa/SKILL.md +7 -0
- package/canonical/skills/specsafe-qa/workflow.md +223 -0
- package/canonical/skills/specsafe-spec/SKILL.md +7 -0
- package/canonical/skills/specsafe-spec/workflow.md +158 -0
- package/canonical/skills/specsafe-status/SKILL.md +77 -0
- package/canonical/skills/specsafe-test/SKILL.md +7 -0
- package/canonical/skills/specsafe-test/workflow.md +210 -0
- package/canonical/skills/specsafe-verify/SKILL.md +7 -0
- package/canonical/skills/specsafe-verify/workflow.md +143 -0
- package/canonical/templates/project-state-template.md +33 -0
- package/canonical/templates/qa-report-template.md +55 -0
- package/canonical/templates/spec-template.md +52 -0
- package/canonical/templates/specsafe-config-template.json +10 -0
- package/generators/dist/adapters/aider.d.ts +2 -0
- package/generators/dist/adapters/aider.js +23 -0
- package/generators/dist/adapters/aider.js.map +1 -0
- package/generators/dist/adapters/antigravity.d.ts +2 -0
- package/generators/dist/adapters/antigravity.js +33 -0
- package/generators/dist/adapters/antigravity.js.map +1 -0
- package/generators/dist/adapters/claude-code.d.ts +2 -0
- package/generators/dist/adapters/claude-code.js +31 -0
- package/generators/dist/adapters/claude-code.js.map +1 -0
- package/generators/dist/adapters/continue.d.ts +2 -0
- package/generators/dist/adapters/continue.js +33 -0
- package/generators/dist/adapters/continue.js.map +1 -0
- package/generators/dist/adapters/cursor.d.ts +2 -0
- package/generators/dist/adapters/cursor.js +32 -0
- package/generators/dist/adapters/cursor.js.map +1 -0
- package/generators/dist/adapters/gemini.d.ts +2 -0
- package/generators/dist/adapters/gemini.js +36 -0
- package/generators/dist/adapters/gemini.js.map +1 -0
- package/generators/dist/adapters/index.d.ts +13 -0
- package/generators/dist/adapters/index.js +29 -0
- package/generators/dist/adapters/index.js.map +1 -0
- package/generators/dist/adapters/opencode.d.ts +2 -0
- package/generators/dist/adapters/opencode.js +32 -0
- package/generators/dist/adapters/opencode.js.map +1 -0
- package/generators/dist/adapters/types.d.ts +49 -0
- package/generators/dist/adapters/types.js +14 -0
- package/generators/dist/adapters/types.js.map +1 -0
- package/generators/dist/adapters/utils.d.ts +12 -0
- package/generators/dist/adapters/utils.js +68 -0
- package/generators/dist/adapters/utils.js.map +1 -0
- package/generators/dist/adapters/zed.d.ts +2 -0
- package/generators/dist/adapters/zed.js +31 -0
- package/generators/dist/adapters/zed.js.map +1 -0
- package/generators/dist/doctor.d.ts +10 -0
- package/generators/dist/doctor.js +123 -0
- package/generators/dist/doctor.js.map +1 -0
- package/generators/dist/index.d.ts +2 -0
- package/generators/dist/index.js +45 -0
- package/generators/dist/index.js.map +1 -0
- package/generators/dist/init.d.ts +9 -0
- package/generators/dist/init.js +167 -0
- package/generators/dist/init.js.map +1 -0
- package/generators/dist/install.d.ts +5 -0
- package/generators/dist/install.js +66 -0
- package/generators/dist/install.js.map +1 -0
- package/generators/dist/registry.d.ts +3 -0
- package/generators/dist/registry.js +8 -0
- package/generators/dist/registry.js.map +1 -0
- package/generators/dist/update.d.ts +5 -0
- package/generators/dist/update.js +40 -0
- package/generators/dist/update.js.map +1 -0
- package/package.json +31 -27
- package/dist/commands/apply.d.ts +0 -3
- package/dist/commands/apply.d.ts.map +0 -1
- package/dist/commands/apply.js +0 -182
- package/dist/commands/apply.js.map +0 -1
- package/dist/commands/archive.d.ts +0 -3
- package/dist/commands/archive.d.ts.map +0 -1
- package/dist/commands/archive.js +0 -99
- package/dist/commands/archive.js.map +0 -1
- package/dist/commands/capsule.d.ts +0 -8
- package/dist/commands/capsule.d.ts.map +0 -1
- package/dist/commands/capsule.js +0 -466
- package/dist/commands/capsule.js.map +0 -1
- package/dist/commands/complete.d.ts +0 -3
- package/dist/commands/complete.d.ts.map +0 -1
- package/dist/commands/complete.js +0 -140
- package/dist/commands/complete.js.map +0 -1
- package/dist/commands/constitution.d.ts +0 -3
- package/dist/commands/constitution.d.ts.map +0 -1
- package/dist/commands/constitution.js +0 -192
- package/dist/commands/constitution.js.map +0 -1
- package/dist/commands/create.d.ts +0 -10
- package/dist/commands/create.d.ts.map +0 -1
- package/dist/commands/create.js +0 -120
- package/dist/commands/create.js.map +0 -1
- package/dist/commands/delta.d.ts +0 -3
- package/dist/commands/delta.d.ts.map +0 -1
- package/dist/commands/delta.js +0 -82
- package/dist/commands/delta.js.map +0 -1
- package/dist/commands/diff.d.ts +0 -3
- package/dist/commands/diff.d.ts.map +0 -1
- package/dist/commands/diff.js +0 -102
- package/dist/commands/diff.js.map +0 -1
- package/dist/commands/doctor.d.ts +0 -3
- package/dist/commands/doctor.d.ts.map +0 -1
- package/dist/commands/doctor.js +0 -204
- package/dist/commands/doctor.js.map +0 -1
- package/dist/commands/done.d.ts +0 -3
- package/dist/commands/done.d.ts.map +0 -1
- package/dist/commands/done.js +0 -237
- package/dist/commands/done.js.map +0 -1
- package/dist/commands/explore.d.ts +0 -3
- package/dist/commands/explore.d.ts.map +0 -1
- package/dist/commands/explore.js +0 -236
- package/dist/commands/explore.js.map +0 -1
- package/dist/commands/export.d.ts +0 -7
- package/dist/commands/export.d.ts.map +0 -1
- package/dist/commands/export.js +0 -179
- package/dist/commands/export.js.map +0 -1
- package/dist/commands/extend.d.ts +0 -6
- package/dist/commands/extend.d.ts.map +0 -1
- package/dist/commands/extend.js +0 -167
- package/dist/commands/extend.js.map +0 -1
- package/dist/commands/init-old.d.ts +0 -3
- package/dist/commands/init-old.d.ts.map +0 -1
- package/dist/commands/init-old.js +0 -146
- package/dist/commands/init-old.js.map +0 -1
- package/dist/commands/init.d.ts +0 -3
- package/dist/commands/init.d.ts.map +0 -1
- package/dist/commands/init.js +0 -298
- package/dist/commands/init.js.map +0 -1
- package/dist/commands/list.d.ts +0 -3
- package/dist/commands/list.d.ts.map +0 -1
- package/dist/commands/list.js +0 -122
- package/dist/commands/list.js.map +0 -1
- package/dist/commands/memory.d.ts +0 -3
- package/dist/commands/memory.d.ts.map +0 -1
- package/dist/commands/memory.js +0 -166
- package/dist/commands/memory.js.map +0 -1
- package/dist/commands/new.d.ts +0 -3
- package/dist/commands/new.d.ts.map +0 -1
- package/dist/commands/new.js +0 -508
- package/dist/commands/new.js.map +0 -1
- package/dist/commands/qa.d.ts +0 -3
- package/dist/commands/qa.d.ts.map +0 -1
- package/dist/commands/qa.js +0 -179
- package/dist/commands/qa.js.map +0 -1
- package/dist/commands/rules.d.ts +0 -6
- package/dist/commands/rules.d.ts.map +0 -1
- package/dist/commands/rules.js +0 -232
- package/dist/commands/rules.js.map +0 -1
- package/dist/commands/shard.d.ts +0 -6
- package/dist/commands/shard.d.ts.map +0 -1
- package/dist/commands/shard.js +0 -199
- package/dist/commands/shard.js.map +0 -1
- package/dist/commands/spec.d.ts +0 -3
- package/dist/commands/spec.d.ts.map +0 -1
- package/dist/commands/spec.js +0 -302
- package/dist/commands/spec.js.map +0 -1
- package/dist/commands/status.d.ts +0 -3
- package/dist/commands/status.d.ts.map +0 -1
- package/dist/commands/status.js +0 -47
- package/dist/commands/status.js.map +0 -1
- package/dist/commands/test-apply.d.ts +0 -3
- package/dist/commands/test-apply.d.ts.map +0 -1
- package/dist/commands/test-apply.js +0 -228
- package/dist/commands/test-apply.js.map +0 -1
- package/dist/commands/test-create.d.ts +0 -3
- package/dist/commands/test-create.d.ts.map +0 -1
- package/dist/commands/test-create.js +0 -183
- package/dist/commands/test-create.js.map +0 -1
- package/dist/commands/test-guide.d.ts +0 -3
- package/dist/commands/test-guide.d.ts.map +0 -1
- package/dist/commands/test-guide.js +0 -190
- package/dist/commands/test-guide.js.map +0 -1
- package/dist/commands/test-report.d.ts +0 -3
- package/dist/commands/test-report.d.ts.map +0 -1
- package/dist/commands/test-report.js +0 -196
- package/dist/commands/test-report.js.map +0 -1
- package/dist/commands/test-submit.d.ts +0 -6
- package/dist/commands/test-submit.d.ts.map +0 -1
- package/dist/commands/test-submit.js +0 -236
- package/dist/commands/test-submit.js.map +0 -1
- package/dist/commands/verify.d.ts +0 -3
- package/dist/commands/verify.d.ts.map +0 -1
- package/dist/commands/verify.js +0 -288
- package/dist/commands/verify.js.map +0 -1
- package/dist/config.d.ts +0 -23
- package/dist/config.d.ts.map +0 -1
- package/dist/config.js +0 -44
- package/dist/config.js.map +0 -1
- package/dist/index.d.ts +0 -8
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -129
- package/dist/index.js.map +0 -1
- package/dist/rules/downloader.d.ts +0 -40
- package/dist/rules/downloader.d.ts.map +0 -1
- package/dist/rules/downloader.js +0 -253
- package/dist/rules/downloader.js.map +0 -1
- package/dist/rules/index.d.ts +0 -8
- package/dist/rules/index.d.ts.map +0 -1
- package/dist/rules/index.js +0 -8
- package/dist/rules/index.js.map +0 -1
- package/dist/rules/registry.d.ts +0 -45
- package/dist/rules/registry.d.ts.map +0 -1
- package/dist/rules/registry.js +0 -158
- package/dist/rules/registry.js.map +0 -1
- package/dist/rules/types.d.ts +0 -86
- package/dist/rules/types.d.ts.map +0 -1
- package/dist/rules/types.js +0 -6
- package/dist/rules/types.js.map +0 -1
- package/dist/utils/detectTools.d.ts +0 -15
- package/dist/utils/detectTools.d.ts.map +0 -1
- package/dist/utils/detectTools.js +0 -54
- package/dist/utils/detectTools.js.map +0 -1
- package/dist/utils/generateToolConfig.d.ts +0 -12
- package/dist/utils/generateToolConfig.d.ts.map +0 -1
- package/dist/utils/generateToolConfig.js +0 -1179
- package/dist/utils/generateToolConfig.js.map +0 -1
- package/dist/utils/testRunner.d.ts +0 -39
- package/dist/utils/testRunner.d.ts.map +0 -1
- package/dist/utils/testRunner.js +0 -325
- package/dist/utils/testRunner.js.map +0 -1
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { readFile, writeFile, mkdir } from 'node:fs/promises';
|
|
2
|
+
import { join, dirname, resolve } from 'node:path';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
import * as p from '@clack/prompts';
|
|
5
|
+
import { TOOL_NAMES } from './adapters/types.js';
|
|
6
|
+
import { loadCanonicalSkills } from './adapters/utils.js';
|
|
7
|
+
import { getAdapter } from './registry.js';
|
|
8
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
9
|
+
const __dirname = import.meta.dirname ?? resolve(__filename, '..');
|
|
10
|
+
function defaultCanonicalDir() {
|
|
11
|
+
return resolve(__dirname, '..', '..', 'canonical');
|
|
12
|
+
}
|
|
13
|
+
export async function install(tool, opts = {}) {
|
|
14
|
+
const cwd = opts.cwd ?? process.cwd();
|
|
15
|
+
const canonicalDir = opts.canonicalDir ?? defaultCanonicalDir();
|
|
16
|
+
// Validate tool name
|
|
17
|
+
if (!TOOL_NAMES.includes(tool)) {
|
|
18
|
+
console.error(`Unknown tool: "${tool}". Valid tools: ${TOOL_NAMES.join(', ')}`);
|
|
19
|
+
process.exitCode = 1;
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
// Get adapter
|
|
23
|
+
const adapter = getAdapter(tool);
|
|
24
|
+
if (!adapter) {
|
|
25
|
+
console.error(`Adapter for "${tool}" not yet available. Check for updates or install a newer version.`);
|
|
26
|
+
process.exitCode = 1;
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
// Load canonical skills
|
|
30
|
+
const skills = loadCanonicalSkills(canonicalDir);
|
|
31
|
+
// Generate files with spinner
|
|
32
|
+
const s = p.spinner();
|
|
33
|
+
s.start(`Installing ${tool}...`);
|
|
34
|
+
const files = await adapter.generate(skills, canonicalDir);
|
|
35
|
+
// Write generated files with path containment check
|
|
36
|
+
const resolvedCwd = resolve(cwd);
|
|
37
|
+
for (const file of files) {
|
|
38
|
+
const fullPath = resolve(cwd, file.path);
|
|
39
|
+
if (!fullPath.startsWith(resolvedCwd + '/') && fullPath !== resolvedCwd) {
|
|
40
|
+
console.error(`Security error: path "${file.path}" escapes project directory. Skipping.`);
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
await mkdir(dirname(fullPath), { recursive: true });
|
|
44
|
+
await writeFile(fullPath, file.content, 'utf-8');
|
|
45
|
+
}
|
|
46
|
+
s.stop(`Installed ${tool} — ${files.length} files generated`);
|
|
47
|
+
// Update config
|
|
48
|
+
const configPath = join(cwd, 'specsafe.config.json');
|
|
49
|
+
try {
|
|
50
|
+
const raw = await readFile(configPath, 'utf-8');
|
|
51
|
+
const config = JSON.parse(raw);
|
|
52
|
+
if (!config.tools.includes(tool)) {
|
|
53
|
+
config.tools.push(tool);
|
|
54
|
+
await writeFile(configPath, JSON.stringify(config, null, 2) + '\n', 'utf-8');
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
catch (err) {
|
|
58
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
59
|
+
console.warn(`Warning: Could not update specsafe.config.json (${msg}). Run \`specsafe init\` first.`);
|
|
60
|
+
}
|
|
61
|
+
console.log(`Installed ${tool} skills (${files.length} files):`);
|
|
62
|
+
for (const file of files) {
|
|
63
|
+
console.log(` ${file.path}`);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=install.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAE7D,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;AACnC,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { readFile } from 'node:fs/promises';
|
|
2
|
+
import { join, resolve } from 'node:path';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
import { install } from './install.js';
|
|
5
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
6
|
+
const __dirname = import.meta.dirname ?? resolve(__filename, '..');
|
|
7
|
+
function defaultCanonicalDir() {
|
|
8
|
+
return resolve(__dirname, '..', '..', 'canonical');
|
|
9
|
+
}
|
|
10
|
+
export async function update(opts = {}) {
|
|
11
|
+
const cwd = opts.cwd ?? process.cwd();
|
|
12
|
+
const canonicalDir = opts.canonicalDir ?? defaultCanonicalDir();
|
|
13
|
+
const configPath = join(cwd, 'specsafe.config.json');
|
|
14
|
+
let config;
|
|
15
|
+
try {
|
|
16
|
+
const raw = await readFile(configPath, 'utf-8');
|
|
17
|
+
config = JSON.parse(raw);
|
|
18
|
+
}
|
|
19
|
+
catch (err) {
|
|
20
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
21
|
+
console.error(`Could not read specsafe.config.json (${msg}). Run \`specsafe init\` first.`);
|
|
22
|
+
process.exitCode = 1;
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
if (!Array.isArray(config.tools)) {
|
|
26
|
+
console.error('Invalid config: "tools" must be an array. Run `specsafe doctor` to diagnose.');
|
|
27
|
+
process.exitCode = 1;
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
if (config.tools.length === 0) {
|
|
31
|
+
console.log('No tools configured. Run `specsafe install <tool>` to add one.');
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
console.log(`Updating ${config.tools.length} tool(s)...`);
|
|
35
|
+
for (const tool of config.tools) {
|
|
36
|
+
await install(tool, { cwd, canonicalDir });
|
|
37
|
+
}
|
|
38
|
+
console.log('Update complete.');
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../src/update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;AAEnE,SAAS,mBAAmB;IAC1B,OAAO,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;AACrD,CAAC;AAOD,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,OAAsB,EAAE;IACnD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACtC,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,IAAI,mBAAmB,EAAE,CAAC;IAEhE,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,sBAAsB,CAAC,CAAC;IACrD,IAAI,MAAsB,CAAC;IAC3B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAChD,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7D,OAAO,CAAC,KAAK,CAAC,wCAAwC,GAAG,iCAAiC,CAAC,CAAC;QAC5F,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QACjC,OAAO,CAAC,KAAK,CAAC,8EAA8E,CAAC,CAAC;QAC9F,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAAC;QAC9E,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,KAAK,CAAC,MAAM,aAAa,CAAC,CAAC;IAC1D,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QAChC,MAAM,OAAO,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,YAAY,EAAE,CAAC,CAAC;IAC7C,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;AAClC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,43 +1,47 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@specsafe/cli",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "2.0.3",
|
|
4
|
+
"description": "Skills-first TDD framework for AI-assisted development",
|
|
5
5
|
"type": "module",
|
|
6
|
-
"engines": {
|
|
7
|
-
"node": ">=18"
|
|
8
|
-
},
|
|
9
|
-
"main": "./dist/index.js",
|
|
10
|
-
"types": "./dist/index.d.ts",
|
|
11
6
|
"bin": {
|
|
12
|
-
"specsafe": "
|
|
7
|
+
"specsafe": "generators/dist/index.js"
|
|
13
8
|
},
|
|
14
9
|
"files": [
|
|
15
|
-
"dist
|
|
16
|
-
"
|
|
10
|
+
"generators/dist",
|
|
11
|
+
"canonical",
|
|
17
12
|
"LICENSE"
|
|
18
13
|
],
|
|
19
|
-
"
|
|
20
|
-
"
|
|
14
|
+
"scripts": {
|
|
15
|
+
"build": "pnpm -r build",
|
|
16
|
+
"test": "pnpm -r test",
|
|
17
|
+
"typecheck": "pnpm -r typecheck"
|
|
21
18
|
},
|
|
22
19
|
"dependencies": {
|
|
23
|
-
"@
|
|
24
|
-
"
|
|
25
|
-
"
|
|
26
|
-
"
|
|
27
|
-
"@specsafe/core": "0.8.0",
|
|
28
|
-
"@specsafe/test-gen": "0.8.0"
|
|
20
|
+
"@clack/prompts": "1.0.1",
|
|
21
|
+
"ansis": "^4.2.0",
|
|
22
|
+
"cli-table3": "^0.6.5",
|
|
23
|
+
"commander": "^12.0.0"
|
|
29
24
|
},
|
|
30
25
|
"devDependencies": {
|
|
31
26
|
"@types/node": "^20.0.0",
|
|
32
27
|
"typescript": "^5.3.0",
|
|
28
|
+
"vite": "^7.3.1",
|
|
33
29
|
"vitest": "^3.0.0"
|
|
34
30
|
},
|
|
35
|
-
"
|
|
36
|
-
|
|
37
|
-
"
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
"
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
}
|
|
31
|
+
"packageManager": "pnpm@10.28.2",
|
|
32
|
+
"engines": {
|
|
33
|
+
"node": ">=18.0.0"
|
|
34
|
+
},
|
|
35
|
+
"pnpm": {
|
|
36
|
+
"overrides": {
|
|
37
|
+
"rollup": ">=4.59.0",
|
|
38
|
+
"picomatch": ">=4.0.4"
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
"repository": {
|
|
42
|
+
"type": "git",
|
|
43
|
+
"url": "https://github.com/Agentic-Engineering-Agency/specsafe"
|
|
44
|
+
},
|
|
45
|
+
"keywords": ["tdd", "spec-driven", "ai", "testing", "skills", "claude", "opencode", "cursor"],
|
|
46
|
+
"license": "MIT"
|
|
47
|
+
}
|
package/dist/commands/apply.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"apply.d.ts","sourceRoot":"","sources":["../../src/commands/apply.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,eAAO,MAAM,YAAY,SAqMrB,CAAC"}
|
package/dist/commands/apply.js
DELETED
|
@@ -1,182 +0,0 @@
|
|
|
1
|
-
import { Command } from 'commander';
|
|
2
|
-
import chalk from 'chalk';
|
|
3
|
-
import ora from 'ora';
|
|
4
|
-
import { readFile, writeFile, readdir, copyFile, mkdir, unlink } from 'fs/promises';
|
|
5
|
-
import { join } from 'path';
|
|
6
|
-
import { DeltaParser, SemanticMerger } from '@specsafe/core';
|
|
7
|
-
import { confirm } from '@inquirer/prompts';
|
|
8
|
-
export const applyCommand = new Command('apply')
|
|
9
|
-
.description('Apply pending delta specs to a base spec')
|
|
10
|
-
.argument('<spec-id>', 'Base spec ID (e.g., SPEC-20260101-001)')
|
|
11
|
-
.option('--no-backup', 'Skip creating backup before applying')
|
|
12
|
-
.option('-f, --force', 'Apply even if conflicts exist')
|
|
13
|
-
.action(async (specId, options) => {
|
|
14
|
-
const spinner = ora('Loading delta specs...').start();
|
|
15
|
-
try {
|
|
16
|
-
// Validate specId to prevent path traversal
|
|
17
|
-
if (!/^[A-Za-z0-9_-]+$/.test(specId)) {
|
|
18
|
-
spinner.fail(chalk.red('Invalid spec ID. Use only alphanumeric characters, hyphens, and underscores.'));
|
|
19
|
-
process.exit(1);
|
|
20
|
-
}
|
|
21
|
-
// Load base spec
|
|
22
|
-
const baseSpecPath = join('specs/active', `${specId}.md`);
|
|
23
|
-
let baseContent;
|
|
24
|
-
try {
|
|
25
|
-
baseContent = await readFile(baseSpecPath, 'utf-8');
|
|
26
|
-
}
|
|
27
|
-
catch {
|
|
28
|
-
spinner.fail(chalk.red(`Base spec not found: ${specId}`));
|
|
29
|
-
console.log(chalk.gray('💡 Tip: Check that the spec exists in specs/active/'));
|
|
30
|
-
process.exit(1);
|
|
31
|
-
}
|
|
32
|
-
// Find all delta specs for this base spec
|
|
33
|
-
const deltasDir = 'specs/deltas';
|
|
34
|
-
let deltaFiles = [];
|
|
35
|
-
try {
|
|
36
|
-
const files = await readdir(deltasDir);
|
|
37
|
-
deltaFiles = files.filter(f => f.startsWith(`DELTA-${specId}-`) && f.endsWith('.md'));
|
|
38
|
-
}
|
|
39
|
-
catch {
|
|
40
|
-
spinner.fail(chalk.red('No deltas directory found'));
|
|
41
|
-
console.log(chalk.gray('💡 Tip: Create a delta spec first with: specsafe delta <spec-id>'));
|
|
42
|
-
process.exit(1);
|
|
43
|
-
}
|
|
44
|
-
if (deltaFiles.length === 0) {
|
|
45
|
-
spinner.fail(chalk.red(`No delta specs found for ${specId}`));
|
|
46
|
-
console.log(chalk.gray('💡 Tip: Create a delta spec first with: specsafe delta <spec-id>'));
|
|
47
|
-
process.exit(1);
|
|
48
|
-
}
|
|
49
|
-
spinner.text = `Found ${deltaFiles.length} delta spec(s)`;
|
|
50
|
-
// Parse all delta specs
|
|
51
|
-
const parser = new DeltaParser();
|
|
52
|
-
const deltaSpecs = [];
|
|
53
|
-
for (const file of deltaFiles) {
|
|
54
|
-
const deltaPath = join(deltasDir, file);
|
|
55
|
-
const deltaContent = await readFile(deltaPath, 'utf-8');
|
|
56
|
-
const deltaId = file.replace('.md', '');
|
|
57
|
-
try {
|
|
58
|
-
const deltaSpec = parser.parse(deltaContent, deltaId, specId);
|
|
59
|
-
const validation = parser.validate(deltaSpec);
|
|
60
|
-
if (!validation.valid) {
|
|
61
|
-
spinner.warn(chalk.yellow(`Validation errors in ${deltaId}:`));
|
|
62
|
-
for (const error of validation.errors) {
|
|
63
|
-
console.log(chalk.yellow(` - ${error}`));
|
|
64
|
-
}
|
|
65
|
-
if (!options.force) {
|
|
66
|
-
const proceed = await confirm({
|
|
67
|
-
message: 'Continue with other deltas?',
|
|
68
|
-
default: false
|
|
69
|
-
});
|
|
70
|
-
if (!proceed) {
|
|
71
|
-
process.exit(1);
|
|
72
|
-
}
|
|
73
|
-
spinner.start('Continuing with other deltas...');
|
|
74
|
-
continue;
|
|
75
|
-
}
|
|
76
|
-
spinner.start('Continuing...');
|
|
77
|
-
}
|
|
78
|
-
deltaSpecs.push(deltaSpec);
|
|
79
|
-
}
|
|
80
|
-
catch (err) {
|
|
81
|
-
spinner.warn(chalk.yellow(`Failed to parse ${deltaId}: ${err.message}`));
|
|
82
|
-
spinner.start('Continuing...');
|
|
83
|
-
continue;
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
if (deltaSpecs.length === 0) {
|
|
87
|
-
spinner.fail(chalk.red('No valid delta specs to apply'));
|
|
88
|
-
process.exit(1);
|
|
89
|
-
}
|
|
90
|
-
spinner.text = `Applying ${deltaSpecs.length} delta spec(s)...`;
|
|
91
|
-
// Apply all deltas in sequence
|
|
92
|
-
const merger = new SemanticMerger();
|
|
93
|
-
let currentContent = baseContent;
|
|
94
|
-
let totalStats = {
|
|
95
|
-
added: 0,
|
|
96
|
-
modified: 0,
|
|
97
|
-
removed: 0,
|
|
98
|
-
conflicts: 0
|
|
99
|
-
};
|
|
100
|
-
for (const deltaSpec of deltaSpecs) {
|
|
101
|
-
const result = merger.merge(currentContent, deltaSpec);
|
|
102
|
-
// Accumulate stats
|
|
103
|
-
totalStats.added += result.stats.added;
|
|
104
|
-
totalStats.modified += result.stats.modified;
|
|
105
|
-
totalStats.removed += result.stats.removed;
|
|
106
|
-
totalStats.conflicts += result.stats.conflicts;
|
|
107
|
-
if (result.conflicts.length > 0) {
|
|
108
|
-
spinner.warn(chalk.yellow(`Conflicts in ${deltaSpec.id}:`));
|
|
109
|
-
for (const conflict of result.conflicts) {
|
|
110
|
-
console.log(chalk.yellow(` - ${conflict.message}`));
|
|
111
|
-
}
|
|
112
|
-
if (!options.force) {
|
|
113
|
-
const proceed = await confirm({
|
|
114
|
-
message: 'Apply anyway (may result in incomplete merge)?',
|
|
115
|
-
default: false
|
|
116
|
-
});
|
|
117
|
-
if (!proceed) {
|
|
118
|
-
spinner.fail(chalk.red('Apply cancelled due to conflicts'));
|
|
119
|
-
process.exit(1);
|
|
120
|
-
}
|
|
121
|
-
spinner.start();
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
currentContent = result.content;
|
|
125
|
-
}
|
|
126
|
-
spinner.stop();
|
|
127
|
-
// Show preview of changes
|
|
128
|
-
console.log(chalk.blue('\n📊 Merge Summary:'));
|
|
129
|
-
console.log(chalk.green(` ✓ Added: ${totalStats.added} requirements`));
|
|
130
|
-
console.log(chalk.yellow(` ~ Modified: ${totalStats.modified} requirements`));
|
|
131
|
-
console.log(chalk.red(` - Removed: ${totalStats.removed} requirements`));
|
|
132
|
-
if (totalStats.conflicts > 0) {
|
|
133
|
-
console.log(chalk.red(` ⚠ Conflicts: ${totalStats.conflicts}`));
|
|
134
|
-
}
|
|
135
|
-
// Confirm before writing
|
|
136
|
-
const proceed = await confirm({
|
|
137
|
-
message: 'Apply these changes to the base spec?',
|
|
138
|
-
default: true
|
|
139
|
-
});
|
|
140
|
-
if (!proceed) {
|
|
141
|
-
console.log(chalk.yellow('\nApply cancelled.'));
|
|
142
|
-
process.exit(0);
|
|
143
|
-
}
|
|
144
|
-
spinner.start('Applying changes...');
|
|
145
|
-
// Create backup if requested
|
|
146
|
-
if (options.backup) {
|
|
147
|
-
const backupDir = join('specs', 'backups');
|
|
148
|
-
await mkdir(backupDir, { recursive: true });
|
|
149
|
-
const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
|
|
150
|
-
const backupPath = join(backupDir, `${specId}-${timestamp}.md`);
|
|
151
|
-
await copyFile(baseSpecPath, backupPath);
|
|
152
|
-
spinner.text = `Created backup: ${backupPath}`;
|
|
153
|
-
}
|
|
154
|
-
// Write merged content
|
|
155
|
-
await writeFile(baseSpecPath, currentContent);
|
|
156
|
-
// Archive applied deltas (only those that were successfully applied)
|
|
157
|
-
const archiveDir = join('specs', 'deltas', 'applied');
|
|
158
|
-
await mkdir(archiveDir, { recursive: true });
|
|
159
|
-
for (const deltaSpec of deltaSpecs) {
|
|
160
|
-
const deltaFile = `${deltaSpec.id}.md`;
|
|
161
|
-
const deltaPath = join(deltasDir, deltaFile);
|
|
162
|
-
const archivePath = join(archiveDir, deltaFile);
|
|
163
|
-
await copyFile(deltaPath, archivePath);
|
|
164
|
-
await unlink(deltaPath); // Remove original after archiving
|
|
165
|
-
}
|
|
166
|
-
spinner.succeed(chalk.green(`Successfully applied ${deltaSpecs.length} delta spec(s) to ${specId}`));
|
|
167
|
-
console.log(chalk.blue(` Updated: ${baseSpecPath}`));
|
|
168
|
-
if (options.backup) {
|
|
169
|
-
console.log(chalk.blue(` Backup: specs/backups/`));
|
|
170
|
-
}
|
|
171
|
-
console.log(chalk.blue(` Archived deltas: specs/deltas/applied/`));
|
|
172
|
-
console.log(chalk.gray('\n Next steps:'));
|
|
173
|
-
console.log(chalk.gray(` 1. Review changes: git diff ${baseSpecPath}`));
|
|
174
|
-
console.log(chalk.gray(` 2. Update tests if needed`));
|
|
175
|
-
console.log(chalk.gray(` 3. Run: specsafe verify ${specId}`));
|
|
176
|
-
}
|
|
177
|
-
catch (error) {
|
|
178
|
-
spinner.fail(chalk.red(`Failed to apply deltas: ${error.message}`));
|
|
179
|
-
process.exit(1);
|
|
180
|
-
}
|
|
181
|
-
});
|
|
182
|
-
//# sourceMappingURL=apply.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"apply.js","sourceRoot":"","sources":["../../src/commands/apply.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"archive.d.ts","sourceRoot":"","sources":["../../src/commands/archive.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,eAAO,MAAM,cAAc,SAoGvB,CAAC"}
|
package/dist/commands/archive.js
DELETED
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
import { Command } from 'commander';
|
|
2
|
-
import chalk from 'chalk';
|
|
3
|
-
import ora from 'ora';
|
|
4
|
-
import { Workflow, ProjectTracker, validateSpecId } from '@specsafe/core';
|
|
5
|
-
import { access, rename, mkdir } from 'fs/promises';
|
|
6
|
-
import { join } from 'path';
|
|
7
|
-
export const archiveCommand = new Command('archive')
|
|
8
|
-
.description('Move a COMPLETE spec to ARCHIVED stage')
|
|
9
|
-
.argument('<id>', 'Spec ID to archive')
|
|
10
|
-
.option('-n, --dry-run', 'Preview changes without writing files')
|
|
11
|
-
.action(async (id, options) => {
|
|
12
|
-
const spinner = ora(`Archiving ${id}...`).start();
|
|
13
|
-
try {
|
|
14
|
-
// Validate spec ID format
|
|
15
|
-
validateSpecId(id);
|
|
16
|
-
const workflow = new Workflow();
|
|
17
|
-
const tracker = new ProjectTracker(process.cwd());
|
|
18
|
-
// Load existing specs from disk
|
|
19
|
-
await tracker.loadSpecsIntoWorkflow(workflow);
|
|
20
|
-
// Check if spec exists
|
|
21
|
-
const spec = workflow.getSpec(id);
|
|
22
|
-
if (!spec) {
|
|
23
|
-
spinner.fail(chalk.red(`Spec '${id}' not found in project state.`));
|
|
24
|
-
process.exit(1);
|
|
25
|
-
}
|
|
26
|
-
// Validate spec is in COMPLETE stage
|
|
27
|
-
if (spec.stage !== 'complete') {
|
|
28
|
-
spinner.fail(chalk.red(`Cannot archive spec in ${spec.stage.toUpperCase()} stage. Must be COMPLETE.`));
|
|
29
|
-
console.log(chalk.gray(`Current stage: ${spec.stage.toUpperCase()}`));
|
|
30
|
-
console.log(chalk.gray('Use specsafe complete <id> to move to COMPLETE stage first.'));
|
|
31
|
-
process.exit(1);
|
|
32
|
-
}
|
|
33
|
-
// Move spec file from specs/completed/ to specs/archive/
|
|
34
|
-
const completedDir = join(process.cwd(), 'specs', 'completed');
|
|
35
|
-
const archiveDir = join(process.cwd(), 'specs', 'archive');
|
|
36
|
-
const sourcePath = join(completedDir, `${id}.md`);
|
|
37
|
-
const destPath = join(archiveDir, `${id}.md`);
|
|
38
|
-
// Check if source file exists
|
|
39
|
-
let fileExists = false;
|
|
40
|
-
try {
|
|
41
|
-
await access(sourcePath);
|
|
42
|
-
fileExists = true;
|
|
43
|
-
}
|
|
44
|
-
catch {
|
|
45
|
-
// Source file doesn't exist
|
|
46
|
-
}
|
|
47
|
-
// Handle dry-run mode
|
|
48
|
-
if (options.dryRun) {
|
|
49
|
-
spinner.stop();
|
|
50
|
-
console.log(chalk.cyan('[DRY RUN] Would perform the following actions:\n'));
|
|
51
|
-
console.log(chalk.cyan(' State transition:'));
|
|
52
|
-
console.log(chalk.gray(` COMPLETE → ARCHIVED`));
|
|
53
|
-
if (fileExists) {
|
|
54
|
-
console.log(chalk.cyan(`\n File move:`));
|
|
55
|
-
console.log(chalk.gray(` ${sourcePath} → ${destPath}`));
|
|
56
|
-
}
|
|
57
|
-
else {
|
|
58
|
-
console.log(chalk.cyan(`\n File move:`));
|
|
59
|
-
console.log(chalk.yellow(` Source file not found at ${sourcePath}`));
|
|
60
|
-
console.log(chalk.gray(` Would continue with workflow archive only`));
|
|
61
|
-
}
|
|
62
|
-
console.log(chalk.cyan(`\n Would update PROJECT_STATE.md for spec: ${id}`));
|
|
63
|
-
process.exit(0);
|
|
64
|
-
}
|
|
65
|
-
// Ensure archive directory exists
|
|
66
|
-
await mkdir(archiveDir, { recursive: true });
|
|
67
|
-
// Move the file (if it exists)
|
|
68
|
-
let fileMoved = false;
|
|
69
|
-
try {
|
|
70
|
-
await rename(sourcePath, destPath);
|
|
71
|
-
fileMoved = true;
|
|
72
|
-
}
|
|
73
|
-
catch (err) {
|
|
74
|
-
if (err.code !== 'ENOENT') {
|
|
75
|
-
throw err;
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
// Use workflow to archive the spec
|
|
79
|
-
workflow.archiveSpec(id);
|
|
80
|
-
// Update PROJECT_STATE.md
|
|
81
|
-
const archivedSpec = workflow.getSpec(id);
|
|
82
|
-
if (archivedSpec) {
|
|
83
|
-
await tracker.addSpec(archivedSpec);
|
|
84
|
-
}
|
|
85
|
-
spinner.succeed(chalk.green(`Archived ${id}`));
|
|
86
|
-
console.log(chalk.blue(` Stage: ${spec.stage.toUpperCase()} → ARCHIVED`));
|
|
87
|
-
if (fileMoved) {
|
|
88
|
-
console.log(chalk.gray(` File moved to: specs/archive/${id}.md`));
|
|
89
|
-
}
|
|
90
|
-
else {
|
|
91
|
-
console.log(chalk.gray(` No spec file was moved (file not found).`));
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
catch (error) {
|
|
95
|
-
spinner.fail(chalk.red(error.message));
|
|
96
|
-
process.exit(1);
|
|
97
|
-
}
|
|
98
|
-
});
|
|
99
|
-
//# sourceMappingURL=archive.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"archive.js","sourceRoot":"","sources":["../../src/commands/archive.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"capsule.d.ts","sourceRoot":"","sources":["../../src/commands/capsule.ts"],"names":[],"mappings":";AAEA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAoBpC,eAAO,MAAM,cAAc,SAQzB,CAAC"}
|