specpilot 1.5.0 → 1.6.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.
- package/README.md +45 -26
- package/dist/cli.js +23 -7
- package/dist/cli.js.map +1 -1
- package/dist/commands/archive.d.ts +5 -0
- package/dist/commands/archive.d.ts.map +1 -0
- package/dist/commands/archive.js +52 -0
- package/dist/commands/archive.js.map +1 -0
- package/dist/commands/init.d.ts +1 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +48 -0
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/refine.d.ts +8 -0
- package/dist/commands/refine.d.ts.map +1 -0
- package/dist/commands/refine.js +286 -0
- package/dist/commands/refine.js.map +1 -0
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +24 -11
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/specArchiver.d.ts +20 -0
- package/dist/utils/specArchiver.d.ts.map +1 -0
- package/dist/utils/specArchiver.js +124 -0
- package/dist/utils/specArchiver.js.map +1 -0
- package/dist/utils/specFileGenerator.d.ts +2 -0
- package/dist/utils/specFileGenerator.d.ts.map +1 -1
- package/dist/utils/specFileGenerator.js +129 -1
- package/dist/utils/specFileGenerator.js.map +1 -1
- package/dist/utils/specGenerator.js +1 -1
- package/dist/utils/specGenerator.js.map +1 -1
- package/dist/utils/specTreePrinter.d.ts +8 -0
- package/dist/utils/specTreePrinter.d.ts.map +1 -0
- package/dist/utils/specTreePrinter.js +38 -0
- package/dist/utils/specTreePrinter.js.map +1 -0
- package/dist/utils/specValidator.d.ts +3 -0
- package/dist/utils/specValidator.d.ts.map +1 -1
- package/dist/utils/specValidator.js +81 -4
- package/dist/utils/specValidator.js.map +1 -1
- package/dist/utils/templateEngine.d.ts.map +1 -1
- package/dist/utils/templateEngine.js +8 -0
- package/dist/utils/templateEngine.js.map +1 -1
- package/package.json +3 -3
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.refineCommand = refineCommand;
|
|
7
|
+
const path_1 = require("path");
|
|
8
|
+
const fs_1 = require("fs");
|
|
9
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
10
|
+
const inquirer_1 = __importDefault(require("inquirer"));
|
|
11
|
+
const templateEngine_1 = require("../utils/templateEngine");
|
|
12
|
+
const specGenerator_1 = require("../utils/specGenerator");
|
|
13
|
+
const logger_1 = require("../utils/logger");
|
|
14
|
+
async function refineCommand(description, options) {
|
|
15
|
+
const logger = new logger_1.Logger();
|
|
16
|
+
try {
|
|
17
|
+
logger.info('📝 Refining project specifications...');
|
|
18
|
+
// Get description if not provided
|
|
19
|
+
let projectDescription = description;
|
|
20
|
+
if (!projectDescription && options.prompts) {
|
|
21
|
+
const response = await inquirer_1.default.prompt([{
|
|
22
|
+
type: 'input',
|
|
23
|
+
name: 'description',
|
|
24
|
+
message: 'Describe what you want to build:',
|
|
25
|
+
validate: (input) => input.length > 0 || 'Description is required'
|
|
26
|
+
}]);
|
|
27
|
+
projectDescription = response.description;
|
|
28
|
+
}
|
|
29
|
+
if (!projectDescription) {
|
|
30
|
+
logger.error('❌ No description provided. Use --help for usage information.');
|
|
31
|
+
process.exit(1);
|
|
32
|
+
}
|
|
33
|
+
// Find .specs directory
|
|
34
|
+
const specsDir = (0, path_1.join)(options.dir, options.specsName);
|
|
35
|
+
if (!(0, fs_1.existsSync)(specsDir)) {
|
|
36
|
+
logger.error(`❌ Specs directory not found: ${specsDir}`);
|
|
37
|
+
logger.info('💡 Run "specpilot init" first to create the project structure.');
|
|
38
|
+
process.exit(1);
|
|
39
|
+
}
|
|
40
|
+
// Read existing project.yaml to get current context
|
|
41
|
+
const projectYamlPath = (0, path_1.join)(specsDir, 'project', 'project.yaml');
|
|
42
|
+
if (!(0, fs_1.existsSync)(projectYamlPath)) {
|
|
43
|
+
logger.error('❌ project.yaml not found. Please ensure this is a valid SDD project.');
|
|
44
|
+
process.exit(1);
|
|
45
|
+
}
|
|
46
|
+
const projectYaml = (0, fs_1.readFileSync)(projectYamlPath, 'utf-8');
|
|
47
|
+
const projectName = extractProjectName(projectYaml);
|
|
48
|
+
const language = extractLanguage(projectYaml);
|
|
49
|
+
const framework = extractFramework(projectYaml);
|
|
50
|
+
logger.info(`🔍 Found project: ${projectName} (${language}${framework ? ` + ${framework}` : ''})`);
|
|
51
|
+
// ── Collect pending changes (without writing yet) ────────────
|
|
52
|
+
const pendingChanges = [];
|
|
53
|
+
const requirementsPath = (0, path_1.join)(specsDir, 'project', 'requirements.md');
|
|
54
|
+
if ((0, fs_1.existsSync)(requirementsPath)) {
|
|
55
|
+
const before = (0, fs_1.readFileSync)(requirementsPath, 'utf-8');
|
|
56
|
+
const after = updateRequirementsWithDescription(before, projectDescription, options.update);
|
|
57
|
+
if (after !== before) {
|
|
58
|
+
pendingChanges.push({ filePath: requirementsPath, label: 'requirements.md', before, after });
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
const contextPath = (0, path_1.join)(specsDir, 'development', 'context.md');
|
|
62
|
+
if ((0, fs_1.existsSync)(contextPath)) {
|
|
63
|
+
const before = (0, fs_1.readFileSync)(contextPath, 'utf-8');
|
|
64
|
+
const after = updateContextWithSpecification(before, projectDescription);
|
|
65
|
+
if (after !== before) {
|
|
66
|
+
pendingChanges.push({ filePath: contextPath, label: 'context.md', before, after });
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
const promptsPath = (0, path_1.join)(specsDir, 'development', 'prompts.md');
|
|
70
|
+
if ((0, fs_1.existsSync)(promptsPath)) {
|
|
71
|
+
const before = (0, fs_1.readFileSync)(promptsPath, 'utf-8');
|
|
72
|
+
const after = updatePromptsLog(before, projectDescription);
|
|
73
|
+
if (after !== before) {
|
|
74
|
+
pendingChanges.push({ filePath: promptsPath, label: 'prompts.md', before, after });
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
if (pendingChanges.length === 0) {
|
|
78
|
+
logger.info('ℹ️ No changes detected — spec files are already up to date.');
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
// ── Show diff preview ────────────────────────────────────────
|
|
82
|
+
console.log('');
|
|
83
|
+
logger.info(chalk_1.default.blue.bold('📋 Proposed changes:'));
|
|
84
|
+
console.log('');
|
|
85
|
+
for (const change of pendingChanges) {
|
|
86
|
+
console.log(chalk_1.default.cyan(`── ${change.label} ──`));
|
|
87
|
+
printSimpleDiff(change.before, change.after);
|
|
88
|
+
console.log('');
|
|
89
|
+
}
|
|
90
|
+
// ── Ask for confirmation (unless --no-prompts) ───────────────
|
|
91
|
+
if (options.prompts) {
|
|
92
|
+
const { confirmed } = await inquirer_1.default.prompt([{
|
|
93
|
+
type: 'confirm',
|
|
94
|
+
name: 'confirmed',
|
|
95
|
+
message: `Apply changes to ${pendingChanges.length} file(s)?`,
|
|
96
|
+
default: true,
|
|
97
|
+
}]);
|
|
98
|
+
if (!confirmed) {
|
|
99
|
+
logger.info('❌ Aborted — no files were modified.');
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
// ── Apply changes ────────────────────────────────────────────
|
|
104
|
+
for (const change of pendingChanges) {
|
|
105
|
+
(0, fs_1.writeFileSync)(change.filePath, change.after);
|
|
106
|
+
logger.success(`✅ Updated ${change.label}`);
|
|
107
|
+
}
|
|
108
|
+
// If update flag is set, regenerate specs with new context
|
|
109
|
+
if (options.update) {
|
|
110
|
+
logger.info('🔄 Regenerating specifications with updated context...');
|
|
111
|
+
const templateEngine = new templateEngine_1.TemplateEngine();
|
|
112
|
+
const specGenerator = new specGenerator_1.SpecGenerator(templateEngine);
|
|
113
|
+
await specGenerator.generateSpecs({
|
|
114
|
+
projectName: projectName || 'updated-project',
|
|
115
|
+
language: language || 'typescript',
|
|
116
|
+
framework: framework,
|
|
117
|
+
targetDir: options.dir,
|
|
118
|
+
specsName: options.specsName,
|
|
119
|
+
description: projectDescription
|
|
120
|
+
});
|
|
121
|
+
logger.success('✅ Regenerated specifications with new description');
|
|
122
|
+
}
|
|
123
|
+
logger.success(`🎯 Specifications refined successfully!`);
|
|
124
|
+
logger.info(`📁 Specs location: ${specsDir}`);
|
|
125
|
+
logger.info(`📋 Description: "${projectDescription}"`);
|
|
126
|
+
// Show next steps with logo
|
|
127
|
+
const nextStepsContent = [
|
|
128
|
+
chalk_1.default.blue.bold('Specifications Refined'),
|
|
129
|
+
'',
|
|
130
|
+
chalk_1.default.green('✅ Successfully refined project specifications'),
|
|
131
|
+
chalk_1.default.white(`📁 Location: ${specsDir}`),
|
|
132
|
+
chalk_1.default.white(`📋 Description: "${projectDescription}"`),
|
|
133
|
+
'',
|
|
134
|
+
chalk_1.default.cyan('📖 Next steps:'),
|
|
135
|
+
chalk_1.default.white(` # Review updated specifications in ${options.specsName}/`),
|
|
136
|
+
chalk_1.default.white(' specpilot validate # Validate your specifications'),
|
|
137
|
+
chalk_1.default.white(' # Continue development based on the updated requirements')
|
|
138
|
+
];
|
|
139
|
+
logger.displayWithLogo(nextStepsContent);
|
|
140
|
+
}
|
|
141
|
+
catch (error) {
|
|
142
|
+
logger.error(`❌ Failed to refine specifications: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
143
|
+
process.exit(1);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
function extractProjectName(yamlContent) {
|
|
147
|
+
const match = yamlContent.match(/name:\s*(.+)/);
|
|
148
|
+
return match ? match[1].trim() : undefined;
|
|
149
|
+
}
|
|
150
|
+
function extractLanguage(yamlContent) {
|
|
151
|
+
const match = yamlContent.match(/language:\s*(.+)/);
|
|
152
|
+
return match ? match[1].trim() : undefined;
|
|
153
|
+
}
|
|
154
|
+
function extractFramework(yamlContent) {
|
|
155
|
+
const match = yamlContent.match(/framework:\s*(.+)/);
|
|
156
|
+
return match ? match[1].trim() : undefined;
|
|
157
|
+
}
|
|
158
|
+
function updateRequirementsWithDescription(currentContent, description, replace = false) {
|
|
159
|
+
const descriptionSection = `## Project Overview
|
|
160
|
+
${description}
|
|
161
|
+
|
|
162
|
+
## Functional Requirements
|
|
163
|
+
`;
|
|
164
|
+
if (replace || !currentContent.includes('## Project Overview')) {
|
|
165
|
+
// Replace or add the project overview section
|
|
166
|
+
const lines = currentContent.split('\n');
|
|
167
|
+
const overviewIndex = lines.findIndex(line => line.includes('## Project Overview'));
|
|
168
|
+
if (overviewIndex !== -1) {
|
|
169
|
+
// Find the end of the overview section
|
|
170
|
+
let endIndex = overviewIndex + 1;
|
|
171
|
+
while (endIndex < lines.length && !lines[endIndex].startsWith('## ')) {
|
|
172
|
+
endIndex++;
|
|
173
|
+
}
|
|
174
|
+
// Replace the overview section
|
|
175
|
+
lines.splice(overviewIndex, endIndex - overviewIndex, ...descriptionSection.split('\n'));
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
// Add after title
|
|
179
|
+
const titleIndex = lines.findIndex(line => line.startsWith('# '));
|
|
180
|
+
if (titleIndex !== -1) {
|
|
181
|
+
lines.splice(titleIndex + 1, 0, '', descriptionSection);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
return lines.join('\n');
|
|
185
|
+
}
|
|
186
|
+
else {
|
|
187
|
+
// Append to existing overview
|
|
188
|
+
return currentContent.replace(/(## Project Overview[\s\S]*?)(\n## |\n*$)/, `$1\n\n### Additional Context\n${description}$2`);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
function updateContextWithSpecification(currentContent, description) {
|
|
192
|
+
const specEntry = `### Latest Specification Update
|
|
193
|
+
**Date**: ${new Date().toISOString().split('T')[0]}
|
|
194
|
+
**Description**: ${description}
|
|
195
|
+
**Source**: specpilot refine command
|
|
196
|
+
|
|
197
|
+
`;
|
|
198
|
+
// Add to the Project Memory section
|
|
199
|
+
if (currentContent.includes('## Project Memory')) {
|
|
200
|
+
return currentContent.replace(/(## Project Memory[\s\S]*?)(\n## |\n*$)/, `$1\n${specEntry}$2`);
|
|
201
|
+
}
|
|
202
|
+
else {
|
|
203
|
+
// Add new section
|
|
204
|
+
return currentContent + '\n\n## Project Memory\n' + specEntry;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
function updatePromptsLog(currentContent, description) {
|
|
208
|
+
const promptEntry = `### Specification Update (${new Date().toISOString().split('T')[0]})
|
|
209
|
+
|
|
210
|
+
#### Prompt: Project Specification
|
|
211
|
+
**Prompt**: "${description}"
|
|
212
|
+
|
|
213
|
+
**Context**: User provided specification description via specpilot refine command
|
|
214
|
+
|
|
215
|
+
**Response**:
|
|
216
|
+
- Updated requirements.md with project description
|
|
217
|
+
- Updated context.md with specification details
|
|
218
|
+
- Logged interaction in prompts.md
|
|
219
|
+
|
|
220
|
+
**Files Modified**: requirements.md, context.md, prompts.md
|
|
221
|
+
|
|
222
|
+
**Next Actions**: Review and validate updated specifications
|
|
223
|
+
|
|
224
|
+
---
|
|
225
|
+
|
|
226
|
+
`;
|
|
227
|
+
// Add to the Latest Entries section
|
|
228
|
+
if (currentContent.includes('## Latest Entries')) {
|
|
229
|
+
return currentContent.replace(/(## Latest Entries[\s\S]*?)(\n## |\n*$)/, `$1\n${promptEntry}$2`);
|
|
230
|
+
}
|
|
231
|
+
else {
|
|
232
|
+
// Add after Overview
|
|
233
|
+
return currentContent.replace(/(## Overview[\s\S]*?)(\n## |\n*$)/, `$1\n\n## Latest Entries\n${promptEntry}$2`);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Print a simple line-level diff between two strings.
|
|
238
|
+
* Added lines are green with "+", removed lines are red with "−".
|
|
239
|
+
* Only changed regions (with 2 lines of context) are shown.
|
|
240
|
+
*/
|
|
241
|
+
function printSimpleDiff(before, after) {
|
|
242
|
+
const oldLines = before.split('\n');
|
|
243
|
+
const newLines = after.split('\n');
|
|
244
|
+
const maxLen = Math.max(oldLines.length, newLines.length);
|
|
245
|
+
const CONTEXT = 2;
|
|
246
|
+
// Find which line indices have changes
|
|
247
|
+
const changedIndices = new Set();
|
|
248
|
+
for (let i = 0; i < maxLen; i++) {
|
|
249
|
+
if (oldLines[i] !== newLines[i]) {
|
|
250
|
+
changedIndices.add(i);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
if (changedIndices.size === 0)
|
|
254
|
+
return;
|
|
255
|
+
// Expand to include context lines
|
|
256
|
+
const visibleIndices = new Set();
|
|
257
|
+
for (const idx of changedIndices) {
|
|
258
|
+
for (let c = idx - CONTEXT; c <= idx + CONTEXT; c++) {
|
|
259
|
+
if (c >= 0 && c < maxLen)
|
|
260
|
+
visibleIndices.add(c);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
const sortedIndices = [...visibleIndices].sort((a, b) => a - b);
|
|
264
|
+
let lastPrinted = -2;
|
|
265
|
+
for (const i of sortedIndices) {
|
|
266
|
+
if (i > lastPrinted + 1) {
|
|
267
|
+
console.log(chalk_1.default.gray(' ...'));
|
|
268
|
+
}
|
|
269
|
+
lastPrinted = i;
|
|
270
|
+
const ol = oldLines[i];
|
|
271
|
+
const nl = newLines[i];
|
|
272
|
+
if (ol === nl) {
|
|
273
|
+
// Context line — unchanged
|
|
274
|
+
console.log(chalk_1.default.gray(` ${ol ?? ''}`));
|
|
275
|
+
}
|
|
276
|
+
else {
|
|
277
|
+
if (ol !== undefined) {
|
|
278
|
+
console.log(chalk_1.default.red(`- ${ol}`));
|
|
279
|
+
}
|
|
280
|
+
if (nl !== undefined) {
|
|
281
|
+
console.log(chalk_1.default.green(`+ ${nl}`));
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
//# sourceMappingURL=refine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"refine.js","sourceRoot":"","sources":["../../src/commands/refine.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAMA,qBAAa,MAAM;IACjB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAOnB;IAIF,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAI3B,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAI9B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAI3B,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAI5B,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAO5B,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI;IAYxC,cAAc,IAAI,IAAI;IA4BtB,wBAAwB,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,gBAAgB,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAoCtL,gBAAgB,CAAC,SAAS,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI;IAsCxJ,kBAAkB,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IA0BnF,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,eAAe,GAAE,OAAc,GAAG,IAAI;IAgBnF,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;CASlD"}
|
package/dist/utils/logger.js
CHANGED
|
@@ -5,16 +5,19 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.Logger = void 0;
|
|
7
7
|
const chalk_1 = __importDefault(require("chalk"));
|
|
8
|
+
const path_1 = require("path");
|
|
9
|
+
const specTreePrinter_1 = require("./specTreePrinter");
|
|
8
10
|
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
9
11
|
const pkg = require('../../package.json');
|
|
10
12
|
class Logger {
|
|
11
13
|
constructor() {
|
|
12
14
|
this.logo = [
|
|
13
|
-
'
|
|
14
|
-
'
|
|
15
|
-
'
|
|
16
|
-
'
|
|
17
|
-
'
|
|
15
|
+
'███████╗██████╗ ███████╗ ██████╗██████╗ ██╗██╗ ██████╗ ████████╗',
|
|
16
|
+
'██╔════╝██╔══██╗██╔════╝██╔════╝██╔══██╗██║██║ ██╔═══██╗╚══██╔══╝',
|
|
17
|
+
'███████╗██████╔╝█████╗ ██║ ██████╔╝██║██║ ██║ ██║ ██║',
|
|
18
|
+
'╚════██║██╔═══╝ ██╔══╝ ██║ ██╔═══╝ ██║██║ ██║ ██║ ██║',
|
|
19
|
+
'███████║██║ ███████╗╚██████╗██║ ██║███████╗╚██████╔╝ ██║',
|
|
20
|
+
'╚══════╝╚═╝ ╚══════╝ ╚═════╝╚═╝ ╚═╝╚══════╝ ╚═════╝ ╚═╝',
|
|
18
21
|
];
|
|
19
22
|
}
|
|
20
23
|
info(message) {
|
|
@@ -37,7 +40,7 @@ class Logger {
|
|
|
37
40
|
// Display with logo on top and content below
|
|
38
41
|
displayWithLogo(content) {
|
|
39
42
|
// First print the logo
|
|
40
|
-
console.log(chalk_1.default.
|
|
43
|
+
console.log(chalk_1.default.blueBright(this.logo.join('\n')));
|
|
41
44
|
// Then print a separator line
|
|
42
45
|
console.log('');
|
|
43
46
|
// Then print the content
|
|
@@ -51,12 +54,19 @@ class Logger {
|
|
|
51
54
|
chalk_1.default.green('✓ Welcome to Specification-Driven Development'),
|
|
52
55
|
'',
|
|
53
56
|
chalk_1.default.cyan('Available Commands:'),
|
|
54
|
-
chalk_1.default.white(' • init
|
|
55
|
-
chalk_1.default.white(' •
|
|
56
|
-
chalk_1.default.white(' • add-specs- Add specs to existing project'),
|
|
57
|
-
chalk_1.default.white(' •
|
|
57
|
+
chalk_1.default.white(' • init|i [options] <name> - Initialize new SDD project'),
|
|
58
|
+
chalk_1.default.white(' • init --dry-run - Preview files that would be created without writing'),
|
|
59
|
+
chalk_1.default.white(' • add-specs|add [options] - Add specs to existing project'),
|
|
60
|
+
chalk_1.default.white(' • validate|v [options] - Validate specification files'),
|
|
61
|
+
chalk_1.default.white(' • archive|ar [options] - Archive oversized prompts.md / tasks.md entries'),
|
|
62
|
+
chalk_1.default.white(' • list|ls [options] - Show available templates'),
|
|
63
|
+
chalk_1.default.white(' • migrate|m [options] - Migrate between spec versions'),
|
|
64
|
+
chalk_1.default.white(' • refine|ref [options] [desc]- Refine project specifications from natural language description'),
|
|
58
65
|
'',
|
|
59
|
-
chalk_1.default.
|
|
66
|
+
chalk_1.default.cyan('Aliases:'),
|
|
67
|
+
chalk_1.default.white(' init→i validate→v migrate→m list→ls refine→ref archive→ar add-specs→add'),
|
|
68
|
+
'',
|
|
69
|
+
chalk_1.default.yellow('⚠️ Tip: Use --help for detailed command options, e.g. specpilot init --help'),
|
|
60
70
|
'',
|
|
61
71
|
chalk_1.default.gray('Ready for your next project! 🚀')
|
|
62
72
|
];
|
|
@@ -137,6 +147,9 @@ class Logger {
|
|
|
137
147
|
chalk_1.default.white(`📁 Location: ${targetDir}`),
|
|
138
148
|
chalk_1.default.white(`📋 Specs: ${specsPath}`),
|
|
139
149
|
'',
|
|
150
|
+
chalk_1.default.cyan.bold('Generated specs:'),
|
|
151
|
+
...(0, specTreePrinter_1.getSpecTreeLines)((0, path_1.basename)(specsPath)),
|
|
152
|
+
'',
|
|
140
153
|
chalk_1.default.cyan('🚀 Next steps to populate your specs with AI:'),
|
|
141
154
|
chalk_1.default.white('1. Open .specs/README.md for full guidance'),
|
|
142
155
|
chalk_1.default.white('2. Copy the onboarding prompt from .specs/development/prompts.md'),
|
package/dist/utils/logger.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":";;;;;;AAAA,kDAA0B;AAC1B,8DAA8D;AAC9D,MAAM,GAAG,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;AAE1C,MAAa,MAAM;IAAnB;QACmB,SAAI,GAAG;
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export interface ArchiveEntry {
|
|
2
|
+
file: string;
|
|
3
|
+
archiveFile: string;
|
|
4
|
+
linesMoved: number;
|
|
5
|
+
}
|
|
6
|
+
export interface ArchiveResult {
|
|
7
|
+
entries: ArchiveEntry[];
|
|
8
|
+
dryRun: boolean;
|
|
9
|
+
}
|
|
10
|
+
export declare class SpecArchiver {
|
|
11
|
+
private findSpecsDir;
|
|
12
|
+
archive(projectDir: string, options: {
|
|
13
|
+
dryRun: boolean;
|
|
14
|
+
}): Promise<ArchiveResult>;
|
|
15
|
+
private buildTimestampedBlock;
|
|
16
|
+
private extractFrontMatter;
|
|
17
|
+
private archivePrompts;
|
|
18
|
+
private archiveTasks;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=specArchiver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"specArchiver.d.ts","sourceRoot":"","sources":["../../src/utils/specArchiver.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,MAAM,EAAE,OAAO,CAAC;CACjB;AAaD,qBAAa,YAAY;IACvB,OAAO,CAAC,YAAY;IAQd,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE;QAAE,MAAM,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,aAAa,CAAC;IAiBvF,OAAO,CAAC,qBAAqB;IAK7B,OAAO,CAAC,kBAAkB;IAc1B,OAAO,CAAC,cAAc;IAiCtB,OAAO,CAAC,YAAY;CA2CrB"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SpecArchiver = void 0;
|
|
4
|
+
const fs_1 = require("fs");
|
|
5
|
+
const path_1 = require("path");
|
|
6
|
+
const SPECS_DIR_CANDIDATES = ['.specs', '.project-spec', 'specs', 'specifications'];
|
|
7
|
+
/** Trim prompts.md to this many total lines after archiving. */
|
|
8
|
+
const PROMPTS_LINE_LIMIT = 300;
|
|
9
|
+
const PROMPTS_KEEP_LINES = 250;
|
|
10
|
+
/** Archive tasks.md Completed section when it exceeds this many lines. */
|
|
11
|
+
const COMPLETED_LINE_LIMIT = 150;
|
|
12
|
+
/** How many Completed entries to retain in the active file. */
|
|
13
|
+
const COMPLETED_KEEP_ENTRIES = 100;
|
|
14
|
+
class SpecArchiver {
|
|
15
|
+
findSpecsDir(projectDir) {
|
|
16
|
+
for (const name of SPECS_DIR_CANDIDATES) {
|
|
17
|
+
const p = (0, path_1.join)(projectDir, name);
|
|
18
|
+
if ((0, fs_1.existsSync)(p))
|
|
19
|
+
return p;
|
|
20
|
+
}
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
async archive(projectDir, options) {
|
|
24
|
+
const specsDir = this.findSpecsDir(projectDir);
|
|
25
|
+
if (!specsDir) {
|
|
26
|
+
throw new Error('No .specs directory found. Run `specpilot init` first.');
|
|
27
|
+
}
|
|
28
|
+
const result = { entries: [], dryRun: options.dryRun };
|
|
29
|
+
const promptsEntry = this.archivePrompts(specsDir, options.dryRun);
|
|
30
|
+
if (promptsEntry)
|
|
31
|
+
result.entries.push(promptsEntry);
|
|
32
|
+
const tasksEntry = this.archiveTasks(specsDir, options.dryRun);
|
|
33
|
+
if (tasksEntry)
|
|
34
|
+
result.entries.push(tasksEntry);
|
|
35
|
+
return result;
|
|
36
|
+
}
|
|
37
|
+
buildTimestampedBlock(content) {
|
|
38
|
+
const now = new Date().toISOString().replace('T', ' ').slice(0, 19);
|
|
39
|
+
return `## Archived on ${now}\n\n${content.trimEnd()}\n\n---\n\n`;
|
|
40
|
+
}
|
|
41
|
+
extractFrontMatter(lines) {
|
|
42
|
+
if (lines[0]?.trim() !== '---') {
|
|
43
|
+
return { preamble: [], body: lines };
|
|
44
|
+
}
|
|
45
|
+
const closeIdx = lines.findIndex((l, i) => i > 0 && l.trim() === '---');
|
|
46
|
+
if (closeIdx === -1) {
|
|
47
|
+
return { preamble: [], body: lines };
|
|
48
|
+
}
|
|
49
|
+
return {
|
|
50
|
+
preamble: lines.slice(0, closeIdx + 1),
|
|
51
|
+
body: lines.slice(closeIdx + 1),
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
archivePrompts(specsDir, dryRun) {
|
|
55
|
+
const filePath = (0, path_1.join)(specsDir, 'development', 'prompts.md');
|
|
56
|
+
if (!(0, fs_1.existsSync)(filePath))
|
|
57
|
+
return null;
|
|
58
|
+
const content = (0, fs_1.readFileSync)(filePath, 'utf-8');
|
|
59
|
+
const allLines = content.split('\n');
|
|
60
|
+
if (allLines.length <= PROMPTS_LINE_LIMIT)
|
|
61
|
+
return null;
|
|
62
|
+
const { preamble, body } = this.extractFrontMatter(allLines);
|
|
63
|
+
// Determine how many body lines to retain so total stays near PROMPTS_KEEP_LINES
|
|
64
|
+
const keepBodyCount = Math.max(50, PROMPTS_KEEP_LINES - preamble.length);
|
|
65
|
+
if (body.length <= keepBodyCount)
|
|
66
|
+
return null;
|
|
67
|
+
const archiveLines = body.slice(0, body.length - keepBodyCount);
|
|
68
|
+
const keepLines = body.slice(body.length - keepBodyCount);
|
|
69
|
+
const linesMoved = archiveLines.length;
|
|
70
|
+
const archivePath = (0, path_1.join)(specsDir, 'development', 'prompts-archive.md');
|
|
71
|
+
const block = this.buildTimestampedBlock(archiveLines.join('\n'));
|
|
72
|
+
if (!dryRun) {
|
|
73
|
+
const existing = (0, fs_1.existsSync)(archivePath) ? (0, fs_1.readFileSync)(archivePath, 'utf-8') : '';
|
|
74
|
+
(0, fs_1.writeFileSync)(archivePath, existing + block);
|
|
75
|
+
(0, fs_1.writeFileSync)(filePath, [...preamble, ...keepLines].join('\n'));
|
|
76
|
+
}
|
|
77
|
+
return {
|
|
78
|
+
file: 'development/prompts.md',
|
|
79
|
+
archiveFile: 'development/prompts-archive.md',
|
|
80
|
+
linesMoved,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
archiveTasks(specsDir, dryRun) {
|
|
84
|
+
const filePath = (0, path_1.join)(specsDir, 'planning', 'tasks.md');
|
|
85
|
+
if (!(0, fs_1.existsSync)(filePath))
|
|
86
|
+
return null;
|
|
87
|
+
const content = (0, fs_1.readFileSync)(filePath, 'utf-8');
|
|
88
|
+
const allLines = content.split('\n');
|
|
89
|
+
const completedIdx = allLines.findIndex(l => l.trim() === '## Completed');
|
|
90
|
+
if (completedIdx === -1)
|
|
91
|
+
return null;
|
|
92
|
+
// Section size consistent with specValidator's check
|
|
93
|
+
const sectionSize = allLines.length - completedIdx;
|
|
94
|
+
if (sectionSize <= COMPLETED_LINE_LIMIT)
|
|
95
|
+
return null;
|
|
96
|
+
// Skip past the ## Completed heading and any notes/blank lines to find numbered entries
|
|
97
|
+
let entryStartIdx = completedIdx + 1;
|
|
98
|
+
while (entryStartIdx < allLines.length && !/^\d+\./.test(allLines[entryStartIdx])) {
|
|
99
|
+
entryStartIdx++;
|
|
100
|
+
}
|
|
101
|
+
if (entryStartIdx >= allLines.length)
|
|
102
|
+
return null;
|
|
103
|
+
const entryLines = allLines.slice(entryStartIdx);
|
|
104
|
+
if (entryLines.length <= COMPLETED_KEEP_ENTRIES)
|
|
105
|
+
return null;
|
|
106
|
+
const archiveEntries = entryLines.slice(0, entryLines.length - COMPLETED_KEEP_ENTRIES);
|
|
107
|
+
const keepEntries = entryLines.slice(entryLines.length - COMPLETED_KEEP_ENTRIES);
|
|
108
|
+
const linesMoved = archiveEntries.length;
|
|
109
|
+
const archivePath = (0, path_1.join)(specsDir, 'planning', 'tasks-archive.md');
|
|
110
|
+
const block = this.buildTimestampedBlock(archiveEntries.join('\n'));
|
|
111
|
+
if (!dryRun) {
|
|
112
|
+
const existing = (0, fs_1.existsSync)(archivePath) ? (0, fs_1.readFileSync)(archivePath, 'utf-8') : '';
|
|
113
|
+
(0, fs_1.writeFileSync)(archivePath, existing + block);
|
|
114
|
+
(0, fs_1.writeFileSync)(filePath, [...allLines.slice(0, entryStartIdx), ...keepEntries].join('\n'));
|
|
115
|
+
}
|
|
116
|
+
return {
|
|
117
|
+
file: 'planning/tasks.md',
|
|
118
|
+
archiveFile: 'planning/tasks-archive.md',
|
|
119
|
+
linesMoved,
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
exports.SpecArchiver = SpecArchiver;
|
|
124
|
+
//# sourceMappingURL=specArchiver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"specArchiver.js","sourceRoot":"","sources":["../../src/utils/specArchiver.ts"],"names":[],"mappings":";;;AAAA,2BAA6D;AAC7D,+BAA4B;AAa5B,MAAM,oBAAoB,GAAG,CAAC,QAAQ,EAAE,eAAe,EAAE,OAAO,EAAE,gBAAgB,CAAC,CAAC;AAEpF,gEAAgE;AAChE,MAAM,kBAAkB,GAAG,GAAG,CAAC;AAC/B,MAAM,kBAAkB,GAAG,GAAG,CAAC;AAE/B,0EAA0E;AAC1E,MAAM,oBAAoB,GAAG,GAAG,CAAC;AACjC,+DAA+D;AAC/D,MAAM,sBAAsB,GAAG,GAAG,CAAC;AAEnC,MAAa,YAAY;IACf,YAAY,CAAC,UAAkB;QACrC,KAAK,MAAM,IAAI,IAAI,oBAAoB,EAAE,CAAC;YACxC,MAAM,CAAC,GAAG,IAAA,WAAI,EAAC,UAAU,EAAE,IAAI,CAAC,CAAC;YACjC,IAAI,IAAA,eAAU,EAAC,CAAC,CAAC;gBAAE,OAAO,CAAC,CAAC;QAC9B,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,UAAkB,EAAE,OAA4B;QAC5D,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;QAC/C,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;QAC5E,CAAC;QAED,MAAM,MAAM,GAAkB,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;QAEtE,MAAM,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QACnE,IAAI,YAAY;YAAE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAEpD,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QAC/D,IAAI,UAAU;YAAE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAEhD,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,qBAAqB,CAAC,OAAe;QAC3C,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACpE,OAAO,kBAAkB,GAAG,OAAO,OAAO,CAAC,OAAO,EAAE,aAAa,CAAC;IACpE,CAAC;IAEO,kBAAkB,CAAC,KAAe;QACxC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,KAAK,EAAE,CAAC;YAC/B,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;QACvC,CAAC;QACD,MAAM,QAAQ,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,KAAK,CAAC,CAAC;QACxE,IAAI,QAAQ,KAAK,CAAC,CAAC,EAAE,CAAC;YACpB,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;QACvC,CAAC;QACD,OAAO;YACL,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,GAAG,CAAC,CAAC;YACtC,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC;SAChC,CAAC;IACJ,CAAC;IAEO,cAAc,CAAC,QAAgB,EAAE,MAAe;QACtD,MAAM,QAAQ,GAAG,IAAA,WAAI,EAAC,QAAQ,EAAE,aAAa,EAAE,YAAY,CAAC,CAAC;QAC7D,IAAI,CAAC,IAAA,eAAU,EAAC,QAAQ,CAAC;YAAE,OAAO,IAAI,CAAC;QAEvC,MAAM,OAAO,GAAG,IAAA,iBAAY,EAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAChD,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,QAAQ,CAAC,MAAM,IAAI,kBAAkB;YAAE,OAAO,IAAI,CAAC;QAEvD,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QAC7D,iFAAiF;QACjF,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,kBAAkB,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;QACzE,IAAI,IAAI,CAAC,MAAM,IAAI,aAAa;YAAE,OAAO,IAAI,CAAC;QAE9C,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,aAAa,CAAC,CAAC;QAChE,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,aAAa,CAAC,CAAC;QAC1D,MAAM,UAAU,GAAG,YAAY,CAAC,MAAM,CAAC;QAEvC,MAAM,WAAW,GAAG,IAAA,WAAI,EAAC,QAAQ,EAAE,aAAa,EAAE,oBAAoB,CAAC,CAAC;QACxE,MAAM,KAAK,GAAG,IAAI,CAAC,qBAAqB,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAElE,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,QAAQ,GAAG,IAAA,eAAU,EAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAA,iBAAY,EAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACnF,IAAA,kBAAa,EAAC,WAAW,EAAE,QAAQ,GAAG,KAAK,CAAC,CAAC;YAC7C,IAAA,kBAAa,EAAC,QAAQ,EAAE,CAAC,GAAG,QAAQ,EAAE,GAAG,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAClE,CAAC;QAED,OAAO;YACL,IAAI,EAAE,wBAAwB;YAC9B,WAAW,EAAE,gCAAgC;YAC7C,UAAU;SACX,CAAC;IACJ,CAAC;IAEO,YAAY,CAAC,QAAgB,EAAE,MAAe;QACpD,MAAM,QAAQ,GAAG,IAAA,WAAI,EAAC,QAAQ,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;QACxD,IAAI,CAAC,IAAA,eAAU,EAAC,QAAQ,CAAC;YAAE,OAAO,IAAI,CAAC;QAEvC,MAAM,OAAO,GAAG,IAAA,iBAAY,EAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAChD,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAErC,MAAM,YAAY,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,cAAc,CAAC,CAAC;QAC1E,IAAI,YAAY,KAAK,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;QAErC,qDAAqD;QACrD,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,GAAG,YAAY,CAAC;QACnD,IAAI,WAAW,IAAI,oBAAoB;YAAE,OAAO,IAAI,CAAC;QAErD,wFAAwF;QACxF,IAAI,aAAa,GAAG,YAAY,GAAG,CAAC,CAAC;QACrC,OAAO,aAAa,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC;YAClF,aAAa,EAAE,CAAC;QAClB,CAAC;QACD,IAAI,aAAa,IAAI,QAAQ,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QAElD,MAAM,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QACjD,IAAI,UAAU,CAAC,MAAM,IAAI,sBAAsB;YAAE,OAAO,IAAI,CAAC;QAE7D,MAAM,cAAc,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,MAAM,GAAG,sBAAsB,CAAC,CAAC;QACvF,MAAM,WAAW,GAAG,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,GAAG,sBAAsB,CAAC,CAAC;QACjF,MAAM,UAAU,GAAG,cAAc,CAAC,MAAM,CAAC;QAEzC,MAAM,WAAW,GAAG,IAAA,WAAI,EAAC,QAAQ,EAAE,UAAU,EAAE,kBAAkB,CAAC,CAAC;QACnE,MAAM,KAAK,GAAG,IAAI,CAAC,qBAAqB,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAEpE,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,QAAQ,GAAG,IAAA,eAAU,EAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAA,iBAAY,EAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACnF,IAAA,kBAAa,EAAC,WAAW,EAAE,QAAQ,GAAG,KAAK,CAAC,CAAC;YAC7C,IAAA,kBAAa,EAAC,QAAQ,EAAE,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,EAAE,GAAG,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC5F,CAAC;QAED,OAAO;YACL,IAAI,EAAE,mBAAmB;YACzB,WAAW,EAAE,2BAA2B;YACxC,UAAU;SACX,CAAC;IACJ,CAAC;CACF;AAzHD,oCAyHC"}
|
|
@@ -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;
|
|
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"}
|