gsd-pi 2.75.0-dev.a44b82572 → 2.75.0-dev.e41b70b10
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/resources/extensions/gsd/auto/phases.js +2 -0
- package/dist/resources/extensions/gsd/auto-dashboard.js +22 -1
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +8 -2
- package/dist/resources/extensions/gsd/auto-dispatch.js +11 -11
- package/dist/resources/extensions/gsd/auto-model-selection.js +3 -1
- package/dist/resources/extensions/gsd/auto-prompts.js +19 -9
- package/dist/resources/extensions/gsd/auto-worktree.js +16 -1
- package/dist/resources/extensions/gsd/doctor-git-checks.js +22 -2
- package/dist/resources/extensions/gsd/pre-execution-checks.js +12 -8
- package/dist/resources/extensions/gsd/prompts/add-tests.md +1 -0
- package/dist/resources/extensions/gsd/prompts/execute-task.md +1 -1
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -0
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +14 -0
- package/dist/resources/extensions/search-the-web/command-search-provider.js +4 -1
- package/dist/resources/extensions/search-the-web/native-search.js +13 -2
- package/dist/tsconfig.extensions.tsbuildinfo +1 -1
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +15 -15
- package/dist/web/standalone/.next/build-manifest.json +2 -2
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +15 -15
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware-manifest.json +5 -5
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +1 -1
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/package.json +1 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +102 -65
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/src/workflow-tools.test.ts +255 -0
- package/packages/mcp-server/src/workflow-tools.ts +108 -65
- package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-ai/dist/index.d.ts +1 -0
- package/packages/pi-ai/dist/index.d.ts.map +1 -1
- package/packages/pi-ai/dist/index.js +1 -0
- package/packages/pi-ai/dist/index.js.map +1 -1
- package/packages/pi-ai/dist/providers/api-family.d.ts +27 -0
- package/packages/pi-ai/dist/providers/api-family.d.ts.map +1 -0
- package/packages/pi-ai/dist/providers/api-family.js +47 -0
- package/packages/pi-ai/dist/providers/api-family.js.map +1 -0
- package/packages/pi-ai/dist/providers/api-family.test.d.ts +2 -0
- package/packages/pi-ai/dist/providers/api-family.test.d.ts.map +1 -0
- package/packages/pi-ai/dist/providers/api-family.test.js +101 -0
- package/packages/pi-ai/dist/providers/api-family.test.js.map +1 -0
- package/packages/pi-ai/src/index.ts +1 -0
- package/packages/pi-ai/src/providers/api-family.test.ts +129 -0
- package/packages/pi-ai/src/providers/api-family.ts +57 -0
- package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +1 -0
- package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +2 -1
- package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.js +4 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.js.map +1 -1
- package/packages/pi-coding-agent/src/core/extensions/runner.ts +4 -1
- package/packages/pi-coding-agent/src/core/extensions/types.ts +2 -2
- package/packages/pi-coding-agent/src/core/retry-handler.ts +4 -1
- package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
- package/src/resources/extensions/gsd/auto/loop-deps.ts +2 -10
- package/src/resources/extensions/gsd/auto/phases.ts +3 -0
- package/src/resources/extensions/gsd/auto-dashboard.ts +25 -1
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +15 -2
- package/src/resources/extensions/gsd/auto-dispatch.ts +21 -7
- package/src/resources/extensions/gsd/auto-model-selection.ts +3 -1
- package/src/resources/extensions/gsd/auto-prompts.ts +33 -9
- package/src/resources/extensions/gsd/auto-worktree.ts +16 -1
- package/src/resources/extensions/gsd/doctor-git-checks.ts +23 -2
- package/src/resources/extensions/gsd/pre-execution-checks.ts +12 -8
- package/src/resources/extensions/gsd/prompts/add-tests.md +1 -0
- package/src/resources/extensions/gsd/prompts/execute-task.md +1 -1
- package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -0
- package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +49 -0
- package/src/resources/extensions/gsd/tests/integration/doctor-git-symlink-cwd.test.ts +79 -0
- package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +66 -0
- package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +132 -8
- package/src/resources/extensions/gsd/tests/prompts-no-gitignored-test-refs.test.ts +56 -0
- package/src/resources/extensions/gsd/tests/stash-queued-context-files.test.ts +54 -0
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +97 -0
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +14 -0
- package/src/resources/extensions/search-the-web/command-search-provider.ts +4 -1
- package/src/resources/extensions/search-the-web/native-search.ts +13 -3
- /package/dist/web/standalone/.next/static/{iBwPQUj73sn8jxegTo320 → By_yegSJ-AA1OP0QjYbSl}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{iBwPQUj73sn8jxegTo320 → By_yegSJ-AA1OP0QjYbSl}/_ssgManifest.js +0 -0
|
@@ -445,38 +445,75 @@ const projectDirParam = z
|
|
|
445
445
|
.string()
|
|
446
446
|
.optional()
|
|
447
447
|
.describe("Optional. Omit this field — the server defaults to its current working directory, which is already the correct project or worktree root.");
|
|
448
|
+
const nonEmptyString = (field) => z.string().trim().min(1, `${field} must be a non-empty string`);
|
|
449
|
+
// Optional non-empty string: accepts omitted/undefined but rejects "" or
|
|
450
|
+
// whitespace. Mirrors executor guards of the form
|
|
451
|
+
// `value !== undefined && !isNonEmptyString(value)` — e.g. plan-task's
|
|
452
|
+
// observabilityImpact. Do not preprocess "" to undefined; the executor
|
|
453
|
+
// treats them differently.
|
|
454
|
+
const optionalNonEmptyString = (field) => nonEmptyString(field).optional();
|
|
455
|
+
// Array of non-empty strings. Mirrors executor guards that call
|
|
456
|
+
// `validateStringArray` or `arr.some((item) => !isNonEmptyString(item))`.
|
|
457
|
+
const nonEmptyStringArray = (field) => z.array(nonEmptyString(`${field}[]`));
|
|
458
|
+
// Matches the executor's `isNonEmptyString` (trim + length>0) so Zod rejects
|
|
459
|
+
// empty/whitespace fields at parse time. Without this, MCP callers pass "" for
|
|
460
|
+
// the heavy planning fields, Zod accepts it, and the executor rejects one
|
|
461
|
+
// field per call — forcing the agent into a retry loop to discover every gap.
|
|
462
|
+
const planMilestoneSliceSchema = z.object({
|
|
463
|
+
sliceId: nonEmptyString("sliceId"),
|
|
464
|
+
title: nonEmptyString("title"),
|
|
465
|
+
risk: nonEmptyString("risk"),
|
|
466
|
+
depends: z.array(z.string()),
|
|
467
|
+
demo: nonEmptyString("demo"),
|
|
468
|
+
goal: nonEmptyString("goal"),
|
|
469
|
+
// ADR-011: heavy planning fields are optional for sketch slices; required for full slices.
|
|
470
|
+
successCriteria: z.string().optional(),
|
|
471
|
+
proofLevel: z.string().optional(),
|
|
472
|
+
integrationClosure: z.string().optional(),
|
|
473
|
+
observabilityImpact: z.string().optional(),
|
|
474
|
+
// ADR-011 sketch-then-refine fields.
|
|
475
|
+
isSketch: z.boolean().optional().describe("ADR-011: true marks this slice as a sketch awaiting refine-slice expansion"),
|
|
476
|
+
sketchScope: z.string().optional().describe("ADR-011: 2-3 sentence scope boundary, required when isSketch=true"),
|
|
477
|
+
}).superRefine((slice, ctx) => {
|
|
478
|
+
if (slice.isSketch === true) {
|
|
479
|
+
if (typeof slice.sketchScope !== "string" || slice.sketchScope.trim().length === 0) {
|
|
480
|
+
ctx.addIssue({
|
|
481
|
+
code: z.ZodIssueCode.custom,
|
|
482
|
+
path: ["sketchScope"],
|
|
483
|
+
message: "sketchScope must be a non-empty string when isSketch is true",
|
|
484
|
+
});
|
|
485
|
+
}
|
|
486
|
+
return;
|
|
487
|
+
}
|
|
488
|
+
const required = ["successCriteria", "proofLevel", "integrationClosure", "observabilityImpact"];
|
|
489
|
+
for (const field of required) {
|
|
490
|
+
const value = slice[field];
|
|
491
|
+
if (typeof value !== "string" || value.trim().length === 0) {
|
|
492
|
+
ctx.addIssue({
|
|
493
|
+
code: z.ZodIssueCode.custom,
|
|
494
|
+
path: [field],
|
|
495
|
+
message: `${field} must be a non-empty string`,
|
|
496
|
+
});
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
});
|
|
448
500
|
const planMilestoneParams = {
|
|
449
501
|
projectDir: projectDirParam,
|
|
450
|
-
milestoneId:
|
|
451
|
-
title:
|
|
452
|
-
vision:
|
|
453
|
-
slices: z.array(
|
|
454
|
-
sliceId: z.string(),
|
|
455
|
-
title: z.string(),
|
|
456
|
-
risk: z.string(),
|
|
457
|
-
depends: z.array(z.string()),
|
|
458
|
-
demo: z.string(),
|
|
459
|
-
goal: z.string(),
|
|
460
|
-
// ADR-011: heavy planning fields are optional for sketch slices; required for full slices.
|
|
461
|
-
successCriteria: z.string().optional(),
|
|
462
|
-
proofLevel: z.string().optional(),
|
|
463
|
-
integrationClosure: z.string().optional(),
|
|
464
|
-
observabilityImpact: z.string().optional(),
|
|
465
|
-
// ADR-011 sketch-then-refine fields.
|
|
466
|
-
isSketch: z.boolean().optional().describe("ADR-011: true marks this slice as a sketch awaiting refine-slice expansion"),
|
|
467
|
-
sketchScope: z.string().optional().describe("ADR-011: 2-3 sentence scope boundary, required when isSketch=true"),
|
|
468
|
-
})).describe("Planned slices for the milestone"),
|
|
502
|
+
milestoneId: nonEmptyString("milestoneId").describe("Milestone ID (e.g. M001)"),
|
|
503
|
+
title: nonEmptyString("title").describe("Milestone title"),
|
|
504
|
+
vision: nonEmptyString("vision").describe("Milestone vision"),
|
|
505
|
+
slices: z.array(planMilestoneSliceSchema).describe("Planned slices for the milestone"),
|
|
469
506
|
status: z.string().optional().describe("Milestone status"),
|
|
470
507
|
dependsOn: z.array(z.string()).optional().describe("Milestone dependencies"),
|
|
471
508
|
successCriteria: z.array(z.string()).optional().describe("Top-level success criteria bullets"),
|
|
472
509
|
keyRisks: z.array(z.object({
|
|
473
|
-
risk:
|
|
474
|
-
whyItMatters:
|
|
510
|
+
risk: nonEmptyString("risk"),
|
|
511
|
+
whyItMatters: nonEmptyString("whyItMatters"),
|
|
475
512
|
})).optional().describe("Structured risk entries"),
|
|
476
513
|
proofStrategy: z.array(z.object({
|
|
477
|
-
riskOrUnknown:
|
|
478
|
-
retireIn:
|
|
479
|
-
whatWillBeProven:
|
|
514
|
+
riskOrUnknown: nonEmptyString("riskOrUnknown"),
|
|
515
|
+
retireIn: nonEmptyString("retireIn"),
|
|
516
|
+
whatWillBeProven: nonEmptyString("whatWillBeProven"),
|
|
480
517
|
})).optional().describe("Structured proof strategy entries"),
|
|
481
518
|
verificationContract: z.string().optional(),
|
|
482
519
|
verificationIntegration: z.string().optional(),
|
|
@@ -489,19 +526,19 @@ const planMilestoneParams = {
|
|
|
489
526
|
const planMilestoneSchema = z.object(planMilestoneParams);
|
|
490
527
|
const planSliceParams = {
|
|
491
528
|
projectDir: projectDirParam,
|
|
492
|
-
milestoneId:
|
|
493
|
-
sliceId:
|
|
494
|
-
goal:
|
|
529
|
+
milestoneId: nonEmptyString("milestoneId").describe("Milestone ID (e.g. M001)"),
|
|
530
|
+
sliceId: nonEmptyString("sliceId").describe("Slice ID (e.g. S01)"),
|
|
531
|
+
goal: nonEmptyString("goal").describe("Slice goal"),
|
|
495
532
|
tasks: z.array(z.object({
|
|
496
|
-
taskId:
|
|
497
|
-
title:
|
|
498
|
-
description:
|
|
499
|
-
estimate:
|
|
500
|
-
files:
|
|
501
|
-
verify:
|
|
502
|
-
inputs:
|
|
503
|
-
expectedOutput:
|
|
504
|
-
observabilityImpact:
|
|
533
|
+
taskId: nonEmptyString("taskId"),
|
|
534
|
+
title: nonEmptyString("title"),
|
|
535
|
+
description: nonEmptyString("description"),
|
|
536
|
+
estimate: nonEmptyString("estimate"),
|
|
537
|
+
files: nonEmptyStringArray("files"),
|
|
538
|
+
verify: nonEmptyString("verify"),
|
|
539
|
+
inputs: nonEmptyStringArray("inputs"),
|
|
540
|
+
expectedOutput: nonEmptyStringArray("expectedOutput"),
|
|
541
|
+
observabilityImpact: optionalNonEmptyString("observabilityImpact"),
|
|
505
542
|
})).describe("Planned tasks for the slice"),
|
|
506
543
|
successCriteria: z.string().optional(),
|
|
507
544
|
proofLevel: z.string().optional(),
|
|
@@ -511,8 +548,8 @@ const planSliceParams = {
|
|
|
511
548
|
const planSliceSchema = z.object(planSliceParams);
|
|
512
549
|
const completeMilestoneParams = {
|
|
513
550
|
projectDir: projectDirParam,
|
|
514
|
-
milestoneId:
|
|
515
|
-
title:
|
|
551
|
+
milestoneId: nonEmptyString("milestoneId").describe("Milestone ID (e.g. M001)"),
|
|
552
|
+
title: nonEmptyString("title").describe("Milestone title"),
|
|
516
553
|
oneLiner: z.string().describe("One-sentence summary of what the milestone achieved"),
|
|
517
554
|
narrative: z.string().describe("Detailed narrative of what happened during the milestone"),
|
|
518
555
|
verificationPassed: z.boolean().describe("Must be true after milestone verification succeeds"),
|
|
@@ -528,7 +565,7 @@ const completeMilestoneParams = {
|
|
|
528
565
|
const completeMilestoneSchema = z.object(completeMilestoneParams);
|
|
529
566
|
const validateMilestoneParams = {
|
|
530
567
|
projectDir: projectDirParam,
|
|
531
|
-
milestoneId:
|
|
568
|
+
milestoneId: nonEmptyString("milestoneId").describe("Milestone ID (e.g. M001)"),
|
|
532
569
|
verdict: z.enum(["pass", "needs-attention", "needs-remediation"]).describe("Validation verdict"),
|
|
533
570
|
remediationRound: z.number().describe("Remediation round (0 for first validation)"),
|
|
534
571
|
successCriteriaChecklist: z.string().describe("Markdown checklist of success criteria with evidence"),
|
|
@@ -541,18 +578,18 @@ const validateMilestoneParams = {
|
|
|
541
578
|
};
|
|
542
579
|
const validateMilestoneSchema = z.object(validateMilestoneParams);
|
|
543
580
|
const roadmapSliceChangeSchema = z.object({
|
|
544
|
-
sliceId:
|
|
545
|
-
title:
|
|
581
|
+
sliceId: nonEmptyString("sliceId"),
|
|
582
|
+
title: nonEmptyString("title"),
|
|
546
583
|
risk: z.string().optional(),
|
|
547
584
|
depends: z.array(z.string()).optional(),
|
|
548
585
|
demo: z.string().optional(),
|
|
549
586
|
});
|
|
550
587
|
const reassessRoadmapParams = {
|
|
551
588
|
projectDir: projectDirParam,
|
|
552
|
-
milestoneId:
|
|
553
|
-
completedSliceId:
|
|
554
|
-
verdict:
|
|
555
|
-
assessment:
|
|
589
|
+
milestoneId: nonEmptyString("milestoneId").describe("Milestone ID (e.g. M001)"),
|
|
590
|
+
completedSliceId: nonEmptyString("completedSliceId").describe("Slice ID that just completed"),
|
|
591
|
+
verdict: nonEmptyString("verdict").describe("Assessment verdict such as roadmap-confirmed or roadmap-adjusted"),
|
|
592
|
+
assessment: nonEmptyString("assessment").describe("Assessment text explaining the roadmap decision"),
|
|
556
593
|
sliceChanges: z.object({
|
|
557
594
|
modified: z.array(roadmapSliceChangeSchema),
|
|
558
595
|
added: z.array(roadmapSliceChangeSchema),
|
|
@@ -573,14 +610,14 @@ const saveGateResultParams = {
|
|
|
573
610
|
const saveGateResultSchema = z.object(saveGateResultParams);
|
|
574
611
|
const replanSliceParams = {
|
|
575
612
|
projectDir: projectDirParam,
|
|
576
|
-
milestoneId:
|
|
577
|
-
sliceId:
|
|
578
|
-
blockerTaskId:
|
|
579
|
-
blockerDescription:
|
|
580
|
-
whatChanged:
|
|
613
|
+
milestoneId: nonEmptyString("milestoneId").describe("Milestone ID (e.g. M001)"),
|
|
614
|
+
sliceId: nonEmptyString("sliceId").describe("Slice ID (e.g. S01)"),
|
|
615
|
+
blockerTaskId: nonEmptyString("blockerTaskId").describe("Task ID that discovered the blocker"),
|
|
616
|
+
blockerDescription: nonEmptyString("blockerDescription").describe("Description of the blocker"),
|
|
617
|
+
whatChanged: nonEmptyString("whatChanged").describe("Summary of what changed in the plan"),
|
|
581
618
|
updatedTasks: z.array(z.object({
|
|
582
|
-
taskId:
|
|
583
|
-
title:
|
|
619
|
+
taskId: nonEmptyString("taskId"),
|
|
620
|
+
title: nonEmptyString("title"),
|
|
584
621
|
description: z.string(),
|
|
585
622
|
estimate: z.string(),
|
|
586
623
|
files: z.array(z.string()),
|
|
@@ -594,8 +631,8 @@ const replanSliceParams = {
|
|
|
594
631
|
const replanSliceSchema = z.object(replanSliceParams);
|
|
595
632
|
const sliceCompleteParams = {
|
|
596
633
|
projectDir: projectDirParam,
|
|
597
|
-
sliceId:
|
|
598
|
-
milestoneId:
|
|
634
|
+
sliceId: nonEmptyString("sliceId").describe("Slice ID (e.g. S01)"),
|
|
635
|
+
milestoneId: nonEmptyString("milestoneId").describe("Milestone ID (e.g. M001)"),
|
|
599
636
|
sliceTitle: z.string().describe("Title of the slice"),
|
|
600
637
|
oneLiner: z.string().describe("One-line summary of what the slice accomplished"),
|
|
601
638
|
narrative: z.string().describe("Detailed narrative of what happened across all tasks"),
|
|
@@ -684,17 +721,17 @@ const milestoneGenerateIdParams = {
|
|
|
684
721
|
const milestoneGenerateIdSchema = z.object(milestoneGenerateIdParams);
|
|
685
722
|
const planTaskParams = {
|
|
686
723
|
projectDir: projectDirParam,
|
|
687
|
-
milestoneId:
|
|
688
|
-
sliceId:
|
|
689
|
-
taskId:
|
|
690
|
-
title:
|
|
691
|
-
description:
|
|
692
|
-
estimate:
|
|
724
|
+
milestoneId: nonEmptyString("milestoneId").describe("Milestone ID (e.g. M001)"),
|
|
725
|
+
sliceId: nonEmptyString("sliceId").describe("Slice ID (e.g. S01)"),
|
|
726
|
+
taskId: nonEmptyString("taskId").describe("Task ID (e.g. T01)"),
|
|
727
|
+
title: nonEmptyString("title").describe("Task title"),
|
|
728
|
+
description: nonEmptyString("description").describe("Task description / steps block"),
|
|
729
|
+
estimate: nonEmptyString("estimate").describe("Task estimate"),
|
|
693
730
|
files: z.array(z.string()).describe("Files likely touched"),
|
|
694
|
-
verify:
|
|
731
|
+
verify: nonEmptyString("verify").describe("Verification command or block"),
|
|
695
732
|
inputs: z.array(z.string()).describe("Input files or references"),
|
|
696
733
|
expectedOutput: z.array(z.string()).describe("Expected output files or artifacts"),
|
|
697
|
-
observabilityImpact:
|
|
734
|
+
observabilityImpact: optionalNonEmptyString("observabilityImpact").describe("Task observability impact"),
|
|
698
735
|
};
|
|
699
736
|
const planTaskSchema = z.object(planTaskParams);
|
|
700
737
|
const skipSliceParams = {
|
|
@@ -706,9 +743,9 @@ const skipSliceParams = {
|
|
|
706
743
|
const skipSliceSchema = z.object(skipSliceParams);
|
|
707
744
|
const taskCompleteParams = {
|
|
708
745
|
projectDir: projectDirParam,
|
|
709
|
-
taskId:
|
|
710
|
-
sliceId:
|
|
711
|
-
milestoneId:
|
|
746
|
+
taskId: nonEmptyString("taskId").describe("Task ID (e.g. T01)"),
|
|
747
|
+
sliceId: nonEmptyString("sliceId").describe("Slice ID (e.g. S01)"),
|
|
748
|
+
milestoneId: nonEmptyString("milestoneId").describe("Milestone ID (e.g. M001)"),
|
|
712
749
|
oneLiner: z.string().describe("One-line summary of what was accomplished"),
|
|
713
750
|
narrative: z.string().describe("Detailed narrative of what happened during the task"),
|
|
714
751
|
verification: z.string().describe("What was verified and how"),
|