cohorte 3.0.0-dev.6 → 3.0.0-dev.8

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 (95) hide show
  1. package/README.md +59 -392
  2. package/assets/manifest.json +14 -4
  3. package/assets/prompts/agents/brainstormer.md +3 -0
  4. package/assets/prompts/agents/spec-author.md +3 -0
  5. package/assets/schemas/commands.schema.json +7 -0
  6. package/dist/bundle-manifest.json +72 -50
  7. package/dist/chunks/align-ds-r_X_1aQ_.mjs +93 -0
  8. package/dist/chunks/align-ds-r_X_1aQ_.mjs.map +1 -0
  9. package/dist/chunks/audit-B4ZWQ_DI.mjs +179 -0
  10. package/dist/chunks/audit-B4ZWQ_DI.mjs.map +1 -0
  11. package/dist/chunks/brainstorm-SJwOIEif.mjs +123 -0
  12. package/dist/chunks/brainstorm-SJwOIEif.mjs.map +1 -0
  13. package/dist/chunks/build-C_-mbZfD.mjs +19 -0
  14. package/dist/chunks/build-C_-mbZfD.mjs.map +1 -0
  15. package/dist/chunks/{catalogue-DzsslCSN.mjs → catalogue-IaCJdfB8.mjs} +4 -4
  16. package/dist/chunks/{catalogue-DzsslCSN.mjs.map → catalogue-IaCJdfB8.mjs.map} +1 -1
  17. package/dist/chunks/{compose-ckM7eAJ_.mjs → compose-DRKjQcn0.mjs} +42 -23
  18. package/dist/chunks/compose-DRKjQcn0.mjs.map +1 -0
  19. package/dist/chunks/{config-DcGPL3i7.mjs → config-Cqu5XQoP.mjs} +2 -2
  20. package/dist/chunks/{config-DcGPL3i7.mjs.map → config-Cqu5XQoP.mjs.map} +1 -1
  21. package/dist/chunks/{contract-DiWla5G9.mjs → contract-DjssDPpS.mjs} +45 -25
  22. package/dist/chunks/contract-DjssDPpS.mjs.map +1 -0
  23. package/dist/chunks/{diff-D_0hBwHl.mjs → diff-Qw0II0sj.mjs} +2 -2
  24. package/dist/chunks/{diff-D_0hBwHl.mjs.map → diff-Qw0II0sj.mjs.map} +1 -1
  25. package/dist/chunks/{discover-BBiluyl4.mjs → discover-BZPolSZG.mjs} +2 -2
  26. package/dist/chunks/{discover-BBiluyl4.mjs.map → discover-BZPolSZG.mjs.map} +1 -1
  27. package/dist/chunks/{doctor-BAcemCDr.mjs → doctor-DcDFPvQM.mjs} +6 -6
  28. package/dist/chunks/{doctor-BAcemCDr.mjs.map → doctor-DcDFPvQM.mjs.map} +1 -1
  29. package/dist/chunks/fix-C9roGiQz.mjs +82 -0
  30. package/dist/chunks/fix-C9roGiQz.mjs.map +1 -0
  31. package/dist/chunks/fleet-yWHQY2ya.mjs +297 -0
  32. package/dist/chunks/fleet-yWHQY2ya.mjs.map +1 -0
  33. package/dist/chunks/{init-DfOKw-rD.mjs → init--FxxkrcT.mjs} +2 -2
  34. package/dist/chunks/{init-DfOKw-rD.mjs.map → init--FxxkrcT.mjs.map} +1 -1
  35. package/dist/chunks/intake-C1pesxCJ.mjs +12 -0
  36. package/dist/chunks/intake-C1pesxCJ.mjs.map +1 -0
  37. package/dist/chunks/loop-BWsUpyus.mjs +212 -0
  38. package/dist/chunks/loop-BWsUpyus.mjs.map +1 -0
  39. package/dist/chunks/{migrate-D3-4beNR.mjs → migrate-DuYCAbE3.mjs} +2 -2
  40. package/dist/chunks/{migrate-D3-4beNR.mjs.map → migrate-DuYCAbE3.mjs.map} +1 -1
  41. package/dist/chunks/{obsidian-D1jf1sTR.mjs → obsidian-BHLkXx_H.mjs} +50 -6
  42. package/dist/chunks/obsidian-BHLkXx_H.mjs.map +1 -0
  43. package/dist/chunks/patch-sAgVqjpx.mjs +50 -0
  44. package/dist/chunks/patch-sAgVqjpx.mjs.map +1 -0
  45. package/dist/chunks/{policy-Y65MYKzn.mjs → policy-Du7WVBFX.mjs} +4 -4
  46. package/dist/chunks/{policy-Y65MYKzn.mjs.map → policy-Du7WVBFX.mjs.map} +1 -1
  47. package/dist/chunks/{reconcile-B6mGZWtp.mjs → reconcile-BHn66X3C.mjs} +3 -3
  48. package/dist/chunks/{reconcile-B6mGZWtp.mjs.map → reconcile-BHn66X3C.mjs.map} +1 -1
  49. package/dist/chunks/refactor-DV3RfGjk.mjs +153 -0
  50. package/dist/chunks/refactor-DV3RfGjk.mjs.map +1 -0
  51. package/dist/chunks/retro-Dr-2RTNN.mjs +78 -0
  52. package/dist/chunks/retro-Dr-2RTNN.mjs.map +1 -0
  53. package/dist/chunks/review-ZsBqp3vZ.mjs +35 -0
  54. package/dist/chunks/review-ZsBqp3vZ.mjs.map +1 -0
  55. package/dist/chunks/{run-BInPXOcm.mjs → run-BGabwbDL.mjs} +32 -5
  56. package/dist/chunks/run-BGabwbDL.mjs.map +1 -0
  57. package/dist/chunks/{schema-hSyIURjN.mjs → schema-Bq9qtgsd.mjs} +2 -2
  58. package/dist/chunks/{schema-hSyIURjN.mjs.map → schema-Bq9qtgsd.mjs.map} +1 -1
  59. package/dist/chunks/ship-BizfUe62.mjs +140 -0
  60. package/dist/chunks/ship-BizfUe62.mjs.map +1 -0
  61. package/dist/chunks/spec-C2h3U64g.mjs +65 -0
  62. package/dist/chunks/spec-C2h3U64g.mjs.map +1 -0
  63. package/dist/chunks/spec-path-tptqR7W8.mjs +10 -0
  64. package/dist/chunks/spec-path-tptqR7W8.mjs.map +1 -0
  65. package/dist/chunks/{src-C7hs8Bjw.mjs → src-Bfr1yzsn.mjs} +3 -3
  66. package/dist/chunks/{src-C7hs8Bjw.mjs.map → src-Bfr1yzsn.mjs.map} +1 -1
  67. package/dist/chunks/{src-Daa5lIcP.mjs → src-CPW2_Ons.mjs} +101 -17
  68. package/dist/chunks/src-CPW2_Ons.mjs.map +1 -0
  69. package/dist/chunks/{src-DMrQ5m6I.mjs → src-DNsLSxgm.mjs} +2 -2
  70. package/dist/chunks/{src-DMrQ5m6I.mjs.map → src-DNsLSxgm.mjs.map} +1 -1
  71. package/dist/chunks/{src-BnlNkd3S.mjs → src-DbS9gkJy.mjs} +2 -2
  72. package/dist/chunks/{src-BnlNkd3S.mjs.map → src-DbS9gkJy.mjs.map} +1 -1
  73. package/dist/chunks/{src-s7YRvk0t.mjs → src-yi5whv3n.mjs} +4 -2
  74. package/dist/chunks/src-yi5whv3n.mjs.map +1 -0
  75. package/dist/chunks/update-pipeline-Du-Gu1Pl.mjs +56 -0
  76. package/dist/chunks/update-pipeline-Du-Gu1Pl.mjs.map +1 -0
  77. package/dist/cli.mjs +29 -19
  78. package/dist/cli.mjs.map +1 -1
  79. package/package.json +1 -1
  80. package/dist/chunks/brainstorm-kBUiZLce.mjs +0 -7
  81. package/dist/chunks/brainstorm-kBUiZLce.mjs.map +0 -1
  82. package/dist/chunks/compose-ckM7eAJ_.mjs.map +0 -1
  83. package/dist/chunks/contract-DiWla5G9.mjs.map +0 -1
  84. package/dist/chunks/fix-D4Tj8RVA.mjs +0 -18
  85. package/dist/chunks/fix-D4Tj8RVA.mjs.map +0 -1
  86. package/dist/chunks/obsidian-D1jf1sTR.mjs.map +0 -1
  87. package/dist/chunks/review-BDdjb6kB.mjs +0 -17
  88. package/dist/chunks/review-BDdjb6kB.mjs.map +0 -1
  89. package/dist/chunks/run-BInPXOcm.mjs.map +0 -1
  90. package/dist/chunks/ship-DTuLGoaJ.mjs +0 -19
  91. package/dist/chunks/ship-DTuLGoaJ.mjs.map +0 -1
  92. package/dist/chunks/spec-MVP9y8dN.mjs +0 -20
  93. package/dist/chunks/spec-MVP9y8dN.mjs.map +0 -1
  94. package/dist/chunks/src-Daa5lIcP.mjs.map +0 -1
  95. package/dist/chunks/src-s7YRvk0t.mjs.map +0 -1
