@skitterbyte/skitterspec 16.4.0 → 16.5.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.
Files changed (3) hide show
  1. package/package.json +1 -1
  2. package/src/cli.js +25 -2
  3. package/src/init.js +15 -5
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@skitterbyte/skitterspec",
3
- "version": "16.4.0",
3
+ "version": "16.5.2",
4
4
  "description": "Spec-driven development for Claude Code — a tracker-free filesystem workflow: lifecycle skills and per-spec isolation. For Linear sync, install @skitterbyte/skitterspec-linear instead.",
5
5
  "keywords": [
6
6
  "claude",
package/src/cli.js CHANGED
@@ -48,6 +48,29 @@ const { renderRoutes, portsInUse, waitListening } = require('./env/proxy.js')
48
48
 
49
49
  const pkg = require('../package.json')
50
50
 
51
+ // Commands this (tracker-free) base does NOT ship, and the distribution that
52
+ // does. Without this the base says only "unknown command: spec-sync", which a
53
+ // user correctly reads as "no such feature" — nothing anywhere named the
54
+ // distribution that has it, so they were stranded. Naming Linear here is a
55
+ // diagnostic string, not provider machinery: `init.js` already knows
56
+ // `linear.config.json` and `linear-base/` by name in order to protect them.
57
+ const PROVIDER_COMMANDS = {
58
+ 'spec-sync': '@skitterbyte/skitterspec-linear',
59
+ 'spec-sanitise': '@skitterbyte/skitterspec-linear',
60
+ }
61
+
62
+ function unknownCommand(cmd) {
63
+ const dist = PROVIDER_COMMANDS[cmd]
64
+ if (dist) {
65
+ return (
66
+ `unknown command: ${cmd} — this is the base distribution, which does not ` +
67
+ `ship it.\n ${cmd} comes from ${dist} (a superset of this package): ` +
68
+ `install that instead.`
69
+ )
70
+ }
71
+ return `unknown command: ${cmd} (try --help)`
72
+ }
73
+
51
74
  const HELP = `skitterspec — spec-driven-development for Claude Code
52
75
 
53
76
  Usage:
@@ -1384,8 +1407,8 @@ async function run(argv) {
1384
1407
  await cleanupReleaseTooling(dir, opts)
1385
1408
  break
1386
1409
  default:
1387
- throw new Error(`unknown command: ${cmd} (try --help)`)
1410
+ throw new Error(unknownCommand(cmd))
1388
1411
  }
1389
1412
  }
1390
1413
 
1391
- module.exports = { run, parse }
1414
+ module.exports = { run, parse, HELP, unknownCommand }
package/src/init.js CHANGED
@@ -562,11 +562,21 @@ function printReport(dir, mode, { diff = false } = {}) {
562
562
  // ships none. Discovering it from what was actually installed keeps this file
563
563
  // tracker-free — it never has to know which tracker (if any) is in the box.
564
564
  const setupSkill = SKILLS.find((s) => /^spec-.+-setup$/.test(s))
565
- const trackerNote = setupSkill
566
- ? `Tracker sync is opt-in: run /${setupSkill} to configure it` +
567
- ' (it discovers your workspace and writes the config), or see' +
568
- ' specs/.core/SETUP.md.\n'
569
- : ''
565
+ const provider = setupSkill ? /^spec-(.+)-setup$/.exec(setupSkill)[1] : null
566
+ // …and the same derivation gives the provider's config filename, so this can
567
+ // report tracker sync the way it reports isolation above from what is
568
+ // actually on disk. It used to say "opt-in: run /…-setup" even on a repo that
569
+ // had already configured it, telling you to set up what was already set up.
570
+ const trackerOn =
571
+ provider && fs.existsSync(path.join(dir, 'specs', '.core', `${provider}.config.json`))
572
+ const trackerNote = !setupSkill
573
+ ? ''
574
+ : trackerOn
575
+ ? `Tracker sync is ON: ${provider} — the repo stays the source of truth;` +
576
+ ' /spec-push mirrors a spec up and /spec-status reports drift.\n'
577
+ : `Tracker sync is opt-in: run /${setupSkill} to configure it` +
578
+ ' (it discovers your workspace and writes the config), or see' +
579
+ ' specs/.core/SETUP.md.\n'
570
580
  process.stdout.write(
571
581
  '\nDone. Skills resolve as /spec, /spec-go, /spec-complete, /spec-cancel,' +
572
582
  ' /spec-bug, /spec-review, /spec-init, /spec-connect.\n' +