@tacuchi/agent-workflow-cli 25.8.0 → 26.0.0
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/CHANGELOG.md +106 -0
- package/README.md +6 -3
- package/dist/adapters/git-cli.js +225 -17
- package/dist/adapters/git-cli.js.map +1 -1
- package/dist/adapters/node-file-system.js +48 -0
- package/dist/adapters/node-file-system.js.map +1 -1
- package/dist/application/amend-service.js +51 -14
- package/dist/application/amend-service.js.map +1 -1
- package/dist/application/branch-resolver.js +6 -3
- package/dist/application/branch-resolver.js.map +1 -1
- package/dist/application/capability/design-handler.js +218 -43
- package/dist/application/capability/design-handler.js.map +1 -1
- package/dist/application/capability/dispatcher.js +182 -19
- package/dist/application/capability/dispatcher.js.map +1 -1
- package/dist/application/capability/durable-effect.js +3 -0
- package/dist/application/capability/durable-effect.js.map +1 -1
- package/dist/application/capability/readiness.js +8 -54
- package/dist/application/capability/readiness.js.map +1 -1
- package/dist/application/capability/resolution.js +124 -192
- package/dist/application/capability/resolution.js.map +1 -1
- package/dist/application/check-branch-service.js +158 -19
- package/dist/application/check-branch-service.js.map +1 -1
- package/dist/application/checkpoint/markdown.js +2 -2
- package/dist/application/checkpoint/markdown.js.map +1 -1
- package/dist/application/checkpoint/state-reader.js +12 -0
- package/dist/application/checkpoint/state-reader.js.map +1 -1
- package/dist/application/checkpoint-service.js +12 -4
- package/dist/application/checkpoint-service.js.map +1 -1
- package/dist/application/checkpoint-write-service.js +91 -17
- package/dist/application/checkpoint-write-service.js.map +1 -1
- package/dist/application/claims-ledger.js +137 -11
- package/dist/application/claims-ledger.js.map +1 -1
- package/dist/application/claims-recovery.js +85 -44
- package/dist/application/claims-recovery.js.map +1 -1
- package/dist/application/database-tool-catalog.js +33 -0
- package/dist/application/database-tool-catalog.js.map +1 -1
- package/dist/application/design/consumer-document.js +2 -2
- package/dist/application/design/consumer-document.js.map +1 -1
- package/dist/application/design/design-content-gate-service.js +20 -2
- package/dist/application/design/design-content-gate-service.js.map +1 -1
- package/dist/application/design/design-gate-service.js +2 -0
- package/dist/application/design/design-gate-service.js.map +1 -1
- package/dist/application/design/design-index-service.js +4 -0
- package/dist/application/design/design-index-service.js.map +1 -1
- package/dist/application/design/design-publish-service.js +1 -4
- package/dist/application/design/design-publish-service.js.map +1 -1
- package/dist/application/design/design-record-service.js +13 -7
- package/dist/application/design/design-record-service.js.map +1 -1
- package/dist/application/design/design-resolver-service.js +22 -3
- package/dist/application/design/design-resolver-service.js.map +1 -1
- package/dist/application/design/design-simple-service.js +24 -5
- package/dist/application/design/design-simple-service.js.map +1 -1
- package/dist/application/design/digest.js +41 -0
- package/dist/application/design/digest.js.map +1 -0
- package/dist/application/dev-only-services.js +166 -20
- package/dist/application/dev-only-services.js.map +1 -1
- package/dist/application/doc-branch-ledger.js +145 -0
- package/dist/application/doc-branch-ledger.js.map +1 -0
- package/dist/application/docs-canon-service.js +1 -1
- package/dist/application/docs-canon-service.js.map +1 -1
- package/dist/application/doctor/dist-integrity.js +113 -0
- package/dist/application/doctor/dist-integrity.js.map +1 -0
- package/dist/application/doctor/hosts.js +5 -2
- package/dist/application/doctor/hosts.js.map +1 -1
- package/dist/application/doctor/prepare.js +3 -3
- package/dist/application/doctor/prepare.js.map +1 -1
- package/dist/application/doctor/provider-installation.js +39 -19
- package/dist/application/doctor/provider-installation.js.map +1 -1
- package/dist/application/doctor/provider-mcps.js +9 -1
- package/dist/application/doctor/provider-mcps.js.map +1 -1
- package/dist/application/doctor/provider-skills.js +29 -115
- package/dist/application/doctor/provider-skills.js.map +1 -1
- package/dist/application/doctor/provider-visibility.js +76 -3
- package/dist/application/doctor/provider-visibility.js.map +1 -1
- package/dist/application/doctor/provider-workspace-block.js +156 -0
- package/dist/application/doctor/provider-workspace-block.js.map +1 -0
- package/dist/application/doctor/repair-runner.js +36 -39
- package/dist/application/doctor/repair-runner.js.map +1 -1
- package/dist/application/doctor/report.js +24 -4
- package/dist/application/doctor/report.js.map +1 -1
- package/dist/application/export-catalog-check.js +200 -0
- package/dist/application/export-catalog-check.js.map +1 -0
- package/dist/application/export-service.js +716 -79
- package/dist/application/export-service.js.map +1 -1
- package/dist/application/fix-git-service.js +285 -64
- package/dist/application/fix-git-service.js.map +1 -1
- package/dist/application/flow/advance.js +202 -25
- package/dist/application/flow/advance.js.map +1 -1
- package/dist/application/flow/annul-service.js +3 -1
- package/dist/application/flow/annul-service.js.map +1 -1
- package/dist/application/flow/batch-commit.js +189 -0
- package/dist/application/flow/batch-commit.js.map +1 -0
- package/dist/application/flow/checkout-observation.js +63 -10
- package/dist/application/flow/checkout-observation.js.map +1 -1
- package/dist/application/flow/close-artifacts.js +105 -0
- package/dist/application/flow/close-artifacts.js.map +1 -0
- package/dist/application/flow/close-at-boundary.js +25 -14
- package/dist/application/flow/close-at-boundary.js.map +1 -1
- package/dist/application/flow/close-document-guidance.js +70 -0
- package/dist/application/flow/close-document-guidance.js.map +1 -0
- package/dist/application/flow/flow-service.js +46 -3
- package/dist/application/flow/flow-service.js.map +1 -1
- package/dist/application/flow/internal-actions.js +300 -82
- package/dist/application/flow/internal-actions.js.map +1 -1
- package/dist/application/flow/internal-drive.js +24 -1
- package/dist/application/flow/internal-drive.js.map +1 -1
- package/dist/application/flow/plan-entry.js +82 -0
- package/dist/application/flow/plan-entry.js.map +1 -0
- package/dist/application/flow/prove.js +32 -1
- package/dist/application/flow/prove.js.map +1 -1
- package/dist/application/flow/quick-checkouts.js +48 -0
- package/dist/application/flow/quick-checkouts.js.map +1 -0
- package/dist/application/flow/reinfer-batch.js +177 -0
- package/dist/application/flow/reinfer-batch.js.map +1 -0
- package/dist/application/flow/reopen-run.js +12 -5
- package/dist/application/flow/reopen-run.js.map +1 -1
- package/dist/application/flow/run-state-service.js +2 -0
- package/dist/application/flow/run-state-service.js.map +1 -1
- package/dist/application/flow/submit.js +584 -117
- package/dist/application/flow/submit.js.map +1 -1
- package/dist/application/generate-launch-service.js +16 -6
- package/dist/application/generate-launch-service.js.map +1 -1
- package/dist/application/git-flow-service.js +34 -3
- package/dist/application/git-flow-service.js.map +1 -1
- package/dist/application/history-publications.js +24 -0
- package/dist/application/history-publications.js.map +1 -1
- package/dist/application/history-reconcile-service.js +45 -0
- package/dist/application/history-reconcile-service.js.map +1 -0
- package/dist/application/history-table.js +61 -12
- package/dist/application/history-table.js.map +1 -1
- package/dist/application/history-update-service.js +25 -4
- package/dist/application/history-update-service.js.map +1 -1
- package/dist/application/hook-branch-check.js +25 -3
- package/dist/application/hook-branch-check.js.map +1 -1
- package/dist/application/hook-git-commit-advisor.js +3 -4
- package/dist/application/hook-git-commit-advisor.js.map +1 -1
- package/dist/application/hook-turn-start.js +51 -0
- package/dist/application/hook-turn-start.js.map +1 -0
- package/dist/application/host-memory/codex.js +1 -1
- package/dist/application/host-memory/codex.js.map +1 -1
- package/dist/application/hub-registry.js +135 -0
- package/dist/application/hub-registry.js.map +1 -0
- package/dist/application/local-proposal.js +72 -19
- package/dist/application/local-proposal.js.map +1 -1
- package/dist/application/mcp-host-reader.js +1 -1
- package/dist/application/mcp-host-reader.js.map +1 -1
- package/dist/application/mcp-host-writer.js +16 -10
- package/dist/application/mcp-host-writer.js.map +1 -1
- package/dist/application/merge-state-service.js +150 -34
- package/dist/application/merge-state-service.js.map +1 -1
- package/dist/application/multiroot/claude.js +17 -10
- package/dist/application/multiroot/claude.js.map +1 -1
- package/dist/application/multiroot/codex.js +17 -11
- package/dist/application/multiroot/codex.js.map +1 -1
- package/dist/application/multiroot-service.js +52 -28
- package/dist/application/multiroot-service.js.map +1 -1
- package/dist/application/parsers/execution-batches.js +64 -0
- package/dist/application/parsers/execution-batches.js.map +1 -0
- package/dist/application/parsers/phases.js +23 -2
- package/dist/application/parsers/phases.js.map +1 -1
- package/dist/application/parsers/project-block.js +146 -17
- package/dist/application/parsers/project-block.js.map +1 -1
- package/dist/application/parsers/tasks.js +16 -2
- package/dist/application/parsers/tasks.js.map +1 -1
- package/dist/application/parsers/toml.js +19 -0
- package/dist/application/parsers/toml.js.map +1 -0
- package/dist/application/paths-service.js +13 -16
- package/dist/application/paths-service.js.map +1 -1
- package/dist/application/persist-service.js +118 -5
- package/dist/application/persist-service.js.map +1 -1
- package/dist/application/plan-exec-batch-service.js +162 -22
- package/dist/application/plan-exec-batch-service.js.map +1 -1
- package/dist/application/plan-exec-decision-service.js +61 -12
- package/dist/application/plan-exec-decision-service.js.map +1 -1
- package/dist/application/plan-exec-plan-diff.js +105 -0
- package/dist/application/plan-exec-plan-diff.js.map +1 -0
- package/dist/application/plan-lint-service.js +33 -5
- package/dist/application/plan-lint-service.js.map +1 -1
- package/dist/application/plan-passes.js +41 -0
- package/dist/application/plan-passes.js.map +1 -0
- package/dist/application/preparation-receipts.js +58 -0
- package/dist/application/preparation-receipts.js.map +1 -0
- package/dist/application/project-md-upsert-service.js +191 -52
- package/dist/application/project-md-upsert-service.js.map +1 -1
- package/dist/application/project-tab-data.js +40 -10
- package/dist/application/project-tab-data.js.map +1 -1
- package/dist/application/release-data/artifacts.js +15 -7
- package/dist/application/release-data/artifacts.js.map +1 -1
- package/dist/application/release-data/bundles.js +52 -6
- package/dist/application/release-data/bundles.js.map +1 -1
- package/dist/application/release-data/common.js +2 -2
- package/dist/application/release-data/common.js.map +1 -1
- package/dist/application/release-data/rollback.js +7 -0
- package/dist/application/release-data/rollback.js.map +1 -0
- package/dist/application/release-data/sessions.js +2 -2
- package/dist/application/release-data/sessions.js.map +1 -1
- package/dist/application/release-pass-ledger.js +1 -1
- package/dist/application/render/history-row.js +2 -0
- package/dist/application/render/history-row.js.map +1 -1
- package/dist/application/render/project-block.js +28 -11
- package/dist/application/render/project-block.js.map +1 -1
- package/dist/application/reseal-service.js +1 -0
- package/dist/application/reseal-service.js.map +1 -1
- package/dist/application/resume-service.js +55 -8
- package/dist/application/resume-service.js.map +1 -1
- package/dist/application/retirement/apply.js +25 -7
- package/dist/application/retirement/apply.js.map +1 -1
- package/dist/application/retirement/attribution.js +122 -50
- package/dist/application/retirement/attribution.js.map +1 -1
- package/dist/application/retirement/prepare.js +17 -11
- package/dist/application/retirement/prepare.js.map +1 -1
- package/dist/application/retirement/preview.js +2 -1
- package/dist/application/retirement/preview.js.map +1 -1
- package/dist/application/self/clean-legacy.js +1 -2
- package/dist/application/self/clean-legacy.js.map +1 -1
- package/dist/application/self/codex-plugin.js +1 -1
- package/dist/application/self/codex-plugin.js.map +1 -1
- package/dist/application/self/host-states.js +3 -3
- package/dist/application/self/host-states.js.map +1 -1
- package/dist/application/self/install-hooks.js +1 -1
- package/dist/application/self/install-hooks.js.map +1 -1
- package/dist/application/self/install-skill.js +5 -49
- package/dist/application/self/install-skill.js.map +1 -1
- package/dist/application/self/mcp-config.js +19 -11
- package/dist/application/self/mcp-config.js.map +1 -1
- package/dist/application/self/opencode-plugin.js +1 -0
- package/dist/application/self/opencode-plugin.js.map +1 -1
- package/dist/application/self/skill-files.js +29 -0
- package/dist/application/self/skill-files.js.map +1 -0
- package/dist/application/self/uninstall.js +1 -1
- package/dist/application/self/uninstall.js.map +1 -1
- package/dist/application/semantic-operation/protocol.js +66 -5
- package/dist/application/semantic-operation/protocol.js.map +1 -1
- package/dist/application/session-archive-service.js +113 -0
- package/dist/application/session-archive-service.js.map +1 -0
- package/dist/application/session-binding-service.js +35 -0
- package/dist/application/session-binding-service.js.map +1 -1
- package/dist/application/session-close-service.js +390 -54
- package/dist/application/session-close-service.js.map +1 -1
- package/dist/application/session-create-service.js +97 -5
- package/dist/application/session-create-service.js.map +1 -1
- package/dist/application/session-custody-recorder.js +15 -12
- package/dist/application/session-custody-recorder.js.map +1 -1
- package/dist/application/session-custody-service.js +1 -0
- package/dist/application/session-custody-service.js.map +1 -1
- package/dist/application/session-narrative.js +42 -12
- package/dist/application/session-narrative.js.map +1 -1
- package/dist/application/session-pause-service.js +46 -0
- package/dist/application/session-pause-service.js.map +1 -0
- package/dist/application/session-resolver.js +36 -11
- package/dist/application/session-resolver.js.map +1 -1
- package/dist/application/session-resume-service.js +134 -13
- package/dist/application/session-resume-service.js.map +1 -1
- package/dist/application/sessions-service.js +4 -0
- package/dist/application/sessions-service.js.map +1 -1
- package/dist/application/sessions-sweep-service.js +77 -0
- package/dist/application/sessions-sweep-service.js.map +1 -0
- package/dist/application/settle-service.js +3 -1
- package/dist/application/settle-service.js.map +1 -1
- package/dist/application/skills-resolver-service.js +6 -92
- package/dist/application/skills-resolver-service.js.map +1 -1
- package/dist/application/source-add-service.js +37 -0
- package/dist/application/source-add-service.js.map +1 -0
- package/dist/application/source-boundary-policy.js +105 -8
- package/dist/application/source-boundary-policy.js.map +1 -1
- package/dist/application/source-pipeline.js +68 -0
- package/dist/application/source-pipeline.js.map +1 -0
- package/dist/application/source-remove-service.js +15 -3
- package/dist/application/source-remove-service.js.map +1 -1
- package/dist/application/sources-service.js +71 -16
- package/dist/application/sources-service.js.map +1 -1
- package/dist/application/status-service.js +55 -5
- package/dist/application/status-service.js.map +1 -1
- package/dist/application/unit-dependencies.js +100 -0
- package/dist/application/unit-dependencies.js.map +1 -0
- package/dist/application/unit-membership.js +37 -0
- package/dist/application/unit-membership.js.map +1 -0
- package/dist/application/unit-residue.js +72 -0
- package/dist/application/unit-residue.js.map +1 -0
- package/dist/application/visibility-doctor-service.js +66 -4
- package/dist/application/visibility-doctor-service.js.map +1 -1
- package/dist/application/working-branch-service.js +6 -0
- package/dist/application/working-branch-service.js.map +1 -1
- package/dist/application/workline-graph.js +1 -1
- package/dist/application/workline-graph.js.map +1 -1
- package/dist/application/workline-index-service.js +118 -17
- package/dist/application/workline-index-service.js.map +1 -1
- package/dist/application/workspace-commit-service.js +218 -0
- package/dist/application/workspace-commit-service.js.map +1 -0
- package/dist/application/workspace-init-service.js +64 -34
- package/dist/application/workspace-init-service.js.map +1 -1
- package/dist/application/workspace-local-config.js +90 -0
- package/dist/application/workspace-local-config.js.map +1 -0
- package/dist/application/workspace-materialization-service.js +52 -3
- package/dist/application/workspace-materialization-service.js.map +1 -1
- package/dist/application/workspace-migrate/apply.js +525 -4
- package/dist/application/workspace-migrate/apply.js.map +1 -1
- package/dist/application/workspace-migrate/markers.js +9 -6
- package/dist/application/workspace-migrate/markers.js.map +1 -1
- package/dist/application/workspace-migrate/plan.js +97 -5
- package/dist/application/workspace-migrate/plan.js.map +1 -1
- package/dist/application/workspace-move-service.js +270 -0
- package/dist/application/workspace-move-service.js.map +1 -0
- package/dist/application/workspace-untrack-service.js +28 -0
- package/dist/application/workspace-untrack-service.js.map +1 -0
- package/dist/application/worktree-service.js +654 -105
- package/dist/application/worktree-service.js.map +1 -1
- package/dist/cli/ascii.js +2 -0
- package/dist/cli/ascii.js.map +1 -1
- package/dist/cli/commands/add-source.js +38 -0
- package/dist/cli/commands/add-source.js.map +1 -0
- package/dist/cli/commands/amend.js +14 -3
- package/dist/cli/commands/amend.js.map +1 -1
- package/dist/cli/commands/capability.js +23 -4
- package/dist/cli/commands/capability.js.map +1 -1
- package/dist/cli/commands/designs.js +14 -5
- package/dist/cli/commands/designs.js.map +1 -1
- package/dist/cli/commands/dev-only.js +19 -6
- package/dist/cli/commands/dev-only.js.map +1 -1
- package/dist/cli/commands/doc-branch.js +184 -0
- package/dist/cli/commands/doc-branch.js.map +1 -0
- package/dist/cli/commands/doctor.js +5 -1
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/export.js +78 -18
- package/dist/cli/commands/export.js.map +1 -1
- package/dist/cli/commands/fix-git.js +89 -14
- package/dist/cli/commands/fix-git.js.map +1 -1
- package/dist/cli/commands/flow.js +120 -15
- package/dist/cli/commands/flow.js.map +1 -1
- package/dist/cli/commands/generate-launch.js +14 -2
- package/dist/cli/commands/generate-launch.js.map +1 -1
- package/dist/cli/commands/history-update.js +1 -1
- package/dist/cli/commands/history-update.js.map +1 -1
- package/dist/cli/commands/history.js +14 -0
- package/dist/cli/commands/history.js.map +1 -0
- package/dist/cli/commands/hook.js +15 -2
- package/dist/cli/commands/hook.js.map +1 -1
- package/dist/cli/commands/index.js +18 -5
- package/dist/cli/commands/index.js.map +1 -1
- package/dist/cli/commands/merge-state.js +2 -2
- package/dist/cli/commands/merge-state.js.map +1 -1
- package/dist/cli/commands/persist.js +6 -5
- package/dist/cli/commands/persist.js.map +1 -1
- package/dist/cli/commands/project-md-upsert.js +5 -3
- package/dist/cli/commands/project-md-upsert.js.map +1 -1
- package/dist/cli/commands/release-pass.js +3 -3
- package/dist/cli/commands/release-pass.js.map +1 -1
- package/dist/cli/commands/resume.js +12 -3
- package/dist/cli/commands/resume.js.map +1 -1
- package/dist/cli/commands/self.js +8 -24
- package/dist/cli/commands/self.js.map +1 -1
- package/dist/cli/commands/session-close.js +64 -9
- package/dist/cli/commands/session-close.js.map +1 -1
- package/dist/cli/commands/session-create.js +4 -2
- package/dist/cli/commands/session-create.js.map +1 -1
- package/dist/cli/commands/session-pause.js +14 -0
- package/dist/cli/commands/session-pause.js.map +1 -0
- package/dist/cli/commands/sessions.js +16 -3
- package/dist/cli/commands/sessions.js.map +1 -1
- package/dist/cli/commands/set-branch.js +28 -4
- package/dist/cli/commands/set-branch.js.map +1 -1
- package/dist/cli/commands/set-edit-mode.js +20 -0
- package/dist/cli/commands/set-edit-mode.js.map +1 -0
- package/dist/cli/commands/set-pipeline.js +35 -0
- package/dist/cli/commands/set-pipeline.js.map +1 -0
- package/dist/cli/commands/skills.js +4 -11
- package/dist/cli/commands/skills.js.map +1 -1
- package/dist/cli/commands/sources.js +4 -0
- package/dist/cli/commands/sources.js.map +1 -1
- package/dist/cli/commands/status.js +35 -2
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/commands/unknown-flags.js +1 -0
- package/dist/cli/commands/unknown-flags.js.map +1 -1
- package/dist/cli/commands/visibility.js +1 -0
- package/dist/cli/commands/visibility.js.map +1 -1
- package/dist/cli/commands/workspace-commit.js +62 -0
- package/dist/cli/commands/workspace-commit.js.map +1 -0
- package/dist/cli/commands/workspace-init.js +39 -2
- package/dist/cli/commands/workspace-init.js.map +1 -1
- package/dist/cli/commands/workspace-migrate.js +31 -3
- package/dist/cli/commands/workspace-migrate.js.map +1 -1
- package/dist/cli/commands/workspace-move.js +42 -0
- package/dist/cli/commands/workspace-move.js.map +1 -0
- package/dist/cli/commands/worktree.js +4 -4
- package/dist/cli/commands/worktree.js.map +1 -1
- package/dist/cli/context-id.js +6 -0
- package/dist/cli/context-id.js.map +1 -1
- package/dist/cli/full-cli.js +555 -0
- package/dist/cli/full-cli.js.map +1 -0
- package/dist/cli/help-groups.js +76 -19
- package/dist/cli/help-groups.js.map +1 -1
- package/dist/cli/hook-stdin-cache.js +12 -0
- package/dist/cli/hook-stdin-cache.js.map +1 -0
- package/dist/cli/main.js +47 -453
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/parser.js +4 -0
- package/dist/cli/parser.js.map +1 -1
- package/dist/cli/tui/app.js +3 -4
- package/dist/cli/tui/app.js.map +1 -1
- package/dist/cli/tui/components/host-admin-section.js +2 -13
- package/dist/cli/tui/components/host-admin-section.js.map +1 -1
- package/dist/cli/tui/components/tabs-config.js +1 -2
- package/dist/cli/tui/components/tabs-config.js.map +1 -1
- package/dist/cli/tui/components/workspace-init-form.js +4 -1
- package/dist/cli/tui/components/workspace-init-form.js.map +1 -1
- package/dist/cli/tui/data/workflow-content.js +6 -1
- package/dist/cli/tui/data/workflow-content.js.map +1 -1
- package/dist/cli/tui/tabs/mcp-tab.js +4 -3
- package/dist/cli/tui/tabs/mcp-tab.js.map +1 -1
- package/dist/cli/tui/tabs/project-tab.js +7 -2
- package/dist/cli/tui/tabs/project-tab.js.map +1 -1
- package/dist/cli/tui/tui-prefs.js +2 -0
- package/dist/cli/tui/tui-prefs.js.map +1 -1
- package/dist/dist-manifest.json +3973 -0
- package/dist/domain/capability/protocol.js +3 -1
- package/dist/domain/capability/protocol.js.map +1 -1
- package/dist/domain/decision-note.js +13 -0
- package/dist/domain/decision-note.js.map +1 -1
- package/dist/domain/design/artifact.js +22 -3
- package/dist/domain/design/artifact.js.map +1 -1
- package/dist/domain/design/capability.js +1 -0
- package/dist/domain/design/capability.js.map +1 -1
- package/dist/domain/design/expansion.js +1 -1
- package/dist/domain/design/expansion.js.map +1 -1
- package/dist/domain/design/maturity.js +16 -0
- package/dist/domain/design/maturity.js.map +1 -1
- package/dist/domain/design/reference.js +5 -0
- package/dist/domain/design/reference.js.map +1 -1
- package/dist/domain/doctor/operations.js +20 -12
- package/dist/domain/doctor/operations.js.map +1 -1
- package/dist/domain/effective-contract.js +3 -1
- package/dist/domain/effective-contract.js.map +1 -1
- package/dist/domain/elicitation.js +1 -1
- package/dist/domain/flow/answer.js +265 -130
- package/dist/domain/flow/answer.js.map +1 -1
- package/dist/domain/flow/authority.js +194 -37
- package/dist/domain/flow/authority.js.map +1 -1
- package/dist/domain/flow/batch-review.js +65 -0
- package/dist/domain/flow/batch-review.js.map +1 -0
- package/dist/domain/flow/decision-schema.js +47 -0
- package/dist/domain/flow/decision-schema.js.map +1 -0
- package/dist/domain/flow/directive.js +16 -0
- package/dist/domain/flow/directive.js.map +1 -1
- package/dist/domain/flow/execution-result.js +91 -2
- package/dist/domain/flow/execution-result.js.map +1 -1
- package/dist/domain/flow/run-state.js +352 -24
- package/dist/domain/flow/run-state.js.map +1 -1
- package/dist/domain/flow/test-run-evidence.js +285 -0
- package/dist/domain/flow/test-run-evidence.js.map +1 -0
- package/dist/domain/flow/unchanged-phase.js +15 -0
- package/dist/domain/flow/unchanged-phase.js.map +1 -0
- package/dist/domain/harnesses.js +14 -5
- package/dist/domain/harnesses.js.map +1 -1
- package/dist/domain/isolation-unit.js +2 -2
- package/dist/domain/isolation-unit.js.map +1 -1
- package/dist/domain/lineage.js +7 -2
- package/dist/domain/lineage.js.map +1 -1
- package/dist/domain/obligation-correspondence.js +4 -2
- package/dist/domain/obligation-correspondence.js.map +1 -1
- package/dist/domain/plan-handoff.js +5 -0
- package/dist/domain/plan-handoff.js.map +1 -0
- package/dist/domain/proposal.js +18 -7
- package/dist/domain/proposal.js.map +1 -1
- package/dist/domain/reservation.js +5 -3
- package/dist/domain/reservation.js.map +1 -1
- package/dist/domain/retirement/proposal.js +1 -0
- package/dist/domain/retirement/proposal.js.map +1 -1
- package/dist/domain/session/custody.js +10 -6
- package/dist/domain/session/custody.js.map +1 -1
- package/dist/domain/session/narrative.js +4 -1
- package/dist/domain/session/narrative.js.map +1 -1
- package/dist/domain/skills.js +4 -6
- package/dist/domain/skills.js.map +1 -1
- package/dist/domain/sql-lexer.js +1 -1
- package/dist/domain/sql-lexer.js.map +1 -1
- package/dist/runtime/namespace-resolver.js +4 -0
- package/dist/runtime/namespace-resolver.js.map +1 -1
- package/dist/runtime/workline-marker.js +35 -8
- package/dist/runtime/workline-marker.js.map +1 -1
- package/dist/runtime/workspace-resolution.js +123 -0
- package/dist/runtime/workspace-resolution.js.map +1 -0
- package/package.json +6 -5
- package/skills/w/SKILL.md +12 -17
- package/skills/w/artifacts/artifacts-core/CHECKPOINT.md +1 -1
- package/skills/w/artifacts/artifacts-core/SCRIPTS.rollback.sql +8 -0
- package/skills/w/artifacts/artifacts-core/SCRIPTS.sql +4 -8
- package/skills/w/commands/export-diagrams.md +3 -3
- package/skills/w/commands/export-manuals.md +6 -6
- package/skills/w/commands/export-reports.md +3 -3
- package/skills/w/commands/export-scripts.md +5 -5
- package/skills/w/commands/fix-git.md +12 -13
- package/skills/w/commands/persist.md +2 -2
- package/skills/w/commands/plan-exec.md +4 -2
- package/skills/w/commands/spec-new.md +1 -1
- package/skills/w/commands/workspace-init.md +2 -0
- package/skills/w/context/MANIFEST.json +1 -1
- package/skills/w/exports/README.md +4 -4
- package/skills/w/exports/export-diagrams/EXPORT.md +4 -4
- package/skills/w/exports/export-manuals/EXPORT.md +14 -16
- package/skills/w/exports/export-reports/EXPORT.md +3 -3
- package/skills/w/exports/export-scripts/EXPORT.md +46 -22
- package/skills/w/harness/HARNESS.md +4 -7
- package/skills/w/hooks/hooks.template.json +6 -4
- package/skills/w/loops/CHASSIS.md +12 -6
- package/skills/w/loops/CODE-POLICIES.md +8 -5
- package/skills/w/loops/README.md +2 -2
- package/skills/w/loops/plan-exec-loop/LOOP.md +23 -22
- package/skills/w/loops/plan-new-loop/LOOP.md +23 -31
- package/skills/w/loops/plan-refine-loop/LOOP.md +8 -2
- package/skills/w/loops/quick-loop/LOOP.md +7 -6
- package/skills/w/loops/spec-refine-loop/LOOP.md +1 -1
- package/skills/w/modules/DESIGN-REFERENCES.md +9 -11
- package/skills/w/modules/PLAN-EXECUTION-BATCHES.md +4 -4
- package/skills/w/modules/SESSION-NUMBERING.md +2 -0
- package/skills/w/roles/README.md +11 -47
- package/skills/w/roles/design/CONTRACT.md +6 -4
- package/skills/w/roles/design/ROLE.md +7 -3
- package/skills/w/roles/diagrams/ROLE.md +1 -1
- package/skills/w/roles/git/ROLE.md +17 -10
- package/skills/w/roles/research/ROLE.md +2 -2
- package/skills/w/roles/sql/ROLE.md +17 -15
- package/skills/w/schemas/design/ui-screen.v1.schema.json +9 -0
- package/dist/application/capability/descriptor-loader.js +0 -109
- package/dist/application/capability/descriptor-loader.js.map +0 -1
- package/dist/application/capability/installed-inventory.js +0 -168
- package/dist/application/capability/installed-inventory.js.map +0 -1
- package/dist/application/self/install-plugin-skills-git.js +0 -226
- package/dist/application/self/install-plugin-skills-git.js.map +0 -1
- package/dist/application/self/install-plugin-skills.js +0 -203
- package/dist/application/self/install-plugin-skills.js.map +0 -1
- package/dist/application/self/plugin-cache-clear.js +0 -133
- package/dist/application/self/plugin-cache-clear.js.map +0 -1
- package/dist/application/self/plugin-cache-reload.js +0 -141
- package/dist/application/self/plugin-cache-reload.js.map +0 -1
- package/dist/application/self/skills-apply.js +0 -623
- package/dist/application/self/skills-apply.js.map +0 -1
- package/dist/application/self/skills-catalog.js +0 -35
- package/dist/application/self/skills-catalog.js.map +0 -1
- package/dist/application/self/skills-change.js +0 -479
- package/dist/application/self/skills-change.js.map +0 -1
- package/dist/application/self/skills-discovery.js +0 -275
- package/dist/application/self/skills-discovery.js.map +0 -1
- package/dist/application/self/skills-manager.js +0 -253
- package/dist/application/self/skills-manager.js.map +0 -1
- package/dist/application/self/skills-payload.js +0 -566
- package/dist/application/self/skills-payload.js.map +0 -1
- package/dist/application/self/skills-registry.js +0 -107
- package/dist/application/self/skills-registry.js.map +0 -1
- package/dist/application/skill-index-service.js +0 -78
- package/dist/application/skill-index-service.js.map +0 -1
- package/dist/cli/commands/plugin-cache.js +0 -25
- package/dist/cli/commands/plugin-cache.js.map +0 -1
- package/dist/cli/commands/skill-index.js +0 -19
- package/dist/cli/commands/skill-index.js.map +0 -1
- package/dist/cli/tui/data/recommended-skills.js +0 -482
- package/dist/cli/tui/data/recommended-skills.js.map +0 -1
- package/dist/cli/tui/tabs/skills-tab.js +0 -664
- package/dist/cli/tui/tabs/skills-tab.js.map +0 -1
|
@@ -27,6 +27,7 @@ import { isEffectClass, touchesTheWorld } from "../capability/effects.js";
|
|
|
27
27
|
import { AttemptLedger } from "../capability/protocol.js";
|
|
28
28
|
import { normalizeObligations, validateDecisionNote } from "../decision-note.js";
|
|
29
29
|
import { expandJourney, journeyOfFlow, } from "./authority.js";
|
|
30
|
+
import { isBatchReview } from "./batch-review.js";
|
|
30
31
|
import { V11_JOURNEY_BASE } from "./journey-baseline.js";
|
|
31
32
|
import { assuranceForRoute, isAssuranceStatus, isRouteDisposition, } from "./route.js";
|
|
32
33
|
/**
|
|
@@ -40,7 +41,7 @@ import { assuranceForRoute, isAssuranceStatus, isRouteDisposition, } from "./rou
|
|
|
40
41
|
* turning the cap off in silence while somebody alternates CLI versions over one
|
|
41
42
|
* run. Failing with a cause is the requirement; failing silently is the defect.
|
|
42
43
|
*/
|
|
43
|
-
export const FLOW_RUN_STATE_VERSION =
|
|
44
|
+
export const FLOW_RUN_STATE_VERSION = 15;
|
|
44
45
|
/**
|
|
45
46
|
* The versions this CLI CONTINUES without adoption, newest first.
|
|
46
47
|
*
|
|
@@ -58,7 +59,15 @@ export const FLOW_RUN_STATE_VERSION = 13;
|
|
|
58
59
|
* and the `route-refused` trace kind. A v12 run has none of them either, and a
|
|
59
60
|
* batch without `base` is read as the one that was in flight when the CLI updated.
|
|
60
61
|
*/
|
|
61
|
-
|
|
62
|
+
// v14 adds batch reviews, signal retractions and QUICK checkout observations.
|
|
63
|
+
// Older observations and events remain unchanged.
|
|
64
|
+
export const FLOW_RUN_STATE_CONTINUABLE = [
|
|
65
|
+
FLOW_RUN_STATE_VERSION,
|
|
66
|
+
14,
|
|
67
|
+
13,
|
|
68
|
+
12,
|
|
69
|
+
11,
|
|
70
|
+
];
|
|
62
71
|
/**
|
|
63
72
|
* The versions this CLI READS, newest first.
|
|
64
73
|
*
|
|
@@ -83,6 +92,13 @@ export const FLOW_RUN_STATE_READABLE = [
|
|
|
83
92
|
const CONTINUABLE_UPGRADES = {
|
|
84
93
|
11: (state) => ({ ...state, version: 12, journey_base: [...V11_JOURNEY_BASE[state.flow]] }),
|
|
85
94
|
12: (state) => ({ ...state, version: 13 }),
|
|
95
|
+
// Historical reviews are never fabricated. A still-open batch must supply one.
|
|
96
|
+
13: (state) => ({ ...state, version: 14 }),
|
|
97
|
+
14: (state) => ({
|
|
98
|
+
...state,
|
|
99
|
+
version: 15,
|
|
100
|
+
...(state.scope ? { scope: { isolation: "unit", ...state.scope } } : {}),
|
|
101
|
+
}),
|
|
86
102
|
};
|
|
87
103
|
/** The CLI-owned run state inside the session folder. Machine-local, dotted. */
|
|
88
104
|
export const FLOW_RUN_STATE_FILE = ".flow-run.json";
|
|
@@ -171,11 +187,27 @@ export function currentReentryIteration(state, transition) {
|
|
|
171
187
|
*/
|
|
172
188
|
function spendAt(state, transition) {
|
|
173
189
|
const iteration = iterationOf(state, transition);
|
|
174
|
-
const
|
|
190
|
+
const recorded = state.attempts.filter((attempt) => attempt.transition === transition && sameIteration(attempt, iteration));
|
|
191
|
+
const seen = new Set();
|
|
192
|
+
const rows = recorded.filter((attempt) => {
|
|
193
|
+
const key = `${attempt.invocation_id}:${attempt.attempt}:${attempt.request_digest}`;
|
|
194
|
+
if (seen.has(key))
|
|
195
|
+
return false;
|
|
196
|
+
seen.add(key);
|
|
197
|
+
return true;
|
|
198
|
+
});
|
|
175
199
|
const key = attemptCounterKey(state, transition);
|
|
176
|
-
|
|
200
|
+
// Old runs may hold a twin row and a counter raised over that twin. Removing
|
|
201
|
+
// both copies of the same resend from the reading preserves the anti-rollback
|
|
202
|
+
// excess, which is the portion the monotone floor still has to protect.
|
|
203
|
+
const floor = Math.max(0, (state.attempt_floor?.[key] ?? 0) - (recorded.length - rows.length));
|
|
177
204
|
const granted = state.attempt_grants?.[key] ?? 0;
|
|
178
|
-
return {
|
|
205
|
+
return {
|
|
206
|
+
rows,
|
|
207
|
+
floor,
|
|
208
|
+
granted,
|
|
209
|
+
spent: Math.max(0, Math.max(rows.filter((row) => row.approval !== true).length, floor) - granted),
|
|
210
|
+
};
|
|
179
211
|
}
|
|
180
212
|
/**
|
|
181
213
|
* The whole accounting of one transition, conflicts named and answerability read.
|
|
@@ -190,23 +222,24 @@ export function attemptAccountingAt(state, transition) {
|
|
|
190
222
|
// — and a projection that disagrees with the state it describes is the very
|
|
191
223
|
// thing this reading exists to stop. It cannot mask a real divergence: a
|
|
192
224
|
// counter that runs AHEAD of the rows stays ahead of this maximum.
|
|
193
|
-
const
|
|
225
|
+
const paid = rows.filter((row) => row.approval !== true).length;
|
|
226
|
+
const floor = Math.max(read, paid);
|
|
194
227
|
const ordinals = rows.map((attempt) => attempt.attempt);
|
|
195
228
|
const conflicts = [];
|
|
196
|
-
if (floor >
|
|
229
|
+
if (floor > paid) {
|
|
197
230
|
conflicts.push({
|
|
198
231
|
between: [
|
|
199
232
|
{ name: "attempt_floor", value: floor },
|
|
200
|
-
{ name: "attempts", value:
|
|
233
|
+
{ name: "attempts", value: paid },
|
|
201
234
|
],
|
|
202
235
|
cause: "el contador monótono declara más intentos que las filas persistidas: o se restauró una copia anterior del ledger, o una escritura murió entre el contador y el estado",
|
|
203
236
|
});
|
|
204
237
|
}
|
|
205
|
-
if (granted > Math.max(
|
|
238
|
+
if (granted > Math.max(paid, floor)) {
|
|
206
239
|
conflicts.push({
|
|
207
240
|
between: [
|
|
208
241
|
{ name: "attempt_grants", value: granted },
|
|
209
|
-
{ name: "attempts", value: Math.max(
|
|
242
|
+
{ name: "attempts", value: Math.max(paid, floor) },
|
|
210
243
|
],
|
|
211
244
|
cause: "se perdonan más intentos de los que esta transición llegó a registrar",
|
|
212
245
|
});
|
|
@@ -268,7 +301,8 @@ export function reconcileAttemptsAt(state, transition) {
|
|
|
268
301
|
};
|
|
269
302
|
}
|
|
270
303
|
const { rows, floor: read, granted, spent } = spendAt(state, transition);
|
|
271
|
-
const
|
|
304
|
+
const paid = rows.filter((row) => row.approval !== true).length;
|
|
305
|
+
const floor = Math.max(read, paid);
|
|
272
306
|
const accounting = attemptAccountingAt(state, transition);
|
|
273
307
|
const repairs = [];
|
|
274
308
|
// What is repaired is the EFFECTIVE spend, not the raw difference between the
|
|
@@ -277,7 +311,7 @@ export function reconcileAttemptsAt(state, transition) {
|
|
|
277
311
|
// against that difference would forgive it again on every single advance and
|
|
278
312
|
// quietly remove the cap. Written against the spend, the second reading finds
|
|
279
313
|
// `spent === rows` and has nothing to do.
|
|
280
|
-
const unforgiven = spent -
|
|
314
|
+
const unforgiven = spent - paid;
|
|
281
315
|
if (unforgiven > 0) {
|
|
282
316
|
repairs.push({
|
|
283
317
|
rule: "forgive-counter-excess",
|
|
@@ -287,7 +321,7 @@ export function reconcileAttemptsAt(state, transition) {
|
|
|
287
321
|
after: granted + unforgiven,
|
|
288
322
|
});
|
|
289
323
|
}
|
|
290
|
-
const recorded = Math.max(
|
|
324
|
+
const recorded = Math.max(paid, floor);
|
|
291
325
|
if (granted > recorded) {
|
|
292
326
|
repairs.push({
|
|
293
327
|
rule: "clamp-grants",
|
|
@@ -327,10 +361,11 @@ function conflictCause(accounting, field) {
|
|
|
327
361
|
function repeatedOrdinal(state) {
|
|
328
362
|
const seen = new Map();
|
|
329
363
|
for (const row of state.attempts) {
|
|
330
|
-
const ordinals = seen.get(row.invocation_id) ?? new
|
|
331
|
-
|
|
364
|
+
const ordinals = seen.get(row.invocation_id) ?? new Map();
|
|
365
|
+
const previous = ordinals.get(row.attempt);
|
|
366
|
+
if (previous !== undefined && previous !== row.request_digest)
|
|
332
367
|
return row.attempt;
|
|
333
|
-
ordinals.
|
|
368
|
+
ordinals.set(row.attempt, row.request_digest);
|
|
334
369
|
seen.set(row.invocation_id, ordinals);
|
|
335
370
|
}
|
|
336
371
|
return null;
|
|
@@ -388,8 +423,7 @@ function unanswerableAt(state) {
|
|
|
388
423
|
}
|
|
389
424
|
return null;
|
|
390
425
|
}
|
|
391
|
-
export function recoveryBlockedAt(state, transition) {
|
|
392
|
-
const iteration = iterationOf(state, transition);
|
|
426
|
+
export function recoveryBlockedAt(state, transition, iteration = iterationOf(state, transition)) {
|
|
393
427
|
const trace = state.events.filter((event) => event.transition === transition && sameIteration(event, iteration));
|
|
394
428
|
const material = [...trace].reverse().find(declaresMaterialEffect);
|
|
395
429
|
if (material !== undefined)
|
|
@@ -415,6 +449,7 @@ function declaresMaterialEffect(event) {
|
|
|
415
449
|
event.kind === "aligned" ||
|
|
416
450
|
event.kind === "route-refused" ||
|
|
417
451
|
event.kind === "restarted" ||
|
|
452
|
+
event.kind === "retracted" ||
|
|
418
453
|
event.kind === "annulled") {
|
|
419
454
|
return false;
|
|
420
455
|
}
|
|
@@ -454,6 +489,7 @@ export const PLAN_EXEC_BATCH_STAGES = [
|
|
|
454
489
|
"deviation",
|
|
455
490
|
"validating",
|
|
456
491
|
"reviewing",
|
|
492
|
+
"batch-committing",
|
|
457
493
|
"closed",
|
|
458
494
|
"committing",
|
|
459
495
|
"integrating",
|
|
@@ -708,9 +744,64 @@ export function withPlanExecBatchCredit(state, batchId, credit) {
|
|
|
708
744
|
return state;
|
|
709
745
|
return sealRunState({
|
|
710
746
|
...withoutSeal(state),
|
|
711
|
-
batches: batches.map((batch) =>
|
|
747
|
+
batches: batches.map((batch) => batch.id === batchId ? { ...batch, credit, credit_phases: [...batch.phases] } : batch),
|
|
748
|
+
});
|
|
749
|
+
}
|
|
750
|
+
export function withPlanExecBatchUpdate(state, id, update) {
|
|
751
|
+
return sealRunState({
|
|
752
|
+
...withoutSeal(state),
|
|
753
|
+
batches: (state.batches ?? []).map((batch) => (batch.id === id ? update(batch) : batch)),
|
|
754
|
+
});
|
|
755
|
+
}
|
|
756
|
+
/** Re-seal the SAME unpublished batch; old validation/review cannot credit a new base. */
|
|
757
|
+
export function withReinferredPlanExecBatch(state, batchId, planDigest, anchor) {
|
|
758
|
+
const replaced = withPlanExecBatchUpdate(state, batchId, (batch) => {
|
|
759
|
+
const { credit: _credit, credit_phases: _phases, review: _review, commit_proposal: _proposal, ...rest } = batch;
|
|
760
|
+
return { ...rest, plan_digest: planDigest, stage: "inferred" };
|
|
761
|
+
});
|
|
762
|
+
const traced = withPlanExecBatchStage(replaced, batchId, "inferred", "plan-exec.batch-inference", "entered");
|
|
763
|
+
if (anchor === null)
|
|
764
|
+
return traced;
|
|
765
|
+
const reentered = withReentry(traced, {
|
|
766
|
+
kind: "reinfer",
|
|
767
|
+
transition: anchor,
|
|
768
|
+
occurrence: state.applied.filter((id) => id === anchor).length + 1,
|
|
769
|
+
from: "plan-exec.validation-execution",
|
|
770
|
+
});
|
|
771
|
+
return withPendingAction(withBoundary(reentered, "plan-exec.validation-execution"), null);
|
|
772
|
+
}
|
|
773
|
+
/** Old runs that closed even one batch without a commit result stay on the old tail. */
|
|
774
|
+
export function legacyPlanExecCommits(state) {
|
|
775
|
+
if (state.skipped.includes("plan-exec.batch-commit-proposal"))
|
|
776
|
+
return true;
|
|
777
|
+
const acquired = state.applied.filter((transition) => transition === "plan-exec.unit-acquisition").length;
|
|
778
|
+
return (state.batches ?? []).some((batch) => (batch.published_plan_digest !== undefined && batch.commit_result === undefined) ||
|
|
779
|
+
(batch.iteration === state.batch_loop?.iteration &&
|
|
780
|
+
batch.snapshot === undefined &&
|
|
781
|
+
acquired >= batch.iteration));
|
|
782
|
+
}
|
|
783
|
+
/** Record only the current iteration's review, never borrowing one from a prior batch. */
|
|
784
|
+
export function withPlanExecBatchReview(state, review) {
|
|
785
|
+
return sealRunState({
|
|
786
|
+
...withoutSeal(state),
|
|
787
|
+
batches: (state.batches ?? []).map((batch) => batch.iteration === state.batch_loop?.iteration ? { ...batch, review } : batch),
|
|
712
788
|
});
|
|
713
789
|
}
|
|
790
|
+
/** A legacy close may have passed the old untyped review. Insert a fresh, answerable copy. */
|
|
791
|
+
export function withPendingBatchReview(state) {
|
|
792
|
+
const review = "plan-exec.review-findings";
|
|
793
|
+
if (state.flow !== "plan-exec" || state.boundary !== "plan-exec.batch-close")
|
|
794
|
+
return state;
|
|
795
|
+
const batch = (state.batches ?? []).find((entry) => entry.published_plan_digest === undefined);
|
|
796
|
+
if (batch === undefined || batch.review !== undefined)
|
|
797
|
+
return state;
|
|
798
|
+
return withBoundary(withReentry(state, {
|
|
799
|
+
kind: "review",
|
|
800
|
+
transition: "plan-exec.batch-close",
|
|
801
|
+
from: review,
|
|
802
|
+
occurrence: state.applied.filter((id) => id === "plan-exec.batch-close").length + 1,
|
|
803
|
+
}), review);
|
|
804
|
+
}
|
|
714
805
|
/** Record one inferred or declared batch, refusing duplicate ids at the caller's boundary. */
|
|
715
806
|
export function withPlanExecBatch(state, batch) {
|
|
716
807
|
const batches = state.batches ?? [];
|
|
@@ -774,6 +865,7 @@ const PLAN_EXEC_BATCH_STAGE_BY_TRANSITION = {
|
|
|
774
865
|
"plan-exec.deviation-recognition": "deviation",
|
|
775
866
|
"plan-exec.validation-execution": "validating",
|
|
776
867
|
"plan-exec.review-findings": "reviewing",
|
|
868
|
+
"plan-exec.batch-commit": "batch-committing",
|
|
777
869
|
// These only occur after the final batch publication. They therefore extend
|
|
778
870
|
// the last closed batch's trace instead of fabricating a new one for Git/done.
|
|
779
871
|
"plan-exec.final-validation": "validating",
|
|
@@ -849,6 +941,9 @@ export const PLAN_EXEC_BATCH_LOOP_TRANSITIONS = new Set([
|
|
|
849
941
|
"plan-exec.validation-execution",
|
|
850
942
|
"plan-exec.deferred-check",
|
|
851
943
|
"plan-exec.review-findings",
|
|
944
|
+
"plan-exec.batch-commit-proposal",
|
|
945
|
+
"plan-exec.batch-commit-authorization",
|
|
946
|
+
"plan-exec.batch-commit",
|
|
852
947
|
"plan-exec.batch-close",
|
|
853
948
|
]);
|
|
854
949
|
/** Seal the plan bytes the batch publication actually produced. */
|
|
@@ -894,6 +989,33 @@ export function withPlanExecBatchPublicationPrepared(state, batchId, publication
|
|
|
894
989
|
export function withHandoff(state, handoff) {
|
|
895
990
|
return sealRunState({ ...withoutSeal(state), handoff });
|
|
896
991
|
}
|
|
992
|
+
export function withPlanExecEntry(state, entry) {
|
|
993
|
+
return sealRunState({ ...withoutSeal(state), plan_exec_entry: entry });
|
|
994
|
+
}
|
|
995
|
+
export function withDecisionDate(state, date) {
|
|
996
|
+
return state.decision_date === date
|
|
997
|
+
? state
|
|
998
|
+
: sealRunState({ ...withoutSeal(state), decision_date: date });
|
|
999
|
+
}
|
|
1000
|
+
/** Both the human exit and the structural rule deliver the same recoverable destination. */
|
|
1001
|
+
export function planRefineHandoff(state, decisions, selection) {
|
|
1002
|
+
const plan = state.scope?.plan ?? state.plan_exec_entry?.plan ?? null;
|
|
1003
|
+
const packageBody = {
|
|
1004
|
+
plan,
|
|
1005
|
+
observations: state.observations.filter((observation) => observation.transition.startsWith("plan-exec.entry-") ||
|
|
1006
|
+
observation.transition.startsWith("plan-exec.deviation-")),
|
|
1007
|
+
decisions: plan === null
|
|
1008
|
+
? { ...decisions, recovery: "nombrá el plan que debe refinar /w:plan-refine <plan>" }
|
|
1009
|
+
: decisions,
|
|
1010
|
+
selection,
|
|
1011
|
+
};
|
|
1012
|
+
return {
|
|
1013
|
+
destination: "plan-refine",
|
|
1014
|
+
command: plan === null ? "/w:plan-refine <plan>" : `/w:plan-refine ${plan}`,
|
|
1015
|
+
package: packageBody,
|
|
1016
|
+
package_digest: semanticDigest(packageBody),
|
|
1017
|
+
};
|
|
1018
|
+
}
|
|
897
1019
|
/** Persist the gate's executable consequence before the run leaves that boundary. */
|
|
898
1020
|
export function withSelectedChoice(state, selected) {
|
|
899
1021
|
return sealRunState({ ...withoutSeal(state), selected_choice: selected });
|
|
@@ -914,6 +1036,72 @@ export function withDecisionPreparation(state, preparation) {
|
|
|
914
1036
|
export function withFixPreview(state, preview) {
|
|
915
1037
|
return sealRunState({ ...withoutSeal(state), fix_preview: preview });
|
|
916
1038
|
}
|
|
1039
|
+
export function withQuickCheckouts(state, checkouts) {
|
|
1040
|
+
if (checkouts === null && state.quick_checkouts === undefined)
|
|
1041
|
+
return state;
|
|
1042
|
+
return state.flow === "quick"
|
|
1043
|
+
? sealRunState({ ...withoutSeal(state), quick_checkouts: checkouts })
|
|
1044
|
+
: state;
|
|
1045
|
+
}
|
|
1046
|
+
/** Remove a mistaken signal only before any of its consumers has used it. */
|
|
1047
|
+
export function retractSignal(state, journey, signal) {
|
|
1048
|
+
const producers = journey.filter((row) => row.signals?.includes(signal)).map((row) => row.id);
|
|
1049
|
+
const consumers = journey.filter((row) => {
|
|
1050
|
+
const rule = row.condition?.threshold;
|
|
1051
|
+
return (rule !== undefined &&
|
|
1052
|
+
producers.includes(rule.observed) &&
|
|
1053
|
+
(rule.of === undefined || rule.of.includes(signal)));
|
|
1054
|
+
});
|
|
1055
|
+
if (producers.length === 0 || consumers.length === 0) {
|
|
1056
|
+
return {
|
|
1057
|
+
ok: false,
|
|
1058
|
+
failure: {
|
|
1059
|
+
code: "FLOW_RETRACT_SIGNAL_UNKNOWN",
|
|
1060
|
+
message: `la señal '${signal}' no tiene un consumidor retirable en este recorrido`,
|
|
1061
|
+
action: "usá una señal declarada por el recorrido y consumida por una condición pendiente",
|
|
1062
|
+
},
|
|
1063
|
+
};
|
|
1064
|
+
}
|
|
1065
|
+
const removed = state.observations.filter((item) => item.signals.includes(signal) && sameIteration(item, iterationOf(state, item.transition)));
|
|
1066
|
+
if (removed.length === 0)
|
|
1067
|
+
return { ok: true, state };
|
|
1068
|
+
const consumed = consumers.find((row) => removed.some((observation) => signalWasConsumed(state, row, observation)));
|
|
1069
|
+
if (consumed !== undefined) {
|
|
1070
|
+
return {
|
|
1071
|
+
ok: false,
|
|
1072
|
+
failure: {
|
|
1073
|
+
code: "FLOW_RETRACT_ALREADY_CONSUMED",
|
|
1074
|
+
message: `'${consumed.id}' ya aplicó o dejó una ejecución sin resolver; no se retira '${signal}'`,
|
|
1075
|
+
action: "conservá la señal: retirar no revierte decisiones ni efectos ya ejercidos",
|
|
1076
|
+
},
|
|
1077
|
+
};
|
|
1078
|
+
}
|
|
1079
|
+
const updated = sealRunState({
|
|
1080
|
+
...withoutSeal(state),
|
|
1081
|
+
observations: state.observations.map((item) => removed.includes(item)
|
|
1082
|
+
? { ...item, signals: item.signals.filter((value) => value !== signal) }
|
|
1083
|
+
: item),
|
|
1084
|
+
});
|
|
1085
|
+
return {
|
|
1086
|
+
ok: true,
|
|
1087
|
+
state: withEvent(updated, {
|
|
1088
|
+
kind: "retracted",
|
|
1089
|
+
transition: state.boundary ?? producers[0] ?? "",
|
|
1090
|
+
...iterationOf(state, state.boundary ?? producers[0] ?? ""),
|
|
1091
|
+
operation: "flow.retract",
|
|
1092
|
+
signal,
|
|
1093
|
+
observations: removed,
|
|
1094
|
+
}),
|
|
1095
|
+
};
|
|
1096
|
+
}
|
|
1097
|
+
function signalWasConsumed(state, consumer, observation) {
|
|
1098
|
+
if (consumer.condition?.threshold.observed !== observation.transition)
|
|
1099
|
+
return false;
|
|
1100
|
+
// Only a consumer after THIS producer occurrence can have consumed its signal.
|
|
1101
|
+
const producer = state.applied.lastIndexOf(observation.transition);
|
|
1102
|
+
const consumed = state.applied.slice(producer + 1).includes(consumer.id);
|
|
1103
|
+
return consumed || recoveryBlockedAt(state, consumer.id, observation) !== null;
|
|
1104
|
+
}
|
|
917
1105
|
/**
|
|
918
1106
|
* Record what the closure owes — written once, when the batch loop ends.
|
|
919
1107
|
*
|
|
@@ -1433,8 +1621,44 @@ function checkCommonRecordShape(parsed, invalid) {
|
|
|
1433
1621
|
if (!isInheritedBaseArray(parsed.inherited_bases)) {
|
|
1434
1622
|
return invalid("hereda una base de batch sin sus fases o sin sus fuentes");
|
|
1435
1623
|
}
|
|
1624
|
+
if (!isPlanExecEntry(parsed.plan_exec_entry)) {
|
|
1625
|
+
return invalid("declara una entrada de plan-exec sin plan o con fases inválidas");
|
|
1626
|
+
}
|
|
1627
|
+
if (parsed.decision_date !== undefined &&
|
|
1628
|
+
(typeof parsed.decision_date !== "string" || !/^\d{4}-\d{2}-\d{2}$/.test(parsed.decision_date))) {
|
|
1629
|
+
return invalid("declara una fecha de decisión inválida");
|
|
1630
|
+
}
|
|
1436
1631
|
return null;
|
|
1437
1632
|
}
|
|
1633
|
+
function isPlanExecEntry(value) {
|
|
1634
|
+
if (value === undefined)
|
|
1635
|
+
return true;
|
|
1636
|
+
if (!isRecord(value) || !(value.plan === null || isNonEmptyString(value.plan)))
|
|
1637
|
+
return false;
|
|
1638
|
+
if (value.sources !== undefined &&
|
|
1639
|
+
(value.plan === null || !Array.isArray(value.sources) || !value.sources.every(isNonEmptyString)))
|
|
1640
|
+
return false;
|
|
1641
|
+
if (value.grammar_failure !== undefined &&
|
|
1642
|
+
(!isRecord(value.grammar_failure) ||
|
|
1643
|
+
!isNonEmptyString(value.grammar_failure.code) ||
|
|
1644
|
+
!isNonEmptyString(value.grammar_failure.message) ||
|
|
1645
|
+
!isNonEmptyString(value.grammar_failure.action)))
|
|
1646
|
+
return false;
|
|
1647
|
+
const phases = value.phases_without_open_tasks;
|
|
1648
|
+
const approval = value.approved_without_changes;
|
|
1649
|
+
if (approval !== undefined &&
|
|
1650
|
+
(value.plan === null ||
|
|
1651
|
+
!Array.isArray(phases) ||
|
|
1652
|
+
!Array.isArray(approval) ||
|
|
1653
|
+
approval.length === 0 ||
|
|
1654
|
+
new Set(approval).size !== approval.length ||
|
|
1655
|
+
!approval.every((phase) => phases.includes(phase))))
|
|
1656
|
+
return false;
|
|
1657
|
+
return (phases === null ||
|
|
1658
|
+
(Array.isArray(phases) &&
|
|
1659
|
+
phases.every((phase) => Number.isInteger(phase) && phase > 0) &&
|
|
1660
|
+
new Set(phases).size === phases.length));
|
|
1661
|
+
}
|
|
1438
1662
|
function isInheritedBaseArray(value) {
|
|
1439
1663
|
if (value === undefined)
|
|
1440
1664
|
return true;
|
|
@@ -1499,7 +1723,7 @@ function checkV10RecordShape(parsed, invalid) {
|
|
|
1499
1723
|
if (!isDecisionPreparation(parsed.decision_preparation)) {
|
|
1500
1724
|
return invalid("declara una vista de decisión sin nota, preview o linaje sellados");
|
|
1501
1725
|
}
|
|
1502
|
-
if (!isFixPreview(parsed.fix_preview)) {
|
|
1726
|
+
if (!isFixPreview(parsed.fix_preview) || !isQuickCheckouts(parsed.quick_checkouts)) {
|
|
1503
1727
|
return invalid("declara un preview de arreglo sin archivos, intención o forma del diff");
|
|
1504
1728
|
}
|
|
1505
1729
|
if (!isSettlement(parsed.settlement)) {
|
|
@@ -1636,6 +1860,17 @@ function isScope(value) {
|
|
|
1636
1860
|
return false;
|
|
1637
1861
|
if (!isStringArray(value.sources) || value.sources.length === 0)
|
|
1638
1862
|
return false;
|
|
1863
|
+
if (value.isolation !== undefined && value.isolation !== "unit" && value.isolation !== "in-place")
|
|
1864
|
+
return false;
|
|
1865
|
+
if (value.final_validation !== undefined &&
|
|
1866
|
+
(!Array.isArray(value.final_validation) ||
|
|
1867
|
+
!value.final_validation.every((entry) => isRecord(entry) &&
|
|
1868
|
+
typeof entry.alias === "string" &&
|
|
1869
|
+
[entry.build, entry.test].every((item) => isRecord(item) &&
|
|
1870
|
+
(item.command === null || typeof item.command === "string") &&
|
|
1871
|
+
(item.origin === null || item.origin === "plan" || item.origin === "source") &&
|
|
1872
|
+
(item.action === undefined || typeof item.action === "string")))))
|
|
1873
|
+
return false;
|
|
1639
1874
|
return value.sources.every((alias) => alias.trim().length > 0);
|
|
1640
1875
|
}
|
|
1641
1876
|
function isPlanExecBatchArray(value) {
|
|
@@ -1658,7 +1893,11 @@ function isPlanExecBatchArray(value) {
|
|
|
1658
1893
|
entry.phases.length === 0 ||
|
|
1659
1894
|
!entry.phases.every((phase) => typeof phase === "number" && Number.isInteger(phase) && phase > 0) ||
|
|
1660
1895
|
!isStringArray(entry.tasks) ||
|
|
1661
|
-
entry.
|
|
1896
|
+
(entry.validation_only !== undefined && typeof entry.validation_only !== "boolean") ||
|
|
1897
|
+
(entry.validation_only === true && entry.tasks.length !== 0) ||
|
|
1898
|
+
(entry.validation_only === false && entry.kind === "validation-only") ||
|
|
1899
|
+
(entry.kind === "validation-only" ? entry.tasks.length !== 0 : entry.tasks.length === 0) ||
|
|
1900
|
+
(entry.kind !== undefined && entry.kind !== "validation-only") ||
|
|
1662
1901
|
new Set(entry.tasks).size !== entry.tasks.length ||
|
|
1663
1902
|
typeof entry.plan_digest !== "string" ||
|
|
1664
1903
|
entry.plan_digest.length === 0 ||
|
|
@@ -1671,7 +1910,14 @@ function isPlanExecBatchArray(value) {
|
|
|
1671
1910
|
entry.published_plan_digest !== entry.publication.after_plan_digest) ||
|
|
1672
1911
|
!PLAN_EXEC_BATCH_STAGES.includes(entry.stage) ||
|
|
1673
1912
|
!isSourceMap(entry.base, true) ||
|
|
1674
|
-
!isSourceMap(entry.credit, false)
|
|
1913
|
+
!isSourceMap(entry.credit, false) ||
|
|
1914
|
+
!isBatchPartition(entry.partition, entry.phases, entry.mode) ||
|
|
1915
|
+
!isBatchSnapshot(entry.snapshot) ||
|
|
1916
|
+
!isBatchCommitProposal(entry.commit_proposal) ||
|
|
1917
|
+
!isBatchCommitResult(entry.commit_result) ||
|
|
1918
|
+
(entry.credit_phases !== undefined &&
|
|
1919
|
+
(entry.credit === undefined || !samePhaseRange(entry.credit_phases, entry.phases))) ||
|
|
1920
|
+
(entry.review !== undefined && !isBatchReview(entry.review))) {
|
|
1675
1921
|
return false;
|
|
1676
1922
|
}
|
|
1677
1923
|
ids.add(entry.id);
|
|
@@ -1679,6 +1925,67 @@ function isPlanExecBatchArray(value) {
|
|
|
1679
1925
|
return true;
|
|
1680
1926
|
});
|
|
1681
1927
|
}
|
|
1928
|
+
function isBatchSnapshot(value) {
|
|
1929
|
+
if (value === undefined)
|
|
1930
|
+
return true;
|
|
1931
|
+
return (isRecord(value) &&
|
|
1932
|
+
Object.values(value).every((entry) => isRecord(entry) &&
|
|
1933
|
+
isNonEmptyString(entry.head) &&
|
|
1934
|
+
isNonEmptyString(entry.branch) &&
|
|
1935
|
+
Array.isArray(entry.dirty) &&
|
|
1936
|
+
entry.dirty.every((path) => isRecord(path) && isNonEmptyString(path.path) && isNonEmptyString(path.digest))));
|
|
1937
|
+
}
|
|
1938
|
+
function isBatchCommitProposal(value) {
|
|
1939
|
+
if (value === undefined)
|
|
1940
|
+
return true;
|
|
1941
|
+
return (isRecord(value) &&
|
|
1942
|
+
isNonEmptyString(value.digest) &&
|
|
1943
|
+
(value.approved_digest === undefined || isNonEmptyString(value.approved_digest)) &&
|
|
1944
|
+
Array.isArray(value.sources) &&
|
|
1945
|
+
value.sources.every((item) => isRecord(item) &&
|
|
1946
|
+
isNonEmptyString(item.alias) &&
|
|
1947
|
+
isNonEmptyString(item.message) &&
|
|
1948
|
+
isStringArray(item.paths) &&
|
|
1949
|
+
(item.foreign_paths === undefined || isStringArray(item.foreign_paths)) &&
|
|
1950
|
+
item.paths.length > 0 &&
|
|
1951
|
+
Array.isArray(item.dirty) &&
|
|
1952
|
+
item.dirty.length === item.paths.length &&
|
|
1953
|
+
item.dirty.every((path) => isRecord(path) && isNonEmptyString(path.path) && isNonEmptyString(path.digest))));
|
|
1954
|
+
}
|
|
1955
|
+
function isBatchCommitResult(value) {
|
|
1956
|
+
if (value === undefined)
|
|
1957
|
+
return true;
|
|
1958
|
+
return (isRecord(value) &&
|
|
1959
|
+
Object.values(value).every((receipt) => isRecord(receipt) &&
|
|
1960
|
+
isNonEmptyString(receipt.after) &&
|
|
1961
|
+
(receipt.before === null || isNonEmptyString(receipt.before)) &&
|
|
1962
|
+
(receipt.branch === null || isNonEmptyString(receipt.branch)) &&
|
|
1963
|
+
isStringArray(receipt.parents)));
|
|
1964
|
+
}
|
|
1965
|
+
function samePhaseRange(value, phases) {
|
|
1966
|
+
return (Array.isArray(value) &&
|
|
1967
|
+
value.length === phases.length &&
|
|
1968
|
+
value.every((phase, index) => phase === phases[index]));
|
|
1969
|
+
}
|
|
1970
|
+
function isBatchPartition(value, phases, mode) {
|
|
1971
|
+
if (value === undefined)
|
|
1972
|
+
return true;
|
|
1973
|
+
if (!isRecord(value) ||
|
|
1974
|
+
!isNonEmptyString(value.reason) ||
|
|
1975
|
+
!isRecord(value.effective) ||
|
|
1976
|
+
value.effective.mode !== mode ||
|
|
1977
|
+
!samePhaseRange(value.effective.phases, phases))
|
|
1978
|
+
return false;
|
|
1979
|
+
return (value.declared === null ||
|
|
1980
|
+
(Array.isArray(value.declared) &&
|
|
1981
|
+
value.declared.length > 0 &&
|
|
1982
|
+
value.declared.every((row) => isRecord(row) &&
|
|
1983
|
+
isNonEmptyString(row.id) &&
|
|
1984
|
+
(row.mode === "continuous" || row.mode === "isolated") &&
|
|
1985
|
+
Array.isArray(row.phases) &&
|
|
1986
|
+
row.phases.length > 0 &&
|
|
1987
|
+
row.phases.every((phase) => Number.isSafeInteger(phase) && phase > 0))));
|
|
1988
|
+
}
|
|
1682
1989
|
/** Absent, or a non-empty alias → digest map; `nullable` admits an unobserved source. */
|
|
1683
1990
|
function isSourceMap(value, nullable) {
|
|
1684
1991
|
if (value === undefined)
|
|
@@ -1724,6 +2031,7 @@ function isPlanExecBatchTraceArray(value, batches) {
|
|
|
1724
2031
|
typeof entry.iteration === "number" &&
|
|
1725
2032
|
Number.isInteger(entry.iteration) &&
|
|
1726
2033
|
typeof entry.transition === "string" &&
|
|
2034
|
+
(entry.approval === undefined || entry.approval === true) &&
|
|
1727
2035
|
entry.transition.length > 0 &&
|
|
1728
2036
|
PLAN_EXEC_BATCH_STAGES.includes(entry.stage) &&
|
|
1729
2037
|
(entry.kind === "entered" || entry.kind === "completed" || entry.kind === "blocked"));
|
|
@@ -1881,7 +2189,13 @@ function isFixPreview(value) {
|
|
|
1881
2189
|
return (typeof value.intent === "string" &&
|
|
1882
2190
|
value.intent.trim().length > 0 &&
|
|
1883
2191
|
typeof value.diff === "string" &&
|
|
1884
|
-
value.diff.trim().length > 0
|
|
2192
|
+
value.diff.trim().length > 0 &&
|
|
2193
|
+
isQuickCheckouts(value.checkouts));
|
|
2194
|
+
}
|
|
2195
|
+
function isQuickCheckouts(value) {
|
|
2196
|
+
return (value === null ||
|
|
2197
|
+
value === undefined ||
|
|
2198
|
+
(isRecord(value) && Object.values(value).every(nonEmpty)));
|
|
1885
2199
|
}
|
|
1886
2200
|
function isDecisionPreview(value, baseline) {
|
|
1887
2201
|
if (!isRecord(value) ||
|
|
@@ -2015,6 +2329,9 @@ const EVENT_BODIES = new Map(Object.entries({
|
|
|
2015
2329
|
isEffectClassArray(entry.effects) &&
|
|
2016
2330
|
isStringArray(entry.evidence),
|
|
2017
2331
|
reconciled: (entry) => isRepairArray(entry.repairs),
|
|
2332
|
+
retracted: (entry) => nonEmpty(entry.signal) &&
|
|
2333
|
+
isObservationArray(entry.observations) &&
|
|
2334
|
+
entry.observations.length > 0,
|
|
2018
2335
|
restarted: (entry) => nonEmpty(entry.archive) && nonEmpty(entry.cause),
|
|
2019
2336
|
annulled: (entry) => isStringArray(entry.batches) &&
|
|
2020
2337
|
entry.batches.length > 0 &&
|
|
@@ -2051,7 +2368,7 @@ function isObservationArray(value) {
|
|
|
2051
2368
|
isStringArray(entry.signals) &&
|
|
2052
2369
|
isIterationRecord(entry));
|
|
2053
2370
|
}
|
|
2054
|
-
const REENTRY_KINDS = ["refine", "close", "reopen"];
|
|
2371
|
+
const REENTRY_KINDS = ["refine", "close", "reopen", "review", "reinfer"];
|
|
2055
2372
|
/** Absent, or reentries each with its kind, its boundary, its occurrence and its origin. */
|
|
2056
2373
|
function isReentryArray(value) {
|
|
2057
2374
|
if (value === undefined)
|
|
@@ -2060,6 +2377,17 @@ function isReentryArray(value) {
|
|
|
2060
2377
|
return false;
|
|
2061
2378
|
return value.every((entry) => isRecord(entry) &&
|
|
2062
2379
|
REENTRY_KINDS.includes(entry.kind) &&
|
|
2380
|
+
(entry.kind !== "review" ||
|
|
2381
|
+
(entry.transition === "plan-exec.batch-close" &&
|
|
2382
|
+
entry.from === "plan-exec.review-findings")) &&
|
|
2383
|
+
(entry.kind !== "reinfer" ||
|
|
2384
|
+
(entry.from === "plan-exec.validation-execution" &&
|
|
2385
|
+
[
|
|
2386
|
+
"plan-exec.deferred-check",
|
|
2387
|
+
"plan-exec.review-findings",
|
|
2388
|
+
"plan-exec.batch-commit-proposal",
|
|
2389
|
+
"plan-exec.batch-close",
|
|
2390
|
+
].includes(entry.transition))) &&
|
|
2063
2391
|
nonEmpty(entry.transition) &&
|
|
2064
2392
|
Number.isInteger(entry.occurrence) &&
|
|
2065
2393
|
entry.occurrence >= 1 &&
|