@event4u/agent-config 8.4.0 → 8.5.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/.claude-plugin/marketplace.json +1 -1
- package/CHANGELOG.md +73 -0
- package/README.md +17 -5
- package/dist/agent-src/README.md +1 -1
- package/dist/agent-src/commands/{analyze-reference-repo.md → analyze/reference-repo.md} +3 -1
- package/dist/agent-src/commands/analyze.md +9 -6
- package/dist/agent-src/commands/{bug-fix.md → bug/fix.md} +3 -1
- package/dist/agent-src/commands/{bug-investigate.md → bug/investigate.md} +4 -2
- package/dist/agent-src/commands/bug.md +59 -0
- package/dist/agent-src/commands/{set-cost-profile.md → cost/profile.md} +9 -6
- package/dist/agent-src/commands/{cost-report.md → cost/report.md} +18 -17
- package/dist/agent-src/commands/cost.md +57 -0
- package/dist/agent-src/commands/evals/{review-changes.json → review.json} +12 -8
- package/dist/agent-src/commands/{quality-fix.md → fix/quality.md} +5 -2
- package/dist/agent-src/commands/fix.md +7 -4
- package/dist/agent-src/commands/optimize/project.md +250 -0
- package/dist/agent-src/commands/{optimize-prompt.md → optimize/prompt.md} +3 -2
- package/dist/agent-src/commands/optimize.md +17 -12
- package/dist/agent-src/commands/{package-reset.md → package/reset.md} +2 -0
- package/dist/agent-src/commands/{package-test.md → package/test.md} +3 -1
- package/dist/agent-src/commands/package.md +56 -0
- package/dist/agent-src/commands/{project-analyze.md → project/analyze.md} +10 -8
- package/dist/agent-src/commands/{project-health.md → project/health.md} +2 -0
- package/dist/agent-src/commands/project.md +60 -0
- package/dist/agent-src/commands/{review-changes.md → review/changes.md} +26 -24
- package/dist/agent-src/commands/{review-routing.md → review/routing.md} +21 -17
- package/dist/agent-src/commands/review.md +61 -0
- package/dist/agent-src/commands/security-audit-config.md +24 -23
- package/dist/agent-src/commands/{sync-agent-settings.md → sync/agent-settings.md} +11 -7
- package/dist/agent-src/commands/{sync-gitignore → sync/gitignore}/fix.md +36 -27
- package/dist/agent-src/commands/{sync-gitignore.md → sync/gitignore.md} +22 -21
- package/dist/agent-src/commands/sync.md +58 -0
- package/dist/agent-src/commands/{e2e-heal.md → tests/e2e-heal.md} +5 -2
- package/dist/agent-src/commands/{e2e-plan.md → tests/e2e-plan.md} +5 -2
- package/dist/agent-src/commands/tests.md +11 -5
- package/dist/agent-src/contexts/augment-infrastructure.md +3 -3
- package/dist/agent-src/contexts/execution/toolchain-resolver.md +1 -1
- package/dist/agent-src/contexts/skills-and-commands.md +2 -2
- package/dist/agent-src/rules/external-reference-deep-dive.md +1 -1
- package/dist/agent-src/skills/finishing-a-development-branch/SKILL.md +2 -2
- package/dist/agent-src/skills/judge-artifact-completeness/SKILL.md +1 -1
- package/dist/agent-src/skills/judge-bug-hunter/SKILL.md +1 -1
- package/dist/agent-src/skills/judge-code-quality/SKILL.md +1 -1
- package/dist/agent-src/skills/judge-security-auditor/SKILL.md +1 -1
- package/dist/agent-src/skills/judge-synthesis/SKILL.md +1 -1
- package/dist/agent-src/skills/judge-test-coverage/SKILL.md +1 -1
- package/dist/agent-src/skills/markitdown/SKILL.md +1 -1
- package/dist/agent-src/skills/mobile-e2e-strategy/SKILL.md +5 -5
- package/dist/agent-src/skills/prompt-optimizer/SKILL.md +2 -2
- package/dist/agent-src/skills/quality-tools/SKILL.md +1 -1
- package/dist/agent-src/skills/repomix-packer/SKILL.md +1 -1
- package/dist/agent-src/skills/requesting-code-review/SKILL.md +2 -2
- package/dist/agent-src/skills/verify-repair-loop/SKILL.md +2 -2
- package/dist/agent-src/templates/agent-settings.md +1 -1
- package/dist/agent-src/templates/agents/agent-project-settings.example.yml +2 -2
- package/dist/agent-src/templates/scripts/work_engine/stack/runner.ts +1 -1
- package/dist/cli/commands/config.js +44 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/uiServe.js +1 -0
- package/dist/cli/commands/uiServe.js.map +1 -1
- package/dist/cli/help.js +38 -0
- package/dist/cli/help.js.map +1 -0
- package/dist/cli/initRouting.js +16 -1
- package/dist/cli/initRouting.js.map +1 -1
- package/dist/cli/main.js +43 -37
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/registry.js +45 -44
- package/dist/cli/registry.js.map +1 -1
- package/dist/discovery/deprecation-report.md +1 -1
- package/dist/discovery/discovery-manifest.json +419 -210
- package/dist/discovery/discovery-manifest.json.sha256 +1 -1
- package/dist/discovery/discovery-manifest.summary.md +4 -4
- package/dist/discovery/orphan-report.md +1 -1
- package/dist/discovery/packs.json +31 -25
- package/dist/discovery/trust-report.md +2 -2
- package/dist/discovery/workspaces.json +30 -24
- package/dist/install/install.mjs +6064 -159
- package/dist/install/selectedTools.js +39 -10
- package/dist/install/selectedTools.js.map +1 -1
- package/dist/mcp/registry-manifest.json +3 -3
- package/dist/server/app.js +15 -3
- package/dist/server/app.js.map +1 -1
- package/dist/server/routes/ping.js +16 -0
- package/dist/server/routes/ping.js.map +1 -1
- package/dist/server/routes/settings.js +42 -6
- package/dist/server/routes/settings.js.map +1 -1
- package/dist/server/routes/settingsChanges.js +55 -0
- package/dist/server/routes/settingsChanges.js.map +1 -0
- package/dist/server/routes/userMd.js +7 -2
- package/dist/server/routes/userMd.js.map +1 -1
- package/dist/server/routes/wizard.js +76 -14
- package/dist/server/routes/wizard.js.map +1 -1
- package/dist/server/writeRoot.js +17 -0
- package/dist/server/writeRoot.js.map +1 -1
- package/dist/shared/settingsSurface.js +120 -0
- package/dist/shared/settingsSurface.js.map +1 -0
- package/dist/ui/assets/index-BPFMZWUs.css +1 -0
- package/dist/ui/assets/index-BiEZiZ31.js +40 -0
- package/dist/ui/assets/index-BiEZiZ31.js.map +1 -0
- package/dist/ui/index.html +15 -2
- package/docs/CLAIMS.md +20 -15
- package/docs/architecture.md +1 -1
- package/docs/catalog.md +37 -31
- package/docs/command-flows.md +22 -16
- package/docs/contracts/command-clusters.md +39 -9
- package/docs/contracts/file-ownership-matrix.json +21 -0
- package/docs/contracts/frontmatter-contract.md +1 -1
- package/docs/contracts/gui-wizard.md +16 -4
- package/docs/contracts/iron-law-overrides.txt +1 -0
- package/docs/contracts/rule-classification.md +2 -2
- package/docs/contracts/settings-api.md +58 -2
- package/docs/contracts/surface-matrix.md +5 -0
- package/docs/cookbook.md +7 -7
- package/docs/decisions/ADR-114-commit-policy-iron-law-override.md +74 -0
- package/docs/decisions/ADR-115-command-cluster-consolidation-phase-4.md +91 -0
- package/docs/decisions/INDEX.md +2 -0
- package/docs/featured-commands.md +1 -1
- package/docs/featured-skills.md +4 -4
- package/docs/flows.md +2 -2
- package/docs/getting-started-by-role.md +1 -1
- package/docs/getting-started-laravel.md +1 -1
- package/docs/getting-started.md +6 -3
- package/docs/governance-advantage.md +1 -1
- package/docs/guidelines/agent-infra/5w2h-analysis.md +1 -1
- package/docs/guidelines/agent-infra/ios-simulator-guide.md +1 -1
- package/docs/proof.md +11 -2
- package/package.json +6 -1
- package/src/agent-src/README.md +64 -0
- package/src/agent-src/scripts/archive_completed_roadmaps.ts +497 -0
- package/src/agent-src/scripts/scan-seeder-violations.php +145 -0
- package/src/agent-src/scripts/update_roadmap_progress.ts +1087 -0
- package/src/agent-src/templates/AGENTS.md +34 -0
- package/src/agent-src/templates/scripts/README.md +195 -0
- package/src/agent-src/templates/scripts/check_memory.ts +662 -0
- package/src/agent-src/templates/scripts/check_memory_proposal.ts +370 -0
- package/src/agent-src/templates/scripts/historical-bug-patterns.example.yml +84 -0
- package/src/agent-src/templates/scripts/implement_ticket/__main__.ts +27 -0
- package/src/agent-src/templates/scripts/memory_hash.ts +355 -0
- package/src/agent-src/templates/scripts/memory_lookup.ts +1089 -0
- package/src/agent-src/templates/scripts/memory_report.ts +868 -0
- package/src/agent-src/templates/scripts/memory_signal.ts +444 -0
- package/src/agent-src/templates/scripts/memory_status.ts +215 -0
- package/src/agent-src/templates/scripts/ownership-map.example.yml +87 -0
- package/src/agent-src/templates/scripts/pr-risk-config.example.yml +76 -0
- package/src/agent-src/templates/scripts/pr_review_routing.ts +544 -0
- package/src/agent-src/templates/scripts/pr_risk_review.ts +0 -0
- package/src/agent-src/templates/scripts/telemetry/aggregator.ts +0 -0
- package/src/agent-src/templates/scripts/telemetry/boundary.ts +164 -0
- package/src/agent-src/templates/scripts/telemetry/engagement.ts +479 -0
- package/src/agent-src/templates/scripts/telemetry/report_renderer.ts +394 -0
- package/src/agent-src/templates/scripts/telemetry/settings.ts +210 -0
- package/src/agent-src/templates/scripts/telemetry_record.ts +276 -0
- package/src/agent-src/templates/scripts/telemetry_report.ts +211 -0
- package/src/agent-src/templates/scripts/telemetry_status.ts +333 -0
- package/src/agent-src/templates/scripts/tier_usage_report.ts +619 -0
- package/src/agent-src/templates/scripts/work_engine/__main__.ts +14 -0
- package/src/agent-src/templates/scripts/work_engine/_lib/agent_settings.ts +1261 -0
- package/src/agent-src/templates/scripts/work_engine/_lib/user_global_paths.ts +329 -0
- package/src/agent-src/templates/scripts/work_engine/cli.ts +206 -0
- package/src/agent-src/templates/scripts/work_engine/cli_args.ts +249 -0
- package/src/agent-src/templates/scripts/work_engine/delivery_state.ts +225 -0
- package/src/agent-src/templates/scripts/work_engine/directives/backend/analyze.ts +125 -0
- package/src/agent-src/templates/scripts/work_engine/directives/backend/implement.ts +189 -0
- package/src/agent-src/templates/scripts/work_engine/directives/backend/index.ts +94 -0
- package/src/agent-src/templates/scripts/work_engine/directives/backend/memory.ts +193 -0
- package/src/agent-src/templates/scripts/work_engine/directives/backend/plan.ts +267 -0
- package/src/agent-src/templates/scripts/work_engine/directives/backend/refine.ts +518 -0
- package/src/agent-src/templates/scripts/work_engine/directives/backend/report.ts +379 -0
- package/src/agent-src/templates/scripts/work_engine/directives/backend/test.ts +268 -0
- package/src/agent-src/templates/scripts/work_engine/directives/backend/verify.ts +258 -0
- package/src/agent-src/templates/scripts/work_engine/directives/index.ts +32 -0
- package/src/agent-src/templates/scripts/work_engine/directives/mixed/contract.ts +243 -0
- package/src/agent-src/templates/scripts/work_engine/directives/mixed/index.ts +108 -0
- package/src/agent-src/templates/scripts/work_engine/directives/mixed/stitch.ts +259 -0
- package/src/agent-src/templates/scripts/work_engine/directives/mixed/ui.ts +216 -0
- package/src/agent-src/templates/scripts/work_engine/directives/ui/_passthrough.ts +40 -0
- package/src/agent-src/templates/scripts/work_engine/directives/ui/app_spec.ts +241 -0
- package/src/agent-src/templates/scripts/work_engine/directives/ui/apply.ts +216 -0
- package/src/agent-src/templates/scripts/work_engine/directives/ui/audit.ts +506 -0
- package/src/agent-src/templates/scripts/work_engine/directives/ui/design.ts +325 -0
- package/src/agent-src/templates/scripts/work_engine/directives/ui/index.ts +102 -0
- package/src/agent-src/templates/scripts/work_engine/directives/ui/polish.ts +462 -0
- package/src/agent-src/templates/scripts/work_engine/directives/ui/review.ts +474 -0
- package/src/agent-src/templates/scripts/work_engine/directives/ui/scaffold.ts +352 -0
- package/src/agent-src/templates/scripts/work_engine/directives/ui_trivial/_skipped.ts +33 -0
- package/src/agent-src/templates/scripts/work_engine/directives/ui_trivial/apply.ts +213 -0
- package/src/agent-src/templates/scripts/work_engine/directives/ui_trivial/index.ts +111 -0
- package/src/agent-src/templates/scripts/work_engine/directives/ui_trivial/refine.ts +126 -0
- package/src/agent-src/templates/scripts/work_engine/directives/ui_trivial/report.ts +112 -0
- package/src/agent-src/templates/scripts/work_engine/directives/ui_trivial/test.ts +164 -0
- package/src/agent-src/templates/scripts/work_engine/dispatcher.ts +515 -0
- package/src/agent-src/templates/scripts/work_engine/emitters.ts +119 -0
- package/src/agent-src/templates/scripts/work_engine/errors.ts +24 -0
- package/src/agent-src/templates/scripts/work_engine/hook_bootstrap.ts +104 -0
- package/src/agent-src/templates/scripts/work_engine/hooks/builtin/_chat_history_base.ts +189 -0
- package/src/agent-src/templates/scripts/work_engine/hooks/builtin/chat_history_append.ts +41 -0
- package/src/agent-src/templates/scripts/work_engine/hooks/builtin/chat_history_halt_append.ts +89 -0
- package/src/agent-src/templates/scripts/work_engine/hooks/builtin/decision_gate.ts +193 -0
- package/src/agent-src/templates/scripts/work_engine/hooks/builtin/decision_trace.ts +304 -0
- package/src/agent-src/templates/scripts/work_engine/hooks/builtin/directive_set_guard.ts +110 -0
- package/src/agent-src/templates/scripts/work_engine/hooks/builtin/halt_surface_audit.ts +118 -0
- package/src/agent-src/templates/scripts/work_engine/hooks/builtin/index.ts +17 -0
- package/src/agent-src/templates/scripts/work_engine/hooks/builtin/memory_visibility.ts +161 -0
- package/src/agent-src/templates/scripts/work_engine/hooks/builtin/state_shape_validation.ts +45 -0
- package/src/agent-src/templates/scripts/work_engine/hooks/builtin/trace.ts +134 -0
- package/src/agent-src/templates/scripts/work_engine/hooks/context.ts +94 -0
- package/src/agent-src/templates/scripts/work_engine/hooks/events.ts +58 -0
- package/src/agent-src/templates/scripts/work_engine/hooks/exceptions.ts +85 -0
- package/src/agent-src/templates/scripts/work_engine/hooks/index.ts +27 -0
- package/src/agent-src/templates/scripts/work_engine/hooks/registry.ts +66 -0
- package/src/agent-src/templates/scripts/work_engine/hooks/runner.ts +90 -0
- package/src/agent-src/templates/scripts/work_engine/hooks/settings.ts +260 -0
- package/src/agent-src/templates/scripts/work_engine/input_builders.ts +260 -0
- package/src/agent-src/templates/scripts/work_engine/intent/classify.ts +466 -0
- package/src/agent-src/templates/scripts/work_engine/migration/v0_to_v1.ts +531 -0
- package/src/agent-src/templates/scripts/work_engine/orchestration.ts +366 -0
- package/src/agent-src/templates/scripts/work_engine/persona_policy.ts +97 -0
- package/src/agent-src/templates/scripts/work_engine/resolvers/diff.ts +135 -0
- package/src/agent-src/templates/scripts/work_engine/resolvers/file.ts +175 -0
- package/src/agent-src/templates/scripts/work_engine/resolvers/prompt.ts +115 -0
- package/src/agent-src/templates/scripts/work_engine/scoring/confidence.ts +415 -0
- package/src/agent-src/templates/scripts/work_engine/scoring/decision_engine.ts +466 -0
- package/src/agent-src/templates/scripts/work_engine/scoring/decision_trace.ts +298 -0
- package/src/agent-src/templates/scripts/work_engine/scoring/memory_visibility.ts +444 -0
- package/src/agent-src/templates/scripts/work_engine/stack/detect.ts +252 -0
- package/src/agent-src/templates/scripts/work_engine/stack/runner.ts +745 -0
- package/src/agent-src/templates/scripts/work_engine/state.ts +1151 -0
- package/src/agent-src/templates/scripts/work_engine/state_io.ts +413 -0
- package/src/config/agent-settings.template.yml +1 -1
- package/src/install/atomic.ts +111 -0
- package/src/install/conflict.ts +226 -0
- package/src/install/detect.ts +280 -0
- package/src/install/paths.ts +90 -0
- package/src/install/plan.ts +205 -0
- package/src/install/preflight.ts +210 -0
- package/src/install/selectedTools.ts +80 -0
- package/src/install/toolDetection.ts +120 -0
- package/src/install/txlog.ts +161 -0
- package/src/install/types.ts +175 -0
- package/src/install/wizard-plan.ts +216 -0
- package/src/scripts/_cli/cmd_converge.ts +38 -0
- package/src/scripts/_cli/cmd_doctor.ts +113 -2
- package/src/scripts/_cli/cmd_explain.ts +2 -2
- package/src/scripts/_cli/cmd_export.ts +3 -3
- package/src/scripts/_cli/cmd_fleet.ts +13 -1
- package/src/scripts/_cli/cmd_migrate.ts +3 -3
- package/src/scripts/_cli/cmd_prune.ts +2 -2
- package/src/scripts/_cli/cmd_refresh.ts +4 -4
- package/src/scripts/_cli/cmd_settings_check.ts +2 -2
- package/src/scripts/_cli/cmd_settings_migrate.ts +2 -2
- package/src/scripts/_cli/cmd_sync.ts +2 -2
- package/src/scripts/_cli/cmd_uninstall.ts +2 -2
- package/src/scripts/_cli/cmd_update.ts +8 -8
- package/src/scripts/_cli/cmd_upgrade.ts +4 -3
- package/src/scripts/_cli/cmd_validate.ts +3 -3
- package/src/scripts/_cli/cmd_versions.ts +2 -2
- package/src/scripts/_cli/explain_last/assumptions.ts +2 -2
- package/src/scripts/_cli/explain_last/council.ts +2 -2
- package/src/scripts/_cli/explain_last/halt.ts +2 -2
- package/src/scripts/_cli/explain_last/index.ts +2 -2
- package/src/scripts/_cli/explain_last/inputs.ts +4 -4
- package/src/scripts/_cli/explain_last/memory.ts +2 -2
- package/src/scripts/_cli/explain_last/provider.ts +2 -2
- package/src/scripts/_cli/explain_last/render.ts +2 -2
- package/src/scripts/_cli/explain_last/route.ts +2 -2
- package/src/scripts/_cli/explain_last/scrubber.ts +2 -2
- package/src/scripts/_cli/explain_last/sections/assumptions.ts +2 -2
- package/src/scripts/_cli/explain_last/sections/council.ts +2 -2
- package/src/scripts/_cli/explain_last/sections/halt.ts +2 -2
- package/src/scripts/_cli/explain_last/sections/header.ts +2 -2
- package/src/scripts/_cli/explain_last/sections/index.ts +1 -1
- package/src/scripts/_cli/explain_last/sections/inputs.ts +2 -2
- package/src/scripts/_cli/explain_last/sections/memory.ts +2 -2
- package/src/scripts/_cli/explain_last/sections/pack.ts +2 -2
- package/src/scripts/_cli/explain_last/sections/provider.ts +2 -2
- package/src/scripts/_cli/explain_last/sections/route.ts +2 -2
- package/src/scripts/_cli/explain_last/state_loader.ts +2 -2
- package/src/scripts/_dispatch.bash +20 -1
- package/src/scripts/_lib/agent_settings.ts +1 -1
- package/src/scripts/_lib/agent_src.ts +7 -7
- package/src/scripts/_lib/agents_overlay.ts +1 -1
- package/src/scripts/_lib/bench_ab_cache.ts +1 -1
- package/src/scripts/_lib/bench_ab_scoring.ts +1 -1
- package/src/scripts/_lib/bench_ab_scoring_v2.ts +3 -3
- package/src/scripts/_lib/bench_cost.ts +1 -1
- package/src/scripts/_lib/bench_quality.ts +3 -3
- package/src/scripts/_lib/bench_report.ts +4 -4
- package/src/scripts/_lib/bench_telegraph.ts +1 -1
- package/src/scripts/_lib/bench_telegraph_report.ts +4 -4
- package/src/scripts/_lib/changelog_eras.ts +1 -1
- package/src/scripts/_lib/claude_desktop_bundler.ts +1 -1
- package/src/scripts/_lib/cli_wrapper.ts +1 -1
- package/src/scripts/_lib/fs_atomic.ts +1 -1
- package/src/scripts/_lib/global_deploy_inventory.ts +1 -1
- package/src/scripts/_lib/install_layout.ts +1 -1
- package/src/scripts/_lib/install_regenerator.ts +1 -1
- package/src/scripts/_lib/installed_lock.ts +1 -1
- package/src/scripts/_lib/installed_tools.ts +1 -1
- package/src/scripts/_lib/json_pointers.ts +1 -1
- package/src/scripts/_lib/knowledge_global.ts +1 -1
- package/src/scripts/_lib/knowledge_global_promote.ts +2 -2
- package/src/scripts/_lib/knowledge_global_redaction.ts +2 -2
- package/src/scripts/_lib/link_crypto.ts +4 -4
- package/src/scripts/_lib/linked_projects.ts +4 -4
- package/src/scripts/_lib/model_tier.ts +1 -1
- package/src/scripts/_lib/module_detection.ts +2 -2
- package/src/scripts/_lib/pin_resolver.ts +1 -1
- package/src/scripts/_lib/script_output.ts +1 -1
- package/src/scripts/_lib/security_lint.ts +1 -1
- package/src/scripts/_lib/surface_tiers.ts +1 -1
- package/src/scripts/_lib/text_similarity.ts +1 -1
- package/src/scripts/_lib/update_check.ts +2 -2
- package/src/scripts/_lib/user_global_paths.ts +1 -1
- package/src/scripts/_lib/value_ladder.ts +1 -1
- package/src/scripts/_lib/value_report.ts +1 -1
- package/src/scripts/_lib/zip_min.ts +2 -2
- package/src/scripts/adoption_report.ts +3 -3
- package/src/scripts/adoption_snapshot.ts +3 -3
- package/src/scripts/adoption_status.ts +2 -2
- package/src/scripts/adr/regenerate_index.ts +3 -3
- package/src/scripts/ai_council/_default_prices.ts +2 -3
- package/src/scripts/ai_council/advisors.ts +1 -1
- package/src/scripts/ai_council/airgap.ts +1 -1
- package/src/scripts/ai_council/budget_guard.ts +1 -1
- package/src/scripts/ai_council/bundler.ts +1 -1
- package/src/scripts/ai_council/cli_hints.ts +1 -1
- package/src/scripts/ai_council/clients.ts +5 -5
- package/src/scripts/ai_council/compile_corpus.ts +1 -1
- package/src/scripts/ai_council/confidence_gate.ts +1 -1
- package/src/scripts/ai_council/config.ts +1 -1
- package/src/scripts/ai_council/consensus.ts +1 -1
- package/src/scripts/ai_council/events_log.ts +1 -1
- package/src/scripts/ai_council/learn_low_impact_preview.ts +1 -1
- package/src/scripts/ai_council/low_impact_corpus.ts +1 -1
- package/src/scripts/ai_council/low_impact_intake.ts +1 -1
- package/src/scripts/ai_council/modes.ts +1 -1
- package/src/scripts/ai_council/orchestrator.ts +3 -3
- package/src/scripts/ai_council/pricing.ts +2 -2
- package/src/scripts/ai_council/probation_gate.ts +2 -2
- package/src/scripts/ai_council/project_context.ts +1 -1
- package/src/scripts/ai_council/prompts.ts +1 -1
- package/src/scripts/ai_council/redact_low_impact_entry.ts +2 -2
- package/src/scripts/ai_council/session.ts +1 -1
- package/src/scripts/ai_council/shadow_dispatch.ts +1 -1
- package/src/scripts/ai_council/solo_dispatch.ts +1 -1
- package/src/scripts/analysis_freshness.ts +2 -2
- package/src/scripts/annotate_discovery.ts +2 -2
- package/src/scripts/apply_modules_config.ts +2 -2
- package/src/scripts/audit_adr_coverage.ts +3 -3
- package/src/scripts/audit_auto_rules.ts +2 -2
- package/src/scripts/audit_cloud_compatibility.ts +3 -3
- package/src/scripts/audit_command_surface.ts +2 -2
- package/src/scripts/audit_initial_context.ts +7 -6
- package/src/scripts/audit_likelihood.ts +5 -5
- package/src/scripts/audit_mcp_tools.ts +3 -3
- package/src/scripts/audit_overlap.ts +2 -2
- package/src/scripts/audit_skill_descriptions.ts +2 -2
- package/src/scripts/audit_skill_overlap.ts +5 -5
- package/src/scripts/audit_user_type_axis.ts +4 -4
- package/src/scripts/backfill_model_tier.ts +1 -1
- package/src/scripts/bench_ab_cache_dispatch.ts +2 -2
- package/src/scripts/bench_ab_clone.ts +2 -2
- package/src/scripts/bench_ab_diff.ts +3 -3
- package/src/scripts/bench_ab_integrity.ts +2 -2
- package/src/scripts/bench_ab_run.ts +4 -4
- package/src/scripts/bench_ab_task_runner.ts +1 -1
- package/src/scripts/bench_ab_tracka_run.ts +2 -2
- package/src/scripts/bench_ab_v2_run.ts +1 -1
- package/src/scripts/bench_ab_v2_stats.ts +2 -2
- package/src/scripts/bench_baseline_ready.ts +1 -1
- package/src/scripts/bench_condense_memory.ts +4 -4
- package/src/scripts/bench_drift_check.ts +3 -3
- package/src/scripts/bench_per_tool.ts +1 -1
- package/src/scripts/bench_rtk_savings.ts +4 -4
- package/src/scripts/bench_run.ts +4 -4
- package/src/scripts/bench_runner.ts +1 -1
- package/src/scripts/build_cloud_bundle.ts +3 -3
- package/src/scripts/build_discovery_manifest.ts +13 -15
- package/src/scripts/build_linear_digest.ts +2 -2
- package/src/scripts/build_mcp_registry_manifest.ts +3 -3
- package/src/scripts/build_proof.ts +6 -0
- package/src/scripts/build_rule_trigger_matrix.ts +2 -2
- package/src/scripts/capture_showcase_session.ts +3 -3
- package/src/scripts/chat_history.ts +1 -1
- package/src/scripts/check_always_budget.ts +1 -1
- package/src/scripts/check_artefact_checksums.ts +4 -4
- package/src/scripts/check_artefact_count_messaging.ts +197 -0
- package/src/scripts/check_augment_description_cap.ts +3 -3
- package/src/scripts/check_augmentignore.ts +1 -1
- package/src/scripts/check_beta_review_markers.ts +3 -3
- package/src/scripts/check_bite_sized_granularity.ts +1 -1
- package/src/scripts/check_cluster_patterns.ts +47 -3
- package/src/scripts/check_command_count_messaging.ts +2 -2
- package/src/scripts/check_condensation.ts +2 -2
- package/src/scripts/check_condensed_paths.ts +6 -6
- package/src/scripts/check_context_paths.ts +1 -1
- package/src/scripts/check_council_config_location.ts +3 -3
- package/src/scripts/check_council_layout.ts +2 -2
- package/src/scripts/check_council_references.ts +2 -2
- package/src/scripts/check_discovery_determinism.ts +3 -3
- package/src/scripts/check_gate_paths.ts +4 -4
- package/src/scripts/check_iron_law_prominence.ts +2 -2
- package/src/scripts/check_kernel_rule_bundle.ts +3 -3
- package/src/scripts/check_knowledge_cards.ts +4 -4
- package/src/scripts/check_knowledge_pages.ts +1 -1
- package/src/scripts/check_md_language.ts +3 -3
- package/src/scripts/check_memory.ts +3 -3
- package/src/scripts/check_memory_proposal.ts +2 -2
- package/src/scripts/check_module_management_neutral.ts +1 -1
- package/src/scripts/check_no_conflict_markers.ts +1 -1
- package/src/scripts/check_no_external_sources.ts +1 -1
- package/src/scripts/check_no_local_settings_committed.ts +2 -2
- package/src/scripts/check_no_new_legacy_path.ts +3 -3
- package/src/scripts/check_no_roadmap_refs.ts +3 -3
- package/src/scripts/check_one_off_location.ts +3 -3
- package/src/scripts/check_overlay_cascade_subdirs.ts +3 -3
- package/src/scripts/check_portability.ts +3 -3
- package/src/scripts/check_proposal.ts +0 -0
- package/src/scripts/check_public_catalog_links.ts +1 -1
- package/src/scripts/check_public_links.ts +2 -2
- package/src/scripts/check_references.ts +3 -3
- package/src/scripts/check_release_includes_discovery.ts +2 -2
- package/src/scripts/check_release_pr_shape.ts +2 -2
- package/src/scripts/check_release_published.ts +1 -1
- package/src/scripts/check_release_trunk_sync.ts +3 -3
- package/src/scripts/check_reply_consistency.ts +1 -1
- package/src/scripts/check_roadmap_trackable.ts +2 -2
- package/src/scripts/check_role_doc_links.ts +2 -2
- package/src/scripts/check_safety_floor_untouched.ts +3 -3
- package/src/scripts/check_skill_requires.ts +2 -2
- package/src/scripts/check_structural_breaking.ts +2 -2
- package/src/scripts/check_surface_tiers.ts +2 -2
- package/src/scripts/check_template_pin_drift.ts +1 -1
- package/src/scripts/check_test_coverage_diff.ts +2 -2
- package/src/scripts/check_token_optimizer_freshness.ts +3 -3
- package/src/scripts/check_trigger_evals.ts +2 -2
- package/src/scripts/check_update_banner.ts +1 -1
- package/src/scripts/ci_status.ts +0 -0
- package/src/scripts/ci_summary.ts +3 -3
- package/src/scripts/ci_time_ratio.ts +1 -1
- package/src/scripts/command_suggester/cooldown.ts +1 -1
- package/src/scripts/command_suggester/index.ts +1 -1
- package/src/scripts/command_suggester/loader.ts +1 -1
- package/src/scripts/command_suggester/match.ts +1 -1
- package/src/scripts/command_suggester/rank.ts +1 -1
- package/src/scripts/command_suggester/render.ts +1 -1
- package/src/scripts/command_suggester/sanitize.ts +1 -1
- package/src/scripts/command_suggester/settings.ts +1 -1
- package/src/scripts/command_suggester/types.ts +0 -0
- package/src/scripts/compile_router.ts +4 -4
- package/src/scripts/condense.ts +3 -3
- package/src/scripts/condense_memory.ts +1 -1
- package/src/scripts/config/index.ts +1 -1
- package/src/scripts/config/packs.ts +1 -1
- package/src/scripts/config/presets.ts +1 -1
- package/src/scripts/config/profile_explain.ts +1 -1
- package/src/scripts/config/profiles.ts +1 -1
- package/src/scripts/config/session_profiles.ts +1 -1
- package/src/scripts/context_hygiene_hook.ts +2 -2
- package/src/scripts/cost_by_conversation.ts +1 -1
- package/src/scripts/cost_summary.ts +2 -2
- package/src/scripts/council_cli.ts +1 -1
- package/src/scripts/council_prune.ts +1 -1
- package/src/scripts/cross_repo_retrieve.ts +2 -2
- package/src/scripts/discovery_stats.ts +3 -3
- package/src/scripts/evidence_report.ts +4 -4
- package/src/scripts/extract_audit_patterns.ts +2 -2
- package/src/scripts/first_run_gate_hook.ts +1 -1
- package/src/scripts/gen_discovery_baseline.ts +2 -2
- package/src/scripts/generate_capabilities_index.ts +2 -2
- package/src/scripts/generate_capability_matrix.ts +2 -2
- package/src/scripts/generate_catalog.ts +2 -2
- package/src/scripts/generate_command_flows.ts +2 -2
- package/src/scripts/generate_cookbook.ts +1 -1
- package/src/scripts/generate_index.ts +3 -3
- package/src/scripts/generate_ownership_matrix.ts +2 -2
- package/src/scripts/generate_pack_manifests.ts +2 -2
- package/src/scripts/generate_role_experiences_catalog.ts +3 -3
- package/src/scripts/hooks/block_no_verify.ts +2 -2
- package/src/scripts/hooks/dispatch_hook.ts +2 -2
- package/src/scripts/hooks/dispatch_issues.ts +1 -1
- package/src/scripts/hooks/envelope.ts +1 -1
- package/src/scripts/hooks/replay_hook.ts +1 -1
- package/src/scripts/hooks/state_io.ts +1 -1
- package/src/scripts/hooks_doctor.ts +1 -1
- package/src/scripts/hooks_status.ts +1 -1
- package/src/scripts/injection_scan_hook.ts +1 -1
- package/src/scripts/install.ts +145 -3
- package/src/scripts/inventory_abstraction_budget.ts +5 -5
- package/src/scripts/inventory_frontmatter.ts +1 -1
- package/src/scripts/inventory_meta_layers.ts +1 -1
- package/src/scripts/iron_law_sha.ts +1 -1
- package/src/scripts/knowledge_global_cli.ts +3 -3
- package/src/scripts/linked_projects_list.ts +1 -1
- package/src/scripts/lint_agent_security.ts +4 -4
- package/src/scripts/lint_agent_skill_names.ts +1 -1
- package/src/scripts/lint_agents_layout.ts +2 -2
- package/src/scripts/lint_agents_md.ts +3 -3
- package/src/scripts/lint_archived_skills.ts +2 -2
- package/src/scripts/lint_artefact_frontmatter.ts +2 -2
- package/src/scripts/lint_bench_ab.ts +2 -2
- package/src/scripts/lint_bench_corpus.ts +1 -1
- package/src/scripts/lint_command_flow_coverage.ts +1 -1
- package/src/scripts/lint_command_routing.ts +2 -2
- package/src/scripts/lint_command_tiers.ts +1 -1
- package/src/scripts/lint_command_verbs.ts +4 -4
- package/src/scripts/lint_commit_subjects.ts +2 -2
- package/src/scripts/lint_context_spine_usage.ts +3 -3
- package/src/scripts/lint_discovery_manifest.ts +4 -4
- package/src/scripts/lint_discovery_vocabulary.ts +2 -2
- package/src/scripts/lint_empty_roadmaps.ts +3 -3
- package/src/scripts/lint_eval_freshness.ts +2 -2
- package/src/scripts/lint_examples.ts +2 -2
- package/src/scripts/lint_explain_trace.ts +2 -2
- package/src/scripts/lint_featured_skills.ts +0 -0
- package/src/scripts/lint_flows.ts +5 -5
- package/src/scripts/lint_framework_leakage.ts +1 -1
- package/src/scripts/lint_framework_leakage_allowlist.json +10 -2
- package/src/scripts/lint_frontmatter_boilerplate.ts +2 -2
- package/src/scripts/lint_ghostwriter_source.ts +3 -3
- package/src/scripts/lint_global_paths.ts +1 -1
- package/src/scripts/lint_handoffs.ts +1 -1
- package/src/scripts/lint_hidden_unicode.ts +1 -1
- package/src/scripts/lint_hook_concern_budget.ts +2 -2
- package/src/scripts/lint_hook_manifest.ts +2 -2
- package/src/scripts/lint_instruction_smuggling.ts +1 -1
- package/src/scripts/lint_load_context.ts +2 -2
- package/src/scripts/lint_marketplace.ts +1 -1
- package/src/scripts/lint_marketplace_install_completeness.ts +2 -2
- package/src/scripts/lint_mcp_config_security.ts +1 -1
- package/src/scripts/lint_mcp_registry_manifest.ts +1 -1
- package/src/scripts/lint_media_policy_linkage.ts +3 -3
- package/src/scripts/lint_missions.ts +3 -3
- package/src/scripts/lint_model_tier_coverage.ts +3 -3
- package/src/scripts/lint_namespace.ts +2 -2
- package/src/scripts/lint_namespace_collisions.ts +2 -2
- package/src/scripts/lint_new_skill_gate.ts +3 -3
- package/src/scripts/lint_no_new_atomic_commands.ts +9 -6
- package/src/scripts/lint_no_python_twin_rationale.ts +102 -0
- package/src/scripts/lint_one_off_age.ts +2 -2
- package/src/scripts/lint_orchestration_dsl.ts +3 -3
- package/src/scripts/lint_orchestrator_auto_detect.ts +1 -1
- package/src/scripts/lint_pack_boundaries.ts +2 -2
- package/src/scripts/lint_pack_dependencies.ts +2 -2
- package/src/scripts/lint_pack_first_win.ts +2 -2
- package/src/scripts/lint_persona_governance.ts +3 -3
- package/src/scripts/lint_positioning.ts +1 -1
- package/src/scripts/lint_profile_overlay_set_only.ts +2 -2
- package/src/scripts/lint_readme_jargon.ts +2 -2
- package/src/scripts/lint_readme_size.ts +2 -2
- package/src/scripts/lint_regression.ts +3 -3
- package/src/scripts/lint_roadmap_ci_steps.ts +3 -3
- package/src/scripts/lint_roadmap_complexity.ts +1 -1
- package/src/scripts/lint_roadmap_later_disposition.ts +2 -2
- package/src/scripts/lint_role_experiences.ts +2 -2
- package/src/scripts/lint_rule_interactions.ts +1 -1
- package/src/scripts/lint_rule_tiers.ts +1 -1
- package/src/scripts/lint_showcase_sessions.ts +2 -2
- package/src/scripts/lint_skill_frontmatter_safety.ts +1 -1
- package/src/scripts/lint_skill_originality.ts +1 -1
- package/src/scripts/lint_skill_tools.ts +3 -3
- package/src/scripts/lint_ticket_buildable.ts +2 -2
- package/src/scripts/lint_topics_yaml.ts +3 -3
- package/src/scripts/lint_trust_coherence.ts +3 -3
- package/src/scripts/lint_value_dashboard.ts +3 -3
- package/src/scripts/lint_workflow_security.ts +3 -3
- package/src/scripts/lint_workspace_boundary.ts +2 -2
- package/src/scripts/mcp_parity_smoke.ts +1 -1
- package/src/scripts/mcp_render.ts +1 -1
- package/src/scripts/mcp_server/catalog.ts +1 -1
- package/src/scripts/mcp_server/index.ts +1 -1
- package/src/scripts/mcp_server/metadata.ts +1 -1
- package/src/scripts/mcp_server/prompts.ts +1 -1
- package/src/scripts/mcp_server/resources.ts +1 -1
- package/src/scripts/mcp_server/server.ts +1 -1
- package/src/scripts/mcp_server/telemetry.ts +1 -1
- package/src/scripts/mcp_server/tools.ts +1 -1
- package/src/scripts/mcp_telemetry_health.ts +1 -1
- package/src/scripts/mcp_telemetry_query.ts +3 -3
- package/src/scripts/mcp_telemetry_store.ts +3 -3
- package/src/scripts/measure_augment_budget.ts +2 -2
- package/src/scripts/measure_density.ts +2 -2
- package/src/scripts/measure_frugality_savings.ts +3 -3
- package/src/scripts/measure_markitdown_lift.ts +1 -1
- package/src/scripts/measure_patterns.ts +1 -1
- package/src/scripts/measure_projection_bytes.ts +1 -1
- package/src/scripts/measure_rule_budget.ts +1 -1
- package/src/scripts/measure_skill_reduction.ts +1 -1
- package/src/scripts/memory_hash.ts +1 -1
- package/src/scripts/memory_lookup.ts +6 -6
- package/src/scripts/memory_report.ts +1 -1
- package/src/scripts/memory_signal.ts +1 -1
- package/src/scripts/memory_status.ts +2 -2
- package/src/scripts/migrate_command_suggestions.ts +1 -1
- package/src/scripts/migrate_frontmatter_defaults.ts +1 -1
- package/src/scripts/mine_session.ts +3 -3
- package/src/scripts/minimal_safe_diff_hook.ts +2 -2
- package/src/scripts/move_artefact.ts +3 -3
- package/src/scripts/new_skill.ts +3 -3
- package/src/scripts/onboarding_gate_hook.ts +2 -2
- package/src/scripts/pack_mcp_content.ts +1 -1
- package/src/scripts/parity/replay.ts +3 -2
- package/src/scripts/pattern_share.ts +2 -2
- package/src/scripts/plan_physical_move.ts +3 -3
- package/src/scripts/prediction-pool/poisson_sim.ts +2 -2
- package/src/scripts/prediction-pool/pool_winsim.ts +2 -2
- package/src/scripts/prediction-pool/score_ev.ts +2 -2
- package/src/scripts/prepack-check.mjs +108 -5
- package/src/scripts/print_required_checks.ts +2 -2
- package/src/scripts/probe_projection_fidelity.ts +2 -2
- package/src/scripts/probe_skill_registration.ts +2 -2
- package/src/scripts/profile_staleness_hook.ts +2 -2
- package/src/scripts/profile_use.ts +2 -2
- package/src/scripts/project_thin_rules.ts +3 -3
- package/src/scripts/propose_modules_config.ts +2 -2
- package/src/scripts/prototype_lint_contradictions.ts +2 -2
- package/src/scripts/prove_pack_extractable.ts +1 -1
- package/src/scripts/readme_linter.ts +4 -4
- package/src/scripts/redact_hook_capture.ts +2 -2
- package/src/scripts/refine_ticket_detect.ts +1 -1
- package/src/scripts/release.ts +30 -19
- package/src/scripts/render_benchmark_md.ts +2 -2
- package/src/scripts/render_value_md.ts +2 -2
- package/src/scripts/roadmap_progress_hook.ts +1 -1
- package/src/scripts/router_telemetry.ts +1 -1
- package/src/scripts/run_skill_evals.ts +2 -2
- package/src/scripts/runtime_dispatcher.ts +1 -1
- package/src/scripts/runtime_handler.ts +1 -1
- package/src/scripts/runtime_registry.ts +3 -3
- package/src/scripts/score_skill_selection.ts +1 -1
- package/src/scripts/security_audit_config.ts +2 -2
- package/src/scripts/skill_collision_clusters.ts +1 -1
- package/src/scripts/skill_discovery.ts +1 -1
- package/src/scripts/skill_linter.ts +8 -7
- package/src/scripts/skill_overlap.ts +2 -2
- package/src/scripts/skill_preview.ts +1 -1
- package/src/scripts/skill_tools/audit_persona_coverage.ts +3 -3
- package/src/scripts/skill_tools/audit_user_type_coverage.ts +3 -3
- package/src/scripts/skill_tools/index.ts +1 -1
- package/src/scripts/skill_tools/run_block_d_eval.ts +3 -3
- package/src/scripts/skill_tools/score_skill_relevance.ts +3 -3
- package/src/scripts/skill_tools/suggest_skill_for_task.ts +3 -3
- package/src/scripts/skill_trigger_eval.ts +2 -2
- package/src/scripts/skill_usage_collect.ts +2 -2
- package/src/scripts/skill_usage_report.ts +2 -2
- package/src/scripts/smoke_path_resolution.ts +2 -2
- package/src/scripts/smoke_quickstart.ts +4 -4
- package/src/scripts/snapshot_agent_outputs.ts +2 -2
- package/src/scripts/spotcheck_thin_root.ts +2 -2
- package/src/scripts/surface-tiers.yml +1 -0
- package/src/scripts/sync_agent_settings.ts +2 -2
- package/src/scripts/sync_github_metadata.ts +4 -4
- package/src/scripts/sync_gitignore.ts +3 -3
- package/src/scripts/sync_yaml_rt.ts +2 -2
- package/src/scripts/telegraph_stats.ts +1 -1
- package/src/scripts/tool_registry.ts +2 -2
- package/src/scripts/tools/adapter_errors.ts +1 -1
- package/src/scripts/tools/base_adapter.ts +1 -1
- package/src/scripts/tools/github_adapter.ts +1 -1
- package/src/scripts/tools/jira_adapter.ts +1 -1
- package/src/scripts/trigger_coverage.ts +2 -2
- package/src/scripts/update_counts.ts +68 -6
- package/src/scripts/update_prices.ts +3 -3
- package/src/scripts/validate_agent_settings.ts +3 -3
- package/src/scripts/validate_decision_engine.ts +2 -2
- package/src/scripts/validate_discovery_manifest.ts +3 -3
- package/src/scripts/validate_frontmatter.ts +5 -5
- package/src/scripts/validate_pack_yaml.ts +0 -0
- package/src/scripts/validate_safe_paths.ts +2 -2
- package/src/scripts/validate_telegraph_carveouts.ts +3 -3
- package/src/scripts/verify_before_complete_hook.ts +2 -2
- package/src/scripts/verify_physical_move.ts +2 -2
- package/src/scripts/wrapper_freshness_hook.ts +3 -3
- package/src/server/schemas/settings.ts +426 -0
- package/src/shared/settingsSurface.ts +184 -0
- package/src/shared/userMd/formAdapter.ts +86 -0
- package/src/shared/userMd/schema.ts +59 -0
- package/src/shared/userMd/utils.ts +91 -0
- package/dist/agent-src/commands/optimize-project.md +0 -243
- package/dist/ui/assets/index-BbWWuFrF.css +0 -1
- package/dist/ui/assets/index-UjcTG_9O.js +0 -40
- package/dist/ui/assets/index-UjcTG_9O.js.map +0 -1
|
@@ -0,0 +1,515 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Linear step dispatcher for `/implement-ticket`.
|
|
3
|
+
*
|
|
4
|
+
* TypeScript twin of `work_engine/dispatcher.py` (ADR-200 py2ts Phase 1 —
|
|
5
|
+
* work_engine TOP/integration layer). Public API names stay snake_case to
|
|
6
|
+
* mirror the Python module 1:1 (per ADR-200 — Python style is part of the
|
|
7
|
+
* contract).
|
|
8
|
+
*
|
|
9
|
+
* The dispatcher holds no business logic. It walks the fixed eight-step order
|
|
10
|
+
* declared in `docs/contracts/implement-ticket-flow.md`, hands each step a live
|
|
11
|
+
* `DeliveryState`, and honours the three terminal outcomes:
|
|
12
|
+
*
|
|
13
|
+
* - `SUCCESS` — record and advance.
|
|
14
|
+
* - `BLOCKED` — record, copy questions onto the state, halt.
|
|
15
|
+
* - `PARTIAL` — record, copy questions onto the state, halt.
|
|
16
|
+
*
|
|
17
|
+
* Resumption semantics (Option A, flow contract §agent-directives): steps whose
|
|
18
|
+
* name is already marked `success` in `state.outcomes` are **skipped**. This
|
|
19
|
+
* lets a caller re-invoke the dispatcher after executing an agent-directive,
|
|
20
|
+
* update the relevant slice of `DeliveryState`, record `success` on the resumed
|
|
21
|
+
* step, and continue without replaying earlier work.
|
|
22
|
+
*
|
|
23
|
+
* Step handlers are injected by the caller rather than discovered at import
|
|
24
|
+
* time, so the dispatcher is trivially testable and never depends on handler
|
|
25
|
+
* import order.
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
import type {
|
|
29
|
+
DeliveryState,
|
|
30
|
+
StepResult} from './delivery_state.js';
|
|
31
|
+
import {
|
|
32
|
+
Outcome,
|
|
33
|
+
type Step
|
|
34
|
+
} from './delivery_state.js';
|
|
35
|
+
import type { HookHalt} from './hooks/index.js';
|
|
36
|
+
import { HookContext, HookEvent, HookRunner } from './hooks/index.js';
|
|
37
|
+
import { KNOWN_DIRECTIVE_SETS } from './state.js';
|
|
38
|
+
|
|
39
|
+
// Static directive-set registry. The Python source uses `import_module` to load
|
|
40
|
+
// `work_engine.directives.<pkg>` dynamically; a `.ts` twin may not import a
|
|
41
|
+
// `.py` and resolves statically instead (ADR-200). The map is keyed by the
|
|
42
|
+
// *wire* name (the `_PACKAGE_NAME_OVERRIDES` translation is folded into the
|
|
43
|
+
// keys here, e.g. `ui-trivial` → the `ui_trivial` module).
|
|
44
|
+
import * as _backend from './directives/backend/index.js';
|
|
45
|
+
import * as _mixed from './directives/mixed/index.js';
|
|
46
|
+
import * as _ui from './directives/ui/index.js';
|
|
47
|
+
import * as _ui_trivial from './directives/ui_trivial/index.js';
|
|
48
|
+
|
|
49
|
+
/** Shape every directive-set index module exposes. */
|
|
50
|
+
interface DirectiveSetModule {
|
|
51
|
+
get_steps?: () => Map<string, Step>;
|
|
52
|
+
SUPPORTED_KINDS?: ReadonlyArray<string>;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Shared empty-registry runner reused when `dispatch` is called without an
|
|
57
|
+
* explicit `hooks` argument. `HookRunner.emit` short-circuits when no callbacks
|
|
58
|
+
* are registered, so the hot path stays branch-light while the call sites stay
|
|
59
|
+
* uniform.
|
|
60
|
+
*/
|
|
61
|
+
const _NOOP_RUNNER: HookRunner = new HookRunner();
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Canonical execution order. Eight steps, fixed, no branching.
|
|
65
|
+
*
|
|
66
|
+
* Changing this order is a roadmap-level decision — not a PR rider — per the
|
|
67
|
+
* surface-growth guardrails in `agents/roadmaps/road-to-implement-ticket.md`.
|
|
68
|
+
*/
|
|
69
|
+
export const STEP_ORDER: ReadonlyArray<string> = [
|
|
70
|
+
'refine',
|
|
71
|
+
'memory',
|
|
72
|
+
'analyze',
|
|
73
|
+
'plan',
|
|
74
|
+
'implement',
|
|
75
|
+
'test',
|
|
76
|
+
'verify',
|
|
77
|
+
'report',
|
|
78
|
+
];
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Directive set chosen when `state` does not carry one explicitly.
|
|
82
|
+
*
|
|
83
|
+
* Backwards compatibility for v0 `DeliveryState` callers: the legacy shape has
|
|
84
|
+
* no `directive_set` field, so `select_directive_set` falls back to `"backend"`
|
|
85
|
+
* and the engine behaves exactly as it did before R1 Phase 4.
|
|
86
|
+
*/
|
|
87
|
+
export const DEFAULT_DIRECTIVE_SET = 'backend';
|
|
88
|
+
|
|
89
|
+
// Schema enum names use hyphens (`ui-trivial`) but Python packages cannot. The
|
|
90
|
+
// loader is the single place that bridges between the two forms; everywhere
|
|
91
|
+
// else uses the wire form. (Folded into `_DIRECTIVE_SET_MODULES` keys here.)
|
|
92
|
+
const _PACKAGE_NAME_OVERRIDES: Record<string, string> = { 'ui-trivial': 'ui_trivial' };
|
|
93
|
+
|
|
94
|
+
/** Wire-name → static directive-set module. */
|
|
95
|
+
const _DIRECTIVE_SET_MODULES: Record<string, DirectiveSetModule> = {
|
|
96
|
+
backend: _backend,
|
|
97
|
+
ui: _ui,
|
|
98
|
+
'ui-trivial': _ui_trivial,
|
|
99
|
+
mixed: _mixed,
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Run the eight steps linearly against `state`.
|
|
104
|
+
*
|
|
105
|
+
* Returns a `[final_outcome, halting_step]` tuple. `halting_step` is `null`
|
|
106
|
+
* when every step succeeded; otherwise it carries the name of the step whose
|
|
107
|
+
* result halted the flow.
|
|
108
|
+
*
|
|
109
|
+
* `state` is mutated in place: each step's outcome is recorded in
|
|
110
|
+
* `state.outcomes` under the step name, and any surfaced questions land on
|
|
111
|
+
* `state.questions`.
|
|
112
|
+
*
|
|
113
|
+
* `steps` maps step name to handler. Every entry in {@link STEP_ORDER} must be
|
|
114
|
+
* present; missing entries throw (mirroring Python `KeyError`) at dispatch time
|
|
115
|
+
* rather than silently skipping, so incomplete wiring surfaces as a hard
|
|
116
|
+
* failure.
|
|
117
|
+
*
|
|
118
|
+
* `hooks` is an optional {@link HookRunner}. `null` preserves every existing
|
|
119
|
+
* call site verbatim — internally `dispatch` falls back to a shared
|
|
120
|
+
* empty-registry runner so hook bookkeeping stays uniform without a per-emit
|
|
121
|
+
* `if hooks is null` branch.
|
|
122
|
+
*
|
|
123
|
+
* @throws KeyError-equivalent If `steps` does not cover every entry in
|
|
124
|
+
* {@link STEP_ORDER}.
|
|
125
|
+
*/
|
|
126
|
+
export function dispatch(
|
|
127
|
+
state: DeliveryState,
|
|
128
|
+
steps: Map<string, Step>,
|
|
129
|
+
hooks: HookRunner | null = null,
|
|
130
|
+
): [Outcome, string | null] {
|
|
131
|
+
_assert_all_steps_present(steps);
|
|
132
|
+
|
|
133
|
+
// Clear stale questions from a previous halt before we resume so the caller
|
|
134
|
+
// never mistakes old options for fresh ones.
|
|
135
|
+
state.questions = [];
|
|
136
|
+
|
|
137
|
+
const runner = hooks !== null ? hooks : _NOOP_RUNNER;
|
|
138
|
+
|
|
139
|
+
for (const name of STEP_ORDER) {
|
|
140
|
+
if (_get(state.outcomes, name) === Outcome.SUCCESS) {
|
|
141
|
+
// Already completed on an earlier invocation — skip per the resume
|
|
142
|
+
// contract. The caller is responsible for keeping `state.outcomes`
|
|
143
|
+
// and the matching slice in sync.
|
|
144
|
+
continue;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
const before_halt = runner.emit(
|
|
148
|
+
HookEvent.BEFORE_STEP,
|
|
149
|
+
new HookContext({ step_name: name, delivery: state }),
|
|
150
|
+
);
|
|
151
|
+
if (before_halt !== null) {
|
|
152
|
+
return _hook_halt_blocked(state, runner, name, before_halt, null);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
const handler = _stepLookup(steps, name);
|
|
156
|
+
let result: StepResult;
|
|
157
|
+
try {
|
|
158
|
+
result = handler(state);
|
|
159
|
+
} catch (exc) {
|
|
160
|
+
// Let dispatcher-layer observers see the failure before the
|
|
161
|
+
// exception unwinds the engine. `on_error` is observe-only; the
|
|
162
|
+
// original exception is always re-raised.
|
|
163
|
+
runner.emit(
|
|
164
|
+
HookEvent.ON_ERROR,
|
|
165
|
+
new HookContext({ step_name: name, delivery: state, exception: exc }),
|
|
166
|
+
);
|
|
167
|
+
throw exc;
|
|
168
|
+
}
|
|
169
|
+
_validate_step_result(name, result);
|
|
170
|
+
|
|
171
|
+
state.outcomes[name] = result.outcome;
|
|
172
|
+
|
|
173
|
+
const after_halt = runner.emit(
|
|
174
|
+
HookEvent.AFTER_STEP,
|
|
175
|
+
new HookContext({ step_name: name, delivery: state, result }),
|
|
176
|
+
);
|
|
177
|
+
if (after_halt !== null) {
|
|
178
|
+
return _hook_halt_blocked(state, runner, name, after_halt, result);
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
if (result.outcome === Outcome.BLOCKED) {
|
|
182
|
+
state.questions = [...result.questions];
|
|
183
|
+
_emit_on_halt(runner, name, state, result);
|
|
184
|
+
return [Outcome.BLOCKED, name];
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
if (result.outcome === Outcome.PARTIAL) {
|
|
188
|
+
state.questions = [...result.questions];
|
|
189
|
+
_emit_on_halt(runner, name, state, result);
|
|
190
|
+
return [Outcome.PARTIAL, name];
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
return [Outcome.SUCCESS, null];
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* Translate a hook-driven {@link HookHalt} into a clean engine halt.
|
|
199
|
+
*
|
|
200
|
+
* Hook-driven halts are treated as first-class engine halts per the P2
|
|
201
|
+
* contract: the dispatcher returns `[BLOCKED, step_name]` with `state.questions`
|
|
202
|
+
* rendered verbatim from the halt's `surface`. The step's outcome marker is set
|
|
203
|
+
* to `"blocked"` only when the halt fires before the handler ran (so resume
|
|
204
|
+
* re-enters the gate); when it fires after the handler, the marker the handler
|
|
205
|
+
* produced is preserved so resume reflects what actually happened.
|
|
206
|
+
*/
|
|
207
|
+
function _hook_halt_blocked(
|
|
208
|
+
state: DeliveryState,
|
|
209
|
+
runner: HookRunner,
|
|
210
|
+
name: string,
|
|
211
|
+
halt: HookHalt,
|
|
212
|
+
result: StepResult | null,
|
|
213
|
+
): [Outcome, string | null] {
|
|
214
|
+
if (result === null) {
|
|
215
|
+
state.outcomes[name] = Outcome.BLOCKED;
|
|
216
|
+
}
|
|
217
|
+
state.questions = [...halt.surface];
|
|
218
|
+
_emit_on_halt(runner, name, state, result);
|
|
219
|
+
return [Outcome.BLOCKED, name];
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* Fire `on_halt` as an observe-only event.
|
|
224
|
+
*
|
|
225
|
+
* A {@link HookHalt} raised from inside `on_halt` would create a halt-of-a-halt
|
|
226
|
+
* loop; the runner returns it but the dispatcher deliberately ignores it — the
|
|
227
|
+
* halt surface is already populated.
|
|
228
|
+
*/
|
|
229
|
+
function _emit_on_halt(
|
|
230
|
+
runner: HookRunner,
|
|
231
|
+
name: string,
|
|
232
|
+
state: DeliveryState,
|
|
233
|
+
result: StepResult | null,
|
|
234
|
+
): void {
|
|
235
|
+
runner.emit(
|
|
236
|
+
HookEvent.ON_HALT,
|
|
237
|
+
new HookContext({ step_name: name, delivery: state, result }),
|
|
238
|
+
);
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
/**
|
|
242
|
+
* Reject an incomplete step mapping up front.
|
|
243
|
+
*
|
|
244
|
+
* We deliberately fail loudly here: a missing step would otherwise raise deep
|
|
245
|
+
* inside the dispatch loop after partial state mutation, which makes debugging
|
|
246
|
+
* the wiring harder than it needs to be.
|
|
247
|
+
*/
|
|
248
|
+
function _assert_all_steps_present(steps: Map<string, Step>): void {
|
|
249
|
+
const missing = STEP_ORDER.filter((name) => !steps.has(name));
|
|
250
|
+
if (missing.length > 0) {
|
|
251
|
+
throw new KeyError('Step mapping is missing handlers for: ' + missing.join(', '));
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
/**
|
|
256
|
+
* Enforce the blocked/partial invariant: questions must be set.
|
|
257
|
+
*
|
|
258
|
+
* A step that blocks without surfacing a question is a bug — there is nothing
|
|
259
|
+
* for the user to answer. We throw `ValueError` instead of silently recording
|
|
260
|
+
* the outcome so the defect is visible at the earliest possible point.
|
|
261
|
+
*/
|
|
262
|
+
function _validate_step_result(name: string, result: StepResult): void {
|
|
263
|
+
if (
|
|
264
|
+
(result.outcome === Outcome.BLOCKED || result.outcome === Outcome.PARTIAL) &&
|
|
265
|
+
result.questions.length === 0
|
|
266
|
+
) {
|
|
267
|
+
throw new ValueError(
|
|
268
|
+
`Step ${_pyRepr(name)} returned ${result.outcome} with no questions; ` +
|
|
269
|
+
'blocked and partial outcomes must surface at least one numbered option.',
|
|
270
|
+
);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
/**
|
|
275
|
+
* Return the directive set name to dispatch `state` against.
|
|
276
|
+
*
|
|
277
|
+
* Looks for `state.directive_set` (the v1 `work_engine.state.WorkState` field)
|
|
278
|
+
* and falls back to {@link DEFAULT_DIRECTIVE_SET} when the attribute is missing
|
|
279
|
+
* — the legacy v0 `DeliveryState` has no such field.
|
|
280
|
+
*
|
|
281
|
+
* The returned name is validated against {@link KNOWN_DIRECTIVE_SETS}; an
|
|
282
|
+
* unknown value throws `ValueError` rather than silently falling back, so a typo
|
|
283
|
+
* in a hand-written state file fails loudly.
|
|
284
|
+
*/
|
|
285
|
+
export function select_directive_set(state: unknown): string {
|
|
286
|
+
const name = _getattr(state, 'directive_set', DEFAULT_DIRECTIVE_SET);
|
|
287
|
+
if (typeof name !== 'string' || name.length === 0) {
|
|
288
|
+
throw new ValueError(
|
|
289
|
+
`directive_set must be a non-empty string; got ${_pyRepr(name)}`,
|
|
290
|
+
);
|
|
291
|
+
}
|
|
292
|
+
if (!KNOWN_DIRECTIVE_SETS.has(name)) {
|
|
293
|
+
throw new ValueError(
|
|
294
|
+
`unknown directive_set ${_pyRepr(name)}; ` +
|
|
295
|
+
`known sets: ${_pyReprList(_sortedStr([...KNOWN_DIRECTIVE_SETS]))}`,
|
|
296
|
+
);
|
|
297
|
+
}
|
|
298
|
+
return name;
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
/**
|
|
302
|
+
* Resolve the `directives.<name>` package and return its step mapping.
|
|
303
|
+
*
|
|
304
|
+
* The selected set's index module exposes a `get_steps()` factory that returns
|
|
305
|
+
* the `{step_name: handler}` mapping the dispatcher walks. The schema enum
|
|
306
|
+
* carries hyphenated wire names (`ui-trivial`) but Python packages must use
|
|
307
|
+
* underscores; {@link _PACKAGE_NAME_OVERRIDES} is the single translation point
|
|
308
|
+
* (folded into the static module registry here).
|
|
309
|
+
*/
|
|
310
|
+
export function load_directive_set(name: string): Map<string, Step> {
|
|
311
|
+
const moduleEntry = _import_directive_set(name);
|
|
312
|
+
const get_steps = moduleEntry.module.get_steps;
|
|
313
|
+
if (typeof get_steps !== 'function') {
|
|
314
|
+
throw new AttributeError(
|
|
315
|
+
`work_engine.directives.${moduleEntry.leaf} ` +
|
|
316
|
+
'does not expose a callable get_steps()',
|
|
317
|
+
);
|
|
318
|
+
}
|
|
319
|
+
const steps = get_steps();
|
|
320
|
+
if (!(steps instanceof Map)) {
|
|
321
|
+
throw new TypeError_(
|
|
322
|
+
`work_engine.directives.${moduleEntry.leaf}` +
|
|
323
|
+
`.get_steps() must return a Mapping; ` +
|
|
324
|
+
`got ${_pyTypeName(steps)}`,
|
|
325
|
+
);
|
|
326
|
+
}
|
|
327
|
+
return steps;
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
/**
|
|
331
|
+
* Throw `NotImplementedError` if `set_name` cannot handle `kind`.
|
|
332
|
+
*
|
|
333
|
+
* Reads the per-set `SUPPORTED_KINDS` tuple and checks membership. Distinct from
|
|
334
|
+
* {@link select_directive_set}, which only validates the directive-set *name*:
|
|
335
|
+
* this gate validates the name/kind *pair*.
|
|
336
|
+
*
|
|
337
|
+
* Sets that have no `SUPPORTED_KINDS` attribute are treated as "supports
|
|
338
|
+
* nothing".
|
|
339
|
+
*/
|
|
340
|
+
export function assert_kind_supported(kind: string, set_name: string): void {
|
|
341
|
+
const moduleEntry = _import_directive_set(set_name);
|
|
342
|
+
const supported = moduleEntry.module.SUPPORTED_KINDS ?? [];
|
|
343
|
+
if (!supported.includes(kind)) {
|
|
344
|
+
throw new NotImplementedError(
|
|
345
|
+
`directive_set ${_pyRepr(set_name)} does not handle ` +
|
|
346
|
+
`input.kind=${_pyRepr(kind)}; supported kinds: ` +
|
|
347
|
+
`${_pyReprList(_sortedStr(_dedup([...supported])))}`,
|
|
348
|
+
);
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
/** Validate `name` and resolve the matching static package module. */
|
|
353
|
+
function _import_directive_set(name: string): { module: DirectiveSetModule; leaf: string } {
|
|
354
|
+
if (!KNOWN_DIRECTIVE_SETS.has(name)) {
|
|
355
|
+
throw new ValueError(
|
|
356
|
+
`unknown directive_set ${_pyRepr(name)}; ` +
|
|
357
|
+
`known sets: ${_pyReprList(_sortedStr([...KNOWN_DIRECTIVE_SETS]))}`,
|
|
358
|
+
);
|
|
359
|
+
}
|
|
360
|
+
const leaf = _PACKAGE_NAME_OVERRIDES[name] ?? name;
|
|
361
|
+
const module = _DIRECTIVE_SET_MODULES[name];
|
|
362
|
+
if (module === undefined) {
|
|
363
|
+
// A name in KNOWN_DIRECTIVE_SETS with no registered module would mean
|
|
364
|
+
// the static registry drifted from the schema enum — surface it loudly,
|
|
365
|
+
// mirroring Python's ImportError from a missing package.
|
|
366
|
+
throw new ModuleNotFoundError(
|
|
367
|
+
`No module named 'work_engine.directives.${leaf}'`,
|
|
368
|
+
);
|
|
369
|
+
}
|
|
370
|
+
return { module, leaf };
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
// ── Python-parity helpers ────────────────────────────────────────────────
|
|
374
|
+
|
|
375
|
+
/** `Map.get` with a key-membership guard mirroring `dict.get`. */
|
|
376
|
+
function _get(obj: Record<string, string>, key: string): string | undefined {
|
|
377
|
+
return key in obj ? obj[key] : undefined;
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
/** Look up a step handler, throwing the KeyError shape on a miss. */
|
|
381
|
+
function _stepLookup(steps: Map<string, Step>, name: string): Step {
|
|
382
|
+
const handler = steps.get(name);
|
|
383
|
+
if (handler === undefined) {
|
|
384
|
+
throw new KeyError(_pyRepr(name));
|
|
385
|
+
}
|
|
386
|
+
return handler;
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
/** Python `getattr(obj, attr, default)` for plain object attribute access. */
|
|
390
|
+
function _getattr(obj: unknown, attr: string, dflt: unknown): unknown {
|
|
391
|
+
if (obj !== null && typeof obj === 'object' && attr in (obj as Record<string, unknown>)) {
|
|
392
|
+
const v = (obj as Record<string, unknown>)[attr];
|
|
393
|
+
return v === undefined ? dflt : v;
|
|
394
|
+
}
|
|
395
|
+
return dflt;
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
/** Python `repr(x)` for the scalar shapes interpolated via `{value!r}`. */
|
|
399
|
+
function _pyRepr(value: unknown): string {
|
|
400
|
+
if (value === null || value === undefined) {
|
|
401
|
+
return 'None';
|
|
402
|
+
}
|
|
403
|
+
if (value === true) {
|
|
404
|
+
return 'True';
|
|
405
|
+
}
|
|
406
|
+
if (value === false) {
|
|
407
|
+
return 'False';
|
|
408
|
+
}
|
|
409
|
+
if (typeof value === 'string') {
|
|
410
|
+
return `'${value.replace(/\\/g, '\\\\').replace(/'/g, "\\'")}'`;
|
|
411
|
+
}
|
|
412
|
+
return String(value);
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
/** Python `repr(list_of_str)` — `['a', 'b']`. */
|
|
416
|
+
function _pyReprList(values: string[]): string {
|
|
417
|
+
return '[' + values.map((v) => _pyRepr(v)).join(', ') + ']';
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
/** Python `sorted(list_of_str)` — code-point ascending. */
|
|
421
|
+
function _sortedStr(values: string[]): string[] {
|
|
422
|
+
return [...values].sort((a, b) => (a < b ? -1 : a > b ? 1 : 0));
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
/** Python `set(...)` dedup (insertion order does not matter; sorted after). */
|
|
426
|
+
function _dedup(values: string[]): string[] {
|
|
427
|
+
return [...new Set(values)];
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
/** Python `type(x).__name__` for the shapes the error messages emit. */
|
|
431
|
+
function _pyTypeName(value: unknown): string {
|
|
432
|
+
if (value === null || value === undefined) {
|
|
433
|
+
return 'NoneType';
|
|
434
|
+
}
|
|
435
|
+
if (Array.isArray(value)) {
|
|
436
|
+
return 'list';
|
|
437
|
+
}
|
|
438
|
+
if (value instanceof Map) {
|
|
439
|
+
// A Map is the TS stand-in for the Python `dict` get_steps returns; the
|
|
440
|
+
// only non-Map path here is the guard, so report `dict`.
|
|
441
|
+
return 'dict';
|
|
442
|
+
}
|
|
443
|
+
switch (typeof value) {
|
|
444
|
+
case 'string':
|
|
445
|
+
return 'str';
|
|
446
|
+
case 'boolean':
|
|
447
|
+
return 'bool';
|
|
448
|
+
case 'number':
|
|
449
|
+
return Number.isInteger(value) ? 'int' : 'float';
|
|
450
|
+
case 'object':
|
|
451
|
+
return 'dict';
|
|
452
|
+
default:
|
|
453
|
+
return typeof value;
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
// ── Python-exception name parity ─────────────────────────────────────────
|
|
458
|
+
// The dispatcher raises KeyError / ValueError / TypeError / AttributeError /
|
|
459
|
+
// NotImplementedError / ImportError-family. JS only has a handful of builtins,
|
|
460
|
+
// so these named subclasses carry the Python exception *name* for callers that
|
|
461
|
+
// branch on it (cli.ts catches ValueError + NotImplementedError equivalents).
|
|
462
|
+
|
|
463
|
+
/** Python `KeyError`. */
|
|
464
|
+
export class KeyError extends Error {
|
|
465
|
+
constructor(message?: string) {
|
|
466
|
+
super(message);
|
|
467
|
+
Object.setPrototypeOf(this, KeyError.prototype);
|
|
468
|
+
this.name = 'KeyError';
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
/** Python `ValueError`. */
|
|
473
|
+
export class ValueError extends Error {
|
|
474
|
+
constructor(message?: string) {
|
|
475
|
+
super(message);
|
|
476
|
+
Object.setPrototypeOf(this, ValueError.prototype);
|
|
477
|
+
this.name = 'ValueError';
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
/** Python `TypeError` (named `TypeError_` to avoid the JS builtin clash). */
|
|
482
|
+
export class TypeError_ extends Error {
|
|
483
|
+
constructor(message?: string) {
|
|
484
|
+
super(message);
|
|
485
|
+
Object.setPrototypeOf(this, TypeError_.prototype);
|
|
486
|
+
this.name = 'TypeError';
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
/** Python `AttributeError`. */
|
|
491
|
+
export class AttributeError extends Error {
|
|
492
|
+
constructor(message?: string) {
|
|
493
|
+
super(message);
|
|
494
|
+
Object.setPrototypeOf(this, AttributeError.prototype);
|
|
495
|
+
this.name = 'AttributeError';
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
/** Python `NotImplementedError`. */
|
|
500
|
+
export class NotImplementedError extends Error {
|
|
501
|
+
constructor(message?: string) {
|
|
502
|
+
super(message);
|
|
503
|
+
Object.setPrototypeOf(this, NotImplementedError.prototype);
|
|
504
|
+
this.name = 'NotImplementedError';
|
|
505
|
+
}
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
/** Python `ModuleNotFoundError` (subclass of ImportError). */
|
|
509
|
+
export class ModuleNotFoundError extends Error {
|
|
510
|
+
constructor(message?: string) {
|
|
511
|
+
super(message);
|
|
512
|
+
Object.setPrototypeOf(this, ModuleNotFoundError.prototype);
|
|
513
|
+
this.name = 'ModuleNotFoundError';
|
|
514
|
+
}
|
|
515
|
+
}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stdout / stderr emitters for the CLI entry point.
|
|
3
|
+
*
|
|
4
|
+
* TypeScript twin of `work_engine/emitters.py` (ADR-200 py2ts Phase 1 —
|
|
5
|
+
* work_engine TOP/integration layer). Public API names stay snake_case to
|
|
6
|
+
* mirror the Python module 1:1 (per ADR-200 — Python style is part of the
|
|
7
|
+
* contract).
|
|
8
|
+
*
|
|
9
|
+
* Extracted from `cli.py` in P2.3 of `road-to-post-pr29-optimize.md`. Holds
|
|
10
|
+
* the two output helpers that shape the wire surface of `main()`: the
|
|
11
|
+
* SUCCESS/halt branch printed on stdout, and the lifecycle-hook halt surface
|
|
12
|
+
* printed on stderr.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import * as fs from 'node:fs';
|
|
16
|
+
|
|
17
|
+
import { Outcome } from './delivery_state.js';
|
|
18
|
+
import type { HookHalt } from './hooks/index.js';
|
|
19
|
+
import type { WorkState} from './state.js';
|
|
20
|
+
import { dump } from './state.js';
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Print the terminal surface for `final` to stdout.
|
|
24
|
+
*
|
|
25
|
+
* On SUCCESS, the delivery report. Otherwise a `[halt]` status line plus the
|
|
26
|
+
* surfaced questions verbatim.
|
|
27
|
+
*/
|
|
28
|
+
export function _emit(work: WorkState, final: Outcome, halting: string | null): void {
|
|
29
|
+
if (final === Outcome.SUCCESS) {
|
|
30
|
+
process.stdout.write(work.report + '\n');
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
process.stdout.write(`[halt] outcome=${final} step=${halting || '(none)'}\n`);
|
|
34
|
+
for (const line of work.questions) {
|
|
35
|
+
process.stdout.write(line + '\n');
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Render a {@link HookHalt} surface to stderr and return exit 2.
|
|
41
|
+
*
|
|
42
|
+
* Per the P3 halt branch table, every CLI-layer halt yields exit code `2`
|
|
43
|
+
* regardless of which event fired it. State persistence is governed by *where*
|
|
44
|
+
* in `main` the halt is detected: the call site decides whether `_save`
|
|
45
|
+
* already ran.
|
|
46
|
+
*
|
|
47
|
+
* When `work` + `state_file` are provided AND the state file already exists on
|
|
48
|
+
* disk, the halt is appended to `work.halts[]` and the state is re-saved. This
|
|
49
|
+
* lets `agent-config explain last` surface the halt reason later. Fresh-run
|
|
50
|
+
* halts before the first `_save` (state file absent) still leave no state on
|
|
51
|
+
* disk — the pre-explain-v2 contract is preserved.
|
|
52
|
+
*/
|
|
53
|
+
export function _emit_halt(
|
|
54
|
+
halt: HookHalt,
|
|
55
|
+
opts: {
|
|
56
|
+
work?: WorkState | null;
|
|
57
|
+
state_file?: string | null;
|
|
58
|
+
event?: string | null;
|
|
59
|
+
} = {},
|
|
60
|
+
): number {
|
|
61
|
+
const work = opts.work ?? null;
|
|
62
|
+
const state_file = opts.state_file ?? null;
|
|
63
|
+
const event = opts.event ?? null;
|
|
64
|
+
|
|
65
|
+
if (halt.surface.length > 0) {
|
|
66
|
+
for (const line of halt.surface) {
|
|
67
|
+
process.stderr.write(line + '\n');
|
|
68
|
+
}
|
|
69
|
+
} else {
|
|
70
|
+
process.stderr.write(`halt: ${halt.reason}\n`);
|
|
71
|
+
}
|
|
72
|
+
if (work !== null && state_file !== null && _exists(state_file)) {
|
|
73
|
+
work.halts.push({
|
|
74
|
+
reason: halt.reason,
|
|
75
|
+
step: event || '',
|
|
76
|
+
surface: [...halt.surface],
|
|
77
|
+
timestamp: _utcNowIso(),
|
|
78
|
+
});
|
|
79
|
+
try {
|
|
80
|
+
dump(work, state_file);
|
|
81
|
+
} catch {
|
|
82
|
+
// never let halt persistence mask the halt
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return 2;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/** Python `Path.exists()`. */
|
|
89
|
+
function _exists(p: string): boolean {
|
|
90
|
+
try {
|
|
91
|
+
fs.statSync(p);
|
|
92
|
+
return true;
|
|
93
|
+
} catch {
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Mirror Python `datetime.now(tz=timezone.utc).isoformat()`.
|
|
100
|
+
*
|
|
101
|
+
* CPython renders an aware UTC datetime as `YYYY-MM-DDTHH:MM:SS.ffffff+00:00`
|
|
102
|
+
* (microsecond precision, explicit `+00:00` offset). `Date.toISOString()`
|
|
103
|
+
* yields `YYYY-MM-DDTHH:MM:SS.sssZ` (millisecond precision, `Z` suffix), so
|
|
104
|
+
* this rebuilds the CPython shape: pad milliseconds to microseconds and
|
|
105
|
+
* replace the `Z` with `+00:00`. This timestamp is wall-clock and therefore
|
|
106
|
+
* non-deterministic — tests normalise it.
|
|
107
|
+
*/
|
|
108
|
+
function _utcNowIso(): string {
|
|
109
|
+
const iso = new Date().toISOString(); // e.g. 2026-06-15T03:11:58.123Z
|
|
110
|
+
// Strip the trailing 'Z', expand .sss → .ssssss (µs), append +00:00.
|
|
111
|
+
const body = iso.slice(0, -1); // drop 'Z'
|
|
112
|
+
const dot = body.lastIndexOf('.');
|
|
113
|
+
if (dot === -1) {
|
|
114
|
+
return body + '.000000+00:00';
|
|
115
|
+
}
|
|
116
|
+
const frac = body.slice(dot + 1); // milliseconds, 3 digits
|
|
117
|
+
const micros = (frac + '000000').slice(0, 6);
|
|
118
|
+
return body.slice(0, dot + 1) + micros + '+00:00';
|
|
119
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI-layer error type used by the dispatcher entry point.
|
|
3
|
+
*
|
|
4
|
+
* TypeScript twin of `work_engine/errors.py` (ADR-200 py2ts Phase 1 —
|
|
5
|
+
* work_engine foundation). Lives in its own module so the helper modules
|
|
6
|
+
* (`state_io`, `input_builders`, etc.) can raise it without depending on
|
|
7
|
+
* `cli.ts`, which would create an import cycle.
|
|
8
|
+
*
|
|
9
|
+
* Behaviour is identical to the original `cli._CLIError` it replaced
|
|
10
|
+
* in P2.3 of `road-to-post-pr29-optimize.md` — same name (private,
|
|
11
|
+
* underscore-prefixed) and same role: convert to exit code `2` at the
|
|
12
|
+
* `main()` boundary.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
/** Raised on configuration or I/O problems. Converted to exit code 2. */
|
|
16
|
+
export class _CLIError extends Error {
|
|
17
|
+
constructor(message?: string) {
|
|
18
|
+
super(message);
|
|
19
|
+
// Restore the prototype chain so `instanceof _CLIError` works under
|
|
20
|
+
// the ES2022 target (Error subclassing caveat).
|
|
21
|
+
Object.setPrototypeOf(this, _CLIError.prototype);
|
|
22
|
+
this.name = '_CLIError';
|
|
23
|
+
}
|
|
24
|
+
}
|