@bridge_gpt/mcp-server 0.2.23 → 0.2.24

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.
@@ -19,7 +19,8 @@ import { getAmToken } from "./client.js";
19
19
  * 2. Repo name set (REPO_NAME)
20
20
  * 3. version config field is an SFCC version
21
21
  * 4. dw.json found / instance unambiguous
22
- * 5. AM token acquisition
22
+ * 5. AM token acquisition (OCAPI Account Manager — NOT log/WebDAV access)
23
+ * 6. SFCC Log Query capability (WebDAV Basic auth — independent of steps 3–5)
23
24
  *
24
25
  * Never throws; each check is caught independently so partial states are
25
26
  * always reported. Output is completely secret-free.
@@ -97,8 +98,37 @@ export async function sfccSetupStatusTool(deps) {
97
98
  tokenStatus = `✗ ${msg}`;
98
99
  }
99
100
  }
100
- lines.push(`5. AM Token: ${tokenStatus}`);
101
- lines.push("\nRun `check_permissions` to probe OCAPI access once steps 1–5 are all green.");
101
+ lines.push(`5. AM Token (OCAPI): ${tokenStatus}`);
102
+ // 6. SFCC Log Query capability WebDAV Basic auth, independent of OCAPI/AM.
103
+ // A single Bridge backend probe (secret-free) reports readiness. This is a
104
+ // separate credential surface: an SFCC repo can have OCAPI working (steps 3–5)
105
+ // while log/WebDAV access is not configured, and vice versa.
106
+ let logQueryStatus = "— Skipped (Bridge API not configured)";
107
+ if (apiKeyOk && repoOk) {
108
+ try {
109
+ const url = deps.buildGetUrl("/sfcc/logs/capability", { repo_name: deps.repoName });
110
+ const resp = await fetch(url, { headers: await deps.getGetHeaders() });
111
+ if (!resp.ok) {
112
+ logQueryStatus = `✗ Could not read (Bridge API ${resp.status})`;
113
+ }
114
+ else {
115
+ const body = (await resp.json());
116
+ if (body?.configured === true) {
117
+ logQueryStatus = "✓ Configured (WebDAV log access ready)";
118
+ }
119
+ else {
120
+ const msg = typeof body?.message === "string" ? body.message : "Not configured";
121
+ logQueryStatus = `✗ ${msg}`;
122
+ }
123
+ }
124
+ }
125
+ catch (err) {
126
+ logQueryStatus = `✗ Resolution error: ${err instanceof Error ? err.message : String(err)}`;
127
+ }
128
+ }
129
+ lines.push(`6. SFCC Log Query (WebDAV): ${logQueryStatus}`);
130
+ lines.push("\nRun `check_permissions` to probe OCAPI access once steps 1–5 are all green. " +
131
+ "Step 6 (log/WebDAV access) is independent and gates `sfcc_log_query`.");
102
132
  return {
103
133
  content: [{ type: "text", text: lines.join("\n") }],
104
134
  };
@@ -1,2 +1,2 @@
1
1
  // AUTO-GENERATED — do not edit manually. Regenerate with: npm run build
2
- export const VERSION = "0.2.23";
2
+ export const VERSION = "0.2.24";
@@ -8,7 +8,7 @@ involve Conductor — you opt in per run with `--conductor`.
8
8
  This document is the reference for Conductor's architecture, epic setup,
9
9
  observability stream, local git hooks, and the per-repo done-gate / auto-merge
10
10
  config. For the everyday `start-tickets` flags and cross-platform behavior, see
