@bridge_gpt/mcp-server 0.2.58 → 0.2.60

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (127) hide show
  1. package/README.md +231 -113
  2. package/build/agent-guidance.generated.js +1 -1
  3. package/build/agent-notes.js +7 -1
  4. package/build/agent-registry.js +15 -0
  5. package/build/agent-utils.js +16 -8
  6. package/build/claude-user-config-doctor.js +1 -35
  7. package/build/codex-bridge-profile.js +1 -1
  8. package/build/commands.generated.js +7 -8
  9. package/build/conductor/bridge-api-client.js +202 -2
  10. package/build/conductor/bring-up-facts.js +1 -1
  11. package/build/conductor/claude-hook.js +16 -16
  12. package/build/conductor/doctor.js +279 -72
  13. package/build/conductor/epic-implementer-cli.js +38 -5
  14. package/build/conductor/epic-reconcile.js +1 -1
  15. package/build/conductor/epic-runtime.js +21 -12
  16. package/build/conductor/errors.js +3 -3
  17. package/build/conductor/file-scope-guard.js +4 -4
  18. package/build/conductor/git-ci-types.js +1 -1
  19. package/build/conductor/git-inspection.js +2 -2
  20. package/build/conductor/install-doctor.js +28 -6
  21. package/build/conductor/local-merge.js +319 -26
  22. package/build/conductor/merge-execution-contract.js +61 -0
  23. package/build/conductor/merge-execution-eligibility.js +129 -0
  24. package/build/conductor/merge-ledger.js +2 -2
  25. package/build/conductor/pr-ci-producer.js +6 -6
  26. package/build/conductor/pr-review-producer.js +2 -2
  27. package/build/conductor/producer-ledger.js +2 -0
  28. package/build/conductor/readiness-sections.js +166 -9
  29. package/build/conductor/readiness.js +97 -16
  30. package/build/conductor/recovery-cli.js +243 -12
  31. package/build/conductor/recovery-operations.js +64 -6
  32. package/build/conductor/repair-contract.js +38 -4
  33. package/build/conductor/spec-review-producer.js +6 -6
  34. package/build/conductor/store.js +10 -10
  35. package/build/conductor/supervisor-config.js +14 -14
  36. package/build/conductor/supervisor-ledger.js +2 -2
  37. package/build/conductor/supervisor-message-relay.js +2 -2
  38. package/build/conductor/worker-ledger-cli.js +19 -19
  39. package/build/conductor-bundle-artifacts.js +2 -2
  40. package/build/connect-bitbucket-api.js +6 -1
  41. package/build/connect-bitbucket.js +398 -88
  42. package/build/credential-store.js +16 -0
  43. package/build/docs.generated.js +2 -2
  44. package/build/doctor.js +199 -303
  45. package/build/drive-epic.js +88 -71
  46. package/build/epic-implementer-bin.js +22 -17
  47. package/build/epic-implementer-claude-hook-bin.js +4 -2
  48. package/build/epic-implementer-env.js +184 -0
  49. package/build/epic-integration-pr.js +2 -2
  50. package/build/executor/ci-rerun-job.js +269 -0
  51. package/build/executor/cli.js +31 -0
  52. package/build/executor/credentials.js +11 -0
  53. package/build/executor/env.js +79 -8
  54. package/build/executor/heartbeat.js +1 -1
  55. package/build/executor/index.js +21 -4
  56. package/build/executor/job-errors.js +3 -3
  57. package/build/executor/job-runner.js +127 -1
  58. package/build/executor/job-types.js +12 -2
  59. package/build/executor/merge-job.js +46 -5
  60. package/build/executor/observation.js +1 -1
  61. package/build/executor/preflight.js +1 -1
  62. package/build/executor/prompt-spec.js +1 -1
  63. package/build/executor/reconcile-overlap-job.js +10 -130
  64. package/build/executor/reconcile-overlap-types.js +1 -1
  65. package/build/executor/runner.js +1 -1
  66. package/build/executor/service-lifecycle.js +136 -0
  67. package/build/executor/service-unit.js +427 -9
  68. package/build/executor/types.js +5 -0
  69. package/build/index.js +320 -342
  70. package/build/init.js +20 -28
  71. package/build/install-bridge-conductor.js +208 -15
  72. package/build/install-bridge.js +555 -37
  73. package/build/mcp-host-entry-adapter.js +6 -0
  74. package/build/mcp-host-targets.js +2 -0
  75. package/build/mcp-install-state.js +42 -4
  76. package/build/mcp-invoke.js +5 -5
  77. package/build/mcp-profile.js +2 -2
  78. package/build/mcp-provisioning.js +2 -2
  79. package/build/mcp-server-invocation.js +3 -3
  80. package/build/merge-pull-request.js +118 -10
  81. package/build/merge-workflow-codeowners.js +224 -0
  82. package/build/merge-workflow-config.js +133 -0
  83. package/build/merge-workflow-drift.js +66 -0
  84. package/build/merge-workflow-install.js +638 -0
  85. package/build/merge-workflow.js +572 -0
  86. package/build/model-routing-host.js +25 -0
  87. package/build/model-routing-preferences.js +99 -0
  88. package/build/pipelines.generated.js +10 -10
  89. package/build/{plan-epic-conductor-eligibility.js → plan-epic-implementer-eligibility.js} +18 -16
  90. package/build/plan-execution-ledger.js +8 -0
  91. package/build/plane/cli.js +24 -2
  92. package/build/plane/member-roster.js +5 -5
  93. package/build/plane/preflight.js +68 -0
  94. package/build/plane/supervisor.js +1 -1
  95. package/build/plane/types.js +5 -5
  96. package/build/readiness-check.js +1 -1
  97. package/build/readme.generated.js +1 -1
  98. package/build/review-tickets.js +4 -4
  99. package/build/run-unit-tests-launcher.js +5 -0
  100. package/build/setup-epic.js +171 -17
  101. package/build/start-tickets-conductor.js +32 -32
  102. package/build/start-tickets-prereqs.js +4 -9
  103. package/build/start-tickets.js +475 -91
  104. package/build/version.generated.js +3 -3
  105. package/docs/CONDUCTOR.md +69 -18
  106. package/docs/install/mcp-tool-integrations.md +2 -1
  107. package/package.json +4 -4
  108. package/pipelines/implement-ticket.json +1 -1
  109. package/pipelines/plan-epic.json +2 -2
  110. package/build/conduct-epic/bridge-client.js +0 -773
  111. package/build/conduct-epic/checkpoint-store.js +0 -542
  112. package/build/conduct-epic/cli.js +0 -3145
  113. package/build/conduct-epic/cut-protocol.js +0 -392
  114. package/build/conduct-epic/lock.js +0 -302
  115. package/build/conduct-epic/pr-state.js +0 -286
  116. package/build/conduct-epic/spawn.js +0 -113
  117. package/build/conductor/cli.js +0 -1278
  118. package/build/conductor-bundle-cli.js +0 -256
  119. package/build/direct-ticket-tools.js +0 -70
  120. package/build/executor/reconcile-overlap-governance.js +0 -129
  121. package/build/implement-epic/checkpoint-store.js +0 -542
  122. package/build/implement-epic/cli.js +0 -3158
  123. package/build/implement-epic/lock.js +0 -302
  124. package/build/implement-epic/pr-state.js +0 -286
  125. package/build/implement-epic/spawn.js +0 -113
  126. /package/build/{implement-epic → epic-shared}/bridge-client.js +0 -0
  127. /package/build/{implement-epic → epic-shared}/cut-protocol.js +0 -0
