@bridge_gpt/mcp-server 0.2.42 → 0.2.43

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -13,21 +13,27 @@ npx -y @bridge_gpt/mcp-server install
13
13
  That is the whole setup command. It works whether or not you already have a Bridge
14
14
  account — it will ask.
15
15
 
16
- > **npm shows a different command in its sidebar. Ignore it.** The
17
- > `npm i @bridge_gpt/mcp-server` box on this page is generated by npm from the
18
- > package name; it is not the setup command, and no packaging option lets the
19
- > publisher change or remove it. Installing the package that way does not connect
20
- > anything. Use the command above.
16
+ > We recommend **the command above** instead of the `npm i @bridge_gpt/mcp-server`
17
+ > one in npm's sidebar, because it **will make set up much easier**.
21
18
 
22
- **What it changes in your project**
19
+ **What it will do**
23
20
 
24
- - Adds slash commands and agent definitions for your editor (`.claude/commands/`,
25
- `.cursor/commands/`, and the equivalents your editor uses).
21
+ - **Bootstraps the Bridge MCP for you** one command and your editor's agent can
22
+ use Bridge's tools and slash commands on this project.
26
23
  - Registers a `bridge` MCP server in your editor's MCP config, leaving any
27
24
  other servers you have configured untouched.
28
- - Creates `.bridge/` for your project manifest and pipeline definitions.
29
- - Writes nothing outside your project root except your Bridge credential, which is
30
- stored for you so you never have to paste it again.
25
+ - Creates and updates the files it needs inside your project root: slash commands
26
+ and agent definitions for your editor (`.claude/commands/`, `.cursor/commands/`,
27
+ and the equivalents your editor uses), your editor's MCP config, and `.bridge/`
28
+ for your project manifest and pipeline definitions.
29
+ - Stores your Bridge credential outside the project, so the MCP server and the
30
+ tooling that spawns its own shells can find it without you configuring anything.
31
+ Re-running `install` still asks for the credential unless you supply it through
32
+ `--api-key` or `BAPI_API_KEY` — the installer writes that store, it does not read
33
+ it back.
34
+ - Writes outside your project root only when you pick a host whose configuration is
35
+ global: OpenAI Codex (`~/.codex/config.toml`) and GitHub Copilot CLI
36
+ (`~/.copilot/mcp-config.json`).
31
37
 
32
38
  **Prerequisites**
33
39
 
@@ -35,18 +41,18 @@ account — it will ask.
35
41
  - **A project directory** — run the command from the folder your editor opens: your
36
42
  repository root, the one containing `.git`. No `package.json` is required — SFCC
37
43
  cartridge repos, Python, Go, Rust, and other non-Node projects work the same way.
38
- - **An MCP-capable editor**: Claude Code, GitHub Copilot, Cursor, Windsurf, or
39
- OpenAI Codex.
44
+ - **An MCP-capable editor or CLI**: Claude Code, GitHub Copilot in VS Code, GitHub
45
+ Copilot CLI, Cursor, Windsurf, or OpenAI Codex.
40
46
  - **No Bridge account needed.** The installer can create one for you from just an
41
47
  email address.
42
48
 
43
49
  ## Contents
44
50
 
