@event4u/agent-config 16.1.0 → 16.3.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/.augment-plugin/marketplace.json +3 -3
- package/.augment-plugin/plugin.json +1 -1
- package/.claude-plugin/marketplace.json +1 -1
- package/CHANGELOG.md +98 -257
- package/README.md +14 -12
- package/dist/agent-src/commands/analyze/inbox.md +1 -1
- package/dist/agent-src/commands/analyze/roadmap-repos.md +1 -1
- package/dist/agent-src/commands/bug/fix.md +17 -2
- package/dist/agent-src/commands/feature/plan.md +1 -1
- package/dist/agent-src/commands/feature/roadmap.md +1 -1
- package/dist/agent-src/commands/fix/ci.md +1 -1
- package/dist/agent-src/commands/implement-ticket.md +1 -1
- package/dist/agent-src/commands/jira-ticket.md +1 -1
- package/dist/agent-src/commands/roadmap/create.md +1 -1
- package/dist/agent-src/commands/roadmap/materialize.md +1 -1
- package/dist/agent-src/commands/roadmap/process-full.md +5 -5
- package/dist/agent-src/commands/roadmap/resolve-blockers.md +361 -0
- package/dist/agent-src/commands/roadmap/triage-parked.md +325 -0
- package/dist/agent-src/commands/roadmap.md +18 -4
- package/dist/agent-src/commands/tests/create.md +17 -3
- package/dist/agent-src/commands/tests/execute.md +22 -5
- package/dist/agent-src/commands/work.md +4 -0
- package/dist/agent-src/contexts/authority/decision-revisit-gate-enforcement.md +43 -0
- package/dist/agent-src/contexts/communication/rules-auto/design-fidelity-enforcement.md +24 -0
- package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +6 -6
- package/dist/agent-src/contexts/execution/autonomy-mechanics.md +4 -8
- package/dist/agent-src/contexts/execution/roadmap-process-loop.md +32 -2
- package/dist/agent-src/contexts/execution/session-canary-enforcement-history.md +67 -0
- package/dist/agent-src/contexts/execution/toolchain-resolver.md +101 -7
- package/dist/agent-src/rules/active-remediation.md +1 -1
- package/dist/agent-src/rules/autonomous-execution.md +1 -0
- package/dist/agent-src/rules/broken-access-control.md +1 -0
- package/dist/agent-src/rules/command-suggestion-policy.md +1 -0
- package/dist/agent-src/rules/context-hygiene.md +1 -1
- package/dist/agent-src/rules/decision-revisit-gate.md +16 -33
- package/dist/agent-src/rules/design-fidelity.md +13 -16
- package/dist/agent-src/rules/doc-screenshot-hygiene.md +1 -0
- package/dist/agent-src/rules/domain-safety-disclaimer.md +1 -0
- package/dist/agent-src/rules/domain-safety-pii.md +1 -0
- package/dist/agent-src/rules/domain-safety-retention.md +1 -0
- package/dist/agent-src/rules/engineering-safety-floor.md +1 -0
- package/dist/agent-src/rules/evaluator-independence.md +3 -2
- package/dist/agent-src/rules/fast-path-marker-visibility.md +1 -0
- package/dist/agent-src/rules/finance-safety-floor.md +1 -0
- package/dist/agent-src/rules/git-history-discipline.md +1 -0
- package/dist/agent-src/rules/image-likeness-and-rights.md +1 -0
- package/dist/agent-src/rules/legal-safety-floor.md +3 -2
- package/dist/agent-src/rules/lethal-trifecta-guard.md +1 -0
- package/dist/agent-src/rules/low-impact-corpus-privacy-floor.md +1 -0
- package/dist/agent-src/rules/media-governance-routing.md +14 -17
- package/dist/agent-src/rules/persona-governance.md +2 -2
- package/dist/agent-src/rules/provider-lifecycle-discipline.md +1 -1
- package/dist/agent-src/rules/question-not-instruction.md +1 -0
- package/dist/agent-src/rules/roadmap-progress-sync.md +1 -1
- package/dist/agent-src/rules/runtime-safety.md +1 -0
- package/dist/agent-src/rules/secret-vcs-guard.md +1 -0
- package/dist/agent-src/rules/security-sensitive-stop.md +3 -2
- package/dist/agent-src/rules/session-canary.md +8 -62
- package/dist/agent-src/rules/settings-ask-protocol.md +1 -0
- package/dist/agent-src/rules/source-confidentiality.md +1 -0
- package/dist/agent-src/rules/strategy-safety-floor.md +1 -0
- package/dist/agent-src/rules/tool-safety.md +1 -0
- package/dist/agent-src/rules/ui-audit-gate.md +1 -2
- package/dist/agent-src/rules/untrusted-input-defense.md +1 -0
- package/dist/agent-src/rules/user-interrupt-priority.md +1 -0
- package/dist/agent-src/scripts/archive_completed_roadmaps.ts +115 -20
- package/dist/agent-src/scripts/deferral_carry.ts +339 -0
- package/dist/agent-src/scripts/update_roadmap_progress.ts +4 -1
- package/dist/agent-src/skills/accessibility-auditor/data/aria-patterns.csv +1 -1
- package/dist/agent-src/skills/accessibility-auditor/data/manifest.json +2 -2
- package/dist/agent-src/skills/api-design/data/manifest.json +2 -2
- package/dist/agent-src/skills/api-testing/SKILL.md +17 -0
- package/dist/agent-src/skills/code-intelligence/SKILL.md +14 -2
- package/dist/agent-src/skills/design-review/SKILL.md +30 -4
- package/dist/agent-src/skills/design-review/references/verification-automation.md +32 -0
- package/dist/agent-src/skills/design-system-capture/references/import-procedure.md +1 -1
- package/dist/agent-src/skills/existing-ui-audit/SKILL.md +18 -3
- package/dist/agent-src/skills/existing-ui-audit/references/component-taxonomy-detection.md +56 -0
- package/dist/agent-src/skills/fe-design/SKILL.md +1 -1
- package/dist/agent-src/skills/iconography/SKILL.md +1 -1
- package/dist/agent-src/skills/js-library-packaging/SKILL.md +2 -2
- package/dist/agent-src/skills/markitdown/SKILL.md +4 -0
- package/dist/agent-src/skills/monorepo-workspace/SKILL.md +1 -1
- package/dist/agent-src/skills/playwright-testing/SKILL.md +30 -6
- package/dist/agent-src/skills/quality-tools/SKILL.md +11 -1
- package/dist/agent-src/skills/quality-tools/references/go-tools.md +76 -0
- package/dist/agent-src/skills/quality-tools/references/python-tools.md +104 -0
- package/dist/agent-src/skills/review-routing/SKILL.md +2 -2
- package/dist/agent-src/skills/skill-improvement-pipeline/SKILL.md +1 -1
- package/dist/agent-src/skills/storybook-workshop/SKILL.md +3 -3
- package/dist/agent-src/skills/tailwind-engineer/SKILL.md +1 -1
- package/dist/agent-src/skills/test-case-discovery/SKILL.md +7 -0
- package/dist/agent-src/skills/test-driven-development/SKILL.md +17 -0
- package/dist/agent-src/skills/test-performance/SKILL.md +19 -1
- package/dist/agent-src/skills/ui-component-architect/SKILL.md +25 -2
- package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
- package/dist/agent-src/templates/roadmaps.md +30 -0
- package/dist/agent-src/templates/scripts/work_engine/directives/ui/app_spec.ts +10 -4
- package/dist/agent-src/templates/scripts/work_engine/directives/ui/apply.ts +302 -21
- package/dist/agent-src/templates/scripts/work_engine/directives/ui/audit.ts +22 -3
- package/dist/agent-src/templates/scripts/work_engine/directives/ui/scaffold.ts +6 -1
- package/dist/agent-src/templates/scripts/work_engine/stack/runner.ts +774 -109
- package/dist/agent-src/templates/scripts/work_engine/state.ts +57 -7
- package/dist/agent-src/templates/scripts/work_engine/taxonomy/detect.ts +500 -0
- package/dist/agent-src/templates/scripts/work_engine/taxonomy/place.ts +183 -0
- package/dist/cli/python/knowledge_ingest.js +1 -1
- package/dist/cli/python/workspace_drive.js +1 -1
- package/dist/cli/registry.js +1 -1
- package/dist/cli-delegate/archive_completed_roadmaps.js +92 -12
- package/dist/cli-delegate/check_update_banner.js +12 -1
- package/dist/cli-delegate/chunk-523HCFYO.js +90 -0
- package/dist/cli-delegate/{chunk-M2DPGFZ4.js → chunk-6V6TA25H.js} +22 -152
- package/dist/cli-delegate/chunk-7IQE3D5S.js +191 -0
- package/dist/cli-delegate/{chunk-6KFEC3G7.js → chunk-CQWX336L.js} +1 -1
- package/dist/cli-delegate/chunk-DEIV7XP7.js +108 -0
- package/dist/cli-delegate/chunk-EEHDXSYD.js +2040 -0
- package/dist/cli-delegate/{chunk-P6ZHP5W2.js → chunk-GKE7ZVFA.js} +4 -4
- package/dist/cli-delegate/chunk-JQOM7TTM.js +1201 -0
- package/dist/cli-delegate/{chunk-UNCRJBT3.js → chunk-JQVYKIZA.js} +41 -0
- package/dist/cli-delegate/{chunk-FC75PGJE.js → chunk-JY2I2DXV.js} +12 -1
- package/dist/cli-delegate/chunk-KB5FZ655.js +208 -0
- package/dist/cli-delegate/{chunk-YUM5KURG.js → chunk-KR6EM23A.js} +235 -1455
- package/dist/cli-delegate/{chunk-LTYVIY76.js → chunk-LIYTLH6O.js} +1 -1
- package/dist/cli-delegate/chunk-NQ7WT43P.js +2729 -0
- package/dist/cli-delegate/chunk-NXEILF2K.js +2160 -0
- package/dist/cli-delegate/{chunk-5R7HOLAF.js → chunk-NYX3L2PZ.js} +1 -1
- package/dist/cli-delegate/{chunk-4E2W63DA.js → chunk-OKJUIAPS.js} +62 -1
- package/dist/cli-delegate/{chunk-QAJS5YWY.js → chunk-PHD7OOLE.js} +2 -1
- package/dist/cli-delegate/{chunk-RGNIWTEA.js → chunk-QLDHIPWR.js} +1 -1
- package/dist/cli-delegate/{chunk-HDVVGPQW.js → chunk-RQNNW7IF.js} +1405 -567
- package/dist/cli-delegate/{chunk-S3VFXMTM.js → chunk-S4UMZNES.js} +1 -1
- package/dist/cli-delegate/{chunk-6KM6ORRY.js → chunk-S4YWNRKO.js} +24 -8
- package/dist/cli-delegate/{chunk-GJCBB2UG.js → chunk-TRI6DQZ6.js} +3054 -325
- package/dist/cli-delegate/chunk-ULQRUR23.js +208 -0
- package/dist/cli-delegate/{chunk-NUHLI2RX.js → chunk-YCU3TIXH.js} +2 -0
- package/dist/cli-delegate/chunk-ZBZV2G5R.js +210 -0
- package/dist/cli-delegate/{chunk-WGXTVKCQ.js → chunk-ZUZKZYCN.js} +5 -3
- package/dist/cli-delegate/cmd_analyze_session.js +1 -1
- package/dist/cli-delegate/cmd_brand_status.js +1 -1
- package/dist/cli-delegate/cmd_conformance.js +1862 -809
- package/dist/cli-delegate/cmd_doctor.js +13 -6
- package/dist/cli-delegate/cmd_doctor_neighbours.js +23 -0
- package/dist/cli-delegate/cmd_explain.js +5 -5
- package/dist/cli-delegate/cmd_export.js +11 -8
- package/dist/cli-delegate/cmd_fleet.js +3 -3
- package/dist/cli-delegate/cmd_handoff.js +10 -7
- package/dist/cli-delegate/cmd_mcp_available.js +1 -1
- package/dist/cli-delegate/cmd_memory_get.js +3 -1
- package/dist/cli-delegate/cmd_migrate.js +2 -2
- package/dist/cli-delegate/cmd_packs_active.js +3 -3
- package/dist/cli-delegate/cmd_preflight.js +6 -6
- package/dist/cli-delegate/cmd_prune.js +11 -8
- package/dist/cli-delegate/cmd_refresh.js +2 -1
- package/dist/cli-delegate/cmd_route_audit.js +8 -6
- package/dist/cli-delegate/cmd_route_explain.js +4 -4
- package/dist/cli-delegate/cmd_session_recycle.js +4 -3
- package/dist/cli-delegate/cmd_settings_get.js +1 -1
- package/dist/cli-delegate/cmd_settings_migrate.js +11 -8
- package/dist/cli-delegate/cmd_settings_set.js +4 -4
- package/dist/cli-delegate/cmd_sync.js +11 -8
- package/dist/cli-delegate/cmd_uninstall.js +11 -8
- package/dist/cli-delegate/cmd_update.js +1 -1
- package/dist/cli-delegate/cmd_upgrade.js +3 -2
- package/dist/cli-delegate/cmd_validate.js +11 -8
- package/dist/cli-delegate/cmd_versions.js +1 -1
- package/dist/cli-delegate/deferral_carry.js +16 -0
- package/dist/cli-delegate/gate_execute.js +2 -2
- package/dist/cli-delegate/roadmap_gates.js +5 -5
- package/dist/cli-delegate/update_roadmap_progress.js +1 -1
- package/dist/discovery/deprecation-report.md +1 -1
- package/dist/discovery/discovery-manifest.json +132 -80
- package/dist/discovery/discovery-manifest.json.sha256 +1 -1
- package/dist/discovery/discovery-manifest.summary.md +3 -3
- package/dist/discovery/dormancy-report.md +1 -1
- package/dist/discovery/orphan-report.md +1 -1
- package/dist/discovery/packs.json +7 -5
- package/dist/discovery/trust-report.md +2 -2
- package/dist/discovery/workspaces.json +6 -4
- package/dist/hooks/dispatch.js +7972 -5186
- package/dist/hooks/dispatch.sha256 +1 -0
- package/dist/install/claudePathsPlan.js +47 -6
- package/dist/install/claudeRuleRewrite.js +7 -0
- package/dist/install/emit_host_rules_cli.js +39 -36
- package/dist/install/globalRuleScope.js +87 -0
- package/dist/install/host_rule_ownership.js +160 -0
- package/dist/install/install.mjs +2226 -1055
- package/dist/install/installThinLayer.js +261 -0
- package/dist/install/installedRuleLinks.js +176 -0
- package/dist/install/wizard-plan.js +24 -0
- package/dist/mcp/registry-manifest.json +3 -3
- package/dist/mcp/server.json +2 -2
- package/dist/mcp/server.mjs +40913 -34865
- package/dist/scripts/_lib/agent_settings.js +11 -0
- package/dist/scripts/_lib/claude_settings_hooks.js +10 -8
- package/dist/scripts/_lib/installed_layer.js +378 -0
- package/dist/scripts/_lib/lean_projection_mode.js +218 -15
- package/dist/scripts/_lib/rule_consequence_class.js +45 -0
- package/dist/scripts/_lib/rule_injection.js +67 -10
- package/dist/scripts/_lib/rule_law_section.js +122 -0
- package/dist/scripts/_lib/thin_rules.js +458 -0
- package/dist/scripts/_lib/windsurf_render.js +60 -0
- package/dist/scripts/condense.js +14 -26
- package/dist/scripts/project_thin_rules.js +14 -294
- package/dist/server/schemas/settings.js +29 -0
- package/dist/shared/skillRanking.js +74 -13
- package/dist/ui/assets/index-Cwq4d0hX.js +23 -0
- package/dist/ui/assets/index-Cyjy8bWO.css +1 -0
- package/dist/ui/index.html +2 -2
- package/docs/contracts/settings-classes.md +10 -6
- package/package.json +4 -4
- package/src/agent-src/scripts/archive_completed_roadmaps.ts +115 -20
- package/src/agent-src/scripts/deferral_carry.ts +339 -0
- package/src/agent-src/scripts/update_roadmap_progress.ts +4 -1
- package/src/agent-src/templates/scripts/work_engine/directives/ui/app_spec.ts +10 -4
- package/src/agent-src/templates/scripts/work_engine/directives/ui/apply.ts +302 -21
- package/src/agent-src/templates/scripts/work_engine/directives/ui/audit.ts +22 -3
- package/src/agent-src/templates/scripts/work_engine/directives/ui/scaffold.ts +6 -1
- package/src/agent-src/templates/scripts/work_engine/stack/runner.ts +774 -109
- package/src/agent-src/templates/scripts/work_engine/state.ts +57 -7
- package/src/agent-src/templates/scripts/work_engine/taxonomy/detect.ts +500 -0
- package/src/agent-src/templates/scripts/work_engine/taxonomy/place.ts +183 -0
- package/src/config/agent-settings.template.yml +91 -22
- package/src/config/ci-local-parity.yml +18 -0
- package/src/config/continuity-surface.json +9 -2
- package/src/config/evaluator-budgets.json +4 -4
- package/src/config/gate-coverage.yml +327 -3
- package/src/config/gate-violation-baselines.json +21 -9
- package/src/config/hook-bundle-budget.json +25 -0
- package/src/config/hook-latency-budget.json +21 -0
- package/src/config/hook-token-budget.json +8 -3
- package/src/config/host-instruction-limits.json +33 -0
- package/src/config/metric-registry.yml +114 -0
- package/src/config/placeholder-drift-budget.json +10 -0
- package/src/config/routing-coverage-seed.json +38 -3
- package/src/config/rule-activation-census.json +7 -3
- package/src/config/rule-consequence-class.json +161 -0
- package/src/config/rule-law-ceilings.json +99 -0
- package/src/install/claudePathsPlan.ts +46 -4
- package/src/install/claudeRuleRewrite.ts +10 -1
- package/src/install/emit_host_rules_cli.ts +43 -34
- package/src/install/globalRuleScope.ts +109 -0
- package/src/install/host_rule_ownership.ts +170 -0
- package/src/install/installThinLayer.ts +312 -0
- package/src/install/installedRuleLinks.ts +220 -0
- package/src/install/wizard-plan.ts +24 -0
- package/src/scripts/_cli/cmd_doctor.ts +28 -90
- package/src/scripts/_cli/cmd_doctor_neighbours.ts +293 -0
- package/src/scripts/_cli/doctor_execution.ts +100 -17
- package/src/scripts/_cli/doctor_network_posture.ts +226 -0
- package/src/scripts/_dispatch.bash +16 -2
- package/src/scripts/_lib/agent_settings.ts +11 -0
- package/src/scripts/_lib/body_portable.ts +102 -0
- package/src/scripts/_lib/cc_transcript.ts +132 -1
- package/src/scripts/_lib/claude_settings_hooks.ts +10 -8
- package/src/scripts/_lib/concern_sla_window.ts +200 -0
- package/src/scripts/_lib/estate_offsets.ts +241 -0
- package/src/scripts/_lib/exemption_shape.ts +143 -0
- package/src/scripts/_lib/fnv.ts +23 -0
- package/src/scripts/_lib/foreign_scan.ts +106 -0
- package/src/scripts/_lib/forge_protection.ts +114 -0
- package/src/scripts/_lib/forge_reader.ts +558 -0
- package/src/scripts/_lib/gitignore_block.ts +314 -0
- package/src/scripts/_lib/global_deploy_inventory.ts +32 -0
- package/src/scripts/_lib/graph_feeder_record.ts +214 -0
- package/src/scripts/_lib/hook_settings.ts +73 -0
- package/src/scripts/_lib/host_capability.ts +40 -19
- package/src/scripts/_lib/host_env_write.ts +111 -0
- package/src/scripts/_lib/host_hook_merge.ts +165 -0
- package/src/scripts/_lib/installed_layer.ts +538 -0
- package/src/scripts/_lib/json_merge.ts +82 -0
- package/src/scripts/_lib/json_pointers.ts +93 -11
- package/src/scripts/_lib/lean_projection_mode.ts +275 -15
- package/src/scripts/_lib/llm_proposer_transport.ts +14 -4
- package/src/scripts/_lib/machine_wake.ts +16 -3
- package/src/scripts/_lib/neighbour_census.ts +760 -0
- package/src/scripts/_lib/neighbour_scan.ts +122 -0
- package/src/scripts/_lib/neighbour_tool_use.ts +189 -0
- package/src/scripts/_lib/obligations.ts +119 -8
- package/src/scripts/_lib/probe_inputs.ts +271 -0
- package/src/scripts/_lib/prompt_shape.ts +46 -0
- package/src/scripts/_lib/read_surface_scan.ts +322 -0
- package/src/scripts/_lib/release_highlights.ts +2 -1
- package/src/scripts/_lib/release_migration_gate.ts +19 -3
- package/src/scripts/_lib/reserved_name_sweep.ts +73 -0
- package/src/scripts/_lib/retrieval_sanitize.ts +77 -16
- package/src/scripts/_lib/review_coverage.ts +134 -0
- package/src/scripts/_lib/rule_consequence_class.ts +71 -0
- package/src/scripts/_lib/rule_injection.ts +130 -10
- package/src/scripts/_lib/rule_law_section.ts +147 -0
- package/src/scripts/_lib/rule_layer_overlap.ts +58 -0
- package/src/scripts/_lib/shell_write_shapes.ts +108 -0
- package/src/scripts/_lib/skill_origin.ts +254 -0
- package/src/scripts/_lib/structural_hiding.ts +622 -0
- package/src/scripts/_lib/structured_ask.ts +64 -21
- package/src/scripts/_lib/thin_rules.ts +540 -0
- package/src/scripts/_lib/touched_file_quality.ts +434 -0
- package/src/scripts/_lib/turn_end_refusals.ts +600 -4
- package/src/scripts/_lib/turn_end_transcript.ts +216 -0
- package/src/scripts/_lib/verification_command.ts +324 -0
- package/src/scripts/_lib/verification_evidence.ts +647 -0
- package/src/scripts/_lib/verify_clause.ts +280 -0
- package/src/scripts/_lib/windsurf_render.ts +63 -0
- package/src/scripts/ai_council/cli_call_budget.ts +13 -5
- package/src/scripts/ai_council/clients.ts +26 -57
- package/src/scripts/ai_council/config.ts +1 -1
- package/src/scripts/ai_council/vendor_defaults.ts +45 -0
- package/src/scripts/ai_team/team_dispatch.ts +4 -0
- package/src/scripts/audit_skill_overlap.ts +261 -0
- package/src/scripts/before_complete_hook.ts +573 -25
- package/src/scripts/bench_hook_latency.ts +412 -5
- package/src/scripts/bench_touched_file_quality.ts +238 -0
- package/src/scripts/cache_realization_report.ts +61 -1
- package/src/scripts/check_argument_hint.ts +287 -0
- package/src/scripts/check_claims.ts +125 -1
- package/src/scripts/check_enforcement_coverage.ts +38 -9
- package/src/scripts/check_enforcement_matrix.ts +621 -22
- package/src/scripts/check_estate_count.ts +130 -153
- package/src/scripts/check_finding_dispositions.ts +138 -7
- package/src/scripts/check_generator_sync.ts +71 -0
- package/src/scripts/check_hook_bundle_composition.ts +370 -0
- package/src/scripts/check_host_docs_digest.ts +786 -0
- package/src/scripts/check_host_format_column.ts +559 -0
- package/src/scripts/check_input_references.ts +228 -0
- package/src/scripts/check_inputs_parity.ts +235 -0
- package/src/scripts/check_kernel_edit_ratified.ts +89 -9
- package/src/scripts/check_kill_switch_table.ts +294 -0
- package/src/scripts/check_memory.ts +7 -1
- package/src/scripts/check_placeholder_drift.ts +221 -0
- package/src/scripts/check_read_surface_coverage.ts +515 -0
- package/src/scripts/check_release_highlights.ts +10 -0
- package/src/scripts/check_release_holds.ts +2 -1
- package/src/scripts/check_release_pr_shape.ts +38 -15
- package/src/scripts/check_routing_coverage.ts +378 -11
- package/src/scripts/check_standing_rule_delivery.ts +33 -13
- package/src/scripts/check_static_parity.ts +17 -0
- package/src/scripts/check_verify_expectation_delta.ts +521 -0
- package/src/scripts/ci_settle.ts +145 -19
- package/src/scripts/closure_scan.ts +115 -1
- package/src/scripts/code_graph/detect.ts +127 -7
- package/src/scripts/code_graph/foreign.ts +194 -0
- package/src/scripts/code_graph/query.ts +217 -4
- package/src/scripts/code_graph/types.ts +26 -2
- package/src/scripts/code_graph/validate.ts +3 -1
- package/src/scripts/code_graph/verbs.ts +103 -0
- package/src/scripts/compile_hook_manifest.ts +90 -14
- package/src/scripts/condense.ts +14 -27
- package/src/scripts/estate_exemption_shape.ts +202 -0
- package/src/scripts/external_sources_denylist.json +29 -4
- package/src/scripts/generate_host_cost_table.ts +1 -1
- package/src/scripts/hook_manifest.json +1 -1
- package/src/scripts/hook_manifest.yaml +192 -14
- package/src/scripts/hooks/block_config_weakening.ts +294 -4
- package/src/scripts/hooks/block_kernel_rule_writes.ts +9 -78
- package/src/scripts/hooks/block_plumbing_writes.ts +342 -0
- package/src/scripts/hooks/bundle_integrity.ts +291 -0
- package/src/scripts/hooks/chain_nudge_hook.ts +1 -2
- package/src/scripts/hooks/code_graph_context_hook.ts +253 -25
- package/src/scripts/hooks/comment_discipline_hook.ts +1 -3
- package/src/scripts/hooks/concern_failure_policy.ts +280 -0
- package/src/scripts/hooks/concern_registry.ts +2 -0
- package/src/scripts/hooks/concern_timings.ts +94 -0
- package/src/scripts/hooks/delegation_nudge_hook.ts +1 -2
- package/src/scripts/hooks/design_pass_hook.ts +100 -9
- package/src/scripts/hooks/design_slop_hook.ts +1 -2
- package/src/scripts/hooks/dispatch_hook.ts +77 -71
- package/src/scripts/hooks/edit_shape_hook.ts +1 -2
- package/src/scripts/hooks/end_review_nudge_hook.ts +1 -1
- package/src/scripts/hooks/evidence_independence.ts +1 -2
- package/src/scripts/hooks/exit_codes.ts +129 -0
- package/src/scripts/hooks/host_lowering.json +1 -0
- package/src/scripts/hooks/host_lowering.ts +146 -3
- package/src/scripts/hooks/host_lowering.yaml +262 -46
- package/src/scripts/hooks/host_semantics.ts +30 -2
- package/src/scripts/hooks/injection_budget.ts +9 -2
- package/src/scripts/hooks/interruption_ledger_hook.ts +1 -2
- package/src/scripts/hooks/journal_record_hook.ts +1 -2
- package/src/scripts/hooks/memory_recall_hook.ts +1 -2
- package/src/scripts/hooks/obligation_settle_hook.ts +151 -5
- package/src/scripts/hooks/one_question_per_ask_hook.ts +43 -6
- package/src/scripts/hooks/orchestration_record_hook.ts +1 -2
- package/src/scripts/hooks/payload_stub.ts +10 -1
- package/src/scripts/hooks/permission_gate.ts +1 -2
- package/src/scripts/hooks/push_settle_hook.ts +1 -3
- package/src/scripts/hooks/replay_hook.ts +2 -1
- package/src/scripts/hooks/reread_guard_hook.ts +1 -2
- package/src/scripts/hooks/review_baseline_hook.ts +1 -2
- package/src/scripts/hooks/rtk_wrap_hook.ts +1 -2
- package/src/scripts/hooks/rule_inject_hook.ts +765 -68
- package/src/scripts/hooks/run_continuation_hook.ts +13 -15
- package/src/scripts/hooks/skill_route_hook.ts +1 -2
- package/src/scripts/hooks/source_first_gate_hook.ts +1 -2
- package/src/scripts/hooks/spawn_guard_shadow_hook.ts +1 -2
- package/src/scripts/hooks/subagent_ledger_hook.ts +1 -2
- package/src/scripts/hooks/suggestion_capture_hook.ts +1 -1
- package/src/scripts/hooks/table_fingerprint.ts +70 -0
- package/src/scripts/hooks/telemetry_flush_hook.ts +1 -2
- package/src/scripts/hooks/telemetry_usage_hook.ts +65 -10
- package/src/scripts/hooks/tool_result_bytes_hook.ts +93 -9
- package/src/scripts/hooks/turn_end_gate_hook.ts +421 -324
- package/src/scripts/hooks/ui_route_nudge_hook.ts +1 -2
- package/src/scripts/hooks_status.ts +112 -0
- package/src/scripts/injection_scan_hook.ts +7 -0
- package/src/scripts/install.ts +75 -189
- package/src/scripts/installed_layer_report.ts +103 -0
- package/src/scripts/language_mirror_hook.ts +15 -6
- package/src/scripts/learning_sidecar.ts +119 -8
- package/src/scripts/lint_deny_text.ts +419 -0
- package/src/scripts/lint_exit_codes.ts +262 -0
- package/src/scripts/lint_hook_manifest.ts +108 -0
- package/src/scripts/lint_major_migration_sections.ts +156 -26
- package/src/scripts/lint_pack_boundaries.ts +63 -5
- package/src/scripts/lint_roadmap_blockers.ts +78 -12
- package/src/scripts/lint_rule_law_section.ts +517 -0
- package/src/scripts/lint_skill_descriptions.ts +1 -1
- package/src/scripts/lint_skill_scripts_readonly.ts +1 -1
- package/src/scripts/lint_workflow_security.ts +161 -5
- package/src/scripts/mcp_server/consumer_tool_catalog.json +53 -0
- package/src/scripts/mcp_server/graph_tools.ts +72 -3
- package/src/scripts/mcp_server/prompts.ts +142 -1
- package/src/scripts/measure_routing_signal.ts +54 -16
- package/src/scripts/measure_skill_ranker_baseline.ts +515 -53
- package/src/scripts/measure_turn_end_gate.ts +193 -0
- package/src/scripts/memory_learn_hook.ts +91 -6
- package/src/scripts/memory_lookup.ts +1 -1
- package/src/scripts/model_rule_injection.ts +52 -5
- package/src/scripts/prepack-check.mjs +53 -0
- package/src/scripts/project_thin_rules.ts +34 -327
- package/src/scripts/release_publication.ts +13 -1
- package/src/scripts/report_evidence_temperature.ts +657 -0
- package/src/scripts/report_installed_rule_links.ts +157 -0
- package/src/scripts/report_invocation_surface.ts +383 -0
- package/src/scripts/report_label_agreement.ts +233 -0
- package/src/scripts/report_obligation_carriers.ts +699 -0
- package/src/scripts/report_obligation_mechanism.ts +230 -0
- package/src/scripts/report_obligation_writer_split.ts +236 -0
- package/src/scripts/report_single_token_triggers.ts +277 -0
- package/src/scripts/report_skill_menu_census.ts +208 -0
- package/src/scripts/report_skill_ranker_confusion.ts +442 -0
- package/src/scripts/report_standing_payload_by_host.ts +188 -15
- package/src/scripts/report_verification_record_coverage.ts +306 -0
- package/src/scripts/roadmap_verify_share.ts +213 -0
- package/src/scripts/rule_activation_census.ts +5 -2
- package/src/scripts/rule_trigger_eval.ts +9 -9
- package/src/scripts/schemas/command.schema.json +44 -0
- package/src/scripts/schemas/review-findings.schema.json +7 -2
- package/src/scripts/schemas/rule.schema.json +5 -0
- package/src/scripts/schemas/skill.schema.json +44 -0
- package/src/scripts/self_review_gate.ts +421 -17
- package/src/scripts/semantic_parity_census.ts +314 -0
- package/src/scripts/session_eol_report.ts +54 -1
- package/src/scripts/skill_tools/score_skill_relevance.ts +290 -25
- package/src/scripts/sweep_dead_scan_roots.ts +1 -1
- package/src/scripts/sweep_skill_ranker_signals.ts +129 -0
- package/src/scripts/sync_gitignore.ts +29 -235
- package/src/scripts/trigger_eval_grandfather.json +0 -7
- package/src/scripts/trigger_eval_rotation.ts +122 -27
- package/src/scripts/ui_conformance_probe.ts +156 -4
- package/src/scripts/update_prices.ts +85 -3
- package/src/scripts/write_bundle_digest.mjs +74 -0
- package/src/server/schemas/settings.ts +41 -0
- package/src/shared/skillRanking.ts +117 -11
- package/src/templates/consumer-settings/ONBOARDING.md +1 -0
- package/dist/cli-delegate/chunk-FXYUYU4N.js +0 -4416
- package/dist/cli-delegate/chunk-QJWAUMJW.js +0 -1072
- package/dist/cli-delegate/chunk-YDPILCOL.js +0 -152
- package/dist/ui/assets/index-DH1xc62v.js +0 -29
- package/dist/ui/assets/index-jSfMW8_t.css +0 -1
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Placing a new component inside the taxonomy a project already chose.
|
|
3
|
+
*
|
|
4
|
+
* Leaf module — no intra-`work_engine` imports beyond its sibling detector's
|
|
5
|
+
* `NO_TAXONOMY` constant. That one import does pull `node:fs` in transitively;
|
|
6
|
+
* "stdlib-free" was the old wording here and it was simply wrong. Public API names stay snake_case to
|
|
7
|
+
* mirror the sibling detectors 1:1, per ADR-200.
|
|
8
|
+
*
|
|
9
|
+
* The contract, and the reason it is this small: placement reads the RECORDED
|
|
10
|
+
* tier list by name and conforms to whatever it holds. There is no table of
|
|
11
|
+
* tier names here, no ordering, no per-tier rule, and no numeric budget keyed
|
|
12
|
+
* to a tier — a component is placed when the brief names a tier the project
|
|
13
|
+
* has, and is reported as a gap when it does not. Anything richer would be the
|
|
14
|
+
* compiled-in taxonomy this suite refused to hard-code, arriving as an
|
|
15
|
+
* implementation detail rather than as a decision.
|
|
16
|
+
*
|
|
17
|
+
* That is also why an unplaceable component is never quietly put somewhere
|
|
18
|
+
* else. Choosing a tier for it would need exactly the per-tier rule the line
|
|
19
|
+
* above rules out, so the honest output is a named gap the author resolves.
|
|
20
|
+
*
|
|
21
|
+
* With {@link NO_TAXONOMY} recorded — the value for a project that evidences
|
|
22
|
+
* no taxonomy — every plan comes back empty and {@link conformance_lines}
|
|
23
|
+
* returns nothing, so the authoring step's output is byte-identical to what it
|
|
24
|
+
* was before this module existed. Holding to the project's own structures is
|
|
25
|
+
* the standing rule; a project that organises its components some other way
|
|
26
|
+
* must not be able to tell that this module shipped.
|
|
27
|
+
*/
|
|
28
|
+
import { NO_TAXONOMY } from './detect.js';
|
|
29
|
+
|
|
30
|
+
/** A component the design brief asks for. */
|
|
31
|
+
export interface ComponentRequest {
|
|
32
|
+
/** The component's name, as the brief writes it. */
|
|
33
|
+
name?: unknown;
|
|
34
|
+
/** The granularity tier the brief assigns it, when it assigns one. */
|
|
35
|
+
tier?: unknown;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/** Where one component lands, or why it could not be placed. */
|
|
39
|
+
export interface PlacementPlan {
|
|
40
|
+
/** The component's name as read from the brief. */
|
|
41
|
+
name: string;
|
|
42
|
+
/** The project's own tier name it was matched to, or `null`. */
|
|
43
|
+
tier: string | null;
|
|
44
|
+
/** The directory it belongs in, or `null` when unplaced. */
|
|
45
|
+
directory: string | null;
|
|
46
|
+
/** Why it could not be placed, or `null` when it was. */
|
|
47
|
+
gap: string | null;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/** Component root used when the audit recorded none. */
|
|
51
|
+
/**
|
|
52
|
+
* Gap reported when a taxonomy is recorded without the root it lives under.
|
|
53
|
+
*
|
|
54
|
+
* Guessing `src/components` here is the same failure as placing a component in
|
|
55
|
+
* a tier the project does not have, at the other end of the path: a project
|
|
56
|
+
* rooted at `app/components` or `resources/js/components` — both of which the
|
|
57
|
+
* detector searches — would have been handed a directory that does not exist,
|
|
58
|
+
* with no gap and no warning. This module exists so nothing is placed
|
|
59
|
+
* somewhere the project did not choose, so it says so instead.
|
|
60
|
+
*/
|
|
61
|
+
export const MISSING_ROOT_GAP =
|
|
62
|
+
'the audit recorded a taxonomy but no `component_root`, so there is no ' +
|
|
63
|
+
'directory to place into — re-run the audit, or record the root by hand';
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Plan where each requested component belongs under a recorded taxonomy.
|
|
67
|
+
*
|
|
68
|
+
* @param taxonomy The recorded `state.ui_audit.component_taxonomy` value —
|
|
69
|
+
* the project's own tiers joined with `/`, or {@link NO_TAXONOMY}.
|
|
70
|
+
* @param component_root The recorded component root, relative to the project.
|
|
71
|
+
* @param components The components the design brief asks for.
|
|
72
|
+
*/
|
|
73
|
+
export function plan_component_placement(
|
|
74
|
+
taxonomy: string,
|
|
75
|
+
component_root: string,
|
|
76
|
+
components: ReadonlyArray<ComponentRequest>,
|
|
77
|
+
): PlacementPlan[] {
|
|
78
|
+
const tiers = read_tiers(taxonomy);
|
|
79
|
+
const root = _trim_slashes(component_root);
|
|
80
|
+
return components.map((component) => {
|
|
81
|
+
const name = _text(component.name) || '(unnamed)';
|
|
82
|
+
if (tiers.length === 0) {
|
|
83
|
+
return { name, tier: null, directory: null, gap: null };
|
|
84
|
+
}
|
|
85
|
+
if (root === '') {
|
|
86
|
+
return { name, tier: null, directory: null, gap: `\`${name}\` — ${MISSING_ROOT_GAP}` };
|
|
87
|
+
}
|
|
88
|
+
const hint = _text(component.tier);
|
|
89
|
+
if (hint === '') {
|
|
90
|
+
return {
|
|
91
|
+
name,
|
|
92
|
+
tier: null,
|
|
93
|
+
directory: null,
|
|
94
|
+
gap:
|
|
95
|
+
`\`${name}\` names no granularity tier, and the project's ` +
|
|
96
|
+
`taxonomy \`${taxonomy}\` carries no rule that assigns one ` +
|
|
97
|
+
'— left unplaced for the author to decide',
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
const matched = tiers.find((tier) => _normalise(tier) === _normalise(hint));
|
|
101
|
+
if (matched === undefined) {
|
|
102
|
+
return {
|
|
103
|
+
name,
|
|
104
|
+
tier: null,
|
|
105
|
+
directory: null,
|
|
106
|
+
gap:
|
|
107
|
+
`\`${name}\` declares tier \`${hint}\`, which the project's ` +
|
|
108
|
+
`taxonomy \`${taxonomy}\` does not contain — left unplaced ` +
|
|
109
|
+
'rather than moved somewhere the project did not choose',
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
return { name, tier: matched, directory: `${root}/${matched}`, gap: null };
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Split a recorded taxonomy value into the project's own tier names.
|
|
118
|
+
*
|
|
119
|
+
* **The sentinel comparison is case-insensitive, and that is not politeness.**
|
|
120
|
+
* This field is written by an agent following `existing-ui-audit` § 1b, so
|
|
121
|
+
* `'None'` is reachable, and an exact comparison let it through as a
|
|
122
|
+
* one-element tier list: a project with no taxonomy then got a "conforming to
|
|
123
|
+
* `None`" banner and a conformance gap per component — precisely the output
|
|
124
|
+
* AC-2 forbids. It is the one guard standing between a no-taxonomy project and
|
|
125
|
+
* a changed authoring step, so it refuses every spelling of the sentinel.
|
|
126
|
+
*/
|
|
127
|
+
export function read_tiers(taxonomy: string): string[] {
|
|
128
|
+
const value = _text(taxonomy);
|
|
129
|
+
if (value === '' || value.toLowerCase() === NO_TAXONOMY) {
|
|
130
|
+
return [];
|
|
131
|
+
}
|
|
132
|
+
return value
|
|
133
|
+
.split('/')
|
|
134
|
+
.map((part) => part.trim())
|
|
135
|
+
.filter((part) => part !== '');
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Render the lines the authoring step says out loud.
|
|
140
|
+
*
|
|
141
|
+
* Empty for {@link NO_TAXONOMY}, which is what keeps a no-taxonomy project's
|
|
142
|
+
* output unchanged.
|
|
143
|
+
*/
|
|
144
|
+
export function conformance_lines(
|
|
145
|
+
taxonomy: string,
|
|
146
|
+
component_root: string,
|
|
147
|
+
plans: ReadonlyArray<PlacementPlan>,
|
|
148
|
+
): string[] {
|
|
149
|
+
if (read_tiers(taxonomy).length === 0) {
|
|
150
|
+
return [];
|
|
151
|
+
}
|
|
152
|
+
const root = _trim_slashes(component_root);
|
|
153
|
+
const under = root === '' ? 'an unrecorded component root' : `\`${root}/\``;
|
|
154
|
+
const lines: string[] = [
|
|
155
|
+
`> Conforming to the project's own component taxonomy ` +
|
|
156
|
+
`\`${taxonomy}\` under ${under} — detected, not imposed. ` +
|
|
157
|
+
'A component that fits no tier is reported, never relocated.',
|
|
158
|
+
];
|
|
159
|
+
for (const plan of plans) {
|
|
160
|
+
if (plan.gap === null && plan.directory !== null) {
|
|
161
|
+
lines.push(
|
|
162
|
+
`> - \`${plan.name}\` → \`${plan.directory}/\` (tier \`${plan.tier}\`)`,
|
|
163
|
+
);
|
|
164
|
+
} else if (plan.gap !== null) {
|
|
165
|
+
lines.push(`> - conformance gap: ${plan.gap}`);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
return lines;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/** Lower-case and drop a trailing plural `s`, so `Molecule` matches `molecules`. */
|
|
172
|
+
function _normalise(name: string): string {
|
|
173
|
+
const lower = name.trim().toLowerCase();
|
|
174
|
+
return lower.endsWith('s') && lower.length > 2 ? lower.slice(0, -1) : lower;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
function _text(value: unknown): string {
|
|
178
|
+
return typeof value === 'string' ? value.trim() : '';
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
function _trim_slashes(value: unknown): string {
|
|
182
|
+
return _text(value).replace(/^\/+|\/+$/gu, '');
|
|
183
|
+
}
|
package/dist/cli/registry.js
CHANGED
|
@@ -94,7 +94,7 @@ export const REGISTRY = [
|
|
|
94
94
|
{ name: 'memory:hash', disposition: 'delegate', synopsis: 'Hash a memory entry (YAML or JSON stdin).' },
|
|
95
95
|
{ name: 'memory:check', disposition: 'delegate', synopsis: 'Validate memory YAML schema + staleness.' },
|
|
96
96
|
{ name: 'memory:check-proposal', disposition: 'delegate', synopsis: 'Run the admission gate on a memory proposal.' },
|
|
97
|
-
{ name: 'memory:learn', disposition: 'delegate', synopsis: 'Aggregate memory intake signals into the local learning sidecar (read-only; --write to emit).' },
|
|
97
|
+
{ name: 'memory:learn', disposition: 'delegate', synopsis: 'Aggregate memory intake signals into the local learning sidecar (read-only; --write to emit, --format status for the one-screen view).' },
|
|
98
98
|
{ name: 'analytics', disposition: 'delegate', synopsis: 'Local-only workspace analytics: emit|show|prune|migrate (never leaves the machine).' },
|
|
99
99
|
{ name: 'knowledge', disposition: 'delegate', synopsis: 'Global knowledge-card store: list|show|trace|forget|promote|validate|lead-check|purge.' },
|
|
100
100
|
{ name: 'proposal:check', disposition: 'delegate', synopsis: 'Validate a learning/skill/rule proposal markdown.' },
|
|
@@ -1,10 +1,16 @@
|
|
|
1
1
|
#!/usr/bin/env tsx
|
|
2
2
|
import { createRequire as __acCreateRequire } from 'node:module'; const require = globalThis.require ?? __acCreateRequire(import.meta.url);
|
|
3
|
+
import {
|
|
4
|
+
BLOCK_END_RE,
|
|
5
|
+
DEFERRED_RESOLUTION_RE,
|
|
6
|
+
DEFERRED_STEP_RE,
|
|
7
|
+
planCarry
|
|
8
|
+
} from "./chunk-7IQE3D5S.js";
|
|
3
9
|
import {
|
|
4
10
|
blocker_is_resolved,
|
|
5
11
|
collect,
|
|
6
12
|
parse_blockers
|
|
7
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-PHD7OOLE.js";
|
|
8
14
|
import "./chunk-ULET4BYS.js";
|
|
9
15
|
import {
|
|
10
16
|
isCliEntry
|
|
@@ -199,9 +205,6 @@ function _fs_grep_files(root, needle) {
|
|
|
199
205
|
walk(root);
|
|
200
206
|
return hits;
|
|
201
207
|
}
|
|
202
|
-
var DEFERRED_RESOLUTION_RE = /<!--\s*deferred-resolution:\s*(carried-to|merged-into)\s*=\s*([A-Za-z0-9._-]+)\s*-->/;
|
|
203
|
-
var DEFERRED_STEP_RE = /^[ \t]*[-*][ \t]+\[~\][ \t]*(.*)$/;
|
|
204
|
-
var BLOCK_END_RE = /^[ \t]*[-*][ \t]+\[[ xX~-]\]|^#{1,6}[ \t]/;
|
|
205
208
|
function _escapeRe(v) {
|
|
206
209
|
return v.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
207
210
|
}
|
|
@@ -292,6 +295,7 @@ function deferralProblems(root, rel, text, alsoArchiving = /* @__PURE__ */ new S
|
|
|
292
295
|
}
|
|
293
296
|
function archive_completed(root, opts) {
|
|
294
297
|
const { changed_only, base, dry_run } = opts;
|
|
298
|
+
const carry = opts.carry ?? true;
|
|
295
299
|
const roadmap_root = path.join(root, "agents", "roadmaps");
|
|
296
300
|
if (!_isDir(roadmap_root)) {
|
|
297
301
|
return [];
|
|
@@ -308,8 +312,10 @@ function archive_completed(root, opts) {
|
|
|
308
312
|
collect(roadmap_root).filter((s2) => s2.open_ === 0).map((s2) => s2.rel.replace(/\.md$/, ""))
|
|
309
313
|
);
|
|
310
314
|
const archived = [];
|
|
315
|
+
const only = opts.only ? opts.only.replace(/^.*\//, "").replace(/\.md$/, "") + ".md" : null;
|
|
311
316
|
for (const stats of collect(roadmap_root)) {
|
|
312
|
-
|
|
317
|
+
if (only !== null && stats.rel !== only) continue;
|
|
318
|
+
let roadmapText = fs.readFileSync(path.join(roadmap_root, stats.rel), "utf-8");
|
|
313
319
|
const guarded = parseGuardedBaselines(roadmapText);
|
|
314
320
|
if (guarded.length > 0) {
|
|
315
321
|
process.stderr.write(
|
|
@@ -325,11 +331,41 @@ function archive_completed(root, opts) {
|
|
|
325
331
|
if (stats.open_ !== 0) {
|
|
326
332
|
continue;
|
|
327
333
|
}
|
|
334
|
+
const old_rel = `agents/roadmaps/${stats.rel}`;
|
|
335
|
+
let open_blockers = stats.open_blockers.map((b) => b.id);
|
|
328
336
|
if (stats.deferred !== 0) {
|
|
329
337
|
const abs = path.join(roadmap_root, stats.rel);
|
|
330
338
|
const others = new Set(sweepSet);
|
|
331
339
|
others.delete(stats.rel.replace(/\.md$/, ""));
|
|
332
|
-
const
|
|
340
|
+
const inScope = !changed_only || touched.has(old_rel);
|
|
341
|
+
const bare = parseDeferredItems(roadmapText).some((d) => d.kind === null);
|
|
342
|
+
if (carry && inScope && bare) {
|
|
343
|
+
const outcome = planCarry(root, stats.rel, roadmapText, open_blockers, _today(), opts.owner_decision ?? "ask");
|
|
344
|
+
if ("refused" in outcome) {
|
|
345
|
+
process.stderr.write(` \u26A0\uFE0F ${stats.rel}: deferrals not carried \u2014 ${outcome.refused}.
|
|
346
|
+
`);
|
|
347
|
+
} else if (outcome.plan.ownerBlockers.length > 0 && !outcome.plan.parked) {
|
|
348
|
+
process.stdout.write(_ownerDecisionBlock(stats.rel, outcome.plan));
|
|
349
|
+
continue;
|
|
350
|
+
} else {
|
|
351
|
+
const { plan } = outcome;
|
|
352
|
+
process.stdout.write(
|
|
353
|
+
` \u21AA ${stats.rel}: carried ${plan.carried} deferred step(s)` + (plan.movedBlockers.length > 0 ? ` and blocker(s) ${plan.movedBlockers.join(", ")}` : "") + ` \u2192 ${plan.destRel}
|
|
354
|
+
`
|
|
355
|
+
);
|
|
356
|
+
if (dry_run) {
|
|
357
|
+
archived.push({ roadmap: old_rel, archived_to: `agents/roadmaps/archive/${stats.rel}`, refs_migrated: [] });
|
|
358
|
+
continue;
|
|
359
|
+
}
|
|
360
|
+
fs.mkdirSync(path.dirname(path.join(root, plan.destRel)), { recursive: true });
|
|
361
|
+
fs.writeFileSync(path.join(root, plan.destRel), plan.destText, "utf-8");
|
|
362
|
+
fs.writeFileSync(abs, plan.sourceText, "utf-8");
|
|
363
|
+
_run(["git", "add", "--", plan.destRel, old_rel], root);
|
|
364
|
+
roadmapText = plan.sourceText;
|
|
365
|
+
open_blockers = open_blockers.filter((id) => !plan.movedBlockers.includes(id));
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
const problems = deferralProblems(root, stats.rel, roadmapText, others);
|
|
333
369
|
if (problems.length > 0) {
|
|
334
370
|
process.stderr.write(
|
|
335
371
|
` \u26A0\uFE0F ${stats.rel}: ${problems.length} unresolved deferral(s) \u2014 not archived.
|
|
@@ -340,16 +376,14 @@ function archive_completed(root, opts) {
|
|
|
340
376
|
continue;
|
|
341
377
|
}
|
|
342
378
|
}
|
|
343
|
-
const open_blockers = stats.open_blockers;
|
|
344
379
|
if (open_blockers.length > 0) {
|
|
345
|
-
const ids = open_blockers.
|
|
380
|
+
const ids = open_blockers.join(", ");
|
|
346
381
|
process.stderr.write(
|
|
347
382
|
` \u26A0\uFE0F ${stats.rel}: all steps closed but ${open_blockers.length} blocker(s) still open (${ids}) \u2014 not archived. Resolve them, or record the decision, then re-run the sweep.
|
|
348
383
|
`
|
|
349
384
|
);
|
|
350
385
|
continue;
|
|
351
386
|
}
|
|
352
|
-
const old_rel = `agents/roadmaps/${stats.rel}`;
|
|
353
387
|
if (changed_only && !touched.has(old_rel)) {
|
|
354
388
|
continue;
|
|
355
389
|
}
|
|
@@ -383,6 +417,29 @@ function archive_completed(root, opts) {
|
|
|
383
417
|
}
|
|
384
418
|
return archived;
|
|
385
419
|
}
|
|
420
|
+
function _ownerDecisionBlock(rel, plan) {
|
|
421
|
+
const ids = plan.ownerBlockers.join(", ");
|
|
422
|
+
const park = `agents/roadmaps/later/${plan.destSlug}.md`;
|
|
423
|
+
const step = plan.firstStep.split("\n").map((l) => ` ${l}`).join("\n");
|
|
424
|
+
const record = {
|
|
425
|
+
roadmap: `agents/roadmaps/${rel}`,
|
|
426
|
+
owner_blockers: plan.ownerBlockers,
|
|
427
|
+
deferred_steps: plan.carried,
|
|
428
|
+
park_to: park,
|
|
429
|
+
archive_command: `./agent-config roadmap:archive --all --owner-decision later --only ${rel}`,
|
|
430
|
+
first_step: plan.firstStep
|
|
431
|
+
};
|
|
432
|
+
return ` \u2753 ${rel}: ${plan.carried} deferred step(s) wait on owner blocker(s) ${ids} \u2014 not archived; the owner decides:
|
|
433
|
+
1. Archive it \u2014 the steps and their blockers park in ${park}
|
|
434
|
+
(${record.archive_command})
|
|
435
|
+
2. Work them step by step, starting with:
|
|
436
|
+
${step}
|
|
437
|
+
OWNER-DECISION ${JSON.stringify(record)}
|
|
438
|
+
`;
|
|
439
|
+
}
|
|
440
|
+
function _today() {
|
|
441
|
+
return (/* @__PURE__ */ new Date()).toISOString().slice(0, 10);
|
|
442
|
+
}
|
|
386
443
|
function _isDir(p) {
|
|
387
444
|
try {
|
|
388
445
|
return fs.statSync(p).isDirectory();
|
|
@@ -443,13 +500,16 @@ function _runTwin(root, script) {
|
|
|
443
500
|
}
|
|
444
501
|
var _PROG = "archive_completed_roadmaps.py";
|
|
445
502
|
function _usage() {
|
|
446
|
-
return `usage: ${_PROG} [-h] [--all] [--base BASE] [--dry-run] [--repo-root REPO_ROOT]
|
|
503
|
+
return `usage: ${_PROG} [-h] [--all] [--base BASE] [--dry-run] [--no-carry] [--owner-decision later] [--only ROADMAP] [--repo-root REPO_ROOT]
|
|
447
504
|
`;
|
|
448
505
|
}
|
|
449
506
|
function _parseArgs(argv) {
|
|
450
507
|
let all = false;
|
|
451
508
|
let base = "origin/main";
|
|
452
509
|
let dry_run = false;
|
|
510
|
+
let carry = true;
|
|
511
|
+
let owner_decision = "ask";
|
|
512
|
+
let only = null;
|
|
453
513
|
let repo_root = null;
|
|
454
514
|
const emitError = (msg) => {
|
|
455
515
|
process.stderr.write(_usage());
|
|
@@ -469,6 +529,23 @@ function _parseArgs(argv) {
|
|
|
469
529
|
} else if (tok === "--dry-run") {
|
|
470
530
|
dry_run = true;
|
|
471
531
|
i += 1;
|
|
532
|
+
} else if (tok === "--no-carry") {
|
|
533
|
+
carry = false;
|
|
534
|
+
i += 1;
|
|
535
|
+
} else if (tok === "--only" || tok.startsWith("--only=")) {
|
|
536
|
+
const val = tok.includes("=") ? tok.slice(tok.indexOf("=") + 1) : argv[i + 1];
|
|
537
|
+
if (val === void 0 || val === "") {
|
|
538
|
+
emitError("argument --only: expected one argument");
|
|
539
|
+
}
|
|
540
|
+
only = val;
|
|
541
|
+
i += tok.includes("=") ? 1 : 2;
|
|
542
|
+
} else if (tok === "--owner-decision" || tok.startsWith("--owner-decision=")) {
|
|
543
|
+
const val = tok.includes("=") ? tok.slice(tok.indexOf("=") + 1) : argv[i + 1];
|
|
544
|
+
if (val !== "later" && val !== "ask") {
|
|
545
|
+
emitError("argument --owner-decision: expected 'later' or 'ask'");
|
|
546
|
+
}
|
|
547
|
+
owner_decision = val;
|
|
548
|
+
i += tok.includes("=") ? 1 : 2;
|
|
472
549
|
} else if (tok === "--base") {
|
|
473
550
|
const val = argv[i + 1];
|
|
474
551
|
if (val === void 0) {
|
|
@@ -493,7 +570,7 @@ function _parseArgs(argv) {
|
|
|
493
570
|
emitError(`unrecognized arguments: ${tok}`);
|
|
494
571
|
}
|
|
495
572
|
}
|
|
496
|
-
return { all, base, dry_run, repo_root };
|
|
573
|
+
return { all, base, dry_run, carry, owner_decision, only, repo_root };
|
|
497
574
|
}
|
|
498
575
|
function main(argv) {
|
|
499
576
|
const ns = _parseArgs(argv ?? process.argv.slice(2));
|
|
@@ -501,7 +578,10 @@ function main(argv) {
|
|
|
501
578
|
const archived = archive_completed(root, {
|
|
502
579
|
changed_only: !ns.all,
|
|
503
580
|
base: ns.base,
|
|
504
|
-
dry_run: ns.dry_run
|
|
581
|
+
dry_run: ns.dry_run,
|
|
582
|
+
carry: ns.carry,
|
|
583
|
+
owner_decision: ns.owner_decision,
|
|
584
|
+
only: ns.only
|
|
505
585
|
});
|
|
506
586
|
if (archived.length === 0) {
|
|
507
587
|
process.stdout.write(" \u2139\uFE0F No completed roadmaps to archive.\n");
|
|
@@ -267,7 +267,18 @@ var MERGEABLE_KEYS = [
|
|
|
267
267
|
// be followed. Class C, so a user still sets it by hand or through the
|
|
268
268
|
// GUI; whitelisting decides only whether the value SURVIVES the merge
|
|
269
269
|
// (ADR-271, road-to-design-intent-conformance 2.3).
|
|
270
|
-
"design.fidelity_mode"
|
|
270
|
+
"design.fidelity_mode",
|
|
271
|
+
// `lean_projection.*` is a per-MACHINE setting and the install it governs is
|
|
272
|
+
// a user-scope one: the layer being thinned is `~/.claude/rules`, which
|
|
273
|
+
// belongs to the machine and not to any checkout. Without these two rows a
|
|
274
|
+
// consumer who wrote the opt-in into the user-global file got no error, no
|
|
275
|
+
// warning and no effect — the same silent-filter defect the two entries
|
|
276
|
+
// above repair, reaching a third key, and unsatisfiable-by-construction on
|
|
277
|
+
// an ADR-020 global-only install, where no project layer exists to carry it.
|
|
278
|
+
// Whitelisting decides only whether a value SURVIVES the merge: it sets
|
|
279
|
+
// nothing, and `installerThinsHost` still refuses a template-only value.
|
|
280
|
+
"lean_projection.mode",
|
|
281
|
+
"lean_projection.hosts"
|
|
271
282
|
];
|
|
272
283
|
var TEMPLATE_RELATIVE = path2.join("src", "config", "agent-settings.template.yml");
|
|
273
284
|
var _PACKAGE_ROOT = path2.resolve(path2.dirname(fileURLToPath(import.meta.url)), "..", "..", "..");
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { createRequire as __acCreateRequire } from 'node:module'; const require = globalThis.require ?? __acCreateRequire(import.meta.url);
|
|
2
|
+
|
|
3
|
+
// src/install/plan.ts
|
|
4
|
+
import { createHash } from "node:crypto";
|
|
5
|
+
import { readFileSync, readdirSync, statSync } from "node:fs";
|
|
6
|
+
import { join, relative, resolve } from "node:path";
|
|
7
|
+
function sha256File(path) {
|
|
8
|
+
try {
|
|
9
|
+
const data = readFileSync(path);
|
|
10
|
+
return createHash("sha256").update(data).digest("hex");
|
|
11
|
+
} catch {
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
function fileEntry(path, kind, options) {
|
|
16
|
+
return {
|
|
17
|
+
path,
|
|
18
|
+
kind,
|
|
19
|
+
sha256: options.hashContent ? sha256File(path) : null
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
function walkSourceTree(dir) {
|
|
23
|
+
const out = [];
|
|
24
|
+
walkInto(dir, out);
|
|
25
|
+
return out;
|
|
26
|
+
}
|
|
27
|
+
function walkInto(dir, out) {
|
|
28
|
+
let entries;
|
|
29
|
+
try {
|
|
30
|
+
entries = readdirSync(dir).sort();
|
|
31
|
+
} catch {
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
for (const name of entries) {
|
|
35
|
+
const full = join(dir, name);
|
|
36
|
+
let isDir;
|
|
37
|
+
try {
|
|
38
|
+
isDir = statSync(full).isDirectory();
|
|
39
|
+
} catch {
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
if (isDir) {
|
|
43
|
+
walkInto(full, out);
|
|
44
|
+
} else {
|
|
45
|
+
out.push(full);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
function buildInstallPlan(inputs) {
|
|
50
|
+
const filesByTool = {};
|
|
51
|
+
for (const source of inputs.sources) {
|
|
52
|
+
const bucket = filesByTool[source.toolId] ?? [];
|
|
53
|
+
let files = walkSourceTree(source.srcDir);
|
|
54
|
+
if (source.fileFilter !== void 0) {
|
|
55
|
+
files = files.filter(source.fileFilter);
|
|
56
|
+
}
|
|
57
|
+
for (const srcFile of files) {
|
|
58
|
+
const rel = relative(source.srcDir, srcFile);
|
|
59
|
+
const destPath = resolve(source.destDir, rel);
|
|
60
|
+
bucket.push(
|
|
61
|
+
fileEntry(srcFile, source.kind, {
|
|
62
|
+
hashContent: source.kind !== "bridge"
|
|
63
|
+
})
|
|
64
|
+
);
|
|
65
|
+
bucket[bucket.length - 1] = {
|
|
66
|
+
...bucket[bucket.length - 1],
|
|
67
|
+
path: destPath
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
filesByTool[source.toolId] = bucket;
|
|
71
|
+
}
|
|
72
|
+
for (const source of inputs.sources) {
|
|
73
|
+
if (!(source.toolId in filesByTool)) {
|
|
74
|
+
filesByTool[source.toolId] = [];
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return {
|
|
78
|
+
version: 2,
|
|
79
|
+
target: inputs.target,
|
|
80
|
+
root: inputs.root,
|
|
81
|
+
filesByTool,
|
|
82
|
+
mergedKeysByTool: {},
|
|
83
|
+
policy: inputs.policy
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
export {
|
|
88
|
+
sha256File,
|
|
89
|
+
buildInstallPlan
|
|
90
|
+
};
|