@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,189 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `implement` step — gate + Option-A delegation for applying the plan.
|
|
3
|
+
*
|
|
4
|
+
* TypeScript twin of `work_engine/directives/backend/implement.py` (ADR-200
|
|
5
|
+
* py2ts Phase 1 — work_engine directive sets). Public API names stay
|
|
6
|
+
* snake_case to mirror the Python module 1:1 (per ADR-200 — Python style is
|
|
7
|
+
* part of the contract).
|
|
8
|
+
*
|
|
9
|
+
* The step never edits files. Editing is delegated to the agent via
|
|
10
|
+
* `@agent-directive: apply-plan`; the agent runs the `minimal-safe-
|
|
11
|
+
* diff` and `scope-control` rules while it applies the plan, then
|
|
12
|
+
* writes the resulting file-level changes onto `state.changes` and
|
|
13
|
+
* marks `outcomes['implement'] = 'success'` before re-invoking the
|
|
14
|
+
* dispatcher.
|
|
15
|
+
*
|
|
16
|
+
* Flow:
|
|
17
|
+
*
|
|
18
|
+
* - `plan` outcome is not `success` → BLOCKED on precondition.
|
|
19
|
+
* - `state.changes` empty → BLOCKED with `@agent-directive:
|
|
20
|
+
* apply-plan` so the agent applies the plan.
|
|
21
|
+
* - `state.changes` populated but malformed (entries missing
|
|
22
|
+
* `path`, or non-dict entries) → BLOCKED with shape complaint.
|
|
23
|
+
* - Otherwise → SUCCESS.
|
|
24
|
+
*
|
|
25
|
+
* `changes` entries use the loose shape described in
|
|
26
|
+
* `docs/contracts/implement-ticket-flow.md#deliverystate-the-only-shared-object`
|
|
27
|
+
* — each entry is a dict with at least a `path`; optional
|
|
28
|
+
* `lines` / `purpose` feed the delivery report.
|
|
29
|
+
*/
|
|
30
|
+
|
|
31
|
+
import type { DeliveryState} from '../../delivery_state.js';
|
|
32
|
+
import { type Any, Outcome, StepResult, agent_directive } from '../../delivery_state.js';
|
|
33
|
+
import { resolve_policy } from '../../persona_policy.js';
|
|
34
|
+
|
|
35
|
+
/** Declared ambiguity surfaces. Advisory personas skip this step entirely. */
|
|
36
|
+
export const AMBIGUITIES: ReadonlyArray<Record<string, string>> = [
|
|
37
|
+
{
|
|
38
|
+
code: 'upstream_plan_failed',
|
|
39
|
+
trigger: '`plan` outcome is not `success`',
|
|
40
|
+
resolution: 're-run `/implement-ticket` from the start',
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
code: 'empty_changes_delegate',
|
|
44
|
+
trigger: '`state.changes` empty — plan not applied yet',
|
|
45
|
+
resolution: 'agent directive `apply-plan` → edit under `minimal-safe-diff` ' + '+ `scope-control`',
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
code: 'malformed_changes',
|
|
49
|
+
trigger: 'any change entry is not a dict or has no non-empty `path`',
|
|
50
|
+
resolution: 're-run `apply-plan` and resume',
|
|
51
|
+
},
|
|
52
|
+
];
|
|
53
|
+
|
|
54
|
+
/** Gate on `plan`, then either delegate or validate `state.changes`. */
|
|
55
|
+
export function run(state: DeliveryState): StepResult {
|
|
56
|
+
const policy = resolve_policy(state.persona);
|
|
57
|
+
if (!policy.allows_implement) {
|
|
58
|
+
// Advisory personas produce a plan only; `state.changes` stays
|
|
59
|
+
// empty and the delivery report renders a "no file changes
|
|
60
|
+
// recorded" placeholder. See `persona_policy` for contract.
|
|
61
|
+
return new StepResult({
|
|
62
|
+
outcome: Outcome.SUCCESS,
|
|
63
|
+
message: `implement skipped: persona \`${policy.name}\` is plan-only.`,
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
if (state.outcomes.plan !== Outcome.SUCCESS) {
|
|
68
|
+
return _blocked_on_precondition(state);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
if (!_pyTruthy(state.changes)) {
|
|
72
|
+
return _delegate_to_apply_plan(state);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
const shapeIssues = _diagnose_changes(state.changes);
|
|
76
|
+
if (shapeIssues.length > 0) {
|
|
77
|
+
return _blocked_on_shape(state, shapeIssues);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
return new StepResult({ outcome: Outcome.SUCCESS });
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/** Every entry must be a dict carrying at least a non-empty `path`. */
|
|
84
|
+
function _diagnose_changes(changes: Any[]): string[] {
|
|
85
|
+
const issues: string[] = [];
|
|
86
|
+
changes.forEach((change, i) => {
|
|
87
|
+
const idx = i + 1;
|
|
88
|
+
if (!_isPlainObject(change)) {
|
|
89
|
+
issues.push(`change #${idx} is not a dict`);
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
const d = change as Record<string, unknown>;
|
|
93
|
+
const path = _pyTruthy(d.path) ? d.path : d.file;
|
|
94
|
+
if (typeof path !== 'string' || _pyStrip(path).length === 0) {
|
|
95
|
+
issues.push(`change #${idx} has no path`);
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
return issues;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
function _delegate_to_apply_plan(state: DeliveryState): StepResult {
|
|
102
|
+
const ticketId = _ticketId(state);
|
|
103
|
+
return new StepResult({
|
|
104
|
+
outcome: Outcome.BLOCKED,
|
|
105
|
+
questions: [
|
|
106
|
+
agent_directive('apply-plan', { ticket: ticketId }),
|
|
107
|
+
`> Ticket ${ticketId} — applying the recorded plan under ` +
|
|
108
|
+
'`minimal-safe-diff` + `scope-control`.',
|
|
109
|
+
'> 1. Continue — apply the plan as recorded',
|
|
110
|
+
'> 2. Abort — stop before any edits are made',
|
|
111
|
+
],
|
|
112
|
+
message: `Ticket ${ticketId} needs its plan applied before testing.`,
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
function _blocked_on_precondition(state: DeliveryState): StepResult {
|
|
117
|
+
const ticketId = _ticketId(state);
|
|
118
|
+
return new StepResult({
|
|
119
|
+
outcome: Outcome.BLOCKED,
|
|
120
|
+
questions: [
|
|
121
|
+
`> Ticket ${ticketId} — implement gate refused: ` +
|
|
122
|
+
'`plan` step did not complete successfully.',
|
|
123
|
+
'> 1. Re-run `/implement-ticket` from the start',
|
|
124
|
+
'> 2. Abort',
|
|
125
|
+
],
|
|
126
|
+
message: `Ticket ${ticketId} cannot implement: plan gate did not pass.`,
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
function _blocked_on_shape(state: DeliveryState, issues: string[]): StepResult {
|
|
131
|
+
const ticketId = _ticketId(state);
|
|
132
|
+
return new StepResult({
|
|
133
|
+
outcome: Outcome.BLOCKED,
|
|
134
|
+
questions: [
|
|
135
|
+
`> Ticket ${ticketId} — recorded changes are malformed: ` + issues.join('; ') + '.',
|
|
136
|
+
'> 1. Re-run `apply-plan` and resume',
|
|
137
|
+
'> 2. Abort — changes cannot be trusted',
|
|
138
|
+
],
|
|
139
|
+
message: `Ticket ${ticketId} changes shape invalid: ${issues.join('; ')}.`,
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/** `(state.ticket or {}).get("id") or "(no id)"`. */
|
|
144
|
+
function _ticketId(state: DeliveryState): string {
|
|
145
|
+
const id = (state.ticket ?? {}).id;
|
|
146
|
+
return _pyTruthy(id) ? String(id) : '(no id)';
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/** Python truthiness for the scalar/container kinds these slices carry. */
|
|
150
|
+
function _pyTruthy(value: unknown): boolean {
|
|
151
|
+
if (value === null || value === undefined || value === false) {
|
|
152
|
+
return false;
|
|
153
|
+
}
|
|
154
|
+
if (value === true) {
|
|
155
|
+
return true;
|
|
156
|
+
}
|
|
157
|
+
if (typeof value === 'number') {
|
|
158
|
+
return value !== 0;
|
|
159
|
+
}
|
|
160
|
+
if (typeof value === 'string') {
|
|
161
|
+
return value.length !== 0;
|
|
162
|
+
}
|
|
163
|
+
if (Array.isArray(value)) {
|
|
164
|
+
return value.length !== 0;
|
|
165
|
+
}
|
|
166
|
+
if (value instanceof Set || value instanceof Map) {
|
|
167
|
+
return value.size !== 0;
|
|
168
|
+
}
|
|
169
|
+
if (typeof value === 'object') {
|
|
170
|
+
return Object.keys(value as Record<string, unknown>).length !== 0;
|
|
171
|
+
}
|
|
172
|
+
return true;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/** Python `str.strip()` — strip leading/trailing whitespace. */
|
|
176
|
+
function _pyStrip(s: string): string {
|
|
177
|
+
return s.trim();
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/** True for a dict-like value (mirrors Python `isinstance(x, dict)`). */
|
|
181
|
+
function _isPlainObject(value: unknown): value is Record<string, unknown> {
|
|
182
|
+
return (
|
|
183
|
+
typeof value === 'object' &&
|
|
184
|
+
value !== null &&
|
|
185
|
+
!Array.isArray(value) &&
|
|
186
|
+
!(value instanceof Set) &&
|
|
187
|
+
!(value instanceof Map)
|
|
188
|
+
);
|
|
189
|
+
}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Backend directive set — step handlers for the backend-coding flow.
|
|
3
|
+
*
|
|
4
|
+
* TypeScript twin of `work_engine/directives/backend/__init__.py` (ADR-200
|
|
5
|
+
* py2ts Phase 1 — work_engine TOP/integration layer). The `__init__.py` →
|
|
6
|
+
* `index.ts` mapping mirrors the hooks subpackage convention. Public API
|
|
7
|
+
* names stay snake_case to mirror the Python module 1:1 (per ADR-200).
|
|
8
|
+
*
|
|
9
|
+
* Each module exposes a single `run` callable that matches the `Step`
|
|
10
|
+
* protocol defined in `../../delivery_state`. The dispatcher wires them into
|
|
11
|
+
* the `STEP_ORDER` mapping at call time.
|
|
12
|
+
*
|
|
13
|
+
* The deterministic gates (`refine`, `memory`, `analyze`) validate upstream
|
|
14
|
+
* state; the delegation gates (`plan`, `implement`, `test`, `verify`) halt
|
|
15
|
+
* with `@agent-directive:` markers so the orchestrator can invoke the matching
|
|
16
|
+
* skill and resume. `report` renders the delivery Markdown once everything
|
|
17
|
+
* else has succeeded.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
import type { Step } from '../../delivery_state.js';
|
|
21
|
+
|
|
22
|
+
import * as analyze from './analyze.js';
|
|
23
|
+
import * as implement from './implement.js';
|
|
24
|
+
import * as memory from './memory.js';
|
|
25
|
+
import * as plan from './plan.js';
|
|
26
|
+
import * as refine from './refine.js';
|
|
27
|
+
import * as report from './report.js';
|
|
28
|
+
import * as test from './test.js';
|
|
29
|
+
import * as verify from './verify.js';
|
|
30
|
+
|
|
31
|
+
/** External name carried in `state.directive_set` for this set. */
|
|
32
|
+
export const DIRECTIVE_SET_NAME = 'backend';
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Input kinds this directive set knows how to handle.
|
|
36
|
+
*
|
|
37
|
+
* Read by `work_engine.dispatcher.assert_kind_supported` before the loop
|
|
38
|
+
* starts. The schema's `work_engine.state.KNOWN_INPUT_KINDS` is the *envelope*
|
|
39
|
+
* whitelist (what is accepted on disk); `SUPPORTED_KINDS` is the *capability*
|
|
40
|
+
* whitelist (what this set can actually drive end to end).
|
|
41
|
+
*/
|
|
42
|
+
export const SUPPORTED_KINDS: ReadonlyArray<string> = ['ticket', 'prompt'];
|
|
43
|
+
|
|
44
|
+
// Mirror the Python `_STEPS` tuple: (refine, memory, analyze, plan, implement,
|
|
45
|
+
// test, verify, report). The leaf name is the dispatcher slot key; in Python
|
|
46
|
+
// it is derived via `step.__name__.rsplit(".", 1)[-1]` — hardcoded here since
|
|
47
|
+
// the modules are imported statically.
|
|
48
|
+
const _STEPS: ReadonlyArray<[string, { run: Step; AMBIGUITIES: ReadonlyArray<Record<string, string>> }]> = [
|
|
49
|
+
['refine', refine],
|
|
50
|
+
['memory', memory],
|
|
51
|
+
['analyze', analyze],
|
|
52
|
+
['plan', plan],
|
|
53
|
+
['implement', implement],
|
|
54
|
+
['test', test],
|
|
55
|
+
['verify', verify],
|
|
56
|
+
['report', report],
|
|
57
|
+
];
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Return `{step_name: AMBIGUITIES}` for every step in flow order.
|
|
61
|
+
*
|
|
62
|
+
* Used by documentation generators and the `test_ambiguity_coverage` suite to
|
|
63
|
+
* prove every step explicitly declares what can surface a `BLOCKED` outcome.
|
|
64
|
+
* Steps that always succeed (`memory`, `report`) return an empty tuple —
|
|
65
|
+
* declared intent, not an omission.
|
|
66
|
+
*/
|
|
67
|
+
export function all_ambiguities(): Record<string, ReadonlyArray<Record<string, string>>> {
|
|
68
|
+
const out: Record<string, ReadonlyArray<Record<string, string>>> = {};
|
|
69
|
+
for (const [name, step] of _STEPS) {
|
|
70
|
+
out[name] = step.AMBIGUITIES;
|
|
71
|
+
}
|
|
72
|
+
return out;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Return the `{step_name: handler}` mapping the dispatcher walks.
|
|
77
|
+
*
|
|
78
|
+
* Each value is the module-level `run` callable matching the
|
|
79
|
+
* `work_engine.delivery_state.Step` protocol — exactly what
|
|
80
|
+
* `work_engine.dispatcher.dispatch` calls. Order of insertion matches the
|
|
81
|
+
* canonical backend flow (refine → memory → analyze → plan → implement →
|
|
82
|
+
* test → verify → report).
|
|
83
|
+
*/
|
|
84
|
+
export function get_steps(): Map<string, Step> {
|
|
85
|
+
const out = new Map<string, Step>();
|
|
86
|
+
for (const [name, step] of _STEPS) {
|
|
87
|
+
out.set(name, step.run);
|
|
88
|
+
}
|
|
89
|
+
return out;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// Re-export the step modules as namespaces (Python `__all__` lists them as
|
|
93
|
+
// importable members of the package).
|
|
94
|
+
export { analyze, implement, memory, plan, refine, report, test, verify };
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `memory` step — bounded retrieval over the three allowed types.
|
|
3
|
+
*
|
|
4
|
+
* TypeScript twin of `work_engine/directives/backend/memory.py` (ADR-200
|
|
5
|
+
* py2ts Phase 1 — work_engine directive sets). Public API names stay
|
|
6
|
+
* snake_case to mirror the Python module 1:1 (per ADR-200 — Python style is
|
|
7
|
+
* part of the contract).
|
|
8
|
+
*
|
|
9
|
+
* Contract (see
|
|
10
|
+
* `docs/contracts/implement-ticket-flow.md#memory-retrieval-contract`):
|
|
11
|
+
*
|
|
12
|
+
* - Three allowed types: `domain-invariants`, `incident-learnings`,
|
|
13
|
+
* `historical-patterns`. (Architectural rationale lives in ADRs —
|
|
14
|
+
* `docs/decisions/` — not in curated memory.)
|
|
15
|
+
* - Hard cap of **12** hits total across the three types.
|
|
16
|
+
* - Keys derive from the ticket — title tokens plus acceptance-criterion
|
|
17
|
+
* tokens plus any already-known `files` hint. Tokenisation is
|
|
18
|
+
* deliberately naive (whitespace split, lower-cased) so the retrieval
|
|
19
|
+
* shape stays reproducible in tests.
|
|
20
|
+
* - Step always returns `SUCCESS`. Zero hits is a valid outcome
|
|
21
|
+
* ("nothing in memory touches this ticket") — the `report` step
|
|
22
|
+
* drops the memory section when that happens rather than padding.
|
|
23
|
+
*
|
|
24
|
+
* The step stores each hit as a plain dict on `state.memory` so
|
|
25
|
+
* consumers outside Python (the delivery report, JSON log lines) can
|
|
26
|
+
* round-trip the structure without pickling dataclasses.
|
|
27
|
+
*/
|
|
28
|
+
|
|
29
|
+
import type { DeliveryState} from '../../delivery_state.js';
|
|
30
|
+
import { type Any, Outcome, StepResult } from '../../delivery_state.js';
|
|
31
|
+
import { retrieve as _real_retrieve } from '../../../memory_lookup.js';
|
|
32
|
+
|
|
33
|
+
/** The three types allowed by the flow contract. No aliases, no extras. */
|
|
34
|
+
export const MEMORY_TYPES: ReadonlyArray<string> = [
|
|
35
|
+
'domain-invariants',
|
|
36
|
+
'incident-learnings',
|
|
37
|
+
'historical-patterns',
|
|
38
|
+
];
|
|
39
|
+
|
|
40
|
+
/** Hard cap per the roadmap — never raise without amending the contract. */
|
|
41
|
+
export const MAX_HITS = 12;
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Declared ambiguity surfaces — memory retrieval always succeeds.
|
|
45
|
+
*
|
|
46
|
+
* Declared empty so the aggregate registry in `steps/__init__.py`
|
|
47
|
+
* can round-trip every step's surfaces without a special case.
|
|
48
|
+
*/
|
|
49
|
+
export const AMBIGUITIES: ReadonlyArray<Record<string, string>> = [];
|
|
50
|
+
|
|
51
|
+
/** Signature of the `memory_lookup.retrieve` callable this step drives. */
|
|
52
|
+
type RetrieveFn = (types: string[], keys: string[], limit: number) => unknown;
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Test seam mirroring Python's late `import memory_lookup` monkeypatch
|
|
56
|
+
* point. Default is the real `memory_lookup.retrieve`; tests swap it via
|
|
57
|
+
* `_setRetrieve` exactly as the Python suite patches `memory_lookup.retrieve`.
|
|
58
|
+
*/
|
|
59
|
+
let _retrieve_override: RetrieveFn | null = null;
|
|
60
|
+
|
|
61
|
+
/** Swap the `retrieve` callable (test hook for the lazy-import seam). */
|
|
62
|
+
export function _setRetrieve(fn: RetrieveFn | null): void {
|
|
63
|
+
_retrieve_override = fn;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
const _WORD = /[A-Za-z][A-Za-z0-9_-]{2,}/g;
|
|
67
|
+
const _STOPWORDS: ReadonlySet<string> = new Set([
|
|
68
|
+
'the', 'and', 'for', 'with', 'from', 'into', 'that', 'this',
|
|
69
|
+
'should', 'must', 'when', 'then', 'will', 'have', 'has',
|
|
70
|
+
'are', 'was', 'were', 'can', 'could', 'would', 'shall',
|
|
71
|
+
'also', 'which', 'where', 'while', 'make', 'made', 'use',
|
|
72
|
+
'used', 'using', 'user', 'users', 'test', 'tests',
|
|
73
|
+
]);
|
|
74
|
+
|
|
75
|
+
/** Populate `state.memory` with up to `MAX_HITS` hits. */
|
|
76
|
+
export function run(state: DeliveryState): StepResult {
|
|
77
|
+
const retrieve = _resolve_retrieve();
|
|
78
|
+
const keys = _keys_from_ticket(state.ticket);
|
|
79
|
+
const hits = retrieve([...MEMORY_TYPES], keys, MAX_HITS);
|
|
80
|
+
|
|
81
|
+
// `retrieve` returns `Hit` dataclasses; coerce to dicts so the
|
|
82
|
+
// state is serialisation-ready for the report step and metrics log.
|
|
83
|
+
const hitList = Array.isArray(hits) ? hits : [];
|
|
84
|
+
state.memory = hitList.slice(0, MAX_HITS).map((h) => _as_dict(h));
|
|
85
|
+
return new StepResult({ outcome: Outcome.SUCCESS });
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Resolve `memory_lookup.retrieve` lazily so tests can monkeypatch it.
|
|
90
|
+
*
|
|
91
|
+
* Importing at module load time would freeze the reference before
|
|
92
|
+
* tests can swap in a fake, which is the standard gotcha with the
|
|
93
|
+
* `from X import Y` form. Deferring the resolution keeps the step
|
|
94
|
+
* patchable from a single attribute (`memory_lookup.retrieve`).
|
|
95
|
+
*/
|
|
96
|
+
function _resolve_retrieve(): RetrieveFn {
|
|
97
|
+
return _retrieve_override ?? (_real_retrieve as RetrieveFn);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Derive retrieval keys from the ticket.
|
|
102
|
+
*
|
|
103
|
+
* Three sources, in priority order so callers reading the log can
|
|
104
|
+
* reconstruct why a hit scored: explicit `files` hints first,
|
|
105
|
+
* then title tokens, then acceptance-criterion tokens. Duplicates
|
|
106
|
+
* are removed while preserving first-seen order.
|
|
107
|
+
*/
|
|
108
|
+
function _keys_from_ticket(ticket: Record<string, Any>): string[] {
|
|
109
|
+
const keys: string[] = [];
|
|
110
|
+
_extend_unique(keys, _as_str_list((ticket || {}).files));
|
|
111
|
+
_extend_unique(keys, _tokenise((ticket || {}).title));
|
|
112
|
+
for (const ac of _as_str_list((ticket || {}).acceptance_criteria)) {
|
|
113
|
+
_extend_unique(keys, _tokenise(ac));
|
|
114
|
+
}
|
|
115
|
+
return keys;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/** Return lower-cased content words from `value` (empty when absent). */
|
|
119
|
+
function _tokenise(value: Any): string[] {
|
|
120
|
+
if (typeof value !== 'string') {
|
|
121
|
+
return [];
|
|
122
|
+
}
|
|
123
|
+
const out: string[] = [];
|
|
124
|
+
for (const match of value.matchAll(_WORD)) {
|
|
125
|
+
const word = match[0].toLowerCase();
|
|
126
|
+
if (!_STOPWORDS.has(word)) {
|
|
127
|
+
out.push(word);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
return out;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/** Coerce `value` to a list of non-empty strings. */
|
|
134
|
+
function _as_str_list(value: Any): string[] {
|
|
135
|
+
if (!Array.isArray(value)) {
|
|
136
|
+
return [];
|
|
137
|
+
}
|
|
138
|
+
return value.filter((item): item is string => typeof item === 'string' && item.trim().length !== 0);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/** Append items from `source` to `target` skipping duplicates. */
|
|
142
|
+
function _extend_unique(target: string[], source: Iterable<string>): void {
|
|
143
|
+
const seen = new Set(target);
|
|
144
|
+
for (const item of source) {
|
|
145
|
+
if (seen.has(item)) {
|
|
146
|
+
continue;
|
|
147
|
+
}
|
|
148
|
+
target.push(item);
|
|
149
|
+
seen.add(item);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/** Coerce a `Hit` (or pre-dict test fake) into a plain dict. */
|
|
154
|
+
function _as_dict(hit: Any): Record<string, Any> {
|
|
155
|
+
const asDict = (hit as { as_dict?: unknown })?.as_dict;
|
|
156
|
+
if (typeof asDict === 'function') {
|
|
157
|
+
return (asDict as () => Record<string, Any>).call(hit);
|
|
158
|
+
}
|
|
159
|
+
if (_isPlainObject(hit)) {
|
|
160
|
+
return { ...(hit as Record<string, Any>) };
|
|
161
|
+
}
|
|
162
|
+
// Fallback path — should not happen in production, but keeps the
|
|
163
|
+
// step from crashing if a fixture returns a raw namespace object.
|
|
164
|
+
return { entry: _pyRepr(hit) };
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/** True for a dict-like value (mirrors Python `isinstance(x, dict)`). */
|
|
168
|
+
function _isPlainObject(value: unknown): value is Record<string, unknown> {
|
|
169
|
+
return (
|
|
170
|
+
typeof value === 'object' &&
|
|
171
|
+
value !== null &&
|
|
172
|
+
!Array.isArray(value) &&
|
|
173
|
+
!(value instanceof Set) &&
|
|
174
|
+
!(value instanceof Map)
|
|
175
|
+
);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/** Minimal Python `repr()` for the fallback path's scalar inputs. */
|
|
179
|
+
function _pyRepr(value: unknown): string {
|
|
180
|
+
if (value === null || value === undefined) {
|
|
181
|
+
return 'None';
|
|
182
|
+
}
|
|
183
|
+
if (value === true) {
|
|
184
|
+
return 'True';
|
|
185
|
+
}
|
|
186
|
+
if (value === false) {
|
|
187
|
+
return 'False';
|
|
188
|
+
}
|
|
189
|
+
if (typeof value === 'string') {
|
|
190
|
+
return `'${value}'`;
|
|
191
|
+
}
|
|
192
|
+
return String(value);
|
|
193
|
+
}
|