specpilot 1.6.2 → 1.6.7

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 (60) hide show
  1. package/README.md +27 -11
  2. package/dist/cli.js +15 -3
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/add-specs.d.ts.map +1 -1
  5. package/dist/commands/add-specs.js +17 -9
  6. package/dist/commands/add-specs.js.map +1 -1
  7. package/dist/commands/archive.d.ts +1 -0
  8. package/dist/commands/archive.d.ts.map +1 -1
  9. package/dist/commands/archive.js +66 -0
  10. package/dist/commands/archive.js.map +1 -1
  11. package/dist/commands/backfill.d.ts +8 -0
  12. package/dist/commands/backfill.d.ts.map +1 -0
  13. package/dist/commands/backfill.js +81 -0
  14. package/dist/commands/backfill.js.map +1 -0
  15. package/dist/commands/init.d.ts.map +1 -1
  16. package/dist/commands/init.js +17 -10
  17. package/dist/commands/init.js.map +1 -1
  18. package/dist/commands/validate.d.ts.map +1 -1
  19. package/dist/commands/validate.js +51 -1
  20. package/dist/commands/validate.js.map +1 -1
  21. package/dist/utils/ideConfigGenerator.d.ts +19 -2
  22. package/dist/utils/ideConfigGenerator.d.ts.map +1 -1
  23. package/dist/utils/ideConfigGenerator.js +117 -20
  24. package/dist/utils/ideConfigGenerator.js.map +1 -1
  25. package/dist/utils/logger.d.ts.map +1 -1
  26. package/dist/utils/logger.js +3 -2
  27. package/dist/utils/logger.js.map +1 -1
  28. package/dist/utils/specArchiver.js +4 -4
  29. package/dist/utils/specArchiver.js.map +1 -1
  30. package/dist/utils/specBackfiller.d.ts +66 -0
  31. package/dist/utils/specBackfiller.d.ts.map +1 -0
  32. package/dist/utils/specBackfiller.js +502 -0
  33. package/dist/utils/specBackfiller.js.map +1 -0
  34. package/dist/utils/specFileGenerator.d.ts.map +1 -1
  35. package/dist/utils/specFileGenerator.js +15 -3
  36. package/dist/utils/specFileGenerator.js.map +1 -1
  37. package/dist/utils/specGenerator.d.ts +1 -0
  38. package/dist/utils/specGenerator.d.ts.map +1 -1
  39. package/dist/utils/specGenerator.js +3 -1
  40. package/dist/utils/specGenerator.js.map +1 -1
  41. package/dist/utils/specTreePrinter.d.ts +3 -2
  42. package/dist/utils/specTreePrinter.d.ts.map +1 -1
  43. package/dist/utils/specTreePrinter.js +61 -20
  44. package/dist/utils/specTreePrinter.js.map +1 -1
  45. package/dist/utils/specValidator.d.ts +8 -0
  46. package/dist/utils/specValidator.d.ts.map +1 -1
  47. package/dist/utils/specValidator.js +171 -19
  48. package/dist/utils/specValidator.js.map +1 -1
  49. package/dist/utils/templateEngine.d.ts.map +1 -1
  50. package/dist/utils/templateEngine.js +2 -0
  51. package/dist/utils/templateEngine.js.map +1 -1
  52. package/package.json +3 -3
  53. package/dist/commands/specify.d.ts +0 -8
  54. package/dist/commands/specify.d.ts.map +0 -1
  55. package/dist/commands/specify.js +0 -286
  56. package/dist/commands/specify.js.map +0 -1
  57. package/dist/utils/templateRegistry.d.ts +0 -14
  58. package/dist/utils/templateRegistry.d.ts.map +0 -1
  59. package/dist/utils/templateRegistry.js +0 -87
  60. package/dist/utils/templateRegistry.js.map +0 -1
