@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 @@
|
|
|
1
|
+
4db51136b6f98bb8779752e29d0a0db9309176727875ec7bf3aba82e4466c686 dispatch.js
|
|
@@ -180,6 +180,19 @@ export function _expanded_pattern_count(pattern) {
|
|
|
180
180
|
}
|
|
181
181
|
/** Host-documented budget for one rule's whole `paths:` list. */
|
|
182
182
|
export const CLAUDE_PATHS_PATTERN_BUDGET = 1000;
|
|
183
|
+
/**
|
|
184
|
+
* The two trigger keys `derive_trigger_globs` turns into a host glob. Kept
|
|
185
|
+
* beside it deliberately: the day a third path-shaped key is added there, this
|
|
186
|
+
* set is the other half of the same edit, and a reader looking at either one
|
|
187
|
+
* sees the pair.
|
|
188
|
+
*/
|
|
189
|
+
const PATH_SHAPED_TRIGGER_KEYS = new Set(['file_pattern', 'path_prefix']);
|
|
190
|
+
/**
|
|
191
|
+
* Keys on a trigger object that match nothing. `reason:` documents why the
|
|
192
|
+
* trigger exists; counting it would make every annotated path trigger look
|
|
193
|
+
* mixed and scope nothing at all.
|
|
194
|
+
*/
|
|
195
|
+
const NON_MATCHING_TRIGGER_KEYS = new Set(['reason']);
|
|
183
196
|
/**
|
|
184
197
|
* Does this rule declare any trigger that is NOT path-shaped?
|
|
185
198
|
*
|
|
@@ -191,6 +204,18 @@ export const CLAUDE_PATHS_PATTERN_BUDGET = 1000;
|
|
|
191
204
|
* rule loads unconditionally. The emitter fed both semantics from one list, so
|
|
192
205
|
* a rule that declared keywords *and* one path glob silently became
|
|
193
206
|
* path-gated-only on Claude.
|
|
207
|
+
*
|
|
208
|
+
* **The test is a negation, not a list of non-path kinds**, and the difference
|
|
209
|
+
* is not stylistic. The predicate used to enumerate `keyword` and `phrase`,
|
|
210
|
+
* which left `command` — a prompt route like any other — uncounted:
|
|
211
|
+
* `roadmap-progress-sync` declares one `path_prefix` and three `command`
|
|
212
|
+
* triggers, so it was emitted with an exclusive `paths:` and its three command
|
|
213
|
+
* routes never fired on this host. A list can only ever be as current as its
|
|
214
|
+
* last edit; the schema's `additionalProperties: false` means a new match key
|
|
215
|
+
* arrives as a deliberate schema change, and until someone teaches
|
|
216
|
+
* `derive_trigger_globs` to make a glob from it, treating it as promptable is
|
|
217
|
+
* the fail-safe reading — the rule stays unconditional rather than silently
|
|
218
|
+
* narrowing to a path it does not have.
|
|
194
219
|
*/
|
|
195
220
|
export function _has_non_path_trigger(meta) {
|
|
196
221
|
const triggers = meta['triggers'];
|
|
@@ -200,10 +225,24 @@ export function _has_non_path_trigger(meta) {
|
|
|
200
225
|
if (t === null || typeof t !== 'object' || Array.isArray(t))
|
|
201
226
|
continue;
|
|
202
227
|
const obj = t;
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
228
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
229
|
+
if (PATH_SHAPED_TRIGGER_KEYS.has(key) || NON_MATCHING_TRIGGER_KEYS.has(key))
|
|
230
|
+
continue;
|
|
231
|
+
// A string that is not blank, or ANY non-string value. The schema
|
|
232
|
+
// types all five match keys as strings today, so the second half is
|
|
233
|
+
// for the key that arrives later: a `keyword: ["a","b"]` read as
|
|
234
|
+
// "not a string, so not a trigger" would silently narrow the rule
|
|
235
|
+
// to a path it does not have, which is the exact failure the
|
|
236
|
+
// negation above exists to prevent. Undefined and null are the one
|
|
237
|
+
// shape that means "absent".
|
|
238
|
+
if (typeof value === 'string') {
|
|
239
|
+
if (value.trim() !== '')
|
|
240
|
+
return true;
|
|
241
|
+
}
|
|
242
|
+
else if (value !== undefined && value !== null) {
|
|
243
|
+
return true;
|
|
244
|
+
}
|
|
245
|
+
}
|
|
207
246
|
}
|
|
208
247
|
return false;
|
|
209
248
|
}
|
|
@@ -224,8 +263,10 @@ export function _claude_paths_plan(meta) {
|
|
|
224
263
|
}
|
|
225
264
|
const globs = [];
|
|
226
265
|
const dropped = [];
|
|
227
|
-
// A rule that ALSO declares
|
|
228
|
-
//
|
|
266
|
+
// A rule that ALSO declares a non-path trigger — keyword, phrase, command,
|
|
267
|
+
// or a match key added to the schema later — gets no `paths:` at all, and
|
|
268
|
+
// therefore keeps loading unconditionally on Claude Code. The predicate is
|
|
269
|
+
// a negation of the two path-shaped keys, deliberately: see its docblock.
|
|
229
270
|
//
|
|
230
271
|
// Emitting `paths:` here would narrow the rule to a path match and discard
|
|
231
272
|
// every keyword the author wrote, because this host reads the list as the
|
|
@@ -128,6 +128,13 @@ export function rewriteAndReport(rulesDir, quiet, info, warn, wrappers, preserve
|
|
|
128
128
|
`Claude Code built-in (${wrappers.reserved.join(', ')}); nested /cluster:sub ` +
|
|
129
129
|
'commands remain available');
|
|
130
130
|
}
|
|
131
|
+
if (wrappers.foreign !== undefined && wrappers.foreign.length > 0) {
|
|
132
|
+
// Reported, never removed. The name shadows a host built-in, but
|
|
133
|
+
// this package did not write the file, so deleting it would be
|
|
134
|
+
// taking a neighbour's command away without saying so.
|
|
135
|
+
info(` claude-code: kept ${wrappers.foreign.length} neighbour command file(s) whose ` +
|
|
136
|
+
`name is a Claude Code built-in (${wrappers.foreign.join(', ')}); not ours to remove`);
|
|
137
|
+
}
|
|
131
138
|
}
|
|
132
139
|
if (result.rewritten > 0 && !quiet) {
|
|
133
140
|
info(` claude-code: ${result.rewritten} rule(s) rewritten to host form; ` +
|
|
@@ -39,6 +39,7 @@ import * as path from 'node:path';
|
|
|
39
39
|
import process from 'node:process';
|
|
40
40
|
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
41
41
|
import { _emit_cursor_mdc, _emit_windsurf_rule, strip_frontmatter, } from '../scripts/condense.js';
|
|
42
|
+
import { WINDSURFRULES_HEADER, cleanOwnedOnly, keptLine, mayWriteRuleFile, mayWriteWindsurfRules, ownedPaths, } from './host_rule_ownership.js';
|
|
42
43
|
function _ruleFiles(rulesDir) {
|
|
43
44
|
return fs
|
|
44
45
|
.readdirSync(rulesDir)
|
|
@@ -54,63 +55,65 @@ function _ruleFiles(rulesDir) {
|
|
|
54
55
|
}
|
|
55
56
|
});
|
|
56
57
|
}
|
|
57
|
-
/** Remove entries not in `valid` (mirror of condense's `_clean_modern_dir`). */
|
|
58
|
-
function _cleanDir(dir, valid) {
|
|
59
|
-
let entries;
|
|
60
|
-
try {
|
|
61
|
-
entries = fs.readdirSync(dir);
|
|
62
|
-
}
|
|
63
|
-
catch {
|
|
64
|
-
return;
|
|
65
|
-
}
|
|
66
|
-
for (const name of entries) {
|
|
67
|
-
if (name === 'README.md' || valid.has(name)) {
|
|
68
|
-
continue;
|
|
69
|
-
}
|
|
70
|
-
const full = path.join(dir, name);
|
|
71
|
-
try {
|
|
72
|
-
if (fs.lstatSync(full).isDirectory()) {
|
|
73
|
-
fs.rmSync(full, { recursive: true, force: true });
|
|
74
|
-
}
|
|
75
|
-
else {
|
|
76
|
-
fs.unlinkSync(full);
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
catch {
|
|
80
|
-
/* best-effort clean */
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
58
|
export function emitCursor(rulesDir, projectRoot) {
|
|
85
59
|
const targetDir = path.join(projectRoot, '.cursor', 'rules');
|
|
86
60
|
const files = _ruleFiles(rulesDir);
|
|
61
|
+
const owned = ownedPaths(projectRoot);
|
|
87
62
|
const valid = new Set();
|
|
63
|
+
let blocked = 0;
|
|
88
64
|
for (const src of files) {
|
|
89
65
|
const name = `${path.basename(src, '.md')}.mdc`;
|
|
90
|
-
|
|
66
|
+
const target = path.join(targetDir, name);
|
|
67
|
+
// Ownership BEFORE the write: a neighbour's file under one of our
|
|
68
|
+
// names would otherwise be destroyed and then skipped by the cleanup
|
|
69
|
+
// pass, which only looks at names this run did not emit.
|
|
70
|
+
if (!mayWriteRuleFile(target, owned)) {
|
|
71
|
+
blocked += 1;
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
_emit_cursor_mdc(src, target);
|
|
91
75
|
valid.add(name);
|
|
92
76
|
}
|
|
93
|
-
|
|
77
|
+
const { kept } = cleanOwnedOnly(targetDir, valid, owned);
|
|
78
|
+
const line = keptLine(kept + blocked);
|
|
79
|
+
if (line !== null)
|
|
80
|
+
process.stdout.write(`cursor: ${line}\n`);
|
|
94
81
|
return files.length;
|
|
95
82
|
}
|
|
96
83
|
export function emitWindsurf(rulesDir, projectRoot) {
|
|
97
84
|
const perRuleDir = path.join(projectRoot, '.windsurf', 'rules');
|
|
98
85
|
const files = _ruleFiles(rulesDir);
|
|
86
|
+
const owned = ownedPaths(projectRoot);
|
|
99
87
|
const valid = new Set();
|
|
88
|
+
let blocked = 0;
|
|
100
89
|
for (const src of files) {
|
|
101
90
|
const name = path.basename(src);
|
|
102
|
-
|
|
91
|
+
const target = path.join(perRuleDir, name);
|
|
92
|
+
if (!mayWriteRuleFile(target, owned)) {
|
|
93
|
+
blocked += 1;
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
_emit_windsurf_rule(src, target);
|
|
103
97
|
valid.add(name);
|
|
104
98
|
}
|
|
105
|
-
|
|
99
|
+
const { kept } = cleanOwnedOnly(perRuleDir, valid, owned);
|
|
100
|
+
const line = keptLine(kept + blocked);
|
|
101
|
+
if (line !== null)
|
|
102
|
+
process.stdout.write(`windsurf: ${line}\n`);
|
|
106
103
|
// Concatenated legacy surface — same format as the projection-path
|
|
107
104
|
// generator (condense.generate_windsurfrules), consumer-sourced header.
|
|
108
|
-
const
|
|
109
|
-
|
|
110
|
-
const
|
|
111
|
-
|
|
105
|
+
const target = path.join(projectRoot, '.windsurfrules');
|
|
106
|
+
if (mayWriteWindsurfRules(target, owned)) {
|
|
107
|
+
const parts = [`${WINDSURFRULES_HEADER}\n`];
|
|
108
|
+
for (const src of files) {
|
|
109
|
+
const content = strip_frontmatter(fs.readFileSync(src, 'utf-8'));
|
|
110
|
+
parts.push(`---\n\n${content.trim()}\n`);
|
|
111
|
+
}
|
|
112
|
+
fs.writeFileSync(target, parts.join('\n') + '\n', 'utf-8');
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
process.stdout.write('windsurf: kept: 1 neighbour file(s) (.windsurfrules)\n');
|
|
112
116
|
}
|
|
113
|
-
fs.writeFileSync(path.join(projectRoot, '.windsurfrules'), parts.join('\n') + '\n', 'utf-8');
|
|
114
117
|
return files.length;
|
|
115
118
|
}
|
|
116
119
|
export function main(argv = process.argv.slice(2)) {
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The rule scope governing a GLOBAL deploy.
|
|
3
|
+
*
|
|
4
|
+
* Moved out of `src/scripts/install.ts` by
|
|
5
|
+
* `road-to-an-installed-layer-that-is-thinned` step 1.1, which adds the thinning
|
|
6
|
+
* call to the same deploy loop. `check_source_size_budget` is a one-way ratchet
|
|
7
|
+
* with no per-change headroom, and this repository's stated convention is that
|
|
8
|
+
* the total falls through EXTRACTION and never rises through a baseline edit —
|
|
9
|
+
* the same reason `claudeRuleRewrite` holds the claude-code post-copy reporting
|
|
10
|
+
* rather than the installer. This function is the nearest self-contained block
|
|
11
|
+
* to the change: it is the predicate the deploy loop resolves once per run, it
|
|
12
|
+
* reaches nothing else in the installer, and its four environment touches are
|
|
13
|
+
* already parameters in all but name.
|
|
14
|
+
*
|
|
15
|
+
* BEHAVIOUR IS UNCHANGED, DELIBERATELY. The body is the installer's, verbatim
|
|
16
|
+
* apart from the four injected seams below; `install.ts` keeps a wrapper of the
|
|
17
|
+
* same name and signature, so its re-export and every caller and test see what
|
|
18
|
+
* they saw before. A behaviour change smuggled into an extraction is the one
|
|
19
|
+
* thing that would make the line saving not worth having.
|
|
20
|
+
*
|
|
21
|
+
* The seams are injected rather than imported because each one is an
|
|
22
|
+
* install-time decision the installer owns: where the global settings doc lives,
|
|
23
|
+
* how this build reads and parses YAML, what the packaged template says, and
|
|
24
|
+
* where a warning goes.
|
|
25
|
+
*/
|
|
26
|
+
import { LEGACY_ALL, ruleScopeFromSettings } from './rule_scope.js';
|
|
27
|
+
function isPlainObject(v) {
|
|
28
|
+
return typeof v === 'object' && v !== null && !Array.isArray(v);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Resolve the rule scope governing THIS global deploy — the same way the wizard
|
|
32
|
+
* does (`src/server/routes/install.ts::_resolveRuleScope`), so the two global
|
|
33
|
+
* paths cannot ship different rule sets for the same settings.
|
|
34
|
+
*
|
|
35
|
+
* Settings resolution mirrors `_resolve_scoped_projection` above: an existing
|
|
36
|
+
* global settings doc is authoritative, and only a genuinely fresh machine falls
|
|
37
|
+
* through to the packaged template. Any read or parse failure resolves to
|
|
38
|
+
* `LEGACY_ALL` — over-shipping is the safe direction, and the compat exclusion
|
|
39
|
+
* (`source-of-truth.md`) still applies even then.
|
|
40
|
+
*/
|
|
41
|
+
export function resolveGlobalRuleScope(inputs) {
|
|
42
|
+
const { packageRoot, warn } = inputs;
|
|
43
|
+
const settings_path = inputs.settingsPath;
|
|
44
|
+
// No global settings artefact at all — a genuinely fresh machine. Fall
|
|
45
|
+
// through to the packaged template silently: there is no user decision to
|
|
46
|
+
// contradict, and this is the documented upgrade-compat path.
|
|
47
|
+
if (settings_path === null) {
|
|
48
|
+
try {
|
|
49
|
+
return ruleScopeFromSettings(inputs.loadDefaults(), packageRoot);
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return LEGACY_ALL;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
// A doc EXISTS, so the user has expressed a configuration. Failing to read
|
|
56
|
+
// it is not the same as not having one: falling back to legacy-all here
|
|
57
|
+
// ships the maintainer-only rules the user may have deliberately scoped out,
|
|
58
|
+
// and `_load_yaml_doc` would report that as an indistinguishable `{}`. So
|
|
59
|
+
// parse it explicitly and be LOUD when it does not parse — over-shipping
|
|
60
|
+
// stays the safe direction, but it must not be a silent one.
|
|
61
|
+
let text;
|
|
62
|
+
try {
|
|
63
|
+
text = inputs.readText(settings_path);
|
|
64
|
+
}
|
|
65
|
+
catch (e) {
|
|
66
|
+
warn(`could not read ${settings_path} (${String(e)}) — rule scoping falls back ` +
|
|
67
|
+
'to legacy-all, so ALL rules including maintainer-only ones will be ' +
|
|
68
|
+
'installed. Fix the file to restore scoping.');
|
|
69
|
+
return LEGACY_ALL;
|
|
70
|
+
}
|
|
71
|
+
const parsed = inputs.parseYaml(text);
|
|
72
|
+
if (!isPlainObject(parsed)) {
|
|
73
|
+
warn(`${settings_path} is not a YAML mapping — rule scoping falls back to ` +
|
|
74
|
+
'legacy-all, so ALL rules including maintainer-only ones will be ' +
|
|
75
|
+
'installed. Fix the file to restore scoping.');
|
|
76
|
+
return LEGACY_ALL;
|
|
77
|
+
}
|
|
78
|
+
try {
|
|
79
|
+
return ruleScopeFromSettings(parsed, packageRoot);
|
|
80
|
+
}
|
|
81
|
+
catch (e) {
|
|
82
|
+
warn(`could not derive rule scope from ${settings_path} (${String(e)}) — ` +
|
|
83
|
+
'falling back to legacy-all; ALL rules will be installed.');
|
|
84
|
+
return LEGACY_ALL;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=globalRuleScope.js.map
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Which host-rule files this package may delete or overwrite.
|
|
3
|
+
*
|
|
4
|
+
* The defect this closes: `_cleanDir` removed every entry under
|
|
5
|
+
* `.cursor/rules` and `.windsurf/rules` whose NAME was not one this run had
|
|
6
|
+
* just emitted, and `.windsurfrules` was overwritten unconditionally. A rule
|
|
7
|
+
* file another agent package wrote — or one the consumer wrote by hand — was
|
|
8
|
+
* destroyed on every install, which is the opposite of what the uninstall
|
|
9
|
+
* claim promises.
|
|
10
|
+
*
|
|
11
|
+
* Ownership is read from the installed-tools manifest's `files[]` inventory,
|
|
12
|
+
* never from a marker inside the file. The `.mdc` emitter writes no package
|
|
13
|
+
* tag (`condense.ts` `_emit_cursor_mdc`), so a tag-based gate would classify
|
|
14
|
+
* every file this package ever wrote as foreign and therefore never remove a
|
|
15
|
+
* stale one — it would read as conservative and in fact be inert. The manifest
|
|
16
|
+
* is the record of what this installer actually put on disk, so it is the
|
|
17
|
+
* thing that can answer the question.
|
|
18
|
+
*
|
|
19
|
+
* This module only READS that manifest. It never rewrites it: the available
|
|
20
|
+
* reader (`installed_tools.read_manifest`) drops nested `files[]` by design,
|
|
21
|
+
* so a read-modify-write through it would erase every other tool's inventory —
|
|
22
|
+
* the failure `manifestFiles.ts` documents at length.
|
|
23
|
+
*
|
|
24
|
+
* The consequence, stated rather than implied: a consumer whose manifest does
|
|
25
|
+
* not claim a path gets that path KEPT. Unproven means kept, never deleted.
|
|
26
|
+
* That is the safe direction for this lane and it is also a real limit — a
|
|
27
|
+
* stale file of ours sitting under an unclaimed path stays until something
|
|
28
|
+
* claims it.
|
|
29
|
+
*/
|
|
30
|
+
import * as fs from 'node:fs';
|
|
31
|
+
import * as path from 'node:path';
|
|
32
|
+
import { sha256OfFile } from './fsPrimitives.js';
|
|
33
|
+
import { classifyOwnership, recordedHashesForRoot } from './recordedOwnership.js';
|
|
34
|
+
/** The first line every `.windsurfrules` this package generates carries. */
|
|
35
|
+
export const WINDSURFRULES_HEADER = '# Auto-generated from .augment/rules/ — do not edit directly';
|
|
36
|
+
/** Every file path beneath `full`, or `[full]` when it is a file. */
|
|
37
|
+
function filesUnder(full) {
|
|
38
|
+
let stat;
|
|
39
|
+
try {
|
|
40
|
+
stat = fs.lstatSync(full);
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return [];
|
|
44
|
+
}
|
|
45
|
+
if (!stat.isDirectory())
|
|
46
|
+
return [full];
|
|
47
|
+
const out = [];
|
|
48
|
+
for (const name of fs.readdirSync(full)) {
|
|
49
|
+
out.push(...filesUnder(path.join(full, name)));
|
|
50
|
+
}
|
|
51
|
+
return out;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Is this exact file ours AND still carrying the bytes we wrote?
|
|
55
|
+
*
|
|
56
|
+
* The recorded digest is the point, not the path. A path-membership test
|
|
57
|
+
* answers "did we ever write here", which merges two materially different
|
|
58
|
+
* trees: a generated file still as we left it, and one the consumer has since
|
|
59
|
+
* edited. Deleting the second loses their work, and `recordedOwnership` exists
|
|
60
|
+
* to tell them apart — importing its map and then ignoring its hashes was the
|
|
61
|
+
* defect an independent review named here.
|
|
62
|
+
*/
|
|
63
|
+
function isUnchangedOurs(file, owned) {
|
|
64
|
+
const target = path.resolve(file);
|
|
65
|
+
if (!owned.has(target))
|
|
66
|
+
return false;
|
|
67
|
+
return classifyOwnership(owned.get(target), sha256OfFile(target)) === 'recorded-unchanged';
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Remove the stale entries of ours from `dir`, keeping everything else.
|
|
71
|
+
*
|
|
72
|
+
* An entry is removable only when every file it contains is ours AND
|
|
73
|
+
* unmodified: one unclaimed or edited file inside a directory keeps the whole
|
|
74
|
+
* directory, because removing it would take that file with it.
|
|
75
|
+
*/
|
|
76
|
+
export function cleanOwnedOnly(dir, valid, owned) {
|
|
77
|
+
let entries;
|
|
78
|
+
try {
|
|
79
|
+
entries = fs.readdirSync(dir);
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
return { removed: [], kept: 0 };
|
|
83
|
+
}
|
|
84
|
+
const removed = [];
|
|
85
|
+
let kept = 0;
|
|
86
|
+
for (const name of entries) {
|
|
87
|
+
if (name === 'README.md' || valid.has(name))
|
|
88
|
+
continue;
|
|
89
|
+
const full = path.join(dir, name);
|
|
90
|
+
const contained = filesUnder(full);
|
|
91
|
+
const ours = contained.length > 0 && contained.every((f) => isUnchangedOurs(f, owned));
|
|
92
|
+
if (!ours) {
|
|
93
|
+
kept += 1;
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
try {
|
|
97
|
+
fs.rmSync(full, { recursive: true, force: true });
|
|
98
|
+
removed.push(name);
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
kept += 1;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return { removed, kept };
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* May this package write `.windsurfrules` at `target`?
|
|
108
|
+
*
|
|
109
|
+
* Yes when the file is absent, or when it still carries the header this
|
|
110
|
+
* package generates. Nothing else.
|
|
111
|
+
*
|
|
112
|
+
* A manifest claim is deliberately NOT a second route in. The file is
|
|
113
|
+
* generated and overwritten on every install, so the header IS the ownership
|
|
114
|
+
* signal and it is content-derived: if the header is gone, something replaced
|
|
115
|
+
* the file, and "the manifest says we wrote here once" is exactly the stale
|
|
116
|
+
* fact that would let us overwrite a neighbour's replacement. An independent
|
|
117
|
+
* review caught that route open, with a fixture asserting it.
|
|
118
|
+
*/
|
|
119
|
+
export function mayWriteWindsurfRules(target, owned) {
|
|
120
|
+
void owned;
|
|
121
|
+
if (!fs.existsSync(target))
|
|
122
|
+
return true;
|
|
123
|
+
let head;
|
|
124
|
+
try {
|
|
125
|
+
head = fs.readFileSync(target, 'utf-8').split('\n', 1)[0] ?? '';
|
|
126
|
+
}
|
|
127
|
+
catch {
|
|
128
|
+
// Unreadable is unproven, and unproven means do not touch it.
|
|
129
|
+
return false;
|
|
130
|
+
}
|
|
131
|
+
return head.trim() === WINDSURFRULES_HEADER;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* May this package write a rule file at `target`?
|
|
135
|
+
*
|
|
136
|
+
* The cleanup pass is not enough on its own, and an independent review found
|
|
137
|
+
* the hole: `_cleanDir` skips every name this run just emitted, so a
|
|
138
|
+
* neighbour's `foo.mdc` that happens to share a basename with one of our
|
|
139
|
+
* rules was already OVERWRITTEN by the time ownership was consulted. The
|
|
140
|
+
* check has to run BEFORE the write, which is what this is for.
|
|
141
|
+
*
|
|
142
|
+
* Absent, or ours and unmodified → write. Anything else is someone's file or
|
|
143
|
+
* someone's edit, and is left exactly as it is.
|
|
144
|
+
*/
|
|
145
|
+
export function mayWriteRuleFile(target, owned) {
|
|
146
|
+
if (!fs.existsSync(target))
|
|
147
|
+
return true;
|
|
148
|
+
return isUnchangedOurs(target, owned);
|
|
149
|
+
}
|
|
150
|
+
/** The manifest's claimed paths for a consumer root; empty when none resolves. */
|
|
151
|
+
export function ownedPaths(projectRoot) {
|
|
152
|
+
return recordedHashesForRoot(projectRoot);
|
|
153
|
+
}
|
|
154
|
+
/** The one line the emitter prints when it kept a neighbour's files. */
|
|
155
|
+
export function keptLine(kept) {
|
|
156
|
+
if (kept <= 0)
|
|
157
|
+
return null;
|
|
158
|
+
return `kept: ${kept} neighbour file(s)`;
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=host_rule_ownership.js.map
|