45
51
  - [Install](#install)
46
- - [Installing, step by step](#installing-step-by-step)
47
- - [What to expect](#what-to-expect)
48
- - [Troubleshooting](#troubleshooting)
49
- - [Quick start details](#quick-start-details)
52
+ - [Installation details](#installation-details)
53
+ - [Installing, step by step](#installing-step-by-step)
54
+ - [What to expect](#what-to-expect)
55
+ - [Troubleshooting](#troubleshooting)
50
56
  - [Usage Documentation](#usage-documentation)
51
57
  - [Regularly useful](#regularly-useful)
52
58
  - [Occasionally useful](#occasionally-useful)
@@ -63,7 +69,9 @@ account — it will ask.
63
69
 
64
70
  For advanced epic/multi-agent orchestration, see [CONDUCTOR.md](./docs/CONDUCTOR.md).
65
71
 
66
- ## Installing, step by step
72
+ ## Installation details
73
+
74
+ ### Installing, step by step
67
75
 
68
76
  **1. Open a terminal in your project root.** This matters: the installer writes
69
77
  your slash commands and MCP config relative to the directory you run it from. If
@@ -91,7 +99,7 @@ a token:
91
99
 
92
100
  There is no default answer, so pressing Enter alone selects nothing. If you would
93
101
  rather not be asked, pass the answer up front instead — see
94
- [Choosing how you sign in](#quick-start-details).
102
+ [Choosing how you sign in](#choosing-how-you-sign-in).
95
103
 
96
104
  **4. Pick which editors to configure.** The installer detects the MCP hosts on your
97
105
  machine and asks which ones to set up. Pick every editor you actually use for this
@@ -102,10 +110,19 @@ freshly written config is not live until you reload. Restart the editor, or use
102
110
  "reload MCP servers" action. In Claude Code you will also be asked to trust the
103
111
  project's `.mcp.json` the first time.
104
112
 
105
- **6. Finish in the agent session the installer opens.** The last thing the
106
- installer does is open a fresh agent session running `/install-bridge`, which reads
107
- your codebase, fills in the remaining project settings, and prints a short report
108
- of what Bridge can help with. Let it finish.
113
+ **6. Finish in the agent session the installer opens when it opens one.** The
114
+ last thing the installer does is offer to open a fresh agent session running
115
+ `/install-bridge`, which reads your codebase, fills in the remaining project
116
+ settings, and prints a short report of what Bridge can help with. Let it finish.
117
+
118
+ Three things all have to hold for that session to open: your selection has to
119
+ include a host the installer can launch, the run has to be on an interactive
120
+ terminal, and you have to accept the consent prompt (*"Bridge can configure and set
121
+ up this project for you automatically. Open a `<tool>` session to do that now?
122
+ (Y/n)"*). Claude Code is the only selection that launches on its own. A
123
+ Cursor-only, Copilot, Copilot CLI, Codex, or Windsurf selection, a non-interactive
124
+ run, or a declined prompt all print the command to continue by hand instead. Pass
125
+ `--agent claude` or `--agent cursor-agent` to override the decision outright.
109
126
 
110
127
  **7. Follow the next step the session shows you, if it shows one.** The installer
111
128
  asks the server what should happen next and shows that command only when there is
@@ -119,7 +136,8 @@ there is nothing for you to run.
119
136
 
120
137
  Want to see what would happen without changing anything? Add `--dry-run`.
121
138
 
122
- ## What to expect
139
+ <details>
140
+ <summary id="what-to-expect"><strong>What to expect</strong></summary>
123
141
 
124
142
  **Files that appear in your project**
125
143
 
@@ -134,16 +152,35 @@ Want to see what would happen without changing anything? Add `--dry-run`.
134
152
  The installer tells you which of these are safe to commit and never recommends
135
153
  committing anything that can hold a credential.
136
154
 
137
- **Prompts you will see.** A sign-in question on a first bare run, a hidden prompt
138
- for a token (or a visible one for an email), a project name for a brand-new
139
- project, and a picker for which editors to configure. Nothing else prompts.
140
-
141
- **A fresh agent session opens at the end.** This is expected it is how the
142
- installer finishes configuring the project. Use `--agent cursor-agent` if you want
155
+ **Prompts you will see.** More than the sign-in question, in three groups:
156
+
157
+ - *Always on a first bare interactive run:* the sign-in question, a hidden prompt
158
+ for a token (or a visible one for an email), a project name for a brand-new
159
+ project, a picker for which editors to configure, and an offer to connect GitHub
160
+ (`Connect GitHub? [y/N]:`).
161
+ - *Conditional on your situation:* a confirmation when the directory has no `.git`
162
+ (default **No**, and declining aborts); a *"Which tool should open? [1-N]"*
163
+ chooser when your selection contains more than one launchable tool; and the
164
+ consent prompt before the final agent session.
165
+ - *Overwrite confirmations, each default **No** and each skippable with `--force`:*
166
+ a saved key for this project already exists; a host config already contains a
167
+ `BAPI_API_KEY`; a **git-tracked** config would receive your real key; a saved but
168
+ expired self-serve signup would be discarded.
169
+
170
+ **A fresh agent session opens at the end — if your selection can launch one.** See
171
+ step 6 above for the three conditions. Use `--agent cursor-agent` if you want
143
172
  Cursor's agent instead of Claude Code.
144
173
 
145
- **Your key is remembered.** You paste a credential at most once. Later runs, and
146
- the tooling that spawns its own shells, find it on their own.
174
+ **Selecting Windsurf prints instructions instead of writing config.** Windsurf's
175
+ global `mcp_config.json` is never modified automatically; the installer reports the
176
+ entry for you to paste yourself. Codex and Copilot CLI *are* written automatically,
177
+ even though their files are global too.
178
+
179
+ **Your key is stored for the tools that read the store.** The MCP server and the
180
+ shell-spawned tooling (`start-tickets` and its model routing) resolve it from
181
+ `~/.config/bridge/credentials.json` on their own. The **installer** does not: a
182
+ repeat `install` prompts for the credential again unless you pass `--api-key` or
183
+ set `BAPI_API_KEY` in the environment.
147
184
 
148
185
  **A next step, when the project needs one.** The session closes with whatever
149
186
  command the server says comes next, and stays quiet when there is nothing to
@@ -156,7 +193,10 @@ than from your project's documented conventions.
156
193
  your project has the settings it needs, indexing starts server-side. You never have
157
194
  to ask for it.
158
195
 
159
- ## Troubleshooting
196
+ </details>
197
+
198
+ <details>
199
+ <summary id="troubleshooting"><strong>Troubleshooting</strong></summary>
160
200
 
161
201
  **"My editor doesn't see any Bridge tools."** Two usual causes. First, the config
162
202
  was written somewhere your editor is not looking — re-run the installer from the
@@ -165,9 +205,12 @@ that project's MCP config. Second, the editor has not been reloaded since the fi
165
205
  was written; restart it. In Claude Code, also confirm you accepted the trust prompt
166
206
  for the project's `.mcp.json`.
167
207
 
168
- **"I ran it in the wrong folder."** Nothing is broken. Delete the `.bridge/`,
169
- `.claude/`, and `.mcp.json` entries that were created there and re-run the command
170
- from the right directory.
208
+ **"I ran it in the wrong folder."** Nothing is broken. Depending on which editors
209
+ were detected, a run can leave `.bridge/`, `.bridge/install-state.json`, `.claude/`,
210
+ `.cursor/commands/`, `.cursor/mcp.json`, `.vscode/mcp.json`, `.github/agents/`,
211
+ `.mcp.json`, and appended `.gitignore` lines. Remove only what that run created and
212
+ re-run the command from the right directory — if you already had a `.vscode/`,
213
+ `.cursor/`, or `.gitignore` there, keep the parts you had before.
171
214
 
172
215
  **"It seems to hang with no output."** If you ran the bare command
173
216
  (`npx -y @bridge_gpt/mcp-server`) with no subcommand, you started the MCP *server*,
@@ -178,7 +221,11 @@ looks like a hang. It prints a line saying so. Press Ctrl-C and run
178
221
  `npx -y @bridge_gpt/mcp-server serve` starts the server on purpose.
179
222
 
180
223
  **"It can't reach Bridge" or "my key was rejected."** The installer checks
181
- connectivity before it saves anything, so a failure here has changed nothing. A
224
+ connectivity before it saves your **credential** anywhere, so a failure here has not
225
+ written your key into a config or stored it for later. It has already
226
+ scaffolded the project files by then — slash commands, agents, pipelines,
227
+ `.bridge/config`, and secret-free per-host MCP placeholders — so expect those to
228
+ exist; re-running is safe and refreshes them. A
182
229
  rejected key means the credential is not valid for that project — check the project
183
230
  name you gave, and generate a fresh key on the Bridge web UI's **Security** page if
184
231
  needed. A network failure usually means a proxy or VPN is in the way.
@@ -196,10 +243,10 @@ npx -y @bridge_gpt/mcp-server doctor
196
243
  `doctor` is strictly read-only. It reports what it found — configs, registrations,
197
244
  credential availability, prerequisites — and changes nothing.
198
245
 
199
- ## Quick start details
246
+ </details>
200
247
 
201
248
  <details>
202
- <summary><strong>Choosing how you sign in</strong></summary>
249
+ <summary id="choosing-how-you-sign-in"><strong>Choosing how you sign in</strong></summary>
203
250
 
204
251
  Three routes lead to the same place. The interactive question above picks one for
205
252
  you; these flags pick it up front and skip the question entirely.
@@ -253,8 +300,8 @@ created or spent.
253
300
  | `--invite [code]` | Redeem an invite code. Omit the value for the hidden prompt (recommended) |
254
301
  | `--api-key <key>` | Use an existing Bridge API key |
255
302
  | `--repo <name>` | Name the registered repository instead of resolving or asking for it |
256
- | `--tools <list>` | Configure specific MCP hosts without the picker (e.g. `claude-code,cursor`) |
257
- | `--agent claude\|cursor-agent` | Which agent to open for the final configuration step (default `claude`) |
303
+ | `--tools <list>` | Configure specific MCP hosts without the picker. Accepted IDs are exactly `claude-code`, `cursor`, `copilot-vscode`, `copilot-cli`, `codex`, and `windsurf` (e.g. `claude-code,cursor`); any other value is a parse error |
304
+ | `--agent claude\|cursor-agent` | Which agent to open for the final configuration step. **No default** without this flag the agent is derived from the hosts you selected, and an explicit value always wins, including for a host you did not select |
258
305
  | `--dry-run` | Preview every step without writing, contacting Bridge, resolving or prompting for a credential, or opening anything. Genuinely inert: it returns before the project-root prompt, before the repository is resolved, and before any tool-selection prompt, so a value it cannot know locally (an unresolved repository name, an unselected tool) is shown as **not yet known** rather than guessed |
259
306
  | `--force` | Overwrite an existing stored key without asking |
260
307
  | `-h`, `--help` | Full usage |
@@ -270,17 +317,31 @@ different way to arrive, and the installer will not guess between them.
270
317
  The installer configures your editors for you. Do this only if you would rather
271
318
  write the config yourself, or if you use a host it cannot write automatically.
272
319
 
273
- Scaffold the project files without configuring anything. Run it from the same
274
- project root `install` uses — your repository root, the one containing `.git`.
275
- No `package.json` is required:
320
+ Scaffold the project files and write a secret-free MCP registration. Run it from
321
+ the same project root `install` uses — your repository root, the one containing
322
+ `.git`. No `package.json` is required:
276
323
 
277
324
  ```bash
278
325
  npx -y @bridge_gpt/mcp-server --init
279
326
  ```
280
327
 
281
- Then add a `bridge` entry to your host's MCP config, filling in your repository
282
- name and API key. Add `"serve"` as the last launcher argument, as shown it is the
283
- explicit way to say "start the MCP server."
328
+ `--init` always creates `.mcp.json`, and adds `.vscode/mcp.json` or
329
+ `.cursor/mcp.json` when it detects those editors. Each generated entry carries
330
+ `BAPI_BASE_URL`, `BAPI_REPO_NAME`, `BAPI_DOCS_DIR`, and `BAPI_PROJECT_ROOT`, and
331
+ **never** `BAPI_API_KEY` — the server resolves the credential itself at runtime.
332
+
333
+ So the manual work left after `--init` is narrower than writing an entry from
334
+ scratch: correct `BAPI_REPO_NAME` if it was written as the `YOUR_REPO_NAME`
335
+ placeholder, and supply your credential through a supported source (`BAPI_API_KEY`
336
+ in the entry's `env` block, `BAPI_API_KEY` in the server's environment, or the
337
+ `~/.config/bridge/credentials.json` store).
338
+
339
+ Write the entry yourself instead — for a host `--init` does not touch, or because
340
+ you would rather — using the shapes below. Add `"serve"` as the last launcher
341
+ argument, as shown: it is the explicit way to say "start the MCP server." Pin the
342
+ package to an exact version and pass `--prefer-offline`, which is what the
343
+ generated entries do and what keeps npx from resolving a different build on some
344
+ later boot.
284
345
 
285
346
  <details>
286
347
  <summary><strong>Claude Code (.mcp.json)</strong></summary>
@@ -290,7 +351,7 @@ explicit way to say "start the MCP server."
290
351
  "mcpServers": {
291
352
  "bridge": {
292
353
  "command": "npx",
293
- "args": ["-y", "@bridge_gpt/mcp-server", "serve"],
354
+ "args": ["-y", "--prefer-offline", "@bridge_gpt/mcp-server@0.2.42", "serve"],
294
355
  "env": {
295
356
  "BAPI_BASE_URL": "https://bridgegpt-api.com",
296
357
  "BAPI_REPO_NAME": "your-repo",
@@ -310,8 +371,9 @@ explicit way to say "start the MCP server."
310
371
  {
311
372
  "servers": {
312
373
  "bridge": {
374
+ "type": "stdio",
313
375
  "command": "npx",
314
- "args": ["-y", "@bridge_gpt/mcp-server", "serve"],
376
+ "args": ["-y", "--prefer-offline", "@bridge_gpt/mcp-server@0.2.42", "serve"],
315
377
  "env": {
316
378
  "BAPI_BASE_URL": "https://bridgegpt-api.com",
317
379
  "BAPI_REPO_NAME": "your-repo",
@@ -331,8 +393,9 @@ explicit way to say "start the MCP server."
331
393
  {
332
394
  "mcpServers": {
333
395
  "bridge": {
396
+ "type": "stdio",
334
397
  "command": "npx",
335
- "args": ["-y", "@bridge_gpt/mcp-server", "serve"],
398
+ "args": ["-y", "--prefer-offline", "@bridge_gpt/mcp-server@0.2.42", "serve"],
336
399
  "env": {
337
400
  "BAPI_BASE_URL": "https://bridgegpt-api.com",
338
401
  "BAPI_REPO_NAME": "your-repo",
@@ -343,8 +406,32 @@ explicit way to say "start the MCP server."
343
406
  }
344
407
  }
345
408
  ```
409
+ </details>
346
410
 
347
- > If project-local config is not supported in your Cursor version, use `~/.cursor/config/mcp.json` instead.
411
+ <details>
412
+ <summary><strong>GitHub Copilot CLI (~/.copilot/mcp-config.json)</strong></summary>
413
+
414
+ Copilot CLI reads a single global file. The installer writes this one for you when
415
+ you select `copilot-cli`; the shape below is what it produces.
416
+
417
+ ```json
418
+ {
419
+ "mcpServers": {
420
+ "bridge": {
421
+ "type": "local",
422
+ "command": "npx",
423
+ "args": ["-y", "--prefer-offline", "@bridge_gpt/mcp-server@0.2.42", "serve"],
424
+ "tools": ["*"],
425
+ "env": {
426
+ "BAPI_BASE_URL": "https://bridgegpt-api.com",
427
+ "BAPI_REPO_NAME": "your-repo",
428
+ "BAPI_API_KEY": "your-api-key",
429
+ "BAPI_DOCS_DIR": "docs/tmp"
430
+ }
431
+ }
432
+ }
433
+ }
434
+ ```
348
435
  </details>
349
436
 
350
437
  <details>
@@ -357,7 +444,7 @@ Windsurf only supports global MCP configuration.
357
444
  "mcpServers": {
358
445
  "bridge": {
359
446
  "command": "npx",
360
- "args": ["-y", "@bridge_gpt/mcp-server", "serve"],
447
+ "args": ["-y", "--prefer-offline", "@bridge_gpt/mcp-server@0.2.42", "serve"],
361
448
  "env": {
362
449
  "BAPI_BASE_URL": "https://bridgegpt-api.com",
363
450
  "BAPI_REPO_NAME": "your-repo",
@@ -376,7 +463,7 @@ Windsurf only supports global MCP configuration.
376
463
  ```toml
377
464
  [mcp_servers.bridge]
378
465
  command = "npx"
379
- args = ["-y", "@bridge_gpt/mcp-server", "serve"]
466
+ args = ["-y", "--prefer-offline", "@bridge_gpt/mcp-server@0.2.42", "serve"]
380
467
 
381
468
  [mcp_servers.bridge.env]
382
469
  BAPI_BASE_URL = "https://bridgegpt-api.com"
@@ -426,9 +513,19 @@ Launcher pins:
426
513
  When every applicable launcher pin was already at the target, it prints
427
514
  `Already up-to-date.` — that status comes from comparing your configs, not from
428
515
  the version of the CLI process. A non-zero exit means the upgrade did **not**
429
- converge (an unreadable config, a launcher carrying a version range the upgrader
430
- must not rewrite, a competing local install it could not remove, or a pin that
431
- failed post-write verification); nothing is reported as complete in that case.
516
+ converge, and nothing is reported as complete in that case. The causes:
517
+
518
+ - the npm registry lookup failed **and** this process was not started from
519
+ `@latest`, so the target version could not be confirmed — the likeliest one
520
+ offline, and why the canonical command uses `@latest`;
521
+ - a launcher pin is already **newer** than the target, which an automated repin
522
+ must never downgrade;
523
+ - an unreadable or unparseable config, a launcher carrying a version range or a
524
+ dist-tag rather than an exact release, or two Bridge registrations in one file;
525
+ - a competing local install it could not remove, or a pin that failed post-write
526
+ verification;
527
+ - the upgrade finished but left an **unconfigured** MCP entry — one that would
528
+ authenticate as nobody.
432
529
 
433
530
  The server checks for updates on startup. The check is cached for a day and never
434
531
  blocks startup. When a newer version is known, it surfaces in two places you do
@@ -447,14 +544,18 @@ scaffolded files without overwriting your stored credential unless you pass
447
544
 
448
545
  This is the Bridge API tooling worth knowing about as a software engineer — the things you'd ask an agent to do — grouped by how often you would use them. Each entry covers **what it does**, **when it's useful**, **how to use it**, and its **flags**. The behind-the-scenes plumbing is summarized at the end under [Extra Capabilities](#extra-capabilities), and a full enumeration lives in [Reference](#reference).
449
546
 
450
- Working in a Salesforce B2C Commerce codebase? Bridge also ships read-only SFCC platform-introspection tools see [Salesforce B2C Commerce (SFCC) Tools](#salesforce-b2c-commerce-sfcc-tools).
547
+ Working in a Salesforce B2C Commerce codebase? Bridge also ships SFCC platform tools — read-only introspection under the `sfcc` profile, and nine destructive writes under the separate `sfcc-write` opt-in. See [Salesforce B2C Commerce (SFCC) Tools](#salesforce-b2c-commerce-sfcc-tools).
451
548
 
452
549
  For invocation, prefer the slash command — it's deterministic. A free-text example is shown only where natural-language phrasing reliably maps to the right automation; high-consequence or easily-misread automations show only the slash command on purpose.
453
550
 
454
- <!-- The three tier sections below are GENERATED from api/library/config/mcp_tool_catalog.json,
455
- the authoritative tool catalog, by scripts/sync_mcp_server_readme.py. Edit the curated
456
- metadata in scripts/sync_mcp_tool_catalog.py never the JSON artifact and never the
457
- text between the markers. Generation order is: sync_mcp_tool_catalog.py, then
551
+ <!-- The three tier sections below are GENERATED from TWO catalogs by
552
+ scripts/sync_mcp_server_readme.py: api/library/config/mcp_tool_catalog.json,
553
+ the authoritative MCP tool catalog, and api/library/config/workflow_catalog_lib.py,
554
+ the immutable catalog of slash-command workflows (which have no MCP registration
555
+ and therefore cannot live in the JSON artifact). Edit the curated tool metadata in
556
+ scripts/sync_mcp_tool_catalog.py and the workflow definitions in
557
+ workflow_catalog_lib.py — never the JSON artifact and never the text between the
558
+ markers. Generation order is: sync_mcp_tool_catalog.py, then
458
559
  sync_mcp_server_readme.py, then `cd mcp_server && npm run build` (which bundles this
459
560
  file into readme.generated.ts, served as the MCP resource bridge://readme).
460
561
  Everything outside the marker pair — including the sections below it — is hand-written. -->
@@ -470,125 +571,95 @@ The tools worth knowing for most tickets.
470
571
  - **How to use it:** `/review-ticket BAPI-123` (command only — "review" as free text is easily mistaken for a freehand agent review). For several tickets at once, `/review-tickets BAPI-123 BAPI-456` opens one terminal tab per ticket and reviews them in parallel with no worktrees; every `/review-ticket` flag applies, and `--review KEY=auto,rounds=N` sets per-ticket overrides.
471
572
  - **Flags:** `--auto` auto-accept findings and skip the approval gates · `--rounds=1` a cheaper single-pass review that still evaluates findings and captures decisions · `--rounds=2` force the full second-opinion review · omit `--rounds` to let the difficulty-adaptive review policy decide.
472
573
 
473
- **2. Council**
474
- - **What it does:** Fans your problem out to two different models and returns their approaches, in technical, design, discovery, or general mode.
475
- - **When it's useful:** (Architecture | Refinement) Early, when you want a spread of approaches — technical for how to build it, design for how it should look, discovery for what still needs figuring out before a real ticket exists, general for a quick brief-driven pass before the repository is indexed.
476
- - **How to use it:** Ask your agent to convene a council — "Convene a council on approaches for adding rate limiting to the LLM client." For a design pass: "Run a design council for the evidence-freshness dashboard UI." For early discovery: "Run a discovery council — `request_council` with `mode: "discovery"` — so we can collect the questions stakeholders need to answer first."
477
- - **Flags:** `mode` selects one of four modes: `technical` (the default implementation/architecture approaches), `design` (UI/UX and visual direction), `discovery` (stakeholder discovery questions, grouped into `Technical Discovery Questions` and `Business / Stakeholder Discovery Questions` and tagged `[HUMAN]`/`[CODE]`/`[TICKET]`), and `general` (brief-driven ideation from your task description alone). `technical` and `discovery` are codebase-grounded and need an indexed repository; `general` needs no code index at all, so it works immediately after install. The legacy boolean `design=true` still works and maps to `mode: "design"`.
574
+ **2. Start Tickets**
575
+ - **What it does:** Creates one git worktree per ticket and spawns an agent session in each to implement them in parallel.
576
+ - **When it's useful:** (Implementation | Automation) When you're ready to start building one or more refined tickets concurrently.
577
+ - **How to use it:** `/start-tickets BAPI-248 BAPI-250` (see [CLI Subcommands](#cli-subcommands) for the full flag table and cross-platform behavior).
578
+ - **Flags:** `--auto` skip the approval gates · `--base-branch <branch>` branch off something other than the default · `--workflow implement|review-and-implement` selects which slash command each spawned worktree runs · `--rounds=1|2` forwarded to the review phase, valid only with `--workflow review-and-implement` · `--tier cheap|basic|premium` coarse model-routing override.
478
579
 
479
- **3. Get Council**
480
- - **What it does:** Retrieves a council that was already generated for a ticket.
481
- - **When it's useful:** (Architecture | Refinement) When a council was already run and you want to reread it without paying to regenerate it.
482
- - **How to use it:** Ask your agent to pull up the council already generated for the ticket.
580
+ **3. Review and Start**
581
+ - **What it does:** Spawns one worktree per ticket; each session reviews the ticket inline and, after a per-ticket proceed/halt gate, hands off to a **fresh implementation session** that reuses the same worktree — review and implementation run in two separate agent contexts, not one shared session.
582
+ - **When it's useful:** (Refinement | Implementation | Automation) The **recommended front door** for "review these tickets, then implement the ones that pass," starting from existing ticket keys (unlike `/full-automation`, which only accepts an idea).
583
+ - **How to use it:** `/review-and-start BAPI-248 BAPI-250` (single or multiple keys flow through the identical code path).
584
+ - **Flags:** `--auto` auto-approves both the review and the implementation phase of every spawned session · `--rounds=1|2` forwarded to the review phase · `--agent`, `--base-branch`, `--max-parallel`, `--dry-run` mirror `/start-tickets`.
585
+
586
+ **4. Explore Ticket**
587
+ - **What it does:** Maps the code paths, dependencies, and project conventions a task would touch, settles its acceptance criteria with you on a decision page, then compares the viable implementation approaches and their trade-offs and writes up a proposed design. Along the way it surfaces the ambiguities that still need deciding and can pull in optional web or deep research where the answer is not in the code.
588
+ - **When it's useful:** (Architecture | Refinement) Before writing a ticket or a plan, when you're unsure how a change would fit the existing code and want the open questions and the realistic options laid out first.
589
+ - **How to use it:** `/explore-ticket <task>` — *"Explore the codebase for how we'd add a Mistral LLM provider and recommend 2–3 implementation options."*
483
590
  - **Flags:** None.
484
591
 
485
- **4. Deep Research**
592
+ **5. Council**
593
+ - **What it does:** Fans your problem out to two different models and returns their approaches, in technical, design, discovery, or general mode.
594
+ - **When it's useful:** (Architecture | Refinement) Early, when you want a spread of approaches — technical for how to build it, design for how it should look, discovery for what still needs figuring out before a real ticket exists, general for a quick brief-driven pass before the repository is indexed.
595
+ - **How to use it:** `/council <question>`
596
+ - **Flags:** `--mode` selects one of four modes, passed to the underlying `request_council` tool as e.g. `mode: "discovery"`: `technical` (the default — implementation/architecture approaches), `design` (UI/UX and visual direction), `discovery` (stakeholder discovery questions, grouped into `Technical Discovery Questions` and `Business / Stakeholder Discovery Questions` and tagged `[HUMAN]`/`[CODE]`/`[TICKET]`), and `general` (brief-driven ideation from your task description alone). `technical` and `discovery` are codebase-grounded and need an indexed repository; `general` needs no code index at all, so it works immediately after install. The legacy boolean `design=true` still works and maps to `mode: "design"`.
597
+
598
+ **6. Deep Research**
486
599
  - **What it does:** Runs multi-source, fact-checked web research on a technical topic and returns a cited report.
487
600
  - **When it's useful:** (Architecture | Refinement) When a decision hinges on outside knowledge — libraries, best practices, standards — that you do not already have.
488
601
  - **How to use it:** `/bridge-research <question>`
489
602
  - **Flags:** None.
490
603
 
491
- **5. Get Deep Research**
492
- - **What it does:** Retrieves a research report that was already generated.
493
- - **When it's useful:** (Architecture | Refinement) When the report already exists and you want to reread it without re-running the research.
494
- - **How to use it:** Ask your agent to retrieve the research report already generated.
495
- - **Flags:** None.
604
+ ### Occasionally useful
605
+
606
+ Good to know, but not needed every day.
496
607
 
497
- **6. Upload Ticket**
608
+ **1. Upload Ticket**
498
609
  - **What it does:** Creates a real Jira issue from a drafted ticket, including child tickets under an epic; your agent should confirm with you before creating it.
499
610
  - **When it's useful:** (Refinement) The final step after drafting — to get the ticket into your tracker so it can be tracked and worked.
500
611
  - **How to use it:** Ask your agent to create the ticket; it should confirm with you before creating the live issue.
501
612
  - **Flags:** Name the issue type (Bug / Story / Task / Epic) and, for a child ticket under an epic, the parent key.
502
613
 
503
- ### Occasionally useful
504
-
505
- Good to know, but not needed every day.
506
-
507
- **1. Plan Ticket**
614
+ **2. Plan Ticket**
508
615
  - **What it does:** Generates a step-by-step implementation plan for a ticket that references real files in your codebase.
509
616
  - **When it's useful:** (Refinement | Implementation) Once a ticket is solid and you want a concrete build plan before — or instead of — auto-implementing it.
510
617
  - **How to use it:** `/plan-ticket BAPI-123`
511
618
  - **Flags:** `--provider <name>` choose the model provider · `--second-opinion <provider>` cross-check the plan with a second provider.
512
619
 
513
- **2. Get Plan**
514
- - **What it does:** Retrieves an implementation plan that was already generated for a ticket.
515
- - **When it's useful:** (Implementation) When the plan already exists and you want to read it without regenerating it.
516
- - **How to use it:** Ask your agent to fetch the implementation plan already generated for the ticket.
517
- - **Flags:** None.
518
-
519
620
  **3. Clarify Ticket**
520
621
  - **What it does:** Generates clarifying questions for a ticket, or debugging guidance when the ticket is a bug.
521
622
  - **When it's useful:** (Refinement) When a ticket feels under-specified and you want the open questions made explicit.
522
623
  - **How to use it:** `/clarify-ticket BAPI-123`
523
624
  - **Flags:** `--provider <name>` choose the model provider · `--second-opinion <provider>` cross-check with a second provider.
524
625
 
525
- **4. Get Clarifying Questions**
526
- - **What it does:** Retrieves clarifying questions that were already generated for a ticket.
527
- - **When it's useful:** (Refinement) When the questions were already generated and you want to reread them rather than pay to regenerate them.
528
- - **How to use it:** Ask your agent for the clarifying questions already generated for the ticket.
529
- - **Flags:** None.
530
-
531
- **5. Critique Ticket**
626
+ **4. Critique Ticket**
532
627
  - **What it does:** Critiques a ticket against your project's standards and lists the deviations and improvements it found.
533
628
  - **When it's useful:** (Refinement) When you want a quality gate on a ticket before anyone works it.
534
629
  - **How to use it:** `/critique-ticket BAPI-123`
535
630
  - **Flags:** `--provider <name>` choose the model provider · `--second-opinion <provider>` cross-check with a second provider.
536
631
 
537
- **6. Get Ticket Critique**
538
- - **What it does:** Retrieves a ticket critique that was already generated.
539
- - **When it's useful:** (Refinement) When the critique already exists and you want to reread its findings without regenerating it.
540
- - **How to use it:** Ask your agent for the critique already generated for the ticket.
541
- - **Flags:** None.
542
-
543
- **7. Create Doc**
632
+ **5. Create Doc**
544
633
  - **What it does:** Generates a design document for a ticket — a technical design document, a functional spec, or a product requirements document.
545
634
  - **When it's useful:** (Architecture | Refinement) When a ticket needs a fuller design write-up before planning or implementation, in the shape that fits your audience.
546
635
  - **How to use it:** `/create-doc BAPI-123 --doc-type tdd` (or `fsd` / `prd`)
547
636
  - **Flags:** `--doc-type tdd|fsd|prd` which document to generate (required) · `--provider <name>` choose the model provider · `--second-opinion <provider>` cross-check with a second provider.
548
637
 
549
- **8. Get Doc**
550
- - **What it does:** Retrieves a design document that was already generated for a ticket.
551
- - **When it's useful:** (Architecture | Refinement) When the document already exists and you want to reread it without regenerating it.
552
- - **How to use it:** Ask your agent for the ticket's design document, naming which type you want.
553
- - **Flags:** None.
554
-
555
- **9. Second Opinion**
638
+ **6. Second Opinion**
556
639
  - **What it does:** Gets an immediate critique of any text from a different model family, without saving an artifact.
557
640
  - **When it's useful:** (Architecture | Refinement | Implementation) Any time you want a quick sanity check on a plan, draft, or decision from a fresh perspective.
558
641
  - **How to use it:** Ask your agent — "Get a second opinion from Gemini on whether the BAPI-123 plan's migration step is safe to run against production."
559
642
  - **Flags:** Pick the provider (anthropic / openai / gemini) and the tier (cheap / basic / premium).
560
643
 
561
- **10. Generate Image**
644
+ **7. Generate Image**
562
645
  - **What it does:** Generates an image from a text prompt using a provider image model, spending provider credits on every call.
563
646
  - **When it's useful:** (Architecture | Refinement) When you want a quick visual — a UI mockup, diagram, or illustration — to anchor a design discussion or attach to a ticket.
564
647
  - **How to use it:** Ask your agent — "Generate an image of a dashboard showing SOC2 evidence freshness as a traffic-light grid."
565
648
  - **Flags:** `provider` openai (`gpt-image-2`) / gemini (Imagen, which adds an invisible SynthID watermark) · `quality` low (default, cheapest) / medium / high · `size` 1024x1024 / 1024x1536 / 1536x1024. The image is saved to `BAPI_DOCS_DIR/images/` and also returned inline.
566
649
 
567
- **11. Request PRD**
650
+ **8. Request PRD**
568
651
  - **What it does:** Generates a product requirements document for a ticket covering the problem, the goals, and the success metrics.
569
652
  - **When it's useful:** (Architecture | Refinement) When a piece of work needs its problem, goals, and success metrics written down before anyone designs a solution.
570
653
  - **How to use it:** `/create-doc BAPI-123 --doc-type prd`
571
654
  - **Flags:** `--provider <name>` choose the model provider · `--second-opinion <provider>` cross-check with a second provider.
572
655
 
573
- **12. Get PRD**
574
- - **What it does:** Retrieves a product requirements document that was already generated for a ticket.
575
- - **When it's useful:** (Architecture | Refinement) When the requirements document already exists and you want to reread it without regenerating it.
576
- - **How to use it:** Ask your agent to retrieve the ticket's product requirements document.
577
- - **Flags:** None.
578
-
579
- **13. Full Automation**
656
+ **9. Full Automation**
580
657
  - **What it does:** Drives the whole chain from a raw idea through tickets and reviews to implementation sessions.
581
658
  - **When it's useful:** (Automation) When you want to go from a raw idea to in-progress implementation with minimal hands-on steps.
582
659
  - **How to use it:** `/full-automation <idea>` (command only — it creates tickets, spawns worktrees, and carries scheduling flags free text cannot).
583
660
  - **Flags:** `--require-approval` re-enable the approval gates; the chain runs end to end by default · `--max-children <n>` cap how many child tickets an epic decomposes into.
584
661
 
585
- **14. Resume Full Automation**
586
- - **What it does:** Resumes a full-automation chain that was started earlier.
587
- - **When it's useful:** (Automation) When an earlier chain stopped at an approval gate or was interrupted, and you want it continued rather than restarted.
588
- - **How to use it:** Ask your agent to resume the full-automation chain, naming the run to continue.
589
- - **Flags:** None.
590
-
591
- **15. Update Ticket Description**
662
+ **10. Update Ticket Description**
592
663
  - **What it does:** Rewrites a ticket's description with AI, using the ticket's own content and its reference material. A rewrite that changes more than 60% of the description is held for review instead of applied.
593
664
  - **When it's useful:** (Refinement) When a ticket has accumulated comments, attachments, or links and its description no longer reflects them.
594
665
  - **How to use it:** Ask your agent — "Update the description for BAPI-123."
@@ -604,55 +675,49 @@ Useful once in a while.
604
675
  - **How to use it:** `/reimplement-ticket BAPI-123`
605
676
  - **Flags:** None.
606
677
 
607
- **2. Get Reimplement Context**
608
- - **What it does:** Retrieves the follow-up context that was already gathered for a ticket.
609
- - **When it's useful:** (Implementation) When the follow-up context was already gathered and you want to read it without gathering it again.
610
- - **How to use it:** Ask your agent for the follow-up context already gathered for the ticket.
611
- - **Flags:** None.
612
-
613
- **3. Update Ticket**
678
+ **2. Update Ticket**
614
679
  - **What it does:** Rewrites a ticket's description, fully replacing what is there today.
615
680
  - **When it's useful:** (Refinement) After review, to fold the resolved questions and fixes back into the ticket itself.
616
681
  - **How to use it:** `/update-ticket BAPI-123` (command only — it fully overwrites the live description, which is hard to reverse).
617
682
  - **Flags:** None.
618
683
 
619
- **4. Get Ticket**
684
+ **3. Get Ticket**
620
685
  - **What it does:** Retrieves the full details of a ticket, including its summary, status, and description.
621
686
  - **When it's useful:** (Refinement | Implementation) Any time you want the agent to read a ticket before acting on it.
622
687
  - **How to use it:** Ask your agent — "Pull up BAPI-123 and show me its description, status, and acceptance criteria."
623
688
  - **Flags:** None.
624
689
 
625
- **5. Search Tickets**
690
+ **4. Search Tickets**
626
691
  - **What it does:** Searches across the tickets in your project.
627
692
  - **When it's useful:** (Refinement) When you need to find tickets by project, status, or wording rather than by key.
628
693
  - **How to use it:** Ask your agent — "Search our project for open tickets mentioning rate limiting."
629
694
  - **Flags:** Narrow the search by project, status, issue type, or free text.
630
695
 
631
- **6. Write Comment**
696
+ **5. Write Comment**
632
697
  - **What it does:** Posts a comment on a ticket.
633
698
  - **When it's useful:** (Refinement | Implementation) To leave context, status, or a decision trail on the ticket.
634
699
  - **How to use it:** Ask your agent — "Post a comment on BAPI-123: blocked on the expired Atlassian token — will retry after it is rotated."
635
700
  - **Flags:** A long comment can be attached as a file instead of inlined.
636
701
 
637
- **7. Read Comments**
702
+ **6. Read Comments**
638
703
  - **What it does:** Reads the comment thread on a ticket.
639
704
  - **When it's useful:** (Refinement | Implementation) When the discussion on a ticket matters and you want the agent to read it before acting.
640
705
  - **How to use it:** Ask your agent — "Read the comments on BAPI-123 and summarize what was decided."
641
706
  - **Flags:** None.
642
707
 
643
- **8. Ticket Attachments**
708
+ **7. Ticket Attachments**
644
709
  - **What it does:** Downloads files from a ticket to your disk, or attaches a local file to a ticket.
645
710
  - **When it's useful:** (Refinement | Implementation) When a ticket has design files or logs you need locally, or you want to attach output back to it.
646
711
  - **How to use it:** Ask your agent — "Download the design mockups attached to BAPI-123 into my docs folder," or "Attach build-log.txt to BAPI-123."
647
712
  - **Flags:** Choose the direction (download from the ticket, or upload to it) and, for a download, where the files should land.
648
713
 
649
- **9. Estimate Ticket**
714
+ **8. Estimate Ticket**
650
715
  - **What it does:** Estimates the development effort for one ticket. Use Estimate Epic instead for a whole epic or a named group of tickets.
651
716
  - **When it's useful:** (Refinement) When you need a size for a single ticket before committing to it.
652
717
  - **How to use it:** Ask your agent — "Estimate BAPI-123."
653
718
  - **Flags:** Ask for a fresh estimate to regenerate rather than reuse a stored one.
654
719
 
655
- **10. Estimate Epic**
720
+ **9. Estimate Epic**
656
721
  - **What it does:** Estimates an epic, or an explicit group of tickets you name.
657
722
  - **When it's useful:** (Architecture | Refinement) When you need a sizing pass across an epic, or across a set of tickets you name explicitly.
658
723
  - **How to use it:** `/estimate-epic BAPI-123`
@@ -661,63 +726,72 @@ Useful once in a while.
661
726
 
662
727
  ### Workflow commands
663
728
 
664
- Slash commands that drive several tools at once. They are agent workflows rather than single MCP tools, so they are documented here by hand.
665
-
666
- **1. Start Tickets**
667
- - **What it does:** Creates one git worktree per ticket and spawns an agent session in each to implement them in parallel.
668
- - **When it's useful:** (Implementation | Automation) When you're ready to start building one or more refined tickets concurrently.
669
- - **How to use it:** `/start-tickets BAPI-248 BAPI-250` (see [CLI Subcommands](#cli-subcommands) for the full flag table and cross-platform behavior).
670
- - **Flags:** `--auto` skip the approval gates · `--base-branch <branch>` branch off something other than the default · `--workflow implement|review-and-implement` selects which slash command each spawned worktree runs · `--rounds=1|2` forwarded to the review phase, valid only with `--workflow review-and-implement` · `--tier cheap|basic|premium` coarse model-routing override.
729
+ Slash commands that drive several tools at once. Start Tickets, Review and Start, and Explore Ticket are documented above under [Regularly useful](#regularly-useful) the rest live here.
671
730
 
672
- **2. Implement Ticket**
731
+ **1. Implement Ticket**
673
732
  - **What it does:** Full build for one ticket: generate a plan, write the code, commit, open a PR, and monitor CI.
674
733
  - **When it's useful:** (Implementation) When a ticket is ready and you want it taken from plan to open PR in one go.
675
734
  - **How to use it:** `/implement-ticket BAPI-123` (command only — "implement X" as free text almost always triggers a freehand build instead of the Bridge plan→code→PR→CI pipeline).
676
735
  - **Flags:** `--auto` skip the approval gates (e.g. auto-commit/push).
677
736
 
678
- **3. Review and Start**
679
- - **What it does:** Spawns one worktree per ticket; each session reviews the ticket inline and, after a per-ticket proceed/halt gate, hands off to a **fresh implementation session** that reuses the same worktree — review and implementation run in two separate agent contexts, not one shared session.
680
- - **When it's useful:** (Refinement | Implementation | Automation) The **recommended front door** for "review these tickets, then implement the ones that pass," starting from existing ticket keys (unlike `/full-automation`, which only accepts an idea).
681
- - **How to use it:** `/review-and-start BAPI-248 BAPI-250` (single or multiple keys flow through the identical code path).
682
- - **Flags:** `--auto` auto-approves both the review and the implementation phase of every spawned session · `--rounds=1|2` forwarded to the review phase · `--agent`, `--base-branch`, `--max-parallel`, `--dry-run` mirror `/start-tickets`.
683
-
684
- **4. Jira Ticket Writer**
737
+ **2. Jira Ticket Writer**
685
738
  - **What it does:** An agent that drafts a well-structured Jira ticket from a plain description, applying your project's standards.
686
739
  - **When it's useful:** (Refinement) When you have an idea in your head and want a properly-formatted ticket draft without writing it by hand.
687
- - **How to use it:** `/write-ticket <description>` — or ask your agent, *"Use the jira ticket writer to turn our conversation into a ticket."*
688
- - **Flags:** `--standards <path>` apply a specific standards file when drafting.
740
+ - **How to use it:** Ask your agent, *"Use the jira ticket writer to turn our conversation into a ticket."* The other ticket commands draft through it automatically.
741
+ - **Flags:** None name a specific standards file in your request to have it applied when drafting.
689
742
 
690
- **5. Idea to Ticket**
743
+ **3. Idea to Ticket**
691
744
  - **What it does:** Turns a one-line idea into a Jira Task/Spike (or an Epic plus child tickets), with research, duplicate detection, and a critique pass built in.
692
745
  - **When it's useful:** (Refinement | Automation) When you have a rough idea and want a fully-formed, uploaded ticket without the manual draft-and-refine loop.
693
746
  - **How to use it:** `/idea-to-ticket <idea>`
694
747
  - **Flags:** None.
695
748
 
696
- **6. Explore Ticket**
697
- - **What it does:** Explores the codebase for a task and recommends implementation options or surfaces clarifying questions, with optional research.
698
- - **When it's useful:** (Architecture | Refinement) Before writing a ticket or plan, when you're unsure how a change would fit the existing code.
699
- - **How to use it:** `/explore-ticket <task>` — *"Explore the codebase for how we'd add a Mistral LLM provider and recommend 2–3 implementation options."*
700
- - **Flags:** None.
701
-
702
- **7. Plan Epic**
749
+ **4. Plan Epic**
703
750
  - **What it does:** Decomposes a large epic into sub-tasks with a structured exploration doc for each.
704
751
  - **When it's useful:** (Architecture | Refinement) When a feature is too big for one ticket and you need it broken down and scoped.
705
752
  - **How to use it:** `/plan-epic <epic>` — *"Decompose the epic 'migrate PayPal token storage off Custom Objects' into sub-tasks with an exploration doc for each."*
706
753
  - **Flags:** None.
707
754
 
708
- **8. Run Tests**
755
+ #### Ticket-authoring posture
756
+
757
+ `/explore-ticket`, `/idea-to-ticket`, and `/plan-epic` all decide ticket shape
758
+ the same way, as does the `jira-ticket-writer` agent they draft through. A fresh install inherits this with no configuration
759
+ step and no server call; the full rationale and the closed exception list ship as
760
+ `docs/bridge-ticket-authoring.md`.
761
+
762
+ - **Drafted by the writer.** Every ticket body — epic parent, epic child, and
763
+ ordinary sibling alike — goes through the `jira-ticket-writer` agent. Nothing
764
+ composes a ticket description inline.
765
+ - **Sized toward L, overflowing upward.** `L` (target) → `XL` (when the work
766
+ does not fit in `L`) → `M` (third choice) → `S` (only when unavoidable). A
767
+ slice that outgrows `L` becomes one `XL` ticket rather than two `L` ones —
768
+ splitting a coherent slice to fit a band buys another worktree, another PR, and
769
+ another rebase for nothing. This binds a standalone ticket and an epic child
770
+ alike. Past roughly 40 files or ~3000 LOC it splits anyway, into the largest
771
+ coherent pieces available.
772
+ - **Grouped at three.** Three or more tickets is an epic: an epic parent plus an
773
+ ordered child manifest, shown in full at an approval gate before anything is
774
+ created. One or two are ordinary siblings — no epic parent, no manifest. The
775
+ threshold is exactly three.
776
+ - **Decomposed once, rendered many.** One pass freezes the split; body drafting
777
+ then fans out one writer invocation per entry against that frozen manifest. A
778
+ rendering invocation never re-splits, merges, reorders, or rescopes.
779
+ - **Handed off once.** An epic handoff names exactly one entry point,
780
+ [`drive-epic`](#drive-epic) — never a choice between conductors.
781
+
782
+ **5. Run Tests**
709
783
  - **What it does:** Runs the unit and E2E suites and autonomously triages/fixes failures (via the test-correction agent).
710
784
  - **When it's useful:** (Implementation) After making changes, to confirm everything passes and auto-fix straightforward breakages.
711
785
  - **How to use it:** `/run-tests`
712
786
  - **Flags:** `--unit-only` skip the E2E suite · `--skip-e2e` same, phrased the other way.
713
787
 
714
- **9. Learn Repository**
788
+ **6. Learn Repository**
715
789
  - **What it does:** Researches and documents the repo's architecture, testing, review, and correctness standards, then saves them to Bridge for future agents.
716
790
  - **When it's useful:** (Setup/Learning) When onboarding a new repo, or after big changes, so Bridge's agents follow your conventions.
717
791
  - **How to use it:** `/learn-repository`
718
792
  - **Flags:** None.
719
793
 
720
- **10. Teach Bridge**
794
+ **7. Teach Bridge**
721
795
  - **What it does:** Takes a plain-English instruction, figures out which standards field it belongs to, and merges it in (admin only).
722
796
  - **When it's useful:** (Setup/Learning) When you notice the agents missing a convention and want to correct it in one sentence.
723
797
  - **How to use it:** `/teach-bridge <teaching>` — *"Teach Bridge: always use data-testid selectors in E2E tests."*
@@ -748,7 +822,7 @@ Behind-the-scenes capabilities an agent gains from the MCP tools — mostly invo
748
822
  - **Index the codebase** so Bridge's agents can reason about it: queue/parse the repo, check parse status, regenerate the directory map.
749
823
  - **Read & tune project config/standards:** list/read/update config fields, fetch project standards, and the per-topic `learn-*` commands that populate them.
750
824
  - **Ticket lifecycle bookkeeping:** track tickets and backfill workflow-state timestamps (`scan-tickets`), search across tickets, read comments, list attachments.
751
- - **Pipeline machinery:** list/inspect pipeline recipes and run/resume/list/delete pipeline runs (the engine under the orchestration commands).
825
+ - **Pipeline machinery:** list/inspect pipeline recipes, run/resume/list/delete pipeline runs (the engine under the orchestration commands), and resume a full-automation chain that stopped at an approval gate or was interrupted.
752
826
  - **Decision page** generation for capturing human review decisions as structured data.
753
827
  - **Connectivity & identity checks:** ping Bridge, check your role, resolve the local docs directory.
754
828
  - **Retrieve any generated artifact** (`get_*` for plans, critiques, questions, councils, research, architecture) without regenerating it.
@@ -756,7 +830,7 @@ Behind-the-scenes capabilities an agent gains from the MCP tools — mostly invo
756
830
 
757
831
  ## Salesforce B2C Commerce (SFCC) Tools
758
832
 
759
- Salesforce's official MCP server, `@salesforce/b2c-dx-mcp`, covers developer-experience tasks — cartridge deploy, step debugging, docs search, logs/MRT, and SCAPI Custom API scaffolding. As of its current toolset it has no way to *read* the platform's object model, custom objects, or site configuration — exactly the context an AI coding agent needs to write correct Commerce code and to inspect a sandbox before touching it. Bridge's SFCC tools install side-by-side with `b2c-dx-mcp` (they don't duplicate its surface) and close that gap with **OCAPI Data API introspection** of system objects, custom object definitions, and site preferences — plus, behind a separate opt-in, a small set of sandbox-bounded writes.
833
+ Salesforce's official MCP server, `@salesforce/b2c-dx-mcp`, covers developer-experience tasks — cartridge deploy, step debugging, MRT bundle push, and SCAPI Custom API scaffolding. **As of `@salesforce/b2c-dx-mcp` 1.1.2 (published 2026-05-20)** it has no way to *read* the platform's object model, custom objects, or site configuration — exactly the context an AI coding agent needs to write correct Commerce code and to inspect a sandbox before touching it. That comparison is dated on purpose: its basis is this repository's hand-maintained [vendor manual](../docs/mcp/b2c-commerce-developer.md), pinned to the same version, so a new Salesforce toolset ages the claim visibly instead of rotting silently. Bridge's SFCC tools install side-by-side with `b2c-dx-mcp` (they don't duplicate its surface) and close that gap with **OCAPI Data API introspection** of system objects, custom object definitions, and site preferences — plus, behind a separate opt-in, a set of sandbox-bounded writes.
760
834
 
761
835
  **Every SFCC tool is restricted to a developer sandbox, and the restriction is checked at invocation time against the hostname your credentials actually resolve to** — not against anything the caller passes in. If `dw.json` or `SFCC_HOSTNAME` names a host Bridge does not recognize as a developer sandbox, every SFCC tool refuses with a `403` before contacting it. See [Sandbox enforcement](#sandbox-enforcement).
762
836
 
@@ -771,7 +845,7 @@ The two diagnostic tools (`sfcc_setup_status`, `check_permissions`) are always a
771
845
 
772
846
  **Prerequisites:** a running SFCC **sandbox** and its hostname, plus an Account Manager API client (`client-id` + `client-secret`).
773
847
 
774
- **1. Set the repo `version` config field** to your SFCC project type — one of `sfra | pwakit | sitegenesis | storefrontnext | hybrid`. The call-time gate reads this; a non-SFCC value blocks every SFCC tool except `sfcc_setup_status`. Set it via your normal config path, the `config_field` MCP tool (operation `update`, field `version`), or the `/teach-bridge` skill.
848
+ **1. Set the repo `version` config field** to your SFCC project type — one of `sfra | pwakit | sitegenesis | storefrontnext | hybrid`. The call-time gate reads this; a non-SFCC value blocks the OCAPI tools the eight reads, the nine writes, and `check_permissions`. It does **not** block `sfcc_setup_status`, and it does not block `sfcc_log_query`: log query runs on its own gate, which reads neither the `version` field nor `dw.json` and instead probes the backend log capability (log access is WebDAV Basic auth, a different boundary from OCAPI's OAuth). Set the field via your normal config path, the `config_field` MCP tool (operation `update`, field `version`), or the `/teach-bridge` skill.
775
849
 
776
850
  **2. Provide SFCC credentials.** Create a `dw.json` in your project root:
777
851
 
@@ -783,7 +857,17 @@ The two diagnostic tools (`sfcc_setup_status`, `check_permissions`) are always a
783
857
  }
784
858
  ```
785
859
 
786
- Accepted key spellings: `hostname`/`host`, `client-id`/`clientId`/`client_id`, `client-secret`/`clientSecret`/`client_secret`. Prefer a single config — a multi-entry `configs[]` array forces you to pass an explicit `instance` on every call. `dw.json` is auto-added to git exclude and must never be committed. Alternatively, export `SFCC_HOSTNAME` / `SFCC_CLIENT_ID` / `SFCC_CLIENT_SECRET` in the MCP server environment.
860
+ Accepted key spellings: `hostname`/`host`, `client-id`/`clientId`/`client_id`, `client-secret`/`clientSecret`/`client_secret`. `dw.json` is auto-added to git exclude and must never be committed.
861
+
862
+ Credentials resolve in **three tiers, highest first** — the environment wins over `dw.json`, not the other way round:
863
+
864
+ 1. An explicit dotted `instance` argument on the call, **plus** `SFCC_CLIENT_ID` and `SFCC_CLIENT_SECRET` in the environment. Secrets are never read from `dw.json` on this tier, so an explicit instance without those two env values is an error.
865
+ 2. `SFCC_HOSTNAME` **and** `SFCC_CLIENT_ID` **and** `SFCC_CLIENT_SECRET`, all three set.
866
+ 3. `dw.json`.
867
+
868
+ Because tier 2 outranks tier 3, a stale `SFCC_HOSTNAME` left in the environment silently wins over the `dw.json` you are looking at. Check both when a tool reports an unexpected host.
869
+
870
+ **Use a single-config `dw.json`, or set all three `SFCC_*` variables.** A multi-entry `configs[]` array is **rejected outright** — it is not a working setup that merely requires an explicit `instance` on every call. Two things make that workaround unavailable: an explicit `instance` takes tier 1, which needs the client id and secret in the environment anyway, and most tools cannot accept a hostname at all — the value must contain a dot, and the site-preference tools constrain `instance` to `staging | development | sandbox | production`, none of which is a hostname.
787
871
 
788
872
  **3. Enable the tools you want.** Add the groups to `BRIDGE_MCP_PROFILE` in the MCP server `env` block (it is comma-separated), then **restart the MCP client**:
789
873
 
@@ -795,6 +879,13 @@ Accepted key spellings: `hostname`/`host`, `client-id`/`clientId`/`client_id`, `
795
879
 
796
880
  **4. Verify and grant OCAPI access.** Ask your agent to run `sfcc_setup_status` (expect all checks ✓), then `check_permissions`. If it reports HTTP 401/403, it prints the exact OCAPI Settings JSON to paste in Business Manager (**Administration → Site Development → Open Commerce API Settings → Data API** tab); save it there and re-run. Restart the MCP client after any credential or env change — a running session does not pick them up.
797
881
 
882
+ Read what it prints before pasting it. The output is **two labelled blocks**, and they are not equivalent:
883
+
884
+ - **READ/SEARCH TOOL GRANTS** — what the `sfcc` read tools need: `get` on `/system_object_definitions`, and `get` + `post` on `/system_object_definitions/**`, `/site_preferences/**`, and `/custom_object_definitions/**`. The `post` is OCAPI's convention for its `*_search` endpoints, not a mutation — but it is a grant you are pasting, so it is labelled for what it is rather than as "read-only".
885
+ - **MUTATION GRANTS** — required by the nine `sfcc-write` tools and by nothing else: `put`/`patch` on `/system_object_definitions/**` and `/custom_object_definitions/**`, and `patch` on `/site_preferences/**`. Paste this block only if you intend to enable `sfcc-write`.
886
+
887
+ Neither block grants `delete`, and neither pastes the global `resource_id: "/**"` that would cover every Data API resource. Each entry names one resource family — `/system_object_definitions`, `/custom_object_definitions/**`, `/site_preferences/**` — so the wildcard is scoped to the family, not to the API. Within a family it is still broad, and `write_attributes` is `(**)`, so a throwaway sandbox is the right place for these.
888
+
798
889
  </details>
799
890
 
800
891
  ### Sandbox enforcement
@@ -848,7 +939,7 @@ Users of `BRIDGE_MCP_PROFILE=full` keep write access and need no change.
848
939
 
849
940
  ### Tools
850
941
 
851
- The `sfcc` profile registers **read-only** tools: eight OCAPI reads plus `sfcc_log_query`. The **nine destructive write tools** are registered only by the separate `sfcc-write` profile — see [Read and write profiles](#read-and-write-profiles). Both surfaces are bounded to a developer sandbox by the same invocation-time check.
942
+ Twenty tools in total: two always-on diagnostics, the `sfcc` profile's **read-only** surface (eight OCAPI reads plus `sfcc_log_query`), and the nine destructive writes that only the separate `sfcc-write` profile registers — see [Read and write profiles](#read-and-write-profiles). Every one of them is bounded to a developer sandbox by the same invocation-time check. All twenty are enumerated below.
852
943
 
853
944
  An oversized response is saved in full to `BAPI_DOCS_DIR/sfcc/` and replaced by a parseable JSON descriptor — `truncated: true`, the `saved_path` it was written to, and the `page` metadata (`returned`, `total` when OCAPI supplied one, `has_more`) — so the collection metadata survives even though the data itself is on disk. If that save fails, the complete payload is returned inline instead, still as parseable JSON.
854
945
 
@@ -858,11 +949,19 @@ Attribute-definition reads and writes can return an attribute's `default_value`
858
949
  - `sfcc_setup_status` — report on every prerequisite: Bridge API key, repo name, `version` config, `dw.json` presence/uniqueness, AM (OCAPI) token acquisition, and the independent **SFCC Log Query (WebDAV)** capability that gates `sfcc_log_query`.
859
950
  - `check_permissions` — probe OCAPI access via `GET /system_object_definitions`; on 401/403, print the exact OCAPI Settings JSON to paste in Business Manager (read/search grants for the `sfcc` tools, mutation grants for the `sfcc-write` tools). An explicit `instance` hostname is still subject to the sandbox check below.
860
951
 
861
- **System object model** (needs the `sfcc` profile)
952
+ **System object model — reads** (needs the `sfcc` profile)
862
953
  - `system_object_list` — list system object types (Product, Order, Customer, …).
863
954
  - `system_object_get` — fetch one system object type's definition.
864
955
  - `system_object_attribute_search` — search a type's attribute definitions; prefer this over a full dump when hunting a specific `c_` custom attribute.
865
956
 
957
+ **System object model — writes** (needs the `sfcc-write` profile; every one is a destructive write, sandbox only)
958
+ - `system_object_attribute_definition_create` — create an attribute definition via `PUT /system_object_definitions/{type}/attribute_definitions/{id}`.
959
+ - `system_object_attribute_definition_update` — update one via `PATCH` on the same path.
960
+ - `system_object_attribute_group_create` — create an attribute group via `PUT /system_object_definitions/{type}/attribute_groups/{id}`.
961
+ - `system_object_attribute_group_update` — update one via `PATCH` on the same path.
962
+ - `system_object_attribute_assign_to_group` — assign an existing attribute definition into a group via `PUT …/attribute_groups/{group}/attribute_definitions/{def}`.
963
+ - `custom_preference_definition_create` — define a custom site or organization preference via `PUT /system_object_definitions/{SitePreferences|OrganizationPreferences}/attribute_definitions/{id}`.
964
+
866
965
  **Custom object definitions** (reads need `sfcc`; the two writes need `sfcc-write`)
867
966
  - `custom_object_definition_attributes_get` — fetch attribute definitions for a known custom object type (`default_value` withheld). OCAPI cannot enumerate custom object type *IDs* directly, so `object_type` must be known — but it is discoverable: call `system_object_list` at `projection: "full"` for each custom type's `display_name` and `attribute_definition_count`, derive a candidate id (e.g. strip spaces from `"Product Quality Result"` → `ProductQualityResult`), and confirm it by checking that this tool's returned attribute count matches that row's `attribute_definition_count`.
868
967
  - `custom_object_definition_attribute_search` — search attribute definitions within a known custom object type (`default_value` withheld). Read-only — creating a custom object *type* isn't possible via OCAPI; that's a future v2 metadata-import capability. Same discovery path as above applies to `object_type`.
@@ -870,25 +969,28 @@ Attribute-definition reads and writes can return an attribute's `default_value`
870
969
  - `custom_object_definition_attribute_update` — **write** (sandbox only): update an attribute definition via an ETag-conditional `PATCH …/attribute_definitions/{id}`; surfaces 409/412 conflicts and echoes grant JSON on 403.
871
970
 
872
971
  **Site preferences** (reads need `sfcc`; the write needs `sfcc-write`; sandbox only)
873
- - `site_preference_get` — read a preference group's effective preferences.
874
- - `site_preference_search` — search/filter preferences within a group.
972
+ - `site_preference_group_list` — list the preference groups on a site. This is the discovery tool the other two reads depend on: both take a group, and this is how you find one.
973
+ - `site_preference_get` — list the preference **identifiers** in a group.
974
+ - `site_preference_search` — search/filter preference identifiers within a group.
875
975
  - `site_preference_values_set` — **write** (sandbox only): set custom preference values via `PATCH /site_preferences/preference_groups/{group}/sandbox` with a flat map of `c_`-prefixed ids to string/number/boolean/string[] values. A bad group returns 404 `CustomPreferenceGroupNotFoundException`; echoes grant JSON on 403.
876
976
 
977
+ > **Site preference values are write-only through this surface.** `site_preference_get` and `site_preference_search` return **ids only, never values** — an unset preference and one set to the empty string are indistinguishable. So you can *set* a value with `site_preference_values_set` and have no way to read it back through an MCP tool. Business Manager is the supported path to read a preference value.
978
+
877
979
  **On-demand log query** (needs the `sfcc` profile)
878
980
  - `sfcc_log_query` — query redacted, filtered SFCC logs on demand. `environment` and `time_range` (`start`/`end`) are **required** — production, "all environments", and an open-ended period are never inferred. The tool calls a Bridge backend endpoint that runs the pull → redaction → filter pipeline server-side and returns scoped, redacted findings; **WebDAV credentials, retrieval, redaction, and filtering all stay server-side and single-sourced.** It holds no credentials of its own.
879
981
  - **Guardrails.** Selection is bounded by log-file `prefixes` (max 5), the time range, a scanned-entry cap (`max_entries`, ≤ 2000), a finding cap, and a per-snippet length cap. High-volume prefix classes (`info`, `jobs`, `debug`, `customdebug`) impose a **stricter 6-hour** max range (vs. 24h for the error class) because `info-*` runs ~1 MB/day versus `error-*` at ~13 KB median — a wide window over a high-volume prefix is **rejected**, never silently narrowed.
880
982
  - **Response order.** Resolved scope (`environment`, `time_range`, `applied_prefixes`) and cap `status` first, redacted `findings` second, retrieval/truncation `metadata` last.
881
983
  - **Statuses & errors.** `ready`, `no_matching_findings`, `results_truncated`; plus `VALIDATION_ERROR` (bad/oversized scope, caught before any network call), `NOT_CONFIGURED` (503 — the log capability isn't set up; run `sfcc_setup_status`, whose step 6 reports it), and `BAD_GATEWAY`/`SERVICE_UNAVAILABLE` on a retrieval/backend failure.
882
984
  - **Auth is separate from OCAPI.** Log retrieval uses **HTTP Basic auth** — a Business Manager username + a **40-character WebDAV access key** — *not* the OCAPI Account Manager OAuth token the other SFCC tools use. A valid AM bearer token 401s on `/Logs`. `sfcc_setup_status` step 5 (AM/OCAPI token) and step 6 (WebDAV log access) are independent: one can be green while the other is not.
883
- - **Local / air-gapped fallback.** The primary path above is the only path this tool takes. For air-gapped development, the documented fallback is Salesforce's own **`@salesforce/b2c-dx-mcp`** (`logs_list_files`, configured from `dw.json`) it is vendor-maintained and reads log files over WebDAV, so it is strictly less work than shelling the B2C CLI (`b2c logs get --since <window> --search <q> --json`). It is **not** the primary path because its credentials live client-side and its output has **not** passed Bridge's redaction/filter. If you use it, its output must be treated as raw: route it back through the same server-side Python `LogSource` composition and `RedactionPort`/T3 filter workflow — never paste or relay unredacted `b2c-dx-mcp` or CLI output to an LLM.
985
+ - **Local / air-gapped fallback.** The primary path above is the only path this tool takes. For air-gapped development, the documented fallback is Salesforce's own **`@salesforce/b2c-cli`**, shelled out to directly: `b2c logs get --since <window> --search <q> --json`. There is no MCP alternative to reach for `@salesforce/b2c-dx-mcp` ships **no `logs_*` tool** as of 1.1.2, and every log workflow in the vendor toolkit goes through the CLI anyway (see the [vendor manual](../docs/mcp/b2c-commerce-developer.md)). It is **not** the primary path because its credentials live client-side and its output has **not** passed Bridge's redaction/filter. If you use it, its output must be treated as raw: route it back through the same server-side Python `LogSource` composition and `RedactionPort`/T3 filter workflow — never paste or relay unredacted CLI output to an LLM.
884
986
 
885
987
  ## CLI Subcommands
886
988
 
887
- Beyond `--init` / `--upgrade`, the package ships operational subcommands of the **single `bridge-api-mcp-server` bin** (not separate binaries) — so they travel with the package to every consumer. See [Usage Documentation → Start Tickets](#tier-1--regularly-useful) for *when* to use `start-tickets`; this section is the full CLI reference.
989
+ Beyond `--init` / `--upgrade`, the package ships operational subcommands of the **single `bridge-api-mcp-server` bin** (not separate binaries) — so they travel with the package to every consumer. See [Usage Documentation → Start Tickets](#regularly-useful) for *when* to use `start-tickets`; this section is the full CLI reference.
888
990
 
889
991
  ### `start-tickets`
890
992
 
891
- Spawns one Worktrunk worktree + selected-agent session per Jira ticket and backs the `/start-tickets` slash command. The agent defaults to **Claude Code** (`claude`) and is configurable via `--agent`. For existing ticket keys, `/review-and-start` (see [Usage Documentation → Review and Start](#tier-3--now-and-then)) is the recommended enriched front door over this CLI's `--workflow review-and-implement` seam; using the CLI directly (below) remains the advanced/lower-level path.
993
+ Spawns one Worktrunk worktree + selected-agent session per Jira ticket and backs the `/start-tickets` slash command. The agent defaults to **Claude Code** (`claude`) and is configurable via `--agent`. For existing ticket keys, `/review-and-start` (see [Usage Documentation → Review and Start](#regularly-useful)) is the recommended enriched front door over this CLI's `--workflow review-and-implement` seam; using the CLI directly (below) remains the advanced/lower-level path.
892
994
 
893
995
  ```
894
996
  npx -y @bridge_gpt/mcp-server start-tickets [flags] KEY [KEY ...]
@@ -947,6 +1049,29 @@ authenticate. See
947
1049
 
948
1050
  It is **read-only**: it never installs anything, modifies your system, adds an npm `postinstall`, spawns a terminal, or starts the MCP server, and there is no `--fix`. For each prerequisite it prints found/missing and, when missing, the exact per-OS install command **as a manual instruction you run yourself**. The checked set is the `start-tickets` preflight prerequisites **plus `uv`** **plus the selected agent's command** (`claude` by default, or `cursor-agent` with `--agent cursor-agent`). The Worktrunk binary is probed via the resolved name (honoring `BAPI_WORKTRUNK_BIN`), not a hard-coded one. **Exit code:** `0` when all required prerequisites are present, non-zero when any is missing or the platform is unsupported. A failing `start-tickets` preflight now hints you to run `doctor` for an actionable diagnostics report.
949
1051
 
1052
+ ### `drive-epic`
1053
+
1054
+ The one conductor entry point every Bridge surface names. Give it an epic key and
1055
+ it reads conductor readiness for your repository and routes to the single path
1056
+ your project can actually run:
1057
+
1058
+ ```
1059
+ npx -y @bridge_gpt/mcp-server drive-epic <EPIC>
1060
+ ```
1061
+
1062
+ You are never asked to choose. Bridge currently has two conductors and a standing
1063
+ rule that they must never operate on the same epic — two transition authorities on
1064
+ one epic wedge it permanently — so the choice is made structurally rather than by
1065
+ judgement. Readiness green routes to the v2 bootstrap below (pass `--plan-file`
1066
+ and `drive-epic` runs it for you); readiness not green prints the interactive
1067
+ pilot instruction instead. If readiness is **unknown** — unreachable,
1068
+ unauthorized, or malformed — it escalates and prints no conductor invocation at
1069
+ all, because an unknown owner is not the same as a not-ready one. No branch,
1070
+ including every error path, ever offers you two paths.
1071
+
1072
+ Two conductors is a transitional state. When one is eliminated, `drive-epic` is
1073
+ the only thing that changes.
1074
+
950
1075
  ### `setup-epic`
951
1076
 
952
1077
  Bootstraps an Epic Conductor v2 run in one command — creates the epic run, stores the plan DAG, and approves it:
@@ -1086,10 +1211,20 @@ If a custom pipeline has the same key as a built-in pipeline, the custom version
1086
1211
 
1087
1212
  | Variable | Required | Default | Description |
1088
1213
  |---|---|---|---|
1089
- | `BAPI_BASE_URL` | Yes | `https://bridgegpt-api.com` | Bridge API base URL |
1214
+ | `BAPI_BASE_URL` (server, installer) | No | `https://bridgegpt-api.com` | Bridge API base URL. The MCP server and the `install` CLI both fall back to the production default |
1215
+ | `BAPI_BASE_URL` (`executor` subcommand) | **Yes** | _(none)_ | The `executor` deliberately has **no** production fallback — it refuses to start rather than guess a target |
1090
1216
  | `BAPI_REPO_NAME` | Yes | _(none)_ | Jira project/repository identifier configured in Bridge API |
1091
- | `BAPI_API_KEY` | Yes | _(none)_ | API key obtained from the Bridge API setup UI |
1092
- | `BAPI_PROJECT_ROOT` | No | _(auto-set by --init)_ | Absolute path to project root. Anchors `BAPI_DOCS_DIR` and `BAPI_PIPELINES_DIR` resolution |
1217
+ | `BAPI_API_KEY` | No | _(none)_ | A Bridge credential **is** required; this environment variable is only the first place the server looks for it. When it is unset the server resolves the credential from the user-scoped store (`~/.config/bridge/credentials.json`, target `bapi:<repo>`), which is why generated MCP registrations are secret-free |
1218
+ | `BAPI_PROJECT_ROOT` | No | _(see fallback order)_ | Absolute path to project root. Anchors `BAPI_DOCS_DIR` and `BAPI_PIPELINES_DIR` resolution. Resolved once, in order: `BAPI_PROJECT_ROOT` → the connected client's MCP `roots/list` → `CLAUDE_PROJECT_DIR` → `process.cwd()`. Several paths *write* it into a generated registration (`--init`, host-config provisioning, the worktree `mcp-invoke` shim) — that is provenance, not a runtime default |
1219
+ | `SFCC_HOSTNAME` | No | _(none)_ | SFCC sandbox hostname. Part of the environment credential tier — `SFCC_HOSTNAME`, `SFCC_CLIENT_ID`, and `SFCC_CLIENT_SECRET` must **all three** be set for that tier to apply, and a complete tier takes precedence over `dw.json` |
1220
+ | `SFCC_CLIENT_ID` | No | _(none)_ | Account Manager API client id. See `SFCC_HOSTNAME` — all three are needed together. Also required on its own when a tool is called with an explicit dotted `instance` |
1221
+ | `SFCC_CLIENT_SECRET` | No | _(none)_ | Account Manager API client secret. See `SFCC_HOSTNAME` — all three are needed together. Never sent to Bridge; it goes only to the Account Manager token endpoint |
1222
+ | `CLAUDE_CODE_OAUTH_TOKEN` | No | _(none)_ | The supported headless authentication input for conductor workers. Export it into the **executor process's own** environment; Bridge forwards it unchanged into the worker and stores it nowhere — no credential-store entry, no disk, never sent to Bridge. See [Claude login for conductor workers](#claude-login-for-conductor-workers) |
1223
+ | `BAPI_INSTALL_DEBUG` | No | _(unset)_ | Set to any non-empty value to unlock raw diagnostics in `install` and the `apply_install_manifest` path — the underlying error message and stack behind an `unexpected error` summary. The installer's own failure text tells you to set it |
1224
+ | `BAPI_SIGNUP_EMAIL` | No | _(none)_ | Selects the self-serve signup route without `--email`. Precedence: `--email` first, then this variable, then the visible interactive prompt |
1225
+ | `BAPI_INVITE` | No | _(none)_ | Invite code for `install`, for scripting. Like `--invite <code>`, it exposes the code to your shell history and the process list — prefer bare `--invite` and the hidden prompt |
1226
+ | `BAPI_PLANE_PYTHON` | No | `python` | Executable used for the Python members of `plane up`. Point it at a venv interpreter when `python` on `PATH` is not the one you want |
1227
+ | `BAPI_PLANE_UVICORN` | No | `uvicorn` | Executable used for the server member of `plane up` |
1093
1228
  | `BAPI_DOCS_DIR` | No | `docs/tmp` | Local directory for saving plans, critiques, and research reports |
1094
1229
  | `BAPI_PIPELINES_DIR` | No | `.bridge/pipelines` | Directory for user-defined custom pipeline JSON files |
1095
1230
  | `BAPI_WORKTRUNK_BIN` | No | `wt` (`git-wt` on Windows) | Override the Worktrunk executable name/path used by `start-tickets` for nonstandard installs |
@@ -1098,7 +1233,11 @@ If a custom pipeline has the same key as a built-in pipeline, the custom version
1098
1233
  | `BAPI_MCP_TOOL_SURFACE_GATING_ENABLED` | No | _(enabled)_ | MCP-local kill switch for **dynamic tool-surface capability gating** (see [Dynamic tool-surface gating](#dynamic-tool-surface-gating-capability-availability)). Default-on; set to `false`/`0`/`no`/`off`/`disabled` to skip the startup probe, the recurring poll, and the custom `tools/list` handler entirely, restoring the SDK's previous full profile-derived surface. Fail-open: any probe timeout, unreachable backend, non-2xx, malformed payload, incomplete evaluation, or unsupported schema advertises the full profile |
1099
1234
  | `BAPI_MCP_TOOL_SURFACE_POLL_ENABLED` | No | _(disabled)_ | Opt IN to the recurring tool-surface **poll**. Default-**off**: a session gates once via the startup probe and never re-probes. Set to `true`/`1`/`yes`/`on`/`enabled` to restore the jittered 12–18 s heartbeat that pushes `notifications/tools/list_changed` on mid-session capability changes. No effect when gating itself is disabled |
1100
1235
  | `CURSOR_API_KEY` | No | _(none)_ | API key used to authenticate `cursor-agent` when launching `start-tickets`/scheduled runs with `--agent cursor-agent`. Not needed for the default Claude Code agent |
1101
- | `BRIDGE_MCP_PROFILE` | No | `core` | Startup-time tool registration profile — a **comma-separated** list of groups controlling which tool groups are registered when the server starts. `core` is always implicitly included. Valid groups: `core` (default — normal coding tools only), `conductor` (+ 8 conductor/event/supervisor tools), `pipeline-authoring` (+ 5 pipeline run/admin tools — `get_pipeline_recipe` is NOT gated; it stays in `core` because the recipe-driven slash commands depend on it), `sfcc` (+ the 8 heavy SFCC read tools and `sfcc_log_query` — read-only, see [Salesforce B2C Commerce (SFCC) Tools](#salesforce-b2c-commerce-sfcc-tools); the `sfcc_setup_status`/`check_permissions` diagnostics are always registered regardless), `sfcc-write` (+ the 9 destructive SFCC write tools — independent of `sfcc`, which does not enable them; see [Read and write profiles](#read-and-write-profiles)), and `full` (shortcut that expands to every group, **including `sfcc-write`**). Example: `sfcc,conductor`; use `sfcc,sfcc-write` for reads plus writes. Unknown, blank, or malformed tokens are dropped (falling back to `core`). Dynamic mid-session switching via `tools/list_changed` is unsupported — groups are resolved once at process startup. Conductor/epic sessions launched via `start-tickets --conductor` automatically inject `BRIDGE_MCP_PROFILE=conductor` at the spawn boundary; a normal `start-tickets` run stays on `core`. |
1236
+ | `BRIDGE_MCP_PROFILE` | No | `core` | Startup-time tool registration profile — a **comma-separated** list of groups controlling which tool groups are registered when the server starts. `core` is always implicitly included. Valid groups: `core` (default — normal coding tools only), `conductor` (+ 8 conductor/event/supervisor tools), `pipeline-authoring` (+ 5 pipeline run/admin tools — `get_pipeline_recipe` is NOT gated; it stays in `core` because the recipe-driven slash commands depend on it), `sfcc` (+ the 8 heavy SFCC read tools and `sfcc_log_query` — read-only, see [Salesforce B2C Commerce (SFCC) Tools](#salesforce-b2c-commerce-sfcc-tools); the `sfcc_setup_status`/`check_permissions` diagnostics are always registered regardless), `sfcc-write` (+ the 9 destructive SFCC write tools — independent of `sfcc`, which does not enable them; see [Read and write profiles](#read-and-write-profiles)), and `full` (shortcut that expands to every group, **including `sfcc-write`**). Example: `sfcc,conductor`; use `sfcc,sfcc-write` for reads plus writes. Unknown, blank, or malformed tokens are dropped (falling back to `core`). Dynamic mid-session switching via `tools/list_changed` is unsupported — groups are resolved once at process startup. Conductor/epic sessions launched via `start-tickets --conductor` **merge** `conductor` into the parent process's already-resolved groups at the spawn boundary rather than replacing them — a project running on `sfcc` spawns workers on `core,sfcc,conductor`. A normal `start-tickets` run stays on `core`. |
1237
+
1238
+ Environment values are **trimmed**, and only a non-empty result wins. A
1239
+ whitespace-only `BAPI_API_KEY` therefore does not override anything: it falls
1240
+ through to credential-store resolution exactly as an unset variable would.
1102
1241
 
1103
1242
  ## Dynamic tool-surface gating (capability availability)
1104
1243