@specsafe/cli 0.7.1 → 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 +32 -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,508 +0,0 @@
1
- import { Command } from 'commander';
2
- import chalk from 'chalk';
3
- import ora from 'ora';
4
- import { writeFile, mkdir, readdir } from 'fs/promises';
5
- import { join, basename } from 'path';
6
- import { Workflow, ProjectTracker, generateEARSTemplate, SteeringEngine, ProjectMemoryManager } from '@specsafe/core';
7
- import { input, editor, select } from '@inquirer/prompts';
8
- export const newCommand = new Command('new')
9
- .description('Create a new spec with interactive PRD creation')
10
- .argument('[name]', 'Spec name (kebab-case)')
11
- .option('-d, --description <desc>', 'Spec description')
12
- .option('-a, --author <author>', 'Author name', 'developer')
13
- .option('-n, --dry-run', 'Preview changes without writing files')
14
- .option('--skip-interactive', 'Skip interactive prompts and use defaults')
15
- .option('--ears', 'Use EARS (Easy Approach to Requirements Syntax) template')
16
- .action(async (name, options) => {
17
- const spinner = ora('Creating new spec...').start();
18
- try {
19
- const workflow = new Workflow();
20
- const tracker = new ProjectTracker(process.cwd());
21
- // Generate spec ID with auto-increment to avoid collisions
22
- const date = new Date().toISOString().split('T')[0].replace(/-/g, '');
23
- // Check if specs/active directory exists
24
- try {
25
- await readdir('specs/active');
26
- }
27
- catch (err) {
28
- if (err.code === 'ENOENT') {
29
- throw new Error('specs/active/ directory not found. Run "specsafe init" first to initialize the project.');
30
- }
31
- throw err;
32
- }
33
- // List existing specs for today and find max suffix
34
- let maxSuffix = 0;
35
- try {
36
- const files = await readdir('specs/active');
37
- const todayPrefix = `SPEC-${date}-`;
38
- for (const file of files) {
39
- if (file.startsWith(todayPrefix) && file.endsWith('.md')) {
40
- const suffix = parseInt(file.replace(todayPrefix, '').replace('.md', ''), 10);
41
- if (!isNaN(suffix) && suffix > maxSuffix) {
42
- maxSuffix = suffix;
43
- }
44
- }
45
- }
46
- }
47
- catch {
48
- // Directory doesn't exist yet, that's fine
49
- }
50
- const id = `SPEC-${date}-${String(maxSuffix + 1).padStart(3, '0')}`;
51
- // Load project memory for context
52
- let steeringEngine = null;
53
- let memoryContext = null;
54
- try {
55
- steeringEngine = new SteeringEngine(process.cwd());
56
- await steeringEngine.initialize(basename(process.cwd()));
57
- const analysis = steeringEngine.analyze({ currentSpec: id });
58
- // Get top patterns
59
- const patterns = steeringEngine.recommendPatterns(id, 3).map(p => ({
60
- name: p.name,
61
- usageCount: p.usageCount,
62
- description: p.description
63
- }));
64
- memoryContext = {
65
- patterns,
66
- warnings: analysis.warnings,
67
- recommendations: analysis.recommendations
68
- };
69
- }
70
- catch {
71
- // Memory not available yet, that's fine
72
- }
73
- // Interactive mode or defaults
74
- spinner.stop();
75
- // Get feature name if not provided
76
- let featureName = name;
77
- if (!featureName && !options.skipInteractive) {
78
- featureName = await input({
79
- message: 'Feature name (kebab-case):',
80
- validate: (value) => value.length > 0 || 'Feature name is required'
81
- });
82
- }
83
- else if (!featureName) {
84
- featureName = 'untitled-feature';
85
- }
86
- // Display project memory context if available
87
- if (memoryContext && (memoryContext.patterns.length > 0 || memoryContext.recommendations.length > 0)) {
88
- console.log(chalk.blue('\n🧠 Project Memory Context\n'));
89
- if (memoryContext.patterns.length > 0) {
90
- console.log(chalk.cyan('Reusable patterns from project:'));
91
- for (const pattern of memoryContext.patterns) {
92
- const color = pattern.usageCount >= 3 ? chalk.green : chalk.yellow;
93
- console.log(color(` • ${pattern.name} ${chalk.gray(`(${pattern.usageCount} specs)`)}`));
94
- console.log(chalk.gray(` ${pattern.description}`));
95
- }
96
- console.log();
97
- }
98
- if (memoryContext.recommendations.length > 0) {
99
- console.log(chalk.cyan('Recommendations:'));
100
- for (const rec of memoryContext.recommendations.slice(0, 3)) {
101
- const icon = rec.confidence === 'high' ? '✓' : rec.confidence === 'medium' ? '~' : '?';
102
- console.log(chalk.gray(` ${icon} ${rec.message}`));
103
- }
104
- console.log();
105
- }
106
- if (memoryContext.warnings.length > 0) {
107
- const highSeverity = memoryContext.warnings.filter(w => w.severity === 'high');
108
- if (highSeverity.length > 0) {
109
- console.log(chalk.yellow('⚠️ Warnings:'));
110
- for (const warning of highSeverity.slice(0, 2)) {
111
- console.log(chalk.yellow(` • ${warning.message}`));
112
- }
113
- console.log();
114
- }
115
- }
116
- console.log(chalk.gray('─'.repeat(63)));
117
- }
118
- // Interactive PRD + BRD creation
119
- let problemStatement = '';
120
- let userStories = '';
121
- let acceptanceCriteria = '';
122
- let technicalConsiderations = '';
123
- let businessJustification = '';
124
- let successMetrics = '';
125
- let stakeholders = '';
126
- let timeline = '';
127
- let priority = 'P1';
128
- if (!options.skipInteractive && !options.dryRun && !options.ears) {
129
- console.log(chalk.blue('\n📋 Let\'s create a Product Requirements Document (PRD)\n'));
130
- problemStatement = await editor({
131
- message: 'Problem Statement (what problem does this solve?):',
132
- default: '<!-- Describe the problem this feature solves -->'
133
- });
134
- userStories = await editor({
135
- message: 'User Stories (who benefits and how?):',
136
- default: `As a [type of user]
137
- I want [some goal]
138
- So that [some reason]
139
-
140
- <!-- Add more user stories as needed -->`
141
- });
142
- acceptanceCriteria = await editor({
143
- message: 'Acceptance Criteria (how do we know it\'s done?):',
144
- default: `- [ ] Criterion 1
145
- - [ ] Criterion 2
146
- - [ ] Criterion 3`
147
- });
148
- technicalConsiderations = await editor({
149
- message: 'Technical Requirements (dependencies, constraints, stack):',
150
- default: `<!-- Technical constraints, dependencies, integrations needed -->
151
- - Required APIs:
152
- - Data storage:
153
- - Security requirements:`
154
- });
155
- console.log(chalk.blue('\n💼 Now let\'s create a Business Requirements Document (BRD)\n'));
156
- businessJustification = await editor({
157
- message: 'Business Justification (why invest in this?):',
158
- default: `<!-- Why should we build this? Business value, market need, strategic alignment -->`
159
- });
160
- successMetrics = await editor({
161
- message: 'Success Metrics (how do we measure success?):',
162
- default: `- Metric 1: [e.g., "Reduce processing time by 50%"]
163
- - Metric 2: [e.g., "Increase user engagement by 20%"]
164
- - Metric 3: [e.g., "Zero critical bugs in production"]`
165
- });
166
- stakeholders = await editor({
167
- message: 'Stakeholders (who cares about this?):',
168
- default: `| Role | Name/Team | Responsibility |
169
- |------|-----------|----------------|
170
- | Product Owner | | Decision maker |
171
- | Engineering Lead | | Technical oversight |
172
- | QA Lead | | Quality assurance |`
173
- });
174
- timeline = await editor({
175
- message: 'Timeline (key milestones):',
176
- default: `| Phase | Milestone | Target Date |
177
- |-------|-----------|-------------|
178
- | 1 | Requirements final | |
179
- | 2 | Development complete | |
180
- | 3 | QA complete | |
181
- | 4 | Release | |`
182
- });
183
- priority = await select({
184
- message: 'Priority:',
185
- choices: [
186
- { name: 'P0 - Critical (blocks release)', value: 'P0' },
187
- { name: 'P1 - High (should have)', value: 'P1' },
188
- { name: 'P2 - Medium (nice to have)', value: 'P2' },
189
- ],
190
- default: 'P1'
191
- });
192
- }
193
- spinner.start('Creating spec files...');
194
- // Create spec
195
- const spec = workflow.createSpec(id, featureName, options.description || `Spec for ${featureName}`, options.author, basename(process.cwd()));
196
- // Use EARS template if requested
197
- let specContent;
198
- if (options.ears) {
199
- specContent = generateEARSTemplate(id, featureName, options.author, priority);
200
- }
201
- else {
202
- // Create PRD + BRD-enhanced spec content
203
- specContent = `# ${featureName} Specification
204
-
205
- **ID:** ${id}
206
- **Status:** SPEC
207
- **Created:** ${new Date().toISOString().split('T')[0]}
208
- **Author:** ${options.author}
209
- **Priority:** ${priority}
210
-
211
- ---
212
-
213
- ## PRD (Product Requirements Document)
214
-
215
- ### Problem Statement
216
- ${problemStatement || '<!-- Describe the problem this feature solves -->'}
217
-
218
- ### User Stories
219
- ${userStories || `As a [type of user]
220
- I want [some goal]
221
- So that [some reason]
222
-
223
- <!-- Add more user stories as needed -->`}
224
-
225
- ### Acceptance Criteria
226
- ${acceptanceCriteria || `- [ ] Criterion 1
227
- - [ ] Criterion 2
228
- - [ ] Criterion 3`}
229
-
230
- ### Technical Requirements
231
- ${technicalConsiderations || `<!-- Technical constraints, dependencies, integrations needed -->
232
- - Required APIs:
233
- - Data storage:
234
- - Security requirements:`}
235
-
236
- ---
237
-
238
- ## BRD (Business Requirements Document)
239
-
240
- ### Business Justification
241
- ${businessJustification || '<!-- Why should we build this? Business value, market need, strategic alignment -->'}
242
-
243
- ### Success Metrics
244
- ${successMetrics || `- Metric 1: [e.g., "Reduce processing time by 50%"]
245
- - Metric 2: [e.g., "Increase user engagement by 20%"]
246
- - Metric 3: [e.g., "Zero critical bugs in production"]`}
247
-
248
- ### Stakeholders
249
- ${stakeholders || `| Role | Name/Team | Responsibility |
250
- |------|-----------|----------------|
251
- | Product Owner | | Decision maker |
252
- | Engineering Lead | | Technical oversight |
253
- | QA Lead | | Quality assurance |`}
254
-
255
- ### Timeline
256
- ${timeline || `| Phase | Milestone | Target Date |
257
- |-------|-----------|-------------|
258
- | 1 | Requirements final | |
259
- | 2 | Development complete | |
260
- | 3 | QA complete | |
261
- | 4 | Release | |`}
262
-
263
- ---
264
-
265
- ## Scope (WHAT)
266
-
267
- ### In Scope
268
- -
269
-
270
- ### Out of Scope
271
- -
272
-
273
- ## Requirements
274
-
275
- ### Functional Requirements
276
- | ID | Requirement | Priority | Acceptance Criteria |
277
- |----|-------------|----------|---------------------|
278
- | FR-1 | | P0 | |
279
-
280
- ### Non-Functional Requirements
281
- | ID | Requirement | Metric |
282
- |----|-------------|--------|
283
- | NFR-1 | | |
284
-
285
- ## Scenarios (Given/When/Then)
286
-
287
- ### Scenario 1: [Name]
288
- - **Given** [initial context]
289
- - **When** [action/event occurs]
290
- - **Then** [expected outcome]
291
-
292
- ## Technical Approach (HOW)
293
-
294
- ### Tech Stack
295
- <!-- Refer to .specsafe/tech-stack.md -->
296
-
297
- ### Architecture
298
-
299
- ### Dependencies
300
-
301
- ## Test Strategy (TDD)
302
-
303
- ### Unit Tests
304
- -
305
-
306
- ### Integration Tests
307
- -
308
-
309
- ## Implementation Plan
310
-
311
- | Phase | Task | Est. Time | Dependencies |
312
- |-------|------|-----------|--------------|
313
- | 1 | | | |
314
-
315
- ## Success Criteria
316
- - [ ] All P0 requirements met
317
- - [ ] All tests passing
318
- - [ ] Documentation complete
319
-
320
- ## Risks & Mitigations
321
-
322
- | Risk | Probability | Impact | Mitigation |
323
- |------|-------------|--------|------------|
324
- | | | | |
325
-
326
- ## Notes & References
327
- -
328
-
329
- ---
330
-
331
- *Generated by SpecSafe v0.4.0 - OpenSpec Workflow*
332
- `;
333
- }
334
- const specPath = join('specs/active', `${id}.md`);
335
- // Handle dry-run mode
336
- if (options.dryRun) {
337
- spinner.stop();
338
- console.log(chalk.cyan('[DRY RUN] Would create the following files:\n'));
339
- console.log(chalk.cyan(` ${specPath}`));
340
- console.log(chalk.cyan(`\nContent preview (first 30 lines):\n`));
341
- const previewLines = specContent.split('\n').slice(0, 30).join('\n');
342
- console.log(chalk.gray(previewLines));
343
- if (specContent.split('\n').length > 30) {
344
- console.log(chalk.gray(' ... (truncated)'));
345
- }
346
- console.log(chalk.cyan(`\nWould update PROJECT_STATE.md with spec: ${id}`));
347
- process.exit(0);
348
- }
349
- // Create .specsafe directory and supporting files
350
- await mkdir('.specsafe', { recursive: true });
351
- // Create tech-stack.md if it doesn't exist
352
- const techStackPath = join('.specsafe', 'tech-stack.md');
353
- const techStackContent = `# Tech Stack
354
-
355
- **Project:** ${basename(process.cwd())}
356
- **Last Updated:** ${new Date().toISOString().split('T')[0]}
357
-
358
- ## Core Technologies
359
-
360
- | Category | Technology | Version | Purpose |
361
- |----------|------------|---------|---------|
362
- | Language | TypeScript | ^5.0 | Primary language |
363
- | Testing | Vitest | ^1.0 | Unit testing |
364
- | Linting | ESLint | ^8.0 | Code quality |
365
-
366
- ## Project Structure
367
-
368
- \`\`\`
369
- src/
370
- ├── components/ # UI components
371
- ├── utils/ # Utility functions
372
- └── index.ts # Entry point
373
-
374
- tests/
375
- └── *.test.ts # Test files
376
-
377
- specs/
378
- ├── active/ # Active specs
379
- ├── completed/ # Completed specs
380
- └── archive/ # Archived specs
381
- \`\`\`
382
-
383
- ## Dependencies
384
-
385
- ### Production
386
- - None yet
387
-
388
- ### Development
389
- - @specsafe/core
390
- - @specsafe/cli
391
- - @specsafe/test-gen
392
-
393
- ## Guidelines
394
-
395
- 1. Follow existing code patterns
396
- 2. Write tests before implementation
397
- 3. Update specs as requirements change
398
- 4. Use TypeScript strict mode
399
-
400
- ---
401
-
402
- *Auto-generated by specsafe new*
403
- `;
404
- // Create rules.md if it doesn't exist
405
- const rulesContent = `# Project Rules
406
-
407
- **Project:** ${basename(process.cwd())}
408
- **Last Updated:** ${new Date().toISOString().split('T')[0]}
409
-
410
- ## Coding Standards
411
-
412
- 1. **TypeScript First**: All code must be TypeScript with strict mode enabled
413
- 2. **Test-Driven**: Write tests before implementation
414
- 3. **Documentation**: Document all public APIs
415
- 4. **Error Handling**: Always handle errors gracefully
416
-
417
- ## SpecSafe Workflow Rules
418
-
419
- 1. **SPEC Stage**: Requirements must be clear and testable
420
- 2. **TEST Stage**: All tests must be written before code
421
- 3. **CODE Stage**: Implementation follows tests exactly
422
- 4. **QA Stage**: All tests must pass before completion
423
- 5. **COMPLETE Stage**: Archive spec after completion
424
-
425
- ## AI Assistant Guidelines
426
-
427
- When assisting with this project:
428
-
429
- 1. Always read the relevant spec before making changes
430
- 2. Follow the acceptance criteria in the PRD
431
- 3. Update spec status as work progresses
432
- 4. Suggest running \`specsafe verify\` after changes
433
- 5. Respect the out-of-scope section
434
-
435
- ## Communication Style
436
-
437
- - Be concise but thorough
438
- - Provide code examples when helpful
439
- - Explain the "why" behind suggestions
440
- - Flag any spec violations immediately
441
-
442
- ---
443
-
444
- *Auto-generated by specsafe new*
445
- `;
446
- // Create spec file
447
- await mkdir('specs/active', { recursive: true });
448
- await writeFile(specPath, specContent);
449
- // Create supporting files (only if they don't exist)
450
- try {
451
- await writeFile(techStackPath, techStackContent, { flag: 'wx' });
452
- }
453
- catch {
454
- // File already exists, skip
455
- }
456
- try {
457
- await writeFile(join('.specsafe', 'rules.md'), rulesContent, { flag: 'wx' });
458
- }
459
- catch {
460
- // File already exists, skip
461
- }
462
- // Update project state
463
- await tracker.addSpec(spec);
464
- // Update project memory
465
- try {
466
- const memoryManager = new ProjectMemoryManager(process.cwd());
467
- await memoryManager.load(basename(process.cwd()));
468
- memoryManager.addSpec(id);
469
- await memoryManager.save();
470
- }
471
- catch {
472
- // Memory update failed, but spec was created - don't fail
473
- }
474
- spinner.succeed(chalk.green(`Created spec: ${id}${options.ears ? ' (EARS format)' : ''}`));
475
- console.log(chalk.blue(` Location: ${specPath}`));
476
- console.log(chalk.blue(` Tech Stack: .specsafe/tech-stack.md`));
477
- console.log(chalk.blue(` Rules: .specsafe/rules.md`));
478
- if (options.ears) {
479
- console.log(chalk.green('\n ✨ Using EARS (Easy Approach to Requirements Syntax)'));
480
- console.log(chalk.gray(' EARS patterns make requirements testable by construction'));
481
- }
482
- console.log(chalk.gray('\n Next steps:'));
483
- console.log(chalk.gray(` 1. Edit ${specPath} to refine requirements`));
484
- if (options.ears) {
485
- console.log(chalk.gray(` 2. Follow EARS patterns in the template`));
486
- console.log(chalk.gray(` 3. Run: specsafe qa ${id} --ears (to validate EARS compliance)`));
487
- }
488
- else {
489
- console.log(chalk.gray(` 2. Run: specsafe spec ${id}`));
490
- console.log(chalk.gray(` 3. Or explore: specsafe explore`));
491
- }
492
- }
493
- catch (error) {
494
- spinner.fail(chalk.red(`Failed to create spec: ${error.message}`));
495
- if (error.message.includes('specs/active/')) {
496
- console.log(chalk.gray('💡 Tip: Run "specsafe init" to initialize the project first.'));
497
- }
498
- else if (error.message.includes('already exists')) {
499
- console.log(chalk.gray('💡 Tip: Use a different spec name or delete the existing spec first.'));
500
- }
501
- else if (error.message.includes('User force closed')) {
502
- console.log(chalk.gray('💡 Tip: Creation was cancelled.'));
503
- process.exit(0);
504
- }
505
- process.exit(1);
506
- }
507
- });
508
- //# sourceMappingURL=new.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"new.js","sourceRoot":"","sources":["../../src/commands/new.ts"],"names":[],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- import { Command } from 'commander';
2
- export declare const qaCommand: Command;
3
- //# sourceMappingURL=qa.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"qa.d.ts","sourceRoot":"","sources":["../../src/commands/qa.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC,eAAO,MAAM,SAAS,SA4KlB,CAAC"}