specflow-cc 1.18.0 → 1.18.1

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/CHANGELOG.md CHANGED
@@ -5,6 +5,15 @@ All notable changes to SpecFlow will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [1.18.1] - 2026-04-11
9
+
10
+ ### Fixed
11
+
12
+ - **Installer now copies `bin/`** — the installer previously shipped `agents/`, `templates/`, `commands/`, and `hooks/` into `~/.claude/specflow-cc/` but never copied `bin/`, so any slash command invoking `node bin/sf-tools.cjs ...` failed with `MODULE_NOT_FOUND` in user projects. Affected commands: `/sf:todos`, `/sf:priority`, `/sf:metrics`, `/sf:plan`, `/sf:triage`, `/sf:revise`, `/sf:todo`
13
+ - Installer now copies `bin/` recursively (excluding `install.js` itself) via the existing `copyWithPathReplacement` helper
14
+ - All 12 affected command invocations rewritten to use the absolute path `node ~/.claude/specflow-cc/bin/sf-tools.cjs` (auto-rewritten to `./.claude/specflow-cc/` for local installs by the existing path-replacement pass)
15
+ - New smoke test `tests/install-bin-cli.test.cjs` runs the full installer in a temp project and invokes the installed CLI end-to-end, preventing regression
16
+
8
17
  ## [1.18.0] - 2026-04-08
9
18
 
10
19
  ### Added
package/bin/install.js CHANGED
@@ -213,6 +213,20 @@ function install(isGlobal) {
213
213
  }
214
214
  }
215
215
 
216
+ // Copy bin (CLI tools) — exclude install.js, which is the installer itself
217
+ const binSrc = path.join(src, 'bin');
218
+ if (fs.existsSync(binSrc)) {
219
+ const binDest = path.join(specflowDir, 'bin');
220
+ copyWithPathReplacement(binSrc, binDest, pathPrefix);
221
+ const installerCopy = path.join(binDest, 'install.js');
222
+ if (fs.existsSync(installerCopy)) fs.unlinkSync(installerCopy);
223
+ if (verifyInstalled(binDest, 'bin')) {
224
+ console.log(` ${green}✓${reset} Installed bin (CLI tools)`);
225
+ } else {
226
+ failures.push('bin');
227
+ }
228
+ }
229
+
216
230
  // Copy hooks
217
231
  const hooksSrc = path.join(src, 'hooks');