@@ -86,11 +86,11 @@ export async function emitSupervisorAssessmentIfNew(input, deps = {}) {
86
86
  };
87
87
  const event = {
88
88
  id: eventId,
89
- source: "conductor-supervisor",
89
+ source: "epic-implementer-supervisor",
90
90
  type: "supervisor.assessment",
91
91
  run_id: input.run_id,
92
92
  worker_id: input.idempotency.worker_id ?? input.worker_id ?? null,
93
- producer: "conductor-supervisor",
93
+ producer: "epic-implementer-supervisor",
94
94
  observed_via: "supervisor",
95
95
  data: {
96
96
  summary: `supervisor assessment: ${input.idempotency.reason}`,
@@ -40,7 +40,7 @@ export function buildSupervisorEscalationWorkerMessage(candidate, assessment, st
40
40
  status: "escalated",
41
41
  details,
42
42
  },
43
- source: "conductor-supervisor",
43
+ source: "epic-implementer-supervisor",
44
44
  producer: "worker-message-relay",
45
45
  };
46
46
  }
@@ -71,7 +71,7 @@ export function buildSupervisorRemediationWorkerMessage(input) {
71
71
  truncated: input.truncated,
72
72
  },
73
73
  },
74
- source: "conductor-supervisor",
74
+ source: "epic-implementer-supervisor",
75
75
  producer: "worker-message-relay",
