@bridge_gpt/mcp-server 0.2.19 → 0.2.21

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 (35) hide show
  1. package/README.md +6 -3
  2. package/build/agents.generated.js +1 -1
  3. package/build/commands.generated.js +4 -3
  4. package/build/conductor/local-merge.js +458 -95
  5. package/build/estimate-epic.js +84 -0
  6. package/build/executor/job-runner.js +151 -17
  7. package/build/executor/merge-job.js +84 -10
  8. package/build/executor/worker-finalization.js +98 -18
  9. package/build/index.js +1843 -401
  10. package/build/pipelines.generated.js +16 -20
  11. package/build/readme.generated.js +1 -1
  12. package/build/review-tickets.js +15 -5
  13. package/build/sfcc/client.js +192 -50
  14. package/build/sfcc/ocapi-write-faults.js +94 -0
  15. package/build/sfcc/permissions.js +7 -22
  16. package/build/sfcc/register.js +9 -0
  17. package/build/sfcc/write-grants.js +80 -0
  18. package/build/sfcc/write-guard.js +39 -0
  19. package/build/sfcc/write-result.js +47 -0
  20. package/build/sfcc/write-tool-common.js +85 -0
  21. package/build/sfcc/writes-custom-object-def.js +141 -0
  22. package/build/sfcc/writes-object-attribute-payloads.js +97 -0
  23. package/build/sfcc/writes-site-preference-payloads.js +59 -0
  24. package/build/sfcc/writes-site-preference.js +96 -0
  25. package/build/sfcc/writes-system-object-payloads.js +213 -0
  26. package/build/sfcc/writes-system-object.js +348 -0
  27. package/build/sfcc/writes.js +66 -0
  28. package/build/version.generated.js +1 -1
  29. package/package.json +3 -3
  30. package/pipelines/idea-to-ticket.json +7 -0
  31. package/pipelines/review-ticket.json +5 -18
  32. package/public/css/main.min.css +1583 -117
  33. package/public/css/main.min.css.map +1 -1
  34. package/public/js/main.min.js +2792 -449
  35. package/public/js/main.min.js.map +1 -1