218
232
  if (fs.existsSync(hooksSrc)) {
@@ -80,12 +80,12 @@ For each `.specflow/archive/SPEC-*.md`:
80
80
 
81
81
  ```bash
82
82
  # Count todos via CLI tool (format-agnostic, excludes eliminated by default)
83
- node bin/sf-tools.cjs todo list --raw
83
+ node ~/.claude/specflow-cc/bin/sf-tools.cjs todo list --raw
84
84
  ```
85
85
 
86
86
  This returns the list of open TODO IDs. For `--all` (including eliminated):
87
87
  ```bash
88
- node bin/sf-tools.cjs todo list --all --raw
88
+ node ~/.claude/specflow-cc/bin/sf-tools.cjs todo list --all --raw
89
89
  ```
90
90
 
91
91
  Parse priority breakdown from the JSON output to count by priority level.
@@ -46,7 +46,7 @@ Exit.
46
46
  ## Step 2: Check for Todos
47
47
 
48
48
  ```bash
49
- node bin/sf-tools.cjs todo list --raw
49
+ node ~/.claude/specflow-cc/bin/sf-tools.cjs todo list --raw
50
50
  ```
51
51
 
52
52
  **If empty output (no todos):**
@@ -62,13 +62,13 @@ Exit.
62
62
  Format detection is handled automatically by the CLI tool.
63
63
 
64
64
  **If argument is a number (e.g., "1", "2"):**
65
- Run `node bin/sf-tools.cjs todo list` to get sorted array, pick the Nth item (1-indexed).
65
+ Run `node ~/.claude/specflow-cc/bin/sf-tools.cjs todo list` to get sorted array, pick the Nth item (1-indexed).
66
66
 
67
67
  **If argument is TODO-XXX format:**
68
68
  The target ID is known directly.
69
69
 
70
70
  **If no argument:**
71
- Run `node bin/sf-tools.cjs todo list` and display todos, then prompt:
71
+ Run `node ~/.claude/specflow-cc/bin/sf-tools.cjs todo list` and display todos, then prompt:
72
72
 
73
73
  ```
74
74
  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
@@ -52,7 +52,7 @@ For each spec, extract:
52
52
  ### Load Todos
53
53
 
54
54
  ```bash
55
- node bin/sf-tools.cjs todo list
55
+ node ~/.claude/specflow-cc/bin/sf-tools.cjs todo list
56
56
  ```
57
57
 
58
58
  Extract from the JSON array:
@@ -476,7 +476,7 @@ After recording the Response, if any items were marked "Deferred":
476
476
 
477
477
  1. For each deferred item, generate next TODO ID:
478
478
  ```bash
479
- node bin/sf-tools.cjs todo next-id --raw
479
+ node ~/.claude/specflow-cc/bin/sf-tools.cjs todo next-id --raw
480
480
  ```
481
481
  2. Create `.specflow/todos/TODO-{XXX}.md` for each deferred item:
482
482
  ```markdown
@@ -60,7 +60,7 @@ Use AskUserQuestion:
60
60
  Run the CLI tool to get the next available ID:
61
61
 
62
62
  ```bash
63
- node bin/sf-tools.cjs todo next-id --raw
63
+ node ~/.claude/specflow-cc/bin/sf-tools.cjs todo next-id --raw
64
64
  ```
65
65
 
66
66
  This handles both per-file format (TODO-XXX.md) and legacy TODO.md automatically.
@@ -41,12 +41,12 @@ Call the CLI tool, which handles format detection automatically:
41
41
 
42
42
  **If `--all` flag was passed:**
43
43
  ```bash
44
- node bin/sf-tools.cjs todo list --all
44
+ node ~/.claude/specflow-cc/bin/sf-tools.cjs todo list --all
45
45
  ```
46
46
 
47
47
  **Otherwise:**
48
48
  ```bash
49
- node bin/sf-tools.cjs todo list
49
+ node ~/.claude/specflow-cc/bin/sf-tools.cjs todo list
50
50
  ```
51
51
 
52
52
  The tool returns a JSON array of `{ id, title, priority, status, complexity, created }` objects, sorted by priority (high > medium > low > unset), then by created date (oldest first).
@@ -135,7 +135,7 @@ Use the format from `templates/todo-index.md`:
135
135
 
136
136
  <success_criteria>
137
137
  - [ ] Initialization verified
138
- - [ ] TODOs listed via `node bin/sf-tools.cjs todo list` (format-agnostic)
138
+ - [ ] TODOs listed via `node ~/.claude/specflow-cc/bin/sf-tools.cjs todo list` (format-agnostic)
139
139
  - [ ] Empty state handled with helpful message
140
140
  - [ ] Sorted by priority then date (oldest first within same priority)
141
141
  - [ ] Numbered list displayed with Status column
@@ -146,7 +146,7 @@ For each selected finding:
146
146
  ### 6.1 Generate TODO ID
147
147
 
148
148
  ```bash
149
- node bin/sf-tools.cjs todo next-id --raw
149
+ node ~/.claude/specflow-cc/bin/sf-tools.cjs todo next-id --raw
150
150
  ```
151
151
 
152
152
  This handles both per-file format and legacy TODO.md automatically (uses Node.js fs/regex — not grep -oP).
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "specflow-cc",
3
- "version": "1.18.0",
3
+ "version": "1.18.1",
4
4
  "description": "Spec-driven development system for Claude Code — quality-first workflow with explicit audit cycles",
5
5
  "bin": {
6
6
  "specflow-cc": "bin/install.js"