76
76
  };
77
77
  }
@@ -6,12 +6,12 @@
6
6
  * Every worker-facing ledger operation (`check_messages`, and the
7
7
  * `wait_for_done_gate` event emit) therefore runs through this module, which
8
8
  * shells out to the packaged `conductor-bin.js` CLI executed by the conductor
9
- * Node runtime captured at dispatch time in `CONDUCTOR_NODE_PATH`. Conductor-OWNED
9
+ * Node runtime captured at dispatch time in `EPIC_IMPLEMENTER_NODE_PATH`. Conductor-OWNED
10
10
  * processes (the CLI itself, the supervisor/epic runtimes) keep calling
11
11
  * `store.ts` directly — they legitimately own the native load.
12
12
  *
13
- * Hard-fail contract: when `CONDUCTOR_NODE_PATH` is missing/invalid or
14
- * `BAPI_CONDUCTOR_CLI_FILE` is absent, this boundary throws a typed
13
+ * Hard-fail contract: when `EPIC_IMPLEMENTER_NODE_PATH` is missing/invalid or
14
+ * `BAPI_EPIC_IMPLEMENTER_CLI_FILE` is absent, this boundary throws a typed
15
15
  * {@link ConductorLedgerSubprocessRuntimeError} rather than silently falling back
16
16
  * to the worker's own `process.execPath`. Falling back would re-introduce the
17
17
  * native load into the worker Node — the exact failure mode this slice removes.
@@ -33,9 +33,9 @@ import { isAbsolute as pathIsAbsolute } from "node:path";
33
33
  import { ConductorLedgerSubprocessRuntimeError, ConductorWorkerContextRequiredError, } from "./errors.js";
34
34
  import { makeProducerDedupeKey, makeStableProducerEventId, } from "./producer-ledger.js";
35
35
  /** The env key that carries the captured conductor Node executable path. */
36
- export const CONDUCTOR_NODE_PATH_ENV = "CONDUCTOR_NODE_PATH";
36
+ export const EPIC_IMPLEMENTER_NODE_PATH_ENV = "EPIC_IMPLEMENTER_NODE_PATH";
37
37
  /** The (pre-existing) env key that carries the packaged `conductor-bin.js` path. */
