@opengsd/gsd-pi 1.1.1-dev.9f86580 → 1.1.1-dev.b2556262
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/headless-recover.js +56 -1
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/extensions/browser-tools/index.js +39 -22
- package/dist/resources/extensions/browser-tools/state.js +12 -0
- package/dist/resources/extensions/browser-tools/tools/session.js +3 -2
- package/dist/resources/extensions/browser-tools/utils.js +3 -3
- package/dist/resources/extensions/gsd/auto/loop.js +4 -2
- package/dist/resources/extensions/gsd/auto/phases.js +43 -10
- package/dist/resources/extensions/gsd/auto/session.js +20 -1
- package/dist/resources/extensions/gsd/auto/workflow-kernel.js +1 -0
- package/dist/resources/extensions/gsd/auto-dispatch.js +72 -12
- package/dist/resources/extensions/gsd/auto-model-selection.js +128 -9
- package/dist/resources/extensions/gsd/auto-post-unit.js +19 -2
- package/dist/resources/extensions/gsd/auto-prompts.js +24 -19
- package/dist/resources/extensions/gsd/auto-recovery.js +4 -2
- package/dist/resources/extensions/gsd/auto-runtime-state.js +3 -0
- package/dist/resources/extensions/gsd/auto-start.js +1 -1
- package/dist/resources/extensions/gsd/auto.js +14 -11
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +3 -3
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +172 -65
- package/dist/resources/extensions/gsd/closeout-wizard.js +32 -9
- package/dist/resources/extensions/gsd/commands/handlers/ops.js +2 -9
- package/dist/resources/extensions/gsd/commands-maintenance.js +93 -15
- package/dist/resources/extensions/gsd/commands-prefs-wizard.js +2 -2
- package/dist/resources/extensions/gsd/db-writer.js +35 -0
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +50 -1
- package/dist/resources/extensions/gsd/gsd-db.js +480 -172
- package/dist/resources/extensions/gsd/markdown-renderer.js +37 -53
- package/dist/resources/extensions/gsd/md-importer.js +38 -3
- package/dist/resources/extensions/gsd/migration-auto-check.js +126 -31
- package/dist/resources/extensions/gsd/parsers-legacy.js +23 -0
- package/dist/resources/extensions/gsd/planning-path-scope.js +22 -4
- package/dist/resources/extensions/gsd/pre-execution-checks.js +10 -2
- package/dist/resources/extensions/gsd/preferences-models.js +110 -43
- package/dist/resources/extensions/gsd/preferences-types.js +13 -0
- package/dist/resources/extensions/gsd/preferences-validation.js +68 -3
- package/dist/resources/extensions/gsd/preferences.js +4 -1
- package/dist/resources/extensions/gsd/prompts/gate-evaluate.md +1 -1
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/refine-slice.md +1 -1
- package/dist/resources/extensions/gsd/roadmap-slices.js +5 -1
- package/dist/resources/extensions/gsd/safety/content-validator.js +6 -4
- package/dist/resources/extensions/gsd/source-observations.js +306 -0
- package/dist/resources/extensions/gsd/state-reconciliation/drift/completion.js +15 -8
- package/dist/resources/extensions/gsd/state-reconciliation/drift/stale-render.js +33 -5
- package/dist/resources/extensions/gsd/state-reconciliation/drift/stale-worker.js +34 -13
- package/dist/resources/extensions/gsd/state-reconciliation/index.js +39 -14
- package/dist/resources/extensions/gsd/state-reconciliation/spawn-gate.js +4 -4
- package/dist/resources/extensions/gsd/state.js +7 -3
- package/dist/resources/extensions/gsd/tool-contract.js +14 -0
- package/dist/resources/extensions/gsd/tool-presentation-plan.js +1 -9
- package/dist/resources/extensions/gsd/tools/complete-slice.js +7 -6
- package/dist/resources/extensions/gsd/tools/plan-slice.js +42 -11
- package/dist/resources/extensions/gsd/tools/plan-task.js +7 -1
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +57 -429
- package/dist/resources/extensions/gsd/uat-policy.js +130 -0
- package/dist/resources/extensions/gsd/uat-run.js +414 -0
- package/dist/resources/extensions/gsd/unit-context-manifest.js +3 -4
- package/dist/resources/extensions/gsd/verdict-parser.js +3 -8
- package/dist/resources/extensions/gsd/workflow-manifest.js +132 -5
- package/dist/resources/extensions/gsd/workflow-projections.js +8 -0
- package/dist/resources/extensions/gsd/worktree-state-projection.js +18 -17
- package/dist/resources/extensions/subagent/agents.js +1 -0
- package/dist/resources/extensions/subagent/index.js +27 -12
- package/dist/resources/extensions/subagent/launch.js +7 -2
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +8 -8
- 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 +8 -8
- package/dist/web/standalone/.next/server/chunks/8357.js +1 -1
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- 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/dist/web/standalone/node_modules/@gsd/native/dist/native.js +22 -0
- package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
- package/package.json +4 -4
- package/packages/cloud-mcp-gateway/package.json +2 -2
- package/packages/contracts/package.json +1 -1
- package/packages/daemon/package.json +4 -4
- package/packages/gsd-agent-core/package.json +5 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/assistant-message.js +21 -23
- package/packages/gsd-agent-modes/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +3 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +25 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js +66 -12
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +18 -11
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js +16 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js.map +1 -1
- package/packages/gsd-agent-modes/package.json +7 -7
- package/packages/mcp-server/dist/workflow-tools.js +1 -1
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +3 -3
- package/packages/native/dist/native.js +22 -0
- package/packages/native/package.json +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-ai/dist/image-models.generated.d.ts +30 -0
- package/packages/pi-ai/dist/image-models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/image-models.generated.js +30 -0
- package/packages/pi-ai/dist/image-models.generated.js.map +1 -1
- package/packages/pi-ai/dist/models.generated.d.ts +23 -17
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +25 -24
- package/packages/pi-ai/dist/models.generated.js.map +1 -1
- package/packages/pi-ai/package.json +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.js +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/theme/themes.js +1 -1
- package/packages/pi-coding-agent/dist/theme/themes.js.map +1 -1
- package/packages/pi-coding-agent/package.json +7 -7
- package/packages/pi-tui/dist/utils.d.ts +11 -0
- package/packages/pi-tui/dist/utils.d.ts.map +1 -1
- package/packages/pi-tui/dist/utils.js +119 -6
- package/packages/pi-tui/dist/utils.js.map +1 -1
- package/packages/pi-tui/package.json +2 -1
- package/packages/rpc-client/package.json +2 -2
- package/pkg/dist/theme/themes.js +1 -1
- package/pkg/dist/theme/themes.js.map +1 -1
- package/pkg/package.json +1 -1
- package/src/resources/extensions/browser-tools/index.ts +39 -22
- package/src/resources/extensions/browser-tools/state.ts +13 -0
- package/src/resources/extensions/browser-tools/tests/browser-tools-unit.test.cjs +57 -0
- package/src/resources/extensions/browser-tools/tools/session.ts +4 -2
- package/src/resources/extensions/browser-tools/utils.ts +3 -3
- package/src/resources/extensions/gsd/auto/loop-deps.ts +1 -0
- package/src/resources/extensions/gsd/auto/loop.ts +4 -2
- package/src/resources/extensions/gsd/auto/phases.ts +42 -10
- package/src/resources/extensions/gsd/auto/session.ts +22 -1
- package/src/resources/extensions/gsd/auto/workflow-kernel.ts +1 -0
- package/src/resources/extensions/gsd/auto-dispatch.ts +85 -12
- package/src/resources/extensions/gsd/auto-model-selection.ts +164 -12
- package/src/resources/extensions/gsd/auto-post-unit.ts +20 -2
- package/src/resources/extensions/gsd/auto-prompts.ts +23 -20
- package/src/resources/extensions/gsd/auto-recovery.ts +22 -3
- package/src/resources/extensions/gsd/auto-runtime-state.ts +5 -0
- package/src/resources/extensions/gsd/auto-start.ts +1 -1
- package/src/resources/extensions/gsd/auto.ts +13 -10
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +3 -3
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +225 -72
- package/src/resources/extensions/gsd/closeout-wizard.ts +47 -13
- package/src/resources/extensions/gsd/commands/handlers/ops.ts +2 -17
- package/src/resources/extensions/gsd/commands-maintenance.ts +124 -13
- package/src/resources/extensions/gsd/commands-prefs-wizard.ts +2 -2
- package/src/resources/extensions/gsd/db-writer.ts +38 -0
- package/src/resources/extensions/gsd/docs/preferences-reference.md +50 -1
- package/src/resources/extensions/gsd/gsd-db.ts +564 -186
- package/src/resources/extensions/gsd/markdown-renderer.ts +44 -66
- package/src/resources/extensions/gsd/md-importer.ts +49 -2
- package/src/resources/extensions/gsd/migration-auto-check.ts +154 -34
- package/src/resources/extensions/gsd/parsers-legacy.ts +20 -0
- package/src/resources/extensions/gsd/planning-path-scope.ts +22 -4
- package/src/resources/extensions/gsd/pre-execution-checks.ts +9 -2
- package/src/resources/extensions/gsd/preferences-models.ts +112 -43
- package/src/resources/extensions/gsd/preferences-types.ts +39 -0
- package/src/resources/extensions/gsd/preferences-validation.ts +76 -2
- package/src/resources/extensions/gsd/preferences.ts +5 -0
- package/src/resources/extensions/gsd/prompts/gate-evaluate.md +1 -1
- package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/refine-slice.md +1 -1
- package/src/resources/extensions/gsd/roadmap-slices.ts +6 -1
- package/src/resources/extensions/gsd/safety/content-validator.ts +8 -5
- package/src/resources/extensions/gsd/source-observations.ts +402 -0
- package/src/resources/extensions/gsd/state-reconciliation/drift/completion.ts +20 -8
- package/src/resources/extensions/gsd/state-reconciliation/drift/stale-render.ts +44 -5
- package/src/resources/extensions/gsd/state-reconciliation/drift/stale-worker.ts +39 -11
- package/src/resources/extensions/gsd/state-reconciliation/index.ts +45 -15
- package/src/resources/extensions/gsd/state-reconciliation/spawn-gate.ts +4 -4
- package/src/resources/extensions/gsd/state.ts +7 -4
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +15 -0
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +299 -1
- package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +32 -0
- package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +75 -3
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +22 -1
- package/src/resources/extensions/gsd/tests/before-provider-context-management.test.ts +145 -0
- package/src/resources/extensions/gsd/tests/closeout-wizard.test.ts +44 -0
- package/src/resources/extensions/gsd/tests/commands-dispatcher-unmerged-milestone.test.ts +26 -1
- package/src/resources/extensions/gsd/tests/content-validator.test.ts +74 -0
- package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +16 -2
- package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +1 -11
- package/src/resources/extensions/gsd/tests/gate-dispatch.test.ts +64 -0
- package/src/resources/extensions/gsd/tests/gate-storage.test.ts +15 -0
- package/src/resources/extensions/gsd/tests/gsd-recover.test.ts +62 -1
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +15 -0
- package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +42 -0
- package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +99 -0
- package/src/resources/extensions/gsd/tests/plan-slice.test.ts +99 -2
- package/src/resources/extensions/gsd/tests/plan-task.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/preferences.test.ts +14 -0
- package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +9 -0
- package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +101 -1
- package/src/resources/extensions/gsd/tests/repository-registry.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/schema-v21-sequence.test.ts +5 -3
- package/src/resources/extensions/gsd/tests/schema-v27-v28-sequence.test.ts +162 -18
- package/src/resources/extensions/gsd/tests/skipped-validation-db-atomicity.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/source-observations.test.ts +275 -0
- package/src/resources/extensions/gsd/tests/stale-queued-milestone.test.ts +43 -0
- package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +76 -21
- package/src/resources/extensions/gsd/tests/thinking-level-resolution.test.ts +203 -0
- package/src/resources/extensions/gsd/tests/uat-policy.test.ts +170 -0
- package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +7 -1
- package/src/resources/extensions/gsd/tests/workflow-kernel.test.ts +7 -0
- package/src/resources/extensions/gsd/tests/workflow-manifest.test.ts +306 -1
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +73 -6
- package/src/resources/extensions/gsd/tests/worktree-db.test.ts +511 -1
- package/src/resources/extensions/gsd/tests/worktree-state-projection.test.ts +44 -0
- package/src/resources/extensions/gsd/tool-contract.ts +28 -0
- package/src/resources/extensions/gsd/tool-presentation-plan.ts +1 -11
- package/src/resources/extensions/gsd/tools/complete-slice.ts +7 -6
- package/src/resources/extensions/gsd/tools/plan-slice.ts +54 -12
- package/src/resources/extensions/gsd/tools/plan-task.ts +8 -1
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +66 -526
- package/src/resources/extensions/gsd/types.ts +1 -0
- package/src/resources/extensions/gsd/uat-policy.ts +191 -0
- package/src/resources/extensions/gsd/uat-run.ts +550 -0
- package/src/resources/extensions/gsd/unit-context-manifest.ts +3 -4
- package/src/resources/extensions/gsd/verdict-parser.ts +3 -10
- package/src/resources/extensions/gsd/workflow-manifest.ts +193 -7
- package/src/resources/extensions/gsd/workflow-projections.ts +9 -0
- package/src/resources/extensions/gsd/worktree-state-projection.ts +22 -22
- package/src/resources/extensions/shared/tests/format-utils.test.ts +8 -3
- package/src/resources/extensions/subagent/agents.ts +4 -0
- package/src/resources/extensions/subagent/index.ts +28 -3
- package/src/resources/extensions/subagent/launch.ts +8 -0
- package/src/resources/extensions/subagent/tests/model-override.test.ts +31 -0
- /package/dist/web/standalone/.next/static/{zzYMrKpPGfRQRxSFO32Jr → tJOKQbQRO-9MiFDO8DIDS}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{zzYMrKpPGfRQRxSFO32Jr → tJOKQbQRO-9MiFDO8DIDS}/_ssgManifest.js +0 -0
|
@@ -34,8 +34,8 @@ import { getGatesForTurn } from "../gate-registry.js";
|
|
|
34
34
|
import { gsdProjectionRoot, clearPathCache, resolveMilestoneFile } from "../paths.js";
|
|
35
35
|
import { resolveCanonicalMilestoneRoot } from "../worktree-manager.js";
|
|
36
36
|
import { checkOwnership, sliceUnitKey } from "../unit-ownership.js";
|
|
37
|
-
import { saveFile, clearParseCache
|
|
38
|
-
import {
|
|
37
|
+
import { saveFile, clearParseCache } from "../files.js";
|
|
38
|
+
import { getDeclaredUatType, shouldEscalateArtifactUatToBrowser } from "../uat-policy.js";
|
|
39
39
|
import { invalidateStateCache } from "../state.js";
|
|
40
40
|
import { renderRoadmapFromDb } from "../markdown-renderer.js";
|
|
41
41
|
import { parseRoadmap } from "../parsers-legacy.js";
|
|
@@ -350,7 +350,7 @@ export async function handleCompleteSlice(
|
|
|
350
350
|
// Otherwise the browser checks get silently deferred to a human and the slice
|
|
351
351
|
// passes on static checks alone (M001/S03 regression). `browser-executable`,
|
|
352
352
|
// `live-runtime`, and `mixed` all receive browser tools (see
|
|
353
|
-
//
|
|
353
|
+
// UAT_MODE_POLICIES); only the non-browser modes are rejected here.
|
|
354
354
|
//
|
|
355
355
|
// Reuse the canonical hasBrowserRequiredText detector (also used by dispatch
|
|
356
356
|
// and milestone validation): it skips Not-Proven/Out-of-Scope disclaimer
|
|
@@ -362,9 +362,10 @@ export async function handleCompleteSlice(
|
|
|
362
362
|
// genuinely defers verification to a human. Every other mode has a real
|
|
363
363
|
// verification path: `runtime-executable` runs browser test commands like
|
|
364
364
|
// `npx playwright test` via gsd_uat_exec, and live-runtime/mixed/
|
|
365
|
-
// browser-executable receive browser tools (
|
|
366
|
-
const
|
|
367
|
-
|
|
365
|
+
// browser-executable receive browser tools (UAT_MODE_POLICIES).
|
|
366
|
+
const uatContent = params.uatContent || "";
|
|
367
|
+
const declaredUatMode = getDeclaredUatType(uatContent);
|
|
368
|
+
if (shouldEscalateArtifactUatToBrowser(uatContent)) {
|
|
368
369
|
return {
|
|
369
370
|
error: `UAT requires browser verification (opening a page in a browser, navigating to a page or localhost, screenshots) but declares "UAT mode: artifact-driven", which only runs static/file checks and would defer the browser work to a human. Use a mode that actually verifies the UI: "browser-executable" (interactive browser tools), "runtime-executable" (a browser test command such as playwright), or a browser-inclusive "mixed"/"live-runtime". Re-author the UAT Type section and complete the slice again.`,
|
|
370
371
|
};
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { existsSync, rmSync } from "node:fs";
|
|
2
|
-
import { join, relative } from "node:path";
|
|
2
|
+
import { join, relative, resolve } from "node:path";
|
|
3
3
|
import { clearParseCache } from "../files.js";
|
|
4
4
|
import { isClosedStatus, isDeferredStatus } from "../status-guards.js";
|
|
5
5
|
import { isNonEmptyString, validateStringArray } from "../validation.js";
|
|
6
|
+
import { getGateIdsForTurn } from "../gate-registry.js";
|
|
6
7
|
import {
|
|
7
8
|
transaction,
|
|
8
9
|
getMilestone,
|
|
@@ -17,14 +18,14 @@ import {
|
|
|
17
18
|
deleteTask,
|
|
18
19
|
deleteArtifactByPath,
|
|
19
20
|
} from "../gsd-db.js";
|
|
20
|
-
import type { GateId } from "../types.js";
|
|
21
|
+
import type { GateEvaluationConfig, GateId } from "../types.js";
|
|
21
22
|
import { invalidateStateCache } from "../state.js";
|
|
22
23
|
import { renderPlanFromDb } from "../markdown-renderer.js";
|
|
23
24
|
import { renderAllProjections } from "../workflow-projections.js";
|
|
24
25
|
import { writeManifest } from "../workflow-manifest.js";
|
|
25
26
|
import { appendEvent } from "../workflow-events.js";
|
|
26
27
|
import { logWarning } from "../workflow-logger.js";
|
|
27
|
-
import { validatePlanningPathScope } from "../planning-path-scope.js";
|
|
28
|
+
import { validatePathOnlyPlanningFields, validatePlanningPathScope } from "../planning-path-scope.js";
|
|
28
29
|
import { checkFilePathConsistency, checkTaskOrdering } from "../pre-execution-checks.js";
|
|
29
30
|
import type { TaskRow } from "../db-task-slice-rows.js";
|
|
30
31
|
import { buildTaskFileName, gsdProjectionRoot } from "../paths.js";
|
|
@@ -163,9 +164,27 @@ function validateParams(params: PlanSliceParams): PlanSliceParams {
|
|
|
163
164
|
};
|
|
164
165
|
}
|
|
165
166
|
|
|
166
|
-
function
|
|
167
|
+
function loadPlanningContext(basePath: string): {
|
|
168
|
+
repositoryRegistry: RepositoryRegistry;
|
|
169
|
+
gateEvaluation?: GateEvaluationConfig;
|
|
170
|
+
} {
|
|
167
171
|
const loaded = loadEffectiveGSDPreferences(basePath);
|
|
168
|
-
return
|
|
172
|
+
return {
|
|
173
|
+
repositoryRegistry: createRepositoryRegistryFromPreferences(basePath, loaded?.preferences),
|
|
174
|
+
gateEvaluation: loaded?.preferences?.gate_evaluation,
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
function resolveGateEvaluateSliceGates(config: GateEvaluationConfig | undefined): GateId[] {
|
|
179
|
+
const ownedGateIds = [...getGateIdsForTurn("gate-evaluate")];
|
|
180
|
+
if (!config?.slice_gates?.length) return ownedGateIds;
|
|
181
|
+
const owned = new Set<string>(ownedGateIds);
|
|
182
|
+
return config.slice_gates.filter((gateId): gateId is GateId => owned.has(gateId));
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
function resolveTaskGates(config: GateEvaluationConfig | undefined): GateId[] {
|
|
186
|
+
if (config?.task_gates === false) return [];
|
|
187
|
+
return [...getGateIdsForTurn("execute-task")];
|
|
169
188
|
}
|
|
170
189
|
|
|
171
190
|
function validateReferencedRepositories(
|
|
@@ -238,11 +257,21 @@ function toTaskRows(params: PlanSliceParams, defaultTargets: string[]): TaskRow[
|
|
|
238
257
|
}));
|
|
239
258
|
}
|
|
240
259
|
|
|
241
|
-
function validateTaskPathsBeforePersist(
|
|
260
|
+
function validateTaskPathsBeforePersist(
|
|
261
|
+
params: PlanSliceParams,
|
|
262
|
+
basePath: string,
|
|
263
|
+
defaultTargets: string[],
|
|
264
|
+
allowedRoots: string[],
|
|
265
|
+
): string | null {
|
|
242
266
|
const taskRows = toTaskRows(params, defaultTargets);
|
|
267
|
+
const baseRoot = resolve(basePath);
|
|
268
|
+
const additionalRoots = allowedRoots
|
|
269
|
+
.map((root) => resolve(root))
|
|
270
|
+
.filter((root) => root !== baseRoot);
|
|
271
|
+
const context = additionalRoots.length > 0 ? { additionalRoots } : undefined;
|
|
243
272
|
const checks = [
|
|
244
|
-
...checkFilePathConsistency(taskRows, basePath),
|
|
245
|
-
...checkTaskOrdering(taskRows, basePath),
|
|
273
|
+
...checkFilePathConsistency(taskRows, basePath, context),
|
|
274
|
+
...checkTaskOrdering(taskRows, basePath, context),
|
|
246
275
|
];
|
|
247
276
|
const blocking = checks.filter((check) => !check.passed && check.blocking);
|
|
248
277
|
|
|
@@ -265,8 +294,11 @@ export async function handlePlanSlice(
|
|
|
265
294
|
}
|
|
266
295
|
|
|
267
296
|
let repositoryRegistry: RepositoryRegistry;
|
|
297
|
+
let gateEvaluation: GateEvaluationConfig | undefined;
|
|
268
298
|
try {
|
|
269
|
-
|
|
299
|
+
const context = loadPlanningContext(basePath);
|
|
300
|
+
repositoryRegistry = context.repositoryRegistry;
|
|
301
|
+
gateEvaluation = context.gateEvaluation;
|
|
270
302
|
} catch (err) {
|
|
271
303
|
const message = err instanceof Error ? err.message : String(err);
|
|
272
304
|
return { error: `validation failed: ${message}` };
|
|
@@ -279,6 +311,16 @@ export async function handlePlanSlice(
|
|
|
279
311
|
|
|
280
312
|
const allowedAbsoluteRoots = resolveAllowedRootsForPathScope(params, repositoryRegistry, defaultTargets);
|
|
281
313
|
|
|
314
|
+
const pathOnlyError = validatePathOnlyPlanningFields(
|
|
315
|
+
params.tasks.map((task, index) => ({
|
|
316
|
+
field: `tasks[${index}].expectedOutput`,
|
|
317
|
+
values: task.expectedOutput,
|
|
318
|
+
})),
|
|
319
|
+
);
|
|
320
|
+
if (pathOnlyError) {
|
|
321
|
+
return { error: `validation failed: ${pathOnlyError}` };
|
|
322
|
+
}
|
|
323
|
+
|
|
282
324
|
const pathScopeError = validatePlanningPathScope(
|
|
283
325
|
basePath,
|
|
284
326
|
params.tasks.flatMap((task, index) => [
|
|
@@ -292,7 +334,7 @@ export async function handlePlanSlice(
|
|
|
292
334
|
return { error: `validation failed: ${pathScopeError}` };
|
|
293
335
|
}
|
|
294
336
|
|
|
295
|
-
const pathError = validateTaskPathsBeforePersist(params, basePath, defaultTargets);
|
|
337
|
+
const pathError = validateTaskPathsBeforePersist(params, basePath, defaultTargets, allowedAbsoluteRoots);
|
|
296
338
|
if (pathError) {
|
|
297
339
|
return { error: `pre-execution validation failed:\n${pathError}` };
|
|
298
340
|
}
|
|
@@ -384,11 +426,11 @@ export async function handlePlanSlice(
|
|
|
384
426
|
|
|
385
427
|
// Seed quality gate rows inside the transaction — all-or-nothing with
|
|
386
428
|
// the plan data so a crash can't leave orphaned gates without tasks.
|
|
387
|
-
const sliceGates
|
|
429
|
+
const sliceGates = resolveGateEvaluateSliceGates(gateEvaluation);
|
|
388
430
|
for (const gid of sliceGates) {
|
|
389
431
|
insertGateRow({ milestoneId: params.milestoneId, sliceId: params.sliceId, gateId: gid, scope: "slice" });
|
|
390
432
|
}
|
|
391
|
-
const taskGates
|
|
433
|
+
const taskGates = resolveTaskGates(gateEvaluation);
|
|
392
434
|
for (const task of params.tasks) {
|
|
393
435
|
for (const gid of taskGates) {
|
|
394
436
|
insertGateRow({ milestoneId: params.milestoneId, sliceId: params.sliceId, gateId: gid, scope: "task", taskId: task.taskId });
|
|
@@ -8,7 +8,7 @@ import { renderAllProjections } from "../workflow-projections.js";
|
|
|
8
8
|
import { writeManifest } from "../workflow-manifest.js";
|
|
9
9
|
import { appendEvent } from "../workflow-events.js";
|
|
10
10
|
import { logWarning } from "../workflow-logger.js";
|
|
11
|
-
import { validatePlanningPathScope } from "../planning-path-scope.js";
|
|
11
|
+
import { validatePathOnlyPlanningFields, validatePlanningPathScope } from "../planning-path-scope.js";
|
|
12
12
|
|
|
13
13
|
export interface PlanTaskParams {
|
|
14
14
|
milestoneId: string;
|
|
@@ -67,6 +67,13 @@ export async function handlePlanTask(
|
|
|
67
67
|
return { error: `validation failed: ${(err as Error).message}` };
|
|
68
68
|
}
|
|
69
69
|
|
|
70
|
+
const pathOnlyError = validatePathOnlyPlanningFields([
|
|
71
|
+
{ field: "expectedOutput", values: params.expectedOutput },
|
|
72
|
+
]);
|
|
73
|
+
if (pathOnlyError) {
|
|
74
|
+
return { error: `validation failed: ${pathOnlyError}` };
|
|
75
|
+
}
|
|
76
|
+
|
|
70
77
|
const pathScopeError = validatePlanningPathScope(basePath, [
|
|
71
78
|
{ field: "files", values: params.files },
|
|
72
79
|
{ field: "inputs", values: params.inputs },
|