@mhd-ghaith-abtah/flow 0.7.2-beta.0 → 0.8.0-beta.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/docs/usage.md ADDED
@@ -0,0 +1,940 @@
1
+ # Using Flow — the complete guide
2
+
3
+ How to install, configure, run, maintain, and uninstall Flow in every supported scenario.
4
+
5
+ This is the long-form reference. For the 10-minute first-install path, see [quickstart.md](quickstart.md). For per-profile details, see [profiles.md](profiles.md). For adapter mechanics, see [adapters.md](adapters.md). For BMad → Flow migration, see [migrate-from-bmad.md](migrate-from-bmad.md).
6
+
7
+ > **Heads up on availability.** Some flags described here (`flow init --yes`, `--update`, `--repair`, `--remove-project-ecc`, MCP secrets collection) require **v0.8.0-beta.0 or later**. Earlier versions on the `latest` dist-tag have the slash-command path only. Install the beta with `npm install -g @mhd-ghaith-abtah/flow@beta` until `latest` catches up.
8
+
9
+ ---
10
+
11
+ ## Table of contents
12
+
13
+ - [1. Installation paths](#1-installation-paths)
14
+ - [2. First-time install](#2-first-time-install)
15
+ - [3. Daily story workflow](#3-daily-story-workflow)
16
+ - [4. Sprint state management](#4-sprint-state-management)
17
+ - [5. Profiles and customization](#5-profiles-and-customization)
18
+ - [6. ECC install scope](#6-ecc-install-scope)
19
+ - [7. Health checks and maintenance](#7-health-checks-and-maintenance)
20
+ - [8. Updating an existing install](#8-updating-an-existing-install)
21
+ - [9. Repairing a broken install](#9-repairing-a-broken-install)
22
+ - [10. Uninstalling](#10-uninstalling)
23
+ - [11. Inside Claude Code — slash command reference](#11-inside-claude-code--slash-command-reference)
24
+ - [12. Complete CLI flag reference](#12-complete-cli-flag-reference)
25
+ - [13. Common scenarios (recipe book)](#13-common-scenarios-recipe-book)
26
+ - [14. Environment variables](#14-environment-variables)
27
+ - [15. Files Flow writes](#15-files-flow-writes)
28
+ - [16. Troubleshooting](#16-troubleshooting)
29
+
30
+ ---
31
+
32
+ ## 1. Installation paths
33
+
34
+ Flow ships in two surfaces: a Claude Code skill bundle (interactive) and a Node CLI (`flow`, headless). Both invoke the same underlying installers and write the same files.
35
+
36
+ **Bootstrap order matters.** Claude Code discovers slash commands by scanning `~/.claude/skills/<name>/`. The npm package puts skill files in the install location (typically `~/.npm-global/lib/node_modules/...`), NOT in `~/.claude/skills/`. So `/flow-init` does NOT work after a bare `npm install -g`. You need to run `flow install-skills` once to symlink the four skills into Claude Code's discovery path.
37
+
38
+ ### a. From npm (recommended)
39
+
40
+ ```bash
41
+ # 1. Install the Node CLI
42
+ npm install -g @mhd-ghaith-abtah/flow@beta
43
+ flow --version
44
+
45
+ # 2. Bootstrap Claude Code surface (links 4 skills into ~/.claude/skills/)
46
+ flow install-skills
47
+
48
+ # 3. Now both paths work — pick one per project:
49
+ flow init --profile mini --yes # headless
50
+ # OR, inside Claude Code:
51
+ /flow-init # interactive
52
+ ```
53
+
54
+ `flow install-skills` is idempotent — re-run safely after every upgrade to refresh the symlinks. It refuses to clobber existing real directories at the target without `--force`.
55
+
56
+ ### b. install-skills scope flag
57
+
58
+ By default `flow install-skills` writes to `~/.claude/skills/` (home scope). Override:
59
+
60
+ ```bash
61
+ flow install-skills # default: --scope home
62
+ flow install-skills --scope home # user-wide ~/.claude/skills/
63
+ flow install-skills --scope project # team-commit: <cwd>/.claude/skills/
64
+ flow install-skills --scope both # both
65
+ flow install-skills --dry-run # preview
66
+ flow install-skills --force # replace existing real dirs
67
+ ```
68
+
69
+ The `--scope project` mode is for teams that want every contributor to get Flow's slash commands the moment they `git clone` the repo — commit `<project>/.claude/skills/flow-*` so Claude Code picks them up automatically when the session is opened inside the project. The user still needs the npm package installed because the symlinks point at it.
70
+
71
+ ### c. `npx` — no install
72
+
73
+ ```bash
74
+ npx -y @mhd-ghaith-abtah/flow@beta install-skills # one-time bootstrap
75
+ npx -y @mhd-ghaith-abtah/flow@beta init --profile mini --yes
76
+ ```
77
+
78
+ `npx` works but the symlink targets the npx cache path, which can disappear when the cache rotates. For ongoing use, prefer `npm install -g`.
79
+
80
+ ### d. Development clone
81
+
82
+ ```bash
83
+ git clone https://github.com/mhd-ghaith-abtah/flow.git
84
+ cd flow && npm install && tools/dev-link.sh
85
+ ```
86
+
87
+ `tools/dev-link.sh` is the dev-mode equivalent of `flow install-skills --scope home` — symlinks the four `skills/flow-*` dirs into `~/.claude/skills/` AND puts `flow` on `$PATH` from your clone. Use when you're contributing so changes to skill workflows take effect immediately.
88
+
89
+ `tools/dev-link.sh` symlinks your clone into `$HOME/.claude/skills/flow-*` and onto `$PATH` as `flow`. Use when you're contributing.
90
+
91
+ ### e. Verifying the install
92
+
93
+ ```bash
94
+ flow --version # → 0.8.0-beta.0 (or newer)
95
+ flow doctor # health check
96
+ flow help # subcommand list
97
+ ```
98
+
99
+ ---
100
+
101
+ ## 2. First-time install
102
+
103
+ ### a. Interactive (inside Claude Code)
104
+
105
+ ```
106
+ /flow-init
107
+ ```
108
+
109
+ The skill walks through Q1–Q9:
110
+
111
+ | Q | Asks about |
112
+ |---|---|
113
+ | Q1 | **Profile** — minimal / mini / standard / team (recommended option auto-detected from project shape) |
114
+ | Q2 | **Issue tracker adapter** — linear / github-issues / none |
115
+ | Q3 | **PR adapter** — github / none |
116
+ | Q4 | **E2E adapter** — playwright-mcp / none |
117
+ | Q5 | **Verify adapter** — make / pnpm / custom |
118
+ | Q6 | **BMad subset** — none / planning-only / full / etc. |
119
+ | Q7 | **ECC subset** — none / flow-essentials / flow-essentials-plus-tdd / etc. |
120
+ | Q7c | **ECC install scope** — user / project (asked only when ECC subset ≠ none) |
121
+ | Q7b | **Caveman compression mode** — none / lite / full / ultra / wenyan |
122
+ | Q8 | **Migrate existing BMad state?** — only asked if BMad is detected |
123
+ | Q9 | **Secrets store** — env-file / shell / 1password (only env-file persists; the others print instructions) |
124
+
125
+ Each answer pre-populates from the chosen profile's default. Hit Enter to accept; type to override.
126
+
127
+ ### b. Headless (via the CLI)
128
+
129
+ ```bash
130
+ flow init --profile mini --yes
131
+ ```
132
+
133
+ Pre-fills every answer from the profile's defaults — no prompts. Useful for scripted setup, fresh-machine bootstrap, and CI.
134
+
135
+ Override individual knobs without leaving the profile:
136
+
137
+ ```bash
138
+ flow init --profile team --yes \
139
+ --ecc-scope user \
140
+ --bmad-subset planning-only \
141
+ --ecc-subset flow-essentials
142
+ ```
143
+
144
+ CLI flag → answer mapping:
145
+
146
+ | Flag | Maps to |
147
+ |---|---|
148
+ | `--profile <name>` | Q1 |
149
+ | `--bmad-subset <name>` | Q6 |
150
+ | `--ecc-subset <name>` | Q7 |
151
+ | `--ecc-scope user\|project` | Q7c |
152
+ | `--with adapter:<id>` | Adds to Q2–Q5 picks |
153
+ | `--without adapter:<id>` | Removes a profile-default adapter |
154
+
155
+ Q2–Q5 adapter picks aren't exposed as single flags yet — use the profile default or `--with`/`--without` to compose.
156
+
157
+ ### c. Preview only (no execution)
158
+
159
+ ```bash
160
+ flow init --profile standard --dry-run # plan only
161
+ flow init --profile standard --yes --dry-run # exercise full chain in dry-run mode
162
+ ```
163
+
164
+ The first form prints the resolved bundle from `catalog.yaml`. The second runs the entire orchestrator (detect → upstreams → MCPs → scaffold) without actually writing or shelling out — useful for verifying a fresh setup before committing to it.
165
+
166
+ ### d. What gets installed
167
+
168
+ Regardless of path, a fresh install produces:
169
+
170
+ ```
171
+ <project>/
172
+ ├── .claude/
173
+ │ ├── flow.config.yaml # team-shared config (COMMIT THIS)
174
+ │ └── flow/
175
+ │ └── install-state.json # what Flow did, when
176
+ └── docs/
177
+ └── flow/
178
+ ├── sprint.yaml # SOURCE OF TRUTH for stories (COMMIT THIS)
179
+ ├── deferred.md # one-line backlog items
180
+ ├── stories/ # active story markdown files
181
+ ├── archive/ # completed story files
182
+ ├── journeys/ # E2E journey definitions
183
+ └── retros/ # epic retros
184
+ ```
185
+
186
+ Plus, depending on profile:
187
+ - Skills under `~/.claude/skills/{flow-init,flow-sprint,flow-story,flow-doctor}/`
188
+ - ECC content under `~/.claude/rules/ecc/` + `~/.claude/skills/ecc/` (user scope) OR `<project>/.claude/rules/ecc/` + `skills/ecc/` (project scope — team profile default)
189
+ - BMad in `_bmad/` if BMad subset ≠ none
190
+ - Caveman in `~/.claude/plugins/cache/caveman/` if Caveman subset ≠ none
191
+ - MCPs registered with Claude Code via `claude mcp add`
192
+ - Secrets in `~/.claude/.env.flow` (chmod 600) if any `api_token` MCP was selected
193
+
194
+ ---
195
+
196
+ ## 3. Daily story workflow
197
+
198
+ The per-story phase chain is **Claude Code only** — it's LLM-driven and the CLI doesn't have an equivalent. Inside Claude Code:
199
+
200
+ ```
201
+ /flow-story # advance the active story to its next phase
202
+ /flow-story E1-001 # advance a specific story
203
+ /flow-story status # show the current story-id without advancing
204
+ ```
205
+
206
+ Phases chain automatically:
207
+
208
+ ```
209
+ plan → /prp-implement → /code-review → /update-docs → /prp-commit → /prp-pr
210
+ ```
211
+
212
+ The chain stops on hard halts: CRITICAL review findings, verify failures, e2e failures, PR open (waiting for merge).
213
+
214
+ To run a specific phase manually without going through `/flow-story`:
215
+
216
+ ```
217
+ /plan
218
+ /prp-implement
219
+ /code-review
220
+ /update-docs
221
+ /prp-commit
222
+ /prp-pr
223
+ ```
224
+
225
+ Most users never call these directly — `/flow-story` dispatches to the right one.
226
+
227
+ ---
228
+
229
+ ## 4. Sprint state management
230
+
231
+ Sprint state lives in `docs/flow/sprint.yaml`. Mutate via either surface:
232
+
233
+ ### a. Inside Claude Code (slash)
234
+
235
+ ```
236
+ /flow-sprint add "Story title" --epic E1
237
+ /flow-sprint next
238
+ /flow-sprint status
239
+ /flow-sprint done E1-001
240
+ /flow-sprint done E1-001 --note "PR auto-merged"
241
+ /flow-sprint deferred
242
+ /flow-sprint retro E1
243
+ /flow-sprint scope-review
244
+ /flow-sprint import-bmad
245
+ ```
246
+
247
+ ### b. Headless CLI (pure-YAML ops, no LLM)
248
+
249
+ ```bash
250
+ flow sprint status
251
+ flow sprint status --json
252
+
253
+ flow sprint next # pick first backlog story
254
+ flow sprint next --epic E2 # restrict to one epic
255
+
256
+ flow sprint add --id E1-003 --title "New thing" --epic E1
257
+ flow sprint add --id E1-004 --title "Tagged work" --epic E1 \
258
+ --tags cli,ux --why "Closes the X gap"
259
+
260
+ flow sprint done E1-002
261
+ flow sprint done E1-002 --note "PR auto-merged"
262
+ flow sprint done E1-002 --force # bypass review-only gate
263
+
264
+ flow sprint deferred
265
+ flow sprint deferred --json
266
+
267
+ flow sprint import-bmad # one-shot BMad migration
268
+ ```
269
+
270
+ ### c. What stays slash-only
271
+
272
+ LLM-driven subcommands (`retro`, `scope-review`) live in `skills/flow-sprint/workflow.md` and don't have a CLI equivalent. They synthesize across multiple inputs (story files, git history, deferred items) using the LLM. A CLI stub would inevitably drift from the skill behavior — see [ROADMAP.md](../ROADMAP.md) principle #6.
273
+
274
+ ### d. Sprint YAML round-trip preservation
275
+
276
+ Flow uses the `yaml` library's Document API rather than parse-then-stringify, so your hand-edited comments, blank lines, and key ordering in `sprint.yaml` survive every mutation. You can confidently put load-bearing notes in the file.
277
+
278
+ ---
279
+
280
+ ## 5. Profiles and customization
281
+
282
+ Profiles are pre-built bundles. Pick one based on your situation. Full reference: [profiles.md](profiles.md).
283
+
284
+ | Profile | Best for | Tokens/story | Default ECC scope |
285
+ |---|---|---:|---|
286
+ | `minimal` | Bare Flow, no upstreams | <10k | user |
287
+ | `mini` | Solo dev, one repo | ~20k | user |
288
+ | `standard` | Solo/small team, formal review | ~40k | user |
289
+ | `team` | Multi-LLM review, Linear-driven | ~60k | **project** |
290
+
291
+ ### a. Inspect a profile without installing
292
+
293
+ ```bash
294
+ flow plan --profile team
295
+ flow plan --profile team --json
296
+ ```
297
+
298
+ ### b. Override individual adapters
299
+
300
+ ```bash
301
+ # Add an adapter on top of a profile's defaults:
302
+ flow init --profile mini --with adapter:e2e-playwright-mcp --yes
303
+
304
+ # Remove a profile-default adapter:
305
+ flow init --profile standard --without adapter:issue-tracker-github-issues --yes
306
+ ```
307
+
308
+ ### c. Swap profile mid-life
309
+
310
+ ```bash
311
+ flow init --update --profile team # mini → team
312
+ flow init --update --profile team --dry-run # preview deltas first
313
+ ```
314
+
315
+ `--update` reads recorded answers from `install-state.json`, applies the new profile's defaults for any answer the user didn't pin via CLI, and re-runs the chain. See [Section 8](#8-updating-an-existing-install).
316
+
317
+ ### d. Add or remove single components
318
+
319
+ ```bash
320
+ flow add adapter:e2e-playwright-mcp # adds + installs
321
+ flow add adapter:issue-tracker-linear # swaps issue-tracker family
322
+ flow remove adapter:pr-github # removes
323
+ ```
324
+
325
+ `flow add` and `flow remove` are the canonical adapter-swap mechanism. `flow.config.yaml` hand-edit also works — both routes update install-state.
326
+
327
+ ---
328
+
329
+ ## 6. ECC install scope
330
+
331
+ ECC content can land at two locations:
332
+
333
+ - **user scope:** `~/.claude/rules/ecc` + `~/.claude/skills/ecc` (shared across all your projects)
334
+ - **project scope:** `<projectRoot>/.claude/rules/ecc` + `<projectRoot>/.claude/skills/ecc` (per-repo isolation)
335
+
336
+ The team profile defaults to **project** scope so each Flow-managed repo keeps its own ECC selection. All other stock profiles default to **user** scope.
337
+
338
+ ### a. Override at install time
339
+
340
+ ```bash
341
+ flow init --profile team --ecc-scope user --yes # team but user-scope
342
+ flow init --profile mini --ecc-scope project --yes # mini but project-scope
343
+ flow plan --profile mini --ecc-scope project # preview
344
+ ```
345
+
346
+ Typos like `--ecc-scope=projet` fail loud with a clear error — silent fallback to the profile default would be a confusing UX.
347
+
348
+ ### b. Distribution caveat
349
+
350
+ ECC's `claude-project` install target merged into ECC's `main` branch via [affaan-m/ECC#2006](https://github.com/affaan-m/ECC/pull/2006) on 2026-05-19, but the current `ecc-universal@latest` is `1.10.0` (from 2026-04-15), which predates the merge. Flow's `catalog.yaml` pins to a post-merge github commit (`npx -y -p "github:affaan-m/ECC#98bd5174" ecc-install`) until ECC publishes a 2.x release.
351
+
352
+ You don't have to do anything — Flow's installer handles this transparently. The catalog's `cmd_fallback` field will get swapped back to `npx ecc-universal install` the day ECC 2.x publishes.
353
+
354
+ ### c. Detect scope drift
355
+
356
+ ```bash
357
+ flow doctor # reports both scopes if present
358
+ ```
359
+
360
+ The doctor probe surfaces a `Collisions` section when ECC content exists at BOTH `~/.claude/rules/ecc` AND `<cwd>/.claude/rules/ecc`. Common cause: a user switched `--ecc-scope` between installs without uninstalling first. The probe reads `install-state.json` to identify the active scope and suggests `rm -rf <stale_dir>`.
361
+
362
+ ---
363
+
364
+ ## 7. Health checks and maintenance
365
+
366
+ ### a. `flow doctor` — health check
367
+
368
+ ```bash
369
+ flow doctor # human-readable
370
+ flow doctor --json # scriptable
371
+ flow doctor --verbose # extra detail
372
+ ```
373
+
374
+ Reports:
375
+ - Catalog: parse + schema validation
376
+ - Install state: home + project-scope `install-state.json` presence/validity
377
+ - Config: `flow.config.yaml` presence, required keys
378
+ - Adapters: files present at expected paths (symlink-vs-regular-file detection)
379
+ - CLIs: required CLIs in `$PATH` for the active adapters
380
+ - Upstreams: BMad/ECC/Caveman version pins vs recorded values
381
+ - Collisions: ECC dual-scope content (E7-004)
382
+
383
+ Exit codes:
384
+ - `0` — all OK or only informational
385
+ - `1` — at least one warning
386
+ - `2` — at least one failure
387
+
388
+ ### b. Repair upstream installer pins
389
+
390
+ ```bash
391
+ flow doctor --repair-upstream bmad
392
+ flow doctor --repair-upstream ecc
393
+ flow doctor --repair-upstream caveman
394
+ ```
395
+
396
+ Prints (does NOT auto-run) the exact reinstall commands for one upstream, parameterized by the pinned version recorded in `install-state.json`. For ECC, output is scope-aware — user-scope vs project-scope produces different commands.
397
+
398
+ ### c. Re-register MCPs that drifted
399
+
400
+ There's no dedicated `flow mcp` command; running `flow init --update` re-registers any MCPs missing from `claude mcp list`. The `mcp.js` dispatcher is idempotent — already-registered MCPs are skipped.
401
+
402
+ ---
403
+
404
+ ## 8. Updating an existing install
405
+
406
+ `flow init --update` re-runs the chain against an existing install with the same — or overridden — answers.
407
+
408
+ ### a. No-op check
409
+
410
+ ```bash
411
+ flow init --update
412
+ ```
413
+
414
+ Reads `install-state.json`, computes the delta against the resolved profile, and reports "No changes — install matches the requested state." Useful as a sanity check.
415
+
416
+ ### b. Swap profile
417
+
418
+ ```bash
419
+ flow init --update --profile team
420
+ flow init --update --profile team --dry-run # preview deltas first
421
+ ```
422
+
423
+ Output shows per-key deltas before applying:
424
+
425
+ ```
426
+ ━━━ flow init (update) ━━━
427
+ was: profile=mini → now: profile=team cwd=... dry-run=false
428
+
429
+ Changes:
430
+ Δ profile: mini → team
431
+ Δ issueTracker: github-issues → linear
432
+ Δ bmadSubset: none → full
433
+ Δ eccSubset: flow-essentials → flow-essentials-plus-tdd
434
+ Δ eccScope: user → project
435
+ ```
436
+
437
+ ### c. Bump individual knobs
438
+
439
+ ```bash
440
+ flow init --update --bmad-subset full
441
+ flow init --update --ecc-subset security
442
+ ```
443
+
444
+ ### d. Force-rewrite flow.config.yaml
445
+
446
+ ```bash
447
+ flow init --update --force
448
+ ```
449
+
450
+ Useful when the catalog template logic changed between Flow versions and you want your `flow.config.yaml` regenerated even though nothing in your answers changed.
451
+
452
+ ### e. What `--update` refuses
453
+
454
+ `--update` halts with an explicit uninstall+reinstall recipe when:
455
+
456
+ - **install_scope changes** (user → project or vice versa). Scope swaps need filesystem cleanup at the old location. The error message includes the exact `flow uninstall` command including `--remove-project-ecc` when applicable.
457
+
458
+ ```
459
+ ✗ flow init --update: install_scope change (user → project) is not supported mid-flight
460
+ Suggested:
461
+ flow uninstall --execute --yes
462
+ flow init --profile team --ecc-scope project --yes
463
+ ```
464
+
465
+ ### f. What `--update` does NOT do
466
+
467
+ - Doesn't *remove* MCPs you've unselected (destructive; explicit `claude mcp remove` needed)
468
+ - Doesn't *uninstall* upstreams whose subset changed to `none` (manual cleanup)
469
+ - Doesn't run `git pull` on `_bmad/` or `~/.claude/rules/ecc/` — version pinning stays whatever the upstream installer wrote
470
+
471
+ ---
472
+
473
+ ## 9. Repairing a broken install
474
+
475
+ Use `flow init --repair` when scaffold files have been deleted but the install otherwise looks intact:
476
+
477
+ ```bash
478
+ flow init --repair # restore missing docs/flow/sprint.yaml etc.
479
+ flow init --repair --dry-run # preview
480
+ ```
481
+
482
+ ### a. What `--repair` does
483
+
484
+ - Loads `profile` + `answers` from `install-state.json`
485
+ - Runs `scaffold()` with `force: false` so existing files are preserved
486
+ - Recreates ONLY the missing scaffold files (sprint.yaml, deferred.md, install-state.json, etc.)
487
+ - Skips upstream installers, MCP registration, BMad migration entirely
488
+
489
+ ### b. What `--repair` refuses
490
+
491
+ - No `install-state.json` present → exit 1 with hint to run `flow init --profile <name> --yes` for a fresh install
492
+ - Corrupt `install-state.json` → exit 2 with parse error
493
+
494
+ ### c. When to use `--repair` vs `--update`
495
+
496
+ | Symptom | Command |
497
+ |---|---|
498
+ | `docs/flow/sprint.yaml` deleted | `flow init --repair` |
499
+ | `flow.config.yaml` deleted | `flow init --repair` |
500
+ | Want to swap profile | `flow init --update --profile <new>` |
501
+ | Want to change ECC scope | `flow uninstall ... && flow init ...` |
502
+ | Want to rotate MCP api_token | `flow init --update` (re-prompts) |
503
+ | Recorded answers look right but `flow doctor` reports drift | `flow init --repair` first; if not enough, `--update` |
504
+
505
+ ---
506
+
507
+ ## 10. Uninstalling
508
+
509
+ ### a. Project-scope (default)
510
+
511
+ ```bash
512
+ flow uninstall # dry-run by default
513
+ flow uninstall --execute --yes # actually remove
514
+ ```
515
+
516
+ Removes:
517
+ - `<project>/.claude/flow/` (install-state, runtime state)
518
+ - `<project>/flow.config.yaml` + `flow.config.local.yaml`
519
+ - (with `--remove-stories`) `<project>/docs/flow/`
520
+ - (with `--remove-project-ecc`) `<project>/.claude/rules/ecc/` + `<project>/.claude/skills/ecc/`
521
+
522
+ Keeps:
523
+ - `<project>/docs/flow/` (your stories — your content) unless `--remove-stories`
524
+ - `<project>/.claude/rules/ecc/` and `skills/ecc/` unless `--remove-project-ecc`
525
+ - BMad, user-scope ECC, Caveman (owned by their respective installers)
526
+
527
+ ### b. Home-scope
528
+
529
+ ```bash
530
+ flow uninstall --scope home --execute --yes
531
+ ```
532
+
533
+ Removes:
534
+ - `~/.claude/skills/{flow-init,flow-sprint,flow-story,flow-doctor}/`
535
+ - `~/.claude/flow/`
536
+
537
+ ### c. Both scopes
538
+
539
+ ```bash
540
+ flow uninstall --scope both --execute --yes --remove-stories --remove-project-ecc
541
+ ```
542
+
543
+ ### d. Removing the upstream installers themselves
544
+
545
+ Flow does NOT remove BMad, ECC, or Caveman because they were installed by their own installers. `flow uninstall` prints the manual commands at the end:
546
+
547
+ ```
548
+ BMad: rm -rf _bmad/ docs/_bmad-output/ (or `npx bmad-method uninstall`)
549
+ ECC: ~/.claude/rules/uninstall.sh (or rm -rf ~/.claude/rules/)
550
+ Caveman: rm -rf ~/.claude/plugins/cache/caveman/ and `claude mcp remove caveman-shrink`
551
+ ```
552
+
553
+ ### e. Refused without `--yes`
554
+
555
+ `--execute` without `--yes` shows the plan + asks for explicit confirmation:
556
+
557
+ ```
558
+ ⚠ About to remove the above. Re-run with --execute --yes to confirm.
559
+ ```
560
+
561
+ This is intentional — `--execute` alone won't accidentally delete files.
562
+
563
+ ---
564
+
565
+ ## 11. Inside Claude Code — slash command reference
566
+
567
+ The slash commands have CLI equivalents for the LLM-free operations:
568
+
569
+ | Slash (Claude Code) | Headless CLI | LLM dependency |
570
+ |---|---|---|
571
+ | `/flow-init` | `flow init --yes` | None |
572
+ | `/flow-init --update` | `flow init --update` | None |
573
+ | `/flow-init --repair` | `flow init --repair` | None |
574
+ | `/flow-sprint add` | `flow sprint add` | None |
575
+ | `/flow-sprint next` | `flow sprint next` | None |
576
+ | `/flow-sprint status` | `flow sprint status` | None |
577
+ | `/flow-sprint done` | `flow sprint done` | None |
578
+ | `/flow-sprint deferred` | `flow sprint deferred` | None |
579
+ | `/flow-sprint import-bmad` | `flow sprint import-bmad` | None |
580
+ | `/flow-sprint retro` | — | **Yes** (synthesizes archive + git log + retros) |
581
+ | `/flow-sprint scope-review` | — | **Yes** (audits scope creep across the sprint) |
582
+ | `/flow-doctor` | `flow doctor` | Some (probes MCP responsiveness) |
583
+ | `/flow-story` | — | **Yes** (per-story phase chain) |
584
+
585
+ Inside Claude Code, default to slash. Outside Claude Code, the CLI covers everything except `/flow-story`, `retro`, and `scope-review`.
586
+
587
+ ---
588
+
589
+ ## 12. Complete CLI flag reference
590
+
591
+ ### Global flags (work on every command)
592
+
593
+ | Flag | Meaning |
594
+ |---|---|
595
+ | `--yes`, `-y` | Skip confirmation prompts (CI mode) |
596
+ | `--dry-run` | Print plan, don't execute |
597
+ | `--json` | Machine-readable output |
598
+ | `--force` | Overwrite existing files |
599
+ | `--verbose` | Show extra detail |
600
+ | `--scope home\|project\|both` | Install/uninstall scope |
601
+
602
+ ### `flow init` flags
603
+
604
+ | Flag | Meaning |
605
+ |---|---|
606
+ | `--profile <name>` | minimal / mini / standard / team |
607
+ | `--update` | Re-run chain against existing install |
608
+ | `--repair` | Recreate missing scaffold (no upstreams) |
609
+ | `--ecc-scope user\|project` | Override profile's ECC scope |
610
+ | `--bmad-subset <name>` | Override BMad subset |
611
+ | `--ecc-subset <name>` | Override ECC subset |
612
+ | `--with adapter:<id>` | Add an adapter to the profile bundle |
613
+ | `--without adapter:<id>` | Remove a profile-default adapter |
614
+ | `--continue-on-error` | Don't halt at first upstream failure |
615
+ | `--migrate-bmad` | Run BMad migration (if BMad detected) |
616
+
617
+ ### `flow sprint <subcommand>` flags
618
+
619
+ | Subcommand | Required / common flags |
620
+ |---|---|
621
+ | `status` | `--json` |
622
+ | `next` | `--epic <id>` (optional) |
623
+ | `add` | `--id <id> --title <t> --epic <E?>`, plus `--tags`, `--why`, `--issue`, `--status` |
624
+ | `done <id>` | `--note <s>`, `--force` |
625
+ | `deferred` | `--json` |
626
+ | `import-bmad` | `--project <name>` |
627
+
628
+ ### `flow uninstall` flags
629
+
630
+ | Flag | Meaning |
631
+ |---|---|
632
+ | `--scope project\|home\|both` | Default: project |
633
+ | `--execute` | Required to actually remove (otherwise dry-run) |
634
+ | `--yes` | Required with `--execute` |
635
+ | `--remove-stories` | Also remove `docs/flow/` (user content) |
636
+ | `--remove-project-ecc` | Also remove `<project>/.claude/{rules,skills}/ecc` |
637
+ | `--remove-backups` | Also remove `*.flow-backup-*` files |
638
+
639
+ ### `flow doctor` flags
640
+
641
+ | Flag | Meaning |
642
+ |---|---|
643
+ | `--repair-upstream <bmad\|ecc\|caveman>` | Print reinstall commands for one upstream |
644
+ | `--mcp <id>` | Probe a specific MCP only |
645
+
646
+ ### `flow plan` flags
647
+
648
+ | Flag | Meaning |
649
+ |---|---|
650
+ | `--profile <name>` | Profile to resolve |
651
+ | `--with`, `--without`, `--ecc-scope` | Same as `flow init` |
652
+ | `--json` | Machine-readable plan |
653
+
654
+ ---
655
+
656
+ ## 13. Common scenarios (recipe book)
657
+
658
+ ### a. Solo dev, single repo, light review
659
+
660
+ ```bash
661
+ flow init --profile mini --yes
662
+ ```
663
+
664
+ ### b. Solo dev with several side projects, want ECC isolation per repo
665
+
666
+ ```bash
667
+ flow init --profile mini --yes --ecc-scope project
668
+ ```
669
+
670
+ ### c. Small team using Linear + Playwright + cross-model code review
671
+
672
+ ```bash
673
+ flow init --profile team --yes
674
+ # team defaults to project-scope ECC + Linear adapter + Playwright MCP
675
+ ```
676
+
677
+ ### d. Just want Flow's state model, no upstreams
678
+
679
+ ```bash
680
+ flow init --profile minimal --yes
681
+ ```
682
+
683
+ ### e. Existing BMad project, want to migrate
684
+
685
+ ```bash
686
+ flow init --profile standard --yes --migrate-bmad
687
+ # Or, after a first install:
688
+ flow sprint import-bmad
689
+ ```
690
+
691
+ ### f. Try before you commit
692
+
693
+ ```bash
694
+ flow plan --profile team # preview profile
695
+ flow init --profile team --yes --dry-run # exercise full chain in dry-run
696
+ ```
697
+
698
+ ### g. Rotate an MCP API token
699
+
700
+ ```bash
701
+ flow init --update # re-prompts for any required env vars
702
+ ```
703
+
704
+ ### h. Profile bump
705
+
706
+ ```bash
707
+ flow init --update --profile team # mini → team
708
+ flow init --update --profile team --dry-run # preview first
709
+ ```
710
+
711
+ ### i. Wrong ECC scope at install time, want to swap
712
+
713
+ ```bash
714
+ flow uninstall --execute --yes --remove-project-ecc
715
+ flow init --profile team --ecc-scope user --yes
716
+ ```
717
+
718
+ ### j. Forgot what's installed
719
+
720
+ ```bash
721
+ flow doctor
722
+ flow doctor --json | jq .
723
+ cat .claude/flow/install-state.json | jq .
724
+ ```
725
+
726
+ ### k. Build a fresh project from scratch in CI
727
+
728
+ ```bash
729
+ # .github/workflows/setup-flow.yml
730
+ - run: npm install -g @mhd-ghaith-abtah/flow@beta
731
+ - run: flow init --profile mini --yes --dry-run # smoke first
732
+ - run: flow init --profile mini --yes # real install
733
+ - run: flow doctor # gate
734
+ ```
735
+
736
+ ### l. Replace Caveman fork once upstream merges
737
+
738
+ When [JuliusBrussee/caveman#407](https://github.com/JuliusBrussee/caveman/pull/407) merges, Flow's `catalog.yaml` will be updated to point at upstream Caveman instead of `mhd-ghaith-abtah/caveman#flow-pin-v0.1`. Users get the swap automatically on the next Flow release. No action required on your end.
739
+
740
+ ### m. Inspect Flow's install scripts before they run
741
+
742
+ ```bash
743
+ export FLOW_INSPECT_INSTALL_SCRIPTS=1
744
+ flow init --profile mini --yes
745
+ # Each upstream halts before exec and prints the command + a hint at
746
+ # how to review the source (e.g. `gh repo view ...` for the Caveman fork).
747
+ ```
748
+
749
+ ### n. Re-run the full install chain after a major version bump
750
+
751
+ ```bash
752
+ npm install -g @mhd-ghaith-abtah/flow@beta # get the new version
753
+ flow init --update --force # rewrite flow.config.yaml + re-run
754
+ ```
755
+
756
+ ### o. Open a fresh `/flow-story` cycle from the CLI
757
+
758
+ You can't — `/flow-story` is LLM-driven. But you can prep the state from the CLI:
759
+
760
+ ```bash
761
+ flow sprint add --id E1-001 --title "Bootstrap" --epic E1 --tags ci,setup
762
+ flow sprint next # flip to doing
763
+ # Then inside Claude Code:
764
+ /flow-story E1-001
765
+ ```
766
+
767
+ ### p. Headless story bookkeeping during a marathon session
768
+
769
+ If you're driving multiple stories from one Claude Code session, the slash command updates sprint.yaml automatically. If you're driving from a script (CI, shell loop), use the CLI:
770
+
771
+ ```bash
772
+ for id in E1-001 E1-002 E1-003; do
773
+ flow sprint done "$id" --note "scripted close"
774
+ done
775
+ flow sprint status
776
+ ```
777
+
778
+ ---
779
+
780
+ ## 14. Environment variables
781
+
782
+ | Variable | Meaning |
783
+ |---|---|
784
+ | `FLOW_REPO_ROOT` | Override catalog/templates location. Used internally when the slash command dispatches to the CLI. |
785
+ | `FLOW_INSPECT_INSTALL_SCRIPTS=1` | Don't auto-run upstream installers. Each dispatcher halts before exec, prints the command + a hint, and returns `inspect_only: true` in the state record. |
786
+ | `FLOW_DEBUG=1` | Show stack traces on CLI errors. |
787
+ | `HOME` | Standard. Used for user-scope paths (`~/.claude/...`) and the secrets file. |
788
+ | `CLAUDECODE` / `CLAUDE_CODE` | Auto-detected. Outside Claude Code, `flow init` falls through to the headless path. Inside, it nudges to the slash command. |
789
+
790
+ ---
791
+
792
+ ## 15. Files Flow writes
793
+
794
+ ### a. Project tree (committed)
795
+
796
+ ```
797
+ <project>/
798
+ ├── .claude/
799
+ │ ├── flow.config.yaml # team-shared, COMMIT THIS
800
+ │ ├── flow/
801
+ │ │ └── install-state.json # what Flow did, COMMIT IT (helps `--repair`, `--update`)
802
+ │ ├── rules/ecc/ # team profile only — owned by ECC, gitignore optional
803
+ │ └── skills/ecc/ # team profile only — owned by ECC, gitignore optional
804
+ └── docs/
805
+ └── flow/
806
+ ├── sprint.yaml # SOURCE OF TRUTH for stories, COMMIT THIS
807
+ ├── deferred.md # open one-liners, COMMIT THIS
808
+ ├── stories/ # active story files, COMMIT THIS
809
+ ├── archive/ # completed stories, COMMIT THIS
810
+ ├── journeys/ # E2E journey definitions, COMMIT THIS
811
+ └── retros/ # epic retros, COMMIT THIS
812
+ ```
813
+
814
+ ### b. Gitignored
815
+
816
+ ```
817
+ flow.config.local.yaml # per-developer overrides
818
+ ```
819
+
820
+ ### c. User-scope (never committed)
821
+
822
+ ```
823
+ ~/.claude/
824
+ ├── skills/{flow-init,flow-sprint,flow-story,flow-doctor}/
825
+ ├── flow/install-state.json # if you installed user-scope
826
+ ├── .env.flow # secrets, chmod 600
827
+ ├── rules/ecc/ # mini/standard profile only
828
+ └── skills/ecc/ # mini/standard profile only
829
+ ```
830
+
831
+ ### d. Backup files from BMad migration
832
+
833
+ ```
834
+ docs/_bmad-output/implementation-artifacts/sprint-status.yaml.flow-backup-<ts>
835
+ docs/_bmad-output/implementation-artifacts/deferred-work.md.flow-backup-<ts>
836
+ ```
837
+
838
+ These get created by `flow sprint import-bmad` (or `/flow-init --migrate-bmad`) before any write. Delete them after you're confident the migration is correct, or pass `--remove-backups` to `flow uninstall`.
839
+
840
+ ---
841
+
842
+ ## 16. Troubleshooting
843
+
844
+ ### a. `flow: command not found`
845
+
846
+ `npm install -g @mhd-ghaith-abtah/flow@beta` didn't put `flow` on `$PATH`. Check `npm config get prefix` — that directory's `bin/` needs to be on your shell `$PATH`. Or use `npx`:
847
+
848
+ ```bash
849
+ npx -y @mhd-ghaith-abtah/flow@beta --version
850
+ ```
851
+
852
+ ### b. `flow init --yes` exits with "ECC upstream failed"
853
+
854
+ The github-pinned ECC fallback can fail if:
855
+
856
+ 1. **No network during install.** `npx -y -p "github:..."` needs to clone. Retry with network access.
857
+ 2. **GitHub rate-limited.** Wait 5 min and retry.
858
+ 3. **The pinned commit was force-pushed away.** Open an issue — Flow needs to re-pin.
859
+
860
+ Workaround: pass `--continue-on-error` to skip past upstream failures and inspect the resulting state with `flow doctor`.
861
+
862
+ ### c. `flow doctor` shows "ECC scope collision"
863
+
864
+ Both `~/.claude/rules/ecc/` and `<project>/.claude/rules/ecc/` exist. Cause: you changed `--ecc-scope` between installs without uninstalling first. The doctor probe reads `install-state.json` to identify the active scope and prints the exact `rm -rf` command for the stale one.
865
+
866
+ ### d. Caveman MCP not active in this session
867
+
868
+ Caveman activates via `~/.claude/hooks/caveman-config.js` on `SessionStart`. If you have `~/.config/caveman/config.json` set to `{"defaultMode": "off"}` (the recommended allowlist mode), drop a `.caveman-enable` marker in the project root:
869
+
870
+ ```bash
871
+ touch .caveman-enable
872
+ ```
873
+
874
+ Flow's `/flow-init` drops this automatically. Restart your Claude Code session for the hook to re-fire.
875
+
876
+ ### e. `flow sprint done E1-002` says "expects 'review' or 'doing'"
877
+
878
+ Story is in a state Flow won't auto-flip to done. Either:
879
+
880
+ - Move it to `review` first (typical when the PR is open and waiting)
881
+ - Pass `--force` to skip the gate (typical for backfilled offline stories)
882
+
883
+ ```bash
884
+ flow sprint done E1-002 --force
885
+ ```
886
+
887
+ ### f. `flow init --repair` says "no install-state.json found"
888
+
889
+ Repair needs an authoritative install to read from. If you never ran `flow init`, run it first:
890
+
891
+ ```bash
892
+ flow init --profile mini --yes
893
+ ```
894
+
895
+ ### g. `flow init --update` says "install_scope change is not supported mid-flight"
896
+
897
+ Scope swaps need filesystem cleanup at the old location. Follow the printed recipe:
898
+
899
+ ```bash
900
+ flow uninstall --execute --yes --remove-project-ecc # cleanup
901
+ flow init --profile team --ecc-scope user --yes # reinstall with new scope
902
+ ```
903
+
904
+ ### h. `npm publish` fails with `EOTP` / `E401`
905
+
906
+ Authentication or 2FA issue. Run `npm login` to refresh auth, then retry the publish with `--otp=<code>`:
907
+
908
+ ```bash
909
+ npm publish --tag beta --access public --otp=123456
910
+ ```
911
+
912
+ ### i. CI fails with `actions/checkout@v4` auth error
913
+
914
+ Transient GitHub Actions infrastructure flake. Rerun the failed jobs:
915
+
916
+ ```bash
917
+ gh run rerun <run-id> --failed
918
+ ```
919
+
920
+ This has hit us 3+ times in 2026-05; consistently resolves on rerun.
921
+
922
+ ### j. Want to start over completely
923
+
924
+ ```bash
925
+ flow uninstall --scope both --execute --yes --remove-stories --remove-project-ecc
926
+ flow init --profile <name> --yes
927
+ ```
928
+
929
+ This blows away Flow + Flow's project content + project-scope ECC. Does NOT remove BMad, user-scope ECC, or Caveman — those need their own uninstall commands (printed at the end of `flow uninstall`).
930
+
931
+ ---
932
+
933
+ ## See also
934
+
935
+ - [Quickstart](quickstart.md) — 10-minute first-install path
936
+ - [Profiles](profiles.md) — per-profile details and ECC scope mechanics
937
+ - [Adapters](adapters.md) — adapter contract and how to add new ones
938
+ - [BMad migration](migrate-from-bmad.md) — specifics on the BMad → Flow state migration
939
+ - [ROADMAP](../ROADMAP.md) — the multi-epic arc + guiding principles
940
+ - [CHANGELOG](../CHANGELOG.md) — what shipped when