@testchimp/cli 0.1.22 → 0.1.23

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.
@@ -44,6 +44,41 @@ function mergeBodies(flagBody, jsonInputRaw) {
44
44
  return flagBody;
45
45
  return deepMerge(flagBody, extra);
46
46
  }
47
+ /** Shared agent policy/traceability flags for mutating CRUD commands. */
48
+ function addAgentTraceabilityOptions(cmd) {
49
+ return cmd
50
+ .option("--workflow-id <id>", "Catalog workflow id for agent Activity")
51
+ .option("--workflow-execution-id <ulid>", "Stable ULID for the whole agent run")
52
+ .option("--policy-file <name>", "Policy filename (e.g. run-qa.policy.md)")
53
+ .option("--policy-version <semver>", "Policy version from frontmatter")
54
+ .option("--git-sha <sha>", "Git SHA (defaults to HEAD)")
55
+ .option("--actor-type <type>", "LOCAL_AGENT | CLOUD_AGENT")
56
+ .option("--user-id <id>", "Optional user id")
57
+ .option("--branch-name <name>", "Git branch name")
58
+ .option("--agent-model <model>", "Optional agent model id (agent/CLI only)");
59
+ }
60
+ function collectAgentTraceabilityFlags(opts) {
61
+ const body = {};
62
+ if (opts.workflowId)
63
+ body.workflowId = String(opts.workflowId).trim();
64
+ if (opts.workflowExecutionId)
65
+ body.workflowExecutionId = String(opts.workflowExecutionId).trim();
66
+ if (opts.policyFile)
67
+ body.policyFile = String(opts.policyFile).trim();
68
+ if (opts.policyVersion)
69
+ body.policyVersion = String(opts.policyVersion).trim();
70
+ if (opts.gitSha)
71
+ body.gitSha = String(opts.gitSha).trim();
72
+ if (opts.actorType)
73
+ body.actorType = String(opts.actorType).trim();
74
+ if (opts.userId)
75
+ body.userId = String(opts.userId).trim();
76
+ if (opts.branchName)
77
+ body.branchName = String(opts.branchName).trim();
78
+ if (opts.agentModel)
79
+ body.agentModel = String(opts.agentModel).trim();
80
+ return body;
81
+ }
47
82
  function stderrProgress(msg) {
48
83
  console.error(`[testchimp] ${msg}`);
49
84
  }
@@ -176,48 +211,50 @@ export function buildCliProgram() {
176
211
  const out = await runTool("fetch-execution-report", merged, { postMcp });
177
212
  console.log(out);
178
213
  });
