@bridge_gpt/mcp-server 0.2.9 → 0.2.12
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 +59 -7
- package/build/commands.generated.js +6 -6
- package/build/conductor/bridge-api-client.js +263 -35
- package/build/conductor/cli.js +38 -17
- package/build/conductor/doctor.js +35 -2
- package/build/conductor/done-gate.js +301 -58
- package/build/conductor/epic-reconcile.js +318 -4
- package/build/conductor/epic-runtime.js +382 -18
- package/build/conductor/epic-state.js +188 -15
- package/build/conductor/errors.js +12 -0
- package/build/conductor/git-ci-types.js +16 -0
- package/build/conductor/git-producer.js +4 -4
- package/build/conductor/merge-ledger.js +7 -7
- package/build/conductor/pr-ci-producer.js +118 -19
- package/build/conductor/pr-review-producer.js +116 -0
- package/build/conductor/producer-ledger.js +5 -5
- package/build/conductor/spec-review-producer.js +88 -0
- package/build/conductor/store.js +105 -26
- package/build/conductor/supervisor-ledger.js +2 -2
- package/build/conductor/supervisor-merge.js +5 -5
- package/build/conductor/supervisor-message-relay.js +32 -1
- package/build/conductor/supervisor-runtime.js +10 -10
- package/build/conductor/taxonomy.js +8 -0
- package/build/conductor/tools.js +7 -7
- package/build/conductor-bin.js +12350 -19
- package/build/conductor-claude-hook-bin.js +167 -17
- package/build/decision-page-schema.js +26 -0
- package/build/doctor.js +200 -0
- package/build/index.js +23696 -4351
- package/build/init.js +481 -0
- package/build/install-bridge.js +772 -0
- package/build/mcp-profile.js +43 -0
- package/build/pipelines.generated.js +70 -48
- package/build/readme.generated.js +1 -1
- package/build/start-tickets-conductor.js +1 -0
- package/build/start-tickets.js +186 -10
- package/build/upgrade-cli.js +154 -0
- package/build/version.generated.js +1 -1
- package/package.json +7 -4
- package/pipelines/check-ci-ticket.json +2 -2
- package/pipelines/implement-ticket.json +2 -2
- package/pipelines/learn-repository.json +84 -42
- package/smoke-test/SMOKE-TEST.md +11 -17
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bridge API MCP server one-command upgrade (BAPI-430).
|
|
3
|
+
*
|
|
4
|
+
* Extracted from `index.ts` so the upgrade logic always runs from the latest
|
|
5
|
+
* published version (`@bridge_gpt/mcp-server@latest`) rather than the
|
|
6
|
+
* potentially-stale copy npx resolved at the call site.
|
|
7
|
+
*
|
|
8
|
+
* Flow:
|
|
9
|
+
* 1. Fetch latest version from the npm registry.
|
|
10
|
+
* 2. If newer and not already re-exec'd, re-spawn from `@latest` with
|
|
11
|
+
* `--internal-reexec` so upgrade logic comes from new code.
|
|
12
|
+
* 3. Remove any competing local `node_modules/@bridge_gpt/mcp-server` install
|
|
13
|
+
* (the silent trap that makes npx always prefer the stale local copy).
|
|
14
|
+
* 4. Rewrite the launcher pin across all per-host configs via `runInit`.
|
|
15
|
+
* 5. Print `old -> new` and open a fresh reconnect session.
|
|
16
|
+
*/
|
|
17
|
+
import { spawn } from "child_process";
|
|
18
|
+
import { stat } from "fs/promises";
|
|
19
|
+
import path from "path";
|
|
20
|
+
import { VERSION } from "./version.generated.js";
|
|
21
|
+
import { runInit } from "./init.js";
|
|
22
|
+
import { isNewerVersion } from "./update-check.js";
|
|
23
|
+
import { buildGenericAgentShellCommand, detectTerminal, getDefaultSpawnTerminalTabForPlatform, createDefaultStartTicketsDeps, } from "./start-tickets.js";
|
|
24
|
+
import { AGENT_REGISTRY } from "./agent-registry.js";
|
|
25
|
+
async function fetchLatestVersion() {
|
|
26
|
+
try {
|
|
27
|
+
const res = await fetch("https://registry.npmjs.org/@bridge_gpt/mcp-server/latest", {
|
|
28
|
+
signal: AbortSignal.timeout(3000),
|
|
29
|
+
});
|
|
30
|
+
if (res.ok) {
|
|
31
|
+
const data = (await res.json());
|
|
32
|
+
return data.version || null;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
export async function runUpgradeCli(argv) {
|
|
41
|
+
const cwd = process.cwd();
|
|
42
|
+
const isDryRun = argv.includes("--dry-run");
|
|
43
|
+
const isInternalReexec = argv.includes("--internal-reexec");
|
|
44
|
+
let latestVersion = VERSION;
|
|
45
|
+
const fetched = await fetchLatestVersion();
|
|
46
|
+
if (fetched) {
|
|
47
|
+
latestVersion = fetched;
|
|
48
|
+
}
|
|
49
|
+
const isNewer = isNewerVersion(VERSION, latestVersion);
|
|
50
|
+
const npxCmd = process.platform === "win32" ? "npx.cmd" : "npx";
|
|
51
|
+
// Re-exec from @latest to ensure upgrade logic runs from latest code, not
|
|
52
|
+
// the stale local copy that npx may have resolved.
|
|
53
|
+
if (isNewer && !isInternalReexec) {
|
|
54
|
+
if (!isDryRun) {
|
|
55
|
+
console.log(`Update available: ${VERSION} -> ${latestVersion}. Re-executing from @latest...`);
|
|
56
|
+
return new Promise((resolve) => {
|
|
57
|
+
const childArgs = [
|
|
58
|
+
"-y",
|
|
59
|
+
"@bridge_gpt/mcp-server@latest",
|
|
60
|
+
"upgrade",
|
|
61
|
+
"--internal-reexec",
|
|
62
|
+
"--old-version",
|
|
63
|
+
VERSION,
|
|
64
|
+
];
|
|
65
|
+
const child = spawn(npxCmd, childArgs, { stdio: "inherit", cwd });
|
|
66
|
+
child.on("close", (code) => resolve(code ?? 0));
|
|
67
|
+
child.on("error", (err) => {
|
|
68
|
+
console.error(`Bridge API upgrade failed: could not re-exec npx: ${err.message}`);
|
|
69
|
+
resolve(1);
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
const oldVersionIdx = argv.indexOf("--old-version");
|
|
75
|
+
const oldVersion = oldVersionIdx !== -1 && oldVersionIdx + 1 < argv.length ? argv[oldVersionIdx + 1] : VERSION;
|
|
76
|
+
const targetVersion = isDryRun && isNewer ? latestVersion : VERSION;
|
|
77
|
+
if (isDryRun) {
|
|
78
|
+
const configTargets = [".mcp.json", ".vscode/mcp.json", ".cursor/mcp.json"];
|
|
79
|
+
console.log(`\n[Dry Run] Upgrade preview:`);
|
|
80
|
+
if (isNewer && !isInternalReexec) {
|
|
81
|
+
console.log(`- Would re-exec from @latest to upgrade ${VERSION} -> ${latestVersion}`);
|
|
82
|
+
}
|
|
83
|
+
console.log(`- Would detect and remove competing local install in node_modules/@bridge_gpt/mcp-server if present.`);
|
|
84
|
+
console.log(`- Would rewrite launcher pin to @bridge_gpt/mcp-server@${targetVersion} across active per-host configs:`);
|
|
85
|
+
for (const target of configTargets) {
|
|
86
|
+
try {
|
|
87
|
+
await stat(path.join(cwd, target));
|
|
88
|
+
console.log(` - ${target}`);
|
|
89
|
+
}
|
|
90
|
+
catch { }
|
|
91
|
+
}
|
|
92
|
+
console.log(`- Would refresh scaffolded artifacts (commands, agents, pipelines).`);
|
|
93
|
+
const spawnCommand = buildGenericAgentShellCommand(AGENT_REGISTRY.claude, "Bridge API MCP server has been upgraded. Please reload/reconnect the MCP server in your environment.", cwd, process.platform);
|
|
94
|
+
console.log(`- Would print: ${oldVersion} -> ${targetVersion} and spawn a fresh reconnect session with command:\n ${spawnCommand}`);
|
|
95
|
+
return 0;
|
|
96
|
+
}
|
|
97
|
+
// Detect and resolve the competing-local-install trap: npx silently prefers
|
|
98
|
+
// a local node_modules copy over the registry, so the stale version wins even
|
|
99
|
+
// after an upgrade unless we remove it.
|
|
100
|
+
try {
|
|
101
|
+
const localModulePath = path.join(cwd, "node_modules", "@bridge_gpt", "mcp-server");
|
|
102
|
+
await stat(localModulePath);
|
|
103
|
+
console.log("Found stale local installation in node_modules. Removing to converge on pinned-npx...");
|
|
104
|
+
const npmCmd = process.platform === "win32" ? "npm.cmd" : "npm";
|
|
105
|
+
await new Promise((resolve) => {
|
|
106
|
+
const child = spawn(npmCmd, ["uninstall", "@bridge_gpt/mcp-server"], {
|
|
107
|
+
stdio: "inherit",
|
|
108
|
+
cwd,
|
|
109
|
+
});
|
|
110
|
+
child.on("close", (code) => {
|
|
111
|
+
if (code !== 0)
|
|
112
|
+
console.warn("Warning: npm uninstall failed; you may need to remove node_modules/@bridge_gpt/mcp-server manually.");
|
|
113
|
+
resolve();
|
|
114
|
+
});
|
|
115
|
+
child.on("error", () => resolve());
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
// Not installed locally — nothing to clean up.
|
|
120
|
+
}
|
|
121
|
+
try {
|
|
122
|
+
console.log(`\nUpgrading @bridge_gpt/mcp-server to ${targetVersion}...\n`);
|
|
123
|
+
// Scaffold & rewrite the launcher pin on upgrade.
|
|
124
|
+
console.log("Refreshing scaffolded artifacts and updating launcher pins...\n");
|
|
125
|
+
await runInit(cwd);
|
|
126
|
+
console.log(`\nUpgrade complete: ${oldVersion} -> ${targetVersion}`);
|
|
127
|
+
console.log("Please reconnect your MCP now.");
|
|
128
|
+
}
|
|
129
|
+
catch (err) {
|
|
130
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
131
|
+
console.error(`Bridge API upgrade failed: ${msg}`);
|
|
132
|
+
return 1;
|
|
133
|
+
}
|
|
134
|
+
// Open a fresh agent session so the user lands in a reconnected environment
|
|
135
|
+
// rather than having to manually restart.
|
|
136
|
+
try {
|
|
137
|
+
const terminal = detectTerminal(undefined, process.env);
|
|
138
|
+
const deps = createDefaultStartTicketsDeps();
|
|
139
|
+
const spawnTerminalTab = getDefaultSpawnTerminalTabForPlatform(process.platform);
|
|
140
|
+
const spawnCommand = buildGenericAgentShellCommand(AGENT_REGISTRY.claude, "Bridge API MCP server has been upgraded. Please reload/reconnect the MCP server in your environment.", cwd, process.platform);
|
|
141
|
+
console.log("\nOpening a fresh agent session to reconnect...");
|
|
142
|
+
const spawnResult = await spawnTerminalTab(deps, terminal, spawnCommand, {
|
|
143
|
+
key: "reconnect",
|
|
144
|
+
worktreePath: cwd,
|
|
145
|
+
});
|
|
146
|
+
if (!spawnResult.ok) {
|
|
147
|
+
console.log(`\nTo continue, manually run:\n${spawnCommand}\n`);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
catch {
|
|
151
|
+
console.log("To continue, please reload your agent session manually.");
|
|
152
|
+
}
|
|
153
|
+
return 0;
|
|
154
|
+
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// AUTO-GENERATED — do not edit manually. Regenerate with: npm run build
|
|
2
|
-
export const VERSION = "0.2.
|
|
2
|
+
export const VERSION = "0.2.12";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bridge_gpt/mcp-server",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.12",
|
|
4
4
|
"description": "Bridge API MCP server — exposes Jira endpoints as MCP tools for Claude Code agents",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -22,23 +22,26 @@
|
|
|
22
22
|
"LICENSE"
|
|
23
23
|
],
|
|
24
24
|
"scripts": {
|
|
25
|
-
"build": "node scripts/bundle-version.js && node scripts/bundle-readme.js && node scripts/bundle-pipelines.js && node scripts/bundle-commands.js && node scripts/bundle-agents.js && tsc",
|
|
25
|
+
"build": "node scripts/bundle-version.js && node scripts/bundle-readme.js && node scripts/bundle-pipelines.js && node scripts/bundle-commands.js && node scripts/bundle-agents.js && tsc && node scripts/bundle-esbuild.js",
|
|
26
26
|
"check:version-generated": "node scripts/bundle-version.js && node scripts/check-version-generated.js",
|
|
27
27
|
"postbuild": "node scripts/prepend-shebang.cjs",
|
|
28
28
|
"start": "node build/index.js",
|
|
29
|
-
"test": "node --test build/pipeline-utils.test.js build/update-check.test.js build/cli-upgrade.test.js build/decision-page-schema.test.js build/decision-page-template.test.js build/bundle-pipelines.test.js build/instructions-contract.test.js build/pipeline-orchestrator-persistence.test.js build/pipeline-orchestrator-execution.test.js build/pipeline-orchestrator-integration.test.js build/index-static.test.js build/index-resolvers.test.js build/index-project-root.test.js build/index-pipelines.test.js build/index.test.js build/bridge-config.test.js build/credential-store.test.js build/agent-config-credential-migration.test.js build/mcp-invoke.test.js build/mcp-provisioning.test.js build/third-party-mcp-targets.test.js build/git-ignore-utils.test.js build/credential-materialization.test.js build/mcp-registration-doctor.test.js build/secret-safety.test.js build/start-tickets.test.js build/review-tickets.test.js build/start-tickets-base-branch.test.js build/agent-registry.test.js build/agent-registry.model-routing.test.js build/start-tickets.shell-model-routing.test.js build/start-tickets.bridge-api-model-routing.test.js build/start-tickets.tier-fetch-model-routing.test.js build/start-tickets.resolve-model-routing.test.js build/start-tickets.orchestrate-model-routing.test.js build/start-tickets.routing-diagnostics.test.js build/start-tickets-repo.test.js build/start-tickets-credential-invariants.static.test.js build/credentials-cli.test.js build/start-tickets-prereqs.test.js build/doctor.test.js build/resolveUploadAttachment.test.js build/package-static.test.js build/chain-utils.test.js build/chain-orchestrator.test.js build/scheduler-backends/types.test.js build/scheduler-backends/escaping.test.js build/scheduler-backends/launchd.test.js build/scheduler-backends/task-scheduler.test.js build/scheduler-backends/systemd-user.test.js build/scheduler-backends/at-fallback.test.js build/scheduler-backends/index.test.js build/command-catalog.test.js build/scheduled-prompt.test.js build/agent-launchers/claude.test.js build/agent-launchers/cursor.test.js build/agent-launchers/index.test.js build/schedule-store.test.js build/schedule-run.test.js build/agent-capabilities/cli.test.js build/agent-capabilities/runner.test.js build/agent-capabilities/probes.test.js build/agent-capabilities/reporter.test.js build/conductor/taxonomy-and-errors.test.js build/conductor/redaction-normalization.test.js build/conductor/claude-hook.test.js build/conductor/git-ci-types.test.js build/conductor/done-gate.test.js build/conductor/git-ci-taxonomy-payload.test.js build/conductor/bridge-api-client.test.js build/conductor/plan.test.js build/conductor/producer-ledger.test.js build/conductor/git-producer.test.js build/conductor/git-hooks.test.js build/conductor/store-migration.test.js build/conductor/pr-discovery.test.js build/conductor/pr-ci-producer.test.js build/conductor/doctor.test.js build/conductor/index-poll-ci-producer.test.js build/start-tickets-conductor.test.js build/start-tickets-conductor.spawn.test.js build/conductor/supervisor-config.test.js build/conductor/supervisor-ledger.test.js build/conductor/supervisor-state-reducer.test.js build/conductor/supervisor-housekeeping-projection.test.js build/conductor/supervisor-escalation.test.js build/conductor/supervisor-judgment.test.js build/conductor/supervisor-judgment-python-adapter.test.js build/conductor/supervisor-runtime.test.js build/conductor/supervisor-store-projection.test.js build/conductor/supervisor-cli.test.js build/conductor/supervisor-start-tickets.test.js build/conductor/supervisor-message-relay.test.js build/conductor/supervisor-state-message-events.test.js build/conductor/store-message-relay.test.js build/start-tickets-message-relay.test.js build/conductor/merge-ledger.test.js build/conductor/supervisor-merge.test.js build/conductor/bridge-api-merge-client.test.js build/conductor/bridge-api-epic-client.test.js build/conductor/supervisor-merge-runtime-state.test.js build/conductor/epic-state.test.js build/conductor/epic-reconcile.test.js build/conductor/epic-runtime.test.js build/conductor/epic-tick-sequence.test.js build/conductor/epic-runtime-post-action.test.js && node --experimental-test-module-mocks --test build/index-heavy-read-truncation.test.js build/index-artifacts.test.js build/index-brainstorm-filenames.test.js build/index-output-path.test.js build/index-generate-decision-page.test.js build/index-generate-decision-page.integration.test.js build/conductor/paths.test.js build/conductor/store-lifecycle.test.js build/conductor/store-queries.test.js build/conductor/tools.test.js build/conductor/cli.test.js build/conductor/security-regressions.test.js build/conductor/git-inspection.test.js build/conductor/tools-done-gate.test.js build/conductor/cli-git-hooks.test.js",
|
|
29
|
+
"test": "node --test build/pipeline-utils.test.js build/update-check.test.js build/cli-upgrade.test.js build/decision-page-schema.test.js build/decision-page-template.test.js build/bundle-pipelines.test.js build/instructions-contract.test.js build/pipeline-orchestrator-persistence.test.js build/pipeline-orchestrator-execution.test.js build/pipeline-orchestrator-integration.test.js build/index-static.test.js build/index-resolvers.test.js build/index-project-root.test.js build/index-pipelines.test.js build/index.test.js build/bridge-config.test.js build/credential-store.test.js build/agent-config-credential-migration.test.js build/mcp-invoke.test.js build/mcp-provisioning.test.js build/third-party-mcp-targets.test.js build/git-ignore-utils.test.js build/credential-materialization.test.js build/mcp-registration-doctor.test.js build/secret-safety.test.js build/start-tickets.test.js build/review-tickets.test.js build/start-tickets-base-branch.test.js build/agent-registry.test.js build/agent-registry.model-routing.test.js build/start-tickets.shell-model-routing.test.js build/start-tickets.bridge-api-model-routing.test.js build/start-tickets.tier-fetch-model-routing.test.js build/start-tickets.resolve-model-routing.test.js build/start-tickets.orchestrate-model-routing.test.js build/start-tickets.routing-diagnostics.test.js build/start-tickets-repo.test.js build/start-tickets-credential-invariants.static.test.js build/credentials-cli.test.js build/start-tickets-prereqs.test.js build/doctor.test.js build/install-bridge.test.js build/resolveUploadAttachment.test.js build/package-static.test.js build/chain-utils.test.js build/chain-orchestrator.test.js build/scheduler-backends/types.test.js build/scheduler-backends/escaping.test.js build/scheduler-backends/launchd.test.js build/scheduler-backends/task-scheduler.test.js build/scheduler-backends/systemd-user.test.js build/scheduler-backends/at-fallback.test.js build/scheduler-backends/index.test.js build/command-catalog.test.js build/scheduled-prompt.test.js build/agent-launchers/claude.test.js build/agent-launchers/cursor.test.js build/agent-launchers/index.test.js build/schedule-store.test.js build/schedule-run.test.js build/agent-capabilities/cli.test.js build/agent-capabilities/runner.test.js build/agent-capabilities/probes.test.js build/agent-capabilities/reporter.test.js build/conductor/taxonomy-and-errors.test.js build/conductor/redaction-normalization.test.js build/conductor/claude-hook.test.js build/conductor/git-ci-types.test.js build/conductor/done-gate.test.js build/conductor/git-ci-taxonomy-payload.test.js build/conductor/bridge-api-client.test.js build/conductor/plan.test.js build/conductor/producer-ledger.test.js build/conductor/spec-review-producer.test.js build/conductor/git-producer.test.js build/conductor/git-hooks.test.js build/conductor/store-migration.test.js build/conductor/pr-discovery.test.js build/conductor/pr-ci-producer.test.js build/conductor/doctor.test.js build/conductor/index-poll-ci-producer.test.js build/start-tickets-conductor.test.js build/start-tickets-conductor.spawn.test.js build/conductor/supervisor-config.test.js build/conductor/supervisor-ledger.test.js build/conductor/supervisor-state-reducer.test.js build/conductor/supervisor-housekeeping-projection.test.js build/conductor/supervisor-escalation.test.js build/conductor/supervisor-judgment.test.js build/conductor/supervisor-judgment-python-adapter.test.js build/conductor/supervisor-runtime.test.js build/conductor/supervisor-store-projection.test.js build/conductor/supervisor-cli.test.js build/conductor/supervisor-start-tickets.test.js build/conductor/supervisor-message-relay.test.js build/conductor/supervisor-state-message-events.test.js build/conductor/store-message-relay.test.js build/start-tickets-message-relay.test.js build/conductor/merge-ledger.test.js build/conductor/supervisor-merge.test.js build/conductor/bridge-api-merge-client.test.js build/conductor/bridge-api-epic-client.test.js build/conductor/supervisor-merge-runtime-state.test.js build/conductor/epic-state.test.js build/conductor/epic-reconcile.test.js build/conductor/epic-runtime.test.js build/conductor/epic-tick-sequence.test.js build/conductor/epic-runtime-post-action.test.js build/mcp-profile.test.js build/mcp-profile-registration.test.js build/tools-budget.test.js build/integration/measure-tools.test.js && node --experimental-test-module-mocks --test build/index-heavy-read-truncation.test.js build/index-artifacts.test.js build/index-brainstorm-filenames.test.js build/index-output-path.test.js build/index-generate-decision-page.test.js build/index-generate-decision-page.integration.test.js build/conductor/paths.test.js build/conductor/store-lifecycle.test.js build/conductor/store-queries.test.js build/conductor/tools.test.js build/conductor/cli.test.js build/conductor/security-regressions.test.js build/conductor/git-inspection.test.js build/conductor/tools-done-gate.test.js build/conductor/cli-git-hooks.test.js",
|
|
30
30
|
"test:integration": "node --test build/integration/refresh-main.integration.test.js build/integration/start-tickets.integration.test.js build/integration/doctor.integration.test.js build/integration/agent-capabilities.integration.test.js build/integration/conductor-producer.integration.test.js build/integration/conductor-message-relay.integration.test.js",
|
|
31
31
|
"test:smoke": "node --test build/integration/packaged-cli-smoke.test.js",
|
|
32
32
|
"prepublishOnly": "node scripts/bundle-assets.js && npm run build && node scripts/verify-shebang.cjs"
|
|
33
33
|
},
|
|
34
34
|
"dependencies": {
|
|
35
35
|
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
36
|
-
"better-sqlite3": "^11.8.1",
|
|
37
36
|
"zod": "^4.4.3"
|
|
38
37
|
},
|
|
38
|
+
"optionalDependencies": {
|
|
39
|
+
"better-sqlite3": "^11.8.1"
|
|
40
|
+
},
|
|
39
41
|
"devDependencies": {
|
|
40
42
|
"@types/better-sqlite3": "^7.6.12",
|
|
41
43
|
"@types/node": "^25.9.1",
|
|
44
|
+
"esbuild": "^0.25.0",
|
|
42
45
|
"typescript": "^6.0.3"
|
|
43
46
|
},
|
|
44
47
|
"engines": {
|
|
@@ -22,8 +22,8 @@
|
|
|
22
22
|
},
|
|
23
23
|
{
|
|
24
24
|
"type": "mcp_call",
|
|
25
|
-
"tool": "
|
|
26
|
-
"params": { "field_name": "ci_followup_config" },
|
|
25
|
+
"tool": "config_field",
|
|
26
|
+
"params": { "operation": "get", "field_name": "ci_followup_config" },
|
|
27
27
|
"description": "Fetch repo-specific CI follow-up configuration",
|
|
28
28
|
"on_error": "warn_and_continue"
|
|
29
29
|
},
|
|
@@ -48,8 +48,8 @@
|
|
|
48
48
|
},
|
|
49
49
|
{
|
|
50
50
|
"type": "mcp_call",
|
|
51
|
-
"tool": "
|
|
52
|
-
"params": { "field_name": "ci_followup_config" },
|
|
51
|
+
"tool": "config_field",
|
|
52
|
+
"params": { "operation": "get", "field_name": "ci_followup_config" },
|
|
53
53
|
"description": "Fetch repo-specific CI follow-up configuration",
|
|
54
54
|
"on_error": "warn_and_continue"
|
|
55
55
|
},
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "learn-repository",
|
|
3
3
|
"description": "Learn and document all configuration fields for the repository by running sequential research agents.",
|
|
4
|
-
"variables": [
|
|
4
|
+
"variables": [
|
|
5
|
+
"docs_dir"
|
|
6
|
+
],
|
|
5
7
|
"steps": [
|
|
6
8
|
{
|
|
7
9
|
"type": "mcp_call",
|
|
@@ -16,8 +18,11 @@
|
|
|
16
18
|
},
|
|
17
19
|
{
|
|
18
20
|
"type": "mcp_call",
|
|
19
|
-
"tool": "
|
|
20
|
-
"params": {
|
|
21
|
+
"tool": "config_field",
|
|
22
|
+
"params": {
|
|
23
|
+
"field_name": "architecture_instructions",
|
|
24
|
+
"operation": "get"
|
|
25
|
+
},
|
|
21
26
|
"description": "Fetch current architecture_instructions value",
|
|
22
27
|
"on_error": "warn_and_continue"
|
|
23
28
|
},
|
|
@@ -28,18 +33,22 @@
|
|
|
28
33
|
},
|
|
29
34
|
{
|
|
30
35
|
"type": "mcp_call",
|
|
31
|
-
"tool": "
|
|
36
|
+
"tool": "config_field",
|
|
32
37
|
"params": {
|
|
33
38
|
"field_name": "architecture_instructions",
|
|
34
|
-
"file_path": "{docs_dir}/standards/architecture_instructions.md"
|
|
39
|
+
"file_path": "{docs_dir}/standards/architecture_instructions.md",
|
|
40
|
+
"operation": "update"
|
|
35
41
|
},
|
|
36
42
|
"description": "Upload architecture_instructions to config",
|
|
37
43
|
"requires_approval": true
|
|
38
44
|
},
|
|
39
45
|
{
|
|
40
46
|
"type": "mcp_call",
|
|
41
|
-
"tool": "
|
|
42
|
-
"params": {
|
|
47
|
+
"tool": "config_field",
|
|
48
|
+
"params": {
|
|
49
|
+
"field_name": "review_instructions",
|
|
50
|
+
"operation": "get"
|
|
51
|
+
},
|
|
43
52
|
"description": "Fetch current review_instructions value",
|
|
44
53
|
"on_error": "warn_and_continue"
|
|
45
54
|
},
|
|
@@ -50,18 +59,22 @@
|
|
|
50
59
|
},
|
|
51
60
|
{
|
|
52
61
|
"type": "mcp_call",
|
|
53
|
-
"tool": "
|
|
62
|
+
"tool": "config_field",
|
|
54
63
|
"params": {
|
|
55
64
|
"field_name": "review_instructions",
|
|
56
|
-
"file_path": "{docs_dir}/standards/review_instructions.md"
|
|
65
|
+
"file_path": "{docs_dir}/standards/review_instructions.md",
|
|
66
|
+
"operation": "update"
|
|
57
67
|
},
|
|
58
68
|
"description": "Upload review_instructions to config",
|
|
59
69
|
"requires_approval": true
|
|
60
70
|
},
|
|
61
71
|
{
|
|
62
72
|
"type": "mcp_call",
|
|
63
|
-
"tool": "
|
|
64
|
-
"params": {
|
|
73
|
+
"tool": "config_field",
|
|
74
|
+
"params": {
|
|
75
|
+
"field_name": "documentation_instructions",
|
|
76
|
+
"operation": "get"
|
|
77
|
+
},
|
|
65
78
|
"description": "Fetch current documentation_instructions value",
|
|
66
79
|
"on_error": "warn_and_continue"
|
|
67
80
|
},
|
|
@@ -72,18 +85,22 @@
|
|
|
72
85
|
},
|
|
73
86
|
{
|
|
74
87
|
"type": "mcp_call",
|
|
75
|
-
"tool": "
|
|
88
|
+
"tool": "config_field",
|
|
76
89
|
"params": {
|
|
77
90
|
"field_name": "documentation_instructions",
|
|
78
|
-
"file_path": "{docs_dir}/standards/documentation_instructions.md"
|
|
91
|
+
"file_path": "{docs_dir}/standards/documentation_instructions.md",
|
|
92
|
+
"operation": "update"
|
|
79
93
|
},
|
|
80
94
|
"description": "Upload documentation_instructions to config",
|
|
81
95
|
"requires_approval": true
|
|
82
96
|
},
|
|
83
97
|
{
|
|
84
98
|
"type": "mcp_call",
|
|
85
|
-
"tool": "
|
|
86
|
-
"params": {
|
|
99
|
+
"tool": "config_field",
|
|
100
|
+
"params": {
|
|
101
|
+
"field_name": "unit_testing_instructions",
|
|
102
|
+
"operation": "get"
|
|
103
|
+
},
|
|
87
104
|
"description": "Fetch current unit_testing_instructions value",
|
|
88
105
|
"on_error": "warn_and_continue"
|
|
89
106
|
},
|
|
@@ -94,18 +111,22 @@
|
|
|
94
111
|
},
|
|
95
112
|
{
|
|
96
113
|
"type": "mcp_call",
|
|
97
|
-
"tool": "
|
|
114
|
+
"tool": "config_field",
|
|
98
115
|
"params": {
|
|
99
116
|
"field_name": "unit_testing_instructions",
|
|
100
|
-
"file_path": "{docs_dir}/standards/unit_testing_instructions.md"
|
|
117
|
+
"file_path": "{docs_dir}/standards/unit_testing_instructions.md",
|
|
118
|
+
"operation": "update"
|
|
101
119
|
},
|
|
102
120
|
"description": "Upload unit_testing_instructions to config",
|
|
103
121
|
"requires_approval": true
|
|
104
122
|
},
|
|
105
123
|
{
|
|
106
124
|
"type": "mcp_call",
|
|
107
|
-
"tool": "
|
|
108
|
-
"params": {
|
|
125
|
+
"tool": "config_field",
|
|
126
|
+
"params": {
|
|
127
|
+
"field_name": "e2e_testing_instructions",
|
|
128
|
+
"operation": "get"
|
|
129
|
+
},
|
|
109
130
|
"description": "Fetch current e2e_testing_instructions value",
|
|
110
131
|
"on_error": "warn_and_continue"
|
|
111
132
|
},
|
|
@@ -116,18 +137,22 @@
|
|
|
116
137
|
},
|
|
117
138
|
{
|
|
118
139
|
"type": "mcp_call",
|
|
119
|
-
"tool": "
|
|
140
|
+
"tool": "config_field",
|
|
120
141
|
"params": {
|
|
121
142
|
"field_name": "e2e_testing_instructions",
|
|
122
|
-
"file_path": "{docs_dir}/standards/e2e_testing_instructions.md"
|
|
143
|
+
"file_path": "{docs_dir}/standards/e2e_testing_instructions.md",
|
|
144
|
+
"operation": "update"
|
|
123
145
|
},
|
|
124
146
|
"description": "Upload e2e_testing_instructions to config",
|
|
125
147
|
"requires_approval": true
|
|
126
148
|
},
|
|
127
149
|
{
|
|
128
150
|
"type": "mcp_call",
|
|
129
|
-
"tool": "
|
|
130
|
-
"params": {
|
|
151
|
+
"tool": "config_field",
|
|
152
|
+
"params": {
|
|
153
|
+
"field_name": "frontend_correctness_standards",
|
|
154
|
+
"operation": "get"
|
|
155
|
+
},
|
|
131
156
|
"description": "Fetch current frontend_correctness_standards value",
|
|
132
157
|
"on_error": "warn_and_continue"
|
|
133
158
|
},
|
|
@@ -138,18 +163,22 @@
|
|
|
138
163
|
},
|
|
139
164
|
{
|
|
140
165
|
"type": "mcp_call",
|
|
141
|
-
"tool": "
|
|
166
|
+
"tool": "config_field",
|
|
142
167
|
"params": {
|
|
143
168
|
"field_name": "frontend_correctness_standards",
|
|
144
|
-
"file_path": "{docs_dir}/standards/frontend_correctness_standards.md"
|
|
169
|
+
"file_path": "{docs_dir}/standards/frontend_correctness_standards.md",
|
|
170
|
+
"operation": "update"
|
|
145
171
|
},
|
|
146
172
|
"description": "Upload frontend_correctness_standards to config",
|
|
147
173
|
"requires_approval": true
|
|
148
174
|
},
|
|
149
175
|
{
|
|
150
176
|
"type": "mcp_call",
|
|
151
|
-
"tool": "
|
|
152
|
-
"params": {
|
|
177
|
+
"tool": "config_field",
|
|
178
|
+
"params": {
|
|
179
|
+
"field_name": "backend_correctness_standards",
|
|
180
|
+
"operation": "get"
|
|
181
|
+
},
|
|
153
182
|
"description": "Fetch current backend_correctness_standards value",
|
|
154
183
|
"on_error": "warn_and_continue"
|
|
155
184
|
},
|
|
@@ -160,18 +189,22 @@
|
|
|
160
189
|
},
|
|
161
190
|
{
|
|
162
191
|
"type": "mcp_call",
|
|
163
|
-
"tool": "
|
|
192
|
+
"tool": "config_field",
|
|
164
193
|
"params": {
|
|
165
194
|
"field_name": "backend_correctness_standards",
|
|
166
|
-
"file_path": "{docs_dir}/standards/backend_correctness_standards.md"
|
|
195
|
+
"file_path": "{docs_dir}/standards/backend_correctness_standards.md",
|
|
196
|
+
"operation": "update"
|
|
167
197
|
},
|
|
168
198
|
"description": "Upload backend_correctness_standards to config",
|
|
169
199
|
"requires_approval": true
|
|
170
200
|
},
|
|
171
201
|
{
|
|
172
202
|
"type": "mcp_call",
|
|
173
|
-
"tool": "
|
|
174
|
-
"params": {
|
|
203
|
+
"tool": "config_field",
|
|
204
|
+
"params": {
|
|
205
|
+
"field_name": "template_correctness_standards",
|
|
206
|
+
"operation": "get"
|
|
207
|
+
},
|
|
175
208
|
"description": "Fetch current template_correctness_standards value",
|
|
176
209
|
"on_error": "warn_and_continue"
|
|
177
210
|
},
|
|
@@ -182,18 +215,22 @@
|
|
|
182
215
|
},
|
|
183
216
|
{
|
|
184
217
|
"type": "mcp_call",
|
|
185
|
-
"tool": "
|
|
218
|
+
"tool": "config_field",
|
|
186
219
|
"params": {
|
|
187
220
|
"field_name": "template_correctness_standards",
|
|
188
|
-
"file_path": "{docs_dir}/standards/template_correctness_standards.md"
|
|
221
|
+
"file_path": "{docs_dir}/standards/template_correctness_standards.md",
|
|
222
|
+
"operation": "update"
|
|
189
223
|
},
|
|
190
224
|
"description": "Upload template_correctness_standards to config",
|
|
191
225
|
"requires_approval": true
|
|
192
226
|
},
|
|
193
227
|
{
|
|
194
228
|
"type": "mcp_call",
|
|
195
|
-
"tool": "
|
|
196
|
-
"params": {
|
|
229
|
+
"tool": "config_field",
|
|
230
|
+
"params": {
|
|
231
|
+
"field_name": "style_correctness_standards",
|
|
232
|
+
"operation": "get"
|
|
233
|
+
},
|
|
197
234
|
"description": "Fetch current style_correctness_standards value",
|
|
198
235
|
"on_error": "warn_and_continue"
|
|
199
236
|
},
|
|
@@ -204,18 +241,22 @@
|
|
|
204
241
|
},
|
|
205
242
|
{
|
|
206
243
|
"type": "mcp_call",
|
|
207
|
-
"tool": "
|
|
244
|
+
"tool": "config_field",
|
|
208
245
|
"params": {
|
|
209
246
|
"field_name": "style_correctness_standards",
|
|
210
|
-
"file_path": "{docs_dir}/standards/style_correctness_standards.md"
|
|
247
|
+
"file_path": "{docs_dir}/standards/style_correctness_standards.md",
|
|
248
|
+
"operation": "update"
|
|
211
249
|
},
|
|
212
250
|
"description": "Upload style_correctness_standards to config",
|
|
213
251
|
"requires_approval": true
|
|
214
252
|
},
|
|
215
253
|
{
|
|
216
254
|
"type": "mcp_call",
|
|
217
|
-
"tool": "
|
|
218
|
-
"params": {
|
|
255
|
+
"tool": "config_field",
|
|
256
|
+
"params": {
|
|
257
|
+
"field_name": "design_principles",
|
|
258
|
+
"operation": "get"
|
|
259
|
+
},
|
|
219
260
|
"description": "Fetch current design_principles value",
|
|
220
261
|
"on_error": "warn_and_continue"
|
|
221
262
|
},
|
|
@@ -226,13 +267,14 @@
|
|
|
226
267
|
},
|
|
227
268
|
{
|
|
228
269
|
"type": "mcp_call",
|
|
229
|
-
"tool": "
|
|
270
|
+
"tool": "config_field",
|
|
230
271
|
"params": {
|
|
231
272
|
"field_name": "design_principles",
|
|
232
|
-
"file_path": "{docs_dir}/standards/design_principles.md"
|
|
273
|
+
"file_path": "{docs_dir}/standards/design_principles.md",
|
|
274
|
+
"operation": "update"
|
|
233
275
|
},
|
|
234
276
|
"description": "Upload design_principles to config",
|
|
235
277
|
"requires_approval": true
|
|
236
278
|
}
|
|
237
279
|
]
|
|
238
|
-
}
|
|
280
|
+
}
|
package/smoke-test/SMOKE-TEST.md
CHANGED
|
@@ -84,13 +84,12 @@ Ask the user for the following before making any tool calls:
|
|
|
84
84
|
`BAPI_API_KEY` can read (used for the Tier 1 read-only checks). It only needs
|
|
85
85
|
to be readable — comments, attachments, tracked state, and generated
|
|
86
86
|
artifacts are all optional.
|
|
87
|
-
2. **Optional:** a **config field name** (for `
|
|
87
|
+
2. **Optional:** a **config field name** (for `config_field` with operation `"get"`).
|
|
88
88
|
3. **Optional:** a **pipeline name** (for `get_pipeline_recipe`) — either a
|
|
89
89
|
no-variable pipeline name (e.g. `learn-repository`) or, for a
|
|
90
90
|
variable-declaring pipeline, the variable values it needs (e.g. a
|
|
91
91
|
`ticket_key`).
|
|
92
|
-
4. **Optional:** an **attachment identifier or filename** (for
|
|
93
|
-
`download_attachment` / `list_attachments`).
|
|
92
|
+
4. **Optional:** an **attachment identifier or filename** (for `attachment` with operation `"download"` or `"list"`).
|
|
94
93
|
5. **Optional:** any **artifact or task IDs** (e.g. a `task_id`, `brainstorm_id`,
|
|
95
94
|
or commit ref) for retriever and CI tools.
|
|
96
95
|
6. **Required decision:** explicit **Tier 3 consent** (Tier 3 spends tokens and
|
|
@@ -186,7 +185,7 @@ all local writes:
|
|
|
186
185
|
|
|
187
186
|
There are **five heavy-read tools** whose successful oversized output is saved to
|
|
188
187
|
disk before a truncated inline preview is returned: `get_project_standards`,
|
|
189
|
-
`get_tickets`, `get_ticket`, `get_comments`, and `
|
|
188
|
+
`get_tickets`, `get_ticket`, `get_comments`, and `attachment` (operation: `"list"`).
|
|
190
189
|
|
|
191
190
|
- When a heavy-read response begins with `[Response truncated. Full response
|
|
192
191
|
saved locally.]` and carries a `Saved to <path>` note, grade it **`PASS`** as
|
|
@@ -210,8 +209,7 @@ default plus the read-only ticket checks when a readable ticket was supplied.
|
|
|
210
209
|
### All Tier 0 tools run by default
|
|
211
210
|
|
|
212
211
|
`ping`, `get_my_role`, `get_docs_dir`, `get_project_standards`,
|
|
213
|
-
`
|
|
214
|
-
`list_pipeline_runs`.
|
|
212
|
+
`list_pipelines`, `get_parse_status`, `list_pipeline_runs`.
|
|
215
213
|
|
|
216
214
|
(The "fast-pass" list is the minimum release-blocking subset; the tier
|
|
217
215
|
definition is "always run", so do not exclude the other Tier 0 tools.)
|
|
@@ -221,7 +219,7 @@ definition is "always run", so do not exclude the other Tier 0 tools.)
|
|
|
221
219
|
Run `get_ticket`, `get_comments`, and `get_plan` against the user-supplied
|
|
222
220
|
ticket.
|
|
223
221
|
|
|
224
|
-
- **`get_comments` is preferred**; **`
|
|
222
|
+
- **`get_comments` is preferred**; **`attachment` (operation: `"list"`) is the fallback** if
|
|
225
223
|
comments are unavailable for the selected ticket.
|
|
226
224
|
- **`get_plan` must be called with a real boolean `save_locally: false`** (a true
|
|
227
225
|
JSON boolean, not the string `"false"`).
|
|
@@ -246,7 +244,7 @@ supplied the relevant input; otherwise record `SKIP_USER_INPUT`.
|
|
|
246
244
|
- `get_tickets` — a query/filter (a default project query is acceptable).
|
|
247
245
|
- `get_ticket_state`, `get_jira_transitions`, `resolve_target_status` — the
|
|
248
246
|
ticket key.
|
|
249
|
-
- `
|
|
247
|
+
- `config_field` (operation: `"get"`) — the optional config field name.
|
|
250
248
|
- `get_pipeline_recipe` — a pipeline name. When no variables are supplied, use a
|
|
251
249
|
no-variable pipeline such as `learn-repository` as the smoke target. A
|
|
252
250
|
variable-declaring pipeline (e.g. a ticket-based pipeline) requires a
|
|
@@ -254,7 +252,7 @@ supplied the relevant input; otherwise record `SKIP_USER_INPUT`.
|
|
|
254
252
|
BAD_REQUEST` with `Missing required variable(s)` is **working as designed**, not
|
|
255
253
|
a server fault — rerun with the required variables or pick a no-variable
|
|
256
254
|
pipeline.
|
|
257
|
-
- `
|
|
255
|
+
- `attachment` (operation: `"list"` or `"download"`) — the optional attachment input.
|
|
258
256
|
- The clean-empty artifact retrievers `get_architecture`,
|
|
259
257
|
`get_clarifying_questions`, `get_ticket_critique` — grade a clean empty result
|
|
260
258
|
as `PASS_EXPECTED_404` and valid content as `PASS`.
|
|
@@ -489,12 +487,12 @@ and raw protocol noise.** Sensitive values are redacted.
|
|
|
489
487
|
|
|
490
488
|
---
|
|
491
489
|
|
|
492
|
-
## Full
|
|
490
|
+
## Full 58-Tool Smoke Tier Matrix
|
|
493
491
|
|
|
494
492
|
Every registered MCP tool appears **exactly once** below with its smoke tier.
|
|
495
493
|
Tier 4 (mutating/hazardous) tools are **deferred in v1**.
|
|
496
494
|
|
|
497
|
-
Coverage reconciliation: **
|
|
495
|
+
Coverage reconciliation: **7 + 19 + 1 + 12 + 19 = 58** (BAPI-443 Phase 3a: `list_config_fields` merged into `config_field`; `get_config_field`/`list_attachments`/`download_attachment` merged into `config_field`/`attachment`).
|
|
498
496
|
|
|
499
497
|
| Tier | Tool | Default action / expected-empty / special handling |
|
|
500
498
|
|---|---|---|
|
|
@@ -502,7 +500,6 @@ Coverage reconciliation: **8 + 22 + 1 + 12 + 19 = 62**.
|
|
|
502
500
|
| Tier 0 | `get_my_role` | Zero-input read; always run. |
|
|
503
501
|
| Tier 0 | `get_docs_dir` | Zero-input read; always run; call first to anchor writes. |
|
|
504
502
|
| Tier 0 | `get_project_standards` | Zero-input heavy read; always run; may save/truncate oversized output under `project-standards/`. |
|
|
505
|
-
| Tier 0 | `list_config_fields` | Zero-input read; always run. |
|
|
506
503
|
| Tier 0 | `list_pipelines` | Zero-input read; always run. |
|
|
507
504
|
| Tier 0 | `get_parse_status` | Zero-input read; always run. |
|
|
508
505
|
| Tier 0 | `list_pipeline_runs` | Zero-input read; always run. |
|
|
@@ -523,9 +520,6 @@ Coverage reconciliation: **8 + 22 + 1 + 12 + 19 = 62**.
|
|
|
523
520
|
| Tier 1 | `get_ticket_state` | Read-only; needs ticket key; v1 read-only reaches the clean "not tracked" 404; full state requires deferred Tier 4 `track_ticket`. |
|
|
524
521
|
| Tier 1 | `get_jira_transitions` | Read-only; needs ticket key. |
|
|
525
522
|
| Tier 1 | `resolve_target_status` | Read-only; needs ticket key. |
|
|
526
|
-
| Tier 1 | `get_config_field` | Read-only; needs a config field name. |
|
|
527
|
-
| Tier 1 | `list_attachments` | Read-only; needs ticket key; comments-fallback tool. |
|
|
528
|
-
| Tier 1 | `download_attachment` | Tier 1 network read; secondary **path-canary** — saves locally only when an attachment input is supplied; omit `file_path` or keep any override under `get_docs_dir`. |
|
|
529
523
|
| Tier 1 | `poll_ci_checks` | `available:true` with empty or populated checks is `PASS`; `SKIP_NOT_APPLICABLE` when disabled with `TOOL_DISABLED`/503, or when `resolve_ci_checks` has not populated CI configuration. |
|
|
530
524
|
| Tier 1 | `get_pipeline_recipe` | Read-only; needs a pipeline name plus required variables for variable-declaring pipelines; use `learn-repository` as the no-variable smoke target. |
|
|
531
525
|
| Tier 2 | `generate_decision_page` | Local-only file-write canary; always run with the verbatim payload above. |
|
|
@@ -544,11 +538,11 @@ Coverage reconciliation: **8 + 22 + 1 + 12 + 19 = 62**.
|
|
|
544
538
|
| Tier 4 | `create_ticket` | Mutating; deferred in v1. |
|
|
545
539
|
| Tier 4 | `add_comment` | Mutating; deferred in v1. |
|
|
546
540
|
| Tier 4 | `update_ticket_description` | Mutating; deferred in v1. |
|
|
547
|
-
| Tier 4 | `
|
|
541
|
+
| Tier 4 | `attachment` | Discriminated-union: `upload`/`download`/`list`; classified Tier 4 (upload is mutating); deferred in v1. |
|
|
548
542
|
| Tier 4 | `track_ticket` | Mutating; deferred in v1. |
|
|
549
543
|
| Tier 4 | `update_ticket_state` | Mutating; deferred in v1. |
|
|
550
544
|
| Tier 4 | `update_jira_status` | Mutating; deferred in v1. |
|
|
551
|
-
| Tier 4 | `
|
|
545
|
+
| Tier 4 | `config_field` | Discriminated-union: `get`/`update`/`list`; classified Tier 4 (update is mutating); deferred in v1. |
|
|
552
546
|
| Tier 4 | `create_pull_request` | Mutating; deferred in v1. |
|
|
553
547
|
| Tier 4 | `resolve_ci_checks` | Cache-mutating/orchestration; deferred in v1. |
|
|
554
548
|
| Tier 4 | `run_pipeline` | Orchestration (can dispatch mutating tools); deferred in v1. |
|