38
- export const BAPI_CONDUCTOR_CLI_FILE_ENV = "BAPI_CONDUCTOR_CLI_FILE";
38
+ export const BAPI_EPIC_IMPLEMENTER_CLI_FILE_ENV = "BAPI_EPIC_IMPLEMENTER_CLI_FILE";
39
39
  /**
40
40
  * Bounded stdout buffer for a conductor CLI response. Conductor JSON responses
41
41
  * (message batches / emit summaries) are small; 8 MiB is generous headroom while
@@ -60,9 +60,9 @@ function nonEmpty(value) {
60
60
  /**
61
61
  * Validate and resolve the worker-ledger subprocess runtime from the environment.
62
62
  *
63
- * `CONDUCTOR_NODE_PATH` must be set, non-empty, and an ABSOLUTE path (a relative
63
+ * `EPIC_IMPLEMENTER_NODE_PATH` must be set, non-empty, and an ABSOLUTE path (a relative
64
64
  * value like `node` / `./node` is rejected as `invalid` — it must never resolve
65
- * against `PATH` or the worker cwd). `BAPI_CONDUCTOR_CLI_FILE` must be set and
65
+ * against `PATH` or the worker cwd). `BAPI_EPIC_IMPLEMENTER_CLI_FILE` must be set and
66
66
  * non-empty. On any failure this throws a typed
67
67
  * {@link ConductorLedgerSubprocessRuntimeError}; it NEVER falls back to
68
68
  * `process.execPath`.
@@ -83,24 +83,24 @@ export function resolveWorkerLedgerCliRuntime(deps = {}) {
83
83
  const isAbsolute = deps.isAbsolute ?? pathIsAbsolute;
84
84
  // `undefined` specifically — an env var SET to "" is present-but-invalid and
85
85
  // falls through to the fail-loud path below.
86
- if (env[CONDUCTOR_NODE_PATH_ENV] === undefined &&
87
- env[BAPI_CONDUCTOR_CLI_FILE_ENV] === undefined) {
86
+ if (env[EPIC_IMPLEMENTER_NODE_PATH_ENV] === undefined &&
87
+ env[BAPI_EPIC_IMPLEMENTER_CLI_FILE_ENV] === undefined) {
88
88
  throw new ConductorWorkerContextRequiredError([
89
- CONDUCTOR_NODE_PATH_ENV,
90
- BAPI_CONDUCTOR_CLI_FILE_ENV,
89
+ EPIC_IMPLEMENTER_NODE_PATH_ENV,
90
+ BAPI_EPIC_IMPLEMENTER_CLI_FILE_ENV,
91
91
  ]);
92
92
  }
93
- const nodePathRaw = env[CONDUCTOR_NODE_PATH_ENV];
93
+ const nodePathRaw = env[EPIC_IMPLEMENTER_NODE_PATH_ENV];
94
94
  if (!nonEmpty(nodePathRaw)) {
95
- throw new ConductorLedgerSubprocessRuntimeError("missing", CONDUCTOR_NODE_PATH_ENV);
95
+ throw new ConductorLedgerSubprocessRuntimeError("missing", EPIC_IMPLEMENTER_NODE_PATH_ENV);
96
96
  }
97
97
  const nodePath = nodePathRaw.trim();
98
98
  if (!isAbsolute(nodePath)) {
99
- throw new ConductorLedgerSubprocessRuntimeError("invalid", CONDUCTOR_NODE_PATH_ENV);
99
+ throw new ConductorLedgerSubprocessRuntimeError("invalid", EPIC_IMPLEMENTER_NODE_PATH_ENV);
100
100
  }
101
- const cliFileRaw = env[BAPI_CONDUCTOR_CLI_FILE_ENV];
101
+ const cliFileRaw = env[BAPI_EPIC_IMPLEMENTER_CLI_FILE_ENV];
102
102
  if (!nonEmpty(cliFileRaw)) {
103
- throw new ConductorLedgerSubprocessRuntimeError("cli_missing", BAPI_CONDUCTOR_CLI_FILE_ENV);
103
+ throw new ConductorLedgerSubprocessRuntimeError("cli_missing", BAPI_EPIC_IMPLEMENTER_CLI_FILE_ENV);
104
104
  }
105
105
  return { nodePath, cliFile: cliFileRaw.trim() };
106
106
  }
@@ -129,14 +129,14 @@ export function execConductorCli(subcommandArgs, stdin, deps = {}) {
129
129
  if (error) {
130
130
  // A non-zero exit, spawn failure, or timeout kill — never surface the
131
131
  // raw error text (it can carry paths/secrets). Fixed reason only.
132
- reject(new ConductorLedgerSubprocessRuntimeError("spawn_failed", CONDUCTOR_NODE_PATH_ENV));
132
+ reject(new ConductorLedgerSubprocessRuntimeError("spawn_failed", EPIC_IMPLEMENTER_NODE_PATH_ENV));
133
133
  return;
134
134
  }
135
135
  resolve(stdout);
136
136
  });
137
137
  }
138
138
  catch {
139
- reject(new ConductorLedgerSubprocessRuntimeError("spawn_failed", CONDUCTOR_NODE_PATH_ENV));
139
+ reject(new ConductorLedgerSubprocessRuntimeError("spawn_failed", EPIC_IMPLEMENTER_NODE_PATH_ENV));
140
140
  return;
141
141
  }
142
142
  if (stdin !== undefined) {
@@ -169,7 +169,7 @@ export function parseCliJsonStdout(stdout) {
169
169
  return JSON.parse(stdout);
170
170
  }
171
171
  catch {
172
- throw new ConductorLedgerSubprocessRuntimeError("malformed_stdout", CONDUCTOR_NODE_PATH_ENV);
172
+ throw new ConductorLedgerSubprocessRuntimeError("malformed_stdout", EPIC_IMPLEMENTER_NODE_PATH_ENV);
173
173
  }
174
174
  }
175
175
  /**
@@ -29,7 +29,7 @@ const EPIC_SLUG_RE = /^[A-Za-z][A-Za-z0-9_-]*$/;
29
29
  const PLACEHOLDER_RE = /TBD-\d+/;
30
30
  /**
31
31
  * The conductor's hard spec bound, mirroring `_SPEC_REVIEW_TICKET_SPEC_MAX_CHARS`
32
- * (64,000) in `api/library/epic_conductor/reconciler.py`. Since PR #848 the
32
+ * (64,000) in `api/library/epic_implementer/reconciler.py`. Since PR #848 the
33
33
  * reconciler marks overflow beyond its own bound visibly (no silent loss), so
34
34
  * this authoring guard exists only to reject a spec the conductor itself could
35
35
  * not accept. For Jira-backed tickets the practical limit binds far earlier:
@@ -576,7 +576,7 @@ function findCycle(keys, edgeKeys) {
576
576
  */