package/README.md CHANGED
@@ -1,437 +1,104 @@
1
- <div align="center">
1
+ # Cohorte
2
2
 
3
- <img src="https://raw.githubusercontent.com/TheBidouilleAgency/cohorte/main/assets/cohorte-banner.png" alt="Cohorte — portable multi-agent pipeline for Claude Code" width="720">
3
+ Cohorte V3 est un orchestrateur durable de pipelines multi-agents, construit autour de Pi et d'un état SQLite. Il transforme une spécification validée en run observable, reprend les runs interrompus et protège chaque effet par des contrats typés, une politique de sécurité et un journal idempotent.
4
4
 
5
- [![npm version](https://img.shields.io/npm/v/cohorte?logo=npm&color=cb3837)](https://www.npmjs.com/package/cohorte)
6
- [![npm downloads](https://img.shields.io/npm/dm/cohorte?logo=npm)](https://www.npmjs.com/package/cohorte)
7
- [![Publish to npm](https://github.com/TheBidouilleAgency/cohorte/actions/workflows/publish.yml/badge.svg)](https://github.com/TheBidouilleAgency/cohorte/actions/workflows/publish.yml)
8
- [![node >=18](https://img.shields.io/node/v/cohorte?logo=node.js&logoColor=white)](https://nodejs.org)
9
- [![license: AGPL-3.0](https://img.shields.io/badge/license-AGPL--3.0-blue)](LICENSE)
10
- [![docs](https://img.shields.io/badge/docs-thebidouilleagency.github.io%2Fcohorte-6f42c1)](https://thebidouilleagency.github.io/cohorte/)
5
+ [Documentation complète](https://thebidouilleagency.github.io/cohorte/) · [Spécification V3](docs/v3/SPEC.md) · [Design](docs/v3/DESIGN.md) · [Référence CLI](docs/v3/CLI.md)
11
6
 
12
- **[📖 Full documentation](https://thebidouilleagency.github.io/cohorte/)** — guides (feature cycle, workflows, token economy, parallel features) + complete reference (commands, agents, profile, gate, scripts).
7
+ ## Installation
13
8
 
14
- </div>
15
-
16
- > **V3 migration status:** the V3 runtime-independent pipeline is under active migration. V2 sources are retained
17
- > under [`legacy/v2`](legacy/v2); V3 builds are immutable, snapshot-pinned and can be exercised offline with the
18
- > fake runtime. See [`docs/v3`](docs/v3/PLAN.md) for the implementation plan and release gates.
19
-
20
- For maintainers, see the [maintenance and release guide](docs/guide/maintainers.md) for the architecture, test
21
- matrix, troubleshooting, PR workflow and npm/GitHub release procedure.
22
-
23
- A **portable, stack-agnostic multi-agent pipeline** for your coding agent — Claude Code, Codex CLI,
24
- Cursor, Gemini CLI or OpenCode. Install it once globally, then one command per project
25
- (`/cohorte-init-pipeline`) adapts it to that project's stack.
26
-
27
- - **The dev pipeline** — a human **lead** drives feature work through gated commands, dispatching
28
- **stateless agents** that only communicate through a frozen contract:
29
-
30
- ```
31
- /cohorte-brainstorm → /cohorte-spec → (design) → /cohorte-build <id> → /cohorte-review → (/cohorte-fix) → /cohorte-ship
32
- ```
33
-
34
- <div align="center">
35
- <img src="https://raw.githubusercontent.com/TheBidouilleAgency/cohorte/main/assets/demo-cli.gif" alt="cohorte doctor reporting a green pipeline, the spec board, and the gate denying a chained destructive command" width="760">
36
- <br>
37
- <sub><code>cohorte doctor</code> · the spec board · the gate refusing a hard-denied command chained behind a benign one.<br>
38
- Recorded from the real CLI by <code>scripts/demo/record-cli.sh</code> — no output is hand-edited.</sub>
39
- </div>
40
-
41
- ## Why a pipeline at all
42
-
43
- Your coding agent is already good at the first prompt of a feature. It gets worse at every one
44
- after — because what it knows lives in a conversation, and a conversation gets summarised,
45
- truncated, and re-sent at input price on every turn. Cohorte is the set of constraints that stop
46
- that degradation. Each one is a failure you have already had:
47
-
48
- | The failure | The constraint |
49
- | --- | --- |
50
- | *"It forgot what we decided."* | The spec is **frozen to disk** and re-read by every stateless agent. Nothing is remembered, so nothing is forgotten — and `/clear` between stages is always safe. |
51
- | *"The API and the UI don't fit."* | The **contract is authored before any implementer is dispatched**. Surfaces import it read-only and never talk to each other — which is what makes building them in parallel safe. |
52
- | *"It edited a file I didn't want it to."* | **One owner per tree**, enforced in the rendered agent's frontmatter — not requested politely in a prompt. |
53
- | *"It ran something it shouldn't have."* | `gate.py` is a **real blocking hook**, branch-aware, hard-denying destructive commands from every agent — subagents included. |
54
- | *"The review said it was fine."* | Review is a **separate read-only agent** that sees the spec and the diff, never the conversation that produced them. A dead reviewer's zero findings can't read as ship. |
55
- | *"Four agents just told me it doesn't compile."* | A **deterministic preflight** runs typecheck/lint/tests first. Red ⇒ **zero agents spawned**. |
56
- | *"We fixed this same thing last week."* | `/cohorte-retro` turns repeated findings into ratified conventions **baked into the implementers**, so the next build never produces them. |
57
-
58
- None of this is intelligence added to your agent — it's the opposite. It moves the decisions an
59
- agent makes badly under context pressure into files, hooks and ownership boundaries, where they're
60
- cheap and don't degrade with conversation length. Which is why it's markdown, shell and one Python
61
- hook: **your app code never imports anything from Cohorte.**
62
-
63
- [**The long version — including the four cases where you shouldn't use it →**](https://thebidouilleagency.github.io/cohorte/guide/why-cohorte)
64
-
65
- ## How it works — three layers
66
-
67
- | Layer | What it holds | Lives in | Scope |
68
- | --- | --- | --- | --- |
69
- | **Generic core** | the workflow doctrine: commands, fixed agents, templates, hooks — zero project facts | `~/.claude` (global) — or vendored in a repo's `.claude/` (bundled) | identical everywhere, installed once |
70
- | **Project profile** | stack, surfaces, commands, conventions, gates | `PIPELINE.md` + rendered surface agents + `gate-config.json`, **committed in each repo** | generated per project by `/cohorte-init-pipeline` |
71
- | **User config** | kanban board links + shared Obsidian vault path | `~/.claude/cohorte.config.yaml` | personal, project-independent |
72
-
73
- The core never hardcodes stack facts. Two mechanisms keep it generic:
74
-
75
- 1. **Runtime indirection** — commands/agents read project facts from `PIPELINE.md` (dev pipeline) or
76
- `~/.claude/cohorte.config.yaml` (kanban board links + shared vault) at run time — an agent's
77
- _first action_ is to read its config.
78
- 2. **Render-at-init** — things that must be in agent frontmatter (name, `tools:`, surface ownership)
79
- are rendered per **surface** by `/cohorte-init-pipeline` from `implementer.template.md`.
80
-
81
- ## Which coding agent — [full matrix →](https://thebidouilleagency.github.io/cohorte/reference/runtimes)
82
-
83
- The doctrine is one set of source prompts. The installer renders them into whatever your agent
84
- actually reads, and branches the instructions on what it can actually do:
9
+ Prérequis : Node `24.16.0` minimum supporté et pnpm `12.4.2` pour contribuer au dépôt. Pour utiliser la CLI publiée :
85
10
 
86
11
  ```sh
87
- cohorte install --runtime=codex,cursor # pick explicitly
88
- cohorte install --all-runtimes # every supported one
89
- cohorte install # detects what you have and asks
12
+ npm install -g cohorte
13
+ cohorte --version
90
14
  ```
91
15
 
92
- | | Commands | Subagents | Gate | Workflows |
93
- | --- | --- | --- | --- | --- |
94
- | **Claude Code** | `.claude/commands/*.md` | ✅ `.claude/agents` | ✅ blocking hook, deny + **ask** | ✅ |
95
- | **Codex CLI** | `.agents/skills/*/SKILL.md` | ✅ `.codex/agents` (TOML) | ✅ blocking hook, deny only | — |
96
- | **Cursor** | `.cursor/commands/*.md` | ✅ `.cursor/agents` | ✅ blocking hook, deny + **ask** | — |
97
- | **Gemini CLI** | `.gemini/commands/*.toml` | ✅ `.gemini/agents` | ✅ blocking hook, deny only | — |
98
- | **OpenCode** | `.opencode/commands/*.md` | ✅ `.opencode/agents` | advisory `--check` | — |
99
-
100
- The same `gate.py` is registered as a real blocking hook on four of the five — it speaks each
101
- runtime's envelope (`PreToolUse`, `beforeShellExecution`, `BeforeTool`). Codex and Gemini have **no
102
- confirmation tier**, so a pattern that would be queried elsewhere is **denied** there rather than
103
- falling through; the rendered prompts say so. OpenCode extends via plugins rather than hooks, so
104
- there the commands call `gate.py --check` themselves — same config and verdicts, but advisory.
105
-
106
- **Real subagents are a requirement, not a capability to degrade around** — the pipeline's isolation
107
- guarantee is that boundary, so a runtime without them is refused at install rather than rendered
108
- into a pipeline whose central promise is absent. All five have them.
109
- `/cohorte-doctor` reports what the runtime you are in can actually enforce.
110
-
111
- On Codex the commands ship as **skills** (`$cohorte-build`) rather than custom prompts: prompts are
112
- deprecated and user-scoped, so a teammate cloning the repo would get the profile but none of the
113
- commands — `.agents/skills/` is committed with it instead.
114
-
115
- One thing does not travel: model pins. The profile names Anthropic aliases, meaningless elsewhere,
116
- so agents inherit the runtime's own model. Claude Code remains the reference implementation and its
117
- install is unchanged.
118
-
119
- ## Prerequisites
120
-
121
- Only one hard requirement — the rest is optional and independent:
122
-
123
- - **Node ≥ 18 + npm** — _required_, for the `cohorte` CLI that lays down the core. Nothing else needs it.
124
- - **[`uv`](https://docs.astral.sh/uv/) + the Serena CLI** — _optional_, the default code-retrieval
125
- provider. Install it separately (`uv tool install -p 3.13 serena-agent && uv tool update-shell`); the
126
- cohorte install neither needs nor touches it, so the order between the two is irrelevant. Without Serena
127
- the pipeline still runs — agents just fall back to Grep/Read. Having it installed **before**
128
- `/cohorte-init-pipeline` lets init wire it in one pass (otherwise `/cohorte-update-pipeline` wires it later).
129
- - **On a new machine cloning a repo that's already pipeline-ised:** the Serena registration is committed
130
- in the repo's `.mcp.json` (project scope, portable) — you don't re-wire. Just install the Serena CLI,
131
- restart the session, and run `/cohorte-doctor` to confirm it connects.
132
-
133
- ## Install
134
-
135
- The pipeline ships as an npm package (`cohorte`), so releases are semver-tagged — no clone
136
- needed, works on macOS/Linux/Windows. **Install it once, globally**; every command below is
137
- written as `cohorte …`, and that single form is what the rest of this README, the docs, and the
138
- [Francois extension](https://github.com/TheBidouilleAgency/francois-plugin-cohorte) all assume:
16
+ Dans un projet :
139
17
 
140
18
  ```sh
141
- npm i -g cohorte
19
+ cohorte init
20
+ cohorte doctor
21
+ cohorte discover --json
22
+ cohorte config validate
142
23
  ```
143
24
 
144
- `npx cohorte <verb>` runs any of them without installing anything, for a one-off on a machine
145
- you don't own. It is the escape hatch, not the path — see
146
- [why one form](https://thebidouilleagency.github.io/cohorte/reference/installers).
147
-
148
- **Global (recommended)** — install the generic core ONCE into `~/.claude`; it serves every repo on
149
- your machine. Nothing is copied per project; the gate hook is registered once and reads each repo's
150
- own `gate-config.json`:
151
-
152
- ```sh
153
- cohorte install --global
154
- ```
25
+ `cohorte init` crée `.cohorte/`. Les fichiers de configuration générés peuvent être réconciliés avec `cohorte reconcile --plan`, puis `cohorte reconcile --apply`. L'état d'exécution reste local et n'a pas vocation à être versionné.
155
26
 
156
- The per-project part is NOT the core — it's the **profile** `/cohorte-init-pipeline` generates and you
157
- commit: `PIPELINE.md`, the rendered surface agents, `gate-config.json`, `settings.json`, `specs/`.
158
- **That's what makes team work possible in global mode**: everything project-specific travels with the
159
- repo; each teammate just runs the same global one-liner once, guided by the committed
160
- `.claude/pipeline.json` pointer (core version + install command) that `/cohorte-init-pipeline` writes.
27
+ ## Workflow V3
161
28
 
162
- <details>
163
- <summary><strong>Alternative: per-project (bundled)</strong> — vendor the core into the repo itself.</summary>
29
+ Le workflow est piloté par la CLI ; il n'exige pas un runtime V2 ni des slash commands :
164
30
 
165
31
  ```sh
166
- # inside your project (or pass its path as an argument)
167
- cohorte install
32
+ cohorte brainstorm "Ajouter une fonctionnalité"
33
+ cohorte spec validate <feature-id>
34
+ cohorte spec freeze <feature-id>
35
+ cohorte run <feature-id> --detach --json
36
+ cohorte status <run-id> --json
37
+ cohorte tail <run-id>
38
+ cohorte review <run-id>
39
+ cohorte fix <run-id>
40
+ cohorte ship <run-id>
168
41
  ```
169
42
 
170
- Copies the core into `<project>/.claude`, committed with the repo. Choose this when you want
171
- **zero-setup onboarding** (teammates get the core with `git clone`, no install step at all) and a
172
- core version **pinned per repo** (no drift between projects or teammates). Cost: the core is
173
- duplicated in every repo and each repo updates separately.
174
-
175
- </details>
176
-
177
- <details>
178
- <summary><strong>No Node/npm?</strong> The original script installers still work.</summary>
43
+ Pour un workflow complet borné :
179
44
 
180
45
  ```sh
181
- # global (recommended) # per-project (bundled)
182
- sh install.sh --global sh install.sh
183
- # or piped:
184
- curl -fsSL https://raw.githubusercontent.com/TheBidouilleAgency/cohorte/main/install.sh | sh -s -- --global
46
+ cohorte loop <feature-id>
185
47
  ```
186
48
 
187
- ```powershell
188
- # Windows (PowerShell 5.1+)
189
- .\install.ps1 -Global # or without -Global for per-project
190
- # or: & ([scriptblock]::Create((irm https://raw.githubusercontent.com/TheBidouilleAgency/cohorte/main/install.ps1))) -Global
191
- ```
192
-
193
- Script installs from a git checkout stamp the version as `<semver> (<sha>)`; the npm CLI stamps the
194
- published semver. Both land in `.claude/pipeline/VERSION` and the `pipeline.json` pointer.
195
-
196
- </details>
49
+ Les commandes `build`, `audit`, `refactor`, `fleet`, `retro`, `align-ds`, `intake` et `patch` couvrent les variantes de développement. Les commandes `pause`, `resume`, `cancel`, `retry`, `approve`, `deny`, `inspect`, `diff`, `logs`, `shutdown` et `gc` administrent les runs et leur état durable.
197
50
 
198
- > **After installing (or updating): restart Claude Code / start a new session.** Slash commands and
199
- > agents are scanned at session start — in an already-open session the new `/cohorte-init-pipeline`,
200
- > `/cohorte-build`, etc. won't appear until you reload. This is the #1 "the install didn't work" trap.
201
-
202
- Then, in Claude Code (from any repo, once the core is installed either way):
203
-
204
- ```
205
- /cohorte-init-pipeline
206
- ```
51
+ ## Obsidian
207
52
 
208
- It **detects** your stack (package manager, workspaces, frameworks, test runners, linters, git remote,
209
- design system), **interviews** you for the gaps, and **generates**:
210
-
211
- - `PIPELINE.md` — the project profile (a machine-readable `pipeline-profile` YAML block + prose conventions)
212
- - one implementer agent per **surface** (e.g. `backend.md`, `frontend.md`) with strict tree ownership
213
- and a per-surface `model:` tier (Haiku for mechanical surfaces, bigger models where design decisions live)
214
- - `.claude/gate-config.json` + `.claude/settings.json` — the destructive-command gate, plus an
215
- `allow` list of the project's read-only commands so agents don't stall on permission prompts
216
- - a **code-retrieval provider** wired as a committed project-scope MCP server —
217
- [Serena](https://github.com/oraios/serena) by default (live LSP symbol navigation: agents query
218
- symbols instead of grep-and-reading whole files; `graphify` or `none` also available via the
219
- profile's `retrieval.provider`)
220
- - `scripts/new-feature.sh` + `remove-feature.sh` — parallel worktree isolation (if you enable it)
221
- - `specs/_template.md` (and, on first decision, `specs/_decisions.md` — the project's one-line-per-decision
222
- journal, read by `/cohorte-brainstorm`, `/cohorte-spec` and `/cohorte-audit` so features stop re-litigating settled ground)
223
-
224
- Sanity-check `PIPELINE.md`, commit it, and run `/cohorte-brainstorm`.
225
-
226
- ## Update
53
+ Le tableau Kanban Obsidian est optionnel et se connecte explicitement au projet :
227
54
 
228
55
  ```sh
229
- npm i -g cohorte@latest # refresh the CLI — the core it lays down is its own
230
- cohorte update --global # the shared core in ~/.claude (recommended setup)
231
- cohorte update # a repo's bundled core in <project>/.claude
56
+ cohorte obsidian create <vault-root> <board-path>
57
+ cohorte obsidian connect <vault-root> <board-path>
58
+ cohorte obsidian status
59
+ cohorte obsidian move <feature-id> <column>
232
60
  ```
233
61
 
234
- (Script equivalents: `sh install.sh --update [--global]` / `.\install.ps1 -Update [-Global]`.)
235
-
236
- The installer refreshes the generic core (commands, hook, templates) **without** touching your
237
- `PIPELINE.md`, rendered agents, `gate-config.json`, `settings.json`, or your filled
238
- `~/.claude/cohorte.config.yaml`.
239
-
240
- From inside Claude Code, prefer **`/cohorte-update-pipeline`**: it runs the right update invocation for your
241
- install scope, reports `old → new` — and then **reconciles the repo's generated files to the new
242
- core**: new profile fields are added at their defaults (you're only asked for genuinely new
243
- decisions), surface agents are re-rendered, settings are patched additively, new capabilities get
244
- wired. **`/cohorte-init-pipeline` is one-time per project** — after init, `/cohorte-update-pipeline` is the only
245
- maintenance command you ever run (`/cohorte-build` auto-grows surfaces as specs need them).
62
+ La connexion déplace les cartes lors des transitions prévues du workflow ; elle ne copie pas le vault dans le dépôt et ne lit que le fichier de tableau configuré.
246
63
 
247
- ## Reading a project without an agent
248
-
249
- The two read-only halves of the pipeline, in the shell:
64
+ ## Providers, modèles et sécurité
250
65
 
251
66
  ```sh
252
- cohorte specs # the board: id · status · branch · title, from specs/*.md
253
- cohorte doctor # the /cohorte-doctor checks — exits 1 when any check is bad
254
- cohorte metrics --days=30 # cost + runtime per command, from Claude Code's transcripts
67
+ cohorte auth login
68
+ cohorte auth status
69
+ cohorte providers list
70
+ cohorte providers test
71
+ cohorte models list
72
+ cohorte policy explain -- <argv>
73
+ cohorte doctor --json
255
74
  ```
256
75
 
257
- `doctor`'s exit code is what makes it a CI step, and the three of them are what the Francois
258
- extension below renders.
76
+ Pi est le runtime de référence de V3. Le runtime fake reste disponible pour les tests hors ligne et les smoke tests. Aucun fallback automatique ne change de provider pendant un run : le snapshot épingle le bundle, les prompts, la configuration et le runtime utilisés.
259
77
 
260
- `doctor`'s exit code makes it a CI step as-is. Add `--porcelain` for one record per line with
261
- `U+001F` between fields (a spec title with a space in it never misaligns a column), or `--json`
262
- for the native document. Both read through `lib/`, so every consumer — the CLI, a Francois
263
- panel — answers from one implementation and the repo never gets two verdicts.
78
+ Chaque erreur affiche un code stable, son impact et l'action corrective. Les codes de contrôle sont `0` (terminé), `2` (usage), `3` (rejeté), `4` (accepté mais encore en attente) et `16` (annulé) ; les erreurs de run utilisent les classes documentées dans [`docs/v3/reference/exit-codes.md`](docs/v3/reference/exit-codes.md).
264
79
 
265
- `--panel` — on `specs`, `doctor` and `metrics` — emits the payload shape a
266
- [Francois](https://github.com/antoine-gmnz/francois) extension panel expects. It is the one
267
- Francois-aware surface in the package, and it exists for
268
- [**francois-plugin-cohorte**](https://github.com/TheBidouilleAgency/francois-plugin-cohorte): a
269
- manifest-only extension that renders the spec board, the doctor report and the 30-day cost as
270
- three panels beside your sessions.
80
+ ## Migration depuis V2
271
81
 
272
- A Francois extension may only spawn a **bare binary name resolved on `PATH`** — never `npx`,
273
- never a shell, never an absolute path. So this one needs the global install, and nothing else
274
- will do:
82
+ Le runtime et les fichiers V2 ne sont plus présents dans le dépôt. La compatibilité fonctionnelle est couverte par les tests V3 ; l'importeur reste disponible pour convertir un ancien projet :
275
83
 
276
84
  ```sh
277
- npm i -g cohorte
278
- francois ext install TheBidouilleAgency/francois-plugin-cohorte
85
+ cohorte init --export-v2 <bundle-dir>
86
+ cohorte init --from-v2 <bundle-dir> --yes
87
+ cohorte migrate --rollback <report-id>
279
88
  ```
280
89
 
281
- ## Releasing (maintainers)
282
-
283
- Versions are tracked with npm semver — the published package is the release artifact.
284
- Publishing is fully automated: [`publish.yml`](.github/workflows/publish.yml) runs on every push
285
- to `main`; when `package.json`'s version isn't on the registry yet it publishes to npm (trusted
286
- publishing / provenance), pushes the `vX.Y.Z` tag, and creates the GitHub release. Pushes without
287
- a version bump just run the sanity checks.
288
-
289
- **Releasing = editing one line.** Bump `"version"` in `package.json` (by hand, or
290
- `npm version patch --no-git-tag-version`), commit, push — CI does the rest (publish + tag +
291
- release). No local tagging needed.
292
-
293
- `npm i -g cohorte@latest` then serves the new version everywhere; installed cores record
294
- it in `.claude/pipeline/VERSION` and bundled repos in their committed `pipeline.json` pointer.
295
- `install` and `update` compare themselves against the registry and say so when they are behind,
296
- so a CLI pinned at an old version cannot quietly re-lay an old core.
297
-
298
- ## The commands
299
-
300
- | Command | Role |
301
- | -------------------- | ------------------------------------------------------------------------------------- |
302
- | `/cohorte-init-pipeline` | Detect stack → interview → generate the profile + agents. Run once per project. |
303
- | `/cohorte-intake [paste]` | Triage anything that arrives (ticket, email, trace, thread) into a `/cohorte-patch` handoff or a brainstorm seed — staged to disk, carded in Ideas. |
304
- | `/cohorte-brainstorm` | Interactive persona panel that pressure-tests a feature idea. |
305
- | `/cohorte-spec` | Freeze the feature spec + contract into `specs/<id>.md` (UI features also get a standalone design brief at `specs/design/<id>.md`). Also applies review returns. |
306
- | `/cohorte-patch [bug]` | Bug-fix entry: triage a bug and freeze a ~60-line patch spec (`specs/patch-<slug>.md`) whose regression test replaces the contract. Then the normal `/cohorte-build → review → ship`. |
307
- | `/cohorte-build <id>` | Readiness gate on the frozen spec, then the lead authors the contract and dispatches one implementer per surface in parallel. |
308
- | `/cohorte-review <id>` | Read-only review agents (one per touched surface, parallel) audit the diff vs the spec; out-of-scope findings go to the refactor backlog. `--pr <num>` reviews an **incoming** GitHub PR in a throwaway worktree and offers to post the report as a comment. |
309
- | `/cohorte-fix <id>` | Apply a review report: remediation into the spec, re-dispatch only the surfaces with findings. |
310
- | `/cohorte-fleet plan\|status\|sync` | Fly several features in parallel: overlap matrix + merge order, one worktree per feature, live status, post-merge rebase sweep. Coordination only — never headless execution. |
311
- | `/cohorte-ship <id>` | Release agent commits, pushes, opens the PR; watches CI; proposes worktree teardown. |
312
- | `/cohorte-audit [path]` | Prioritized refactor backlog for existing code. |
313
- | `/cohorte-refactor <domain>` | Apply the backlog for one surface, TDD-first. |
314
- | `/cohorte-retro [last n]` | Mine the accumulated review findings for patterns; ratified ones become §Conventions rules and the surface agents are re-rendered — the next build never produces the finding. |
315
- | `/cohorte-align-ds` | Align the code UI kit to the design system (no-op if none configured). |
316
- | `/cohorte-update-pipeline` | Refresh the installed core (global or bundled) to the latest published version. |
317
- | `/cohorte-doctor` | Diagnose the installation (core, agents↔surfaces, hooks, gate, retrieval, worktrees). |
318
-
319
- ### Run the loop cheaply — `/clear` between stages
320
-
321
- Every command reloads all the state it needs **from disk** — the frozen spec, the contract, the diff, the
322
- Remediation checkboxes, the freshness stamp, and the last `/cohorte-review` report (staged to a gitignored
323
- `specs/reports/<id>.md`). Nothing essential lives in the conversation. So the loop is **`/clear`-safe at
324
- every boundary**:
325
-
326
- ```
327
- /cohorte-spec → /clear → /cohorte-build → /clear → /cohorte-review → /clear → /cohorte-fix → /clear → /cohorte-review → /cohorte-ship
328
- ```
329
-
330
- `/clear`-ing between stages sheds the accumulated main-thread context, which is the single biggest token
331
- lever: long sessions (>150k) are expensive even when cached. Each command tells you when its handoff is
332
- safe to clear. If you'd rather stay in one session, `/compact` mid-task does the lighter version. (Claude
333
- can't fire `/clear` itself — it's a client-side command; the pipeline just makes it always safe to type.)
334
-
335
-
336
- ### Run features in parallel — one session per feature
90
+ Voir [`docs/v3/MIGRATION.md`](docs/v3/MIGRATION.md) pour les garanties, les sauvegardes et le rollback. Cette procédure ne transforme jamais un ancien run en run V3 : un run V3 démarre avec son propre snapshot et son propre état SQLite.
337
91
 
338
- With `isolation.enabled`, every feature already gets its own worktree, ports, and database
339
- (`scripts/new-feature.sh <id>` — slots tracked in `.worktrees/slots.tsv`). That isolation is exactly
340
- what makes **parallel features** safe, and it's the real throughput multiplier when you're rate-limited:
341
- while feature A's `/cohorte-build` runs its agents (minutes of wall-clock you'd otherwise spend waiting), a
342
- second Claude Code session can `/cohorte-spec` or `/cohorte-review` feature B.
92
+ ## Contribuer
343
93
 
344
- The pattern:
345
-
346
- ```
347
- session 1 (main checkout): /cohorte-spec feat-a → /cohorte-build feat-a (agents run…)
348
- session 2 (main checkout): /cohorte-spec feat-b → /cohorte-build feat-b (agents run…)
349
- session 1: /cohorte-review feat-a → /cohorte-ship feat-a
350
- session 2: /cohorte-review feat-b → …
94
+ ```sh
95
+ pnpm install --frozen-lockfile
96
+ pnpm ci:typecheck
97
+ pnpm ci:unit
98
+ pnpm ci:integration
99
+ pnpm ci:acceptance
351
100
  ```
352
101
 
353
- Rules that make it safe:
354
-
355
- - **One feature per session.** All lead-side state is keyed by feature id on disk
356
- (`specs/<id>.md`, `<contract.path>/<id>.*`, `specs/reports/<id>*`), so sessions never share state —
357
- but a single session interleaving two features accumulates both in its context, paying for both.
358
- - **Disjoint surfaces per feature are guaranteed** (each worktree is a full checkout), and each
359
- feature's DB/ports come from its slot — two features' dev servers collide on neither.
360
- - **The contract package is the one shared tree.** Two features editing
361
- `<contract.path>/<their-own-id>.<ext>` never conflict (one file per feature); merge order only
362
- matters if a later feature *imports* an earlier one's contract — ship the dependency first.
363
- - `/cohorte-ship` one at a time: it commits from the feature's branch and the freshness gate keeps a stale
364
- verdict from shipping; after each merge, rebase the other live worktrees (`git rebase main`) so
365
- their eventual reviews diff against reality.
366
- - `/cohorte-doctor` check 6 shows the live slot table (feature ↔ worktree ↔ ports) when you lose track.
367
-
368
- ### Workflows — deterministic multi-agent runs (opt-in)
369
-
370
- Four **workflow scripts** ship for the Claude Code Workflow runtime — the same fan-out the
371
- commands orchestrate, but driven by a deterministic script instead of the lead reasoning it out
372
- turn by turn. Three are opt-in variants of their same-named commands; the fourth, `loop.js`,
373
- exists **only** as a workflow:
374
-
375
- | Script | What it runs |
376
- | ----------------------- | ----------------------------------------------------------------------------------------- |
377
- | `workflows/review.js` | Preflight gate (aborts while red — zero agents), one reviewer per touched surface, adversarial cross-check of CRITICAL/security findings, merged verdict only. |
378
- | `workflows/audit.js` | One auditor per domain (every surface + shared) concurrently, prioritized `specs/refactor-backlog.md`. |
379
- | `workflows/refactor.js` | Big domains only: `shared` first and alone, then parallel surface implementers, per-domain verify + one retry. |
380
- | `workflows/loop.js` | `/cohorte-loop` — build → review → [fix → review]* for one feature, unattended and resumable; exits on zero blocking findings, treading water, maxRounds, or anything that needs a human (contract change, unreviewed surface). No conversational fallback, on purpose. |
381
-
382
- The essentials:
383
-
384
- - **The conversational commands stay the default path** — and the fallback when workflows are
385
- disabled or the client is too old. A workflow runs only when you explicitly ask for it
386
- ("run the review workflow").
387
- - **Prerequisite: Claude Code ≥ 2.1.154** with workflows enabled. `/cohorte-doctor` (check 8) tells you
388
- which path your session will take and why.
389
- - **No input mid-run — questions at the edges.** A workflow runs to completion without asking
390
- anything: whatever would have been a mid-run question lands in the result at the end. The
391
- destructive-command gate still fires inside workflow subagents; in unattended runs its confirms
392
- become denies.
393
- - Phase 0 of every script is the `profile-reader` agent (haiku) — it reads `PIPELINE.md` and hands
394
- the script the profile as JSON, since workflow scripts have no filesystem access. Mechanical
395
- phases run on haiku; judgment phases use the same pinned agents as the commands.
396
-
397
- Details: `profile/SCHEMA.md` §Workflows.
102
+ La suite complète locale est `pnpm ci:local`. La CI vérifie lint, types, unités, intégration, schémas, migrations, packaging, sécurité, crash recovery, dogfood, acceptance et compatibilité Pi. Consultez [`docs/guide/maintainers.md`](docs/guide/maintainers.md) et [`docs/v3/workspace.md`](docs/v3/workspace.md) pour l'architecture et les procédures de release.
398
103
 
399
- ## Privacy
400
-
401
- Cohorte sends nothing, anywhere. There is no telemetry, no usage pings, no collector — the
402
- opt-in stats that shipped through 2.2.0 were removed in 2.3.0, sender included. Everything the
403
- pipeline records (`pipeline-metrics.jsonl`, `specs/reports/`) stays in your repo, and the only
404
- network calls are the ones you can see: `git`, `gh`, and whatever MCP providers you wired
405
- yourself.
406
-
407
- ## License
408
-
409
- [AGPL-3.0](LICENSE). Free to use, including commercially — but if you modify it and distribute it
410
- or offer it as a network service, you must publish your modifications under the same license.
411
-
412
- ## Profile reference
413
-
414
- See `profile/SCHEMA.md` for every field in `PIPELINE.md` and how the pipeline uses it.
415
-
416
- ## Layout of this repo
417
-
418
- ```
419
- package.json # npm package (cohorte) — semver source of truth
420
- bin/cli.js # the npm CLI: install / update / specs / doctor / metrics / version (cross-platform, no deps)
421
- bin/report.js # the four renderings of `specs` / `doctor` (human, porcelain, json, panel)
422
- lib/ # shared readers behind those verbs — doctor.js (the JS port of
423
- # /cohorte-doctor) + runtime.js / versions.js / yaml.js. No deps.
424
- install.sh # script installer (fresh + --update) for npm-less setups — still needs Node
425
- install.ps1 # same installer for Windows PowerShell (fresh + -Update)
426
- core/ # copied verbatim into ~/.claude (global) or <project>/.claude (bundled)
427
- agents/ # implementer.template.md (rendered per surface) + review / release / profile-reader
428
- commands/ # init-pipeline + the pipeline commands + /cohorte-update-pipeline
429
- hooks/ # gate.py (destructive-command gate; branch-aware; preflight phase gate)
430
- templates/ # handoff / brainstorm-return / design-brief / review-feedback / pr-body / spec
431
- workflows/ # Workflow-runtime scripts: review.js / audit.js / refactor.js (opt-in variants) + loop.js (workflow-only)
432
- profile/
433
- PIPELINE.template.md # the profile skeleton /cohorte-init-pipeline fills
434
- SCHEMA.md # field reference
435
- cohorte.config.template.yaml # seeds ~/.claude/cohorte.config.yaml (kanban)
436
- scripts/ # worktree-isolation templates + the shipped preflight/kanban scripts
437
- ```
104
+ Licence AGPL-3.0.
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "manifestVersion": 1,
3
- "cohorteVersion": "3.0.0-dev.6",
3
+ "cohorteVersion": "3.0.0-dev.8",
4
4
  "algorithm": "sha256",
5
- "treeSha256": "8bfd45e8ceecc415af5a42381e8a066ab95e437600b9f4574f5231b81d9c4c18",
5
+ "treeSha256": "6c53a3c70941285ec350b879b77d54ebe2f7f50c869c6a9544d615efab4872b0",
6
6
  "files": [
7
7
  {
8
8
  "path": "migrations/config/README.md",
@@ -19,6 +19,11 @@
19
19
  "size": 743,
20
20
  "sha256": "f1cd0d36eb65f1a3fdfd86d4b4fbef94d01cb1c64c9b69777d3e3efe5fb0d8bf"
21
21
  },
22
+ {
23
+ "path": "prompts/agents/brainstormer.md",
24
+ "size": 283,
25
+ "sha256": "ce64dd294bf9d4e7c7109d33e8038550d9a0d01838c0ec42faf405714e947d49"
26
+ },
22
27
  {
23
28
  "path": "prompts/agents/fixer.md",
24
29
  "size": 437,
@@ -39,6 +44,11 @@
39
44
  "size": 376,
40
45
  "sha256": "081771595c2fcb4a7dfe61c484849efa30f39e33cb3ebe28120a0dc0d552562c"
41
46
  },
47
+ {
48
+ "path": "prompts/agents/spec-author.md",
49
+ "size": 293,
50
+ "sha256": "2c6b6a7bfffa444c59effec128e0d811b3abeecf9a870cd78e56ed60d4dcc628"
51
+ },
42
52
  {
43
53
  "path": "prompts/phases/build.md",
44
54
  "size": 286,
@@ -76,8 +86,8 @@
76
86
  },
77
87
  {
78
88
  "path": "schemas/commands.schema.json",
79
- "size": 23292,
80
- "sha256": "7e573865f4b201d22cea48327881d46e01fd5d7520374acbd3bd957b836706fd"
89
+ "size": 23504,
90
+ "sha256": "b03842d708295ebd1b29ea06da42c3813a1715fd6573b4b64db9dca2b4908f3a"
81
91
  },
82
92
  {
83
93
  "path": "schemas/config.schema.json",
@@ -0,0 +1,3 @@
1
+ # Brainstormer
2
+
3
+ Challenge the idea before implementation. Return a structured brief with the problem, users, desired outcome, non-goals, risks, open questions, acceptance hypotheses, and affected surfaces. Do not edit the repository. Use only evidence available in the task context.
@@ -0,0 +1,3 @@
1
+ # Spec author
2
+
3
+ Turn the reviewed brief into a precise, testable specification. State the observable behavior, contracts, data and security implications, affected surfaces, acceptance criteria, and explicit non-goals. Do not implement code. Do not silently resolve open questions; record them.
@@ -134,6 +134,13 @@
134
134
  }
135
135
  ]
136
136
  },
137
+ "surfaces": {
138
+ "type": "array",
139
+ "items": {
140
+ "type": "string",
141
+ "pattern": "^[A-Za-z0-9_][A-Za-z0-9_.-]{0,127}$"
142
+ }
143
+ },
137
144
  "reviewTarget": {
138
145
  "anyOf": [
139
146
  {