@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.
Files changed (242) hide show
  1. package/README.md +100 -279
  2. package/canonical/personas/bolt-zane.md +29 -0
  3. package/canonical/personas/forge-reva.md +29 -0
  4. package/canonical/personas/herald-cass.md +30 -0
  5. package/canonical/personas/mason-kai.md +30 -0
  6. package/canonical/personas/scout-elena.md +27 -0
  7. package/canonical/personas/warden-lyra.md +30 -0
  8. package/canonical/rules/.cursorrules.mdc +53 -0
  9. package/canonical/rules/.rules +48 -0
  10. package/canonical/rules/AGENTS.md +48 -0
  11. package/canonical/rules/CLAUDE.md +48 -0
  12. package/canonical/rules/CONVENTIONS.md +41 -0
  13. package/canonical/rules/GEMINI.md +50 -0
  14. package/canonical/rules/continue-config.yaml +5 -0
  15. package/canonical/skills/specsafe-archive/SKILL.md +63 -0
  16. package/canonical/skills/specsafe-code/SKILL.md +7 -0
  17. package/canonical/skills/specsafe-code/workflow.md +212 -0
  18. package/canonical/skills/specsafe-complete/SKILL.md +7 -0
  19. package/canonical/skills/specsafe-complete/workflow.md +130 -0
  20. package/canonical/skills/specsafe-doctor/SKILL.md +103 -0
  21. package/canonical/skills/specsafe-explore/SKILL.md +7 -0
  22. package/canonical/skills/specsafe-explore/workflow.md +100 -0
  23. package/canonical/skills/specsafe-init/SKILL.md +119 -0
  24. package/canonical/skills/specsafe-new/SKILL.md +7 -0
  25. package/canonical/skills/specsafe-new/workflow.md +156 -0
  26. package/canonical/skills/specsafe-qa/SKILL.md +7 -0
  27. package/canonical/skills/specsafe-qa/workflow.md +223 -0
  28. package/canonical/skills/specsafe-spec/SKILL.md +7 -0
  29. package/canonical/skills/specsafe-spec/workflow.md +158 -0
  30. package/canonical/skills/specsafe-status/SKILL.md +77 -0
  31. package/canonical/skills/specsafe-test/SKILL.md +7 -0
  32. package/canonical/skills/specsafe-test/workflow.md +210 -0
  33. package/canonical/skills/specsafe-verify/SKILL.md +7 -0
  34. package/canonical/skills/specsafe-verify/workflow.md +143 -0
  35. package/canonical/templates/project-state-template.md +33 -0
  36. package/canonical/templates/qa-report-template.md +55 -0
  37. package/canonical/templates/spec-template.md +52 -0
  38. package/canonical/templates/specsafe-config-template.json +10 -0
  39. package/generators/dist/adapters/aider.d.ts +2 -0
  40. package/generators/dist/adapters/aider.js +23 -0
  41. package/generators/dist/adapters/aider.js.map +1 -0
  42. package/generators/dist/adapters/antigravity.d.ts +2 -0
  43. package/generators/dist/adapters/antigravity.js +33 -0
  44. package/generators/dist/adapters/antigravity.js.map +1 -0
  45. package/generators/dist/adapters/claude-code.d.ts +2 -0
  46. package/generators/dist/adapters/claude-code.js +31 -0
  47. package/generators/dist/adapters/claude-code.js.map +1 -0
  48. package/generators/dist/adapters/continue.d.ts +2 -0
  49. package/generators/dist/adapters/continue.js +33 -0
  50. package/generators/dist/adapters/continue.js.map +1 -0
  51. package/generators/dist/adapters/cursor.d.ts +2 -0
  52. package/generators/dist/adapters/cursor.js +32 -0
  53. package/generators/dist/adapters/cursor.js.map +1 -0
  54. package/generators/dist/adapters/gemini.d.ts +2 -0
  55. package/generators/dist/adapters/gemini.js +36 -0
  56. package/generators/dist/adapters/gemini.js.map +1 -0
  57. package/generators/dist/adapters/index.d.ts +13 -0
  58. package/generators/dist/adapters/index.js +29 -0
  59. package/generators/dist/adapters/index.js.map +1 -0
  60. package/generators/dist/adapters/opencode.d.ts +2 -0
  61. package/generators/dist/adapters/opencode.js +32 -0
  62. package/generators/dist/adapters/opencode.js.map +1 -0
  63. package/generators/dist/adapters/types.d.ts +49 -0
  64. package/generators/dist/adapters/types.js +14 -0
  65. package/generators/dist/adapters/types.js.map +1 -0
  66. package/generators/dist/adapters/utils.d.ts +12 -0
  67. package/generators/dist/adapters/utils.js +68 -0
  68. package/generators/dist/adapters/utils.js.map +1 -0
  69. package/generators/dist/adapters/zed.d.ts +2 -0
  70. package/generators/dist/adapters/zed.js +31 -0
  71. package/generators/dist/adapters/zed.js.map +1 -0
  72. package/generators/dist/doctor.d.ts +10 -0
  73. package/generators/dist/doctor.js +123 -0
  74. package/generators/dist/doctor.js.map +1 -0
  75. package/generators/dist/index.d.ts +2 -0
  76. package/generators/dist/index.js +45 -0
  77. package/generators/dist/index.js.map +1 -0
  78. package/generators/dist/init.d.ts +9 -0
  79. package/generators/dist/init.js +167 -0
  80. package/generators/dist/init.js.map +1 -0
  81. package/generators/dist/install.d.ts +5 -0
  82. package/generators/dist/install.js +66 -0
  83. package/generators/dist/install.js.map +1 -0
  84. package/generators/dist/registry.d.ts +3 -0
  85. package/generators/dist/registry.js +8 -0
  86. package/generators/dist/registry.js.map +1 -0
  87. package/generators/dist/update.d.ts +5 -0
  88. package/generators/dist/update.js +40 -0
  89. package/generators/dist/update.js.map +1 -0
  90. package/package.json +31 -27
  91. package/dist/commands/apply.d.ts +0 -3
  92. package/dist/commands/apply.d.ts.map +0 -1
  93. package/dist/commands/apply.js +0 -182
  94. package/dist/commands/apply.js.map +0 -1
  95. package/dist/commands/archive.d.ts +0 -3
  96. package/dist/commands/archive.d.ts.map +0 -1
  97. package/dist/commands/archive.js +0 -99
  98. package/dist/commands/archive.js.map +0 -1
  99. package/dist/commands/capsule.d.ts +0 -8
  100. package/dist/commands/capsule.d.ts.map +0 -1
  101. package/dist/commands/capsule.js +0 -466
  102. package/dist/commands/capsule.js.map +0 -1
  103. package/dist/commands/complete.d.ts +0 -3
  104. package/dist/commands/complete.d.ts.map +0 -1
  105. package/dist/commands/complete.js +0 -140
  106. package/dist/commands/complete.js.map +0 -1
  107. package/dist/commands/constitution.d.ts +0 -3
  108. package/dist/commands/constitution.d.ts.map +0 -1
  109. package/dist/commands/constitution.js +0 -192
  110. package/dist/commands/constitution.js.map +0 -1
  111. package/dist/commands/create.d.ts +0 -10
  112. package/dist/commands/create.d.ts.map +0 -1
  113. package/dist/commands/create.js +0 -120
  114. package/dist/commands/create.js.map +0 -1
  115. package/dist/commands/delta.d.ts +0 -3
  116. package/dist/commands/delta.d.ts.map +0 -1
  117. package/dist/commands/delta.js +0 -82
  118. package/dist/commands/delta.js.map +0 -1
  119. package/dist/commands/diff.d.ts +0 -3
  120. package/dist/commands/diff.d.ts.map +0 -1
  121. package/dist/commands/diff.js +0 -102
  122. package/dist/commands/diff.js.map +0 -1
  123. package/dist/commands/doctor.d.ts +0 -3
  124. package/dist/commands/doctor.d.ts.map +0 -1
  125. package/dist/commands/doctor.js +0 -204
  126. package/dist/commands/doctor.js.map +0 -1
  127. package/dist/commands/done.d.ts +0 -3
  128. package/dist/commands/done.d.ts.map +0 -1
  129. package/dist/commands/done.js +0 -237
  130. package/dist/commands/done.js.map +0 -1
  131. package/dist/commands/explore.d.ts +0 -3
  132. package/dist/commands/explore.d.ts.map +0 -1
  133. package/dist/commands/explore.js +0 -236
  134. package/dist/commands/explore.js.map +0 -1
  135. package/dist/commands/export.d.ts +0 -7
  136. package/dist/commands/export.d.ts.map +0 -1
  137. package/dist/commands/export.js +0 -179
  138. package/dist/commands/export.js.map +0 -1
  139. package/dist/commands/extend.d.ts +0 -6
  140. package/dist/commands/extend.d.ts.map +0 -1
  141. package/dist/commands/extend.js +0 -167
  142. package/dist/commands/extend.js.map +0 -1
  143. package/dist/commands/init-old.d.ts +0 -3
  144. package/dist/commands/init-old.d.ts.map +0 -1
  145. package/dist/commands/init-old.js +0 -146
  146. package/dist/commands/init-old.js.map +0 -1
  147. package/dist/commands/init.d.ts +0 -3
  148. package/dist/commands/init.d.ts.map +0 -1
  149. package/dist/commands/init.js +0 -298
  150. package/dist/commands/init.js.map +0 -1
  151. package/dist/commands/list.d.ts +0 -3
  152. package/dist/commands/list.d.ts.map +0 -1
  153. package/dist/commands/list.js +0 -122
  154. package/dist/commands/list.js.map +0 -1
  155. package/dist/commands/memory.d.ts +0 -3
  156. package/dist/commands/memory.d.ts.map +0 -1
  157. package/dist/commands/memory.js +0 -166
  158. package/dist/commands/memory.js.map +0 -1
  159. package/dist/commands/new.d.ts +0 -3
  160. package/dist/commands/new.d.ts.map +0 -1
  161. package/dist/commands/new.js +0 -508
  162. package/dist/commands/new.js.map +0 -1
  163. package/dist/commands/qa.d.ts +0 -3
  164. package/dist/commands/qa.d.ts.map +0 -1
  165. package/dist/commands/qa.js +0 -179
  166. package/dist/commands/qa.js.map +0 -1
  167. package/dist/commands/rules.d.ts +0 -6
  168. package/dist/commands/rules.d.ts.map +0 -1
  169. package/dist/commands/rules.js +0 -232
  170. package/dist/commands/rules.js.map +0 -1
  171. package/dist/commands/shard.d.ts +0 -6
  172. package/dist/commands/shard.d.ts.map +0 -1
  173. package/dist/commands/shard.js +0 -199
  174. package/dist/commands/shard.js.map +0 -1
  175. package/dist/commands/spec.d.ts +0 -3
  176. package/dist/commands/spec.d.ts.map +0 -1
  177. package/dist/commands/spec.js +0 -302
  178. package/dist/commands/spec.js.map +0 -1
  179. package/dist/commands/status.d.ts +0 -3
  180. package/dist/commands/status.d.ts.map +0 -1
  181. package/dist/commands/status.js +0 -47
  182. package/dist/commands/status.js.map +0 -1
  183. package/dist/commands/test-apply.d.ts +0 -3
  184. package/dist/commands/test-apply.d.ts.map +0 -1
  185. package/dist/commands/test-apply.js +0 -228
  186. package/dist/commands/test-apply.js.map +0 -1
  187. package/dist/commands/test-create.d.ts +0 -3
  188. package/dist/commands/test-create.d.ts.map +0 -1
  189. package/dist/commands/test-create.js +0 -183
  190. package/dist/commands/test-create.js.map +0 -1
  191. package/dist/commands/test-guide.d.ts +0 -3
  192. package/dist/commands/test-guide.d.ts.map +0 -1
  193. package/dist/commands/test-guide.js +0 -190
  194. package/dist/commands/test-guide.js.map +0 -1
  195. package/dist/commands/test-report.d.ts +0 -3
  196. package/dist/commands/test-report.d.ts.map +0 -1
  197. package/dist/commands/test-report.js +0 -196
  198. package/dist/commands/test-report.js.map +0 -1
  199. package/dist/commands/test-submit.d.ts +0 -6
  200. package/dist/commands/test-submit.d.ts.map +0 -1
  201. package/dist/commands/test-submit.js +0 -236
  202. package/dist/commands/test-submit.js.map +0 -1
  203. package/dist/commands/verify.d.ts +0 -3
  204. package/dist/commands/verify.d.ts.map +0 -1
  205. package/dist/commands/verify.js +0 -288
  206. package/dist/commands/verify.js.map +0 -1
  207. package/dist/config.d.ts +0 -23
  208. package/dist/config.d.ts.map +0 -1
  209. package/dist/config.js +0 -44
  210. package/dist/config.js.map +0 -1
  211. package/dist/index.d.ts +0 -8
  212. package/dist/index.d.ts.map +0 -1
  213. package/dist/index.js +0 -129
  214. package/dist/index.js.map +0 -1
  215. package/dist/rules/downloader.d.ts +0 -40
  216. package/dist/rules/downloader.d.ts.map +0 -1
  217. package/dist/rules/downloader.js +0 -253
  218. package/dist/rules/downloader.js.map +0 -1
  219. package/dist/rules/index.d.ts +0 -8
  220. package/dist/rules/index.d.ts.map +0 -1
  221. package/dist/rules/index.js +0 -8
  222. package/dist/rules/index.js.map +0 -1
  223. package/dist/rules/registry.d.ts +0 -45
  224. package/dist/rules/registry.d.ts.map +0 -1
  225. package/dist/rules/registry.js +0 -158
  226. package/dist/rules/registry.js.map +0 -1
  227. package/dist/rules/types.d.ts +0 -86
  228. package/dist/rules/types.d.ts.map +0 -1
  229. package/dist/rules/types.js +0 -6
  230. package/dist/rules/types.js.map +0 -1
  231. package/dist/utils/detectTools.d.ts +0 -15
  232. package/dist/utils/detectTools.d.ts.map +0 -1
  233. package/dist/utils/detectTools.js +0 -54
  234. package/dist/utils/detectTools.js.map +0 -1
  235. package/dist/utils/generateToolConfig.d.ts +0 -12
  236. package/dist/utils/generateToolConfig.d.ts.map +0 -1
  237. package/dist/utils/generateToolConfig.js +0 -1179
  238. package/dist/utils/generateToolConfig.js.map +0 -1
  239. package/dist/utils/testRunner.d.ts +0 -39
  240. package/dist/utils/testRunner.d.ts.map +0 -1
  241. package/dist/utils/testRunner.js +0 -325
  242. 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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"}
@@ -1,3 +0,0 @@
1
- import { Command } from 'commander';
2
- export declare const initCommand: Command;
3
- //# sourceMappingURL=init.d.ts.map
@@ -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"}
@@ -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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"}
@@ -1,3 +0,0 @@
1
- import { Command } from 'commander';
2
- export declare const listCommand: Command;
3
- //# sourceMappingURL=list.d.ts.map
@@ -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"}
@@ -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,3 +0,0 @@
1
- import { Command } from 'commander';
2
- export declare const memoryCommand: Command;
3
- //# sourceMappingURL=memory.d.ts.map
@@ -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"}