@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.
- package/dist/cli/program.js +65 -30
- package/dist/core/agentTraceability.d.ts +22 -0
- package/dist/core/agentTraceability.js +95 -0
- package/dist/core/schemas.d.ts +226 -9
- package/dist/core/schemas.js +35 -6
- package/dist/core/tools.js +63 -11
- package/package.json +2 -2
package/dist/cli/program.js
CHANGED
|
@@ -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
|
-
|
|
186
|
-
|
|
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
|
-
|
|
297
|
-
|
|
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
|
-
|
|
337
|
-
|
|
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
|
+
}
|
package/dist/core/schemas.d.ts
CHANGED
|
@@ -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";
|
package/dist/core/schemas.js
CHANGED
|
@@ -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(),
|
package/dist/core/tools.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
4
|
-
"description": "TestChimp CLI and MCP server
|
|
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",
|