@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,161 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Transaction log — Phase A4 (council Finding #18).
|
|
3
|
+
*
|
|
4
|
+
* Append-only JSONL at `getLogPath()` (`~/.event4u/agent-config/install-log.jsonl`).
|
|
5
|
+
* Each successful atomic write appends one entry; recovery on crash is
|
|
6
|
+
* `tail -n` + reverse-apply. No PID lockfile (per Phase-A4 decision 8).
|
|
7
|
+
*
|
|
8
|
+
* Rotation: 10 MB OR 30 days, whichever first. Rotated copies move to
|
|
9
|
+
* `install-log.<ISO>.jsonl.gz` siblings; recovery never scans them.
|
|
10
|
+
*
|
|
11
|
+
* Recovery cap: at most the **last 500 entries** of the active log are
|
|
12
|
+
* scanned. Older incomplete tails are treated as abandoned and surfaced
|
|
13
|
+
* to the wizard as "previous run aborted; ignoring".
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import { createGzip } from 'node:zlib';
|
|
17
|
+
import { createReadStream, createWriteStream, existsSync, readFileSync, renameSync, statSync, unlinkSync } from 'node:fs';
|
|
18
|
+
import { dirname } from 'node:path';
|
|
19
|
+
import { pipeline } from 'node:stream/promises';
|
|
20
|
+
|
|
21
|
+
import { atomicAppendLine } from './atomic.js';
|
|
22
|
+
|
|
23
|
+
/** Rotate the active log when it reaches this size (council Finding #18). */
|
|
24
|
+
export const ROTATION_MAX_BYTES = 10 * 1024 * 1024;
|
|
25
|
+
|
|
26
|
+
/** Rotate the active log when its first entry is older than this (ms). */
|
|
27
|
+
export const ROTATION_MAX_AGE_MS = 30 * 24 * 60 * 60 * 1000;
|
|
28
|
+
|
|
29
|
+
/** Recovery scans at most the last N entries of the active log. */
|
|
30
|
+
export const RECOVERY_DEPTH_CAP = 500;
|
|
31
|
+
|
|
32
|
+
/** Per-event shape written as one JSONL line. */
|
|
33
|
+
export interface TxLogEntry {
|
|
34
|
+
/** ISO-8601 UTC timestamp of the event. */
|
|
35
|
+
readonly ts: string;
|
|
36
|
+
/** Event kind \u2014 `write` is the only success path; `abort` flags client disconnect. */
|
|
37
|
+
readonly kind: 'write' | 'skip' | 'abort' | 'rollback';
|
|
38
|
+
/** Absolute target path the entry refers to. */
|
|
39
|
+
readonly path: string;
|
|
40
|
+
/** SHA-256 of the bytes written (null for skip/abort/rollback). */
|
|
41
|
+
readonly sha256: string | null;
|
|
42
|
+
/** Optional free-form note (e.g. abort reason). */
|
|
43
|
+
readonly note?: string;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/** Append one entry to the active log, rotating first if thresholds tripped. */
|
|
47
|
+
export function appendTxLog(logPath: string, entry: TxLogEntry): void {
|
|
48
|
+
if (shouldRotate(logPath)) {
|
|
49
|
+
rotateLogSync(logPath);
|
|
50
|
+
}
|
|
51
|
+
atomicAppendLine(logPath, JSON.stringify(entry));
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Read at most the last {@link RECOVERY_DEPTH_CAP} entries from the active log.
|
|
56
|
+
*
|
|
57
|
+
* Returns entries in chronological order (oldest of the tail first).
|
|
58
|
+
* Malformed lines are dropped silently \u2014 partial-write tails should not
|
|
59
|
+
* crash recovery.
|
|
60
|
+
*/
|
|
61
|
+
export function readRecentEntries(logPath: string): readonly TxLogEntry[] {
|
|
62
|
+
if (!existsSync(logPath)) {
|
|
63
|
+
return [];
|
|
64
|
+
}
|
|
65
|
+
const raw = readFileSync(logPath, 'utf8');
|
|
66
|
+
const lines = raw.split('\n').filter((l) => l.length > 0);
|
|
67
|
+
const tail = lines.slice(-RECOVERY_DEPTH_CAP);
|
|
68
|
+
const out: TxLogEntry[] = [];
|
|
69
|
+
for (const line of tail) {
|
|
70
|
+
const parsed = tryParseEntry(line);
|
|
71
|
+
if (parsed !== null) {
|
|
72
|
+
out.push(parsed);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return out;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* True when the active log breaches one of the rotation thresholds.
|
|
80
|
+
*
|
|
81
|
+
* Size threshold trips on byte-count alone; age threshold reads the
|
|
82
|
+
* first line and compares its `ts` against `now`.
|
|
83
|
+
*/
|
|
84
|
+
export function shouldRotate(logPath: string, now: Date = new Date()): boolean {
|
|
85
|
+
if (!existsSync(logPath)) {
|
|
86
|
+
return false;
|
|
87
|
+
}
|
|
88
|
+
let size = 0;
|
|
89
|
+
try {
|
|
90
|
+
size = statSync(logPath).size;
|
|
91
|
+
} catch {
|
|
92
|
+
return false;
|
|
93
|
+
}
|
|
94
|
+
if (size >= ROTATION_MAX_BYTES) {
|
|
95
|
+
return true;
|
|
96
|
+
}
|
|
97
|
+
const firstTs = readFirstTimestamp(logPath);
|
|
98
|
+
if (firstTs === null) {
|
|
99
|
+
return false;
|
|
100
|
+
}
|
|
101
|
+
return now.getTime() - firstTs >= ROTATION_MAX_AGE_MS;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Rotate the active log to `install-log.<ISO>.jsonl.gz` and remove the original.
|
|
106
|
+
*
|
|
107
|
+
* Sync wrapper around the async gzip pipeline so callers stay sequential.
|
|
108
|
+
* `appendTxLog` blocks on this \u2014 acceptable: rotations are rare (10 MB
|
|
109
|
+
* or 30 days) and the gzip is fire-and-forget afterwards.
|
|
110
|
+
*/
|
|
111
|
+
export function rotateLogSync(logPath: string): void {
|
|
112
|
+
if (!existsSync(logPath)) {
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
const stamp = new Date().toISOString().replace(/[:.]/g, '-');
|
|
116
|
+
const rotated = logPath.replace(/\.jsonl$/, `.${stamp}.jsonl`);
|
|
117
|
+
renameSync(logPath, rotated);
|
|
118
|
+
// Best-effort gzip in the background; failure is non-fatal because
|
|
119
|
+
// the rotated `.jsonl` is already a valid recovery artefact.
|
|
120
|
+
void gzipInPlace(rotated).catch(() => {});
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
async function gzipInPlace(source: string): Promise<void> {
|
|
124
|
+
const target = `${source}.gz`;
|
|
125
|
+
await pipeline(createReadStream(source), createGzip(), createWriteStream(target));
|
|
126
|
+
try {
|
|
127
|
+
unlinkSync(source);
|
|
128
|
+
} catch {
|
|
129
|
+
/* swallow \u2014 gzip succeeded, leak is acceptable */
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
function readFirstTimestamp(logPath: string): number | null {
|
|
134
|
+
try {
|
|
135
|
+
const raw = readFileSync(logPath, 'utf8');
|
|
136
|
+
const firstLine = raw.split('\n', 1)[0] ?? '';
|
|
137
|
+
const parsed = tryParseEntry(firstLine);
|
|
138
|
+
if (parsed === null) return null;
|
|
139
|
+
const t = Date.parse(parsed.ts);
|
|
140
|
+
return Number.isFinite(t) ? t : null;
|
|
141
|
+
} catch {
|
|
142
|
+
return null;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
function tryParseEntry(line: string): TxLogEntry | null {
|
|
147
|
+
try {
|
|
148
|
+
const obj = JSON.parse(line) as Partial<TxLogEntry>;
|
|
149
|
+
if (typeof obj.ts !== 'string' || typeof obj.kind !== 'string' || typeof obj.path !== 'string') {
|
|
150
|
+
return null;
|
|
151
|
+
}
|
|
152
|
+
return obj as TxLogEntry;
|
|
153
|
+
} catch {
|
|
154
|
+
return null;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/** Resolve the directory holding `logPath` \u2014 helper for callers (apply.ts). */
|
|
159
|
+
export function txLogDir(logPath: string): string {
|
|
160
|
+
return dirname(logPath);
|
|
161
|
+
}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core types for the unified TypeScript install engine (v4.0.0).
|
|
3
|
+
*
|
|
4
|
+
* Mirrors the on-disk schema used by the legacy Python installer
|
|
5
|
+
* (`scripts/install.py`) so the v4 engine reads/writes the same
|
|
6
|
+
* `~/.event4u/agent-config/` tree and v2 manifest entries without a
|
|
7
|
+
* migration step.
|
|
8
|
+
*
|
|
9
|
+
* Phase A1 — foundation. Sub-types referenced by `detect`, `plan`,
|
|
10
|
+
* apply, and conflict-resolution modules. Pure types, no runtime
|
|
11
|
+
* dependencies.
|
|
12
|
+
*
|
|
13
|
+
* Reference: `scripts/install.py`
|
|
14
|
+
* - `_file_entry()` → {@link FileEntry}
|
|
15
|
+
* - `class ConflictPolicy` → {@link ConflictPolicy}
|
|
16
|
+
* - v2 manifest `files_by_tool` → {@link InstallPlan.filesByTool}
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Where the install lands.
|
|
21
|
+
*
|
|
22
|
+
* - `global` — `~/.event4u/agent-config/` (user-scope, shared across projects).
|
|
23
|
+
* - `project` — the current project root (`.augment/`, `.claude/`, bridges).
|
|
24
|
+
*
|
|
25
|
+
* The Python script uses the `scope` string ("global" | "project") for the
|
|
26
|
+
* same distinction; this enum is the TS-side equivalent.
|
|
27
|
+
*/
|
|
28
|
+
export type InstallTarget = 'global' | 'project';
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Kind of file recorded in a v2 `files[]` manifest entry.
|
|
32
|
+
*
|
|
33
|
+
* Matches the literal string values produced by `_file_entry()` in the
|
|
34
|
+
* Python installer so a v3 manifest round-trips through the v4 engine
|
|
35
|
+
* without rewriting on-disk records.
|
|
36
|
+
*
|
|
37
|
+
* - `deployed` — content we own bytes-for-bytes (hash recorded).
|
|
38
|
+
* - `marker` — content we own at a known marker path (hash recorded).
|
|
39
|
+
* - `bridge` — pointer to a foreign tool's config (no hash; we do not own bytes).
|
|
40
|
+
*/
|
|
41
|
+
export type FileKind = 'deployed' | 'marker' | 'bridge';
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* One file the install plan will touch.
|
|
45
|
+
*
|
|
46
|
+
* Mirrors the dict produced by `_file_entry(path, kind, hash_content=...)`
|
|
47
|
+
* in `scripts/install.py:2744`. `sha256` is `null` for bridges (we do
|
|
48
|
+
* not own the bytes) and a hex digest for deployed/marker files.
|
|
49
|
+
*
|
|
50
|
+
* `path` is the absolute target path on disk — the v2 manifest is
|
|
51
|
+
* path-only at the wire level because user-scope files are not under
|
|
52
|
+
* `project_root`.
|
|
53
|
+
*/
|
|
54
|
+
export interface FileEntry {
|
|
55
|
+
/** Absolute target path on disk. */
|
|
56
|
+
readonly path: string;
|
|
57
|
+
/** What kind of file this is — drives hash and conflict policy. */
|
|
58
|
+
readonly kind: FileKind;
|
|
59
|
+
/** SHA-256 hex digest, or `null` for bridges. */
|
|
60
|
+
readonly sha256: string | null;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* How to resolve a file collision.
|
|
65
|
+
*
|
|
66
|
+
* Per Phase A5 of the unified-setup roadmap: three modes only.
|
|
67
|
+
*
|
|
68
|
+
* - `skip` — leave the existing file untouched (default safe behaviour).
|
|
69
|
+
* - `overwrite` — replace the existing file with the planned content.
|
|
70
|
+
* - `surface-to-ui` — defer to the wizard's conflict screen (Phase B3).
|
|
71
|
+
*
|
|
72
|
+
* The CLI `--force-overwrite` flag is the headless mapping for `overwrite`.
|
|
73
|
+
*/
|
|
74
|
+
export type ConflictStrategy = 'skip' | 'overwrite' | 'surface-to-ui';
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Per-install conflict resolution policy.
|
|
78
|
+
*
|
|
79
|
+
* 1:1 mirror of `class ConflictPolicy` in `scripts/install.py:169`.
|
|
80
|
+
*
|
|
81
|
+
* - `force` — true when `--force-overwrite` was passed OR the
|
|
82
|
+
* `AGENT_CONFIG_ALLOW_OVERWRITE=1` env var is set.
|
|
83
|
+
* - `interactive` — true when both stdin and stdout are TTYs.
|
|
84
|
+
* - `knownPaths` — absolute paths the manifest already records as ours.
|
|
85
|
+
* A target at a known path is not a foreign collision.
|
|
86
|
+
* - `knownPointers` — `(fileLabel, jsonPointer)` pairs we previously
|
|
87
|
+
* merged into shared JSON files; anything else found
|
|
88
|
+
* in a shared JSON is a foreign merge collision.
|
|
89
|
+
* - `defaultStrategy` — fallback when no UI is available.
|
|
90
|
+
*/
|
|
91
|
+
export interface ConflictPolicy {
|
|
92
|
+
readonly force: boolean;
|
|
93
|
+
readonly interactive: boolean;
|
|
94
|
+
readonly knownPaths: ReadonlySet<string>;
|
|
95
|
+
readonly knownPointers: ReadonlySet<string>;
|
|
96
|
+
readonly defaultStrategy: ConflictStrategy;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* The declarative install plan.
|
|
101
|
+
*
|
|
102
|
+
* Built once by the planner; the applier never recomputes paths from
|
|
103
|
+
* the plan. Empty plans render the wizard's "nothing to do" screen.
|
|
104
|
+
*
|
|
105
|
+
* `filesByTool` matches the v2 manifest's `{tool_id: [files[]]}` shape
|
|
106
|
+
* produced by `_files_by_tool_from_deploy` / `_files_by_tool_from_bridges`
|
|
107
|
+
* in the Python installer.
|
|
108
|
+
*
|
|
109
|
+
* `mergedKeysByTool` records JSON deep-merge pointers (Phase A5) so the
|
|
110
|
+
* conflict policy can distinguish ours-vs-foreign on later runs.
|
|
111
|
+
*/
|
|
112
|
+
export interface InstallPlan {
|
|
113
|
+
/** Plan schema version — bump on breaking shape change. */
|
|
114
|
+
readonly version: 2;
|
|
115
|
+
/** Where this plan lands (global vs project scope). */
|
|
116
|
+
readonly target: InstallTarget;
|
|
117
|
+
/** Absolute root for all relative paths in this plan. */
|
|
118
|
+
readonly root: string;
|
|
119
|
+
/** Per-tool file inventory; empty list means "nothing to write for this tool". */
|
|
120
|
+
readonly filesByTool: Readonly<Record<string, ReadonlyArray<FileEntry>>>;
|
|
121
|
+
/** Per-tool JSON-pointer inventory for deep-merged files (Phase A5). */
|
|
122
|
+
readonly mergedKeysByTool: Readonly<Record<string, ReadonlyArray<{ file: string; pointer: string }>>>;
|
|
123
|
+
/** Conflict policy active for this plan. */
|
|
124
|
+
readonly policy: ConflictPolicy;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* One foreign collision discovered at plan time.
|
|
129
|
+
*
|
|
130
|
+
* Phase B3 — surfaced by the `/api/v1/install/plan` route so the wizard's
|
|
131
|
+
* conflict screen can render single-pick / batch-resolution UI **before**
|
|
132
|
+
* the apply phase opens the transaction log. A `ConflictEntry` means the
|
|
133
|
+
* target exists, its bytes do not match the planned SHA, it is not in
|
|
134
|
+
* `policy.knownPaths`, and `policy.force` is false — i.e. the policy
|
|
135
|
+
* would surface this file to the UI during apply.
|
|
136
|
+
*
|
|
137
|
+
* `mergeable` is `true` only for `.json` deployed files; the wizard
|
|
138
|
+
* shows the per-row `merge` button only on those. `existingSha256` is
|
|
139
|
+
* the on-disk hash so the UI can render byte-equality hints when the
|
|
140
|
+
* user toggles overwrite-vs-merge.
|
|
141
|
+
*/
|
|
142
|
+
export interface ConflictEntry {
|
|
143
|
+
readonly path: string;
|
|
144
|
+
readonly kind: FileKind;
|
|
145
|
+
readonly plannedSha256: string | null;
|
|
146
|
+
readonly existingSha256: string | null;
|
|
147
|
+
readonly mergeable: boolean;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* Per-file resolution chosen by the wizard's conflict screen.
|
|
152
|
+
*
|
|
153
|
+
* - `skip` — leave the existing file untouched.
|
|
154
|
+
* - `overwrite` — replace the existing file with planned bytes verbatim.
|
|
155
|
+
* - `merge` — JSON deep-merge planned bytes into the existing file.
|
|
156
|
+
*
|
|
157
|
+
* `merge` is only valid for entries with `mergeable: true`; the apply
|
|
158
|
+
* layer falls back to `overwrite` if the caller picks `merge` on a
|
|
159
|
+
* non-JSON target rather than failing the entire plan.
|
|
160
|
+
*/
|
|
161
|
+
export type ConflictResolution = 'skip' | 'overwrite' | 'merge';
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* Result of applying an {@link InstallPlan}.
|
|
165
|
+
*
|
|
166
|
+
* Surfaced to the wizard's progress bar (Phase B1) and recorded in the
|
|
167
|
+
* transaction log (Phase A4) so recovery can reverse-apply on crash.
|
|
168
|
+
*/
|
|
169
|
+
export interface ApplyResult {
|
|
170
|
+
readonly target: InstallTarget;
|
|
171
|
+
readonly written: ReadonlyArray<FileEntry>;
|
|
172
|
+
readonly skipped: ReadonlyArray<FileEntry>;
|
|
173
|
+
readonly conflicts: ReadonlyArray<FileEntry>;
|
|
174
|
+
readonly errors: ReadonlyArray<{ path: string; code: string; message: string }>;
|
|
175
|
+
}
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wizard-state → {@link PlanSource}[] translator — Phase B2.
|
|
3
|
+
*
|
|
4
|
+
* The Preact wizard collects high-level identifiers (tool IDs like
|
|
5
|
+
* `cursor` / `augment`, capability-pack IDs like `founder-mvp`) and is
|
|
6
|
+
* deliberately ignorant of filesystem layout. This module is the
|
|
7
|
+
* server-side bridge that expands those IDs into the low-level
|
|
8
|
+
* `(srcDir, destDir, toolId, kind)` tuples consumed by
|
|
9
|
+
* {@link buildInstallPlan}.
|
|
10
|
+
*
|
|
11
|
+
* Mirrors the canonical mapping tables in
|
|
12
|
+
* `scripts/install.py:2029-2222`:
|
|
13
|
+
* - {@link USER_SCOPE_PATHS} ← `USER_SCOPE_PATHS`
|
|
14
|
+
* - {@link GLOBAL_DEPLOY_SOURCES} ← `_CLAUDE_SKILL_BUNDLE` + `GLOBAL_DEPLOY_SOURCES`
|
|
15
|
+
*
|
|
16
|
+
* Packs are intentionally NOT in this table: they are settings overlays
|
|
17
|
+
* (`packs/*.yml`), not file deployments. The 2PC settings write owns
|
|
18
|
+
* pack activation; the install plan only carries tool content.
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
import { homedir } from 'node:os';
|
|
22
|
+
import { isAbsolute, join, resolve } from 'node:path';
|
|
23
|
+
|
|
24
|
+
import type { ConflictPolicy, InstallPlan, InstallTarget } from './types.js';
|
|
25
|
+
import { buildInstallPlan, type PlanSource } from './plan.js';
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Per-tool user-scope anchor directory, mirrored 1:1 from
|
|
29
|
+
* `scripts/install.py:USER_SCOPE_PATHS`. Values may use `~` for the
|
|
30
|
+
* user's home directory; {@link expandAnchor} resolves it server-side.
|
|
31
|
+
*
|
|
32
|
+
* Tools without a user-scope directory convention (e.g. `claude-desktop`
|
|
33
|
+
* which writes a single marker file, or `aider` which writes a single
|
|
34
|
+
* YAML file) are still listed so the wizard's bridge logic in Phase A6
|
|
35
|
+
* can resolve them via {@link expandAnchor} when needed.
|
|
36
|
+
*/
|
|
37
|
+
export const USER_SCOPE_PATHS: Readonly<Record<string, string>> = {
|
|
38
|
+
'claude-code': '~/.claude/',
|
|
39
|
+
'claude-desktop': '~/Library/Application Support/Claude/',
|
|
40
|
+
cursor: '~/.cursor/',
|
|
41
|
+
windsurf: '~/.codeium/windsurf/',
|
|
42
|
+
cline: '~/Documents/Cline/Rules/',
|
|
43
|
+
'gemini-cli': '~/.gemini/',
|
|
44
|
+
copilot: '~/.copilot/',
|
|
45
|
+
augment: '~/.augment/',
|
|
46
|
+
aider: '~/.aider.conf.yml',
|
|
47
|
+
codex: '~/.codex/',
|
|
48
|
+
roocode: '~/.roo/',
|
|
49
|
+
continue: '~/.continue/',
|
|
50
|
+
kilocode: '~/.kilocode/',
|
|
51
|
+
zed: '~/.config/zed/',
|
|
52
|
+
jetbrains: '~/.config/JetBrains/',
|
|
53
|
+
kiro: '~/.kiro/',
|
|
54
|
+
qoder: '~/.qoder/',
|
|
55
|
+
opencode: '~/.opencode/',
|
|
56
|
+
trae: '~/.trae/',
|
|
57
|
+
antigravity: '~/.agents/',
|
|
58
|
+
codebuddy: '~/.codebuddy/',
|
|
59
|
+
droid: '~/.factory/',
|
|
60
|
+
warp: '~/.warp/',
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Universal Anthropic-shaped skill bundle deployed to markdown-skills
|
|
65
|
+
* tools. Mirrors `_CLAUDE_SKILL_BUNDLE` in `scripts/install.py`.
|
|
66
|
+
*/
|
|
67
|
+
const CLAUDE_SKILL_BUNDLE: ReadonlyArray<readonly [string, string]> = [
|
|
68
|
+
['dist/agent-src/rules', 'rules'],
|
|
69
|
+
['dist/agent-src/skills', 'skills'],
|
|
70
|
+
// Commands ship to ~/.claude/commands/ — native Claude Code slash-
|
|
71
|
+
// command surface. Verified empirically 2026-05-28: rich frontmatter
|
|
72
|
+
// (disable-model-invocation, custom fields) tolerated; nested
|
|
73
|
+
// subdirs route as `/<cluster>:<sub>`. Council session 2026-05-28
|
|
74
|
+
// converged on Option B (native slash-only) — see
|
|
75
|
+
// agents/runtime/council/responses/claude-code-distribution.json
|
|
76
|
+
// and scripts/install.py:_CLAUDE_SKILL_BUNDLE for the Python mirror.
|
|
77
|
+
['dist/agent-src/commands', 'commands'],
|
|
78
|
+
['dist/agent-src/personas', 'personas'],
|
|
79
|
+
];
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Per-tool content deployment plan for `--global` installs. Each entry
|
|
83
|
+
* is a list of `(packageSrcRelative, destSubpath)` pairs.
|
|
84
|
+
*
|
|
85
|
+
* `packageSrcRelative` resolves against the agent-config package root;
|
|
86
|
+
* `destSubpath` is appended to `USER_SCOPE_PATHS[toolId]` (expanded).
|
|
87
|
+
*
|
|
88
|
+
* Mirrors `GLOBAL_DEPLOY_SOURCES` in `scripts/install.py:2178-2222`.
|
|
89
|
+
* Tools absent from this map have no deployable content in global scope
|
|
90
|
+
* — they either follow a marker-only convention (handled by bridges in
|
|
91
|
+
* Phase A6) or have no markdown convention at all.
|
|
92
|
+
*/
|
|
93
|
+
export const GLOBAL_DEPLOY_SOURCES: Readonly<Record<string, ReadonlyArray<readonly [string, string]>>> = {
|
|
94
|
+
'claude-code': CLAUDE_SKILL_BUNDLE,
|
|
95
|
+
augment: [
|
|
96
|
+
['dist/agent-src/rules', 'rules'],
|
|
97
|
+
['dist/agent-src/skills', 'skills'],
|
|
98
|
+
['dist/agent-src/commands', 'commands'],
|
|
99
|
+
['dist/agent-src/contexts', 'contexts'],
|
|
100
|
+
['dist/agent-src/personas', 'personas'],
|
|
101
|
+
['dist/agent-src/templates', 'templates'],
|
|
102
|
+
],
|
|
103
|
+
cursor: [
|
|
104
|
+
['dist/agent-src/rules', 'rules'],
|
|
105
|
+
['dist/agent-src/commands', 'commands'],
|
|
106
|
+
['dist/agent-src/personas', 'personas'],
|
|
107
|
+
],
|
|
108
|
+
windsurf: [
|
|
109
|
+
['dist/agent-src/rules', 'rules'],
|
|
110
|
+
],
|
|
111
|
+
cline: [
|
|
112
|
+
['dist/agent-src/rules', ''],
|
|
113
|
+
],
|
|
114
|
+
'gemini-cli': CLAUDE_SKILL_BUNDLE,
|
|
115
|
+
codex: CLAUDE_SKILL_BUNDLE,
|
|
116
|
+
continue: CLAUDE_SKILL_BUNDLE,
|
|
117
|
+
roocode: CLAUDE_SKILL_BUNDLE,
|
|
118
|
+
kilocode: CLAUDE_SKILL_BUNDLE,
|
|
119
|
+
qoder: CLAUDE_SKILL_BUNDLE,
|
|
120
|
+
opencode: CLAUDE_SKILL_BUNDLE,
|
|
121
|
+
trae: CLAUDE_SKILL_BUNDLE,
|
|
122
|
+
antigravity: CLAUDE_SKILL_BUNDLE,
|
|
123
|
+
codebuddy: CLAUDE_SKILL_BUNDLE,
|
|
124
|
+
droid: CLAUDE_SKILL_BUNDLE,
|
|
125
|
+
warp: CLAUDE_SKILL_BUNDLE,
|
|
126
|
+
kiro: [
|
|
127
|
+
['dist/agent-src/rules', 'rules'],
|
|
128
|
+
['dist/agent-src/skills', 'steering'],
|
|
129
|
+
['dist/agent-src/personas', 'personas'],
|
|
130
|
+
],
|
|
131
|
+
};
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Resolve a `~/...` anchor against the user's home directory.
|
|
135
|
+
*
|
|
136
|
+
* Absolute paths (no `~` prefix) pass through unchanged. Empty string
|
|
137
|
+
* returns the home directory itself. Mirrors Python's `os.path.expanduser`.
|
|
138
|
+
*/
|
|
139
|
+
export function expandAnchor(anchor: string, home?: string): string {
|
|
140
|
+
const h = home ?? homedir();
|
|
141
|
+
if (anchor === '~') return h;
|
|
142
|
+
if (anchor.startsWith('~/')) return join(h, anchor.slice(2));
|
|
143
|
+
if (isAbsolute(anchor)) return anchor;
|
|
144
|
+
return resolve(anchor);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/** Inputs to {@link expandWizardSources}. */
|
|
148
|
+
export interface WizardExpandInputs {
|
|
149
|
+
/** Stable tool IDs selected by the user in the wizard. */
|
|
150
|
+
readonly toolIds: ReadonlyArray<string>;
|
|
151
|
+
/** Absolute path to the agent-config package root (source of `dist/agent-src/`). */
|
|
152
|
+
readonly packageRoot: string;
|
|
153
|
+
/** Override for the user's home directory (tests only). */
|
|
154
|
+
readonly home?: string;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Expand the wizard's `toolIds` selection into a flat list of
|
|
159
|
+
* {@link PlanSource} tuples for the global install target.
|
|
160
|
+
*
|
|
161
|
+
* For each tool ID present in {@link GLOBAL_DEPLOY_SOURCES}, emit one
|
|
162
|
+
* `PlanSource` per `(packageSrcRelative, destSubpath)` pair, with:
|
|
163
|
+
* - `srcDir` = `packageRoot/packageSrcRelative`
|
|
164
|
+
* - `destDir` = `expandAnchor(USER_SCOPE_PATHS[toolId])/destSubpath`
|
|
165
|
+
* - `kind` = `'deployed'` (we own these bytes)
|
|
166
|
+
*
|
|
167
|
+
* Tool IDs absent from {@link GLOBAL_DEPLOY_SOURCES} contribute zero
|
|
168
|
+
* sources — they are either marker-only (Phase A6 bridges handle them)
|
|
169
|
+
* or have no markdown convention. Unknown tool IDs (not in any map) are
|
|
170
|
+
* silently ignored — the detect/plan layer is the gatekeeper for
|
|
171
|
+
* enable/disable, not this expander.
|
|
172
|
+
*/
|
|
173
|
+
export function expandWizardSources(inputs: WizardExpandInputs): PlanSource[] {
|
|
174
|
+
const { toolIds, packageRoot, home } = inputs;
|
|
175
|
+
const out: PlanSource[] = [];
|
|
176
|
+
for (const toolId of toolIds) {
|
|
177
|
+
const deploy = GLOBAL_DEPLOY_SOURCES[toolId];
|
|
178
|
+
const anchor = USER_SCOPE_PATHS[toolId];
|
|
179
|
+
if (!deploy || !anchor) continue;
|
|
180
|
+
const destRoot = expandAnchor(anchor, home);
|
|
181
|
+
for (const [srcRel, destSub] of deploy) {
|
|
182
|
+
const srcDir = join(packageRoot, srcRel);
|
|
183
|
+
const destDir = destSub.length === 0 ? destRoot : join(destRoot, destSub);
|
|
184
|
+
out.push({ toolId, srcDir, destDir, kind: 'deployed' });
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
return out;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/** Inputs to {@link buildPlanFromWizard}. */
|
|
191
|
+
export interface WizardPlanInputs extends WizardExpandInputs {
|
|
192
|
+
/** Install target. Wizard always emits `global` today; reserved for future project-scope. */
|
|
193
|
+
readonly target: InstallTarget;
|
|
194
|
+
/** Absolute install root anchor passed through to {@link InstallPlan.root}. */
|
|
195
|
+
readonly root: string;
|
|
196
|
+
/** Conflict policy active for this run. */
|
|
197
|
+
readonly policy: ConflictPolicy;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
/**
|
|
201
|
+
* Build an {@link InstallPlan} directly from a wizard selection.
|
|
202
|
+
*
|
|
203
|
+
* Thin convenience over {@link expandWizardSources} +
|
|
204
|
+
* {@link buildInstallPlan}. Returns an empty-`filesByTool` plan when
|
|
205
|
+
* the selection contains zero deployable tool IDs — the wizard renders
|
|
206
|
+
* the "nothing to do" screen on that shape.
|
|
207
|
+
*/
|
|
208
|
+
export function buildPlanFromWizard(inputs: WizardPlanInputs): InstallPlan {
|
|
209
|
+
const sources = expandWizardSources(inputs);
|
|
210
|
+
return buildInstallPlan({
|
|
211
|
+
target: inputs.target,
|
|
212
|
+
root: inputs.root,
|
|
213
|
+
sources,
|
|
214
|
+
policy: inputs.policy,
|
|
215
|
+
});
|
|
216
|
+
}
|
|
@@ -250,6 +250,37 @@ export interface MainOptions {
|
|
|
250
250
|
err?: OutSink;
|
|
251
251
|
}
|
|
252
252
|
|
|
253
|
+
/**
|
|
254
|
+
* Live-session notice for reaped Claude Code plugin caches — or null when no
|
|
255
|
+
* reap touched `~/.claude/plugins/`.
|
|
256
|
+
*
|
|
257
|
+
* Removing an installed plugin's cache does NOT reach into Claude Code
|
|
258
|
+
* sessions that are already running: they registered the plugin's hooks at
|
|
259
|
+
* session start and keep firing them, so every subsequent event logs
|
|
260
|
+
* `Failed to run: Plugin directory does not exist: …/plugins/cache/… — run
|
|
261
|
+
* /plugin to reinstall` until the session restarts. Claude Code's own
|
|
262
|
+
* `/plugin to reinstall` hint would recreate exactly the duplicate surface
|
|
263
|
+
* converge just removed — the correct remedy is a restart, so converge says
|
|
264
|
+
* so explicitly (road-to-truth-and-reference-hygiene follow-up, 2026-07-08).
|
|
265
|
+
*/
|
|
266
|
+
export function live_session_notice(executed_reaps: readonly string[]): string | null {
|
|
267
|
+
const hit = executed_reaps.some((r) => r.startsWith('~/.claude/plugins/'));
|
|
268
|
+
if (!hit) {
|
|
269
|
+
return null;
|
|
270
|
+
}
|
|
271
|
+
return (
|
|
272
|
+
'⚠️ Live-session note: Claude Code sessions that were ALREADY RUNNING still\n' +
|
|
273
|
+
' hold the removed plugin\'s hook registrations. Until you restart them,\n' +
|
|
274
|
+
' every event logs a non-blocking\n' +
|
|
275
|
+
' "Failed to run: Plugin directory does not exist: …/plugins/cache/…"\n' +
|
|
276
|
+
' error. This is cosmetic for new sessions but means the affected LIVE\n' +
|
|
277
|
+
' session\'s plugin-sourced hooks no longer run — restart Claude Code\n' +
|
|
278
|
+
' sessions to clear it. Do NOT follow the error\'s "/plugin to reinstall"\n' +
|
|
279
|
+
' hint: reinstalling recreates the duplicate surface converge just removed\n' +
|
|
280
|
+
' (the ~/.claude/ file projection already carries content AND hooks).'
|
|
281
|
+
);
|
|
282
|
+
}
|
|
283
|
+
|
|
253
284
|
export function main(argv: string[] | null = null, opts: MainOptions = {}): number {
|
|
254
285
|
let args: Args;
|
|
255
286
|
try {
|
|
@@ -329,6 +360,7 @@ export function main(argv: string[] | null = null, opts: MainOptions = {}): numb
|
|
|
329
360
|
// Perform the cleanup — matrix-declared actions ONLY.
|
|
330
361
|
let failures = 0;
|
|
331
362
|
const report: string[] = [];
|
|
363
|
+
const executed_reaps: string[] = [];
|
|
332
364
|
for (const f of findings) {
|
|
333
365
|
if (f.command) {
|
|
334
366
|
_print(out, `→ ${f.command}`);
|
|
@@ -351,6 +383,7 @@ export function main(argv: string[] | null = null, opts: MainOptions = {}): numb
|
|
|
351
383
|
try {
|
|
352
384
|
fs.rmSync(abs, { recursive: true, force: true });
|
|
353
385
|
report.push(`${f.tool}: reaped package-tagged orphan \`${reap}\``);
|
|
386
|
+
executed_reaps.push(reap);
|
|
354
387
|
_print(out, `→ reaped ${reap}`);
|
|
355
388
|
} catch (e) {
|
|
356
389
|
failures += 1;
|
|
@@ -367,6 +400,11 @@ export function main(argv: string[] | null = null, opts: MainOptions = {}): numb
|
|
|
367
400
|
if (report.length === 0) {
|
|
368
401
|
_print(out, ' (no actions completed)');
|
|
369
402
|
}
|
|
403
|
+
const notice = live_session_notice(executed_reaps);
|
|
404
|
+
if (notice !== null) {
|
|
405
|
+
_print(out);
|
|
406
|
+
_print(out, notice);
|
|
407
|
+
}
|
|
370
408
|
_print(
|
|
371
409
|
out,
|
|
372
410
|
'Rollback hint: a removed Claude Code plugin can be reinstalled with\n' +
|