@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,466 +0,0 @@
1
- #!/usr/bin/env node
2
- /**
3
- * Capsule Command
4
- * Manage story context capsules for specs
5
- */
6
- import { Command } from 'commander';
7
- import chalk from 'chalk';
8
- import { input, select, confirm } from '@inquirer/prompts';
9
- import { writeFile } from 'fs/promises';
10
- import { CapsuleManager, getTemplate, getTemplateChoices, isValidTemplateType, formatContent, TEMPLATE_NAMES, validateSpecId, validateTitle, validateAuthor, validateTags, } from '@specsafe/core';
11
- export const capsuleCommand = new Command('capsule')
12
- .description('Manage story context capsules for specs')
13
- .addHelpText('after', `
14
- Examples:
15
- specsafe capsule add specs/checkout.md --type user-story
16
- specsafe capsule list specs/checkout.md
17
- specsafe capsule show specs/checkout.md capsule-abc123
18
- specsafe capsule export specs/checkout.md
19
- `);
20
- // Add subcommand
21
- capsuleCommand
22
- .command('add')
23
- .description('Add a new context capsule to a spec')
24
- .argument('<spec>', 'Spec ID or path (e.g., specs/checkout.md)')
25
- .option('-t, --type <type>', 'Capsule type (user-story, technical-context, business-justification, discovery-note)')
26
- .option('--title <title>', 'Capsule title')
27
- .option('--author <author>', 'Author name')
28
- .action(async (spec, options) => {
29
- try {
30
- // Validate spec ID early to catch errors
31
- try {
32
- validateSpecId(spec);
33
- }
34
- catch (error) {
35
- console.error(chalk.red(`Error: ${error instanceof Error ? error.message : 'Invalid spec ID'}`));
36
- process.exit(1);
37
- }
38
- const manager = new CapsuleManager();
39
- // Determine capsule type
40
- let type;
41
- if (options.type) {
42
- if (!isValidTemplateType(options.type)) {
43
- console.error(chalk.red(`Error: Invalid capsule type: ${options.type}`));
44
- console.log(chalk.gray(`\nValid types: user-story, technical-context, business-justification, discovery-note`));
45
- process.exit(1);
46
- }
47
- type = options.type;
48
- }
49
- else {
50
- type = await select({
51
- message: 'Select capsule type:',
52
- choices: getTemplateChoices(),
53
- });
54
- }
55
- const template = getTemplate(type);
56
- console.log(chalk.blue(`\n${template.name}`));
57
- console.log(chalk.gray(template.description));
58
- console.log('');
59
- // Get title with validation
60
- let title = options.title || '';
61
- if (!title) {
62
- title = await input({
63
- message: 'Title:',
64
- validate: (value) => {
65
- try {
66
- validateTitle(value);
67
- return true;
68
- }
69
- catch (error) {
70
- return error instanceof Error ? error.message : 'Invalid title';
71
- }
72
- },
73
- });
74
- }
75
- else {
76
- try {
77
- title = validateTitle(title);
78
- }
79
- catch (error) {
80
- console.error(chalk.red(`Error: ${error instanceof Error ? error.message : 'Invalid title'}`));
81
- process.exit(1);
82
- }
83
- }
84
- // Get author with validation
85
- let author = options.author || '';
86
- if (!author) {
87
- author = await input({
88
- message: 'Author:',
89
- default: process.env.USER || 'unknown',
90
- validate: (value) => {
91
- try {
92
- validateAuthor(value);
93
- return true;
94
- }
95
- catch (error) {
96
- return error instanceof Error ? error.message : 'Invalid author';
97
- }
98
- },
99
- });
100
- }
101
- else {
102
- try {
103
- author = validateAuthor(author);
104
- }
105
- catch (error) {
106
- console.error(chalk.red(`Error: ${error instanceof Error ? error.message : 'Invalid author'}`));
107
- process.exit(1);
108
- }
109
- }
110
- // Get content from template fields
111
- const fields = {};
112
- for (const field of template.fields) {
113
- const value = await input({
114
- message: field.label + ':',
115
- default: field.placeholder || '',
116
- });
117
- fields[field.name] = value;
118
- }
119
- // Get tags (optional)
120
- const tagInput = await input({
121
- message: 'Tags (comma-separated, optional):',
122
- default: '',
123
- });
124
- const tagsRaw = tagInput
125
- .split(',')
126
- .map((t) => t.trim())
127
- .filter((t) => t.length > 0);
128
- // Validate tags
129
- let tags = [];
130
- try {
131
- tags = validateTags(tagsRaw);
132
- }
133
- catch (error) {
134
- console.error(chalk.red(`Error: ${error instanceof Error ? error.message : 'Invalid tags'}`));
135
- process.exit(1);
136
- }
137
- // Confirm
138
- console.log('');
139
- console.log(chalk.blue('Preview:'));
140
- console.log(chalk.cyan(`Type: ${TEMPLATE_NAMES[type]}`));
141
- console.log(chalk.cyan(`Title: ${title}`));
142
- console.log(chalk.cyan(`Author: ${author}`));
143
- if (tags.length > 0) {
144
- console.log(chalk.cyan(`Tags: ${tags.join(', ')}`));
145
- }
146
- console.log('');
147
- const confirmed = await confirm({
148
- message: 'Create this capsule?',
149
- default: true,
150
- });
151
- if (!confirmed) {
152
- console.log(chalk.yellow('Cancelled.'));
153
- return;
154
- }
155
- // Create capsule
156
- const content = formatContent(type, fields);
157
- const capsule = await manager.add(spec, {
158
- type,
159
- title,
160
- content,
161
- author,
162
- tags,
163
- });
164
- console.log('');
165
- console.log(chalk.green(`✓ Created capsule: ${capsule.id}`));
166
- }
167
- catch (error) {
168
- console.error(chalk.red(`Error: ${error instanceof Error ? error.message : 'Failed to create capsule'}`));
169
- process.exit(1);
170
- }
171
- });
172
- // List subcommand
173
- capsuleCommand
174
- .command('list')
175
- .description('List all capsules for a spec')
176
- .argument('<spec>', 'Spec ID or path (e.g., specs/checkout.md)')
177
- .option('-t, --type <types...>', 'Filter by type(s)')
178
- .option('--tag <tags...>', 'Filter by tag(s)')
179
- .option('--author <author>', 'Filter by author')
180
- .action(async (spec, options) => {
181
- try {
182
- // Validate spec ID
183
- try {
184
- validateSpecId(spec);
185
- }
186
- catch (error) {
187
- console.error(chalk.red(`Error: ${error instanceof Error ? error.message : 'Invalid spec ID'}`));
188
- process.exit(1);
189
- }
190
- const manager = new CapsuleManager();
191
- // Validate types if provided
192
- if (options.type) {
193
- for (const t of options.type) {
194
- if (!isValidTemplateType(t)) {
195
- console.error(chalk.red(`Error: Invalid capsule type: ${t}`));
196
- process.exit(1);
197
- }
198
- }
199
- }
200
- const filter = {
201
- types: options.type,
202
- tags: options.tag,
203
- author: options.author,
204
- };
205
- const capsules = await manager.list(spec, filter);
206
- if (capsules.length === 0) {
207
- console.log(chalk.yellow('No capsules found for this spec.'));
208
- return;
209
- }
210
- console.log('');
211
- console.log(chalk.blue(`Capsules for ${spec}:`));
212
- console.log(chalk.gray(`Total: ${capsules.length}`));
213
- console.log('');
214
- // Group by type
215
- const byType = {};
216
- for (const capsule of capsules) {
217
- if (!byType[capsule.type]) {
218
- byType[capsule.type] = [];
219
- }
220
- byType[capsule.type].push(capsule);
221
- }
222
- for (const [type, typeCapsules] of Object.entries(byType)) {
223
- console.log(chalk.cyan(`\n[${type}]`));
224
- for (const capsule of typeCapsules) {
225
- console.log(` ${chalk.white(capsule.title)}`);
226
- console.log(` ${chalk.gray(capsule.id)}`);
227
- console.log(` ${chalk.gray(`by ${capsule.author} on ${new Date(capsule.createdAt).toLocaleDateString()}`)}`);
228
- if (capsule.tags.length > 0) {
229
- console.log(` ${chalk.gray(`tags: ${capsule.tags.join(', ')}`)}`);
230
- }
231
- }
232
- }
233
- }
234
- catch (error) {
235
- console.error(chalk.red(`Error: ${error instanceof Error ? error.message : 'Failed to list capsules'}`));
236
- process.exit(1);
237
- }
238
- });
239
- // Show subcommand
240
- capsuleCommand
241
- .command('show')
242
- .description('View a specific capsule')
243
- .argument('<spec>', 'Spec ID or path')
244
- .argument('<capsule-id>', 'Capsule ID')
245
- .action(async (spec, capsuleId) => {
246
- try {
247
- // Validate spec ID
248
- try {
249
- validateSpecId(spec);
250
- }
251
- catch (error) {
252
- console.error(chalk.red(`Error: ${error instanceof Error ? error.message : 'Invalid spec ID'}`));
253
- process.exit(1);
254
- }
255
- // Validate capsule ID format
256
- if (!capsuleId || typeof capsuleId !== 'string' || capsuleId.length === 0) {
257
- console.error(chalk.red('Error: Invalid capsule ID'));
258
- process.exit(1);
259
- }
260
- const manager = new CapsuleManager();
261
- const capsule = await manager.get(spec, capsuleId);
262
- if (!capsule) {
263
- console.error(chalk.red(`Error: Capsule not found: ${capsuleId}`));
264
- process.exit(1);
265
- }
266
- console.log('');
267
- console.log(chalk.cyan.bold(capsule.title));
268
- console.log(chalk.gray('─'.repeat(50)));
269
- console.log(`${chalk.blue('Type:')} ${TEMPLATE_NAMES[capsule.type]}`);
270
- console.log(`${chalk.blue('ID:')} ${capsule.id}`);
271
- console.log(`${chalk.blue('Author:')} ${capsule.author}`);
272
- console.log(`${chalk.blue('Created:')} ${new Date(capsule.createdAt).toLocaleString()}`);
273
- if (capsule.tags.length > 0) {
274
- console.log(`${chalk.blue('Tags:')} ${capsule.tags.join(', ')}`);
275
- }
276
- console.log('');
277
- console.log(capsule.content);
278
- console.log('');
279
- }
280
- catch (error) {
281
- console.error(chalk.red(`Error: ${error instanceof Error ? error.message : 'Failed to show capsule'}`));
282
- process.exit(1);
283
- }
284
- });
285
- // Remove subcommand
286
- capsuleCommand
287
- .command('remove')
288
- .description('Remove a capsule')
289
- .argument('<spec>', 'Spec ID or path')
290
- .argument('<capsule-id>', 'Capsule ID')
291
- .option('-y, --yes', 'Skip confirmation')
292
- .action(async (spec, capsuleId, options) => {
293
- try {
294
- // Validate spec ID
295
- try {
296
- validateSpecId(spec);
297
- }
298
- catch (error) {
299
- console.error(chalk.red(`Error: ${error instanceof Error ? error.message : 'Invalid spec ID'}`));
300
- process.exit(1);
301
- }
302
- // Validate capsule ID format
303
- if (!capsuleId || typeof capsuleId !== 'string' || capsuleId.length === 0) {
304
- console.error(chalk.red('Error: Invalid capsule ID'));
305
- process.exit(1);
306
- }
307
- const manager = new CapsuleManager();
308
- const capsule = await manager.get(spec, capsuleId);
309
- if (!capsule) {
310
- console.error(chalk.red(`Error: Capsule not found: ${capsuleId}`));
311
- process.exit(1);
312
- }
313
- let confirmed = options.yes;
314
- if (!confirmed) {
315
- confirmed = await confirm({
316
- message: `Delete "${capsule.title}"?`,
317
- default: false,
318
- });
319
- }
320
- if (!confirmed) {
321
- console.log(chalk.yellow('Cancelled.'));
322
- return;
323
- }
324
- const removed = await manager.remove(spec, capsuleId);
325
- if (removed) {
326
- console.log(chalk.green(`✓ Removed capsule: ${capsuleId}`));
327
- }
328
- else {
329
- console.error(chalk.red(`Failed to remove capsule: ${capsuleId}`));
330
- process.exit(1);
331
- }
332
- }
333
- catch (error) {
334
- console.error(chalk.red(`Error: ${error instanceof Error ? error.message : 'Failed to remove capsule'}`));
335
- process.exit(1);
336
- }
337
- });
338
- // Export subcommand
339
- capsuleCommand
340
- .command('export')
341
- .description('Export capsules to markdown')
342
- .argument('<spec>', 'Spec ID or path')
343
- .option('-o, --output <file>', 'Output file (default: prints to stdout)')
344
- .action(async (spec, options) => {
345
- try {
346
- // Validate spec ID
347
- try {
348
- validateSpecId(spec);
349
- }
350
- catch (error) {
351
- console.error(chalk.red(`Error: ${error instanceof Error ? error.message : 'Invalid spec ID'}`));
352
- process.exit(1);
353
- }
354
- // Validate output path if provided
355
- if (options.output) {
356
- if (typeof options.output !== 'string' || options.output.length === 0) {
357
- console.error(chalk.red('Error: Invalid output path'));
358
- process.exit(1);
359
- }
360
- // Security: Prevent path traversal in output path
361
- const normalized = options.output.replace(/\\/g, '/');
362
- if (normalized.includes('..')) {
363
- console.error(chalk.red('Error: Output path cannot contain path traversal sequences'));
364
- process.exit(1);
365
- }
366
- }
367
- const manager = new CapsuleManager();
368
- const markdown = await manager.exportToMarkdown(spec);
369
- if (options.output) {
370
- await writeFile(options.output, markdown, 'utf-8');
371
- console.log(chalk.green(`✓ Exported to ${options.output}`));
372
- }
373
- else {
374
- console.log(markdown);
375
- }
376
- }
377
- catch (error) {
378
- console.error(chalk.red(`Error: ${error instanceof Error ? error.message : 'Failed to export capsules'}`));
379
- process.exit(1);
380
- }
381
- });
382
- // Edit subcommand
383
- capsuleCommand
384
- .command('edit')
385
- .description('Edit an existing capsule')
386
- .argument('<spec>', 'Spec ID or path')
387
- .argument('<capsule-id>', 'Capsule ID')
388
- .action(async (spec, capsuleId) => {
389
- try {
390
- // Validate spec ID
391
- try {
392
- validateSpecId(spec);
393
- }
394
- catch (error) {
395
- console.error(chalk.red(`Error: ${error instanceof Error ? error.message : 'Invalid spec ID'}`));
396
- process.exit(1);
397
- }
398
- // Validate capsule ID format
399
- if (!capsuleId || typeof capsuleId !== 'string' || capsuleId.length === 0) {
400
- console.error(chalk.red('Error: Invalid capsule ID'));
401
- process.exit(1);
402
- }
403
- const manager = new CapsuleManager();
404
- const capsule = await manager.get(spec, capsuleId);
405
- if (!capsule) {
406
- console.error(chalk.red(`Error: Capsule not found: ${capsuleId}`));
407
- process.exit(1);
408
- }
409
- console.log(chalk.blue('Editing capsule (leave blank to keep current value)'));
410
- console.log('');
411
- const titleInput = await input({
412
- message: 'Title:',
413
- default: capsule.title,
414
- });
415
- const title = titleInput || capsule.title;
416
- const authorInput = await input({
417
- message: 'Author:',
418
- default: capsule.author,
419
- });
420
- const author = authorInput || capsule.author;
421
- const tagInput = await input({
422
- message: 'Tags (comma-separated):',
423
- default: capsule.tags.join(', '),
424
- });
425
- const tagsRaw = tagInput
426
- .split(',')
427
- .map((t) => t.trim())
428
- .filter((t) => t.length > 0);
429
- // Validate inputs
430
- let validatedTitle;
431
- let validatedAuthor;
432
- let validatedTags;
433
- try {
434
- validatedTitle = validateTitle(title);
435
- validatedAuthor = validateAuthor(author);
436
- validatedTags = validateTags(tagsRaw.length > 0 ? tagsRaw : capsule.tags);
437
- }
438
- catch (error) {
439
- console.error(chalk.red(`Error: ${error instanceof Error ? error.message : 'Invalid input'}`));
440
- process.exit(1);
441
- }
442
- const contentInput = await input({
443
- message: 'Content:',
444
- default: capsule.content,
445
- });
446
- const content = contentInput || capsule.content;
447
- const updated = await manager.update(spec, capsuleId, {
448
- title: validatedTitle,
449
- author: validatedAuthor,
450
- tags: validatedTags,
451
- content,
452
- });
453
- if (updated) {
454
- console.log(chalk.green(`✓ Updated capsule: ${capsuleId}`));
455
- }
456
- else {
457
- console.error(chalk.red(`Failed to update capsule: ${capsuleId}`));
458
- process.exit(1);
459
- }
460
- }
461
- catch (error) {
462
- console.error(chalk.red(`Error: ${error instanceof Error ? error.message : 'Failed to edit capsule'}`));
463
- process.exit(1);
464
- }
465
- });
466
- //# sourceMappingURL=capsule.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"capsule.js","sourceRoot":"","sources":["../../src/commands/capsule.ts"],"names":[],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- import { Command } from 'commander';
2
- export declare const completeCommand: Command;
3
- //# sourceMappingURL=complete.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"complete.d.ts","sourceRoot":"","sources":["../../src/commands/complete.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,eAAO,MAAM,eAAe,SA2IxB,CAAC"}
@@ -1,140 +0,0 @@
1
- import { Command } from 'commander';
2
- import chalk from 'chalk';
3
- import ora from 'ora';
4
- import { Workflow, ProjectTracker, validateSpecId } from '@specsafe/core';
5
- import { rename, readFile, access } from 'fs/promises';
6
- import { join } from 'path';
7
- export const completeCommand = new Command('complete')
8
- .description('Complete spec (QA → COMPLETE) [DEPRECATED: use "done" instead]')
9
- .argument('<id>', 'Spec ID')
10
- .option('-r, --report <path>', 'Path to QA report')
11
- .option('-n, --dry-run', 'Preview changes without writing files')
12
- .action(async (id, options) => {
13
- // Show deprecation warning
14
- console.log(chalk.yellow('\n⚠️ DEPRECATION WARNING: "specsafe complete" is deprecated.'));
15
- console.log(chalk.yellow(' Use "specsafe done" instead for complete + archive functionality.\n'));
16
- const spinner = ora(`Completing ${id}...`).start();
17
- try {
18
- // Validate spec ID format
19
- validateSpecId(id);
20
- const workflow = new Workflow();
21
- const tracker = new ProjectTracker(process.cwd());
22
- // Load existing specs from disk
23
- await tracker.loadSpecsIntoWorkflow(workflow);
24
- // Load QA report from file if provided
25
- let qaReport;
26
- if (options.report) {
27
- const reportContent = await readFile(options.report, 'utf-8');
28
- const parsedReport = JSON.parse(reportContent);
29
- // Validate required fields
30
- const requiredFields = ['id', 'specId', 'timestamp', 'recommendation', 'testResults', 'coverage', 'issues'];
31
- const missingFields = requiredFields.filter(field => !(field in parsedReport));
32
- if (missingFields.length > 0) {
33
- throw new Error(`Invalid QA report: missing required fields: ${missingFields.join(', ')}`);
34
- }
35
- // Validate recommendation value
36
- if (parsedReport.recommendation !== 'GO' && parsedReport.recommendation !== 'NO-GO') {
37
- throw new Error(`Invalid QA report: recommendation must be 'GO' or 'NO-GO', got '${parsedReport.recommendation}'`);
38
- }
39
- qaReport = parsedReport;
40
- // Convert timestamp from ISO string to Date object (JSON.parse produces strings)
41
- if (typeof qaReport.timestamp === 'string') {
42
- qaReport.timestamp = new Date(qaReport.timestamp);
43
- }
44
- }
45
- else {
46
- // Default QA report
47
- qaReport = {
48
- id: `QA-${id}`,
49
- specId: id,
50
- timestamp: new Date(),
51
- testResults: [],
52
- coverage: { statements: 100, branches: 100, functions: 100, lines: 100 },
53
- recommendation: 'GO',
54
- issues: [],
55
- notes: 'All tests passing'
56
- };
57
- }
58
- // Validate QA report
59
- if (qaReport.specId !== id) {
60
- throw new Error(`QA report spec ID (${qaReport.specId}) does not match target spec (${id})`);
61
- }
62
- if (qaReport.recommendation !== 'GO') {
63
- throw new Error('Cannot complete: QA report recommends NO-GO. Address issues first.');
64
- }
65
- // Validate required fields are present
66
- const requiredFields = ['id', 'specId', 'timestamp', 'recommendation', 'testResults', 'coverage', 'issues', 'notes'];
67
- const missingFields = requiredFields.filter(field => !(field in qaReport));
68
- if (missingFields.length > 0) {
69
- throw new Error(`QA report is missing required fields: ${missingFields.join(', ')}`);
70
- }
71
- const sourcePath = join('specs', 'active', `${id}.md`);
72
- const targetPath = join('specs', 'completed', `${id}.md`);
73
- // Handle dry-run mode
74
- if (options.dryRun) {
75
- spinner.stop();
76
- console.log(chalk.cyan('[DRY RUN] Would perform the following actions:\n'));
77
- console.log(chalk.cyan(' State transition:'));
78
- console.log(chalk.gray(` QA → COMPLETE`));
79
- console.log(chalk.cyan(`\n File move:`));
80
- console.log(chalk.gray(` ${sourcePath} → ${targetPath}`));
81
- console.log(chalk.cyan(`\n QA Report:`));
82
- console.log(chalk.gray(` ID: ${qaReport.id}`));
83
- console.log(chalk.gray(` Recommendation: ${qaReport.recommendation}`));
84
- console.log(chalk.gray(` Coverage: ${JSON.stringify(qaReport.coverage)}`));
85
- console.log(chalk.cyan(`\n Would update PROJECT_STATE.md for spec: ${id}`));
86
- process.exit(0);
87
- }
88
- // Move file FIRST, before updating state, to prevent inconsistent state on failure
89
- try {
90
- await access(sourcePath);
91
- await rename(sourcePath, targetPath);
92
- }
93
- catch (renameError) {
94
- if (renameError.code === 'ENOENT') {
95
- // Source file doesn't exist — skip the move (spec may have been created without a file)
96
- spinner.text = `Spec file not found at ${sourcePath}, skipping file move...`;
97
- }
98
- else {
99
- throw new Error(`Failed to move spec file: ${renameError.message}`);
100
- }
101
- }
102
- // Now update workflow state and persist
103
- try {
104
- workflow.moveToComplete(id, qaReport);
105
- }
106
- catch (moveError) {
107
- if (moveError.message.includes('not found')) {
108
- throw new Error(`Spec '${id}' not found. Run 'specsafe spec ${id}' to create it first.`);
109
- }
110
- if (moveError.message.includes('Must be in QA stage')) {
111
- throw new Error(`Spec '${id}' is not in QA stage. Run 'specsafe qa ${id}' first.`);
112
- }
113
- if (moveError.message.includes('NO-GO')) {
114
- throw new Error(`Cannot complete: QA report recommends NO-GO. Fix issues and re-run 'specsafe qa ${id}' first.`);
115
- }
116
- throw moveError;
117
- }
118
- await tracker.addSpec(workflow.getSpec(id));
119
- spinner.succeed(chalk.green(`✅ Completed ${id}`));
120
- console.log(chalk.blue('Spec moved to specs/completed/'));
121
- console.log(chalk.green('Ready for production!'));
122
- }
123
- catch (error) {
124
- spinner.fail(chalk.red(error.message));
125
- if (error.message.includes('not in QA stage') || error.message.includes('Run \'specsafe qa\'')) {
126
- console.log(chalk.gray(`💡 Tip: Run 'specsafe qa ${id}' to run QA validation first.`));
127
- }
128
- else if (error.message.includes('NO-GO')) {
129
- console.log(chalk.gray(`💡 Tip: Fix the failing tests and re-run 'specsafe qa ${id}' before completing.`));
130
- }
131
- else if (error.message.includes('not found')) {
132
- console.log(chalk.gray(`💡 Tip: Run 'specsafe new <name>' to create a spec first.`));
133
- }
134
- else if (error.message.includes('QA report')) {
135
- console.log(chalk.gray(`💡 Tip: Run 'specsafe qa ${id}' to generate a QA report first.`));
136
- }
137
- process.exit(1);
138
- }
139
- });
140
- //# sourceMappingURL=complete.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"complete.js","sourceRoot":"","sources":["../../src/commands/complete.ts"],"names":[],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- import { Command } from 'commander';
2
- export declare const constitutionCommand: Command;
3
- //# sourceMappingURL=constitution.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"constitution.d.ts","sourceRoot":"","sources":["../../src/commands/constitution.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAwBpC,eAAO,MAAM,mBAAmB,SAgM7B,CAAC"}