specpilot 1.6.3 → 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.
- package/README.md +26 -11
- package/dist/cli.js +15 -3
- package/dist/cli.js.map +1 -1
- package/dist/commands/add-specs.d.ts.map +1 -1
- package/dist/commands/add-specs.js +16 -9
- package/dist/commands/add-specs.js.map +1 -1
- package/dist/commands/archive.d.ts +1 -0
- package/dist/commands/archive.d.ts.map +1 -1
- package/dist/commands/archive.js +66 -0
- package/dist/commands/archive.js.map +1 -1
- package/dist/commands/backfill.d.ts +8 -0
- package/dist/commands/backfill.d.ts.map +1 -0
- package/dist/commands/backfill.js +81 -0
- package/dist/commands/backfill.js.map +1 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +17 -10
- package/dist/commands/init.js.map +1 -1
- package/dist/utils/ideConfigGenerator.d.ts +9 -1
- package/dist/utils/ideConfigGenerator.d.ts.map +1 -1
- package/dist/utils/ideConfigGenerator.js +46 -31
- package/dist/utils/ideConfigGenerator.js.map +1 -1
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +3 -2
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/specArchiver.js +4 -4
- package/dist/utils/specArchiver.js.map +1 -1
- package/dist/utils/specBackfiller.d.ts +66 -0
- package/dist/utils/specBackfiller.d.ts.map +1 -0
- package/dist/utils/specBackfiller.js +502 -0
- package/dist/utils/specBackfiller.js.map +1 -0
- package/dist/utils/specFileGenerator.d.ts.map +1 -1
- package/dist/utils/specFileGenerator.js +15 -3
- package/dist/utils/specFileGenerator.js.map +1 -1
- package/dist/utils/specGenerator.d.ts.map +1 -1
- package/dist/utils/specGenerator.js +2 -0
- package/dist/utils/specGenerator.js.map +1 -1
- package/dist/utils/specValidator.d.ts +2 -0
- package/dist/utils/specValidator.d.ts.map +1 -1
- package/dist/utils/specValidator.js +10 -10
- package/dist/utils/specValidator.js.map +1 -1
- package/dist/utils/templateEngine.d.ts.map +1 -1
- package/dist/utils/templateEngine.js +2 -0
- package/dist/utils/templateEngine.js.map +1 -1
- package/package.json +2 -2
- package/dist/commands/specify.d.ts +0 -8
- package/dist/commands/specify.d.ts.map +0 -1
- package/dist/commands/specify.js +0 -286
- package/dist/commands/specify.js.map +0 -1
- package/dist/utils/templateRegistry.d.ts +0 -14
- package/dist/utils/templateRegistry.d.ts.map +0 -1
- package/dist/utils/templateRegistry.js +0 -87
- 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;
|
|
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
|
|
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:
|
|
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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"}
|
|
@@ -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,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;
|
|
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"}
|
|
@@ -43,6 +43,8 @@ class SpecGenerator {
|
|
|
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
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;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"specGenerator.js","sourceRoot":"","sources":["../../src/utils/specGenerator.ts"],"names":[],"mappings":";;;AAAA,+BAA4B;AAC5B,2BAA+B;AAE/B,2DAAwD;AACxD,6DAA0D;AAC1D,iEAA8D;AAqC9D,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;AAEhD,MAAa,aAAa;IAKxB,YAAoB,cAA8B;QAA9B,mBAAc,GAAd,cAAc,CAAgB;QAChD,IAAI,CAAC,iBAAiB,GAAG,IAAI,qCAAiB,CAAC,cAAc,CAAC,CAAC;QAC/D,IAAI,CAAC,kBAAkB,GAAG,IAAI,uCAAkB,EAAE,CAAC;QACnD,IAAI,CAAC,oBAAoB,GAAG,IAAI,2CAAoB,CAAC,cAAc,CAAC,CAAC;IACvE,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,OAA6B;QAC/C,MAAM,QAAQ,GAAG,IAAA,WAAI,EAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;QAC5D,IAAA,cAAS,EAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACzC,MAAM,UAAU,GAAG,CAAC,SAAS,EAAE,cAAc,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,UAAU,CAAC,CAAC;QACjG,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAA,cAAS,EAAC,IAAA,WAAI,EAAC,QAAQ,EAAE,GAAG,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAC/E,MAAM,OAAO,GAAoB;YAC/B,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,WAAW;YACrC,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,QAAQ,GAAG,UAAU,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACrI,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACnD,YAAY,EAAE,CAAC,OAAO,CAAC,MAAM,IAAI,WAAW,CAAC;YAC7C,YAAY,EAAE,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC,YAAY;YAC/D,GAAG,EAAE,OAAO,CAAC,GAAG,IAAI,QAAQ;YAC5B,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,KAAK;YAC3B,cAAc,EAAE,OAAO,CAAC,cAAc;SACvC,CAAC;QACF,MAAM,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC5D,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,IAAI,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;QACpD,IAAI,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;QAC5E,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;QAC1E,CAAC;QACD,6EAA6E;QAC7E,oFAAoF;QACpF,MAAM,IAAI,CAAC,kBAAkB,CAAC,2BAA2B,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,SAAS,IAAI,KAAK,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"specGenerator.js","sourceRoot":"","sources":["../../src/utils/specGenerator.ts"],"names":[],"mappings":"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"}
|