@bridge_gpt/mcp-server 0.2.41 → 0.2.43

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. package/README.md +330 -191
  2. package/build/agent-capabilities/cli.js +2 -1
  3. package/build/agent-launchers/claude-executor-adapter.js +17 -4
  4. package/build/agents.generated.js +2 -2
  5. package/build/claude-review-workflow.js +510 -45
  6. package/build/claude-user-config-doctor.js +42 -11
  7. package/build/cli-release.js +2 -1
  8. package/build/commands.generated.js +6 -5
  9. package/build/conduct-epic/bridge-client.js +354 -113
  10. package/build/conduct-epic/checkpoint-store.js +17 -0
  11. package/build/conduct-epic/cli.js +947 -99
  12. package/build/conduct-epic/cut-protocol.js +327 -0
  13. package/build/conduct-epic/spawn.js +14 -2
  14. package/build/conductor/bridge-api-client.js +148 -1
  15. package/build/conductor/cli.js +109 -1
  16. package/build/conductor/doctor.js +101 -16
  17. package/build/conductor/epic-reconcile.js +72 -19
  18. package/build/conductor/epic-runtime.js +15 -3
  19. package/build/conductor/errors.js +47 -0
  20. package/build/conductor/git-hooks.js +205 -11
  21. package/build/conductor/install-doctor.js +230 -1
  22. package/build/conductor/local-merge.js +130 -28
  23. package/build/conductor/recovery-cli.js +313 -0
  24. package/build/conductor/recovery-operations.js +219 -0
  25. package/build/conductor/tools.js +32 -3
  26. package/build/conductor/worker-ledger-cli.js +27 -1
  27. package/build/conductor-bin.js +20 -16
  28. package/build/credentials-cli.js +3 -2
  29. package/build/docs.generated.js +2 -1
  30. package/build/doctor.js +120 -44
  31. package/build/drive-epic.js +375 -0
  32. package/build/executor/cli.js +48 -1
  33. package/build/executor/env.js +21 -0
  34. package/build/executor/http-client.js +71 -3
  35. package/build/executor/index-scope.js +39 -0
  36. package/build/executor/job-errors.js +9 -0
  37. package/build/executor/job-log-registry.js +69 -0
  38. package/build/executor/job-runner.js +198 -29
  39. package/build/executor/live-worker-registry.js +83 -0
  40. package/build/executor/observation.js +259 -6
  41. package/build/executor/platform.js +147 -3
  42. package/build/executor/process.js +58 -14
  43. package/build/executor/runner.js +454 -48
  44. package/build/executor/test-clock.js +3 -2
  45. package/build/executor/worker-finalization.js +233 -56
  46. package/build/executor/worktree.js +8 -1
  47. package/build/index-scope-contract.js +96 -0
  48. package/build/index.js +2277 -270
  49. package/build/init.js +83 -22
  50. package/build/install-bridge-conductor.js +323 -14
  51. package/build/install-bridge.js +225 -47
  52. package/build/install-doctor.js +23 -9
  53. package/build/install-reexec.js +2 -1
  54. package/build/launcher-config-inspection.js +83 -22
  55. package/build/mcp-host-config.js +331 -67
  56. package/build/mcp-host-targets.js +45 -21
  57. package/build/mcp-identity.js +92 -0
  58. package/build/mcp-install-state.js +94 -1
  59. package/build/mcp-invoke.js +2 -1
  60. package/build/mcp-provisioning.js +45 -12
  61. package/build/mcp-registration-doctor.js +35 -13
  62. package/build/mcp-server-invocation.js +4 -2
  63. package/build/merge-pull-request.js +208 -9
  64. package/build/pipelines.generated.js +305 -15
  65. package/build/plane/cli.js +73 -7
  66. package/build/plane/defaults.js +18 -5
  67. package/build/plane/manifest.js +90 -0
  68. package/build/plane/preflight.js +100 -10
  69. package/build/plane/shutdown.js +71 -3
  70. package/build/plane/test-fakes.js +9 -1
  71. package/build/readme.generated.js +1 -1
  72. package/build/regression-check.js +3 -2
  73. package/build/review-tickets.js +8 -7
  74. package/build/run-unit-tests-launcher.js +149 -6
  75. package/build/schedule-run.js +3 -2
  76. package/build/setup-epic.js +531 -82
  77. package/build/sfcc/tool-wrapper.js +15 -0
  78. package/build/start-tickets-prereqs.js +11 -6
  79. package/build/start-tickets.js +91 -85
  80. package/build/update-check.js +3 -2
  81. package/build/upgrade-advice.js +2 -1
  82. package/build/upgrade-cli.js +50 -18
  83. package/build/version.generated.js +2 -1
  84. package/build/worktree-core.js +31 -17
  85. package/docs/CONDUCTOR.md +22 -0
  86. package/docs/install/mcp-tool-integrations.md +19 -3
  87. package/package.json +2 -2
  88. package/pipelines/greenfield-setup.json +286 -0
