start-vibing-stacks 2.24.0 → 2.25.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/README.md +4 -3
- package/dist/index.js +4 -2
- package/dist/migrate.js +22 -7
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -6,7 +6,7 @@ Multi-stack AI workflow for **Claude Code** & **Cursor**. One command installs a
|
|
|
6
6
|
npx start-vibing-stacks
|
|
7
7
|
```
|
|
8
8
|
|
|
9
|
-
> Latest: **v2.
|
|
9
|
+
> Latest: **v2.25.0** — `--force-hooks` (alias `--force-legacy`) now also covers legacy commands (`commands/*.md` without `version:` frontmatter), not just hooks. Single command rebuilds installs older than v2.23.0. v2.24.0 → smart migrate (versioned hooks/commands, idempotent `settings.json`, runtime dirs, `.gitignore`). v2.23.0 → multi-instance coordination layer.
|
|
10
10
|
|
|
11
11
|
---
|
|
12
12
|
|
|
@@ -133,7 +133,8 @@ Single-host coordination only. It does **not** replace `git` for cross-machine c
|
|
|
133
133
|
npx start-vibing-stacks # setup or resume current project
|
|
134
134
|
npx start-vibing-stacks migrate # dry run: skills + agents + hooks + commands + settings.json + runtime dirs
|
|
135
135
|
npx start-vibing-stacks migrate --apply # apply (idempotent; preserves customizations)
|
|
136
|
-
npx start-vibing-stacks migrate --apply --force-
|
|
136
|
+
npx start-vibing-stacks migrate --apply --force-legacy # also overwrite legacy hooks AND commands (no version) — creates .bak
|
|
137
|
+
npx start-vibing-stacks migrate --apply --force-hooks # alias for --force-legacy (back-compat)
|
|
137
138
|
|
|
138
139
|
# flags: --force --no-claude --no-mcp --no-install --help --version
|
|
139
140
|
```
|
|
@@ -145,7 +146,7 @@ npx start-vibing-stacks migrate --apply --force-hooks # also overwrite legacy h
|
|
|
145
146
|
- **Runtime artefacts** — `.claude/state/{sessions,inbox,file-touches}/_archive` auto-created; `_state.README.md` staged.
|
|
146
147
|
- **`.gitignore`** — `.claude/state/` appended if not already covered.
|
|
147
148
|
|
|
148
|
-
Legacy hooks without
|
|
149
|
+
Legacy files without versioning — hooks without `// @sv-version` AND commands without `version:` frontmatter (anything installed before the versioning landed) — are reported as `needs-update-legacy` and skipped by default. Pass `--force-legacy` (or its alias `--force-hooks`) to overwrite them — each gets a timestamped `.bak`. Skills and agents are intentionally **not** covered because users customize them; they stay in `modified-no-version` (advisory only).
|
|
149
150
|
|
|
150
151
|
Global install: `npm i -g start-vibing-stacks` → `svs` (alias).
|
|
151
152
|
|
package/dist/index.js
CHANGED
|
@@ -33,7 +33,7 @@ const FLAGS = {
|
|
|
33
33
|
help: args.includes('--help') || args.includes('-h'),
|
|
34
34
|
version: args.includes('--version') || args.includes('-v'),
|
|
35
35
|
apply: args.includes('--apply'),
|
|
36
|
-
forceHooks: args.includes('--force-hooks'),
|
|
36
|
+
forceHooks: args.includes('--force-hooks') || args.includes('--force-legacy'),
|
|
37
37
|
};
|
|
38
38
|
if (FLAGS.version) {
|
|
39
39
|
console.log(PKG_VERSION);
|
|
@@ -53,7 +53,9 @@ if (FLAGS.help) {
|
|
|
53
53
|
${chalk.bold('Options:')}
|
|
54
54
|
--force Overwrite existing configuration (default command)
|
|
55
55
|
--apply Apply updates (migrate command)
|
|
56
|
-
--force-
|
|
56
|
+
--force-legacy Overwrite legacy hooks (no @sv-version) AND legacy commands
|
|
57
|
+
(no version: frontmatter) — each gets a timestamped .bak
|
|
58
|
+
--force-hooks Alias for --force-legacy (kept for back-compat)
|
|
57
59
|
--no-claude Skip Claude Code installation
|
|
58
60
|
--no-mcp Skip MCP server selection
|
|
59
61
|
--no-install Skip dependency installation
|
package/dist/migrate.js
CHANGED
|
@@ -187,7 +187,20 @@ export function planMigration(projectDir, opts) {
|
|
|
187
187
|
if (!bundledVersion)
|
|
188
188
|
continue;
|
|
189
189
|
const installedVersion = parseFrontmatterVersion(target);
|
|
190
|
-
|
|
190
|
+
let status;
|
|
191
|
+
if (!existsSync(target)) {
|
|
192
|
+
status = 'missing';
|
|
193
|
+
}
|
|
194
|
+
else if (installedVersion === null) {
|
|
195
|
+
// Commands are canonical infra files (slash-command routes). When the
|
|
196
|
+
// installed copy lacks `version:` frontmatter it predates versioned
|
|
197
|
+
// commands — treat as legacy so `--force-hooks` can heal it (same
|
|
198
|
+
// .bak machinery as legacy hooks). Skills/agents stay manual-review.
|
|
199
|
+
status = 'needs-update-legacy';
|
|
200
|
+
}
|
|
201
|
+
else {
|
|
202
|
+
status = statusFromSemver(bundledVersion, installedVersion);
|
|
203
|
+
}
|
|
191
204
|
items.push({ kind: 'command', name, source, target, bundledVersion, installedVersion, status });
|
|
192
205
|
}
|
|
193
206
|
}
|
|
@@ -363,7 +376,7 @@ export async function runMigrate(projectDir, opts) {
|
|
|
363
376
|
};
|
|
364
377
|
summary('MISSING', grouped.missing);
|
|
365
378
|
summary('OUTDATED', grouped.outdated);
|
|
366
|
-
summary('NEEDS UPDATE — legacy hooks
|
|
379
|
+
summary('NEEDS UPDATE — legacy (hooks without @sv-version, commands without version: frontmatter)', grouped['needs-update-legacy']);
|
|
367
380
|
summary('AHEAD (installed newer than bundled — kept)', grouped.ahead);
|
|
368
381
|
summary('UNVERSIONED (manual review)', grouped['modified-no-version']);
|
|
369
382
|
summary('CURRENT', grouped.current);
|
|
@@ -415,8 +428,9 @@ export async function runMigrate(projectDir, opts) {
|
|
|
415
428
|
todo.push('runtime artefacts');
|
|
416
429
|
ui.info(`Run with --apply to update: ${todo.join(' + ')}.`);
|
|
417
430
|
if (grouped['needs-update-legacy'].length > 0 && !opts.forceHooks) {
|
|
418
|
-
ui.info(`${grouped['needs-update-legacy'].length} legacy
|
|
419
|
-
`Use --force-hooks to
|
|
431
|
+
ui.info(`${grouped['needs-update-legacy'].length} legacy file(s) detected (hooks without @sv-version, ` +
|
|
432
|
+
`commands without \`version:\` frontmatter). Use --force-legacy (alias --force-hooks) to ` +
|
|
433
|
+
`update them with a .bak backup.`);
|
|
420
434
|
}
|
|
421
435
|
return;
|
|
422
436
|
}
|
|
@@ -453,7 +467,7 @@ export async function runMigrate(projectDir, opts) {
|
|
|
453
467
|
ui.success('gitignore: appended .claude/state/');
|
|
454
468
|
console.log('');
|
|
455
469
|
ui.success(`Migration complete: ${updated} file(s), ${settingsApply.added.length} settings entry(ies)` +
|
|
456
|
-
(legacyUpdated > 0 ? `, ${legacyUpdated} legacy
|
|
470
|
+
(legacyUpdated > 0 ? `, ${legacyUpdated} legacy file(s) overwritten with backup` : ''));
|
|
457
471
|
if (grouped['modified-no-version'].length > 0) {
|
|
458
472
|
console.log('');
|
|
459
473
|
ui.warn(`${grouped['modified-no-version'].length} unversioned local skill/agent/command(s) skipped — review manually.`);
|
|
@@ -463,8 +477,9 @@ export async function runMigrate(projectDir, opts) {
|
|
|
463
477
|
}
|
|
464
478
|
if (grouped['needs-update-legacy'].length > 0 && !opts.forceHooks) {
|
|
465
479
|
console.log('');
|
|
466
|
-
ui.warn(`${grouped['needs-update-legacy'].length} legacy
|
|
467
|
-
`Re-run with --force-
|
|
480
|
+
ui.warn(`${grouped['needs-update-legacy'].length} legacy file(s) skipped (hooks without @sv-version, ` +
|
|
481
|
+
`commands without \`version:\` frontmatter). Re-run with --force-legacy ` +
|
|
482
|
+
`(alias --force-hooks) to update them (each gets a .bak backup).`);
|
|
468
483
|
for (const it of grouped['needs-update-legacy'].slice(0, 10)) {
|
|
469
484
|
console.log(` ${relative(projectDir, it.target)}`);
|
|
470
485
|
}
|