11
- [README → CLI Subcommands](./README.md#cli-subcommands).
11
+ [README → CLI Subcommands](../README.md#cli-subcommands).
12
12
 
13
13
  ## Epic Conductor v2 — how an epic is actually driven
14
14
 
@@ -81,7 +81,7 @@ blocks or aborts a spawn, and `--dry-run` performs no conductor side effects.
81
81
  When `--conductor` is set, the spawn boundary also injects
82
82
  `BRIDGE_MCP_PROFILE=conductor` so each worker registers the 8 conductor/event/
83
83
  supervisor MCP tools (a plain `start-tickets` run stays on the default `core`
84
- profile). See [README → Environment Variables](./README.md#environment-variables).
84
+ profile). See [README → Environment Variables](../README.md#environment-variables).
85
85
 
86
86
  ## `conductor install-git-hooks` (BAPI-395)
87
87
 
@@ -0,0 +1,189 @@
1
+ # Installing the Bridge GitHub App
2
+
3
+ Bridge connects to GitHub through a **GitHub App**, not a personal access token. Once
4
+ the app is installed on your repository and linked to your Bridge project, Bridge can
5
+ open pull requests, run automated code review, read CI check status, and (when enabled)
6
+ auto-merge — all using short-lived, per-call installation tokens. Your code and
7
+ credentials stay on GitHub; Bridge mints a fresh token for each operation and stores no
8
+ long-lived GitHub token.
9
+
10
+ ## The app
11
+
12
+ | | |
13
+ |---|---|
14
+ | **Name** | Bridge GPT - AI Tools for SFCC |
15
+ | **Owner** | [@Bridge-GPT](https://github.com/Bridge-GPT) |
16
+ | **Public install page** | <https://github.com/apps/bridge-gpt-ai-tools-for-sfcc> |
17
+ | **App ID** | `954077` |
18
+ | **Client ID** | `Iv23liBEyDUeD25W06ix` |
19
+
20
+ > The App ID and Client ID are **public** identifiers (GitHub shows them on the app's
21
+ > settings page). They are not secrets. Only the app's **private key** and webhook
22
+ > secret are sensitive, and those are held by whoever operates the Bridge deployment —
23
+ > see [Self-hosting / operator setup](#self-hosting--operator-setup) at the end. As an
24
+ > end user you never handle them.
25
+
26
+ ## Prerequisites
27
+
28
+ - A GitHub repository you want Bridge to work on.
29
+ - Permission to install a GitHub App on the account that owns it:
30
+ - **Personal repo:** you can install it yourself.
31
+ - **Organization repo:** you must be an **organization owner**, or a member who can
32
+ *request* the install for an owner to approve. (GitHub decides which button you see —
33
+ **Install**, **Install & request**, or **Request** — based on your role.)
34
+ - Your Bridge project already registered (you have a Bridge API key and repo name).
35
+
36
+ ---
37
+
38
+ ## Option A — Connect GitHub button (recommended)
39
+
40
+ This is the normal path. Bridge captures the installation automatically — you never copy
41
+ an ID by hand.
42
+
43
+ 1. Open your project's **Get Started** page in the Bridge web UI.
44
+ 2. Click **Connect GitHub**. Bridge mints a short-lived, single-use link scoped to your
45
+ project and sends you to GitHub's app-install screen.
46
+ 3. On GitHub, choose the **account or organization** that owns the repository.
47
+ 4. Under **Repository access**, choose **Only select repositories** and pick the repo(s)
48
+ you want Bridge to cover (or **All repositories**). See
49
+ [Choosing repositories](#choosing-repositories) below.
50
+ 5. Review the requested permissions and click **Install** (or **Install & request** /
51
+ **Request** if an org owner must approve).
52
+ 6. GitHub redirects you back to Bridge. Bridge verifies the installation directly with
53
+ GitHub, links it to your project, and stores the installation automatically. If the
54
+ installation covers exactly one repo — or one repo clearly matches your project —
55
+ Bridge binds it for you; otherwise it shows a short **repository picker** so you can
56
+ confirm which repo maps to this project.
57
+
58
+ That's it — no manual ID entry. If the automatic link fails for any reason, Bridge tells
59
+ you and points you to Option B.
60
+
61
+ ---
62
+
63
+ ## Option B — Manual install + Installation ID (fallback)
64
+
65
+ Use this if the Connect GitHub button isn't available to you, or automatic linking
66
+ failed.
67
+
68
+ ### 1. Install the app
69
+
70
+ Go to the public install page and install it on the owning account/organization,
71
+ selecting the repository/repositories you want Bridge to access:
72
+
73
+ <https://github.com/apps/bridge-gpt-ai-tools-for-sfcc/installations/new>
74
+
75
+ (Same repository-selection and permissions-review screen as Option A, steps 3–5.)
76
+
77
+ ### 2. Find the Installation ID
78
+
79
+ The Installation ID is the trailing number in the app's **Configure** URL:
80
+
81
+ - **Personal account:** open **Settings → Applications → Installed GitHub Apps**, click
82
+ **Configure** next to *Bridge GPT - AI Tools for SFCC*. The URL is
83
+ `https://github.com/settings/installations/<INSTALLATION_ID>`.
84
+ - **Organization:** open **Organization Settings → Third-party Access → GitHub Apps**,
85
+ click **Configure** next to the app. The URL is
86
+ `https://github.com/organizations/<ORG>/settings/installations/<INSTALLATION_ID>`.
87
+
88
+ For example, `https://github.com/organizations/Bridge-GPT/settings/installations/61661616`
89
+ has Installation ID **`61661616`**.
90
+
91
+ ### 3. Enter it in Bridge
92
+
93
+ On your project's **Setup** page, in the GitHub section, paste the **Installation ID**
94
+ into the field provided and save. Make sure the project's **version control system** is
95
+ set to `github`. Bridge fills in the account owner and repository from your project
96
+ settings.
97
+
98
+ ---
99
+
100
+ ## Choosing repositories
101
+
102
+ When installing (either option), GitHub asks which repositories the app may access:
103
+
104
+ - **All repositories** — the app can access every current and future repo on the account.
105
+ - **Only select repositories** — pick specific repos from the **Select repositories**
106
+ dropdown. Recommended: grant only the repo(s) you actually want Bridge to work on.
107
+
108
+ You can change this later at any time: **Configure** the installation (paths above),
109
+ adjust **Repository access**, and click **Save**. If the app creates a repository, it is
110
+ automatically granted access to that repo.
111
+
112
+ ## What the app can access
113
+
114
+ At install time GitHub shows the **authoritative** list of permissions the app requests —
115
+ review it there. Functionally, the Bridge integration exercises these GitHub permissions:
116
+
117
+ | Permission | Why |
118
+ |---|---|
119
+ | **Contents** (read & write) | Read repo files for parsing/review; manage branch refs when opening/cleaning up PRs |
120
+ | **Pull requests** (read & write) | List/read PRs and diffs; post review comments and reviews; merge when auto-merge is enabled |
121
+ | **Checks / Commit statuses** (read) | Poll CI check-run and status results for a commit |
122
+ | **Administration** (read) | Read branch-protection required-status-checks to resolve which checks must pass |
123
+ | **Metadata** (read) | Baseline repo metadata; verify the installation's repository list |
124
+ | **Webhook events** | Receive `pull_request`, `installation`, and review/merge events that drive automated review and merge |
125
+
126
+ > These are inferred from the GitHub REST endpoints the integration calls. The exact set
127
+ > the app is *registered* with is shown by GitHub on the install screen; treat that
128
+ > screen as the source of truth.
129
+
130
+ ## Verifying the connection
131
+
132
+ After linking, confirm Bridge can act on the repo:
133
+
134
+ - The Bridge **Setup / integration status** should show version control as connected.
135
+ - A Bridge operation that needs GitHub — e.g. `create_pull_request`, `resolve_ci_checks`,
136
+ or `poll_ci_checks` from the MCP — should succeed rather than return a
137
+ "no VCS connection" refusal. (See
138
+ [MCP Tool Integration Dependencies](./mcp-tool-integrations.md) for which tools require
139
+ a VCS connection.)
140
+
141
+ If a GitHub-dependent tool refuses, the installation isn't linked to that project yet —
142
+ re-run Option A, or set the Installation ID via Option B.
143
+
144
+ ## Managing or removing the app
145
+
146
+ - **Change repo access / review permissions:** **Configure** the installation (URLs
147
+ above) → adjust **Repository access** → **Save**.
148
+ - **Uninstall:** on the same Configure page, scroll to **Danger zone → Uninstall**.
149
+ Uninstalling revokes Bridge's access immediately; existing stored installation IDs stop
150
+ working.
151
+
152
+ ---
153
+
154
+ ## Self-hosting / operator setup
155
+
156
+ *Skip this section if you are an end user connecting to a hosted Bridge deployment — it is
157
+ for whoever runs the Bridge API server.*
158
+
159
+ The GitHub App identity is configured **once per deployment** via environment variables.
160
+ Bridge uses the App private key to mint short-lived installation tokens on demand; it
161
+ persists no long-lived GitHub token.
162
+
163
+ | Env var | Value / purpose |
164
+ |---|---|
165
+ | `GIT_APP_ID` | The app's numeric App ID — `954077` for *Bridge GPT - AI Tools for SFCC*. |
166
+ | `GIT_PRIVATE_KEY` | **base64-encoded PEM** private key generated for the app (GitHub → app settings → *Generate a private key*). This is the one true secret. |
167
+ | `GITHUB_APP_INSTALL_URL` | The public install URL the **Connect GitHub** button sends users to: `https://github.com/apps/bridge-gpt-ai-tools-for-sfcc/installations/new`. |
168
+ | `GITHUB_WEBHOOK_SECRET` | App-level shared secret validating signed `installation` / merge webhooks. If unset, those webhooks are disabled (the redirect-callback path still works). |
169
+ | `BGPT_ENCRYPTION_KEY` | Fernet key used to encrypt per-repo credentials at rest. |
170
+
171
+ The app's **Setup URL** (in GitHub app settings) must point at the deployment's
172
+ `GET /setup/github/callback` endpoint so the post-install redirect can auto-link the
173
+ installation. Webhook endpoints used by the integration include the code-review hook
174
+ (e.g. `https://<deployment-host>/github/code-review`); configure these on the app to match
175
+ your deployment host.
176
+
177
+ > **Note:** an older placeholder app slug (`bridge-gpt-code-reviewer`) still appears as a
178
+ > stale default string in the codebase. The runtime install URL and App ID always come
179
+ > from `GITHUB_APP_INSTALL_URL` / `GIT_APP_ID`, so set those to the `954077` /
180
+ > `bridge-gpt-ai-tools-for-sfcc` values above rather than relying on the code default.
181
+
182
+ ## See also
183
+
184
+ - [MCP Tool Integration Dependencies](./mcp-tool-integrations.md) — which MCP tools need a
185
+ VCS connection (BLOCK) vs merely degrade without one.
186
+ - [Installing the SFCC Integration (OCAPI)](./sfcc-integration.md) — the separate
187
+ Salesforce B2C sandbox integration.
188
+ - GitHub docs: [Installing a GitHub App from a third party](https://docs.github.com/en/apps/using-github-apps/installing-a-github-app-from-a-third-party),
189
+ [Reviewing and modifying installed GitHub Apps](https://docs.github.com/en/apps/using-github-apps/reviewing-and-modifying-installed-github-apps).
@@ -0,0 +1,305 @@
1
+ # MCP Tools — Integration Dependencies
2
+
3
+ This catalog lists every tool exposed by the Bridge API MCP server
4
+ (`@bridge_gpt/mcp-server`) and the external integrations each one depends on. It
5
+ answers a single operational question: *before I call this tool, what needs to be
6
+ connected, and what happens if it isn't?*
7
+
8
+ For the tool **reference** (parameters, endpoints, examples) see the
9
+ [package README](../../README.md). The dependency classes below are not editorial —
10
+ they mirror the enforced policy in the Bridge API backend
11
+ (`api/library/vcs/vcs_route_operations.py`, the single source of truth for
12
+ route → capability gating, and its probes in `api/library/vcs/vcs_preflight.py`).
13
+
14
+ ## Two dependency classes
15
+
16
+ - **BLOCK** — the tool refuses, or its output is untrustworthy enough that it should
17
+ not be used, without the integration. This covers both hard blockers (the backend
18
+ returns a refusal) and "no local alternative" tools. Codebase-grounded generators
19
+ are blocked on an unindexed repo on purpose: *"plan output on an unindexed repo is
20
+ worthless"* (`api/routes/jira_api.py`). In code, BLOCK ≈ `VCS_ROUTE_REQUIREMENTS`
21
+ (VCS-credential refusal) + `INDEX_REQUIRED_ROUTE_KEYS` (parse/index refusal).
22
+
23
+ - **DEGRADE** — the tool still runs and returns useful output, but quality is weaker
24
+ without the integration. In code, DEGRADE ≈ `VCS_ROUTE_WARNINGS` (Tier-4
25
+ "warn, never block"): the shared research helper `plan_researcher` returns *empty*
26
+ code research instead of erroring, so the tool falls back to ticket text alone and
27
+ attaches a non-blocking disclosure.
28
+
29
+ **Baseline (assumed for every tool, not repeated below):** every non-`LOCAL` tool
30
+ needs the Bridge API reachable plus a valid API key with repo access
31
+ (`verify_repo_access`); every AI tool needs an LLM provider (platform-managed).
32
+ `LOCAL` tools make no backend call at all. A tool with no integration dependency is
33
+ marked **— none**.
34
+
35
+ ## Integrations glossary
36
+
37
+ | Integration | What "connected" means | Where configured |
38
+ |---|---|---|
39
+ | **Ticket backend** | A ticket store in the repo's `ticket_backend_mode` — `jira` (Jira connection) or `local` (Postgres, no external service). Default is `jira`. | `config_projects.ticket_backend_mode`; Jira token in `config_projects_access` |
40
+ | **Jira (only)** | A live Jira connection specifically — for surfaces with no local-mode equivalent (comment threads, binary attachments). | `config_projects_access.jira_api_token` |
41
+ | **Version control (VCS)** | GitHub App or Bitbucket credentials for the repo. | `git_app_installation_id` / `git_app_owner` (GitHub) or `workspace` / `version_control_access_token` (Bitbucket) |
42
+ | **Code index** | A **succeeded** `parse_repository` run (Pinecone code embeddings). A repo can have valid VCS creds yet never have been parsed. | `config_projects_access.pinecone_index_name`; status in `repository_parse_runs` / `code_repositories` |
43
+ | **SFCC OCAPI** | Salesforce B2C sandbox OCAPI access: `dw.json` / AM token + `version` config field + OCAPI grants. | `dw.json`, `version` config field, OCAPI data-API grants |
44
+ | **SFCC WebDAV logs** | WebDAV log credentials (separate from OCAPI) plus the `sfcc_log_monitor_enabled` flag. | `sfcc_webdav_hostname/username/access_key`, `sfcc_log_monitor_enabled` |
45
+ | **Deep-research flag** | The `deep_research_enabled` config flag on the project (403 otherwise). Web research runs via Gemini/OpenAI. | `config_projects.deep_research_enabled` |
46
+ | **Image provider** | An image model provider (OpenAI DALL·E / Google Imagen). | platform provider config |
47
+ | **Conductor ledger** | The local conductor event ledger (`~/.config/bridge/events.db`) — a local file, not a remote service. | local file |
48
+
49
+ ## Profiles (a form of BLOCK)
50
+
51
+ The server registers **90 tools** total, gated by `BRIDGE_MCP_PROFILE`
52
+ (comma-separated group list, resolved once at startup by
53
+ `mcp_server/src/mcp-profile.ts`). A tool outside
54
+ the active profile is **not registered at all** — an absolute block until the group is
55
+ activated. `core` is always implicitly included.
56
+
57
+ | Profile | Tools | Registered when |
58
+ |---|---|---|
59
+ | `core` | **57** | always |
60
+ | `pipeline-authoring` | **+5** | `BRIDGE_MCP_PROFILE` includes `pipeline-authoring` or `full` |
61
+ | `conductor` | **+8** | includes `conductor` or `full` |
62
+ | `sfcc` | **+20** (2 diagnostics ship in `core`; 18 gated) | includes `sfcc` or `full` |
63
+
64
+ (57 core + 5 + 8 + 20 = 90. The 5 pipeline-authoring tools live in `index.ts` alongside
65
+ core, gated by `ACTIVE_GROUPS.has("pipeline-authoring")`, so `index.ts` holds 62
66
+ `registerTool` calls.)
67
+
68
+ ---
69
+
70
+ ## Core profile (57)
71
+
72
+ ### Connectivity, config & setup — no integration deps
73
+
74
+ These are never gated (`NEVER_GATED_ROUTE_KEYS`) or run entirely locally.
75
+
76
+ | Tool | Dependencies (class) |
77
+ |---|---|
78
+ | `ping` | — none |
79
+ | `get_project_standards` | — none |
80
+ | `get_my_role` | — none |
81
+ | `config_field` (get/update/list) | — none |
82
+ | `get_install_manifest` | — none |
83
+ | `apply_install_manifest` | — none |
84
+ | `persist_routing_credential` | — none (`LOCAL`) |
85
+ | `get_docs_dir` | — none (`LOCAL`) |
86
+ | `get_parse_status` | — none |
87
+ | `track_ticket` | — none (Bridge DB tracking record) |
88
+ | `update_ticket_state` | — none (Bridge DB) |
89
+ | `get_ticket_state` | — none (Bridge DB) |
90
+ | `get_ticket_model_tier` | — none (Bridge DB difficulty) |
91
+ | `get_pipeline_recipe` | — none (`LOCAL`, bundled recipes) |
92
+ | `generate_decision_page` | — none (`LOCAL` HTML) |
93
+ | `cleanup_fresh_base` | — none (`LOCAL`) |
94
+
95
+ ### Ticket CRUD — ticket backend
96
+
97
+ Backend-agnostic (work in `jira` **or** `local` mode; Jira-named for v1 compatibility).
98
+ BLOCK applies only in `jira` mode without a Jira connection — `local` mode needs no
99
+ external integration.
100
+
101
+ | Tool | Dependencies (class) |
102
+ |---|---|
103
+ | `create_ticket` | Ticket backend **[BLOCK in jira mode]** |
104
+ | `get_tickets` | Ticket backend **[BLOCK in jira mode]** |
105
+ | `get_ticket` | Ticket backend **[BLOCK in jira mode]** |
106
+ | `update_ticket_description` | Ticket backend **[BLOCK in jira mode]** |
107
+ | `update_jira_status` | Ticket backend **[BLOCK in jira mode]** (local sets a fixed status) |
108
+ | `get_jira_transitions` | Ticket backend **[BLOCK in jira mode]** (local returns fixed statuses) |
109
+
110
+ Jira-only — no local-mode equivalent (comment threads and binary attachments are out of
111
+ scope for local v1):
112
+
113
+ | Tool | Dependencies (class) |
114
+ |---|---|
115
+ | `get_comments` | Jira (only) **[BLOCK]** |
116
+ | `add_comment` | Jira (only) **[BLOCK]** |
117
+ | `attachment` (upload/download/list) | Jira (only) **[BLOCK]** |
118
+
119
+ ### AI ticket-artifact generators — ticket backend + VCS + code index
120
+
121
+ All read the ticket through the ticket-store seam (`_fetch_ticket_webhook_payload` →
122
+ `ticket_store_lib.get_ticket`, which the local store fully supports), so they run in
123
+ `local` mode too — they are **not** hard-Jira-blocked. Their VCS/index behavior splits
124
+ by tier.
125
+
126
+ **Tier-3 — codebase-grounded (refuse without VCS creds AND a succeeded parse):**
127
+
128
+ | Tool (request / retrieve) | Dependencies (class) |
129
+ |---|---|
130
+ | `request_plan_generation` / `get_plan` | Ticket backend [BLOCK in jira mode] · VCS **[BLOCK]** · Code index **[BLOCK]** |
131
+ | `request_architecture` / `get_architecture` | Ticket backend [BLOCK in jira mode] · VCS **[BLOCK]** · Code index **[BLOCK]** |
132
+ | `request_reimplement_context` / `get_reimplement_context` | Ticket backend [BLOCK in jira mode] · VCS **[BLOCK]** · Code index **[BLOCK]** |
133
+ | `create_doc` / `get_doc` — `doc_type` ∈ {tdd, architecture} | Ticket backend [BLOCK in jira mode] · VCS **[BLOCK]** · Code index **[BLOCK]** |
134
+
135
+ **Tier-4 — ticket-text (warn, never block; research empties without index):**
136
+
137
+ | Tool (request / retrieve) | Dependencies (class) |
138
+ |---|---|
139
+ | `request_clarifying_questions` / `get_clarifying_questions` | Ticket backend [BLOCK in jira mode] · VCS **[DEGRADE]** · Code index **[DEGRADE]** |
140
+ | `request_ticket_critique` / `get_ticket_critique` | Ticket backend [BLOCK in jira mode] · VCS **[DEGRADE]** · Code index **[DEGRADE]** |
141
+ | `request_ticket_review` | Ticket backend [BLOCK in jira mode] · VCS **[DEGRADE]** · Code index **[DEGRADE]** |
142
+ | `request_prd` / `get_prd` | Ticket backend [BLOCK in jira mode] · VCS **[DEGRADE]** · Code index **[DEGRADE]** |
143
+ | `create_doc` / `get_doc` — `doc_type` ∈ {prd, fsd} | Ticket backend [BLOCK in jira mode] · VCS **[DEGRADE]** · Code index **[DEGRADE]** |
144
+
145
+ **Estimation:**
146
+
147
+ | Tool | Dependencies (class) |
148
+ |---|---|
149
+ | `estimate_epic` | Jira **[BLOCK]** (resolves the repo from `jira_ticket_key`); no code-index dep |
150
+
151
+ ### Repository parse / index — VCS
152
+
153
+ | Tool | Dependencies (class) |
154
+ |---|---|
155
+ | `parse_repository` | VCS **[BLOCK]** (Tier-2; refuses without a VCS connection — it *produces* the index) |
156
+ | `regenerate_directory_map` | VCS **[BLOCK]** (Tier-2) |
157
+
158
+ ### LLM utilities & research
159
+
160
+ | Tool | Dependencies (class) |
161
+ |---|---|
162
+ | `second_opinion` | — none (pure LLM; repo access only) |
163
+ | `generate_image` | — none beyond an image provider |
164
+ | `visual_diff` | — none (`LOCAL` render + pixel diff; needs a reachable `target_url`) |
165
+ | `request_deep_research` / `get_deep_research` | Deep-research flag **[BLOCK]** (403 if `deep_research_enabled` off) |
166
+ | `request_brainstorm` / `get_brainstorm` | Code index **[BLOCK] for `technical`/`discovery` modes**; **— none for `design` mode** |
167
+
168
+ ### VCS & CI
169
+
170
+ | Tool | Dependencies (class) |
171
+ |---|---|
172
+ | `create_pull_request` | VCS **[BLOCK]** (Tier-1) |
173
+ | `resolve_ci_checks` | VCS **[BLOCK]** (Tier-1) |
174
+ | `poll_ci_checks` | VCS **[BLOCK]** (Tier-1); also **hidden until `ci_check_config` is resolved** (needs a prior `resolve_ci_checks`) |
175
+ | `materialize_fresh_base` | VCS / git base ref **[BLOCK]** (Tier-1; materializes a pinned base tree) |
176
+
177
+ ### Full-automation (composite)
178
+
179
+ These orchestrate an idea → ticket → review → start chain, so they inherit the
180
+ **strictest** dependency of every child step.
181
+
182
+ | Tool | Dependencies (class) |
183
+ |---|---|
184
+ | `run_full_automation` | Ticket backend [BLOCK in jira mode] · VCS **[BLOCK]** · Code index **[BLOCK]** (via child plan/review steps) |
185
+ | `resume_full_automation` | Same as `run_full_automation` |
186
+
187
+ ---
188
+
189
+ ## `pipeline-authoring` profile (5)
190
+
191
+ Profile-gated **[BLOCK]** to register at all. `run_pipeline` / `resume_pipeline`
192
+ additionally inherit the dependencies of whatever steps the invoked pipeline runs
193
+ (e.g. the `implement-ticket` pipeline pulls in ticket-backend + VCS + code-index deps).
194
+ Run state is persisted via the Bridge API.
195
+
196
+ | Tool | Dependencies (class) |
197
+ |---|---|
198
+ | `list_pipelines` | Profile-gated **[BLOCK]** |
199
+ | `run_pipeline` | Profile-gated **[BLOCK]** · inherits invoked pipeline's step deps |
200
+ | `resume_pipeline` | Profile-gated **[BLOCK]** · inherits invoked pipeline's step deps |
201
+ | `list_pipeline_runs` | Profile-gated **[BLOCK]** |
202
+ | `delete_pipeline_run` | Profile-gated **[BLOCK]** |
203
+
204
+ ---
205
+
206
+ ## `conductor` profile (8)
207
+
208
+ Profile-gated **[BLOCK]** to register. Most operate on the **local** conductor ledger
209
+ (`~/.config/bridge/events.db`), so beyond the profile gate they have no remote
210
+ integration dependency.
211
+
212
+ | Tool | Dependencies (class) |
213
+ |---|---|
214
+ | `emit_event` | Profile-gated **[BLOCK]**; else `LOCAL` ledger |
215
+ | `poll_events` | Profile-gated **[BLOCK]**; else `LOCAL` ledger |
216
+ | `wait_for_event` | Profile-gated **[BLOCK]**; else `LOCAL` ledger |
217
+ | `get_supervisor_snapshot` | Profile-gated **[BLOCK]**; else `LOCAL` ledger |
218
+ | `send_message` | Profile-gated **[BLOCK]**; else `LOCAL` relay |
219
+ | `check_messages` | Profile-gated **[BLOCK]**; else `LOCAL` relay |
220
+ | `get_epic_snapshot` | Profile-gated **[BLOCK]** · Bridge API epic snapshot (Jira epic keys) |
221
+ | `wait_for_done_gate` | Profile-gated **[BLOCK]** · VCS **[BLOCK]** (resolves PR number + head SHA) |
222
+
223
+ ---
224
+
225
+ ## `sfcc` group (20)
226
+
227
+ ### Always-on diagnostics (ship in `core`)
228
+
229
+ | Tool | Dependencies (class) |
230
+ |---|---|
231
+ | `sfcc_setup_status` | — none (its purpose is to report which SFCC prerequisites are missing) |
232
+ | `check_permissions` | SFCC OCAPI **[BLOCK]** (probes OCAPI; reports not-OK without access / version config) |
233
+
234
+ ### Gated behind the `sfcc` group (18)
235
+
236
+ All are profile-gated **[BLOCK]** to register, and all require SFCC OCAPI creds +
237
+ `version` config + a reachable sandbox → SFCC OCAPI **[BLOCK]**. Writes are
238
+ sandbox-only and destructive.
239
+
240
+ **Reads (8):**
241
+
242
+ | Tool | Dependencies (class) |
243
+ |---|---|
244
+ | `system_object_list` | Profile-gated **[BLOCK]** · SFCC OCAPI **[BLOCK]** |
245
+ | `system_object_get` | Profile-gated **[BLOCK]** · SFCC OCAPI **[BLOCK]** |
246
+ | `system_object_attribute_search` | Profile-gated **[BLOCK]** · SFCC OCAPI **[BLOCK]** |
247
+ | `custom_object_definition_attributes_get` | Profile-gated **[BLOCK]** · SFCC OCAPI **[BLOCK]** |
248
+ | `custom_object_definition_attribute_search` | Profile-gated **[BLOCK]** · SFCC OCAPI **[BLOCK]** |
249
+ | `site_preference_group_list` | Profile-gated **[BLOCK]** · SFCC OCAPI **[BLOCK]** |
250
+ | `site_preference_get` | Profile-gated **[BLOCK]** · SFCC OCAPI **[BLOCK]** |
251
+ | `site_preference_search` | Profile-gated **[BLOCK]** · SFCC OCAPI **[BLOCK]** |
252
+
253
+ **Writes (9, sandbox-only):**
254
+
255
+ | Tool | Dependencies (class) |
256
+ |---|---|
257
+ | `system_object_attribute_definition_create` | Profile-gated **[BLOCK]** · SFCC OCAPI write **[BLOCK]** |
258
+ | `system_object_attribute_definition_update` | Profile-gated **[BLOCK]** · SFCC OCAPI write **[BLOCK]** |
259
+ | `system_object_attribute_group_create` | Profile-gated **[BLOCK]** · SFCC OCAPI write **[BLOCK]** |
260
+ | `system_object_attribute_group_update` | Profile-gated **[BLOCK]** · SFCC OCAPI write **[BLOCK]** |
261
+ | `system_object_attribute_assign_to_group` | Profile-gated **[BLOCK]** · SFCC OCAPI write **[BLOCK]** |
262
+ | `custom_preference_definition_create` | Profile-gated **[BLOCK]** · SFCC OCAPI write **[BLOCK]** |
263
+ | `custom_object_definition_attribute_create` | Profile-gated **[BLOCK]** · SFCC OCAPI write **[BLOCK]** |
264
+ | `custom_object_definition_attribute_update` | Profile-gated **[BLOCK]** · SFCC OCAPI write **[BLOCK]** |
265
+ | `site_preference_values_set` | Profile-gated **[BLOCK]** · SFCC OCAPI write **[BLOCK]** |
266
+
267
+ **Logs (1):**
268
+
269
+ | Tool | Dependencies (class) |
270
+ |---|---|
271
+ | `sfcc_log_query` | Profile-gated **[BLOCK]** · SFCC WebDAV creds **[BLOCK]** · `sfcc_log_monitor_enabled` **[BLOCK]** · required `environment` scope |
272
+
273
+ ---
274
+
275
+ ## Quick matrix: integration → dependent tools
276
+
277
+ | Integration | BLOCK without it | DEGRADE without it |
278
+ |---|---|---|
279
+ | **Ticket backend** (jira mode) | `create_ticket`, `get_ticket(s)`, `update_ticket_description`, `update_jira_status`, `get_jira_transitions`, and every AI generator (they read the ticket) | — |
280
+ | **Jira (only)** | `get_comments`, `add_comment`, `attachment`, `estimate_epic` | — |
281
+ | **Version control (VCS)** | `create_pull_request`, `resolve_ci_checks`, `poll_ci_checks`, `materialize_fresh_base`, `parse_repository`, `regenerate_directory_map`, `wait_for_done_gate`; **Tier-3** `request_plan_generation`/`get_plan`, `request_architecture`/`get_architecture`, `request_reimplement_context`/`get_reimplement_context`, `create_doc`(tdd/architecture) | **Tier-4** `request_clarifying_questions`, `request_ticket_critique`, `request_ticket_review`, `request_prd`, `create_doc`(prd/fsd) |
282
+ | **Code index** (succeeded parse) | Tier-3 plan/architecture/reimplement/`create_doc`(tdd/architecture); `request_brainstorm` in `technical`/`discovery` modes | Tier-4 clarifying-questions/critique/review/prd/fsd |
283
+ | **SFCC OCAPI** | `check_permissions` + all 16 SFCC read/write tools | — |
284
+ | **SFCC WebDAV logs** | `sfcc_log_query` | — |
285
+ | **Deep-research flag** | `request_deep_research`, `get_deep_research` | — |
286
+ | **Profile gating** | all `pipeline-authoring` (5), `conductor` (8), gated `sfcc` (18) tools | — |
287
+
288
+ ## Notes & caveats
289
+
290
+ - **Refusals are graceful.** VCS/index BLOCKs are enforced by
291
+ `build_vcs_preflight_refusal_response`; they return a refusal in the route's normal
292
+ success-class status (e.g. 202 for job-submit routes) rather than a new 4xx/5xx, so a
293
+ capability gap never looks like a server error.
294
+ - **DEGRADE is deliberately non-fatal.** Tier-4 tools attach a disclosure via
295
+ `build_vcs_preflight_warning_disclosure`; `plan_researcher` returns empty research on
296
+ an unindexed repo instead of raising — the same fallback the Tier-3 routes rely on.
297
+ - **Index check fails open.** A transient DB error during the index probe collapses to
298
+ "available" (blocking an indexed repo on a flaky read is worse than a rare ungrounded
299
+ generation). Legacy repos parsed before `repository_parse_runs` existed fall back to a
300
+ `code_repositories` existence check and are not falsely refused.
301
+ - **Ticket-backend default is `jira`.** The seam is fail-safe: any config/DAL problem
302
+ resolves to `jira`, so a misconfigured repo behaves as jira-mode (and thus BLOCKs
303
+ without a Jira connection) rather than silently using local.
304
+ - **Baseline is assumed.** A reachable Bridge API + valid API key (and, for AI tools, an
305
+ LLM provider) underlies everything above and is not listed per tool.