179
- program
214
+ addAgentTraceabilityOptions(program
180
215
  .command("create-user-story")
181
216
  .description(TOOL_DEFINITIONS.find((t) => t.kebab === "create-user-story").description)
182
217
  .addOption(jsonInputOption())
183
218
  .requiredOption("--platform-file-path <path>")
184
- .requiredOption("--title <title>")
185
- .action(async (opts) => {
186
- const body = { platformFilePath: opts.platformFilePath, title: opts.title };
219
+ .requiredOption("--title <title>")).action(async (opts) => {
220
+ const body = {
221
+ platformFilePath: opts.platformFilePath,
222
+ title: opts.title,
223
+ ...collectAgentTraceabilityFlags(opts),
224
+ };
187
225
  const merged = mergeBodies(body, opts.jsonInput);
188
226
  const out = await runTool("create-user-story", merged, { postMcp });
189
227
  console.log(out);
190
228
  });
191
- program
229
+ addAgentTraceabilityOptions(program
192
230
  .command("create-test-scenario")
193
231
  .description(TOOL_DEFINITIONS.find((t) => t.kebab === "create-test-scenario").description)
194
232
  .addOption(jsonInputOption())
195
233
  .requiredOption("--platform-file-path <path>")
196
234
  .requiredOption("--title <title>")
197
- .requiredOption("--user-story-ordinal-id <n>")
198
- .action(async (opts) => {
235
+ .requiredOption("--user-story-ordinal-id <n>")).action(async (opts) => {
199
236
  const body = {
200
237
  platformFilePath: opts.platformFilePath,
201
238
  title: opts.title,
202
239
  userStoryOrdinalId: Number(opts.userStoryOrdinalId),
240
+ ...collectAgentTraceabilityFlags(opts),
203
241
  };
204
242
  const merged = mergeBodies(body, opts.jsonInput);
205
243
  const out = await runTool("create-test-scenario", merged, { postMcp });
206
244
  console.log(out);
207
245
  });
208
- program
246
+ addAgentTraceabilityOptions(program
209
247
  .command("update-user-story")
210
248
  .description(TOOL_DEFINITIONS.find((t) => t.kebab === "update-user-story").description)
211
249
  .addOption(jsonInputOption())
212
250
  .option("--content <markdown>", "full markdown including frontmatter")
213
- .option("--content-file <path>", "read markdown from file")
214
- .action(async (opts) => {
251
+ .option("--content-file <path>", "read markdown from file")).action(async (opts) => {
215
252
  let content = opts.content;
216
253
  if (opts.contentFile)
217
254
  content = await readFile(String(opts.contentFile), "utf8");
218
255
  if (!content)
219
256
  throw new Error("Provide --content or --content-file (or full body via --json-input)");
220
- const body = { content };
257
+ const body = { content, ...collectAgentTraceabilityFlags(opts) };
221
258
  const merged = mergeBodies(body, opts.jsonInput);
222
259
  const out = await runTool("update-user-story", merged, { postMcp });
223
260
  console.log(out);
@@ -286,15 +323,16 @@ export function buildCliProgram() {
286
323
  const out = await runTool("get-issue-details", { issueId: String(merged.issueId).trim() }, { postMcp });
287
324
  console.log(out);
288
325
  });
289
- program
326
+ addAgentTraceabilityOptions(program
290
327
  .command("update-issue-status")
291
328
  .description(TOOL_DEFINITIONS.find((t) => t.kebab === "update-issue-status").description)
292
329
  .addOption(jsonInputOption())
293
330
  .option("--issue-id <id>", "Issue ordinal id (#B-123, B-123, B123, or 123)")
294
331
  .option("--status <status>", "ACTIVE | IGNORED | FIXED | DUPLICATE | IN_PROGRESS_BUG | ARCHIVED_BUG | BLOCKED")
295
- .option("--ignore-reason <reason>", "When status=IGNORED: INTENDED_BEHAVIOUR | INACCURATE_ASSESSMENT | NOT_IMPORTANT")
296
- .action(async (opts) => {
297
- const body = {};
332
+ .option("--ignore-reason <reason>", "When status=IGNORED: INTENDED_BEHAVIOUR | INACCURATE_ASSESSMENT | NOT_IMPORTANT")).action(async (opts) => {
333
+ const body = {
334
+ ...collectAgentTraceabilityFlags(opts),
335
+ };
298
336
  if (opts.issueId)
299
337
  body.issueId = String(opts.issueId).trim();
300
338
  if (opts.status)
@@ -308,16 +346,10 @@ export function buildCliProgram() {
308
346
  if (!merged.status || String(merged.status).trim() === "") {
309
347
  throw new Error("status is required (ACTIVE | IGNORED | FIXED | DUPLICATE | IN_PROGRESS_BUG | ARCHIVED_BUG | BLOCKED)");
310
348
  }
311
- const out = await runTool("update-issue-status", {
312
- issueId: String(merged.issueId).trim(),
313
- status: String(merged.status).trim(),
314
- ...(merged.ignoreReason
315
- ? { ignoreReason: String(merged.ignoreReason).trim() }
316
- : {}),
317
- }, { postMcp });
349
+ const out = await runTool("update-issue-status", merged, { postMcp });
318
350
  console.log(out);
319
351
  });
320
- program
352
+ addAgentTraceabilityOptions(program
321
353
  .command("create-issue")
322
354
  .description(TOOL_DEFINITIONS.find((t) => t.kebab === "create-issue").description)
323
355
  .addOption(jsonInputOption())
@@ -332,9 +364,10 @@ export function buildCliProgram() {
332
364
  .option("--assignee <userId>", "Assignee user id")
333
365
  .option("--labels <csv>", "Comma-separated labels")
334
366
  .option("--source <name>", "External ingest source identifier (stored as label source:<name>)")
335
- .option("--environment <name>", "Environment tag (defaults to QA when omitted)")
336
- .action(async (opts) => {
337
- const body = {};
367
+ .option("--environment <name>", "Environment tag (defaults to QA when omitted)")).action(async (opts) => {
368
+ const body = {
369
+ ...collectAgentTraceabilityFlags(opts),
370
+ };
338
371
  if (opts.title)
339
372
  body.title = String(opts.title).trim();
340
373
  if (opts.description)
@@ -427,19 +460,18 @@ export function buildCliProgram() {
427
460
  }, { postMcp });
428
461
  console.log(out);
429
462
  });
430
- program
463
+ addAgentTraceabilityOptions(program
431
464
  .command("update-test-scenario")
432
465
  .description(TOOL_DEFINITIONS.find((t) => t.kebab === "update-test-scenario").description)
433
466
  .addOption(jsonInputOption())
434
467
  .option("--content <markdown>")
435
- .option("--content-file <path>")
436
- .action(async (opts) => {
468
+ .option("--content-file <path>")).action(async (opts) => {
437
469
  let content = opts.content;
438
470
  if (opts.contentFile)
439
471
  content = await readFile(String(opts.contentFile), "utf8");
440
472
  if (!content)
441
473
  throw new Error("Provide --content or --content-file (or full body via --json-input)");
442
- const body = { content };
474
+ const body = { content, ...collectAgentTraceabilityFlags(opts) };
443
475
  const merged = mergeBodies(body, opts.jsonInput);
444
476
  const out = await runTool("update-test-scenario", merged, { postMcp });
445
477
  console.log(out);
@@ -945,6 +977,7 @@ export function buildCliProgram() {
945
977
  .option("--actor-type <type>", "LOCAL_AGENT|CLOUD_AGENT (or local-agent|cloud-agent)")
946
978
  .option("--user-id <id>", "Optional user id for traceability")
947
979
  .option("--branch-name <name>", "Git branch")
980
+ .option("--agent-model <model>", "Optional agent model id (agent/CLI only)")
948
981
  .requiredOption("--entity-type <type>", "USER_STORY|SCENARIO|SMART_TEST|POLICY|ISSUE|TEST_EXECUTION|TEST_INVOCATION_BATCH|EXPLORATION|EVENT|WORKFLOW")
949
982
  .option("--entity-identity <ordinal>", "Project-scoped ordinal id (mutually exclusive with --test-json)")
950
983
  .option("--test-json <json>", "TestLocator JSON (folderPath/fileName/testSuite/testName)")
@@ -968,6 +1001,8 @@ export function buildCliProgram() {
968
1001
  body.userId = String(opts.userId);
969
1002
  if (opts.branchName)
970
1003
  body.branchName = String(opts.branchName);
1004
+ if (opts.agentModel)
1005
+ body.agentModel = String(opts.agentModel).trim();
971
1006
  if (opts.entityIdentity)
972
1007
  body.entityIdentity = String(opts.entityIdentity);
973
1008
  if (opts.testJson)
@@ -0,0 +1,22 @@
1
+ /** Flat CLI/MCP fields that map to AgentActionTraceability. */
2
+ export type AgentTraceabilityFields = {
3
+ workflowId?: string;
4
+ workflowExecutionId?: string;
5
+ policyFile?: string;
6
+ policyVersion?: string;
7
+ gitSha?: string;
8
+ actorType?: string;
9
+ userId?: string;
10
+ branchName?: string;
11
+ agentModel?: string;
12
+ /** Nested form (wins over flat when both present and non-empty). */
13
+ agentTraceability?: Record<string, unknown>;
14
+ };
15
+ /**
16
+ * Build camelCase AgentActionTraceability for MCP JSON bodies.
17
+ * Returns undefined unless the caller supplied explicit traceability intent
18
+ * **and** a non-empty workflowId (server requires workflow_id for inline Activity).
19
+ * Auto-fills gitSha / agentModel / userId only after that bar is met.
20
+ * Non-empty nested `agentTraceability` wins over flat for overlapping keys.
21
+ */
22
+ export declare function buildAgentTraceabilityPayload(a: AgentTraceabilityFields): Record<string, unknown> | undefined;
@@ -0,0 +1,95 @@
1
+ import { resolveGitHeadSha } from "./gitSha.js";
2
+ function nonEmptyString(v) {
3
+ if (v == null)
4
+ return undefined;
5
+ const s = String(v).trim();
6
+ return s === "" ? undefined : s;
7
+ }
8
+ function hasExplicitTraceabilityIntent(a) {
9
+ if (nonEmptyString(a.workflowId))
10
+ return true;
11
+ if (nonEmptyString(a.workflowExecutionId))
12
+ return true;
13
+ if (nonEmptyString(a.policyFile))
14
+ return true;
15
+ if (nonEmptyString(a.policyVersion))
16
+ return true;
17
+ if (nonEmptyString(a.gitSha))
18
+ return true;
19
+ if (nonEmptyString(a.actorType))
20
+ return true;
21
+ if (nonEmptyString(a.userId))
22
+ return true;
23
+ if (nonEmptyString(a.branchName))
24
+ return true;
25
+ if (nonEmptyString(a.agentModel))
26
+ return true;
27
+ if (a.agentTraceability && typeof a.agentTraceability === "object") {
28
+ return Object.keys(a.agentTraceability).some((k) => nonEmptyString(a.agentTraceability[k]) != null);
29
+ }
30
+ return false;
31
+ }
32
+ function normalizeActorType(raw) {
33
+ if (raw == null)
34
+ return undefined;
35
+ const s = String(raw).toUpperCase().replace(/-/g, "_");
36
+ if (s === "CLOUD_AGENT")
37
+ return "CLOUD_AGENT";
38
+ if (s === "LOCAL_AGENT")
39
+ return "LOCAL_AGENT";
40
+ return undefined;
41
+ }
42
+ /**
43
+ * Build camelCase AgentActionTraceability for MCP JSON bodies.
44
+ * Returns undefined unless the caller supplied explicit traceability intent
45
+ * **and** a non-empty workflowId (server requires workflow_id for inline Activity).
46
+ * Auto-fills gitSha / agentModel / userId only after that bar is met.
47
+ * Non-empty nested `agentTraceability` wins over flat for overlapping keys.
48
+ */
49
+ export function buildAgentTraceabilityPayload(a) {
50
+ if (!hasExplicitTraceabilityIntent(a)) {
51
+ return undefined;
52
+ }
53
+ const nested = a.agentTraceability &&
54
+ typeof a.agentTraceability === "object" &&
55
+ Object.keys(a.agentTraceability).some((k) => nonEmptyString(a.agentTraceability[k]) != null)
56
+ ? { ...a.agentTraceability }
57
+ : null;
58
+ const out = {};
59
+ const workflowId = nonEmptyString(nested?.workflowId) ?? nonEmptyString(a.workflowId);
60
+ const workflowExecutionId = nonEmptyString(nested?.workflowExecutionId) ?? nonEmptyString(a.workflowExecutionId);
61
+ const policyFile = nonEmptyString(nested?.policyFile) ?? nonEmptyString(a.policyFile);
62
+ const policyVersion = nonEmptyString(nested?.policyVersion) ?? nonEmptyString(a.policyVersion);
63
+ const gitShaExplicit = nonEmptyString(nested?.gitSha) ?? nonEmptyString(a.gitSha);
64
+ const actorType = normalizeActorType(nested?.actorType) ?? normalizeActorType(a.actorType);
65
+ const userId = nonEmptyString(nested?.userId) ??
66
+ nonEmptyString(a.userId) ??
67
+ nonEmptyString(process.env.TESTCHIMP_USER_ID);
68
+ const branchName = nonEmptyString(nested?.branchName) ?? nonEmptyString(a.branchName);
69
+ const agentModel = nonEmptyString(nested?.agentModel) ??
70
+ nonEmptyString(a.agentModel) ??
71
+ nonEmptyString(process.env.TESTCHIMP_AGENT_MODEL);
72
+ // Server requires workflow_id for inline mutation Activity — do not send orphan payloads.
73
+ if (!workflowId) {
74
+ return undefined;
75
+ }
76
+ out.workflowId = workflowId;
77
+ if (workflowExecutionId)
78
+ out.workflowExecutionId = workflowExecutionId;
79
+ if (policyFile)
80
+ out.policyFile = policyFile;
81
+ if (policyVersion)
82
+ out.policyVersion = policyVersion;
83
+ const gitSha = resolveGitHeadSha(gitShaExplicit);
84
+ if (gitSha)
85
+ out.gitSha = gitSha;
86
+ if (actorType)
87
+ out.actorType = actorType;
88
+ if (userId)
89
+ out.userId = userId;
90
+ if (branchName)
91
+ out.branchName = branchName;
92
+ if (agentModel)
93
+ out.agentModel = agentModel;
94
+ return out;
95
+ }
@@ -54,17 +54,163 @@ export declare const fetchExecutionReportInput: z.ZodObject<{
54
54
  batchInvocationId: z.ZodOptional<z.ZodString>;
55
55
  jobId: z.ZodOptional<z.ZodString>;
56
56
  }, z.core.$strip>;
57
+ export declare const agentActorTypeSchema: z.ZodEnum<{
58
+ LOCAL_AGENT: "LOCAL_AGENT";
59
+ CLOUD_AGENT: "CLOUD_AGENT";
60
+ "local-agent": "local-agent";
61
+ "cloud-agent": "cloud-agent";
62
+ }>;
63
+ /** Nested AgentActionTraceability (agent_traceability.proto) for mutating MCP CRUDs. */
64
+ export declare const agentActionTraceabilitySchema: z.ZodObject<{
65
+ workflowId: z.ZodOptional<z.ZodString>;
66
+ workflowExecutionId: z.ZodOptional<z.ZodString>;
67
+ policyFile: z.ZodOptional<z.ZodString>;
68
+ policyVersion: z.ZodOptional<z.ZodString>;
69
+ gitSha: z.ZodOptional<z.ZodString>;
70
+ actorType: z.ZodOptional<z.ZodEnum<{
71
+ LOCAL_AGENT: "LOCAL_AGENT";
72
+ CLOUD_AGENT: "CLOUD_AGENT";
73
+ "local-agent": "local-agent";
74
+ "cloud-agent": "cloud-agent";
75
+ }>>;
76
+ userId: z.ZodOptional<z.ZodString>;
77
+ branchName: z.ZodOptional<z.ZodString>;
78
+ agentModel: z.ZodOptional<z.ZodString>;
79
+ }, z.core.$strict>;
80
+ /** Flat + nested traceability fields shared by create/update MCP tools. */
81
+ export declare const agentTraceabilityFieldsSchema: z.ZodObject<{
82
+ workflowId: z.ZodOptional<z.ZodString>;
83
+ workflowExecutionId: z.ZodOptional<z.ZodString>;
84
+ policyFile: z.ZodOptional<z.ZodString>;
85
+ policyVersion: z.ZodOptional<z.ZodString>;
86
+ gitSha: z.ZodOptional<z.ZodString>;
87
+ actorType: z.ZodOptional<z.ZodEnum<{
88
+ LOCAL_AGENT: "LOCAL_AGENT";
89
+ CLOUD_AGENT: "CLOUD_AGENT";
90
+ "local-agent": "local-agent";
91
+ "cloud-agent": "cloud-agent";
92
+ }>>;
93
+ userId: z.ZodOptional<z.ZodString>;
94
+ branchName: z.ZodOptional<z.ZodString>;
95
+ agentModel: z.ZodOptional<z.ZodString>;
96
+ agentTraceability: z.ZodOptional<z.ZodObject<{
97
+ workflowId: z.ZodOptional<z.ZodString>;
98
+ workflowExecutionId: z.ZodOptional<z.ZodString>;
99
+ policyFile: z.ZodOptional<z.ZodString>;
100
+ policyVersion: z.ZodOptional<z.ZodString>;
101
+ gitSha: z.ZodOptional<z.ZodString>;
102
+ actorType: z.ZodOptional<z.ZodEnum<{
103
+ LOCAL_AGENT: "LOCAL_AGENT";
104
+ CLOUD_AGENT: "CLOUD_AGENT";
105
+ "local-agent": "local-agent";
106
+ "cloud-agent": "cloud-agent";
107
+ }>>;
108
+ userId: z.ZodOptional<z.ZodString>;
109
+ branchName: z.ZodOptional<z.ZodString>;
110
+ agentModel: z.ZodOptional<z.ZodString>;
111
+ }, z.core.$strict>>;
112
+ }, z.core.$strip>;
57
113
  export declare const createUserStoryInput: z.ZodObject<{
58
114
  platformFilePath: z.ZodString;
59
115
  title: z.ZodString;
116
+ workflowId: z.ZodOptional<z.ZodString>;
117
+ workflowExecutionId: z.ZodOptional<z.ZodString>;
118
+ policyFile: z.ZodOptional<z.ZodString>;
119
+ policyVersion: z.ZodOptional<z.ZodString>;
120
+ gitSha: z.ZodOptional<z.ZodString>;
121
+ actorType: z.ZodOptional<z.ZodEnum<{
122
+ LOCAL_AGENT: "LOCAL_AGENT";
123
+ CLOUD_AGENT: "CLOUD_AGENT";
124
+ "local-agent": "local-agent";
125
+ "cloud-agent": "cloud-agent";
126
+ }>>;
127
+ userId: z.ZodOptional<z.ZodString>;
128
+ branchName: z.ZodOptional<z.ZodString>;
129
+ agentModel: z.ZodOptional<z.ZodString>;
130
+ agentTraceability: z.ZodOptional<z.ZodObject<{
131
+ workflowId: z.ZodOptional<z.ZodString>;
132
+ workflowExecutionId: z.ZodOptional<z.ZodString>;
133
+ policyFile: z.ZodOptional<z.ZodString>;
134
+ policyVersion: z.ZodOptional<z.ZodString>;
135
+ gitSha: z.ZodOptional<z.ZodString>;
136
+ actorType: z.ZodOptional<z.ZodEnum<{
137
+ LOCAL_AGENT: "LOCAL_AGENT";
138
+ CLOUD_AGENT: "CLOUD_AGENT";
139
+ "local-agent": "local-agent";
140
+ "cloud-agent": "cloud-agent";
141
+ }>>;
142
+ userId: z.ZodOptional<z.ZodString>;
143
+ branchName: z.ZodOptional<z.ZodString>;
144
+ agentModel: z.ZodOptional<z.ZodString>;
145
+ }, z.core.$strict>>;
60
146
  }, z.core.$strip>;
61
147
  export declare const createTestScenarioInput: z.ZodObject<{
62
148
  platformFilePath: z.ZodString;
63
149
  title: z.ZodString;
64
150
  userStoryOrdinalId: z.ZodCoercedNumber<unknown>;
151
+ workflowId: z.ZodOptional<z.ZodString>;
152
+ workflowExecutionId: z.ZodOptional<z.ZodString>;
153
+ policyFile: z.ZodOptional<z.ZodString>;
154
+ policyVersion: z.ZodOptional<z.ZodString>;
155
+ gitSha: z.ZodOptional<z.ZodString>;
156
+ actorType: z.ZodOptional<z.ZodEnum<{
157
+ LOCAL_AGENT: "LOCAL_AGENT";
158
+ CLOUD_AGENT: "CLOUD_AGENT";
159
+ "local-agent": "local-agent";
160
+ "cloud-agent": "cloud-agent";
161
+ }>>;
162
+ userId: z.ZodOptional<z.ZodString>;
163
+ branchName: z.ZodOptional<z.ZodString>;
164
+ agentModel: z.ZodOptional<z.ZodString>;
165
+ agentTraceability: z.ZodOptional<z.ZodObject<{
166
+ workflowId: z.ZodOptional<z.ZodString>;
167
+ workflowExecutionId: z.ZodOptional<z.ZodString>;
168
+ policyFile: z.ZodOptional<z.ZodString>;
169
+ policyVersion: z.ZodOptional<z.ZodString>;
170
+ gitSha: z.ZodOptional<z.ZodString>;
171
+ actorType: z.ZodOptional<z.ZodEnum<{
172
+ LOCAL_AGENT: "LOCAL_AGENT";
173
+ CLOUD_AGENT: "CLOUD_AGENT";
174
+ "local-agent": "local-agent";
175
+ "cloud-agent": "cloud-agent";
176
+ }>>;
177
+ userId: z.ZodOptional<z.ZodString>;
178
+ branchName: z.ZodOptional<z.ZodString>;
179
+ agentModel: z.ZodOptional<z.ZodString>;
180
+ }, z.core.$strict>>;
65
181
  }, z.core.$strip>;
66
182
  export declare const updatePlanMarkdownInput: z.ZodObject<{
67
183
  content: z.ZodString;
184
+ workflowId: z.ZodOptional<z.ZodString>;
185
+ workflowExecutionId: z.ZodOptional<z.ZodString>;
186
+ policyFile: z.ZodOptional<z.ZodString>;
187
+ policyVersion: z.ZodOptional<z.ZodString>;
188
+ gitSha: z.ZodOptional<z.ZodString>;
189
+ actorType: z.ZodOptional<z.ZodEnum<{
190
+ LOCAL_AGENT: "LOCAL_AGENT";
191
+ CLOUD_AGENT: "CLOUD_AGENT";
192
+ "local-agent": "local-agent";
193
+ "cloud-agent": "cloud-agent";
194
+ }>>;
195
+ userId: z.ZodOptional<z.ZodString>;
196
+ branchName: z.ZodOptional<z.ZodString>;
197
+ agentModel: z.ZodOptional<z.ZodString>;
198
+ agentTraceability: z.ZodOptional<z.ZodObject<{
199
+ workflowId: z.ZodOptional<z.ZodString>;
200
+ workflowExecutionId: z.ZodOptional<z.ZodString>;
201
+ policyFile: z.ZodOptional<z.ZodString>;
202
+ policyVersion: z.ZodOptional<z.ZodString>;
203
+ gitSha: z.ZodOptional<z.ZodString>;
204
+ actorType: z.ZodOptional<z.ZodEnum<{
205
+ LOCAL_AGENT: "LOCAL_AGENT";
206
+ CLOUD_AGENT: "CLOUD_AGENT";
207
+ "local-agent": "local-agent";
208
+ "cloud-agent": "cloud-agent";
209
+ }>>;
210
+ userId: z.ZodOptional<z.ZodString>;
211
+ branchName: z.ZodOptional<z.ZodString>;
212
+ agentModel: z.ZodOptional<z.ZodString>;
213
+ }, z.core.$strict>>;
68
214
  }, z.core.$strip>;
69
215
  export declare const markPlanItemsImplementationDoneInput: z.ZodObject<{
70
216
  scenarioOrdinalIds: z.ZodOptional<z.ZodArray<z.ZodCoercedNumber<unknown>>>;
@@ -103,6 +249,36 @@ export declare const updateIssueStatusInput: z.ZodObject<{
103
249
  INACCURATE_ASSESSMENT: "INACCURATE_ASSESSMENT";
104
250
  NOT_IMPORTANT: "NOT_IMPORTANT";
105
251
  }>>;
252
+ workflowId: z.ZodOptional<z.ZodString>;
253
+ workflowExecutionId: z.ZodOptional<z.ZodString>;
254
+ policyFile: z.ZodOptional<z.ZodString>;
255
+ policyVersion: z.ZodOptional<z.ZodString>;
256
+ gitSha: z.ZodOptional<z.ZodString>;
257
+ actorType: z.ZodOptional<z.ZodEnum<{
258
+ LOCAL_AGENT: "LOCAL_AGENT";
259
+ CLOUD_AGENT: "CLOUD_AGENT";
260
+ "local-agent": "local-agent";
261
+ "cloud-agent": "cloud-agent";
262
+ }>>;
263
+ userId: z.ZodOptional<z.ZodString>;
264
+ branchName: z.ZodOptional<z.ZodString>;
265
+ agentModel: z.ZodOptional<z.ZodString>;
266
+ agentTraceability: z.ZodOptional<z.ZodObject<{
267
+ workflowId: z.ZodOptional<z.ZodString>;
268
+ workflowExecutionId: z.ZodOptional<z.ZodString>;
269
+ policyFile: z.ZodOptional<z.ZodString>;
270
+ policyVersion: z.ZodOptional<z.ZodString>;
271
+ gitSha: z.ZodOptional<z.ZodString>;
272
+ actorType: z.ZodOptional<z.ZodEnum<{
273
+ LOCAL_AGENT: "LOCAL_AGENT";
274
+ CLOUD_AGENT: "CLOUD_AGENT";
275
+ "local-agent": "local-agent";
276
+ "cloud-agent": "cloud-agent";
277
+ }>>;
278
+ userId: z.ZodOptional<z.ZodString>;
279
+ branchName: z.ZodOptional<z.ZodString>;
280
+ agentModel: z.ZodOptional<z.ZodString>;
281
+ }, z.core.$strict>>;
106
282
  }, z.core.$strip>;
107
283
  export declare const createIssueInput: z.ZodObject<{
108
284
  title: z.ZodString;
@@ -169,6 +345,36 @@ export declare const createIssueInput: z.ZodObject<{
169
345
  environment: z.ZodOptional<z.ZodString>;
170
346
  attachments: z.ZodOptional<z.ZodArray<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
171
347
  artifactReference: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
348
+ workflowId: z.ZodOptional<z.ZodString>;
349
+ workflowExecutionId: z.ZodOptional<z.ZodString>;
350
+ policyFile: z.ZodOptional<z.ZodString>;
351
+ policyVersion: z.ZodOptional<z.ZodString>;
352
+ gitSha: z.ZodOptional<z.ZodString>;
353
+ actorType: z.ZodOptional<z.ZodEnum<{
354
+ LOCAL_AGENT: "LOCAL_AGENT";
355
+ CLOUD_AGENT: "CLOUD_AGENT";
356
+ "local-agent": "local-agent";
357
+ "cloud-agent": "cloud-agent";
358
+ }>>;
359
+ userId: z.ZodOptional<z.ZodString>;
360
+ branchName: z.ZodOptional<z.ZodString>;
361
+ agentModel: z.ZodOptional<z.ZodString>;
362
+ agentTraceability: z.ZodOptional<z.ZodObject<{
363
+ workflowId: z.ZodOptional<z.ZodString>;
364
+ workflowExecutionId: z.ZodOptional<z.ZodString>;
365
+ policyFile: z.ZodOptional<z.ZodString>;
366
+ policyVersion: z.ZodOptional<z.ZodString>;
367
+ gitSha: z.ZodOptional<z.ZodString>;
368
+ actorType: z.ZodOptional<z.ZodEnum<{
369
+ LOCAL_AGENT: "LOCAL_AGENT";
370
+ CLOUD_AGENT: "CLOUD_AGENT";
371
+ "local-agent": "local-agent";
372
+ "cloud-agent": "cloud-agent";
373
+ }>>;
374
+ userId: z.ZodOptional<z.ZodString>;
375
+ branchName: z.ZodOptional<z.ZodString>;
376
+ agentModel: z.ZodOptional<z.ZodString>;
377
+ }, z.core.$strict>>;
172
378
  }, z.core.$strip>;
173
379
  export declare const emptyInput: z.ZodObject<{}, z.core.$strip>;
174
380
  export declare const getBranchSpecificEndpointConfigInput: z.ZodObject<{
@@ -735,8 +941,8 @@ export declare const requirementFindingUserStateSchema: z.ZodEnum<{
735
941
  }>;
736
942
  /** RequirementQualityReportSource — proto enum names. */
737
943
  export declare const requirementQualityReportSourceSchema: z.ZodEnum<{
738
- CLOUD: "CLOUD";
739
944
  LOCAL_AGENT: "LOCAL_AGENT";
945
+ CLOUD: "CLOUD";
740
946
  }>;
741
947
  /** SuggestedFixKind — proto enum names. */
742
948
  export declare const suggestedFixKindSchema: z.ZodEnum<{
@@ -864,8 +1070,8 @@ export declare const requirementQualityReportSchema: z.ZodObject<{
864
1070
  title: z.ZodOptional<z.ZodString>;
865
1071
  }, z.core.$strip>>;
866
1072
  source: z.ZodOptional<z.ZodEnum<{
867
- CLOUD: "CLOUD";
868
1073
  LOCAL_AGENT: "LOCAL_AGENT";
1074
+ CLOUD: "CLOUD";
869
1075
  }>>;
870
1076
  metrics: z.ZodOptional<z.ZodObject<{
871
1077
  overall: z.ZodOptional<z.ZodCoercedNumber<unknown>>;
@@ -949,8 +1155,8 @@ export declare const reportRequirementQualityFindingsInput: z.ZodObject<{
949
1155
  title: z.ZodOptional<z.ZodString>;
950
1156
  }, z.core.$strip>>;
951
1157
  source: z.ZodOptional<z.ZodEnum<{
952
- CLOUD: "CLOUD";
953
1158
  LOCAL_AGENT: "LOCAL_AGENT";
1159
+ CLOUD: "CLOUD";
954
1160
  }>>;
955
1161
  metrics: z.ZodOptional<z.ZodObject<{
956
1162
  overall: z.ZodOptional<z.ZodCoercedNumber<unknown>>;
@@ -1020,12 +1226,6 @@ export declare const reportRequirementQualityFindingsInput: z.ZodObject<{
1020
1226
  subjectEntityId: z.ZodOptional<z.ZodString>;
1021
1227
  ordinalId: z.ZodOptional<z.ZodCoercedNumber<unknown>>;
1022
1228
  }, z.core.$strip>;
1023
- export declare const agentActorTypeSchema: z.ZodEnum<{
1024
- LOCAL_AGENT: "LOCAL_AGENT";
1025
- CLOUD_AGENT: "CLOUD_AGENT";
1026
- "local-agent": "local-agent";
1027
- "cloud-agent": "cloud-agent";
1028
- }>;
1029
1229
  /** Closed vocabulary for report-agent-action entity_type (agent_workflow.proto AgentActionEntityType). */
1030
1230
  export declare const agentActionEntityTypeSchema: z.ZodEnum<{
1031
1231
  SMART_TEST: "SMART_TEST";
@@ -1071,6 +1271,23 @@ export declare const reportAgentActionInput: z.ZodObject<{
1071
1271
  }>>;
1072
1272
  userId: z.ZodOptional<z.ZodString>;
1073
1273
  branchName: z.ZodOptional<z.ZodString>;
1274
+ agentModel: z.ZodOptional<z.ZodString>;
1275
+ traceability: z.ZodOptional<z.ZodObject<{
1276
+ workflowId: z.ZodOptional<z.ZodString>;
1277
+ workflowExecutionId: z.ZodOptional<z.ZodString>;
1278
+ policyFile: z.ZodOptional<z.ZodString>;
1279
+ policyVersion: z.ZodOptional<z.ZodString>;
1280
+ gitSha: z.ZodOptional<z.ZodString>;
1281
+ actorType: z.ZodOptional<z.ZodEnum<{
1282
+ LOCAL_AGENT: "LOCAL_AGENT";
1283
+ CLOUD_AGENT: "CLOUD_AGENT";
1284
+ "local-agent": "local-agent";
1285
+ "cloud-agent": "cloud-agent";
1286
+ }>>;
1287
+ userId: z.ZodOptional<z.ZodString>;
1288
+ branchName: z.ZodOptional<z.ZodString>;
1289
+ agentModel: z.ZodOptional<z.ZodString>;
1290
+ }, z.core.$strict>>;
1074
1291
  entityType: z.ZodEnum<{
1075
1292
  SMART_TEST: "SMART_TEST";
1076
1293
  SCENARIO: "SCENARIO";
@@ -53,18 +53,46 @@ export const fetchExecutionReportInput = z
53
53
  });
54
54
  }
55
55
  });
56
+ export const agentActorTypeSchema = z.enum(["LOCAL_AGENT", "CLOUD_AGENT", "local-agent", "cloud-agent"]);
57
+ /** Nested AgentActionTraceability (agent_traceability.proto) for mutating MCP CRUDs. */
58
+ export const agentActionTraceabilitySchema = z
59
+ .object({
60
+ workflowId: z.string().optional(),
61
+ workflowExecutionId: z.string().optional(),
62
+ policyFile: z.string().optional(),
63
+ policyVersion: z.string().optional(),
64
+ gitSha: z.string().optional(),
65
+ actorType: agentActorTypeSchema.optional(),
66
+ userId: z.string().optional(),
67
+ branchName: z.string().optional(),
68
+ agentModel: z.string().optional(),
69
+ })
70
+ .strict();
71
+ /** Flat + nested traceability fields shared by create/update MCP tools. */
72
+ export const agentTraceabilityFieldsSchema = z.object({
73
+ workflowId: z.string().optional(),
74
+ workflowExecutionId: z.string().optional(),
75
+ policyFile: z.string().optional(),
76
+ policyVersion: z.string().optional(),
77
+ gitSha: z.string().optional(),
78
+ actorType: agentActorTypeSchema.optional(),
79
+ userId: z.string().optional(),
80
+ branchName: z.string().optional(),
81
+ agentModel: z.string().optional(),
82
+ agentTraceability: agentActionTraceabilitySchema.optional(),
83
+ });
56
84
  export const createUserStoryInput = z.object({
57
85
  platformFilePath: z.string().min(1),
58
86
  title: z.string().min(1),
59
- });
87
+ }).merge(agentTraceabilityFieldsSchema);
60
88
  export const createTestScenarioInput = z.object({
61
89
  platformFilePath: z.string().min(1),
62
90
  title: z.string().min(1),
63
91
  userStoryOrdinalId: z.coerce.number().int().positive(),
64
- });
92
+ }).merge(agentTraceabilityFieldsSchema);
65
93
  export const updatePlanMarkdownInput = z.object({
66
94
  content: z.string().min(1),
67
- });
95
+ }).merge(agentTraceabilityFieldsSchema);
68
96
  export const markPlanItemsImplementationDoneInput = z.object({
69
97
  scenarioOrdinalIds: z.array(z.coerce.number().int().positive()).optional(),
70
98
  userStoryOrdinalIds: z.array(z.coerce.number().int().positive()).optional(),
@@ -105,7 +133,7 @@ export const updateIssueStatusInput = z.object({
105
133
  ignoreReason: z
106
134
  .enum(["INTENDED_BEHAVIOUR", "INACCURATE_ASSESSMENT", "NOT_IMPORTANT"])
107
135
  .optional(),
108
- });
136
+ }).merge(agentTraceabilityFieldsSchema);
109
137
  const linkedEntityTypeSchema = z.enum([
110
138
  "STORY",
111
139
  "SCENARIO",
@@ -171,7 +199,7 @@ export const createIssueInput = z.object({
171
199
  environment: z.string().optional(),
172
200
  attachments: z.array(z.record(z.string(), z.unknown())).optional(),
173
201
  artifactReference: z.record(z.string(), z.unknown()).optional(),
174
- });
202
+ }).merge(agentTraceabilityFieldsSchema);
175
203
  export const emptyInput = z.object({});
176
204
  export const getBranchSpecificEndpointConfigInput = z.object({
177
205
  branchName: z.string().optional(),
@@ -507,7 +535,6 @@ export const reportRequirementQualityFindingsInput = z
507
535
  });
508
536
  }
509
537
  });
510
- export const agentActorTypeSchema = z.enum(["LOCAL_AGENT", "CLOUD_AGENT", "local-agent", "cloud-agent"]);
511
538
  /** Closed vocabulary for report-agent-action entity_type (agent_workflow.proto AgentActionEntityType). */
512
539
  export const agentActionEntityTypeSchema = z.enum([
513
540
  "USER_STORY",
@@ -549,6 +576,8 @@ export const reportAgentActionInput = z
549
576
  actorType: agentActorTypeSchema.optional(),
550
577
  userId: z.string().optional(),
551
578
  branchName: z.string().optional(),
579
+ agentModel: z.string().optional(),
580
+ traceability: agentActionTraceabilitySchema.optional(),
552
581
  entityType: agentActionEntityTypeSchema,
553
582
  /** Project-scoped ordinal id (or explicitly provided execution/batch id). Mutually exclusive with `test`. */
554
583
  entityIdentity: z.string().optional(),
@@ -2,6 +2,7 @@ import { normalizeScope } from "./normalize.js";
2
2
  import { runProvisionEphemeralEnvironmentAndWait } from "./ephemeralWait.js";
3
3
  import * as S from "./schemas.js";
4
4
  import { resolveGitHeadSha } from "./gitSha.js";
5
+ import { buildAgentTraceabilityPayload } from "./agentTraceability.js";
5
6
  function platformToProtoEnum(platform) {
6
7
  switch (platform) {
7
8
  case "ios":
@@ -167,14 +168,20 @@ export const TOOL_DEFINITIONS = [
167
168
  "Response includes content: canonical stub markdown already containing id: US-<ordinalId>. " +
168
169
  "BLOCKING workflow: call this FIRST → Write the returned content to the repo plans/stories path " +
169
170
  "(edit body as needed but keep id:) → call update-user-story with the full markdown. " +
170
- "Never write story markdown that omits id. platformFilePath must be under plans/stories/ and end with .md.",
171
+ "Never write story markdown that omits id. platformFilePath must be under plans/stories/ and end with .md. " +
172
+ "Optional agentTraceability (or flat workflowId/workflowExecutionId/policyFile/policyVersion/gitSha/…) " +
173
+ "records AGENT_WORKFLOW_ACTIVITY inline — no separate report-agent-action needed for this create.",
171
174
  inputSchema: S.createUserStoryInput,
172
175
  execute: async (args, { postMcp }) => {
173
176
  const a = args;
174
- return postMcp("/api/mcp/create_user_story", {
177
+ const body = {
175
178
  platformFilePath: a.platformFilePath,
176
179
  title: a.title,
177
- });
180
+ };
181
+ const trace = buildAgentTraceabilityPayload(a);
182
+ if (trace)
183
+ body.agentTraceability = trace;
184
+ return postMcp("/api/mcp/create_user_story", body);
178
185
  },
179
186
  },
180
187
  {
@@ -185,37 +192,52 @@ export const TOOL_DEFINITIONS = [
185
192
  "(edit body as needed but keep id: and story:) → call update-test-scenario with the full markdown. " +
186
193
  "Never write scenario markdown that omits id. update-test-scenario rejects missing id/story with a clear error. " +
187
194
  "platformFilePath must be under plans/scenarios/ and end with .md. " +
188
- "userStoryOrdinalId is the numeric part of the parent US-<n> id.",
195
+ "userStoryOrdinalId is the numeric part of the parent US-<n> id. " +
196
+ "Optional agentTraceability records Activity inline (no separate report-agent-action for this create).",
189
197
  inputSchema: S.createTestScenarioInput,
190
198
  execute: async (args, { postMcp }) => {
191
199
  const a = args;
192
- return postMcp("/api/mcp/create_test_scenario", {
200
+ const body = {
193
201
  platformFilePath: a.platformFilePath,
194
202
  title: a.title,
195
203
  userStoryOrdinalId: a.userStoryOrdinalId,
196
- });
204
+ };
205
+ const trace = buildAgentTraceabilityPayload(a);
206
+ if (trace)
207
+ body.agentTraceability = trace;
208
+ return postMcp("/api/mcp/create_test_scenario", body);
197
209
  },
198
210
  },
199
211
  {
200
212
  kebab: "update-user-story",
201
213
  description: "Sync a user story markdown file to the platform after local edits. " +
202
214
  "Requires frontmatter id: US-<n> (platform-issued). Missing id returns an error telling you to call create-user-story first. " +
203
- "Parses frontmatter (id, title, priority) and updates the linked support file and entity.",
215
+ "Parses frontmatter (id, title, priority) and updates the linked support file and entity. " +
216
+ "Optional agentTraceability records UPDATED Activity inline.",
204
217
  inputSchema: S.updatePlanMarkdownInput,
205
218
  execute: async (args, { postMcp }) => {
206
219
  const a = args;
207
- return postMcp("/api/mcp/update_user_story", { content: a.content });
220
+ const body = { content: a.content };
221
+ const trace = buildAgentTraceabilityPayload(a);
222
+ if (trace)
223
+ body.agentTraceability = trace;
224
+ return postMcp("/api/mcp/update_user_story", body);
208
225
  },
209
226
  },
210
227
  {
211
228
  kebab: "update-test-scenario",
212
229
  description: "Sync a test scenario markdown file to the platform after local edits. " +
213
230
  "Requires frontmatter id: TS-<n> and story: US-<n>. Missing either returns an error telling you to call create-test-scenario first. " +
214
- "Parses frontmatter and updates linking if story changes.",
231
+ "Parses frontmatter and updates linking if story changes. " +
232
+ "Optional agentTraceability records UPDATED Activity inline.",
215
233
  inputSchema: S.updatePlanMarkdownInput,
216
234
  execute: async (args, { postMcp }) => {
217
235
  const a = args;
218
- return postMcp("/api/mcp/update_test_scenario", { content: a.content });
236
+ const body = { content: a.content };
237
+ const trace = buildAgentTraceabilityPayload(a);
238
+ if (trace)
239
+ body.agentTraceability = trace;
240
+ return postMcp("/api/mcp/update_test_scenario", body);
219
241
  },
220
242
  },
221
243
  {
@@ -275,7 +297,8 @@ export const TOOL_DEFINITIONS = [
275
297
  description: "Update a TestChimp issue status by ordinal id (same flexible issueId formats as get-issue-details). " +
276
298
  "status must be one of: ACTIVE, IGNORED, FIXED, DUPLICATE, IN_PROGRESS_BUG, ARCHIVED_BUG, BLOCKED. " +
277
299
  "For /testchimp fix issue: set IN_PROGRESS_BUG after applying a code fix; set FIXED only after user confirmation / commits pushed. " +
278
- "Optional ignoreReason when status is IGNORED: INTENDED_BEHAVIOUR | INACCURATE_ASSESSMENT | NOT_IMPORTANT.",
300
+ "Optional ignoreReason when status is IGNORED: INTENDED_BEHAVIOUR | INACCURATE_ASSESSMENT | NOT_IMPORTANT. " +
301
+ "Optional agentTraceability records UPDATED Activity inline.",
279
302
  inputSchema: S.updateIssueStatusInput,
280
303
  execute: async (args, { postMcp }) => {
281
304
  const a = args;
@@ -285,6 +308,9 @@ export const TOOL_DEFINITIONS = [
285
308
  };
286
309
  if (a.ignoreReason)
287
310
  body.ignoreReason = a.ignoreReason;
311
+ const trace = buildAgentTraceabilityPayload(a);
312
+ if (trace)
313
+ body.agentTraceability = trace;
288
314
  return postMcp("/api/mcp/update_issue_status", body);
289
315
  },
290
316
  },
@@ -294,6 +320,8 @@ export const TOOL_DEFINITIONS = [
294
320
  "Use simple fields for common creates, or pass the full curated contract via --json-input " +
295
321
  "(description, issueType, category, severity, status, reportedReleaseId, dueDateMillis, assignee, " +
296
322
  "linkTargets, labels, source, environment, attachments, artifactReference). " +
323
+ "Optional agentTraceability (or flat workflowId/policyFile/…) records CREATED Activity inline — " +
324
+ "prefer this over a separate report-agent-action for issue creates. " +
297
325
  "Authenticated via project API key; project is resolved from the key.",
298
326
  inputSchema: S.createIssueInput,
299
327
  execute: async (args, { postMcp }) => {
@@ -327,6 +355,9 @@ export const TOOL_DEFINITIONS = [
327
355
  body.attachments = a.attachments;
328
356
  if (a.artifactReference != null)
329
357
  body.artifactReference = a.artifactReference;
358
+ const trace = buildAgentTraceabilityPayload(a);
359
+ if (trace)
360
+ body.agentTraceability = trace;
330
361
  return postMcp("/api/mcp/create_issue", body);
331
362
  },
332
363
  },
@@ -837,6 +868,27 @@ export const TOOL_DEFINITIONS = [
837
868
  body.userId = process.env.TESTCHIMP_USER_ID;
838
869
  if (a.branchName)
839
870
  body.branchName = a.branchName;
871
+ // Nested traceability wins for agentModel; only fill from flat/env when nested omits it.
872
+ if (a.traceability && typeof a.traceability === "object") {
873
+ const nested = { ...a.traceability };
874
+ const nestedModel = nested.agentModel != null && String(nested.agentModel).trim() !== ""
875
+ ? String(nested.agentModel).trim()
876
+ : undefined;
877
+ const flatModel = a.agentModel?.trim() || process.env.TESTCHIMP_AGENT_MODEL?.trim();
878
+ if (nestedModel) {
879
+ nested.agentModel = nestedModel;
880
+ }
881
+ else if (flatModel) {
882
+ nested.agentModel = flatModel;
883
+ }
884
+ body.traceability = nested;
885
+ }
886
+ else {
887
+ const model = a.agentModel?.trim() || process.env.TESTCHIMP_AGENT_MODEL?.trim();
888
+ if (model) {
889
+ body.traceability = { agentModel: model };
890
+ }
891
+ }
840
892
  if (a.test) {
841
893
  body.test = a.test;
842
894
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@testchimp/cli",
3
- "version": "0.1.22",
4
- "description": "TestChimp CLI and MCP server coverage, plans, EaaS, TrueCoverage (calls /api/mcp/*)",
3
+ "version": "0.1.23",
4
+ "description": "TestChimp CLI and MCP server \u2014 coverage, plans, EaaS, TrueCoverage (calls /api/mcp/*)",
5
5
  "type": "module",
6
6
  "main": "dist/bin/testchimp.js",
7
7
  "types": "dist/bin/testchimp.d.ts",