@@ -0,0 +1,348 @@
1
+ /**
2
+ * SFCC system-object metadata write tools (BAPI-583).
3
+ *
4
+ * Live OCAPI write surface mirroring `reads-system-object.ts`. Implements six
5
+ * sandbox-only write operations:
6
+ * system_object_attribute_definition_create — PUT /system_object_definitions/{type}/attribute_definitions/{id}
7
+ * system_object_attribute_definition_update — PATCH /system_object_definitions/{type}/attribute_definitions/{id}
8
+ * system_object_attribute_group_create — PUT /system_object_definitions/{type}/attribute_groups/{id}
9
+ * system_object_attribute_group_update — PATCH /system_object_definitions/{type}/attribute_groups/{id}
10
+ * system_object_attribute_assign_to_group — PUT /system_object_definitions/{type}/attribute_groups/{group}/attribute_definitions/{def}
11
+ * custom_preference_definition_create — PUT /system_object_definitions/{SitePreferences|OrganizationPreferences}/attribute_definitions/{id}
12
+ *
13
+ * Every handler follows the BAPI-582 foundation write recipe: parse inputs →
14
+ * `rejectIfNotSandboxForWrite` → build a decoupled payload → `ocapiPut`/`ocapiPatch`
15
+ * → `formatOcapiWriteToolResult` (which echoes the OCAPI write-grant JSON on 403).
16
+ */
17
+ import { z } from "zod";
18
+ import { ocapiPut, ocapiPatch } from "./client.js";
19
+ import { withSfccGate } from "./tool-wrapper.js";
20
+ import { rejectIfNotSandboxForWrite } from "./write-guard.js";
21
+ import { formatOcapiWriteToolResult } from "./write-result.js";
22
+ import { objectAttributeDefinitionCreateBodySchema, objectAttributeDefinitionPatchBodySchema, attributeGroupPatchBodySchema, localizedStringSchema, SfccWritePayloadFault, buildObjectAttributeDefinitionCreatePayload, buildObjectAttributeDefinitionPatchPayload, buildAttributeGroupPutPayload, buildAttributeGroupPatchPayload, buildEmptyRelationPayload, } from "./writes-system-object-payloads.js";
23
+ // ---------------------------------------------------------------------------
24
+ // Annotations (destructive OCAPI writes against a developer sandbox)
25
+ // ---------------------------------------------------------------------------
26
+ const WRITE_ANNOTATIONS = {
27
+ readOnlyHint: false,
28
+ destructiveHint: true,
29
+ idempotentHint: false,
30
+ openWorldHint: true,
31
+ };
32
+ function textResult(text) {
33
+ return { content: [{ type: "text", text }] };
34
+ }
35
+ /** Safe 400 envelope for a Zod validation failure — no stacks, no raw thrown strings. */
36
+ function zodValidationEnvelope(err) {
37
+ return textResult(JSON.stringify({
38
+ error: "VALIDATION_ERROR",
39
+ status: 400,
40
+ message: "Invalid SFCC write tool input.",
41
+ issues: err.issues,
42
+ }));
43
+ }
44
+ /** Safe 400 envelope for a local payload-shape fault, in OCAPI-fault vocabulary. */
45
+ function payloadFaultEnvelope(fault) {
46
+ return textResult(JSON.stringify({
47
+ error: "OCAPI_WRITE_ERROR",
48
+ status: fault.status,
49
+ fault: { type: fault.faultType, message: fault.message },
50
+ }));
51
+ }
52
+ /** Safe 500 envelope — never includes stacks, secrets, headers, or raw error text. */
53
+ function unexpectedEnvelope() {
54
+ return textResult(JSON.stringify({
55
+ error: "INTERNAL_ERROR",
56
+ status: 500,
57
+ message: "Unexpected SFCC write tool failure",
58
+ }));
59
+ }
60
+ /** Map a pre-transport error (parse or payload-build) to its safe envelope. */
61
+ function preTransportErrorEnvelope(err) {
62
+ if (err instanceof z.ZodError)
63
+ return zodValidationEnvelope(err);
64
+ if (err instanceof SfccWritePayloadFault)
65
+ return payloadFaultEnvelope(err);
66
+ return unexpectedEnvelope();
67
+ }
68
+ // ---------------------------------------------------------------------------
69
+ // OCAPI path builders (every dynamic segment URL-encoded)
70
+ // ---------------------------------------------------------------------------
71
+ function encodedSegment(segment) {
72
+ return encodeURIComponent(segment);
73
+ }
74
+ function attributeDefinitionPath(objectType, attributeId) {
75
+ return `/system_object_definitions/${encodedSegment(objectType)}/attribute_definitions/${encodedSegment(attributeId)}`;
76
+ }
77
+ function attributeGroupPath(objectType, groupId) {
78
+ return `/system_object_definitions/${encodedSegment(objectType)}/attribute_groups/${encodedSegment(groupId)}`;
79
+ }
80
+ function attributeGroupAssignmentPath(objectType, groupId, attributeId) {
81
+ return (`/system_object_definitions/${encodedSegment(objectType)}` +
82
+ `/attribute_groups/${encodedSegment(groupId)}` +
83
+ `/attribute_definitions/${encodedSegment(attributeId)}`);
84
+ }
85
+ /** Map a preference scope to the OCAPI system object that backs preference attributes. */
86
+ function preferenceObjectTypeForScope(scope) {
87
+ return scope === "site" ? "SitePreferences" : "OrganizationPreferences";
88
+ }
89
+ // ---------------------------------------------------------------------------
90
+ // Input schemas
91
+ // ---------------------------------------------------------------------------
92
+ /** Optional sandbox instance context. Writes are sandbox-only (see write-guard). */
93
+ const instanceSchema = z
94
+ .string()
95
+ .optional()
96
+ .describe("Sandbox-only: omit (defaults to sandbox) or pass \"sandbox\".");
97
+ const createAttributeDefinitionInput = z.object({
98
+ object_type: z.string().describe("System object type, e.g. \"Product\"."),
99
+ attribute_id: z.string().describe("Attribute id (URL id); the body id must match it."),
100
+ definition: objectAttributeDefinitionCreateBodySchema.describe("OCAPI ObjectAttributeDefinition create body (requires value_type)."),
101
+ instance: instanceSchema,
102
+ });
103
+ const updateAttributeDefinitionInput = z.object({
104
+ object_type: z.string().describe("System object type."),
105
+ attribute_id: z.string().describe("Attribute id (URL id)."),
106
+ patch: objectAttributeDefinitionPatchBodySchema.describe("Partial ObjectAttributeDefinition body (>=1 field)."),
107
+ instance: instanceSchema,
108
+ });
109
+ const createAttributeGroupInput = z.object({
110
+ object_type: z.string().describe("System object type."),
111
+ group_id: z.string().describe("Attribute group id (URL id)."),
112
+ display_name: localizedStringSchema.describe("Localized group display name."),
113
+ internal: z.boolean().describe("Whether the group is internal (BM-only)."),
114
+ instance: instanceSchema,
115
+ });
116
+ const updateAttributeGroupInput = z.object({
117
+ object_type: z.string().describe("System object type."),
118
+ group_id: z.string().describe("Attribute group id (URL id)."),
119
+ patch: attributeGroupPatchBodySchema.describe("Partial group body (display_name and/or internal; >=1 field)."),
120
+ instance: instanceSchema,
121
+ });
122
+ const assignAttributeToGroupInput = z.object({
123
+ object_type: z.string().describe("System object type."),
124
+ group_id: z.string().describe("Attribute group id."),
125
+ attribute_id: z.string().describe("Attribute definition id to assign."),
126
+ instance: instanceSchema,
127
+ });
128
+ const createCustomPreferenceDefinitionInput = z.object({
129
+ preference_scope: z
130
+ .enum(["site", "organization"])
131
+ .describe("site → SitePreferences; organization → OrganizationPreferences."),
132
+ preference_id: z.string().describe("Preference (attribute) id."),
133
+ definition: objectAttributeDefinitionCreateBodySchema.describe("OCAPI ObjectAttributeDefinition create body (requires value_type). " +
134
+ "Set default_value for booleans (else they resolve to null)."),
135
+ instance: instanceSchema,
136
+ });
137
+ // ---------------------------------------------------------------------------
138
+ // Handlers
139
+ // ---------------------------------------------------------------------------
140
+ function buildCreateAttributeDefinitionHandler(gateDeps) {
141
+ return withSfccGate(gateDeps, async (args, credentials) => {
142
+ let path;
143
+ let body;
144
+ try {
145
+ const parsed = createAttributeDefinitionInput.parse(args);
146
+ const guard = rejectIfNotSandboxForWrite(parsed.instance);
147
+ if (guard)
148
+ return guard;
149
+ path = attributeDefinitionPath(parsed.object_type, parsed.attribute_id);
150
+ body = buildObjectAttributeDefinitionCreatePayload(parsed.attribute_id, parsed.definition);
151
+ }
152
+ catch (err) {
153
+ return preTransportErrorEnvelope(err);
154
+ }
155
+ try {
156
+ const result = await ocapiPut(path, body, credentials);
157
+ return formatOcapiWriteToolResult(result, "PUT", path);
158
+ }
159
+ catch {
160
+ return unexpectedEnvelope();
161
+ }
162
+ });
163
+ }
164
+ function buildUpdateAttributeDefinitionHandler(gateDeps) {
165
+ return withSfccGate(gateDeps, async (args, credentials) => {
166
+ let path;
167
+ let body;
168
+ try {
169
+ const parsed = updateAttributeDefinitionInput.parse(args);
170
+ const guard = rejectIfNotSandboxForWrite(parsed.instance);
171
+ if (guard)
172
+ return guard;
173
+ path = attributeDefinitionPath(parsed.object_type, parsed.attribute_id);
174
+ body = buildObjectAttributeDefinitionPatchPayload(parsed.attribute_id, parsed.patch);
175
+ }
176
+ catch (err) {
177
+ return preTransportErrorEnvelope(err);
178
+ }
179
+ try {
180
+ // ocapiPatch performs the GET-then-If-Match round trip; 409/412 flow
181
+ // back through formatOcapiWriteToolResult rather than becoming generic errors.
182
+ const result = await ocapiPatch(path, body, credentials);
183
+ return formatOcapiWriteToolResult(result, "PATCH", path);
184
+ }
185
+ catch {
186
+ return unexpectedEnvelope();
187
+ }
188
+ });
189
+ }
190
+ function buildCreateAttributeGroupHandler(gateDeps) {
191
+ return withSfccGate(gateDeps, async (args, credentials) => {
192
+ let path;
193
+ let body;
194
+ try {
195
+ const parsed = createAttributeGroupInput.parse(args);
196
+ const guard = rejectIfNotSandboxForWrite(parsed.instance);
197
+ if (guard)
198
+ return guard;
199
+ path = attributeGroupPath(parsed.object_type, parsed.group_id);
200
+ body = buildAttributeGroupPutPayload({
201
+ display_name: parsed.display_name,
202
+ internal: parsed.internal,
203
+ });
204
+ }
205
+ catch (err) {
206
+ return preTransportErrorEnvelope(err);
207
+ }
208
+ try {
209
+ const result = await ocapiPut(path, body, credentials);
210
+ return formatOcapiWriteToolResult(result, "PUT", path);
211
+ }
212
+ catch {
213
+ return unexpectedEnvelope();
214
+ }
215
+ });
216
+ }
217
+ function buildUpdateAttributeGroupHandler(gateDeps) {
218
+ return withSfccGate(gateDeps, async (args, credentials) => {
219
+ let path;
220
+ let body;
221
+ try {
222
+ const parsed = updateAttributeGroupInput.parse(args);
223
+ const guard = rejectIfNotSandboxForWrite(parsed.instance);
224
+ if (guard)
225
+ return guard;
226
+ path = attributeGroupPath(parsed.object_type, parsed.group_id);
227
+ body = buildAttributeGroupPatchPayload(parsed.patch);
228
+ }
229
+ catch (err) {
230
+ return preTransportErrorEnvelope(err);
231
+ }
232
+ try {
233
+ const result = await ocapiPatch(path, body, credentials);
234
+ return formatOcapiWriteToolResult(result, "PATCH", path);
235
+ }
236
+ catch {
237
+ return unexpectedEnvelope();
238
+ }
239
+ });
240
+ }
241
+ function buildAssignAttributeToGroupHandler(gateDeps) {
242
+ return withSfccGate(gateDeps, async (args, credentials) => {
243
+ let path;
244
+ try {
245
+ const parsed = assignAttributeToGroupInput.parse(args);
246
+ const guard = rejectIfNotSandboxForWrite(parsed.instance);
247
+ if (guard)
248
+ return guard;
249
+ path = attributeGroupAssignmentPath(parsed.object_type, parsed.group_id, parsed.attribute_id);
250
+ }
251
+ catch (err) {
252
+ return preTransportErrorEnvelope(err);
253
+ }
254
+ try {
255
+ const result = await ocapiPut(path, buildEmptyRelationPayload(), credentials);
256
+ return formatOcapiWriteToolResult(result, "PUT", path);
257
+ }
258
+ catch {
259
+ return unexpectedEnvelope();
260
+ }
261
+ });
262
+ }
263
+ function buildCreateCustomPreferenceDefinitionHandler(gateDeps) {
264
+ return withSfccGate(gateDeps, async (args, credentials) => {
265
+ let path;
266
+ let body;
267
+ try {
268
+ const parsed = createCustomPreferenceDefinitionInput.parse(args);
269
+ const guard = rejectIfNotSandboxForWrite(parsed.instance);
270
+ if (guard)
271
+ return guard;
272
+ const objectType = preferenceObjectTypeForScope(parsed.preference_scope);
273
+ path = attributeDefinitionPath(objectType, parsed.preference_id);
274
+ body = buildObjectAttributeDefinitionCreatePayload(parsed.preference_id, parsed.definition);
275
+ }
276
+ catch (err) {
277
+ return preTransportErrorEnvelope(err);
278
+ }
279
+ try {
280
+ const result = await ocapiPut(path, body, credentials);
281
+ return formatOcapiWriteToolResult(result, "PUT", path);
282
+ }
283
+ catch {
284
+ return unexpectedEnvelope();
285
+ }
286
+ });
287
+ }
288
+ // ---------------------------------------------------------------------------
289
+ // Registration
290
+ // ---------------------------------------------------------------------------
291
+ /** Concrete write tool names registered by this module. */
292
+ export const SYSTEM_OBJECT_WRITE_TOOL_NAMES = [
293
+ "system_object_attribute_definition_create",
294
+ "system_object_attribute_definition_update",
295
+ "system_object_attribute_group_create",
296
+ "system_object_attribute_group_update",
297
+ "system_object_attribute_assign_to_group",
298
+ "custom_preference_definition_create",
299
+ ];
300
+ /**
301
+ * Register the six SFCC system-object write tools. Called from the write seam
302
+ * (`registerSfccWriteTools` in writes.ts) — no direct `register.ts`/`index.ts` edits.
303
+ */
304
+ export function registerSystemObjectWriteTools(registerTool, deps) {
305
+ const { gateDeps } = deps;
306
+ registerTool("system_object_attribute_definition_create", {
307
+ description: "Create a system-object attribute definition (sandbox-only, destructive). " +
308
+ "PUT .../attribute_definitions/{id}; body id must equal URL id and system must be false. " +
309
+ "Returns 201. HTTP 403 echoes the OCAPI write-grant JSON.",
310
+ inputSchema: createAttributeDefinitionInput,
311
+ annotations: WRITE_ANNOTATIONS,
312
+ }, buildCreateAttributeDefinitionHandler(gateDeps));
313
+ registerTool("system_object_attribute_definition_update", {
314
+ description: "Update a system-object attribute definition (sandbox-only, destructive). " +
315
+ "PATCH .../attribute_definitions/{id} via the ETag GET-then-If-Match round trip. " +
316
+ "Returns 200; surfaces 409/412 on ETag conflicts. HTTP 403 echoes the write-grant JSON.",
317
+ inputSchema: updateAttributeDefinitionInput,
318
+ annotations: WRITE_ANNOTATIONS,
319
+ }, buildUpdateAttributeDefinitionHandler(gateDeps));
320
+ registerTool("system_object_attribute_group_create", {
321
+ description: "Create a system-object attribute group (sandbox-only, destructive). " +
322
+ "PUT .../attribute_groups/{id} with a minimal body (display_name + internal). " +
323
+ "HTTP 403 echoes the OCAPI write-grant JSON.",
324
+ inputSchema: createAttributeGroupInput,
325
+ annotations: WRITE_ANNOTATIONS,
326
+ }, buildCreateAttributeGroupHandler(gateDeps));
327
+ registerTool("system_object_attribute_group_update", {
328
+ description: "Update a system-object attribute group (sandbox-only, destructive). " +
329
+ "PATCH .../attribute_groups/{id} via the ETag round trip (display_name and/or internal). " +
330
+ "HTTP 403 echoes the OCAPI write-grant JSON.",
331
+ inputSchema: updateAttributeGroupInput,
332
+ annotations: WRITE_ANNOTATIONS,
333
+ }, buildUpdateAttributeGroupHandler(gateDeps));
334
+ registerTool("system_object_attribute_assign_to_group", {
335
+ description: "Assign an attribute definition to an attribute group (sandbox-only, destructive). " +
336
+ "PUT .../attribute_groups/{group}/attribute_definitions/{def} with an empty body. " +
337
+ "HTTP 403 echoes the OCAPI write-grant JSON.",
338
+ inputSchema: assignAttributeToGroupInput,
339
+ annotations: WRITE_ANNOTATIONS,
340
+ }, buildAssignAttributeToGroupHandler(gateDeps));
341
+ registerTool("custom_preference_definition_create", {
342
+ description: "Create a custom preference definition (sandbox-only, destructive). " +
343
+ "PUT .../{SitePreferences|OrganizationPreferences}/attribute_definitions/{id}. " +
344
+ "Booleans resolve to null unless default_value is set. HTTP 403 echoes the write-grant JSON.",
345
+ inputSchema: createCustomPreferenceDefinitionInput,
346
+ annotations: WRITE_ANNOTATIONS,
347
+ }, buildCreateCustomPreferenceDefinitionHandler(gateDeps));
348
+ }
@@ -0,0 +1,66 @@
1
+ /**
2
+ * SFCC write-tool registration aggregator (BAPI-581 / BAPI-582 foundation,
3
+ * populated by BAPI-584).
4
+ *
5
+ * This is the registration seam that write-surface tickets register through.
6
+ * `register.ts` wires this behind the existing `includeReadTools` SFCC gate, so
7
+ * the write tools become default-on with the reads without touching
8
+ * `register.ts` or `index.ts`.
9
+ *
10
+ * Each write handler follows the foundation recipe:
11
+ * 1. Parse inputs.
12
+ * 2. Call `rejectIfNotSandboxForWrite` (write-guard.ts) BEFORE payload
13
+ * construction or any OCAPI mutation.
14
+ * 3. Build the SFCC payload in a tool-specific payload helper.
15
+ * 4. Call `ocapiPut` / `ocapiPatch` / `ocapiPatchDirect` (client.ts).
16
+ * 5. Route the result through `formatOcapiWriteToolResult` (write-result.ts).
17
+ */
18
+ import { registerSystemObjectWriteTools, SYSTEM_OBJECT_WRITE_TOOL_NAMES, } from "./writes-system-object.js";
19
+ import { registerSfccCustomObjectDefWriteTools, CUSTOM_OBJECT_DEF_WRITE_TOOL_NAMES, } from "./writes-custom-object-def.js";
20
+ import { registerSitePreferenceWriteTools, SITE_PREFERENCE_WRITE_TOOL_NAMES, } from "./writes-site-preference.js";
21
+ // ---------------------------------------------------------------------------
22
+ // Tool name registry
23
+ // ---------------------------------------------------------------------------
24
+ /**
25
+ * Write tool names registered by this seam (centralized inventory). Extended by
26
+ * each write-surface ticket — BAPI-583 adds the six system-object write tools,
27
+ * BAPI-584 adds the custom-object attribute-definition and site-preference value
28
+ * write tools.
29
+ */
30
+ export const SFCC_WRITE_TOOL_NAMES = [
31
+ ...SYSTEM_OBJECT_WRITE_TOOL_NAMES,
32
+ ...CUSTOM_OBJECT_DEF_WRITE_TOOL_NAMES,
33
+ ...SITE_PREFERENCE_WRITE_TOOL_NAMES,
34
+ ];
35
+ // ---------------------------------------------------------------------------
36
+ // Registration
37
+ // ---------------------------------------------------------------------------
38
+ /**
39
+ * Register all SFCC write tools through the host's registerTool wrapper.
40
+ *
41
+ * Registration is delegated to per-surface write modules. Each write handler
42
+ * MUST:
43
+ * 1. Parse inputs.
44
+ * 2. Call `rejectIfNotSandboxForWrite` (write-guard.ts) BEFORE payload
45
+ * construction or any OCAPI mutation.
46
+ * 3. Build the SFCC payload in a tool-specific payload helper.
47
+ * 4. Call `ocapiPut` or `ocapiPatch` (client.ts) for transport.
48
+ * 5. Route the result through `formatOcapiWriteToolResult` (write-result.ts).
49
+ *
50
+ * Each handler is additionally call-time gated by `withSfccGate` and
51
+ * sandbox-guarded, so registering them here (default-on with the reads) does
52
+ * not weaken the per-call safety model.
53
+ *
54
+ * BAPI-583 registers the system-object write surface here; BAPI-584 adds the
55
+ * custom-object attribute-definition and site-preference value write surfaces
56
+ * alongside it. Later write-surface tickets add their modules the same way,
57
+ * without touching `register.ts`/`index.ts`.
58
+ */
59
+ export function registerSfccWriteTools(registerTool, deps) {
60
+ // System-object attribute/group definition writes (BAPI-583).
61
+ registerSystemObjectWriteTools(registerTool, { gateDeps: deps.gateDeps });
62
+ // Custom-object attribute-definition create/update (PUT / ETag-PATCH).
63
+ registerSfccCustomObjectDefWriteTools(registerTool, { gateDeps: deps.gateDeps });
64
+ // Site-preference value set (direct PATCH of a flat c_ map).
65
+ registerSitePreferenceWriteTools(registerTool, { gateDeps: deps.gateDeps });
66
+ }
@@ -1,2 +1,2 @@
1
1
  // AUTO-GENERATED — do not edit manually. Regenerate with: npm run build
