@bridge_gpt/mcp-server 0.2.57 → 0.2.58

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
@@ -242,13 +242,16 @@ npx -y @bridge_gpt/mcp-server doctor
242
242
  `doctor` is strictly read-only. It reports what it found — configs, registrations,
243
243
  credential availability, prerequisites — and changes nothing.
244
244
 
245
- **Codex approval profile.** When selecting Codex during `install`, opt in at the
246
- prompt or pass `--tools=codex --codex-profile=on` in a scripted install. Bridge
245
+ **Codex approval profile.** When selecting Codex during interactive `install`,
246
+ press Enter to accept the default Yes at the profile prompt, or answer `n`/`no`
247
+ to decline. Pass `--tools=codex --codex-profile=on` in a scripted install. Bridge
247
248
  creates `$CODEX_HOME/bridge.config.toml` (default `~/.codex/bridge.config.toml`)
248
249
  with approval settings for the tools used by its review and implementation
249
250
  workflows. Bridge-spawned Codex workers then select it automatically, including
250
251
  the fresh implementation session after review. Pass `--codex-profile=off` to
251
- decline; the installer leaves any existing profile content intact. If a profile
252
+ decline; the installer leaves any existing profile content intact. On package
253
+ upgrade, the next Bridge-spawned worker refreshes an older, unmodified managed
254
+ profile before launch. If a profile
252
255
  already contains user-authored or conflicting content, the installer leaves it
253
256
  untouched and reports that workers cannot use it. Run `doctor --agent codex` to
254
257
  inspect the current status. To use the profile in a Codex session you open
