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 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.24.0** — `migrate` is now smart and complete. Versioned hooks (`// @sv-version`), versioned commands, idempotent `settings.json` patcher, runtime dirs auto-creation, `.gitignore` update all reachable via `npx start-vibing-stacks migrate --apply`. New `--force-hooks` flag overwrites legacy hooks (no `@sv-version`) with timestamped `.bak` backup. v2.23.0 → multi-instance coordination layer.
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-hooks # also overwrite legacy hooks (no @sv-version) — creates .bak
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 `@sv-version` (anything older than v2.24.0) are reported as `needs-update-legacy` and skipped by default. Pass `--force-hooks` to overwrite them — each gets a timestamped `.bak`.
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-hooks Overwrite legacy hooks without @sv-version (migrate; creates .bak)
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
- const status = !existsSync(target) ? 'missing' : statusFromSemver(bundledVersion, installedVersion);
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 (no @sv-version tag)', grouped['needs-update-legacy']);
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 hook(s) without @sv-version detected. ` +
419
- `Use --force-hooks to update them with a .bak backup.`);
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 hook(s) overwritten with backup` : ''));
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 hook(s) without @sv-version were skipped. ` +
467
- `Re-run with --force-hooks to update them (each gets a .bak backup).`);
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
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "start-vibing-stacks",
3
- "version": "2.24.0",
3
+ "version": "2.25.0",
4
4
  "description": "AI-powered multi-stack dev workflow for Claude Code. Supports PHP, Node.js, Python and more.",
5
5
  "type": "module",
6
6
  "bin": {