2
- export const VERSION = "0.2.19";
2
+ export const VERSION = "0.2.21";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bridge_gpt/mcp-server",
3
- "version": "0.2.19",
3
+ "version": "0.2.21",
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",
@@ -27,8 +27,8 @@
27
27
  "check:version-generated": "node scripts/bundle-version.js && node scripts/check-version-generated.js",
28
28
  "postbuild": "node scripts/prepend-shebang.cjs",
29
29
  "start": "node build/index.js",
30
- "test": "node --test --test-force-exit build/pipeline-utils.test.js build/backend-warnings.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/config-fields.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/mcp-server-invocation.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/regression-check.test.js build/doctor.test.js build/install-doctor.test.js build/install-bridge.test.js build/init.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/probe-context.test.js build/agent-capabilities/reporter.test.js build/conductor/taxonomy-and-errors.test.js build/conductor/github-mergeability.test.js build/conductor/merge-conflict-routing.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/pr-review-producer.test.js build/conductor/doctor.test.js build/conductor/deny-enforcement-preflight.test.js build/conductor/errors.test.js build/conductor/store.test.js build/conductor/index-poll-ci-producer.test.js build/start-tickets-conductor.test.js build/start-tickets-conductor.spawn.test.js build/start-tickets-conductor-node-propagation.test.js build/start-tickets.non-mutating-base.test.js build/start-tickets-live-source-guard.test.js build/conductor/worker-ledger-cli.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-retired-judgment.static.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/event-accessors.test.js build/conductor/merge-ledger.test.js build/conductor/deterministic-completion.static.test.js build/conductor/deterministic-completion.integration.test.js build/conductor/local-merge.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/executor/claude-settings.test.js build/executor/cli.test.js build/executor/credentials.test.js build/executor/echo-acceptance.test.js build/executor/env.test.js build/executor/heartbeat.test.js build/executor/http-client.test.js build/executor/job-runner.test.js build/executor/job-runner.payload-timeout.test.js build/executor/worker-finalization.test.js build/executor/job-runner.static.test.js build/executor/prompt-spec.test.js build/executor/job-types.test.js build/executor/recovery-job.static.test.js build/executor/observation.test.js build/executor/permissions.test.js build/executor/preflight.test.js build/executor/process.test.js build/executor/results.test.js build/executor/runner.test.js build/executor/terminal-mutation.test.js build/executor/worker-command.test.js build/executor/worktree-core.test.js build/executor/worktree.test.js build/executor/job-errors.test.js build/executor/worktree-inspection.test.js build/executor/resume-pre-spawn.test.js build/executor/verdict-artifact.test.js build/executor/worker-log.test.js build/executor/job-log-registry.test.js build/executor/viewer-tabs.test.js build/executor/watch-cli.test.js build/executor/merge-job.test.js build/executor/worktree-gc.test.js build/executor/runner.job-behaviors.test.js build/conductor/cli-freeze.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/conductor/file-scope-guard.test.js build/conductor/file-scope-guard.integration.test.js build/mcp-profile.test.js build/mcp-profile-registration.test.js build/tools-budget.test.js build/visual-diff-worker.test.js build/visual-diff.test.js build/integration/measure-tools.test.js build/sfcc/config.test.js build/sfcc/ocapi-shape.test.js build/sfcc/output.test.js build/sfcc/credentials.test.js && node --experimental-test-module-mocks --test --test-force-exit 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/visual-diff.registration.test.js build/visual-diff.attachment-adapter.test.js build/attachment-download.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/pr-ci-producer-emit-seam.test.js build/conductor/cli-git-hooks.test.js build/sfcc/client.test.js build/sfcc/tool-wrapper.test.js build/sfcc/setup-status.test.js build/sfcc/permissions.test.js build/sfcc/register.test.js build/sfcc/reads-system-object.test.js build/sfcc/reads-custom-object-def.test.js build/sfcc/reads-site-preference.test.js",
31
- "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 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",
30
+ "test": "node --test --test-force-exit build/pipeline-utils.test.js build/backend-warnings.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/config-fields.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/mcp-server-invocation.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/regression-check.test.js build/doctor.test.js build/install-doctor.test.js build/install-bridge.test.js build/init.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/probe-context.test.js build/agent-capabilities/reporter.test.js build/conductor/taxonomy-and-errors.test.js build/conductor/github-mergeability.test.js build/conductor/merge-conflict-routing.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/pr-review-producer.test.js build/conductor/doctor.test.js build/conductor/deny-enforcement-preflight.test.js build/conductor/errors.test.js build/conductor/store.test.js build/conductor/index-poll-ci-producer.test.js build/start-tickets-conductor.test.js build/start-tickets-conductor.spawn.test.js build/start-tickets-conductor-node-propagation.test.js build/start-tickets.non-mutating-base.test.js build/start-tickets-live-source-guard.test.js build/conductor/worker-ledger-cli.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-retired-judgment.static.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/event-accessors.test.js build/conductor/merge-ledger.test.js build/conductor/deterministic-completion.static.test.js build/conductor/deterministic-completion.integration.test.js build/conductor/local-merge.test.js build/conductor/local-merge.static.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/executor/claude-settings.test.js build/executor/cli.test.js build/executor/credentials.test.js build/executor/echo-acceptance.test.js build/executor/env.test.js build/executor/heartbeat.test.js build/executor/http-client.test.js build/executor/job-runner.test.js build/executor/job-runner.payload-timeout.test.js build/executor/worker-finalization.test.js build/executor/job-runner.static.test.js build/executor/prompt-spec.test.js build/executor/job-types.test.js build/executor/recovery-job.static.test.js build/executor/observation.test.js build/executor/permissions.test.js build/executor/preflight.test.js build/executor/process.test.js build/executor/results.test.js build/executor/runner.test.js build/executor/terminal-mutation.test.js build/executor/worker-command.test.js build/executor/worktree-core.test.js build/executor/worktree.test.js build/executor/job-errors.test.js build/executor/worktree-inspection.test.js build/executor/resume-pre-spawn.test.js build/executor/verdict-artifact.test.js build/executor/worker-log.test.js build/executor/job-log-registry.test.js build/executor/viewer-tabs.test.js build/executor/watch-cli.test.js build/executor/merge-job.test.js build/executor/job-runner.merge.test.js build/executor/worktree-gc.test.js build/executor/runner.job-behaviors.test.js build/conductor/cli-freeze.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/conductor/file-scope-guard.test.js build/conductor/file-scope-guard.integration.test.js build/mcp-profile.test.js build/mcp-profile-registration.test.js build/tools-budget.test.js build/visual-diff-worker.test.js build/visual-diff.test.js build/estimate-epic.test.js build/integration/measure-tools.test.js build/sfcc/config.test.js build/sfcc/ocapi-shape.test.js build/sfcc/output.test.js build/sfcc/credentials.test.js build/sfcc/ocapi-write-faults.test.js build/sfcc/write-guard.test.js build/sfcc/write-grants.test.js build/sfcc/write-result.test.js build/sfcc/writes.test.js build/sfcc/writes-system-object-payloads.test.js build/sfcc/writes-payloads.test.js && node --experimental-test-module-mocks --test --test-force-exit build/index-heavy-read-truncation.test.js build/index-artifacts.test.js build/index.review-rounds.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/visual-diff.registration.test.js build/visual-diff.attachment-adapter.test.js build/attachment-download.test.js build/attachment-upload.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/pr-ci-producer-emit-seam.test.js build/conductor/cli-git-hooks.test.js build/sfcc/client.test.js build/sfcc/tool-wrapper.test.js build/sfcc/setup-status.test.js build/sfcc/permissions.test.js build/sfcc/register.test.js build/sfcc/reads-system-object.test.js build/sfcc/reads-custom-object-def.test.js build/sfcc/reads-site-preference.test.js build/sfcc/writes-system-object.test.js build/sfcc/writes-custom-object-def.test.js build/sfcc/writes-site-preference.test.js",
31
+ "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 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/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",
32
32
  "test:smoke": "node --test build/integration/packaged-cli-smoke.test.js",