@@ -97,21 +97,32 @@ function pickWorktreePathField(parsed) {
97
97
  return undefined;
98
98
  }
99
99
  /**
100
- * F7: decide whether a PRE-EXISTING branch is safe to reuse as a conductor
101
- * worktree base. A branch whose tip is an ancestor of the resolved base carries
102
- * no commits beyond base (nothing stale to build on) and is safe. A branch with
103
- * commits not on base is a leftover from a prior run — refuse it. Prefers the
104
- * authoritative `origin/<base>` ref when present. Conservative: any inability to
105
- * prove ancestry refuses (when in doubt, refuse).
100
+ * The remediation sentence for a branch left over by a prior FAILED run.
101
+ * Unchanged since the guard was introduced.
102
+ */
103
+ function staleLeftoverRemedy(branch, baseRef) {
104
+ return (`it carries commits not on the resolved base (likely a leftover from a prior run). ` +
105
+ `Refusing to reuse a stale worktree — delete it (git worktree remove + git branch -D ${branch}) ` +
106
+ `or rebase it onto ${baseRef}, then re-dispatch.`);
107
+ }
108
+ /**
109
+ * BAPI-862: the remediation for a branch that carries a SUCCEEDED implement whose
110
+ * pull request was never attached.
106
111
  *
107
- * `baseStartPoint` (BAPI-527) is the SAME effective base new worktrees are cut
108
- * from: a branch name for interactive dispatch, or the fetched immutable commit
109
- * SHA for non-mutating conductor dispatch. When it is a SHA the `origin/<sha>`
110
- * probe below naturally fails to resolve, so the ancestry check falls back to
111
- * comparing the existing branch directly against that fetched SHA never
112
- * against the local `main` branch name.
112
+ * Names the `pr_not_attached` gate observation so the executor refusal and the
113
+ * reconciler's own state are one searchable vocabulary, points at attachment, and
114
+ * states plainly that the two remedies above destroy completed work. It must not
115
+ * contain the words "delete" or "rebase" at all: an operator scanning a wall of
116
+ * job output for the next command is exactly who lost work last time.
113
117
  */