577
577
  const PY_WHITESPACE = /[\t\n\v\f\r \x1c-\x1f\x85\xa0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000]+/g;
578
578
  /**
579
- * Mirror `normalize_ticket_spec()` (`api/library/epic_conductor/spec_hash.py`)
579
+ * Mirror `normalize_ticket_spec()` (`api/library/epic_implementer/spec_hash.py`)
580
580
  * so a cosmetic diff never triggers a Jira rewrite.
581
581
  *
582
582
  * Because whitespace collapses, a pure reflow/indent edit is deliberately NOT a
@@ -138,7 +138,12 @@ export async function mintBitbucketConnection(deps, repoName) {
138
138
  if (!body || !state || !installUrl || typeof ttlSeconds !== "number") {
139
139
  return { ok: false, kind: "malformed" };
140
140
  }
141
- return { ok: true, value: { state, installUrl, ttlSeconds } };
141
+ // Optional and permissive ON PURPOSE, and only here: absent, null, empty, or any
142
+ // non-string collapses to null through the same nullable helper the candidate parser
143
+ // uses. Required-field strictness above is untouched — an optional field must not
144
+ // become a new way for a server change to fail a mint.
145
+ const redeemUrlTemplate = asNullableString(body.redeem_url_template);
146
+ return { ok: true, value: { state, installUrl, ttlSeconds, redeemUrlTemplate } };
142
147
  }
143
148
  /** Strictly parse candidates. A candidate missing a usable identity fails the whole list. */
144
149
  function parseCandidates(value) {