@@ -365,7 +368,7 @@ later boot.
365
368
  "mcpServers": {
366
369
  "bridge": {
367
370
  "command": "npx",
368
- "args": ["-y", "--prefer-offline", "@bridge_gpt/mcp-server@0.2.57", "serve"],
371
+ "args": ["-y", "--prefer-offline", "@bridge_gpt/mcp-server@0.2.58", "serve"],
369
372
  "env": {
370
373
  "BAPI_BASE_URL": "https://bridgegpt-api.com",
371
374
  "BAPI_REPO_NAME": "your-repo",
@@ -387,7 +390,7 @@ later boot.
387
390
  "bridge": {
388
391
  "type": "stdio",
389
392
  "command": "npx",
390
- "args": ["-y", "--prefer-offline", "@bridge_gpt/mcp-server@0.2.57", "serve"],
393
+ "args": ["-y", "--prefer-offline", "@bridge_gpt/mcp-server@0.2.58", "serve"],
391
394
  "env": {
392
395
  "BAPI_BASE_URL": "https://bridgegpt-api.com",
393
396
  "BAPI_REPO_NAME": "your-repo",
@@ -409,7 +412,7 @@ later boot.
409
412
  "bridge": {
410
413
  "type": "stdio",
411
414
  "command": "npx",
412
- "args": ["-y", "--prefer-offline", "@bridge_gpt/mcp-server@0.2.57", "serve"],
415
+ "args": ["-y", "--prefer-offline", "@bridge_gpt/mcp-server@0.2.58", "serve"],
413
416
  "env": {
414
417
  "BAPI_BASE_URL": "https://bridgegpt-api.com",
415
418
  "BAPI_REPO_NAME": "your-repo",
@@ -432,7 +435,7 @@ Windsurf only supports global MCP configuration.
432
435
  "mcpServers": {
433
436
  "bridge": {
434
437
  "command": "npx",
435
- "args": ["-y", "--prefer-offline", "@bridge_gpt/mcp-server@0.2.57", "serve"],
438
+ "args": ["-y", "--prefer-offline", "@bridge_gpt/mcp-server@0.2.58", "serve"],
436
439
  "env": {
437
440
  "BAPI_BASE_URL": "https://bridgegpt-api.com",
438
441
  "BAPI_REPO_NAME": "your-repo",
@@ -451,7 +454,7 @@ Windsurf only supports global MCP configuration.
451
454
  ```toml
452
455
  [mcp_servers.bridge]
453
456
  command = "npx"
454
- args = ["-y", "--prefer-offline", "@bridge_gpt/mcp-server@0.2.57", "serve"]
457
+ args = ["-y", "--prefer-offline", "@bridge_gpt/mcp-server@0.2.58", "serve"]
455
458
 
456
459
  [mcp_servers.bridge.env]
457
460
  BAPI_BASE_URL = "https://bridgegpt-api.com"
@@ -1569,7 +1572,7 @@ The authoritative tool catalog covers **75 tools** (enumerated below). What's ac
1569
1572
  - **Jira tickets** — `get_tickets`, `get_ticket`, `create_ticket`, `update_ticket_description`, `add_comment`, `get_comments`
1570
1573
  - **Attachments** — `attachment` (operations: `upload`, `download`, `list`)
1571
1574
  - **AI generation (request/get)** — `request_plan_generation`/`get_plan`, `create_doc`/`get_doc` (design docs by `doc_type`: tdd/architecture/fsd/prd, where `architecture` is an alias of `tdd`), `request_ticket_review` (writes both `get_clarifying_questions` and `get_ticket_critique`), `request_reimplement_context`/`get_reimplement_context`, `request_council`/`get_council`, `request_deep_research`/`get_deep_research`
1572
- - **Bounded waits** — `wait_for_ticket_review`, `wait_for_ci_checks`. Each call waits at most 240 s and returns `state: "ready" | "pending" | "error"`; `pending` is a normal, resumable result you call again on, never a failure. They exist so an agent can wait without a foreground `sleep` and without binding a long server-side operation to the 900 s MCP client deadline. `wait_for_ci_checks` reports only that checks are **terminal** — deciding pass or fail stays with the caller.
1575
+ - **Bounded waits** — `wait_for_ticket_review`, `wait_for_ci_checks`. Each returns `state: "ready" | "pending" | "error"`; review waits default to 20 s and CI waits default to 240 s (both accept up to 240 s explicitly). `pending` is a normal, resumable result you call again on, never a failure. They exist so an agent can wait without a foreground `sleep` and without binding a long server-side operation to the 900 s MCP client deadline. `wait_for_ci_checks` reports only that checks are **terminal** — deciding pass or fail stays with the caller.
1573
1576
  - **Other AI** — `second_opinion`, `generate_image`, `generate_decision_page`, `visual_diff` (deterministic pixel diff of a rendered URL vs a design comp)
1574
1577
  - **Ticket lifecycle** — `track_ticket`, `update_ticket_state`, `get_ticket_state`, `get_ticket_state_tree` (live repo-wide lifecycle + dependency tree; read-only, no mutation parameter)
1575
1578
  - **Jira status** — `update_jira_status` (pass `status: "auto"` to resolve the configured post-PR status server-side)
@@ -13,6 +13,7 @@ export const BRIDGE_WORKFLOW_TOOLS = [
13
13
  "ping", "get_ticket", "get_pipeline_recipe", "request_ticket_review",
14
14
  "wait_for_ticket_review", "fresh_base", "generate_decision_page",
15
15
  "capture_review_decisions", "request_plan_generation", "get_plan",
16
+ "attachment",
16
17
  "get_phase_context", "record_phase_result", "create_pull_request",
17
18
  "update_jira_status", "config_field", "resolve_ci_checks", "poll_ci_checks",
18
19
  "wait_for_ci_checks",
@@ -76,8 +77,11 @@ export async function inspectBridgeCodexProfile(home, readFile) {
76
77
  return { status: "declined", key };
77
78
  if (profile === null || !("hash" in parsed) || typeof parsed.hash !== "string")
78
79
  return { status: "conflict", key };
79
- if (profile !== renderBridgeCodexProfile(key) || fingerprint(profile) !== parsed.hash)
80
+ if (fingerprint(profile) !== parsed.hash)
80
81
  return { status: "conflict", key };
82
+ if (profile !== renderBridgeCodexProfile(key)) {
83
+ return { status: profile.startsWith(MARKER) ? "stale" : "conflict", key };
84
+ }
81
85
  return { status: "active", key };
82
86
  }
83
87
  export async function configureBridgeCodexProfile(home, choice, deps) {
@@ -2,7 +2,7 @@
2
2
  import { readBridgeConfig } from "./bridge-config.js";
3
3
  import { codexBridgeTableNames } from "./mcp-host-config.js";
4
4
  import { codexHome } from "./codex-home.js";
5
- import { codexProfilePaths, inspectBridgeCodexProfile, BRIDGE_CODEX_PROFILE } from "./codex-bridge-profile.js";
5
+ import { codexProfilePaths, configureBridgeCodexProfile, inspectBridgeCodexProfile, BRIDGE_CODEX_PROFILE } from "./codex-bridge-profile.js";
6
6
  import { buildMcpServerEntriesForManifest, normalizeWorktreePathForRegistration, } from "./mcp-provisioning.js";
7
7
  import { MCP_SERVER_NAME } from "./mcp-identity.js";
8
8
  /** A missing Bridge target is a launch failure, never a fallback to user-scoped config. */
@@ -39,7 +39,18 @@ export async function resolveCodexLaunchScope(root, deps, codexConfigPath = code
39
39
  }
40
40
  const bridgeKey = registeredNames[0] ?? MCP_SERVER_NAME;
41
41
  const home = codexHome(deps.env ?? process.env, deps.homedir?.());
42
- const profile = await inspectBridgeCodexProfile(home, deps.readFile);
42
+ let profile = await inspectBridgeCodexProfile(home, deps.readFile);
43
+ if (profile.status === "stale") {
44
+ try {
45
+ profile = await configureBridgeCodexProfile(home, "enable", deps);
46
+ }
47
+ catch {
48
+ return { ok: false, error: "Codex MCP scope unavailable: could not refresh the managed Bridge approval profile." };
49
+ }
50
+ if (profile.status !== "active") {
51
+ return { ok: false, error: "Codex MCP scope unavailable: managed Bridge approval profile refresh failed." };
52
+ }
53
+ }
43
54
  const argv = ["-C", normalized.path];
44
55
  if (profile.status === "active" && profile.key === bridgeKey)
45
56
  argv.push("--profile", BRIDGE_CODEX_PROFILE);