@@ -0,0 +1,502 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.SpecBackfiller = void 0;
37
+ const path_1 = require("path");
38
+ const fs_1 = require("fs");
39
+ const os = __importStar(require("os"));
40
+ const readline = __importStar(require("readline"));
41
+ const ideConfigGenerator_1 = require("./ideConfigGenerator");
42
+ /**
43
+ * Fingerprint + YAML line for each critical mandate.
44
+ * Fingerprint: unique substring that identifies this mandate in any file.
45
+ * yamlText: the exact YAML list-item line to insert into project.yaml.
46
+ * mdText: the markdown numbered list item for copilot-instructions.md.
47
+ * label: short human-readable name shown in backfill output.
48
+ */
49
+ const YAML_MANDATES = [
50
+ {
51
+ fingerprint: 'Never commit code to git',
52
+ label: 'Never commit',
53
+ yamlText: ' - "MANDATE: Never commit code to git unless prompted by the developer. Always ask first."',
54
+ },
55
+ {
56
+ fingerprint: 'Never push to git',
57
+ label: 'Never push',
58
+ yamlText: ' - "MANDATE: Never push to git unless prompted by the developer. Always ask first."',
59
+ },
60
+ {
61
+ fingerprint: 'Never deploy, publish, or release',
62
+ label: 'Never deploy / publish / release',
63
+ yamlText: ' - "MANDATE: Never deploy, publish, or release the project unless prompted by the developer. Always ask first."',
64
+ },
65
+ {
66
+ fingerprint: 'Never modify the .specs/ folder',
67
+ label: 'Never modify .specs/ structure',
68
+ yamlText: ' - "MANDATE: Never modify the .specs/ folder structure, subfolder names, or file names. Only update file contents."',
69
+ },
70
+ {
71
+ fingerprint: 'After every code change',
72
+ label: 'Always update .specs/ after changes',
73
+ yamlText: ' - "MANDATE: After every code change, addition, or removal — proactively update all affected .specs/ files without being asked: architecture.md for structural changes, requirements.md for feature changes, tests.md for test changes, tasks.md for task status, and CHANGELOG.md for completed work."',
74
+ },
75
+ {
76
+ fingerprint: 'Never describe, quote, or reference file contents',
77
+ label: 'Never describe without reading first',
78
+ yamlText: ' - "MANDATE: Never describe, quote, or reference file contents without first reading the file via a tool call in this session. If the file has not been read, say so explicitly before answering."',
79
+ },
80
+ {
81
+ fingerprint: 'Never implement, write code',
82
+ label: 'Never implement unless explicitly asked',
83
+ yamlText: ' - "MANDATE: Never implement, write code, or make file changes unless the developer explicitly asks. If the next step seems obvious, ask first — do not assume."',
84
+ },
85
+ {
86
+ fingerprint: 'Spec-First review gate',
87
+ label: 'Spec-First review gate',
88
+ yamlText: ' - "MANDATE: Spec-First review gate — before touching any code or non-spec files, read all relevant .specs/ files, update all affected spec files first (requirements.md, architecture.md, tasks.md, CHANGELOG.md), present a Spec Report summarizing what changed, which files were affected, and what the specs now say, then wait for the developer\'s explicit \'yes, proceed\' before writing code. If the developer declines, revert the spec changes and stop."',
89
+ },
90
+ ];
91
+ const MD_MANDATES = [
92
+ {
93
+ fingerprint: 'NEVER commit',
94
+ label: 'Never commit',
95
+ mdText: '1. **NEVER commit** code to git unless the developer explicitly asks. Always ask first.',
96
+ },
97
+ {
98
+ fingerprint: 'NEVER push',
99
+ label: 'Never push',
100
+ mdText: '2. **NEVER push** to git unless the developer explicitly asks. Always ask first.',
101
+ },
102
+ {
103
+ fingerprint: 'NEVER deploy, publish, or release',
104
+ label: 'Never deploy / publish / release',
105
+ mdText: '3. **NEVER deploy, publish, or release** the project unless the developer explicitly asks. Always ask first.',
106
+ },
107
+ {
108
+ fingerprint: 'NEVER modify',
109
+ label: 'Never modify .specs/ structure',
110
+ mdText: '4. **NEVER modify** the `.specs/` folder structure, subfolder names, or file names. Only update file contents.',
111
+ },
112
+ {
113
+ fingerprint: 'ALWAYS update',
114
+ label: 'Always update .specs/ after changes',
115
+ mdText: '5. **ALWAYS update** affected `.specs/` files after every code change — without being asked:\n - Structural changes → `architecture/architecture.md`\n - Feature changes → `project/requirements.md`\n - Test changes → `quality/tests.md`\n - Task status → `planning/tasks.md`\n - Completed work → `CHANGELOG.md`',
116
+ },
117
+ {
118
+ fingerprint: 'NEVER describe, quote, or reference file contents',
119
+ label: 'Never describe without reading first',
120
+ mdText: '6. **NEVER describe, quote, or reference file contents** without first reading the file via a tool call in this session. If you have not read the file yet, say so explicitly before answering.',
121
+ },
122
+ {
123
+ fingerprint: 'NEVER implement, write code, or make file changes',
124
+ label: 'Never implement unless explicitly asked',
125
+ mdText: '7. **NEVER implement, write code, or make file changes** unless the developer explicitly asks. If the next step seems obvious, ask first — do not assume.',
126
+ },
127
+ {
128
+ fingerprint: 'SPEC-FIRST review gate',
129
+ label: 'Spec-First review gate',
130
+ mdText: '8. **SPEC-FIRST review gate**: Before touching any code or non-spec files, read all relevant `.specs/` files, update all affected spec files first, present a **Spec Report** summarizing what changed, which files were affected, and what the specs now say, then wait for the developer\'s explicit `yes, proceed` before writing code. If the developer declines, revert the spec changes and stop.',
131
+ },
132
+ ];
133
+ class SpecBackfiller {
134
+ async backfill(projectDir, specsName, dryRun, noPrompts = false) {
135
+ const specsDir = (0, path_1.join)(projectDir, specsName);
136
+ if (!(0, fs_1.existsSync)(specsDir)) {
137
+ throw new Error(`No ${specsName}/ folder found in ${projectDir}.\n` +
138
+ `Run \`specpilot init\` to create a new project or \`specpilot add-specs\` to add specs to an existing project.`);
139
+ }
140
+ // Ensure team.devPrefix exists before patching tasks.md
141
+ await this.ensureDevPrefix(specsDir, dryRun, noPrompts);
142
+ const yamlResult = this.backfillProjectYaml(specsDir, dryRun);
143
+ const copilotResult = await this.backfillCopilotInstructions(projectDir, specsDir, dryRun);
144
+ const tasksResult = this.backfillTasksMd(specsDir, dryRun);
145
+ return { projectYaml: yamlResult, copilotInstructions: copilotResult, tasksMd: tasksResult };
146
+ }
147
+ // ---------------------------------------------------------------------------
148
+ // project.yaml
149
+ // ---------------------------------------------------------------------------
150
+ backfillProjectYaml(specsDir, dryRun) {
151
+ const filePath = (0, path_1.join)(specsDir, 'project', 'project.yaml');
152
+ if (!(0, fs_1.existsSync)(filePath)) {
153
+ return {
154
+ action: 'missing',
155
+ found: 0,
156
+ total: YAML_MANDATES.length,
157
+ added: [],
158
+ reason: 'file not found — run `specpilot init` or `specpilot add-specs` first',
159
+ };
160
+ }
161
+ const content = (0, fs_1.readFileSync)(filePath, 'utf-8');
162
+ const missing = YAML_MANDATES.filter((m) => !content.includes(m.fingerprint));
163
+ if (missing.length === 0) {
164
+ return { action: 'skipped', found: YAML_MANDATES.length, total: YAML_MANDATES.length, added: [] };
165
+ }
166
+ if (!dryRun) {
167
+ const newContent = this.insertYamlMandates(content, missing.map((m) => m.yamlText));
168
+ (0, fs_1.writeFileSync)(filePath, newContent, 'utf-8');
169
+ }
170
+ return {
171
+ action: 'updated',
172
+ found: YAML_MANDATES.length - missing.length,
173
+ total: YAML_MANDATES.length,
174
+ added: missing.map((m) => m.label),
175
+ };
176
+ }
177
+ /**
178
+ * Text-based (not yaml.dump) insertion — preserves comments, emoji, and formatting.
179
+ *
180
+ * Strategy: find the last ` - "MANDATE:` line in the file and insert
181
+ * missing mandate lines immediately after it. If no MANDATE lines exist yet,
182
+ * find the ` critical:` key and append after it. As a final fallback, append
183
+ * a complete `critical:` block at the end of the file.
184
+ */
185
+ insertYamlMandates(content, lines) {
186
+ const insertion = '\n' + lines.join('\n');
187
+ // Strategy 1: insert after the last existing MANDATE line
188
+ const lastMandateIdx = content.lastIndexOf('\n - "MANDATE:');
189
+ if (lastMandateIdx !== -1) {
190
+ const lineEnd = content.indexOf('\n', lastMandateIdx + 1);
191
+ const insertPos = lineEnd !== -1 ? lineEnd : content.length;
192
+ return content.slice(0, insertPos) + insertion + content.slice(insertPos);
193
+ }
194
+ // Strategy 2: insert after the ` critical:` key
195
+ const criticalIdx = content.indexOf('\n critical:');
196
+ if (criticalIdx !== -1) {
197
+ const afterKey = criticalIdx + '\n critical:'.length;
198
+ return content.slice(0, afterKey) + insertion + content.slice(afterKey);
199
+ }
200
+ // Strategy 3: append a complete rules block at the end
201
+ return (content.trimEnd() +
202
+ '\n\n # Backfilled by specpilot backfill\n critical:\n' +
203
+ lines.join('\n') +
204
+ '\n');
205
+ }
206
+ // ---------------------------------------------------------------------------
207
+ // copilot-instructions.md
208
+ // ---------------------------------------------------------------------------
209
+ async backfillCopilotInstructions(projectDir, specsDir, dryRun) {
210
+ const filePath = (0, path_1.join)(projectDir, '.github', 'copilot-instructions.md');
211
+ if (!(0, fs_1.existsSync)(filePath)) {
212
+ if (!dryRun) {
213
+ const projectName = this.readProjectField(specsDir, 'name') ?? require('path').basename(projectDir);
214
+ const language = this.readProjectField(specsDir, 'language') ?? 'typescript';
215
+ const framework = this.readProjectField(specsDir, 'framework');
216
+ const context = { projectName, language, framework };
217
+ (0, fs_1.mkdirSync)((0, path_1.join)(projectDir, '.github'), { recursive: true });
218
+ const ideGen = new ideConfigGenerator_1.IdeConfigGenerator();
219
+ await ideGen.generateCopilotInstructions(projectDir, context, /* noPrompts */ true);
220
+ }
221
+ return {
222
+ action: 'created',
223
+ found: 0,
224
+ total: MD_MANDATES.length,
225
+ added: MD_MANDATES.map((m) => m.label),
226
+ };
227
+ }
228
+ const content = (0, fs_1.readFileSync)(filePath, 'utf-8');
229
+ const missing = MD_MANDATES.filter((m) => !content.includes(m.fingerprint));
230
+ if (missing.length === 0) {
231
+ return { action: 'skipped', found: MD_MANDATES.length, total: MD_MANDATES.length, added: [] };
232
+ }
233
+ if (!dryRun) {
234
+ const backfillBlock = this.buildMdBackfillBlock(missing.map((m) => m.mdText));
235
+ (0, fs_1.writeFileSync)(filePath, content.trimEnd() + '\n\n' + backfillBlock + '\n', 'utf-8');
236
+ }
237
+ return {
238
+ action: 'updated',
239
+ found: MD_MANDATES.length - missing.length,
240
+ total: MD_MANDATES.length,
241
+ added: missing.map((m) => m.label),
242
+ };
243
+ }
244
+ buildMdBackfillBlock(lines) {
245
+ return ('## SpecPilot Mandates (backfilled by `specpilot backfill`)\n\n' +
246
+ '### 🔴 Critical Mandates — Never violate, no exceptions\n\n' +
247
+ lines.join('\n'));
248
+ }
249
+ // ---------------------------------------------------------------------------
250
+ // Helpers
251
+ // ---------------------------------------------------------------------------
252
+ /**
253
+ * Reads the first entry from `contributors:` list in project.yaml.
254
+ * Handles both inline (`contributors: ["girishr"]`) and block-list forms.
255
+ * Falls back to os.userInfo().username if not found.
256
+ */
257
+ readContributorsFirst(specsDir) {
258
+ const yamlPath = (0, path_1.join)(specsDir, 'project', 'project.yaml');
259
+ if ((0, fs_1.existsSync)(yamlPath)) {
260
+ try {
261
+ const content = (0, fs_1.readFileSync)(yamlPath, 'utf-8');
262
+ // Inline array: contributors: ["girishr", ...] or contributors: [girishr, ...]
263
+ const inline = content.match(/^contributors:\s*\[\s*["']?([^"'\],]+)["']?/m);
264
+ if (inline)
265
+ return inline[1].trim();
266
+ // Block list: contributors:\n - "girishr"
267
+ const block = content.match(/^contributors:\s*\n\s+-\s+["']?([^"'\n]+)["']?/m);
268
+ if (block)
269
+ return block[1].trim();
270
+ }
271
+ catch {
272
+ // ignore
273
+ }
274
+ }
275
+ return os.userInfo().username;
276
+ }
277
+ /**
278
+ * Writes `team:\n devPrefix: "<handle>"` into project.yaml after the `license:` line.
279
+ * If a `team:` block already exists (but devPrefix is missing), inserts devPrefix inside it.
280
+ * Text-based insertion — does not parse YAML to preserve formatting.
281
+ */
282
+ writeDevPrefix(specsDir, handle) {
283
+ const yamlPath = (0, path_1.join)(specsDir, 'project', 'project.yaml');
284
+ let content = (0, fs_1.readFileSync)(yamlPath, 'utf-8');
285
+ // If there's already a team: block, insert devPrefix inside it
286
+ const teamBlockMatch = content.match(/^(team:\s*\n)((?:\s+[^\n]+\n)*)/m);
287
+ if (teamBlockMatch) {
288
+ // Append devPrefix at the end of the team block
289
+ const insertAfter = teamBlockMatch[0];
290
+ const insertPos = content.indexOf(insertAfter) + insertAfter.length;
291
+ content = content.slice(0, insertPos) + ` devPrefix: "${handle}"\n` + content.slice(insertPos);
292
+ }
293
+ else {
294
+ // Insert entire team: block after license: line
295
+ const licenseMatch = content.match(/^license:.*$/m);
296
+ if (licenseMatch) {
297
+ const insertPos = content.indexOf(licenseMatch[0]) + licenseMatch[0].length;
298
+ content = content.slice(0, insertPos) + `\nteam:\n devPrefix: "${handle}"` + content.slice(insertPos);
299
+ }
300
+ else {
301
+ // Fallback: append at end
302
+ content = content.trimEnd() + `\nteam:\n devPrefix: "${handle}"\n`;
303
+ }
304
+ }
305
+ (0, fs_1.writeFileSync)(yamlPath, content, 'utf-8');
306
+ }
307
+ /**
308
+ * When team.devPrefix is absent from project.yaml:
309
+ * - Reads contributors[0] as suggestion (fallback: os.userInfo().username)
310
+ * - Prompts user (unless noPrompts or dryRun), looping until non-empty
311
+ * - Writes devPrefix into project.yaml (skipped on dryRun)
312
+ */
313
+ async ensureDevPrefix(specsDir, dryRun, noPrompts) {
314
+ if (this.readDevPrefix(specsDir) !== undefined)
315
+ return; // already set
316
+ const suggestion = this.readContributorsFirst(specsDir);
317
+ let handle;
318
+ if (noPrompts || dryRun) {
319
+ handle = suggestion;
320
+ if (!dryRun) {
321
+ process.stdout.write(`\n⚠️ team.devPrefix missing — using "${handle}" from contributors as your short handle.\n`);
322
+ }
323
+ }
324
+ else {
325
+ handle = await this.promptHandle(suggestion);
326
+ }
327
+ if (!dryRun) {
328
+ this.writeDevPrefix(specsDir, handle);
329
+ }
330
+ }
331
+ /**
332
+ * Prompts the user for their short handle, suggesting contributors[0].
333
+ * Loops until a non-empty value is provided.
334
+ */
335
+ promptHandle(suggestion) {
336
+ return new Promise((resolve) => {
337
+ const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
338
+ const ask = () => {
339
+ rl.question(`\n⚠️ team.devPrefix missing in project.yaml.\nEnter your short handle [${suggestion}]: `, (answer) => {
340
+ const trimmed = answer.trim();
341
+ if (trimmed) {
342
+ rl.close();
343
+ resolve(trimmed);
344
+ }
345
+ else if (suggestion) {
346
+ rl.close();
347
+ resolve(suggestion);
348
+ }
349
+ else {
350
+ process.stdout.write(' Handle cannot be empty. Try again.\n');
351
+ ask();
352
+ }
353
+ });
354
+ };
355
+ ask();
356
+ });
357
+ }
358
+ /**
359
+ * Reads a top-level scalar field from project.yaml using a simple regex.
360
+ * Handles both quoted (`name: "My Project"`) and unquoted (`name: my-project`) values.
361
+ * Does not parse YAML to preserve formatting safety.
362
+ */
363
+ readProjectField(specsDir, field) {
364
+ const yamlPath = (0, path_1.join)(specsDir, 'project', 'project.yaml');
365
+ if (!(0, fs_1.existsSync)(yamlPath))
366
+ return undefined;
367
+ try {
368
+ const content = (0, fs_1.readFileSync)(yamlPath, 'utf-8');
369
+ // Try double-quoted value first
370
+ const quoted = content.match(new RegExp(`^${field}:\\s+"([^"]+)"`, 'm'));
371
+ if (quoted)
372
+ return quoted[1].trim();
373
+ // Try single-quoted
374
+ const singleQuoted = content.match(new RegExp(`^${field}:\\s+'([^']+)'`, 'm'));
375
+ if (singleQuoted)
376
+ return singleQuoted[1].trim();
377
+ // Try unquoted (stop at newline or comment)
378
+ const unquoted = content.match(new RegExp(`^${field}:\\s+([^\\n#]+)`, 'm'));
379
+ return unquoted ? unquoted[1].trim() : undefined;
380
+ }
381
+ catch {
382
+ return undefined;
383
+ }
384
+ }
385
+ /**
386
+ * Reads `team.devPrefix` from project.yaml.
387
+ * The field is nested under a `team:` block, e.g.:
388
+ * team:
389
+ * devPrefix: "girishr"
390
+ */
391
+ readDevPrefix(specsDir) {
392
+ const yamlPath = (0, path_1.join)(specsDir, 'project', 'project.yaml');
393
+ if (!(0, fs_1.existsSync)(yamlPath))
394
+ return undefined;
395
+ try {
396
+ const content = (0, fs_1.readFileSync)(yamlPath, 'utf-8');
397
+ // Match ` devPrefix: "value"` or ` devPrefix: value` (indented under team:)
398
+ const quoted = content.match(/^\s+devPrefix:\s+"([^"]+)"/m);
399
+ if (quoted)
400
+ return quoted[1].trim();
401
+ const singleQuoted = content.match(/^\s+devPrefix:\s+'([^']+)'/m);
402
+ if (singleQuoted)
403
+ return singleQuoted[1].trim();
404
+ const unquoted = content.match(/^\s+devPrefix:\s+([^\n#]+)/m);
405
+ return unquoted ? unquoted[1].trim() : undefined;
406
+ }
407
+ catch {
408
+ return undefined;
409
+ }
410
+ }
411
+ // ---------------------------------------------------------------------------
412
+ // planning/tasks.md
413
+ // ---------------------------------------------------------------------------
414
+ backfillTasksMd(specsDir, dryRun) {
415
+ const filePath = (0, path_1.join)(specsDir, 'planning', 'tasks.md');
416
+ if (!(0, fs_1.existsSync)(filePath)) {
417
+ return {
418
+ action: 'missing',
419
+ found: 0,
420
+ total: 2,
421
+ added: [],
422
+ reason: 'file not found — run `specpilot init` or `specpilot add-specs` first',
423
+ };
424
+ }
425
+ const devPrefix = this.readDevPrefix(specsDir);
426
+ if (!devPrefix) {
427
+ return {
428
+ action: 'skipped',
429
+ found: 0,
430
+ total: 2,
431
+ added: [],
432
+ reason: 'team.devPrefix not found in project.yaml — run `specpilot backfill` after `specpilot init`',
433
+ };
434
+ }
435
+ const content = (0, fs_1.readFileSync)(filePath, 'utf-8');
436
+ const added = [];
437
+ const conventionFingerprint = `CD-${devPrefix}-###`;
438
+ const hasConvention = content.includes(conventionFingerprint);
439
+ const hasMultiDevNotes = content.includes('## Multi-Dev Notes');
440
+ if (hasConvention && hasMultiDevNotes) {
441
+ return { action: 'skipped', found: 2, total: 2, added: [] };
442
+ }
443
+ let newContent = content;
444
+ // Insert `CD-{devPrefix}-###` convention line after `- CS-###:` line
445
+ if (!hasConvention) {
446
+ const csLineMatch = newContent.match(/^- CS-###:.*$/m);
447
+ if (csLineMatch) {
448
+ const insertAfter = csLineMatch[0];
449
+ const insertPos = newContent.indexOf(insertAfter) + insertAfter.length;
450
+ const conventionLine = `\n- CD-${devPrefix}-###: Completed items (e.g. CD-${devPrefix}-001)`;
451
+ newContent = newContent.slice(0, insertPos) + conventionLine + newContent.slice(insertPos);
452
+ }
453
+ else {
454
+ // Fallback: append to convention block before Notes section
455
+ const notesIdx = newContent.search(/^Notes$/m);
456
+ if (notesIdx !== -1) {
457
+ newContent =
458
+ newContent.slice(0, notesIdx) +
459
+ `- CD-${devPrefix}-###: Completed items (e.g. CD-${devPrefix}-001)\n` +
460
+ newContent.slice(notesIdx);
461
+ }
462
+ }
463
+ added.push(`CD-${devPrefix}-### convention line`);
464
+ }
465
+ // Insert ## Multi-Dev Notes section before ## Backlog
466
+ if (!hasMultiDevNotes) {
467
+ const backlogIdx = newContent.search(/^## Backlog$/m);
468
+ if (backlogIdx !== -1) {
469
+ const multiDevSection = `## Multi-Dev Notes\n\n` +
470
+ `> **ID collisions are the #1 source of merge conflicts in shared spec files.**\n` +
471
+ `> Follow these rules when more than one person commits to this repo:\n` +
472
+ `>\n` +
473
+ `> - Always \`git pull\` before appending to the Completed section.\n` +
474
+ `> - Use your personal prefix in all Completed IDs: \`CD-${devPrefix}-###\`\n` +
475
+ `> so two devs never claim the same number independently.\n` +
476
+ `> - Only run \`specpilot archive\` on the default branch (main/master) **after** merging,\n` +
477
+ `> never on a feature branch — diverged trim points break the archive history.\n\n`;
478
+ newContent = newContent.slice(0, backlogIdx) + multiDevSection + newContent.slice(backlogIdx);
479
+ }
480
+ else {
481
+ // Fallback: append at end
482
+ newContent =
483
+ newContent.trimEnd() +
484
+ `\n\n## Multi-Dev Notes\n\n` +
485
+ `> Always \`git pull\` before appending to Completed. Use \`CD-${devPrefix}-###\` prefix. ` +
486
+ `Only run \`specpilot archive\` on the default branch.\n`;
487
+ }
488
+ added.push('## Multi-Dev Notes section');
489
+ }
490
+ if (!dryRun && added.length > 0) {
491
+ (0, fs_1.writeFileSync)(filePath, newContent, 'utf-8');
492
+ }
493
+ return {
494
+ action: added.length > 0 ? 'updated' : 'skipped',
495
+ found: (hasConvention ? 1 : 0) + (hasMultiDevNotes ? 1 : 0),
496
+ total: 2,
497
+ added,
498
+ };
499
+ }
500
+ }
501
+ exports.SpecBackfiller = SpecBackfiller;
502
+ //# sourceMappingURL=specBackfiller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"specBackfiller.js","sourceRoot":"","sources":["../../src/utils/specBackfiller.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"specFileGenerator.d.ts","sourceRoot":"","sources":["../../src/utils/specFileGenerator.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAEnE;;;GAGG;AACH,qBAAa,iBAAiB;IAChB,OAAO,CAAC,cAAc;gBAAd,cAAc,EAAE,cAAc;IAIlD,OAAO,CAAC,kBAAkB,CAwCqE;IAE/F,OAAO,CAAC,uBAAuB,CAuCgE;IAE/F,oEAAoE;IAC9D,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;YAkB9D,gBAAgB;YAMhB,mBAAmB;YAUnB,sBAAsB;YAUtB,sBAAsB;YAsCtB,eAAe;YAmEf,eAAe;YAkDf,iBAAiB;YAmEjB,cAAc;YA6Ed,iBAAiB;YA2BjB,iBAAiB;YAgPjB,eAAe;YA0Bf,qBAAqB;YA2DrB,2BAA2B;CAiD1C"}
1
+ {"version":3,"file":"specFileGenerator.d.ts","sourceRoot":"","sources":["../../src/utils/specFileGenerator.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAEnE;;;GAGG;AACH,qBAAa,iBAAiB;IAChB,OAAO,CAAC,cAAc;gBAAd,cAAc,EAAE,cAAc;IAIlD,OAAO,CAAC,kBAAkB,CAwCqE;IAE/F,OAAO,CAAC,uBAAuB,CAuCgE;IAE/F,oEAAoE;IAC9D,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;YAkB9D,gBAAgB;YAMhB,mBAAmB;YAUnB,sBAAsB;YAUtB,sBAAsB;YAsCtB,eAAe;YAmEf,eAAe;YA8Df,iBAAiB;YAmEjB,cAAc;YA6Ed,iBAAiB;YA2BjB,iBAAiB;YAgPjB,eAAe;YA0Bf,qBAAqB;YA2DrB,2BAA2B;CAiD1C"}
@@ -242,7 +242,8 @@ Task ID conventions
242
242
 
243
243
  - BL-###: Backlog items
244
244
  - CS-###: Current Sprint items
245
- - CD-###: Completed items
245
+ - CD-{devPrefix}-###: Completed items (e.g. CD-{{author}}-001)
246
+ - PROMPT-{devPrefix}-###: Prompt log entries (e.g. PROMPT-{{author}}-001)
246
247
 
247
248
  Notes
248
249
 
@@ -251,6 +252,17 @@ Notes
251
252
  - When moving an item from Backlog to Current Sprint, retain its original BL ID or create a CS mirror that references the BL ID.
252
253
  - Archive guidance: when Completed grows large, move older entries to \`tasks-archive.md\` and add a pointer here.
253
254
 
255
+ ## Multi-Dev Notes
256
+
257
+ > **ID collisions are the #1 source of merge conflicts in shared spec files.**
258
+ > Follow these rules when more than one person commits to this repo:
259
+ >
260
+ > - Always \`git pull\` before appending to the Completed section.
261
+ > - Use your personal prefix in all Completed IDs: \`CD-{your-handle}-###\`
262
+ > so two devs never claim the same number independently.
263
+ > - Only run \`specpilot archive\` on the default branch (main/master) **after** merging,
264
+ > never on a feature branch — diverged trim points break the archive history.
265
+
254
266
  ## Backlog
255
267
 
256
268
  1. [BL-001] Plan initial feature set
@@ -445,7 +457,7 @@ sourceOfTruth: project/project.yaml
445
457
  const pc = context.projectContext;
446
458
  // ── Shared conventions block (used by both prompts) ──────────
447
459
  const conventions = `**Conventions & Rules:**
448
- 1. **IDs**: Use semantic prefixes (REQ-, TASK-, ARCH-, TEST-, etc.) with zero-padded numbers (e.g., REQ-001, TASK-042)
460
+ 1. **IDs**: Use semantic prefixes with zero-padded numbers (e.g., REQ-001, CD-{{author}}-001, PROMPT-{{author}}-001); Completed task IDs and Prompt log IDs use your personal handle as prefix to avoid collisions in multi-dev teams
449
461
  2. **Status values**: Must be one of: not-started, in-progress, completed, blocked, deprecated
450
462
  3. **Priority values**: Must be: critical, high, medium, low
451
463
  4. **Dates**: Use ISO 8601 format (YYYY-MM-DD)
@@ -584,7 +596,7 @@ This file (prompts.md) contains ALL AI interactions for {{projectName}}. Update
584
596
 
585
597
  ## Archive Policy
586
598
 
587
- > **Line limit: 300 lines.** When this file exceeds 300 lines, run:
599
+ > **Line limit: 100 lines.** When this file exceeds 100 lines, run:
588
600
  >
589
601
  > \`\`\`bash
590
602
  > specpilot archive
@@ -1 +1 @@
1
- {"version":3,"file":"specFileGenerator.js","sourceRoot":"","sources":["../../src/utils/specFileGenerator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"specFileGenerator.js","sourceRoot":"","sources":["../../src/utils/specFileGenerator.ts"],"names":[],"mappings":"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"}
@@ -9,6 +9,7 @@ export interface SpecGeneratorOptions {
9
9
  description?: string;
10
10
  ide?: string;
11
11
  mode?: 'new' | 'existing';
12
+ noPrompts?: boolean;
12
13
  projectContext?: {
13
14
  whatItDoes: string;
14
15
  targetUsers: string;
@@ -1 +1 @@
1
- {"version":3,"file":"specGenerator.d.ts","sourceRoot":"","sources":["../../src/utils/specGenerator.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAmB,MAAM,kBAAkB,CAAC;AAKnE,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,KAAK,GAAG,UAAU,CAAC;IAC1B,cAAc,CAAC,EAAE;QACf,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;QACpB,aAAa,EAAE,MAAM,CAAC;QACtB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,QAAQ,CAAC,EAAE;QACT,KAAK,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QACzE,KAAK,EAAE;YACL,SAAS,CAAC,EAAE,MAAM,CAAC;YACnB,SAAS,EAAE,MAAM,EAAE,CAAC;YACpB,SAAS,EAAE,MAAM,CAAC;YAClB,MAAM,EAAE,OAAO,CAAC;YAChB,OAAO,EAAE,OAAO,CAAC;YACjB,cAAc,EAAE,OAAO,CAAC;SACzB,CAAC;QACF,YAAY,EAAE;YACZ,UAAU,EAAE,MAAM,EAAE,CAAC;YACrB,WAAW,EAAE,MAAM,CAAC;YACpB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;SACnC,CAAC;KACH,CAAC;CACH;AAID,qBAAa,aAAa;IAKZ,OAAO,CAAC,cAAc;IAJlC,OAAO,CAAC,iBAAiB,CAAoB;IAC7C,OAAO,CAAC,kBAAkB,CAAqB;IAC/C,OAAO,CAAC,oBAAoB,CAAuB;gBAE/B,cAAc,EAAE,cAAc;IAM5C,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;CA6BlE"}
1
+ {"version":3,"file":"specGenerator.d.ts","sourceRoot":"","sources":["../../src/utils/specGenerator.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAmB,MAAM,kBAAkB,CAAC;AAKnE,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,KAAK,GAAG,UAAU,CAAC;IAC1B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,cAAc,CAAC,EAAE;QACf,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;QACpB,aAAa,EAAE,MAAM,CAAC;QACtB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,QAAQ,CAAC,EAAE;QACT,KAAK,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QACzE,KAAK,EAAE;YACL,SAAS,CAAC,EAAE,MAAM,CAAC;YACnB,SAAS,EAAE,MAAM,EAAE,CAAC;YACpB,SAAS,EAAE,MAAM,CAAC;YAClB,MAAM,EAAE,OAAO,CAAC;YAChB,OAAO,EAAE,OAAO,CAAC;YACjB,cAAc,EAAE,OAAO,CAAC;SACzB,CAAC;QACF,YAAY,EAAE;YACZ,UAAU,EAAE,MAAM,EAAE,CAAC;YACrB,WAAW,EAAE,MAAM,CAAC;YACpB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;SACnC,CAAC;KACH,CAAC;CACH;AAID,qBAAa,aAAa;IAKZ,OAAO,CAAC,cAAc;IAJlC,OAAO,CAAC,iBAAiB,CAAoB;IAC7C,OAAO,CAAC,kBAAkB,CAAqB;IAC/C,OAAO,CAAC,oBAAoB,CAAuB;gBAE/B,cAAc,EAAE,cAAc;IAM5C,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;CA+BlE"}
@@ -42,7 +42,9 @@ class SpecGenerator {
42
42
  }
43
43
  // Always generate .github/copilot-instructions.md regardless of IDE choice —
44
44
  // it is read automatically by Copilot, Cursor, and other AI tools on every request.
45
- await this.ideConfigGenerator.generateCopilotInstructions(options.targetDir, context);
45
+ await this.ideConfigGenerator.generateCopilotInstructions(options.targetDir, context, options.noPrompts ?? false);
46
+ // Generate .gitattributes with merge=union for append-heavy spec files
47
+ this.ideConfigGenerator.generateGitAttributes(options.targetDir);
46
48
  }
47
49
  }
48
50
  exports.SpecGenerator = SpecGenerator;