@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,531 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Migrate a v0 `DeliveryState` JSON file to the v1 schema.
|
|
3
|
+
*
|
|
4
|
+
* TypeScript twin of `work_engine/migration/v0_to_v1.py` (ADR-200 py2ts
|
|
5
|
+
* Phase 1 — work_engine TOP/integration layer). 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 v0 era used `.implement-ticket-state.json` and stored the ticket
|
|
10
|
+
* under a flat `ticket` key. v1 wraps the payload under `input.kind`
|
|
11
|
+
* / `input.data` and adds `intent`, `directive_set`, and
|
|
12
|
+
* `version`. The default destination is `.work-state.json` next to
|
|
13
|
+
* the v0 file; the v0 file is renamed to `.implement-ticket-state.json.bak`
|
|
14
|
+
* to preserve the rollback surface.
|
|
15
|
+
*
|
|
16
|
+
* The module is both importable and runnable:
|
|
17
|
+
*
|
|
18
|
+
* node node_modules/.bin/tsx work_engine/migration/v0_to_v1.ts .implement-ticket-state.json
|
|
19
|
+
*
|
|
20
|
+
* Idempotency: `migrate_payload` accepts a payload that already looks
|
|
21
|
+
* like v1 and returns it unchanged. `migrate_file` refuses to migrate
|
|
22
|
+
* twice — if the destination already exists it raises rather than
|
|
23
|
+
* silently overwriting work.
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
import * as fs from 'node:fs';
|
|
27
|
+
import * as path from 'node:path';
|
|
28
|
+
|
|
29
|
+
import {
|
|
30
|
+
DEFAULT_DIRECTIVE_SET,
|
|
31
|
+
DEFAULT_INTENT,
|
|
32
|
+
SCHEMA_VERSION,
|
|
33
|
+
SchemaError,
|
|
34
|
+
type Dict,
|
|
35
|
+
type JsonValue,
|
|
36
|
+
} from '../state.js';
|
|
37
|
+
|
|
38
|
+
export const DEFAULT_V0_FILENAME = '.implement-ticket-state.json';
|
|
39
|
+
/**
|
|
40
|
+
* Path the dispatcher used while the engine still lived under
|
|
41
|
+
* `implement_ticket`. The migration looks here when no source path is
|
|
42
|
+
* passed on the CLI.
|
|
43
|
+
*/
|
|
44
|
+
|
|
45
|
+
export const DEFAULT_V1_FILENAME = '.work-state.json';
|
|
46
|
+
/** Canonical filename for the v1 wire format. */
|
|
47
|
+
|
|
48
|
+
export const BACKUP_SUFFIX = '.bak';
|
|
49
|
+
/**
|
|
50
|
+
* Appended to the v0 source path when the migration archives it.
|
|
51
|
+
*
|
|
52
|
+
* If the `.bak` slot is already taken (re-running the migration after
|
|
53
|
+
* an aborted run, manual rollback, etc.) the rotator falls back to
|
|
54
|
+
* `.bak.1`, `.bak.2`, ... — see {@link _rotate_backup_path}. The
|
|
55
|
+
* migration never silently overwrites an existing backup.
|
|
56
|
+
*/
|
|
57
|
+
|
|
58
|
+
const _MAX_BACKUP_ROTATIONS = 999;
|
|
59
|
+
/**
|
|
60
|
+
* Hard ceiling on rotated backup filenames; surfaces an explicit
|
|
61
|
+
* {@link SchemaError} instead of looping forever if a checkout has
|
|
62
|
+
* hundreds of stale backups.
|
|
63
|
+
*/
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Return the next free `.bak` slot for `source`.
|
|
67
|
+
*
|
|
68
|
+
* Tries `source.bak` first, then `source.bak.1`,
|
|
69
|
+
* `source.bak.2`, ... up to {@link _MAX_BACKUP_ROTATIONS}. The
|
|
70
|
+
* rotator only inspects existence — collision-safe by construction —
|
|
71
|
+
* and never deletes or overwrites prior backups.
|
|
72
|
+
*/
|
|
73
|
+
export function _rotate_backup_path(source: string): string {
|
|
74
|
+
// Python `source.with_suffix(source.suffix + BACKUP_SUFFIX)`: append the
|
|
75
|
+
// backup suffix to the existing suffix. `Path.with_suffix` replaces the
|
|
76
|
+
// final extension, so `.json` → `.json.bak` is exactly `source + ".bak"`
|
|
77
|
+
// here because BACKUP_SUFFIX leads with a dot and there is no embedded
|
|
78
|
+
// dot to collide with. Mirror `_with_suffix` semantics for parity.
|
|
79
|
+
const primary = _with_suffix(source, _suffix(source) + BACKUP_SUFFIX);
|
|
80
|
+
if (!_exists(primary)) {
|
|
81
|
+
return primary;
|
|
82
|
+
}
|
|
83
|
+
for (let index = 1; index <= _MAX_BACKUP_ROTATIONS; index++) {
|
|
84
|
+
const candidate = _with_suffix(primary, _suffix(primary) + `.${index}`);
|
|
85
|
+
if (!_exists(candidate)) {
|
|
86
|
+
return candidate;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
throw new SchemaError(
|
|
90
|
+
`refusing to rotate backup for ${source}: more than ` +
|
|
91
|
+
`${_MAX_BACKUP_ROTATIONS} stale .bak files already exist; ` +
|
|
92
|
+
'clean them up before re-running the migration',
|
|
93
|
+
);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Return the v1 form of `payload`.
|
|
98
|
+
*
|
|
99
|
+
* A payload that already declares `version: 1` is returned
|
|
100
|
+
* unchanged (deep-copied via `JSON.parse(JSON.stringify(...))` so the
|
|
101
|
+
* caller cannot accidentally mutate the input). Anything else is
|
|
102
|
+
* treated as v0 and wrapped: `ticket` becomes `input.data`,
|
|
103
|
+
* `input.kind` is set to `"ticket"`, and the engine defaults are
|
|
104
|
+
* filled in.
|
|
105
|
+
*
|
|
106
|
+
* @throws SchemaError If the payload is not a dict, declares a higher version
|
|
107
|
+
* than this migration knows about, or lacks a `ticket` key.
|
|
108
|
+
*/
|
|
109
|
+
export function migrate_payload(payload: JsonValue): Dict {
|
|
110
|
+
if (!_isPlainDict(payload)) {
|
|
111
|
+
throw new SchemaError(
|
|
112
|
+
`v0 state must be a JSON object; got ${_pyTypeName(payload)}`,
|
|
113
|
+
);
|
|
114
|
+
}
|
|
115
|
+
const p = payload as Record<string, JsonValue>;
|
|
116
|
+
|
|
117
|
+
const declared_version = _get(p, 'version', undefined);
|
|
118
|
+
if (declared_version === SCHEMA_VERSION) {
|
|
119
|
+
return JSON.parse(JSON.stringify(p)) as Dict;
|
|
120
|
+
}
|
|
121
|
+
if (declared_version !== undefined && declared_version !== null) {
|
|
122
|
+
throw new SchemaError(
|
|
123
|
+
`cannot migrate from version ${_pyRepr(declared_version)} to ` +
|
|
124
|
+
`${SCHEMA_VERSION}; this script only handles v0 (no version key)`,
|
|
125
|
+
);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
if (!('ticket' in p)) {
|
|
129
|
+
throw new SchemaError(
|
|
130
|
+
"v0 state must carry a 'ticket' key; got keys: " +
|
|
131
|
+
_pyReprList(_sortedStr(Object.keys(p))),
|
|
132
|
+
);
|
|
133
|
+
}
|
|
134
|
+
const ticket = p['ticket'];
|
|
135
|
+
if (!_isPlainDict(ticket)) {
|
|
136
|
+
throw new SchemaError(
|
|
137
|
+
`v0 state.ticket must be a JSON object; got ${_pyTypeName(ticket)}`,
|
|
138
|
+
);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
return {
|
|
142
|
+
version: SCHEMA_VERSION,
|
|
143
|
+
input: { kind: 'ticket', data: ticket },
|
|
144
|
+
intent: DEFAULT_INTENT,
|
|
145
|
+
directive_set: DEFAULT_DIRECTIVE_SET,
|
|
146
|
+
persona: _get(p, 'persona', 'senior-engineer') as JsonValue,
|
|
147
|
+
memory: [...((_get(p, 'memory', []) as JsonValue[]) ?? [])],
|
|
148
|
+
plan: _get(p, 'plan', null) as JsonValue,
|
|
149
|
+
changes: [...((_get(p, 'changes', []) as JsonValue[]) ?? [])],
|
|
150
|
+
tests: _get(p, 'tests', null) as JsonValue,
|
|
151
|
+
verify: _get(p, 'verify', null) as JsonValue,
|
|
152
|
+
outcomes: { ...((_get(p, 'outcomes', {}) as Dict) ?? {}) },
|
|
153
|
+
questions: [...((_get(p, 'questions', []) as JsonValue[]) ?? [])],
|
|
154
|
+
report: _get(p, 'report', '') as JsonValue,
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* Migrate the v0 state file at `source` and write the v1 result.
|
|
160
|
+
*
|
|
161
|
+
* `destination` defaults to {@link DEFAULT_V1_FILENAME} next to
|
|
162
|
+
* `source`. When `backup` is true (the default) the original
|
|
163
|
+
* file is renamed with {@link BACKUP_SUFFIX} appended; when false,
|
|
164
|
+
* the original is left untouched. The destination must not exist —
|
|
165
|
+
* refusing to overwrite is the safety net against accidental
|
|
166
|
+
* double-migration on CI.
|
|
167
|
+
*
|
|
168
|
+
* Returns the destination path on success.
|
|
169
|
+
*/
|
|
170
|
+
export function migrate_file(
|
|
171
|
+
source: string,
|
|
172
|
+
opts: { destination?: string | null; backup?: boolean } = {},
|
|
173
|
+
): string {
|
|
174
|
+
const destination = opts.destination ?? null;
|
|
175
|
+
const backup = opts.backup ?? true;
|
|
176
|
+
|
|
177
|
+
if (!_isFile(source)) {
|
|
178
|
+
throw new SchemaError(`v0 state file not found: ${source}`);
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
const raw = fs.readFileSync(source, 'utf-8');
|
|
182
|
+
let payload: JsonValue;
|
|
183
|
+
try {
|
|
184
|
+
payload = JSON.parse(raw) as JsonValue;
|
|
185
|
+
} catch (exc) {
|
|
186
|
+
// Python `json.JSONDecodeError` → "invalid JSON in {source}: {exc}".
|
|
187
|
+
throw new SchemaError(`invalid JSON in ${source}: ${(exc as Error).message}`);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
const target = destination ?? _with_name(source, DEFAULT_V1_FILENAME);
|
|
191
|
+
if (_exists(target)) {
|
|
192
|
+
throw new SchemaError(
|
|
193
|
+
`refusing to overwrite existing destination ${target}; ` +
|
|
194
|
+
'delete or rename it first',
|
|
195
|
+
);
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
const migrated = migrate_payload(payload);
|
|
199
|
+
fs.mkdirSync(_parent(target), { recursive: true });
|
|
200
|
+
fs.writeFileSync(
|
|
201
|
+
target,
|
|
202
|
+
_jsonDumps(migrated) + '\n',
|
|
203
|
+
'utf-8',
|
|
204
|
+
);
|
|
205
|
+
|
|
206
|
+
if (backup) {
|
|
207
|
+
const backup_path = _rotate_backup_path(source);
|
|
208
|
+
// Python `shutil.move(str(source), str(backup_path))` — rename within
|
|
209
|
+
// the same directory; `fs.renameSync` matches that fast path.
|
|
210
|
+
fs.renameSync(source, backup_path);
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
return target;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
/**
|
|
217
|
+
* CLI entry point — `node node_modules/.bin/tsx work_engine/migration/v0_to_v1.ts`.
|
|
218
|
+
*
|
|
219
|
+
* Exits `0` on success, `2` on any {@link SchemaError} so the
|
|
220
|
+
* invoking shell can branch on the failure category. Returns the exit
|
|
221
|
+
* code (the caller sets `process.exitCode`, never `process.exit`, per
|
|
222
|
+
* ADR-200).
|
|
223
|
+
*/
|
|
224
|
+
export function main(argv: string[] | null = null): number {
|
|
225
|
+
const args = _parse_args(argv ?? process.argv.slice(2));
|
|
226
|
+
if (args === null) {
|
|
227
|
+
// `-h` / `--help` already printed usage and signalled exit 0.
|
|
228
|
+
return 0;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
let target: string;
|
|
232
|
+
try {
|
|
233
|
+
target = migrate_file(args.source, {
|
|
234
|
+
destination: args.destination,
|
|
235
|
+
backup: !args.no_backup,
|
|
236
|
+
});
|
|
237
|
+
} catch (exc) {
|
|
238
|
+
if (exc instanceof SchemaError) {
|
|
239
|
+
process.stderr.write(`error: ${exc.message}\n`);
|
|
240
|
+
return 2;
|
|
241
|
+
}
|
|
242
|
+
throw exc;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
process.stdout.write(`migrated ${args.source} → ${target}\n`);
|
|
246
|
+
return 0;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
// ── Argument parsing ─────────────────────────────────────────────────────
|
|
250
|
+
//
|
|
251
|
+
// The Python source uses `argparse` with a single optional positional
|
|
252
|
+
// (`source`, default `.implement-ticket-state.json`) plus `--destination`
|
|
253
|
+
// and `--no-backup`. argparse `--help`/error prose is not a parity surface
|
|
254
|
+
// (ADR-200); the parser mirrors argparse's runtime behaviour: long-option
|
|
255
|
+
// prefix abbreviation, `--flag=value` / `--flag value` forms, the store_true
|
|
256
|
+
// `--no-backup`, `-h`/`--help` exit-0, exit-2 on every error path.
|
|
257
|
+
|
|
258
|
+
interface MigrationArgs {
|
|
259
|
+
source: string;
|
|
260
|
+
destination: string | null;
|
|
261
|
+
no_backup: boolean;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
const _PROG = 'work_engine.migration.v0_to_v1';
|
|
265
|
+
|
|
266
|
+
interface _OptionSpec {
|
|
267
|
+
flag: string;
|
|
268
|
+
dest: 'destination' | 'no_backup';
|
|
269
|
+
takesValue: boolean;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
const _OPTIONS: _OptionSpec[] = [
|
|
273
|
+
{ flag: '--destination', dest: 'destination', takesValue: true },
|
|
274
|
+
{ flag: '--no-backup', dest: 'no_backup', takesValue: false },
|
|
275
|
+
];
|
|
276
|
+
|
|
277
|
+
const _HELP_FLAGS = ['--help'];
|
|
278
|
+
|
|
279
|
+
function _usage(): string {
|
|
280
|
+
// Compact one-line usage marker; the exact wrapping/prose is not a parity
|
|
281
|
+
// surface (ADR-200 — argparse usage/help text is not byte-compared).
|
|
282
|
+
return `usage: ${_PROG} [-h] [--destination DESTINATION] [--no-backup] [source]`;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
function _argErr(message: string): never {
|
|
286
|
+
process.stderr.write(`${_usage()}\n`);
|
|
287
|
+
process.stderr.write(`${_PROG}: error: ${message}\n`);
|
|
288
|
+
process.exitCode = 2;
|
|
289
|
+
throw new _ArgparseExit(2);
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
function _resolveLong(name: string): _OptionSpec | 'help' {
|
|
293
|
+
const exact = _OPTIONS.find((o) => o.flag === name);
|
|
294
|
+
if (exact) {
|
|
295
|
+
return exact;
|
|
296
|
+
}
|
|
297
|
+
if (_HELP_FLAGS.includes(name)) {
|
|
298
|
+
return 'help';
|
|
299
|
+
}
|
|
300
|
+
const candidates: Array<_OptionSpec | 'help'> = [];
|
|
301
|
+
for (const o of _OPTIONS) {
|
|
302
|
+
if (o.flag.startsWith(name)) {
|
|
303
|
+
candidates.push(o);
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
for (const h of _HELP_FLAGS) {
|
|
307
|
+
if (h.startsWith(name)) {
|
|
308
|
+
candidates.push('help');
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
if (candidates.length === 1) {
|
|
312
|
+
return candidates[0] as _OptionSpec | 'help';
|
|
313
|
+
}
|
|
314
|
+
if (candidates.length === 0) {
|
|
315
|
+
_argErr(`unrecognized arguments: ${name}`);
|
|
316
|
+
}
|
|
317
|
+
const names = candidates.map((c) => (c === 'help' ? '--help' : c.flag)).join(', ');
|
|
318
|
+
_argErr(`ambiguous option: ${name} could match ${names}`);
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
/** Thrown internally to mirror argparse's exit path (sentinel). */
|
|
322
|
+
class _ArgparseExit extends Error {
|
|
323
|
+
readonly code: number;
|
|
324
|
+
constructor(code: number) {
|
|
325
|
+
super(`argparse exit ${code}`);
|
|
326
|
+
Object.setPrototypeOf(this, _ArgparseExit.prototype);
|
|
327
|
+
this.name = 'ArgparseExit';
|
|
328
|
+
this.code = code;
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
/**
|
|
333
|
+
* Parse `argv` (the slice after the program name). Returns `null` on
|
|
334
|
+
* `-h`/`--help` (usage printed, exit 0 signalled); throws {@link _ArgparseExit}
|
|
335
|
+
* (with `process.exitCode` set to 2) on any error path. Mirrors the argparse
|
|
336
|
+
* positional default of `.implement-ticket-state.json`.
|
|
337
|
+
*/
|
|
338
|
+
function _parse_args(argv: string[]): MigrationArgs | null {
|
|
339
|
+
const args: MigrationArgs = {
|
|
340
|
+
source: DEFAULT_V0_FILENAME,
|
|
341
|
+
destination: null,
|
|
342
|
+
no_backup: false,
|
|
343
|
+
};
|
|
344
|
+
const positionals: string[] = [];
|
|
345
|
+
const extras: string[] = [];
|
|
346
|
+
let sawSource = false;
|
|
347
|
+
|
|
348
|
+
let i = 0;
|
|
349
|
+
while (i < argv.length) {
|
|
350
|
+
const tok = argv[i] as string;
|
|
351
|
+
if (tok === '-h' || tok === '--help') {
|
|
352
|
+
process.stdout.write(`${_usage()}\n`);
|
|
353
|
+
return null;
|
|
354
|
+
}
|
|
355
|
+
if (tok.startsWith('--')) {
|
|
356
|
+
let name = tok;
|
|
357
|
+
let inlineValue: string | null = null;
|
|
358
|
+
const eq = tok.indexOf('=');
|
|
359
|
+
if (eq !== -1) {
|
|
360
|
+
name = tok.slice(0, eq);
|
|
361
|
+
inlineValue = tok.slice(eq + 1);
|
|
362
|
+
}
|
|
363
|
+
const resolved = _resolveLong(name);
|
|
364
|
+
if (resolved === 'help') {
|
|
365
|
+
process.stdout.write(`${_usage()}\n`);
|
|
366
|
+
return null;
|
|
367
|
+
}
|
|
368
|
+
if (resolved.takesValue) {
|
|
369
|
+
if (inlineValue !== null) {
|
|
370
|
+
args.destination = inlineValue;
|
|
371
|
+
} else {
|
|
372
|
+
const next = argv[i + 1];
|
|
373
|
+
if (next === undefined) {
|
|
374
|
+
_argErr(`argument ${resolved.flag}: expected one argument`);
|
|
375
|
+
}
|
|
376
|
+
args.destination = next as string;
|
|
377
|
+
i += 1;
|
|
378
|
+
}
|
|
379
|
+
} else {
|
|
380
|
+
if (inlineValue !== null) {
|
|
381
|
+
_argErr(`argument ${resolved.flag}: ignored explicit argument '${inlineValue}'`);
|
|
382
|
+
}
|
|
383
|
+
args.no_backup = true;
|
|
384
|
+
}
|
|
385
|
+
} else if (tok.startsWith('-') && tok !== '-') {
|
|
386
|
+
extras.push(tok);
|
|
387
|
+
} else if (!sawSource) {
|
|
388
|
+
args.source = tok;
|
|
389
|
+
sawSource = true;
|
|
390
|
+
positionals.push(tok);
|
|
391
|
+
} else {
|
|
392
|
+
extras.push(tok);
|
|
393
|
+
}
|
|
394
|
+
i += 1;
|
|
395
|
+
}
|
|
396
|
+
if (extras.length > 0) {
|
|
397
|
+
_argErr(`unrecognized arguments: ${extras.join(' ')}`);
|
|
398
|
+
}
|
|
399
|
+
return args;
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
// ── Path / filesystem parity helpers ─────────────────────────────────────
|
|
403
|
+
|
|
404
|
+
/** Python `Path.suffix` — the final dotted extension (incl. the dot), or "". */
|
|
405
|
+
function _suffix(p: string): string {
|
|
406
|
+
const base = path.basename(p);
|
|
407
|
+
const dot = base.lastIndexOf('.');
|
|
408
|
+
// Python: a leading dot (dotfile, no other dot) has no suffix.
|
|
409
|
+
if (dot <= 0) {
|
|
410
|
+
return '';
|
|
411
|
+
}
|
|
412
|
+
return base.slice(dot);
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
/** Python `Path.with_suffix(newSuffix)` — replace the final extension. */
|
|
416
|
+
function _with_suffix(p: string, newSuffix: string): string {
|
|
417
|
+
const dir = path.dirname(p);
|
|
418
|
+
const base = path.basename(p);
|
|
419
|
+
const cur = _suffix(p);
|
|
420
|
+
const stem = cur ? base.slice(0, base.length - cur.length) : base;
|
|
421
|
+
const joined = stem + newSuffix;
|
|
422
|
+
return dir === '.' && !p.includes('/') && !p.includes(path.sep) ? joined : path.join(dir, joined);
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
/** Python `Path.with_name(name)` — same directory, replaced basename. */
|
|
426
|
+
function _with_name(p: string, name: string): string {
|
|
427
|
+
const dir = path.dirname(p);
|
|
428
|
+
return dir === '.' && !p.includes('/') && !p.includes(path.sep) ? name : path.join(dir, name);
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
/** Python `Path.parent` — the containing directory. */
|
|
432
|
+
function _parent(p: string): string {
|
|
433
|
+
return path.dirname(p);
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
function _exists(p: string): boolean {
|
|
437
|
+
try {
|
|
438
|
+
fs.statSync(p);
|
|
439
|
+
return true;
|
|
440
|
+
} catch {
|
|
441
|
+
return false;
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
function _isFile(p: string): boolean {
|
|
446
|
+
try {
|
|
447
|
+
return fs.statSync(p).isFile();
|
|
448
|
+
} catch {
|
|
449
|
+
return false;
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
// ── Python-parity primitives (mirrors state_io.ts) ───────────────────────
|
|
454
|
+
|
|
455
|
+
/**
|
|
456
|
+
* Mirror Python `json.dumps(obj, indent=2, ensure_ascii=False)`.
|
|
457
|
+
*
|
|
458
|
+
* For round-tripped JSON, `JSON.stringify` with a 2-space indent matches
|
|
459
|
+
* CPython byte-for-byte: 2-space indent, `": "` key separator, `{}` / `[]`
|
|
460
|
+
* for empties, non-ASCII verbatim. Same rationale as `state_io.ts::_jsonDumps`:
|
|
461
|
+
* no float/int tag survives JSON parsing, so the CPython `N.0` divergence
|
|
462
|
+
* cannot arise here.
|
|
463
|
+
*/
|
|
464
|
+
function _jsonDumps(obj: Dict): string {
|
|
465
|
+
return JSON.stringify(obj, null, 2);
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
/** `dict.get(key, default)`. */
|
|
469
|
+
function _get(obj: Record<string, JsonValue>, key: string, dflt: unknown): unknown {
|
|
470
|
+
return key in obj ? obj[key] : dflt;
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
/** Python `isinstance(x, dict)` — plain object only (not array, not null). */
|
|
474
|
+
function _isPlainDict(value: unknown): boolean {
|
|
475
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
/** Python `type(x).__name__` for the JSON value shapes the messages emit. */
|
|
479
|
+
function _pyTypeName(value: unknown): string {
|
|
480
|
+
if (value === null || value === undefined) {
|
|
481
|
+
return 'NoneType';
|
|
482
|
+
}
|
|
483
|
+
if (Array.isArray(value)) {
|
|
484
|
+
return 'list';
|
|
485
|
+
}
|
|
486
|
+
switch (typeof value) {
|
|
487
|
+
case 'string':
|
|
488
|
+
return 'str';
|
|
489
|
+
case 'boolean':
|
|
490
|
+
return 'bool';
|
|
491
|
+
case 'number':
|
|
492
|
+
return Number.isInteger(value) ? 'int' : 'float';
|
|
493
|
+
case 'object':
|
|
494
|
+
return 'dict';
|
|
495
|
+
default:
|
|
496
|
+
return typeof value;
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
/** Python `repr(x)` for the scalar shapes interpolated via `{value!r}`. */
|
|
501
|
+
function _pyRepr(value: unknown): string {
|
|
502
|
+
if (value === null || value === undefined) {
|
|
503
|
+
return 'None';
|
|
504
|
+
}
|
|
505
|
+
if (value === true) {
|
|
506
|
+
return 'True';
|
|
507
|
+
}
|
|
508
|
+
if (value === false) {
|
|
509
|
+
return 'False';
|
|
510
|
+
}
|
|
511
|
+
if (typeof value === 'string') {
|
|
512
|
+
return `'${value.replace(/\\/g, '\\\\').replace(/'/g, "\\'")}'`;
|
|
513
|
+
}
|
|
514
|
+
return String(value);
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
/** Python `repr(list_of_str)` — `['a', 'b']`. */
|
|
518
|
+
function _pyReprList(values: string[]): string {
|
|
519
|
+
return '[' + values.map((v) => _pyRepr(v)).join(', ') + ']';
|
|
520
|
+
}
|
|
521
|
+
|
|
522
|
+
/** Python `sorted(list_of_str)` — code-point ascending. */
|
|
523
|
+
function _sortedStr(values: string[]): string[] {
|
|
524
|
+
return [...values].sort((a, b) => (a < b ? -1 : a > b ? 1 : 0));
|
|
525
|
+
}
|
|
526
|
+
|
|
527
|
+
// `python3 -m work_engine.migration.v0_to_v1` parity: run main() when invoked
|
|
528
|
+
// directly. tsx sets `import.meta.url` to the entry file URL.
|
|
529
|
+
if (import.meta.url === `file://${process.argv[1]}`) {
|
|
530
|
+
main();
|
|
531
|
+
}
|