114
- export async function isExistingBranchSafeToReuse(deps, branch, baseStartPoint) {
118
+ function unattachedSuccessRemedy(branch) {
119
+ return (`it carries the commits of a SUCCEEDED implement whose pull request was never attached ` +
120
+ `(implement gate observation: pr_not_attached). Refusing to reuse the worktree — but this ` +
121
+ `branch is finished work, not a leftover. Open or attach a pull request from '${branch}' and ` +
122
+ `let the reconciler bind it. Do NOT remove or re-write the branch: either would destroy a ` +
123
+ `completed implementation.`);
124
+ }
125
+ export async function isExistingBranchSafeToReuse(deps, branch, baseStartPoint, classification = "unknown") {
115
126
  let baseRef = baseStartPoint;
116
127
  const originRef = `origin/${baseStartPoint}`;
117
128
  const originExists = await deps.runCommand("git", ["rev-parse", "--verify", "--quiet", originRef], { cwd: deps.cwd });
@@ -122,11 +133,14 @@ export async function isExistingBranchSafeToReuse(deps, branch, baseStartPoint)
122
133
  const ancestor = await deps.runCommand("git", ["merge-base", "--is-ancestor", branch, baseRef], { cwd: deps.cwd });
123
134
  if (commandSucceeded(ancestor))
124
135
  return { safe: true };
136
+ // The REFUSAL is identical either way (BAPI-862 non-goal: refusal behavior is
137
+ // unchanged). Only the diagnosis and the remedy differ.
138
+ const remedy = classification === "succeeded_pr_not_attached"
139
+ ? unattachedSuccessRemedy(branch)
140
+ : staleLeftoverRemedy(branch, baseRef);
125
141
  return {
126
142
  safe: false,
127
- reason: `existing branch '${branch}' is not an ancestor of ${baseRef}; it carries commits not on the ` +
128
- `resolved base (likely a leftover from a prior run). Refusing to reuse a stale worktree — delete it ` +
129
- `(git worktree remove + git branch -D ${branch}) or rebase it onto ${baseRef}, then re-dispatch.`,
143
+ reason: `existing branch '${branch}' is not an ancestor of ${baseRef}; ${remedy}`,
130
144
  };
131
145
  }
132
146
  /**
@@ -263,7 +277,7 @@ export async function createWorktreeForTicket(deps, key, branchOverrides, worktr
263
277
  // check compares against the SAME effective base start point (branch name or
264
278
  // fetched SHA) that a NEW branch would be cut from below.
265
279
  if (exists && guardStaleWorktree) {
266
- const safety = await isExistingBranchSafeToReuse(deps, branch, baseStartPoint);
280
+ const safety = await isExistingBranchSafeToReuse(deps, branch, baseStartPoint, behavior.staleBranchClassification ?? "unknown");
267
281
  if (!safety.safe) {
268
282
  return {
269
283
  key,
package/docs/CONDUCTOR.md CHANGED
@@ -315,6 +315,28 @@ redeems the approval token and the server returns `merge.succeeded`.
315
315
  store uses schema version 5 (BAPI-413) to accommodate the `merge.pending_approval`
316
316
  type in the `events.type` CHECK constraint.
317
317
 
318
+ **Who performs the write (BAPI-832).** "Never holds VCS write credentials" above
319
+ describes the *credential*, not the *typing*, and it remains true everywhere. Two
320
+ paths now perform the provider write with the operator's local `gh` rather than
321
+ with the GitHub App installation token, because GitHub's merge endpoint requires
322
+ `contents: write` and the Bridge GPT App installation is `contents: read`:
323
+
324
+ - the executor's `merge` job, via `makeLocalMergeExecutor` — the arrangement
325
+ BAPI-572 locked in; and
326
+ - the `merge_pull_request` MCP tool, which since BAPI-832 sends
327
+ `execution: "local"`, receives a non-terminal `approved_for_local_execution`
328
+ from the route above, merges through that same `conductor/local-merge.ts` seam,
329
+ and reports the outcome to
330
+ `POST /vcs/pull-requests/{pr_number}/merge/complete`.
331
+
332
+ In both, the server still owns every decision — the guards, the lease, and the
333
+ terminal ledger row — and neither path holds a credential of its own; they borrow
334
+ the operator's `gh` session. Mode is `merge_execution` on `epic_supervisor_config`
335
+ (`local` by default, `server` for installations whose App holds
336
+ `contents: write`). A caller that dies mid-merge is recovered by lease expiry, not
337
+ by a new mechanism: the next call re-runs the whole tail, and the provider re-read
338
+ reports `already_merged` if the merge landed.
339
+
318
340
  ## Durable execution environment hardening (BAPI-527)
319
341
 
320
342
  Worker ledger tools are made **reliable again** — this is a robustness fix for the
@@ -179,15 +179,31 @@ by tier.
179
179
  | Tool | Dependencies (class) |
180
180
  |---|---|
181
181
  | `create_pull_request` | VCS **[BLOCK]** (Tier-1) |
182
- | `merge_pull_request` | VCS **[BLOCK]** (Tier-1; protected server-decided merge — see below) |
182
+ | `merge_pull_request` | VCS **[BLOCK]** (Tier-1; protected server-decided merge) + local `gh` login **[BLOCK]** (the merge executes here — see below) |
183
183
  | `resolve_ci_checks` | VCS **[BLOCK]** (Tier-1) |
184
184
  | `poll_ci_checks` | VCS **[BLOCK]** (Tier-1); also **hidden until `ci_check_config` is resolved** (needs a prior `resolve_ci_checks`) |
185
185
  | `materialize_fresh_base` | VCS / git base ref **[BLOCK]** (Tier-1; materializes a pinned base tree) |
186
186
 
187
187
  #### `merge_pull_request` — what the caller can observe
188
188
 
189
- The tool holds no VCS credential and performs no merge of its own; it asks the
190
- server and reports the answer. Four constraints are worth knowing before calling it:
189
+ The tool holds no VCS credential and makes no merge decision of its own; it asks
190
+ the server, and the server decides. Since **BAPI-832** the tool does perform the
191
+ *write*, with the operator's `gh` login, because GitHub's merge endpoint needs
192
+ `contents: write` and the Bridge GPT App installation is `contents: read` — a
193
+ server-side merge simply cannot succeed here. Every server-side guard still runs
194
+ first, and the local path is reachable only from a live approval for that exact
195
+ pull request and head commit.
196
+
197
+ Constraints worth knowing before calling it:
198
+
199
+ - **A logged-in `gh` is required on the machine running the MCP server**, because
200
+ that is where the merge executes. Without one the tool refuses with
201
+ `local_gh_unavailable` or `local_gh_unauthenticated` and a `hint` naming the fix
202
+ (`gh auth login`); nothing is merged and the server-side lease is released. This
203
+ is a **BLOCK**, not a degrade: with no `gh`, no merge is possible at all.
204
+ `doctor` reports the same state under `local_merge`, so it is diagnosable
205
+ read-only before a run. Repositories configured `merge_execution: server` are
206
+ the exception — they need the App permission instead, and no local `gh`.
191
207
 
192
208
  - **Only `merged: true` is success.** `dry_run`, `pending_approval`, and
193
209
  `lease_held` are non-progress outcomes — nothing was merged, and repeating the
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bridge_gpt/mcp-server",
3
- "version": "0.2.41",
3
+ "version": "0.2.43",
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",
@@ -29,7 +29,7 @@
29
29
  "test": "npm run test:normal && npm run test:module-mocks",
30
30
  "test:normal": "node scripts/run-unit-tests.js normal",
31
31
  "test:module-mocks": "node scripts/run-unit-tests.js module-mocks",
32
- "test:integration": "node --test build/conductor/conductor-runtime.integration.test.js build/integration/refresh-main.integration.test.js build/integration/command-provisioning.integration.test.js build/integration/start-tickets.integration.test.js build/integration/start-tickets-tier-handoff.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 build/integration/executor-http-runner.integration.test.js build/integration/executor-job-behaviors.integration.test.js build/integration/executor-recovery-jobs.integration.test.js build/integration/executor-spec-review-prompt.integration.test.js build/integration/resume-pre-spawn.git.integration.test.js build/integration/executor-containment.git.integration.test.js build/integration/conduct-epic-cli.integration.test.js build/integration/conduct-epic-corrections.integration.test.js build/integration/worker-finalization-origin.integration.test.js build/integration/post-remediation-merge-ci-wait.integration.test.js build/integration/executor-merge-supervision.integration.test.js build/integration/attachment-binary-roundtrip.integration.test.js build/integration/dependent-ticket-fresh-base.integration.test.js build/integration/execute-plan-instructions.integration.test.js build/integration/implement-ticket-finalization-order.integration.test.js build/integration/conductor-bundle-artifacts.integration.test.js build/integration/install-bridge-repo-resolution.integration.test.js build/integration/capability-report-contract.integration.test.js build/integration/request-brainstorm-general.integration.test.js build/integration/request-council-trigger-drop.integration.test.js build/integration/install-bridge-onboarding-launch.integration.test.js build/integration/install-bridge-conductor.integration.test.js build/integration/install-bridge-conductor-executor.integration.test.js build/integration/install-bridge-failure-guards.integration.test.js build/integration/learn-repository-pipeline.integration.test.js build/integration/visual-diff-mcp.integration.test.js build/integration/executor-mcp-provisioning.integration.test.js build/integration/executor-worktree-reentry.integration.test.js build/integration/sfcc-read-error-contract.integration.test.js build/integration/sfcc-read-surface.integration.test.js build/integration/sfcc-response-envelope.integration.test.js build/integration/sfcc-total-error-contract.integration.test.js build/integration/sfcc-target-boundary.integration.test.js build/integration/serve-stdio.integration.test.js build/integration/install-alias.integration.test.js build/integration/setup-epic-validation.integration.test.js build/integration/plane-cli.integration.test.js build/integration/executor-auth-retirement.integration.test.js build/integration/decision-implications-command-scaffold.test.js build/integration/strict-mcp-worker-contract.test.js build/integration/executor-adapter-flow.test.js build/integration/install-cli-contract.integration.test.js build/integration/inline-phase-state-tools.test.js",
32
+ "test:integration": "node scripts/run-integration-tests.js",
33
33
  "test:smoke": "node --test build/integration/packaged-cli-smoke.test.js",
34
34
  "canary:agent-capabilities": "npm run build && node scripts/agent-capabilities-canary.mjs",
35
35
  "prepublishOnly": "node scripts/bundle-assets.js && npm run build && node scripts/verify-shebang.cjs"
@@ -0,0 +1,286 @@
1
+ {
2
+ "name": "greenfield-setup",
3
+ "description": "Onboard a brand-new project that has no code to learn from yet. Offers a bounded interview (or generic defaults), ratifies the open non-functional requirements on a decision page, settles version control, convenes a general council, synthesizes one coherent set of project standards behind a single approval, writes the unset standards fields, and closes with the one authoritative install-manifest apply plus the read-after-write manifest /install-bridge resumes from.",
4
+ "variables": [
5
+ "docs_dir",
6
+ "repo_name"
7
+ ],
8
+ "steps": [
9
+ {
10
+ "type": "mcp_call",
11
+ "tool": "ping",
12
+ "params": {},
13
+ "description": "Verify Bridge API connectivity"
14
+ },
15
+ {
16
+ "type": "agent_task",
17
+ "instruction": "Create the required output directory by running: mkdir -p {docs_dir}/greenfield/{repo_name}/standards",
18
+ "description": "Create the greenfield working directory"
19
+ },
20
+ {
21
+ "type": "mcp_call",
22
+ "id": "read_install_manifest",
23
+ "tool": "get_install_manifest",
24
+ "params": {},
25
+ "description": "Read the install manifest once and keep its snapshot token for the final apply"
26
+ },
27
+ {
28
+ "type": "mcp_call",
29
+ "id": "fetch_architecture_instructions",
30
+ "tool": "config_field",
31
+ "params": {
32
+ "field_name": "architecture_instructions",
33
+ "operation": "get"
34
+ },
35
+ "description": "Check whether architecture_instructions already has content",
36
+ "on_error": "warn_and_continue"
37
+ },
38
+ {
39
+ "type": "mcp_call",
40
+ "id": "fetch_review_instructions",
41
+ "tool": "config_field",
42
+ "params": {
43
+ "field_name": "review_instructions",
44
+ "operation": "get"
45
+ },
46
+ "description": "Check whether review_instructions already has content",
47
+ "on_error": "warn_and_continue"
48
+ },
49
+ {
50
+ "type": "mcp_call",
51
+ "id": "fetch_documentation_instructions",
52
+ "tool": "config_field",
53
+ "params": {
54
+ "field_name": "documentation_instructions",
55
+ "operation": "get"
56
+ },
57
+ "description": "Check whether documentation_instructions already has content",
58
+ "on_error": "warn_and_continue"
59
+ },
60
+ {
61
+ "type": "mcp_call",
62
+ "id": "fetch_unit_testing_instructions",
63
+ "tool": "config_field",
64
+ "params": {
65
+ "field_name": "unit_testing_instructions",
66
+ "operation": "get"
67
+ },
68
+ "description": "Check whether unit_testing_instructions already has content",
69
+ "on_error": "warn_and_continue"
70
+ },
71
+ {
72
+ "type": "mcp_call",
73
+ "id": "fetch_e2e_testing_instructions",
74
+ "tool": "config_field",
75
+ "params": {
76
+ "field_name": "e2e_testing_instructions",
77
+ "operation": "get"
78
+ },
79
+ "description": "Check whether e2e_testing_instructions already has content",
80
+ "on_error": "warn_and_continue"
81
+ },
82
+ {
83
+ "type": "mcp_call",
84
+ "id": "fetch_frontend_correctness_standards",
85
+ "tool": "config_field",
86
+ "params": {
87
+ "field_name": "frontend_correctness_standards",
88
+ "operation": "get"
89
+ },
90
+ "description": "Check whether frontend_correctness_standards already has content",
91
+ "on_error": "warn_and_continue"
92
+ },
93
+ {
94
+ "type": "mcp_call",
95
+ "id": "fetch_backend_correctness_standards",
96
+ "tool": "config_field",
97
+ "params": {
98
+ "field_name": "backend_correctness_standards",
99
+ "operation": "get"
100
+ },
101
+ "description": "Check whether backend_correctness_standards already has content",
102
+ "on_error": "warn_and_continue"
103
+ },
104
+ {
105
+ "type": "mcp_call",
106
+ "id": "fetch_template_correctness_standards",
107
+ "tool": "config_field",
108
+ "params": {
109
+ "field_name": "template_correctness_standards",
110
+ "operation": "get"
111
+ },
112
+ "description": "Check whether template_correctness_standards already has content",
113
+ "on_error": "warn_and_continue"
114
+ },
115
+ {
116
+ "type": "mcp_call",
117
+ "id": "fetch_style_correctness_standards",
118
+ "tool": "config_field",
119
+ "params": {
120
+ "field_name": "style_correctness_standards",
121
+ "operation": "get"
122
+ },
123
+ "description": "Check whether style_correctness_standards already has content",
124
+ "on_error": "warn_and_continue"
125
+ },
126
+ {
127
+ "type": "mcp_call",
128
+ "id": "fetch_design_principles",
129
+ "tool": "config_field",
130
+ "params": {
131
+ "field_name": "design_principles",
132
+ "operation": "get"
133
+ },
134
+ "description": "Check whether design_principles already has content",
135
+ "on_error": "warn_and_continue"
136
+ },
137
+ {
138
+ "type": "agent_task",
139
+ "id": "greenfield_interview",
140
+ "instruction_file": "greenfield-interview.md",
141
+ "description": "Offer the interview, settle the project framing and version control, and commit the decisions"
142
+ },
143
+ {
144
+ "type": "agent_task",
145
+ "id": "synthesize_standards",
146
+ "instruction_file": "greenfield-synthesize-standards.md",
147
+ "description": "Draft the project standards from the committed framing and take one approval"
148
+ },
149
+ {
150
+ "type": "mcp_call",
151
+ "id": "upload_architecture_instructions",
152
+ "tool": "config_field",
153
+ "params": {
154
+ "field_name": "architecture_instructions",
155
+ "file_path": "{docs_dir}/greenfield/{repo_name}/standards/architecture_instructions.md",
156
+ "operation": "update",
157
+ "only_if_null": true
158
+ },
159
+ "description": "Save the architecture standard",
160
+ "on_error": "warn_and_continue"
161
+ },
162
+ {
163
+ "type": "mcp_call",
164
+ "id": "upload_review_instructions",
165
+ "tool": "config_field",
166
+ "params": {
167
+ "field_name": "review_instructions",
168
+ "file_path": "{docs_dir}/greenfield/{repo_name}/standards/review_instructions.md",
169
+ "operation": "update",
170
+ "only_if_null": true
171
+ },
172
+ "description": "Save the code-review standard",
173
+ "on_error": "warn_and_continue"
174
+ },
175
+ {
176
+ "type": "mcp_call",
177
+ "id": "upload_documentation_instructions",
178
+ "tool": "config_field",
179
+ "params": {
180
+ "field_name": "documentation_instructions",
181
+ "file_path": "{docs_dir}/greenfield/{repo_name}/standards/documentation_instructions.md",
182
+ "operation": "update",
183
+ "only_if_null": true
184
+ },
185
+ "description": "Save the documentation standard",
186
+ "on_error": "warn_and_continue"
187
+ },
188
+ {
189
+ "type": "mcp_call",
190
+ "id": "upload_unit_testing_instructions",
191
+ "tool": "config_field",
192
+ "params": {
193
+ "field_name": "unit_testing_instructions",
194
+ "file_path": "{docs_dir}/greenfield/{repo_name}/standards/unit_testing_instructions.md",
195
+ "operation": "update",
196
+ "only_if_null": true
197
+ },
198
+ "description": "Save the unit-testing standard",
199
+ "on_error": "warn_and_continue"
200
+ },
201
+ {
202
+ "type": "mcp_call",
203
+ "id": "upload_e2e_testing_instructions",
204
+ "tool": "config_field",
205
+ "params": {
206
+ "field_name": "e2e_testing_instructions",
207
+ "file_path": "{docs_dir}/greenfield/{repo_name}/standards/e2e_testing_instructions.md",
208
+ "operation": "update",
209
+ "only_if_null": true
210
+ },
211
+ "description": "Save the end-to-end testing standard",
212
+ "on_error": "warn_and_continue"
213
+ },
214
+ {
215
+ "type": "mcp_call",
216
+ "id": "upload_frontend_correctness_standards",
217
+ "tool": "config_field",
218
+ "params": {
219
+ "field_name": "frontend_correctness_standards",
220
+ "file_path": "{docs_dir}/greenfield/{repo_name}/standards/frontend_correctness_standards.md",
221
+ "operation": "update",
222
+ "only_if_null": true
223
+ },
224
+ "description": "Save the frontend correctness standard",
225
+ "on_error": "warn_and_continue"
226
+ },
227
+ {
228
+ "type": "mcp_call",
229
+ "id": "upload_backend_correctness_standards",
230
+ "tool": "config_field",
231
+ "params": {
232
+ "field_name": "backend_correctness_standards",
233
+ "file_path": "{docs_dir}/greenfield/{repo_name}/standards/backend_correctness_standards.md",
234
+ "operation": "update",
235
+ "only_if_null": true
236
+ },
237
+ "description": "Save the backend correctness standard",
238
+ "on_error": "warn_and_continue"
239
+ },
240
+ {
241
+ "type": "mcp_call",
242
+ "id": "upload_template_correctness_standards",
243
+ "tool": "config_field",
244
+ "params": {
245
+ "field_name": "template_correctness_standards",
246
+ "file_path": "{docs_dir}/greenfield/{repo_name}/standards/template_correctness_standards.md",
247
+ "operation": "update",
248
+ "only_if_null": true
249
+ },
250
+ "description": "Save the template correctness standard",
251
+ "on_error": "warn_and_continue"
252
+ },
253
+ {
254
+ "type": "mcp_call",
255
+ "id": "upload_style_correctness_standards",
256
+ "tool": "config_field",
257
+ "params": {
258
+ "field_name": "style_correctness_standards",
259
+ "file_path": "{docs_dir}/greenfield/{repo_name}/standards/style_correctness_standards.md",
260
+ "operation": "update",
261
+ "only_if_null": true
262
+ },
263
+ "description": "Save the style correctness standard",
264
+ "on_error": "warn_and_continue"
265
+ },
266
+ {
267
+ "type": "mcp_call",
268
+ "id": "upload_design_principles",
269
+ "tool": "config_field",
270
+ "params": {
271
+ "field_name": "design_principles",
272
+ "file_path": "{docs_dir}/greenfield/{repo_name}/standards/design_principles.md",
273
+ "operation": "update",
274
+ "only_if_null": true
275
+ },
276
+ "description": "Save the design principles",
277
+ "on_error": "warn_and_continue"
278
+ },
279
+ {
280
+ "type": "agent_task",
281
+ "id": "apply_and_report",
282
+ "instruction_file": "greenfield-apply-and-report.md",
283
+ "description": "Save the project setup and report where the project stands"
284
+ }
285
+ ]
286
+ }