@specsafe/cli 0.8.0 ā 2.0.2
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
|
@@ -1,146 +0,0 @@
|
|
|
1
|
-
import { Command } from 'commander';
|
|
2
|
-
import chalk from 'chalk';
|
|
3
|
-
import ora from 'ora';
|
|
4
|
-
import { writeFile, mkdir } from 'fs/promises';
|
|
5
|
-
import { ProjectTracker } from '@specsafe/core';
|
|
6
|
-
import { checkbox, select, confirm, input } from '@inquirer/prompts';
|
|
7
|
-
import { detectInstalledTools, availableTools } from '../utils/detectTools.js';
|
|
8
|
-
import { generateToolConfig, generateGitHooks } from '../utils/generateToolConfig.js';
|
|
9
|
-
export const initCommand = new Command('init')
|
|
10
|
-
.description('Initialize a new SpecSafe project')
|
|
11
|
-
.argument('[name]', 'Project name', 'my-project')
|
|
12
|
-
.action(async (defaultName) => {
|
|
13
|
-
const spinner = ora('Initializing SpecSafe project...').start();
|
|
14
|
-
try {
|
|
15
|
-
// Interactive prompts for project name
|
|
16
|
-
spinner.stop();
|
|
17
|
-
const name = await input({
|
|
18
|
-
message: 'Project name:',
|
|
19
|
-
default: defaultName,
|
|
20
|
-
});
|
|
21
|
-
// 1. Detect existing tools
|
|
22
|
-
const detectedTools = detectInstalledTools();
|
|
23
|
-
// 2. Prompt user to confirm/select tools
|
|
24
|
-
const toolChoices = availableTools.map((tool) => ({
|
|
25
|
-
name: tool.displayName + (detectedTools.includes(tool.name) ? ' (detected)' : ''),
|
|
26
|
-
value: tool.name,
|
|
27
|
-
checked: detectedTools.includes(tool.name),
|
|
28
|
-
}));
|
|
29
|
-
const selectedTools = await checkbox({
|
|
30
|
-
message: 'Which AI coding assistants do you use?',
|
|
31
|
-
choices: toolChoices,
|
|
32
|
-
});
|
|
33
|
-
// 3. Prompt for test framework
|
|
34
|
-
const testFramework = await select({
|
|
35
|
-
message: 'Select testing framework:',
|
|
36
|
-
choices: [
|
|
37
|
-
{ name: 'Vitest (recommended)', value: 'vitest' },
|
|
38
|
-
{ name: 'Jest', value: 'jest' },
|
|
39
|
-
{ name: 'Playwright (E2E)', value: 'playwright' },
|
|
40
|
-
],
|
|
41
|
-
default: 'vitest',
|
|
42
|
-
});
|
|
43
|
-
// 4. Prompt for git hooks
|
|
44
|
-
const useGitHooks = await confirm({
|
|
45
|
-
message: 'Enable git hooks for spec validation?',
|
|
46
|
-
default: true,
|
|
47
|
-
});
|
|
48
|
-
spinner.start('Creating project structure...');
|
|
49
|
-
// Create directory structure
|
|
50
|
-
await mkdir('specs/active', { recursive: true });
|
|
51
|
-
await mkdir('specs/completed', { recursive: true });
|
|
52
|
-
await mkdir('specs/archive', { recursive: true });
|
|
53
|
-
await mkdir('src', { recursive: true });
|
|
54
|
-
await mkdir('tests', { recursive: true });
|
|
55
|
-
// Create PROJECT_STATE.md
|
|
56
|
-
const tracker = new ProjectTracker(process.cwd());
|
|
57
|
-
await tracker.initialize(name);
|
|
58
|
-
// Create spec template
|
|
59
|
-
const template = `# Spec Template
|
|
60
|
-
|
|
61
|
-
## Metadata
|
|
62
|
-
- **ID**: SPEC-{YYYYMMDD}-{NNN}
|
|
63
|
-
- **Status**: draft
|
|
64
|
-
- **Priority**: P1
|
|
65
|
-
|
|
66
|
-
## 1. Purpose (WHY)
|
|
67
|
-
|
|
68
|
-
## 2. Scope (WHAT)
|
|
69
|
-
### In Scope
|
|
70
|
-
-
|
|
71
|
-
|
|
72
|
-
### Out of Scope
|
|
73
|
-
-
|
|
74
|
-
|
|
75
|
-
## 3. Requirements
|
|
76
|
-
| ID | Requirement | Priority | Acceptance Criteria |
|
|
77
|
-
|----|-------------|----------|---------------------|
|
|
78
|
-
| | | | |
|
|
79
|
-
|
|
80
|
-
## 4. Technical Approach (HOW)
|
|
81
|
-
|
|
82
|
-
## 5. Test Strategy
|
|
83
|
-
|
|
84
|
-
## 6. Implementation Plan
|
|
85
|
-
|
|
86
|
-
## 7. Success Criteria
|
|
87
|
-
- [ ]
|
|
88
|
-
|
|
89
|
-
## 8. Risks & Mitigations
|
|
90
|
-
|
|
91
|
-
## 9. Notes & References
|
|
92
|
-
`;
|
|
93
|
-
await writeFile('specs/template.md', template);
|
|
94
|
-
// Create config file with selected tools
|
|
95
|
-
const toolsConfig = {};
|
|
96
|
-
for (const tool of selectedTools) {
|
|
97
|
-
toolsConfig[tool] = { enabled: true };
|
|
98
|
-
}
|
|
99
|
-
const config = {
|
|
100
|
-
project: name,
|
|
101
|
-
version: '1.0.0',
|
|
102
|
-
stages: ['spec', 'test', 'code', 'qa', 'complete'],
|
|
103
|
-
testFramework,
|
|
104
|
-
language: 'typescript',
|
|
105
|
-
tools: toolsConfig,
|
|
106
|
-
gitHooks: {
|
|
107
|
-
enabled: useGitHooks,
|
|
108
|
-
},
|
|
109
|
-
};
|
|
110
|
-
await writeFile('specsafe.config.json', JSON.stringify(config, null, 2));
|
|
111
|
-
spinner.text = 'Generating tool configurations...';
|
|
112
|
-
// Generate tool configs for selected tools
|
|
113
|
-
for (const tool of selectedTools) {
|
|
114
|
-
await generateToolConfig(tool, '.');
|
|
115
|
-
}
|
|
116
|
-
// Generate git hooks if enabled
|
|
117
|
-
if (useGitHooks) {
|
|
118
|
-
await generateGitHooks('.');
|
|
119
|
-
}
|
|
120
|
-
spinner.succeed(chalk.green(`Initialized SpecSafe project: ${name}`));
|
|
121
|
-
console.log('\n' + chalk.blue('Generated configurations:'));
|
|
122
|
-
for (const tool of selectedTools) {
|
|
123
|
-
console.log(chalk.green(` ā ${tool} configuration`));
|
|
124
|
-
}
|
|
125
|
-
if (useGitHooks) {
|
|
126
|
-
console.log(chalk.green(' ā Git hooks enabled'));
|
|
127
|
-
}
|
|
128
|
-
console.log(chalk.green(` ā ${testFramework} configuration`));
|
|
129
|
-
console.log('\n' + chalk.blue('Next steps:'));
|
|
130
|
-
console.log(' 1. specsafe new <spec-name> - Create a new spec');
|
|
131
|
-
console.log(' 2. specsafe status - View project status');
|
|
132
|
-
console.log(' 3. Edit specs/active/ to define requirements');
|
|
133
|
-
}
|
|
134
|
-
catch (error) {
|
|
135
|
-
spinner.fail(chalk.red(`Failed to initialize: ${error.message}`));
|
|
136
|
-
if (error.message.includes('EEXIST')) {
|
|
137
|
-
console.log(chalk.gray("š” Tip: Directory already exists. Use 'specsafe init <name>' to create elsewhere."));
|
|
138
|
-
}
|
|
139
|
-
if (error.message.includes('User force closed')) {
|
|
140
|
-
console.log(chalk.gray('š” Tip: Init was cancelled by user.'));
|
|
141
|
-
process.exit(0);
|
|
142
|
-
}
|
|
143
|
-
process.exit(1);
|
|
144
|
-
}
|
|
145
|
-
});
|
|
146
|
-
//# sourceMappingURL=init-old.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"init-old.js","sourceRoot":"","sources":["../../src/commands/init-old.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/init.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAyFpC,eAAO,MAAM,WAAW,SA4PpB,CAAC"}
|
package/dist/commands/init.js
DELETED
|
@@ -1,298 +0,0 @@
|
|
|
1
|
-
import { Command } from 'commander';
|
|
2
|
-
import chalk from 'chalk';
|
|
3
|
-
import ora from 'ora';
|
|
4
|
-
import { writeFile, mkdir, access, chmod } from 'fs/promises';
|
|
5
|
-
import { existsSync } from 'fs';
|
|
6
|
-
import { join, dirname } from 'path';
|
|
7
|
-
import { execSync } from 'child_process';
|
|
8
|
-
import { ProjectTracker, getSupportedAgents, getAgent, AGENT_DEFINITIONS } from '@specsafe/core';
|
|
9
|
-
import { checkbox, select, confirm, input } from '@inquirer/prompts';
|
|
10
|
-
/**
|
|
11
|
-
* Detect which agents are already configured in the project
|
|
12
|
-
*/
|
|
13
|
-
async function detectConfiguredAgents(projectDir) {
|
|
14
|
-
const detected = [];
|
|
15
|
-
for (const agentDef of AGENT_DEFINITIONS) {
|
|
16
|
-
for (const file of agentDef.detectionFiles) {
|
|
17
|
-
const filePath = join(projectDir, file);
|
|
18
|
-
try {
|
|
19
|
-
await access(filePath);
|
|
20
|
-
detected.push(agentDef.id);
|
|
21
|
-
break; // Found one file, that's enough
|
|
22
|
-
}
|
|
23
|
-
catch {
|
|
24
|
-
// File doesn't exist, continue
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
return detected;
|
|
29
|
-
}
|
|
30
|
-
/**
|
|
31
|
-
* Generate configurations for selected agents
|
|
32
|
-
*/
|
|
33
|
-
async function generateAgentConfigs(agents, projectDir, projectName) {
|
|
34
|
-
for (const agentId of agents) {
|
|
35
|
-
const agentEntry = getAgent(agentId);
|
|
36
|
-
if (!agentEntry) {
|
|
37
|
-
console.warn(chalk.yellow(`Warning: Agent ${agentId} not found in registry`));
|
|
38
|
-
continue;
|
|
39
|
-
}
|
|
40
|
-
try {
|
|
41
|
-
// Generate main config files
|
|
42
|
-
const configFiles = await agentEntry.adapter.generateConfig(projectDir, {
|
|
43
|
-
projectName,
|
|
44
|
-
});
|
|
45
|
-
// Generate command files
|
|
46
|
-
const commandFiles = await agentEntry.adapter.generateCommands(projectDir, {
|
|
47
|
-
projectName,
|
|
48
|
-
});
|
|
49
|
-
const allFiles = [...configFiles, ...commandFiles];
|
|
50
|
-
// Write files
|
|
51
|
-
for (const file of allFiles) {
|
|
52
|
-
const filePath = join(projectDir, file.path);
|
|
53
|
-
const fileDir = dirname(filePath);
|
|
54
|
-
// Create directory if needed (mkdir recursive is idempotent, no need to check existsSync)
|
|
55
|
-
await mkdir(fileDir, { recursive: true });
|
|
56
|
-
// Skip if file exists
|
|
57
|
-
if (existsSync(filePath)) {
|
|
58
|
-
console.log(chalk.yellow(` ā ${file.path} already exists, skipping`));
|
|
59
|
-
continue;
|
|
60
|
-
}
|
|
61
|
-
// Write file
|
|
62
|
-
await writeFile(filePath, file.content);
|
|
63
|
-
console.log(chalk.green(` ā Created ${file.path}`));
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
catch (error) {
|
|
67
|
-
console.error(chalk.red(` ā Failed to generate ${agentId} config: ${error.message}`));
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
export const initCommand = new Command('init')
|
|
72
|
-
.description('Initialize a new SpecSafe project')
|
|
73
|
-
.argument('[name]', 'Project name', 'my-project')
|
|
74
|
-
.option('--agent <agents...>', 'AI coding agents to configure (can be repeated)')
|
|
75
|
-
.action(async (defaultName, options) => {
|
|
76
|
-
const spinner = ora('Initializing SpecSafe project...').start();
|
|
77
|
-
try {
|
|
78
|
-
// Interactive prompts for project name
|
|
79
|
-
spinner.stop();
|
|
80
|
-
const name = await input({
|
|
81
|
-
message: 'Project name:',
|
|
82
|
-
default: defaultName,
|
|
83
|
-
});
|
|
84
|
-
const projectDir = process.cwd();
|
|
85
|
-
// 1. Determine which agents to configure
|
|
86
|
-
let selectedAgents = [];
|
|
87
|
-
if (options.agent && options.agent.length > 0) {
|
|
88
|
-
// Agents specified via CLI flag - validate each one
|
|
89
|
-
const supportedAgents = getSupportedAgents();
|
|
90
|
-
const invalidAgents = options.agent.filter(id => !supportedAgents.includes(id));
|
|
91
|
-
if (invalidAgents.length > 0) {
|
|
92
|
-
console.error(chalk.red(`Error: Invalid agent(s): ${invalidAgents.join(', ')}`));
|
|
93
|
-
console.log(chalk.gray(`\nSupported agents: ${supportedAgents.join(', ')}`));
|
|
94
|
-
process.exit(1);
|
|
95
|
-
}
|
|
96
|
-
selectedAgents = options.agent;
|
|
97
|
-
console.log(chalk.blue(`Using agents from CLI: ${selectedAgents.join(', ')}`));
|
|
98
|
-
}
|
|
99
|
-
else {
|
|
100
|
-
// Auto-detect or prompt
|
|
101
|
-
const detectedAgents = await detectConfiguredAgents(projectDir);
|
|
102
|
-
if (detectedAgents.length > 0) {
|
|
103
|
-
console.log(chalk.green(`Detected agents: ${detectedAgents.join(', ')}`));
|
|
104
|
-
const useDetected = await confirm({
|
|
105
|
-
message: 'Use detected agents?',
|
|
106
|
-
default: true,
|
|
107
|
-
});
|
|
108
|
-
if (useDetected) {
|
|
109
|
-
selectedAgents = detectedAgents;
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
if (selectedAgents.length === 0) {
|
|
113
|
-
// Prompt user to select
|
|
114
|
-
const agentChoices = AGENT_DEFINITIONS.map((agent) => ({
|
|
115
|
-
name: agent.name,
|
|
116
|
-
value: agent.id,
|
|
117
|
-
checked: detectedAgents.includes(agent.id),
|
|
118
|
-
}));
|
|
119
|
-
selectedAgents = await checkbox({
|
|
120
|
-
message: 'Which AI coding agents do you use?',
|
|
121
|
-
choices: agentChoices,
|
|
122
|
-
required: false,
|
|
123
|
-
});
|
|
124
|
-
// Default to all if none selected
|
|
125
|
-
if (selectedAgents.length === 0) {
|
|
126
|
-
const useAll = await confirm({
|
|
127
|
-
message: 'No agents selected. Generate configs for all supported agents?',
|
|
128
|
-
default: false,
|
|
129
|
-
});
|
|
130
|
-
if (useAll) {
|
|
131
|
-
// Filter to only agents that have registered adapters
|
|
132
|
-
selectedAgents = getSupportedAgents().filter(id => getAgent(id) !== undefined);
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
// 2. Prompt for test framework
|
|
138
|
-
spinner.stop();
|
|
139
|
-
const testFramework = await select({
|
|
140
|
-
message: 'Select testing framework:',
|
|
141
|
-
choices: [
|
|
142
|
-
{ name: 'Vitest (recommended)', value: 'vitest' },
|
|
143
|
-
{ name: 'Jest', value: 'jest' },
|
|
144
|
-
{ name: 'Playwright (E2E)', value: 'playwright' },
|
|
145
|
-
],
|
|
146
|
-
default: 'vitest',
|
|
147
|
-
});
|
|
148
|
-
// 3. Prompt for git hooks
|
|
149
|
-
const useGitHooks = await confirm({
|
|
150
|
-
message: 'Enable git hooks for spec validation?',
|
|
151
|
-
default: true,
|
|
152
|
-
});
|
|
153
|
-
spinner.start('Creating project structure...');
|
|
154
|
-
// Create directory structure (relative to projectDir)
|
|
155
|
-
await mkdir(join(projectDir, 'specs/active'), { recursive: true });
|
|
156
|
-
await mkdir(join(projectDir, 'specs/completed'), { recursive: true });
|
|
157
|
-
await mkdir(join(projectDir, 'specs/archive'), { recursive: true });
|
|
158
|
-
await mkdir(join(projectDir, 'specs/drafts'), { recursive: true });
|
|
159
|
-
await mkdir(join(projectDir, 'specs/exploration'), { recursive: true });
|
|
160
|
-
await mkdir(join(projectDir, 'src'), { recursive: true });
|
|
161
|
-
await mkdir(join(projectDir, 'tests'), { recursive: true });
|
|
162
|
-
// Create PROJECT_STATE.md
|
|
163
|
-
const tracker = new ProjectTracker(projectDir);
|
|
164
|
-
await tracker.initialize(name);
|
|
165
|
-
// Create spec template
|
|
166
|
-
const template = `# Spec Template
|
|
167
|
-
|
|
168
|
-
## Metadata
|
|
169
|
-
- **ID**: SPEC-{YYYYMMDD}-{NNN}
|
|
170
|
-
- **Status**: draft
|
|
171
|
-
- **Priority**: P1
|
|
172
|
-
|
|
173
|
-
## 1. Purpose (WHY)
|
|
174
|
-
|
|
175
|
-
## 2. Scope (WHAT)
|
|
176
|
-
### In Scope
|
|
177
|
-
-
|
|
178
|
-
|
|
179
|
-
### Out of Scope
|
|
180
|
-
-
|
|
181
|
-
|
|
182
|
-
## 3. Requirements
|
|
183
|
-
| ID | Requirement | Priority | Acceptance Criteria |
|
|
184
|
-
|----|-------------|----------|---------------------|
|
|
185
|
-
| | | | |
|
|
186
|
-
|
|
187
|
-
## 4. Technical Approach (HOW)
|
|
188
|
-
|
|
189
|
-
## 5. Test Strategy
|
|
190
|
-
|
|
191
|
-
## 6. Implementation Plan
|
|
192
|
-
|
|
193
|
-
## 7. Success Criteria
|
|
194
|
-
- [ ]
|
|
195
|
-
|
|
196
|
-
## 8. Risks & Mitigations
|
|
197
|
-
|
|
198
|
-
## 9. Notes & References
|
|
199
|
-
`;
|
|
200
|
-
await writeFile(join(projectDir, 'specs/template.md'), template);
|
|
201
|
-
// Create config file with selected agents
|
|
202
|
-
const agentsConfig = {};
|
|
203
|
-
for (const agentId of selectedAgents) {
|
|
204
|
-
agentsConfig[agentId] = { enabled: true };
|
|
205
|
-
}
|
|
206
|
-
const config = {
|
|
207
|
-
project: name,
|
|
208
|
-
version: '1.0.0',
|
|
209
|
-
stages: ['explore', 'draft', 'spec', 'test-create', 'test-apply', 'verify', 'complete'],
|
|
210
|
-
testFramework,
|
|
211
|
-
language: 'typescript',
|
|
212
|
-
agents: agentsConfig,
|
|
213
|
-
gitHooks: {
|
|
214
|
-
enabled: useGitHooks,
|
|
215
|
-
},
|
|
216
|
-
};
|
|
217
|
-
await writeFile(join(projectDir, 'specsafe.config.json'), JSON.stringify(config, null, 2));
|
|
218
|
-
spinner.text = 'Generating agent configurations...';
|
|
219
|
-
// Generate configs for selected agents
|
|
220
|
-
await generateAgentConfigs(selectedAgents, projectDir, name);
|
|
221
|
-
// Generate git hooks if enabled
|
|
222
|
-
if (useGitHooks) {
|
|
223
|
-
const hooksDir = join(projectDir, '.githooks');
|
|
224
|
-
await mkdir(hooksDir, { recursive: true });
|
|
225
|
-
const preCommitPath = join(hooksDir, 'pre-commit');
|
|
226
|
-
if (!existsSync(preCommitPath)) {
|
|
227
|
-
const preCommitContent = `#!/bin/bash
|
|
228
|
-
# SpecSafe pre-commit hook v1.0
|
|
229
|
-
set -e
|
|
230
|
-
|
|
231
|
-
echo "Running SpecSafe pre-commit checks..."
|
|
232
|
-
|
|
233
|
-
# Check PROJECT_STATE.md exists
|
|
234
|
-
if [ ! -f "PROJECT_STATE.md" ]; then
|
|
235
|
-
echo "PROJECT_STATE.md not found."
|
|
236
|
-
exit 1
|
|
237
|
-
fi
|
|
238
|
-
|
|
239
|
-
# Run specsafe doctor if available
|
|
240
|
-
if command -v specsafe >/dev/null 2>&1; then
|
|
241
|
-
specsafe doctor --silent || true
|
|
242
|
-
fi
|
|
243
|
-
|
|
244
|
-
echo "Pre-commit checks passed"
|
|
245
|
-
exit 0
|
|
246
|
-
`;
|
|
247
|
-
await writeFile(preCommitPath, preCommitContent);
|
|
248
|
-
// Make the hook executable
|
|
249
|
-
await chmod(preCommitPath, 0o755);
|
|
250
|
-
// Configure git to use .githooks directory
|
|
251
|
-
try {
|
|
252
|
-
execSync('git config --local core.hooksPath .githooks', { cwd: projectDir });
|
|
253
|
-
console.log(chalk.green(' ā Created .githooks/pre-commit'));
|
|
254
|
-
}
|
|
255
|
-
catch (err) {
|
|
256
|
-
console.log(chalk.yellow(' ā Created .githooks/pre-commit (run: git config --local core.hooksPath .githooks)'));
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
}
|
|
260
|
-
spinner.succeed(chalk.green(`Initialized SpecSafe project: ${name}`));
|
|
261
|
-
console.log('\n' + chalk.blue('Generated configurations:'));
|
|
262
|
-
for (const agentId of selectedAgents) {
|
|
263
|
-
const agentDef = AGENT_DEFINITIONS.find((a) => a.id === agentId);
|
|
264
|
-
console.log(chalk.green(` ā ${agentDef?.name || agentId}`));
|
|
265
|
-
}
|
|
266
|
-
if (useGitHooks) {
|
|
267
|
-
console.log(chalk.green(' ā Git hooks enabled'));
|
|
268
|
-
}
|
|
269
|
-
console.log(chalk.green(` ā ${testFramework} configuration`));
|
|
270
|
-
console.log('\n' + chalk.blue('Next steps:'));
|
|
271
|
-
console.log(' 1. specsafe new <spec-name> - Create a new spec');
|
|
272
|
-
console.log(' 2. specsafe status - View project status');
|
|
273
|
-
console.log(' 3. Edit specs/active/ to define requirements');
|
|
274
|
-
if (selectedAgents.length > 0) {
|
|
275
|
-
console.log('\n' + chalk.blue('Agent commands:'));
|
|
276
|
-
for (const agentId of selectedAgents.slice(0, 3)) {
|
|
277
|
-
const agentEntry = getAgent(agentId);
|
|
278
|
-
if (agentEntry) {
|
|
279
|
-
// Use regex for whole-word replacement
|
|
280
|
-
const cmdFormat = agentEntry.commandFormat.replace(/\bcommand\b/, 'specsafe');
|
|
281
|
-
console.log(` ${agentEntry.name}: ${cmdFormat}`);
|
|
282
|
-
}
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
}
|
|
286
|
-
catch (error) {
|
|
287
|
-
spinner.fail(chalk.red(`Failed to initialize: ${error.message}`));
|
|
288
|
-
if (error.message.includes('EEXIST')) {
|
|
289
|
-
console.log(chalk.gray("š” Tip: Directory already exists."));
|
|
290
|
-
}
|
|
291
|
-
if (error.message.includes('User force closed')) {
|
|
292
|
-
console.log(chalk.gray('š” Tip: Init was cancelled by user.'));
|
|
293
|
-
process.exit(0);
|
|
294
|
-
}
|
|
295
|
-
process.exit(1);
|
|
296
|
-
}
|
|
297
|
-
});
|
|
298
|
-
//# sourceMappingURL=init.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/list.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,eAAO,MAAM,WAAW,SA+GpB,CAAC"}
|
package/dist/commands/list.js
DELETED
|
@@ -1,122 +0,0 @@
|
|
|
1
|
-
import { Command } from 'commander';
|
|
2
|
-
import chalk from 'chalk';
|
|
3
|
-
import ora from 'ora';
|
|
4
|
-
import { ProjectTracker } from '@specsafe/core';
|
|
5
|
-
import { loadConfig } from '../config.js';
|
|
6
|
-
export const listCommand = new Command('list')
|
|
7
|
-
.description('List all specs from PROJECT_STATE.md')
|
|
8
|
-
.option('--stage <stage>', 'Filter by stage (spec, test, code, qa, complete, archived)')
|
|
9
|
-
.option('--json', 'Output as JSON')
|
|
10
|
-
.action(async (options) => {
|
|
11
|
-
const spinner = ora('Loading specs...').start();
|
|
12
|
-
try {
|
|
13
|
-
const config = await loadConfig();
|
|
14
|
-
const tracker = new ProjectTracker(process.cwd());
|
|
15
|
-
const state = await tracker.readState();
|
|
16
|
-
if (!state) {
|
|
17
|
-
spinner.stop();
|
|
18
|
-
console.log(chalk.yellow('No SpecSafe project found.'));
|
|
19
|
-
console.log(chalk.gray('š” Tip: Run "specsafe init" to initialize a new project.'));
|
|
20
|
-
process.exit(1);
|
|
21
|
-
}
|
|
22
|
-
spinner.stop();
|
|
23
|
-
// Filter specs if stage option is provided
|
|
24
|
-
let specs = state.specs;
|
|
25
|
-
if (options.stage) {
|
|
26
|
-
const stage = options.stage.toLowerCase();
|
|
27
|
-
const validStages = ['spec', 'test', 'code', 'qa', 'complete', 'archived'];
|
|
28
|
-
if (!validStages.includes(stage)) {
|
|
29
|
-
console.error(chalk.red(`Invalid stage: ${options.stage}`));
|
|
30
|
-
console.log(chalk.gray(`Valid stages: ${validStages.join(', ')}`));
|
|
31
|
-
process.exit(1);
|
|
32
|
-
}
|
|
33
|
-
specs = specs.filter(s => s.stage === stage);
|
|
34
|
-
}
|
|
35
|
-
// Sort by last updated (most recent first)
|
|
36
|
-
specs = specs.sort((a, b) => b.lastUpdated.getTime() - a.lastUpdated.getTime());
|
|
37
|
-
// Output as JSON if requested
|
|
38
|
-
if (options.json) {
|
|
39
|
-
const output = specs.map(s => ({
|
|
40
|
-
id: s.id,
|
|
41
|
-
name: s.name,
|
|
42
|
-
stage: s.stage,
|
|
43
|
-
progress: s.progress,
|
|
44
|
-
lastUpdated: s.lastUpdated.toISOString(),
|
|
45
|
-
createdAt: s.createdAt?.toISOString(),
|
|
46
|
-
completedAt: s.completedAt?.toISOString()
|
|
47
|
-
}));
|
|
48
|
-
console.log(JSON.stringify(output, null, 2));
|
|
49
|
-
return;
|
|
50
|
-
}
|
|
51
|
-
// Table output
|
|
52
|
-
if (specs.length === 0) {
|
|
53
|
-
console.log(chalk.yellow('\nNo specs found.'));
|
|
54
|
-
if (options.stage) {
|
|
55
|
-
console.log(chalk.gray(`No specs in stage: ${options.stage.toUpperCase()}`));
|
|
56
|
-
}
|
|
57
|
-
else {
|
|
58
|
-
console.log(chalk.gray('Create your first spec with: specsafe new <name>'));
|
|
59
|
-
}
|
|
60
|
-
console.log();
|
|
61
|
-
return;
|
|
62
|
-
}
|
|
63
|
-
console.log(chalk.bold.blue(`\nš ${config.projectName} - Specs (${specs.length})\n`));
|
|
64
|
-
// Print table header
|
|
65
|
-
console.log(chalk.bold('ID Name Stage Progress Last Updated'));
|
|
66
|
-
console.log(chalk.gray('ā'.repeat(90)));
|
|
67
|
-
// Print specs
|
|
68
|
-
specs.forEach((spec) => {
|
|
69
|
-
const stageColor = getStageColor(spec.stage);
|
|
70
|
-
const id = spec.id.padEnd(18);
|
|
71
|
-
const name = spec.name.slice(0, 28).padEnd(30);
|
|
72
|
-
const stage = stageColor(spec.stage.toUpperCase().padEnd(10));
|
|
73
|
-
const progress = `${spec.progress}%`.padEnd(8);
|
|
74
|
-
const lastUpdated = spec.lastUpdated.toISOString().split('T')[0];
|
|
75
|
-
console.log(`${id} ${name} ${stage} ${progress} ${lastUpdated}`);
|
|
76
|
-
});
|
|
77
|
-
console.log();
|
|
78
|
-
// Print summary by stage
|
|
79
|
-
const stages = ['spec', 'test', 'code', 'qa', 'complete', 'archived'];
|
|
80
|
-
const byStage = stages.map(s => ({
|
|
81
|
-
stage: s,
|
|
82
|
-
count: state.specs.filter(spec => spec.stage === s).length
|
|
83
|
-
})).filter(s => s.count > 0);
|
|
84
|
-
if (byStage.length > 0 && !options.stage) {
|
|
85
|
-
console.log(chalk.bold('Summary:'));
|
|
86
|
-
byStage.forEach(({ stage, count }) => {
|
|
87
|
-
const color = getStageColor(stage);
|
|
88
|
-
console.log(` ${color(stage.toUpperCase().padEnd(10))} ${count}`);
|
|
89
|
-
});
|
|
90
|
-
console.log();
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
catch (error) {
|
|
94
|
-
spinner.fail(chalk.red(error.message));
|
|
95
|
-
if (error.message.includes('PROJECT_STATE') || error.message.includes('not found')) {
|
|
96
|
-
console.log(chalk.gray('š” Tip: Run "specsafe init" to initialize the project.'));
|
|
97
|
-
}
|
|
98
|
-
else if (error.message.includes('Invalid stage')) {
|
|
99
|
-
console.log(chalk.gray('š” Tip: Valid stages: spec, test, code, qa, complete, archived'));
|
|
100
|
-
}
|
|
101
|
-
process.exit(1);
|
|
102
|
-
}
|
|
103
|
-
});
|
|
104
|
-
function getStageColor(stage) {
|
|
105
|
-
switch (stage) {
|
|
106
|
-
case 'complete':
|
|
107
|
-
return chalk.green;
|
|
108
|
-
case 'archived':
|
|
109
|
-
return chalk.gray;
|
|
110
|
-
case 'qa':
|
|
111
|
-
return chalk.magenta;
|
|
112
|
-
case 'code':
|
|
113
|
-
return chalk.yellow;
|
|
114
|
-
case 'test':
|
|
115
|
-
return chalk.cyan;
|
|
116
|
-
case 'spec':
|
|
117
|
-
return chalk.blue;
|
|
118
|
-
default:
|
|
119
|
-
return chalk.white;
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
//# sourceMappingURL=list.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../src/commands/memory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,eAAO,MAAM,aAAa,SAwLvB,CAAC"}
|