33
33
  "prepublishOnly": "node scripts/bundle-assets.js && npm run build && node scripts/verify-shebang.cjs"
34
34
  },
@@ -62,6 +62,13 @@
62
62
  "instruction_file": "frame-goals-and-nfrs.md",
63
63
  "description": "Frame business goals, desired end-state, and non-functional requirements (documentary)"
64
64
  },
65
+ {
66
+ "id": "comp-analysis",
67
+ "type": "agent_task",
68
+ "instruction_file": "comp-analysis.md",
69
+ "description": "Analyze any design comp and map it to existing codebase components/templates/tokens/routes (gated, backend-safe)",
70
+ "on_error": "warn_and_continue"
71
+ },
65
72
  {
66
73
  "type": "agent_task",
67
74
  "instruction_file": "draft-and-critique.md",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "review-ticket",
3
- "description": "Review a ticket with two rounds of analysis (initial + automatic second opinion by default), evaluate suggestions for accuracy, and produce a combined review-and-resolution document with decision trees. The automatic second-opinion step is skippable via --rounds=1 mode (skip_steps: [\"second-opinion-review\"]).",
4
- "variables": ["ticket_key", "docs_dir", "base_branch", "base_sha", "no_refresh_base"],
3
+ "description": "Review a ticket, evaluate suggestions for accuracy, and produce a combined review-and-resolution document with decision trees. A single request_ticket_review step runs the backend's resolved difficulty-adaptive review policy, which internally runs any second-opinion rounds server-side. Pass --rounds=1|2 to forward an explicit round count that forces the review shape (1 = single pass, 2 = full second-opinion review); omit it to let the backend policy executor decide adaptively.",
4
+ "variables": ["ticket_key", "docs_dir", "base_branch", "base_sha", "no_refresh_base", "rounds"],
5
5
  "steps": [
6
6
  {
7
7
  "type": "mcp_call",
@@ -16,23 +16,10 @@
16
16
  "ticket_number": "{ticket_key}",
17
17
  "wait_for_result": true,
18
18
  "save_locally": true,
19
- "provider": "{provider}"
19
+ "provider": "{provider}",
20
+ "rounds": "{rounds}"
20
21
  },
21
- "description": "Generate combined clarify+critique review (initial)",
22
- "on_error": "warn_and_continue"
23
- },
24
- {
25
- "type": "mcp_call",
26
- "id": "second-opinion-review",
27
- "tool": "request_ticket_review",
28
- "params": {
29
- "ticket_number": "{ticket_key}",
30
- "second_opinion": "auto",
31
- "wait_for_result": true,
32
- "save_locally": true,
33
- "provider": "{provider}"
34
- },
35
- "description": "Generate combined clarify+critique review (second opinion)",
22
+ "description": "Generate combined clarify+critique review. The backend runs the resolved difficulty-adaptive policy (including any second-opinion rounds) server-side; an explicit rounds value (1|2) forces the shape.",
36
23
  "on_error": "warn_and_continue"
37
24
  },
38
25
  {