dino-spec 0.1.3 → 0.2.0
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/dist/cli/index.js +1 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +202 -40
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/update.d.ts +2 -1
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +198 -31
- package/dist/commands/update.js.map +1 -1
- package/dist/core/config.d.ts +24 -0
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +101 -0
- package/dist/core/config.js.map +1 -1
- package/dist/core/templates/rules-template.d.ts.map +1 -1
- package/dist/core/templates/rules-template.js +5 -1
- package/dist/core/templates/rules-template.js.map +1 -1
- package/dist/core/templates/skill-template.d.ts.map +1 -1
- package/dist/core/templates/skill-template.js +5 -1
- package/dist/core/templates/skill-template.js.map +1 -1
- package/dist/core/templates/slash-commands.d.ts.map +1 -1
- package/dist/core/templates/slash-commands.js +17 -10
- package/dist/core/templates/slash-commands.js.map +1 -1
- package/dist/utils/file-system.d.ts +34 -0
- package/dist/utils/file-system.d.ts.map +1 -1
- package/dist/utils/file-system.js +67 -1
- package/dist/utils/file-system.js.map +1 -1
- package/package.json +1 -1
package/dist/cli/index.js
CHANGED
|
@@ -71,6 +71,7 @@ program
|
|
|
71
71
|
.command('update')
|
|
72
72
|
.description('Update dino-spec configuration files')
|
|
73
73
|
.option('-f, --force', 'Force overwrite existing files')
|
|
74
|
+
.option('-n, --dry-run', 'Preview changes without applying them')
|
|
74
75
|
.action(async (options) => {
|
|
75
76
|
await updateCommand(options);
|
|
76
77
|
});
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAqBA,UAAU,WAAW;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAqKD;;GAEG;AACH,wBAAsB,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAkIzF"}
|
package/dist/commands/init.js
CHANGED
|
@@ -2,12 +2,137 @@ import chalk from 'chalk';
|
|
|
2
2
|
import ora from 'ora';
|
|
3
3
|
import { join } from 'path';
|
|
4
4
|
import { FileSystem } from '../utils/file-system.js';
|
|
5
|
-
import { getSuccessDino
|
|
6
|
-
import { DINO_DIR_NAME, CLAUDE_DIR_NAME, DINO_DIRS, CLAUDE_DIRS, FILES, VERSION, } from '../core/config.js';
|
|
5
|
+
import { getSuccessDino } from '../utils/ascii-art.js';
|
|
6
|
+
import { DINO_DIR_NAME, CLAUDE_DIR_NAME, DINO_DIRS, CLAUDE_DIRS, FILES, VERSION, GENERATED_FILES, } from '../core/config.js';
|
|
7
7
|
import { getSlashCommandTemplates } from '../core/templates/slash-commands.js';
|
|
8
8
|
import { getWorkflowSkillTemplate } from '../core/templates/skill-template.js';
|
|
9
9
|
import { getWorkflowRulesTemplate } from '../core/templates/rules-template.js';
|
|
10
10
|
import { getDnaTemplate } from '../core/templates/dna-template.js';
|
|
11
|
+
/**
|
|
12
|
+
* Get template content for a given template key
|
|
13
|
+
*/
|
|
14
|
+
function getTemplateContent(templateKey, templates) {
|
|
15
|
+
// Check slash command templates first
|
|
16
|
+
if (templates[templateKey]) {
|
|
17
|
+
return templates[templateKey];
|
|
18
|
+
}
|
|
19
|
+
// Check other templates
|
|
20
|
+
switch (templateKey) {
|
|
21
|
+
case 'workflowSkill':
|
|
22
|
+
return getWorkflowSkillTemplate();
|
|
23
|
+
case 'workflowRules':
|
|
24
|
+
return getWorkflowRulesTemplate();
|
|
25
|
+
case 'projectDna':
|
|
26
|
+
return getDnaTemplate();
|
|
27
|
+
default:
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Determine what action to take for each file during init
|
|
33
|
+
*/
|
|
34
|
+
async function planInitActions(projectDir, force) {
|
|
35
|
+
const actions = [];
|
|
36
|
+
for (const [fileName, meta] of Object.entries(GENERATED_FILES)) {
|
|
37
|
+
// Skip active.json - handled separately
|
|
38
|
+
if (meta.templateKey === 'activeJson') {
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
const filePath = join(projectDir, meta.relativePath);
|
|
42
|
+
const exists = await FileSystem.exists(filePath);
|
|
43
|
+
if (!exists) {
|
|
44
|
+
// File doesn't exist - create it
|
|
45
|
+
actions.push({
|
|
46
|
+
filePath,
|
|
47
|
+
fileName,
|
|
48
|
+
action: 'create',
|
|
49
|
+
reason: 'File does not exist',
|
|
50
|
+
behavior: meta.behavior,
|
|
51
|
+
meta,
|
|
52
|
+
});
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
// File exists - determine action based on behavior and force flag
|
|
56
|
+
switch (meta.behavior) {
|
|
57
|
+
case 'protected':
|
|
58
|
+
// Protected files are never overwritten (dna.md)
|
|
59
|
+
actions.push({
|
|
60
|
+
filePath,
|
|
61
|
+
fileName,
|
|
62
|
+
action: 'skip',
|
|
63
|
+
reason: 'Protected file with user content',
|
|
64
|
+
behavior: meta.behavior,
|
|
65
|
+
meta,
|
|
66
|
+
});
|
|
67
|
+
break;
|
|
68
|
+
case 'always-replace':
|
|
69
|
+
if (force) {
|
|
70
|
+
// Force flag overrides everything
|
|
71
|
+
actions.push({
|
|
72
|
+
filePath,
|
|
73
|
+
fileName,
|
|
74
|
+
action: 'replace',
|
|
75
|
+
reason: 'Force flag enabled',
|
|
76
|
+
behavior: meta.behavior,
|
|
77
|
+
meta,
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
// Check version to determine if update needed
|
|
82
|
+
const versionResult = await FileSystem.checkFileVersion(filePath);
|
|
83
|
+
if (versionResult.needsUpdate) {
|
|
84
|
+
const versionInfo = versionResult.currentVersion
|
|
85
|
+
? `${versionResult.currentVersion} -> ${versionResult.latestVersion}`
|
|
86
|
+
: `${versionResult.reason} -> ${versionResult.latestVersion}`;
|
|
87
|
+
actions.push({
|
|
88
|
+
filePath,
|
|
89
|
+
fileName,
|
|
90
|
+
action: 'replace',
|
|
91
|
+
reason: `Outdated (${versionInfo})`,
|
|
92
|
+
behavior: meta.behavior,
|
|
93
|
+
meta,
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
actions.push({
|
|
98
|
+
filePath,
|
|
99
|
+
fileName,
|
|
100
|
+
action: 'skip',
|
|
101
|
+
reason: 'Already up to date',
|
|
102
|
+
behavior: meta.behavior,
|
|
103
|
+
meta,
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
break;
|
|
108
|
+
case 'data-file':
|
|
109
|
+
// Data files are merged, not replaced
|
|
110
|
+
actions.push({
|
|
111
|
+
filePath,
|
|
112
|
+
fileName,
|
|
113
|
+
action: 'merge',
|
|
114
|
+
reason: 'Merge with existing data',
|
|
115
|
+
behavior: meta.behavior,
|
|
116
|
+
meta,
|
|
117
|
+
});
|
|
118
|
+
break;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return actions;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Execute a file action
|
|
125
|
+
*/
|
|
126
|
+
async function executeAction(action, templates) {
|
|
127
|
+
if (action.action === 'skip') {
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
const content = getTemplateContent(action.meta.templateKey, templates);
|
|
131
|
+
if (!content) {
|
|
132
|
+
throw new Error(`No template found for ${action.meta.templateKey}`);
|
|
133
|
+
}
|
|
134
|
+
await FileSystem.writeFile(action.filePath, content);
|
|
135
|
+
}
|
|
11
136
|
/**
|
|
12
137
|
* Initialize dino-spec in a project
|
|
13
138
|
*/
|
|
@@ -15,43 +140,61 @@ export async function initCommand(targetPath, options) {
|
|
|
15
140
|
const projectDir = join(process.cwd(), targetPath);
|
|
16
141
|
const dinoDir = join(projectDir, DINO_DIR_NAME);
|
|
17
142
|
const claudeDir = join(projectDir, CLAUDE_DIR_NAME);
|
|
18
|
-
// Check if already initialized
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
143
|
+
// Check if already initialized (but allow reinit with smart updates)
|
|
144
|
+
const alreadyInitialized = await FileSystem.exists(dinoDir);
|
|
145
|
+
if (alreadyInitialized && !options.force) {
|
|
146
|
+
// Show a different message - we'll do a smart update instead of blocking
|
|
147
|
+
console.log(chalk.dim('\ndino-spec is already initialized. Checking for updates...\n'));
|
|
23
148
|
}
|
|
24
|
-
const spinner = ora('
|
|
149
|
+
const spinner = ora('Planning initialization...').start();
|
|
25
150
|
try {
|
|
26
|
-
//
|
|
27
|
-
|
|
151
|
+
// Plan what actions to take
|
|
152
|
+
const actions = await planInitActions(projectDir, options.force ?? false);
|
|
153
|
+
const result = {
|
|
154
|
+
created: [],
|
|
155
|
+
updated: [],
|
|
156
|
+
skipped: [],
|
|
157
|
+
};
|
|
158
|
+
// Create directory structure
|
|
159
|
+
spinner.text = 'Creating directory structure...';
|
|
28
160
|
await FileSystem.createDirectory(join(dinoDir, DINO_DIRS.specs));
|
|
29
161
|
await FileSystem.createDirectory(join(dinoDir, DINO_DIRS.archive));
|
|
30
|
-
// Create active.json
|
|
31
|
-
await FileSystem.writeJson(join(dinoDir, FILES.active), {
|
|
32
|
-
id: null,
|
|
33
|
-
phase: null,
|
|
34
|
-
createdAt: null,
|
|
35
|
-
});
|
|
36
|
-
// Create dna.md template
|
|
37
|
-
await FileSystem.writeFile(join(dinoDir, FILES.dna), getDnaTemplate());
|
|
38
|
-
// Create .claude directory structure
|
|
39
|
-
spinner.text = 'Creating .claude/commands...';
|
|
40
162
|
await FileSystem.createDirectory(join(claudeDir, CLAUDE_DIRS.commands));
|
|
41
|
-
// Create slash commands
|
|
42
|
-
const slashCommands = getSlashCommandTemplates();
|
|
43
|
-
for (const [name, content] of Object.entries(slashCommands)) {
|
|
44
|
-
await FileSystem.writeFile(join(claudeDir, CLAUDE_DIRS.commands, `dino.${name}.md`), content);
|
|
45
|
-
}
|
|
46
|
-
// Create skills directory and workflow skill
|
|
47
|
-
spinner.text = 'Creating .claude/skills/dino-workflow...';
|
|
48
163
|
await FileSystem.createDirectory(join(claudeDir, CLAUDE_DIRS.skills));
|
|
49
|
-
await FileSystem.writeFile(join(claudeDir, CLAUDE_DIRS.skills, 'SKILL.md'), getWorkflowSkillTemplate());
|
|
50
|
-
// Create rules directory and workflow rules
|
|
51
|
-
spinner.text = 'Creating .claude/rules/dino...';
|
|
52
164
|
await FileSystem.createDirectory(join(claudeDir, CLAUDE_DIRS.rules));
|
|
53
|
-
|
|
54
|
-
|
|
165
|
+
// Get templates
|
|
166
|
+
const templates = getSlashCommandTemplates();
|
|
167
|
+
// Execute planned actions
|
|
168
|
+
spinner.text = 'Generating files...';
|
|
169
|
+
for (const action of actions) {
|
|
170
|
+
await executeAction(action, templates);
|
|
171
|
+
switch (action.action) {
|
|
172
|
+
case 'create':
|
|
173
|
+
result.created.push(action.fileName);
|
|
174
|
+
break;
|
|
175
|
+
case 'replace':
|
|
176
|
+
result.updated.push(action.fileName);
|
|
177
|
+
break;
|
|
178
|
+
case 'skip':
|
|
179
|
+
result.skipped.push(action.fileName);
|
|
180
|
+
break;
|
|
181
|
+
case 'merge':
|
|
182
|
+
// Merge is treated as update
|
|
183
|
+
result.updated.push(action.fileName);
|
|
184
|
+
break;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
// Handle active.json separately (always create if missing, merge if exists)
|
|
188
|
+
const activeJsonPath = join(dinoDir, FILES.active);
|
|
189
|
+
if (!await FileSystem.exists(activeJsonPath)) {
|
|
190
|
+
await FileSystem.writeJson(activeJsonPath, {
|
|
191
|
+
id: null,
|
|
192
|
+
phase: null,
|
|
193
|
+
createdAt: null,
|
|
194
|
+
});
|
|
195
|
+
result.created.push('active.json');
|
|
196
|
+
}
|
|
197
|
+
// Configure hooks
|
|
55
198
|
spinner.text = 'Configuring hooks...';
|
|
56
199
|
const settingsPath = join(claudeDir, 'settings.json');
|
|
57
200
|
await FileSystem.deepMergeJson(settingsPath, {
|
|
@@ -69,17 +212,36 @@ export async function initCommand(targetPath, options) {
|
|
|
69
212
|
},
|
|
70
213
|
});
|
|
71
214
|
spinner.succeed('dino-spec initialized successfully!');
|
|
72
|
-
// Show success message
|
|
215
|
+
// Show success message with summary
|
|
73
216
|
console.log(getSuccessDino(`dino-spec v${VERSION} is ready!`));
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
217
|
+
// Show detailed summary
|
|
218
|
+
if (result.created.length > 0) {
|
|
219
|
+
console.log(chalk.green(` Created: ${result.created.length} files`));
|
|
220
|
+
}
|
|
221
|
+
if (result.updated.length > 0) {
|
|
222
|
+
console.log(chalk.yellow(` Updated: ${result.updated.length} files`));
|
|
223
|
+
}
|
|
224
|
+
if (result.skipped.length > 0) {
|
|
225
|
+
console.log(chalk.dim(` Skipped: ${result.skipped.length} files (protected/up-to-date)`));
|
|
226
|
+
}
|
|
227
|
+
// Show what was skipped if there are protected files
|
|
228
|
+
const protectedSkipped = actions.filter(a => a.action === 'skip' && a.behavior === 'protected');
|
|
229
|
+
if (protectedSkipped.length > 0) {
|
|
230
|
+
console.log('');
|
|
231
|
+
console.log(chalk.dim(' Protected files (user content preserved):'));
|
|
232
|
+
for (const action of protectedSkipped) {
|
|
233
|
+
console.log(chalk.dim(` - ${action.meta.relativePath}`));
|
|
234
|
+
}
|
|
235
|
+
}
|
|
79
236
|
console.log('');
|
|
80
237
|
console.log(chalk.bold(' Next steps:'));
|
|
81
|
-
|
|
82
|
-
|
|
238
|
+
if (!alreadyInitialized || options.force) {
|
|
239
|
+
console.log(chalk.cyan(' 1. Edit .dino/dna.md with your project conventions'));
|
|
240
|
+
console.log(chalk.cyan(' 2. Run /dino.discover <your feature idea>'));
|
|
241
|
+
}
|
|
242
|
+
else {
|
|
243
|
+
console.log(chalk.cyan(' Run /dino.discover <your feature idea>'));
|
|
244
|
+
}
|
|
83
245
|
console.log('');
|
|
84
246
|
}
|
|
85
247
|
catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,UAAU,
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
interface UpdateOptions {
|
|
2
2
|
force?: boolean;
|
|
3
|
+
dryRun?: boolean;
|
|
3
4
|
}
|
|
4
5
|
/**
|
|
5
|
-
* Update dino-spec configuration files
|
|
6
|
+
* Update dino-spec configuration files
|
|
6
7
|
*/
|
|
7
8
|
export declare function updateCommand(options?: UpdateOptions): Promise<void>;
|
|
8
9
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAkBA,UAAU,aAAa;IACrB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAmJD;;GAEG;AACH,wBAAsB,aAAa,CAAC,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA2H1E"}
|
package/dist/commands/update.js
CHANGED
|
@@ -2,59 +2,226 @@ import chalk from 'chalk';
|
|
|
2
2
|
import ora from 'ora';
|
|
3
3
|
import { join } from 'path';
|
|
4
4
|
import { FileSystem } from '../utils/file-system.js';
|
|
5
|
-
import { DINO_DIR_NAME,
|
|
5
|
+
import { DINO_DIR_NAME, GENERATED_FILES, TEMPLATE_VERSION, VERSION, } from '../core/config.js';
|
|
6
6
|
import { getSlashCommandTemplates } from '../core/templates/slash-commands.js';
|
|
7
7
|
import { getWorkflowSkillTemplate } from '../core/templates/skill-template.js';
|
|
8
8
|
import { getWorkflowRulesTemplate } from '../core/templates/rules-template.js';
|
|
9
|
+
import { getDnaTemplate } from '../core/templates/dna-template.js';
|
|
9
10
|
/**
|
|
10
|
-
*
|
|
11
|
+
* Get template content for a given template key
|
|
12
|
+
*/
|
|
13
|
+
function getTemplateContent(templateKey, templates) {
|
|
14
|
+
if (templates[templateKey]) {
|
|
15
|
+
return templates[templateKey];
|
|
16
|
+
}
|
|
17
|
+
switch (templateKey) {
|
|
18
|
+
case 'workflowSkill':
|
|
19
|
+
return getWorkflowSkillTemplate();
|
|
20
|
+
case 'workflowRules':
|
|
21
|
+
return getWorkflowRulesTemplate();
|
|
22
|
+
case 'projectDna':
|
|
23
|
+
return getDnaTemplate();
|
|
24
|
+
default:
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Analyze files and determine what needs updating
|
|
30
|
+
*/
|
|
31
|
+
async function analyzeFiles(projectDir, force) {
|
|
32
|
+
const actions = [];
|
|
33
|
+
for (const [fileName, meta] of Object.entries(GENERATED_FILES)) {
|
|
34
|
+
// Skip active.json - it's a data file that shouldn't be touched
|
|
35
|
+
if (meta.templateKey === 'activeJson') {
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
const filePath = join(projectDir, meta.relativePath);
|
|
39
|
+
const exists = await FileSystem.exists(filePath);
|
|
40
|
+
if (!exists) {
|
|
41
|
+
// File missing - will create
|
|
42
|
+
actions.push({
|
|
43
|
+
filePath,
|
|
44
|
+
fileName,
|
|
45
|
+
action: 'create',
|
|
46
|
+
reason: 'File missing',
|
|
47
|
+
behavior: meta.behavior,
|
|
48
|
+
currentVersion: null,
|
|
49
|
+
meta,
|
|
50
|
+
});
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
switch (meta.behavior) {
|
|
54
|
+
case 'protected':
|
|
55
|
+
// Protected files are never updated
|
|
56
|
+
actions.push({
|
|
57
|
+
filePath,
|
|
58
|
+
fileName,
|
|
59
|
+
action: 'skip',
|
|
60
|
+
reason: 'Protected file - contains user customizations',
|
|
61
|
+
behavior: meta.behavior,
|
|
62
|
+
currentVersion: null,
|
|
63
|
+
meta,
|
|
64
|
+
});
|
|
65
|
+
break;
|
|
66
|
+
case 'always-replace':
|
|
67
|
+
const versionResult = await FileSystem.checkFileVersion(filePath);
|
|
68
|
+
if (force) {
|
|
69
|
+
actions.push({
|
|
70
|
+
filePath,
|
|
71
|
+
fileName,
|
|
72
|
+
action: 'replace',
|
|
73
|
+
reason: 'Force update',
|
|
74
|
+
behavior: meta.behavior,
|
|
75
|
+
currentVersion: versionResult.currentVersion,
|
|
76
|
+
meta,
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
else if (versionResult.needsUpdate) {
|
|
80
|
+
const reasonText = versionResult.reason === 'legacy'
|
|
81
|
+
? 'Legacy file (no version marker)'
|
|
82
|
+
: `Version ${versionResult.currentVersion} -> ${TEMPLATE_VERSION}`;
|
|
83
|
+
actions.push({
|
|
84
|
+
filePath,
|
|
85
|
+
fileName,
|
|
86
|
+
action: 'replace',
|
|
87
|
+
reason: reasonText,
|
|
88
|
+
behavior: meta.behavior,
|
|
89
|
+
currentVersion: versionResult.currentVersion,
|
|
90
|
+
meta,
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
actions.push({
|
|
95
|
+
filePath,
|
|
96
|
+
fileName,
|
|
97
|
+
action: 'skip',
|
|
98
|
+
reason: `Already at version ${TEMPLATE_VERSION}`,
|
|
99
|
+
behavior: meta.behavior,
|
|
100
|
+
currentVersion: versionResult.currentVersion,
|
|
101
|
+
meta,
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
break;
|
|
105
|
+
case 'data-file':
|
|
106
|
+
// Data files are not updated via this command
|
|
107
|
+
actions.push({
|
|
108
|
+
filePath,
|
|
109
|
+
fileName,
|
|
110
|
+
action: 'skip',
|
|
111
|
+
reason: 'Data file - no updates needed',
|
|
112
|
+
behavior: meta.behavior,
|
|
113
|
+
currentVersion: null,
|
|
114
|
+
meta,
|
|
115
|
+
});
|
|
116
|
+
break;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return actions;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Update dino-spec configuration files
|
|
11
123
|
*/
|
|
12
124
|
export async function updateCommand(options) {
|
|
13
125
|
const cwd = process.cwd();
|
|
14
126
|
const dinoDir = join(cwd, DINO_DIR_NAME);
|
|
15
|
-
const claudeDir = join(cwd, CLAUDE_DIR_NAME);
|
|
16
127
|
// Check if dino is initialized
|
|
17
128
|
if (!await FileSystem.exists(dinoDir)) {
|
|
18
129
|
console.log(chalk.yellow('\nNo .dino directory found.'));
|
|
19
130
|
console.log(chalk.dim('Run "dino init" to initialize dino-spec in this project.\n'));
|
|
20
131
|
return;
|
|
21
132
|
}
|
|
22
|
-
const spinner = ora('
|
|
133
|
+
const spinner = ora('Analyzing files...').start();
|
|
23
134
|
try {
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
const
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
135
|
+
const actions = await analyzeFiles(cwd, options?.force ?? false);
|
|
136
|
+
// Separate actions by type for reporting
|
|
137
|
+
const toUpdate = actions.filter(a => a.action === 'create' || a.action === 'replace');
|
|
138
|
+
const toSkip = actions.filter(a => a.action === 'skip');
|
|
139
|
+
const upToDate = toSkip.filter(a => a.reason.includes('Already at version'));
|
|
140
|
+
const protected_ = toSkip.filter(a => a.behavior === 'protected');
|
|
141
|
+
const dataFiles = toSkip.filter(a => a.behavior === 'data-file');
|
|
142
|
+
// Dry run - just show what would happen
|
|
143
|
+
if (options?.dryRun) {
|
|
144
|
+
spinner.succeed('Analysis complete (dry run)');
|
|
145
|
+
console.log('');
|
|
146
|
+
if (toUpdate.length > 0) {
|
|
147
|
+
console.log(chalk.bold(' Would update:'));
|
|
148
|
+
for (const action of toUpdate) {
|
|
149
|
+
const icon = action.action === 'create' ? '+' : '~';
|
|
150
|
+
const color = action.action === 'create' ? chalk.green : chalk.yellow;
|
|
151
|
+
console.log(color(` ${icon} ${action.fileName}`), chalk.dim(`(${action.reason})`));
|
|
152
|
+
}
|
|
153
|
+
console.log('');
|
|
34
154
|
}
|
|
155
|
+
if (upToDate.length > 0) {
|
|
156
|
+
console.log(chalk.dim(` Up to date: ${upToDate.length} files`));
|
|
157
|
+
}
|
|
158
|
+
if (protected_.length > 0) {
|
|
159
|
+
console.log(chalk.dim(' Protected (skipped):'));
|
|
160
|
+
for (const action of protected_) {
|
|
161
|
+
console.log(chalk.dim(` - ${action.fileName}`));
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
console.log('');
|
|
165
|
+
console.log(chalk.dim('Run without --dry-run to apply changes.\n'));
|
|
166
|
+
return;
|
|
35
167
|
}
|
|
36
|
-
//
|
|
37
|
-
|
|
38
|
-
const
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
const
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
168
|
+
// Execute updates
|
|
169
|
+
spinner.text = 'Updating files...';
|
|
170
|
+
const templates = getSlashCommandTemplates();
|
|
171
|
+
const result = {
|
|
172
|
+
updated: [],
|
|
173
|
+
skipped: [],
|
|
174
|
+
upToDate: [],
|
|
175
|
+
};
|
|
176
|
+
for (const action of actions) {
|
|
177
|
+
if (action.action === 'skip') {
|
|
178
|
+
if (action.reason.includes('Already at version')) {
|
|
179
|
+
result.upToDate.push(action.fileName);
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
result.skipped.push({ file: action.fileName, reason: action.reason });
|
|
183
|
+
}
|
|
184
|
+
continue;
|
|
185
|
+
}
|
|
186
|
+
// Get and write template content
|
|
187
|
+
const content = getTemplateContent(action.meta.templateKey, templates);
|
|
188
|
+
if (content) {
|
|
189
|
+
await FileSystem.writeFile(action.filePath, content);
|
|
190
|
+
result.updated.push({
|
|
191
|
+
file: action.fileName,
|
|
192
|
+
from: action.currentVersion,
|
|
193
|
+
to: TEMPLATE_VERSION,
|
|
194
|
+
});
|
|
195
|
+
}
|
|
49
196
|
}
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
197
|
+
// Show results
|
|
198
|
+
if (result.updated.length === 0) {
|
|
199
|
+
spinner.succeed('All files are up to date');
|
|
53
200
|
}
|
|
54
201
|
else {
|
|
55
|
-
spinner.succeed(`
|
|
202
|
+
spinner.succeed(`Update complete (dino-spec v${VERSION})`);
|
|
203
|
+
}
|
|
204
|
+
console.log('');
|
|
205
|
+
if (result.updated.length > 0) {
|
|
206
|
+
console.log(chalk.green(' Updated:'));
|
|
207
|
+
for (const item of result.updated) {
|
|
208
|
+
const versionInfo = item.from
|
|
209
|
+
? chalk.dim(` (${item.from} -> ${item.to})`)
|
|
210
|
+
: chalk.dim(` (-> ${item.to})`);
|
|
211
|
+
console.log(` ${item.file}${versionInfo}`);
|
|
212
|
+
}
|
|
56
213
|
console.log('');
|
|
57
214
|
}
|
|
215
|
+
if (result.upToDate.length > 0) {
|
|
216
|
+
console.log(chalk.dim(` Up to date: ${result.upToDate.length} files`));
|
|
217
|
+
}
|
|
218
|
+
if (result.skipped.length > 0) {
|
|
219
|
+
console.log(chalk.dim(' Skipped:'));
|
|
220
|
+
for (const item of result.skipped) {
|
|
221
|
+
console.log(chalk.dim(` ${item.file} - ${item.reason}`));
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
console.log('');
|
|
58
225
|
}
|
|
59
226
|
catch (error) {
|
|
60
227
|
spinner.fail('Failed to update configuration');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"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"}
|
package/dist/core/config.d.ts
CHANGED
|
@@ -13,7 +13,31 @@ export declare const DINO_MARKERS: {
|
|
|
13
13
|
readonly coreEnd: "<!-- DINO:CORE:END -->";
|
|
14
14
|
readonly userStart: "<!-- DINO:USER:START -->";
|
|
15
15
|
readonly userEnd: "<!-- DINO:USER:END -->";
|
|
16
|
+
readonly versionPrefix: "<!-- DINO:VERSION:";
|
|
17
|
+
readonly versionSuffix: " -->";
|
|
16
18
|
};
|
|
19
|
+
/**
|
|
20
|
+
* Template version - increment when template content changes significantly
|
|
21
|
+
* This is separate from package version to allow independent template updates
|
|
22
|
+
*/
|
|
23
|
+
export declare const TEMPLATE_VERSION = "1.0.0";
|
|
24
|
+
/**
|
|
25
|
+
* File update behavior categories
|
|
26
|
+
*/
|
|
27
|
+
export type FileUpdateBehavior = 'always-replace' | 'protected' | 'data-file';
|
|
28
|
+
/**
|
|
29
|
+
* Metadata for a generated file
|
|
30
|
+
*/
|
|
31
|
+
export interface GeneratedFileMetadata {
|
|
32
|
+
relativePath: string;
|
|
33
|
+
behavior: FileUpdateBehavior;
|
|
34
|
+
templateKey: string;
|
|
35
|
+
description: string;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Registry of all generated files and their update behaviors
|
|
39
|
+
*/
|
|
40
|
+
export declare const GENERATED_FILES: Record<string, GeneratedFileMetadata>;
|
|
17
41
|
/** Workflow phases in order */
|
|
18
42
|
export declare const WORKFLOW_PHASES: readonly ["discover", "scout", "clarify", "nest", "hatch", "hunt", "fossil", "next"];
|
|
19
43
|
export type WorkflowPhase = typeof WORKFLOW_PHASES[number];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,yCAAyC;AACzC,eAAO,MAAM,aAAa,UAAU,CAAC;AAErC,mDAAmD;AACnD,eAAO,MAAM,eAAe,YAAY,CAAC;AAEzC,2CAA2C;AAC3C,eAAO,MAAM,YAAY
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,yCAAyC;AACzC,eAAO,MAAM,aAAa,UAAU,CAAC;AAErC,mDAAmD;AACnD,eAAO,MAAM,eAAe,YAAY,CAAC;AAEzC,2CAA2C;AAC3C,eAAO,MAAM,YAAY;;;;;;;;;CASf,CAAC;AAEX;;;GAGG;AACH,eAAO,MAAM,gBAAgB,UAAU,CAAC;AAExC;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG,gBAAgB,GAAG,WAAW,GAAG,WAAW,CAAC;AAE9E;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,qBAAqB,CA0FjE,CAAC;AAEF,+BAA+B;AAC/B,eAAO,MAAM,eAAe,sFASlB,CAAC;AAEX,MAAM,MAAM,aAAa,GAAG,OAAO,eAAe,CAAC,MAAM,CAAC,CAAC;AAE3D,oCAAoC;AACpC,eAAO,MAAM,gBAAgB,EAAE,aAAa,EAAsB,CAAC;AAEnE,yDAAyD;AACzD,eAAO,MAAM,wBAAwB,IAAI,CAAC;AAE1C,sDAAsD;AACtD,eAAO,MAAM,mBAAmB,KAAK,CAAC;AAEtC,oBAAoB;AACpB,eAAO,MAAM,aAAa,uDAAwD,CAAC;AACnF,MAAM,MAAM,UAAU,GAAG,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC;AAEtD,iBAAiB;AACjB,eAAO,MAAM,KAAK;;;;;;;CAOR,CAAC;AAEX,mCAAmC;AACnC,eAAO,MAAM,SAAS;;;CAGZ,CAAC;AAEX,qCAAqC;AACrC,eAAO,MAAM,WAAW;;;;CAId,CAAC;AAEX,+CAA+C;AAC/C,eAAO,MAAM,OAAO,EAAE,MAAoB,CAAC"}
|
package/dist/core/config.js
CHANGED
|
@@ -16,6 +16,107 @@ export const DINO_MARKERS = {
|
|
|
16
16
|
coreEnd: '<!-- DINO:CORE:END -->',
|
|
17
17
|
userStart: '<!-- DINO:USER:START -->',
|
|
18
18
|
userEnd: '<!-- DINO:USER:END -->',
|
|
19
|
+
versionPrefix: '<!-- DINO:VERSION:',
|
|
20
|
+
versionSuffix: ' -->',
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Template version - increment when template content changes significantly
|
|
24
|
+
* This is separate from package version to allow independent template updates
|
|
25
|
+
*/
|
|
26
|
+
export const TEMPLATE_VERSION = '1.0.0';
|
|
27
|
+
/**
|
|
28
|
+
* Registry of all generated files and their update behaviors
|
|
29
|
+
*/
|
|
30
|
+
export const GENERATED_FILES = {
|
|
31
|
+
// Slash commands - always replaceable (no user content)
|
|
32
|
+
'dino.discover.md': {
|
|
33
|
+
relativePath: '.claude/commands/dino.discover.md',
|
|
34
|
+
behavior: 'always-replace',
|
|
35
|
+
templateKey: 'discover',
|
|
36
|
+
description: 'Discover phase slash command',
|
|
37
|
+
},
|
|
38
|
+
'dino.scout.md': {
|
|
39
|
+
relativePath: '.claude/commands/dino.scout.md',
|
|
40
|
+
behavior: 'always-replace',
|
|
41
|
+
templateKey: 'scout',
|
|
42
|
+
description: 'Scout phase slash command',
|
|
43
|
+
},
|
|
44
|
+
'dino.clarify.md': {
|
|
45
|
+
relativePath: '.claude/commands/dino.clarify.md',
|
|
46
|
+
behavior: 'always-replace',
|
|
47
|
+
templateKey: 'clarify',
|
|
48
|
+
description: 'Clarify phase slash command',
|
|
49
|
+
},
|
|
50
|
+
'dino.nest.md': {
|
|
51
|
+
relativePath: '.claude/commands/dino.nest.md',
|
|
52
|
+
behavior: 'always-replace',
|
|
53
|
+
templateKey: 'nest',
|
|
54
|
+
description: 'Nest phase slash command',
|
|
55
|
+
},
|
|
56
|
+
'dino.hatch.md': {
|
|
57
|
+
relativePath: '.claude/commands/dino.hatch.md',
|
|
58
|
+
behavior: 'always-replace',
|
|
59
|
+
templateKey: 'hatch',
|
|
60
|
+
description: 'Hatch phase slash command',
|
|
61
|
+
},
|
|
62
|
+
'dino.hunt.md': {
|
|
63
|
+
relativePath: '.claude/commands/dino.hunt.md',
|
|
64
|
+
behavior: 'always-replace',
|
|
65
|
+
templateKey: 'hunt',
|
|
66
|
+
description: 'Hunt phase slash command',
|
|
67
|
+
},
|
|
68
|
+
'dino.fossil.md': {
|
|
69
|
+
relativePath: '.claude/commands/dino.fossil.md',
|
|
70
|
+
behavior: 'always-replace',
|
|
71
|
+
templateKey: 'fossil',
|
|
72
|
+
description: 'Fossil phase slash command',
|
|
73
|
+
},
|
|
74
|
+
'dino.next.md': {
|
|
75
|
+
relativePath: '.claude/commands/dino.next.md',
|
|
76
|
+
behavior: 'always-replace',
|
|
77
|
+
templateKey: 'next',
|
|
78
|
+
description: 'Next suggestions slash command',
|
|
79
|
+
},
|
|
80
|
+
'dino.dna.md': {
|
|
81
|
+
relativePath: '.claude/commands/dino.dna.md',
|
|
82
|
+
behavior: 'always-replace',
|
|
83
|
+
templateKey: 'dna',
|
|
84
|
+
description: 'DNA analysis slash command',
|
|
85
|
+
},
|
|
86
|
+
'dino.skill.md': {
|
|
87
|
+
relativePath: '.claude/commands/dino.skill.md',
|
|
88
|
+
behavior: 'always-replace',
|
|
89
|
+
templateKey: 'skill',
|
|
90
|
+
description: 'Skill creation slash command',
|
|
91
|
+
},
|
|
92
|
+
// Workflow skill - always replaceable
|
|
93
|
+
'SKILL.md': {
|
|
94
|
+
relativePath: '.claude/skills/dino-workflow/SKILL.md',
|
|
95
|
+
behavior: 'always-replace',
|
|
96
|
+
templateKey: 'workflowSkill',
|
|
97
|
+
description: 'Dino workflow skill definition',
|
|
98
|
+
},
|
|
99
|
+
// Workflow rules - always replaceable
|
|
100
|
+
'workflow.md': {
|
|
101
|
+
relativePath: '.claude/rules/dino/workflow.md',
|
|
102
|
+
behavior: 'always-replace',
|
|
103
|
+
templateKey: 'workflowRules',
|
|
104
|
+
description: 'Dino workflow rules',
|
|
105
|
+
},
|
|
106
|
+
// Project DNA - protected (user customizations)
|
|
107
|
+
'dna.md': {
|
|
108
|
+
relativePath: '.dino/dna.md',
|
|
109
|
+
behavior: 'protected',
|
|
110
|
+
templateKey: 'projectDna',
|
|
111
|
+
description: 'Project conventions (user-customized)',
|
|
112
|
+
},
|
|
113
|
+
// Active spec pointer - data file
|
|
114
|
+
'active.json': {
|
|
115
|
+
relativePath: '.dino/active.json',
|
|
116
|
+
behavior: 'data-file',
|
|
117
|
+
templateKey: 'activeJson',
|
|
118
|
+
description: 'Active specification pointer',
|
|
119
|
+
},
|
|
19
120
|
};
|
|
20
121
|
/** Workflow phases in order */
|
|
21
122
|
export const WORKFLOW_PHASES = [
|
package/dist/core/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;AAE1C,yCAAyC;AACzC,MAAM,CAAC,MAAM,aAAa,GAAG,OAAO,CAAC;AAErC,mDAAmD;AACnD,MAAM,CAAC,MAAM,eAAe,GAAG,SAAS,CAAC;AAEzC,2CAA2C;AAC3C,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,KAAK,EAAE,qBAAqB;IAC5B,GAAG,EAAE,mBAAmB;IACxB,SAAS,EAAE,0BAA0B;IACrC,OAAO,EAAE,wBAAwB;IACjC,SAAS,EAAE,0BAA0B;IACrC,OAAO,EAAE,wBAAwB;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rules-template.d.ts","sourceRoot":"","sources":["../../../src/core/templates/rules-template.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"rules-template.d.ts","sourceRoot":"","sources":["../../../src/core/templates/rules-template.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH,wBAAgB,wBAAwB,IAAI,MAAM,CAkEjD"}
|
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Template for .claude/rules/dino/workflow.md
|
|
3
3
|
*/
|
|
4
|
+
import { DINO_MARKERS, TEMPLATE_VERSION } from '../config.js';
|
|
5
|
+
function getVersionHeader() {
|
|
6
|
+
return `${DINO_MARKERS.versionPrefix}${TEMPLATE_VERSION}${DINO_MARKERS.versionSuffix}\n`;
|
|
7
|
+
}
|
|
4
8
|
export function getWorkflowRulesTemplate() {
|
|
5
|
-
return
|
|
9
|
+
return `${getVersionHeader()}---
|
|
6
10
|
paths:
|
|
7
11
|
- ".dino/**"
|
|
8
12
|
- ".claude/commands/dino/**"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rules-template.js","sourceRoot":"","sources":["../../../src/core/templates/rules-template.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"rules-template.js","sourceRoot":"","sources":["../../../src/core/templates/rules-template.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAE9D,SAAS,gBAAgB;IACvB,OAAO,GAAG,YAAY,CAAC,aAAa,GAAG,gBAAgB,GAAG,YAAY,CAAC,aAAa,IAAI,CAAC;AAC3F,CAAC;AAED,MAAM,UAAU,wBAAwB;IACtC,OAAO,GAAG,gBAAgB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgE7B,CAAC;AACF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill-template.d.ts","sourceRoot":"","sources":["../../../src/core/templates/skill-template.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"skill-template.d.ts","sourceRoot":"","sources":["../../../src/core/templates/skill-template.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH,wBAAgB,wBAAwB,IAAI,MAAM,CA0DjD"}
|
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Template for .claude/skills/dino-workflow/SKILL.md
|
|
3
3
|
*/
|
|
4
|
+
import { DINO_MARKERS, TEMPLATE_VERSION } from '../config.js';
|
|
5
|
+
function getVersionHeader() {
|
|
6
|
+
return `${DINO_MARKERS.versionPrefix}${TEMPLATE_VERSION}${DINO_MARKERS.versionSuffix}\n`;
|
|
7
|
+
}
|
|
4
8
|
export function getWorkflowSkillTemplate() {
|
|
5
|
-
return
|
|
9
|
+
return `${getVersionHeader()}---
|
|
6
10
|
name: dino-workflow
|
|
7
11
|
description: Structured specification-driven development workflow with dinosaur-themed phases
|
|
8
12
|
---
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill-template.js","sourceRoot":"","sources":["../../../src/core/templates/skill-template.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"skill-template.js","sourceRoot":"","sources":["../../../src/core/templates/skill-template.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAE9D,SAAS,gBAAgB;IACvB,OAAO,GAAG,YAAY,CAAC,aAAa,GAAG,gBAAgB,GAAG,YAAY,CAAC,aAAa,IAAI,CAAC;AAC3F,CAAC;AAED,MAAM,UAAU,wBAAwB;IACtC,OAAO,GAAG,gBAAgB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwD7B,CAAC;AACF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slash-commands.d.ts","sourceRoot":"","sources":["../../../src/core/templates/slash-commands.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"slash-commands.d.ts","sourceRoot":"","sources":["../../../src/core/templates/slash-commands.ts"],"names":[],"mappings":"AAAA;;GAEG;AAWH,wBAAgB,wBAAwB,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAajE"}
|
|
@@ -1,6 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Slash command templates for .claude/commands/dino/
|
|
3
3
|
*/
|
|
4
|
+
import { DINO_MARKERS, TEMPLATE_VERSION } from '../config.js';
|
|
5
|
+
/**
|
|
6
|
+
* Generate version header for template files
|
|
7
|
+
*/
|
|
8
|
+
function getVersionHeader() {
|
|
9
|
+
return `${DINO_MARKERS.versionPrefix}${TEMPLATE_VERSION}${DINO_MARKERS.versionSuffix}\n`;
|
|
10
|
+
}
|
|
4
11
|
export function getSlashCommandTemplates() {
|
|
5
12
|
return {
|
|
6
13
|
discover: getDiscoverTemplate(),
|
|
@@ -16,7 +23,7 @@ export function getSlashCommandTemplates() {
|
|
|
16
23
|
};
|
|
17
24
|
}
|
|
18
25
|
function getDiscoverTemplate() {
|
|
19
|
-
return
|
|
26
|
+
return `${getVersionHeader()}---
|
|
20
27
|
description: Create a new specification from user intent
|
|
21
28
|
argument-hint: <feature description>
|
|
22
29
|
---
|
|
@@ -88,7 +95,7 @@ Created: {date} | Status: draft | Phase: discover
|
|
|
88
95
|
`;
|
|
89
96
|
}
|
|
90
97
|
function getScoutTemplate() {
|
|
91
|
-
return
|
|
98
|
+
return `${getVersionHeader()}---
|
|
92
99
|
description: Research codebase and technical options for the active spec
|
|
93
100
|
argument-hint: [tech stack or focus area]
|
|
94
101
|
---
|
|
@@ -169,7 +176,7 @@ $ARGUMENTS
|
|
|
169
176
|
`;
|
|
170
177
|
}
|
|
171
178
|
function getClarifyTemplate() {
|
|
172
|
-
return
|
|
179
|
+
return `${getVersionHeader()}---
|
|
173
180
|
description: Resolve ambiguity in the active specification
|
|
174
181
|
---
|
|
175
182
|
|
|
@@ -226,7 +233,7 @@ Use AskUserQuestion tool with this structure:
|
|
|
226
233
|
`;
|
|
227
234
|
}
|
|
228
235
|
function getNestTemplate() {
|
|
229
|
-
return
|
|
236
|
+
return `${getVersionHeader()}---
|
|
230
237
|
description: Create implementation plan for the active spec (requires Plan Mode)
|
|
231
238
|
---
|
|
232
239
|
|
|
@@ -311,7 +318,7 @@ You are creating the implementation plan for the active specification.
|
|
|
311
318
|
`;
|
|
312
319
|
}
|
|
313
320
|
function getHatchTemplate() {
|
|
314
|
-
return
|
|
321
|
+
return `${getVersionHeader()}---
|
|
315
322
|
description: Break implementation plan into phased tasks
|
|
316
323
|
---
|
|
317
324
|
|
|
@@ -403,7 +410,7 @@ You are breaking the implementation plan into actionable, phased tasks.
|
|
|
403
410
|
`;
|
|
404
411
|
}
|
|
405
412
|
function getHuntTemplate() {
|
|
406
|
-
return
|
|
413
|
+
return `${getVersionHeader()}---
|
|
407
414
|
description: Implement tasks from the active specification
|
|
408
415
|
---
|
|
409
416
|
|
|
@@ -469,7 +476,7 @@ Next: T004 Add validation to user model
|
|
|
469
476
|
`;
|
|
470
477
|
}
|
|
471
478
|
function getFossilTemplate() {
|
|
472
|
-
return
|
|
479
|
+
return `${getVersionHeader()}---
|
|
473
480
|
description: Archive the completed specification
|
|
474
481
|
---
|
|
475
482
|
|
|
@@ -532,7 +539,7 @@ Duration: {time from created to now}
|
|
|
532
539
|
`;
|
|
533
540
|
}
|
|
534
541
|
function getNextTemplate() {
|
|
535
|
-
return
|
|
542
|
+
return `${getVersionHeader()}---
|
|
536
543
|
description: Suggest next features or improvements
|
|
537
544
|
---
|
|
538
545
|
|
|
@@ -586,7 +593,7 @@ Present each suggestion as:
|
|
|
586
593
|
`;
|
|
587
594
|
}
|
|
588
595
|
function getDnaCommandTemplate() {
|
|
589
|
-
return
|
|
596
|
+
return `${getVersionHeader()}---
|
|
590
597
|
description: Generate project-specific skills based on tech stack analysis
|
|
591
598
|
---
|
|
592
599
|
|
|
@@ -676,7 +683,7 @@ Run ESLint to catch errors and enforce code style after generating or modifying
|
|
|
676
683
|
`;
|
|
677
684
|
}
|
|
678
685
|
function getSkillCommandTemplate() {
|
|
679
|
-
return
|
|
686
|
+
return `${getVersionHeader()}---
|
|
680
687
|
description: Create a custom skill from description
|
|
681
688
|
argument-hint: <skill description>
|
|
682
689
|
---
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slash-commands.js","sourceRoot":"","sources":["../../../src/core/templates/slash-commands.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,UAAU,wBAAwB;IACtC,OAAO;QACL,QAAQ,EAAE,mBAAmB,EAAE;QAC/B,KAAK,EAAE,gBAAgB,EAAE;QACzB,OAAO,EAAE,kBAAkB,EAAE;QAC7B,IAAI,EAAE,eAAe,EAAE;QACvB,KAAK,EAAE,gBAAgB,EAAE;QACzB,IAAI,EAAE,eAAe,EAAE;QACvB,MAAM,EAAE,iBAAiB,EAAE;QAC3B,IAAI,EAAE,eAAe,EAAE;QACvB,GAAG,EAAE,qBAAqB,EAAE;QAC5B,KAAK,EAAE,uBAAuB,EAAE;KACjC,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB;IAC1B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"slash-commands.js","sourceRoot":"","sources":["../../../src/core/templates/slash-commands.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAE9D;;GAEG;AACH,SAAS,gBAAgB;IACvB,OAAO,GAAG,YAAY,CAAC,aAAa,GAAG,gBAAgB,GAAG,YAAY,CAAC,aAAa,IAAI,CAAC;AAC3F,CAAC;AAED,MAAM,UAAU,wBAAwB;IACtC,OAAO;QACL,QAAQ,EAAE,mBAAmB,EAAE;QAC/B,KAAK,EAAE,gBAAgB,EAAE;QACzB,OAAO,EAAE,kBAAkB,EAAE;QAC7B,IAAI,EAAE,eAAe,EAAE;QACvB,KAAK,EAAE,gBAAgB,EAAE;QACzB,IAAI,EAAE,eAAe,EAAE;QACvB,MAAM,EAAE,iBAAiB,EAAE;QAC3B,IAAI,EAAE,eAAe,EAAE;QACvB,GAAG,EAAE,qBAAqB,EAAE;QAC5B,KAAK,EAAE,uBAAuB,EAAE;KACjC,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB;IAC1B,OAAO,GAAG,gBAAgB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqE7B,CAAC;AACF,CAAC;AAED,SAAS,gBAAgB;IACvB,OAAO,GAAG,gBAAgB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8E7B,CAAC;AACF,CAAC;AAED,SAAS,kBAAkB;IACzB,OAAO,GAAG,gBAAgB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsD7B,CAAC;AACF,CAAC;AAED,SAAS,eAAe;IACtB,OAAO,GAAG,gBAAgB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkF7B,CAAC;AACF,CAAC;AAED,SAAS,gBAAgB;IACvB,OAAO,GAAG,gBAAgB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyF7B,CAAC;AACF,CAAC;AAED,SAAS,eAAe;IACtB,OAAO,GAAG,gBAAgB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+D7B,CAAC;AACF,CAAC;AAED,SAAS,iBAAiB;IACxB,OAAO,GAAG,gBAAgB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4D7B,CAAC;AACF,CAAC;AAED,SAAS,eAAe;IACtB,OAAO,GAAG,gBAAgB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmD7B,CAAC;AACF,CAAC;AAED,SAAS,qBAAqB;IAC5B,OAAO,GAAG,gBAAgB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuF7B,CAAC;AACF,CAAC;AAED,SAAS,uBAAuB;IAC9B,OAAO,GAAG,gBAAgB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwE7B,CAAC;AACF,CAAC"}
|
|
@@ -1,3 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Version info extracted from a file
|
|
3
|
+
*/
|
|
4
|
+
export interface FileVersionInfo {
|
|
5
|
+
version: string | null;
|
|
6
|
+
hasVersionMarker: boolean;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Result of checking file version
|
|
10
|
+
*/
|
|
11
|
+
export interface VersionCheckResult {
|
|
12
|
+
filePath: string;
|
|
13
|
+
currentVersion: string | null;
|
|
14
|
+
latestVersion: string;
|
|
15
|
+
needsUpdate: boolean;
|
|
16
|
+
reason: 'missing' | 'outdated' | 'legacy' | 'up-to-date';
|
|
17
|
+
}
|
|
1
18
|
/**
|
|
2
19
|
* File system utilities for dino-spec
|
|
3
20
|
*/
|
|
@@ -63,5 +80,22 @@ export declare class FileSystem {
|
|
|
63
80
|
* Deep merge JSON object into existing file
|
|
64
81
|
*/
|
|
65
82
|
static deepMergeJson<T extends Record<string, unknown>>(path: string, data: Partial<T>): Promise<void>;
|
|
83
|
+
/**
|
|
84
|
+
* Extract version info from file content
|
|
85
|
+
*/
|
|
86
|
+
static extractVersionInfo(content: string): FileVersionInfo;
|
|
87
|
+
/**
|
|
88
|
+
* Compare semver versions
|
|
89
|
+
* Returns: -1 if a < b, 0 if a === b, 1 if a > b
|
|
90
|
+
*/
|
|
91
|
+
static compareVersions(a: string, b: string): number;
|
|
92
|
+
/**
|
|
93
|
+
* Check if a file needs updating based on version
|
|
94
|
+
*/
|
|
95
|
+
static checkFileVersion(filePath: string): Promise<VersionCheckResult>;
|
|
96
|
+
/**
|
|
97
|
+
* Generate version header for template files
|
|
98
|
+
*/
|
|
99
|
+
static getVersionHeader(): string;
|
|
66
100
|
}
|
|
67
101
|
//# sourceMappingURL=file-system.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-system.d.ts","sourceRoot":"","sources":["../../src/utils/file-system.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,qBAAa,UAAU;IACrB;;OAEG;WACU,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IASnD;;OAEG;WACU,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IASxD;;OAEG;WACU,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIzD;;OAEG;WACU,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAIpD;;OAEG;WACU,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAQ/D;;OAEG;WACU,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKpE;;OAEG;WACU,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;IAKlD;;OAEG;WACU,YAAY,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAS7D;;OAEG;WACU,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAKlE;;OAEG;WACU,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAQ3D;;OAEG;WACU,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhD;;OAEG;WACU,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKrE;;;OAGG;WACU,iBAAiB,CAC5B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,WAAW,GAAE,MAA2B,EACxC,SAAS,GAAE,MAAyB,GACnC,OAAO,CAAC,IAAI,CAAC;IA4BhB;;OAEG;WACU,SAAS,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACtD,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,GACf,OAAO,CAAC,IAAI,CAAC;IAMhB;;OAEG;WACU,aAAa,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC1D,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,GACf,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"file-system.d.ts","sourceRoot":"","sources":["../../src/utils/file-system.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,OAAO,CAAC;IACrB,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,QAAQ,GAAG,YAAY,CAAC;CAC1D;AAED;;GAEG;AACH,qBAAa,UAAU;IACrB;;OAEG;WACU,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IASnD;;OAEG;WACU,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IASxD;;OAEG;WACU,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIzD;;OAEG;WACU,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAIpD;;OAEG;WACU,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAQ/D;;OAEG;WACU,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKpE;;OAEG;WACU,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;IAKlD;;OAEG;WACU,YAAY,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAS7D;;OAEG;WACU,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAKlE;;OAEG;WACU,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAQ3D;;OAEG;WACU,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhD;;OAEG;WACU,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKrE;;;OAGG;WACU,iBAAiB,CAC5B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,WAAW,GAAE,MAA2B,EACxC,SAAS,GAAE,MAAyB,GACnC,OAAO,CAAC,IAAI,CAAC;IA4BhB;;OAEG;WACU,SAAS,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACtD,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,GACf,OAAO,CAAC,IAAI,CAAC;IAMhB;;OAEG;WACU,aAAa,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC1D,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,GACf,OAAO,CAAC,IAAI,CAAC;IAMhB;;OAEG;IACH,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,eAAe;IAU3D;;;OAGG;IACH,MAAM,CAAC,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM;IAWpD;;OAEG;WACU,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAwC5E;;OAEG;IACH,MAAM,CAAC,gBAAgB,IAAI,MAAM;CAGlC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { mkdir, readFile, writeFile, access, readdir, stat, rm, rename } from 'fs/promises';
|
|
2
2
|
import { dirname } from 'path';
|
|
3
|
-
import { DINO_MARKERS } from '../core/config.js';
|
|
3
|
+
import { DINO_MARKERS, TEMPLATE_VERSION } from '../core/config.js';
|
|
4
4
|
/**
|
|
5
5
|
* File system utilities for dino-spec
|
|
6
6
|
*/
|
|
@@ -151,6 +151,72 @@ export class FileSystem {
|
|
|
151
151
|
const merged = deepMerge(existing, data);
|
|
152
152
|
await this.writeJson(path, merged);
|
|
153
153
|
}
|
|
154
|
+
/**
|
|
155
|
+
* Extract version info from file content
|
|
156
|
+
*/
|
|
157
|
+
static extractVersionInfo(content) {
|
|
158
|
+
const versionPattern = /<!-- DINO:VERSION:([0-9]+\.[0-9]+\.[0-9]+) -->/;
|
|
159
|
+
const match = content.match(versionPattern);
|
|
160
|
+
return {
|
|
161
|
+
version: match ? match[1] : null,
|
|
162
|
+
hasVersionMarker: content.includes(DINO_MARKERS.versionPrefix),
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Compare semver versions
|
|
167
|
+
* Returns: -1 if a < b, 0 if a === b, 1 if a > b
|
|
168
|
+
*/
|
|
169
|
+
static compareVersions(a, b) {
|
|
170
|
+
const partsA = a.split('.').map(Number);
|
|
171
|
+
const partsB = b.split('.').map(Number);
|
|
172
|
+
for (let i = 0; i < 3; i++) {
|
|
173
|
+
if (partsA[i] < partsB[i])
|
|
174
|
+
return -1;
|
|
175
|
+
if (partsA[i] > partsB[i])
|
|
176
|
+
return 1;
|
|
177
|
+
}
|
|
178
|
+
return 0;
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Check if a file needs updating based on version
|
|
182
|
+
*/
|
|
183
|
+
static async checkFileVersion(filePath) {
|
|
184
|
+
const content = await this.readFileSafe(filePath);
|
|
185
|
+
if (!content) {
|
|
186
|
+
return {
|
|
187
|
+
filePath,
|
|
188
|
+
currentVersion: null,
|
|
189
|
+
latestVersion: TEMPLATE_VERSION,
|
|
190
|
+
needsUpdate: true,
|
|
191
|
+
reason: 'missing',
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
const versionInfo = this.extractVersionInfo(content);
|
|
195
|
+
if (!versionInfo.hasVersionMarker) {
|
|
196
|
+
// Legacy file without version marker - treat as outdated
|
|
197
|
+
return {
|
|
198
|
+
filePath,
|
|
199
|
+
currentVersion: null,
|
|
200
|
+
latestVersion: TEMPLATE_VERSION,
|
|
201
|
+
needsUpdate: true,
|
|
202
|
+
reason: 'legacy',
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
const needsUpdate = this.compareVersions(versionInfo.version, TEMPLATE_VERSION) < 0;
|
|
206
|
+
return {
|
|
207
|
+
filePath,
|
|
208
|
+
currentVersion: versionInfo.version,
|
|
209
|
+
latestVersion: TEMPLATE_VERSION,
|
|
210
|
+
needsUpdate,
|
|
211
|
+
reason: needsUpdate ? 'outdated' : 'up-to-date',
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Generate version header for template files
|
|
216
|
+
*/
|
|
217
|
+
static getVersionHeader() {
|
|
218
|
+
return `${DINO_MARKERS.versionPrefix}${TEMPLATE_VERSION}${DINO_MARKERS.versionSuffix}\n`;
|
|
219
|
+
}
|
|
154
220
|
}
|
|
155
221
|
/**
|
|
156
222
|
* Deep merge two objects
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-system.js","sourceRoot":"","sources":["../../src/utils/file-system.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC5F,OAAO,EAAE,OAAO,EAAQ,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"file-system.js","sourceRoot":"","sources":["../../src/utils/file-system.ts"],"names":[],"mappings":"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"}
|