@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,261 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Thin an INSTALLED Claude Code rule layer, in place, after the copy.
|
|
3
|
+
*
|
|
4
|
+
* `road-to-an-installed-layer-that-is-thinned` step 1.1. The global install step
|
|
5
|
+
* copies `dist/agent-src/rules` verbatim into `~/.claude/rules`
|
|
6
|
+
* (`install.ts::_copy_dir_dereferencing_symlinks`), so a consumer receives every
|
|
7
|
+
* rule body whether or not any trigger ever fires. The round that opened that
|
|
8
|
+
* roadmap measured a fresh install at 102 unconditional files and 338,225
|
|
9
|
+
* characters against a host that reports a 150,000 budget. Thinning existed —
|
|
10
|
+
* `project_thin_rules::build_thin` — but ran only on the maintainer projection,
|
|
11
|
+
* which no consumer receives.
|
|
12
|
+
*
|
|
13
|
+
* Three properties, each a defect this would otherwise reintroduce.
|
|
14
|
+
*
|
|
15
|
+
* **The stub is built from the SOURCE tree, never from the installed file.**
|
|
16
|
+
* `claudeRuleRewrite` runs immediately before this and reduces each installed
|
|
17
|
+
* rule to the host's activation vocabulary — `paths:` plus the ownership keys —
|
|
18
|
+
* dropping `description:` and the `triggers:` block. Those two are exactly what
|
|
19
|
+
* `thin_entry` reads to write the stub's matching signal, so a stub built from
|
|
20
|
+
* the rewritten file would carry an empty description and no `Fires on:` hint.
|
|
21
|
+
* Reading `<packageRoot>/dist/agent-src/rules/<name>` keeps the signal intact.
|
|
22
|
+
*
|
|
23
|
+
* **The installed frontmatter is kept verbatim.** The roadmap's step 1.1 ends
|
|
24
|
+
* "Ownership keys survive", and it is not decoration: `reap_tagged_orphans`
|
|
25
|
+
* calls the literal `package:` line "the only path with ownership proof
|
|
26
|
+
* independent of inventory history", and doctor's stale-orphan check reads the
|
|
27
|
+
* same tag. A stub that replaced the whole file would delete the reaper's only
|
|
28
|
+
* evidence for every thinned rule. So only the BODY is replaced; the header the
|
|
29
|
+
* copy and the rewrite produced is written back unchanged, which also preserves
|
|
30
|
+
* any `paths:` block — harmless, since a path-only rule is never thinned.
|
|
31
|
+
*
|
|
32
|
+
* **A user-modified file is skipped, not overwritten.** The preserved set comes
|
|
33
|
+
* from the conflict tracker, the same one the copy consulted. Step 1.3 requires
|
|
34
|
+
* an upgrade to preserve and report those files; thinning one would destroy an
|
|
35
|
+
* edit the copy had just declined to destroy.
|
|
36
|
+
*
|
|
37
|
+
* The rollback of step 1.2 needs nothing here, and the reason is the ordering.
|
|
38
|
+
*
|
|
39
|
+
* The install manifest records each deployed file's digest from the bytes ON
|
|
40
|
+
* DISK at manifest-write time, which is after this pass. So the next run sees
|
|
41
|
+
* `recorded-unchanged` for a thinned file, `decideDeployWrite` returns `write`,
|
|
42
|
+
* and the verbatim copy restores the full body. Switching the mode back to
|
|
43
|
+
* `eager-all` therefore un-thins by simply not running this pass — no inverse
|
|
44
|
+
* operation, and no stub left behind. The property that carries it is the
|
|
45
|
+
* ordering, which `tests/scripts/install_thin_layer.test.ts` pins directly.
|
|
46
|
+
*
|
|
47
|
+
* Side-effect-free apart from the writes it is asked to make. No CLI entry, no
|
|
48
|
+
* `process.exit` — this module is reachable from the `build:install-bundle`
|
|
49
|
+
* entry and `check_installer_import_purity` forbids both.
|
|
50
|
+
*/
|
|
51
|
+
import * as fs from 'node:fs';
|
|
52
|
+
import * as path from 'node:path';
|
|
53
|
+
import * as os from 'node:os';
|
|
54
|
+
import { buildHostLimitRows, loadHostInstructionLimits, readLayer, renderHostLimitRows, } from '../scripts/_lib/installed_layer.js';
|
|
55
|
+
import { GLOBAL_RULE_DIRS, globalRuleLayerPath } from './globalRuleLayers.js';
|
|
56
|
+
import { manifest_path } from '../scripts/_lib/installed_tools.js';
|
|
57
|
+
import { NO_RECORDED_HASHES, readRecordedHashes } from './recordedOwnership.js';
|
|
58
|
+
import { absoluteBodyLinkPrefix, build_thin, split_frontmatter, } from '../scripts/_lib/thin_rules.js';
|
|
59
|
+
/**
|
|
60
|
+
* Replace the body of every thinnable rule in `rulesDir` with its stub.
|
|
61
|
+
*
|
|
62
|
+
* Idempotent: a layer already thinned is rewritten to byte-identical content,
|
|
63
|
+
* so a repeated install neither grows nor drifts.
|
|
64
|
+
*/
|
|
65
|
+
export function thinInstalledRuleLayer(opts) {
|
|
66
|
+
const packageRoot = path.resolve(opts.packageRoot);
|
|
67
|
+
const bodySourceDir = path.join(packageRoot, 'dist', 'agent-src', 'rules');
|
|
68
|
+
const bodyLinkPrefix = absoluteBodyLinkPrefix(packageRoot);
|
|
69
|
+
const preserved = opts.preserved ?? new Set();
|
|
70
|
+
// Scope is `null` on purpose. The copy already applied the install's rule
|
|
71
|
+
// scope, so the files that EXIST in `rulesDir` are the scoped set; asking
|
|
72
|
+
// `build_thin` to resolve the scope a second time would be a second reader
|
|
73
|
+
// of the same decision, and the two could disagree. Anything the stub map
|
|
74
|
+
// names that is not on disk is simply out of scope and is reported as such.
|
|
75
|
+
const stubs = build_thin(bodySourceDir, null, null, null, { packageRoot, bodyLinkPrefix });
|
|
76
|
+
let thinned = 0;
|
|
77
|
+
let rewritten = 0;
|
|
78
|
+
let kept = 0;
|
|
79
|
+
let charsBefore = 0;
|
|
80
|
+
let charsAfter = 0;
|
|
81
|
+
const preservedHits = [];
|
|
82
|
+
const absent = [];
|
|
83
|
+
const failed = [];
|
|
84
|
+
for (const [name, stubText] of stubs) {
|
|
85
|
+
const target = path.join(opts.rulesDir, name);
|
|
86
|
+
let installed;
|
|
87
|
+
try {
|
|
88
|
+
installed = fs.readFileSync(target, 'utf-8');
|
|
89
|
+
}
|
|
90
|
+
catch (e) {
|
|
91
|
+
// ENOENT is the documented meaning of `absent` — the copy's rule
|
|
92
|
+
// scope did not place this rule here. Anything else (EACCES, EISDIR,
|
|
93
|
+
// EIO) is a FAILURE wearing a scoping outcome's clothes, and the
|
|
94
|
+
// receipt prints failures and does not print absences, so the two
|
|
95
|
+
// must not share a bucket.
|
|
96
|
+
if (e.code === 'ENOENT')
|
|
97
|
+
absent.push(name);
|
|
98
|
+
else
|
|
99
|
+
failed.push({ rule: name, reason: String(e) });
|
|
100
|
+
continue;
|
|
101
|
+
}
|
|
102
|
+
// KEPT-VS-THINNED IS DECIDED BY IDENTITY, NOT BY A CONTENT SNIFF.
|
|
103
|
+
// `build_thin` returns either a stub or the SOURCE TEXT VERBATIM, so
|
|
104
|
+
// the full-bodied branch is exactly "the map value equals the source
|
|
105
|
+
// file". Testing `is_thin_entry(stubText)` instead would misread a
|
|
106
|
+
// source rule whose own body happened to contain the marker — and that
|
|
107
|
+
// rule would then be written as `installedFrontmatter + fullSourceText`,
|
|
108
|
+
// duplicating the frontmatter block. Zero such rules ship today, which
|
|
109
|
+
// makes it latent rather than live, and `THIN_ENTRY_MARKER`'s own
|
|
110
|
+
// docstring argues against exactly this kind of inferred detection.
|
|
111
|
+
let sourceText;
|
|
112
|
+
try {
|
|
113
|
+
sourceText = fs.readFileSync(path.join(bodySourceDir, name), 'utf-8');
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
sourceText = null;
|
|
117
|
+
}
|
|
118
|
+
if (stubText === sourceText) {
|
|
119
|
+
// Kept full-bodied by `build_thin`'s own predicate — kernel,
|
|
120
|
+
// trigger-less, path-only, or a declared `no_stub` member. The
|
|
121
|
+
// installed copy is already the right shape; touching it would be
|
|
122
|
+
// this pass inventing a decision the projector did not make.
|
|
123
|
+
kept += 1;
|
|
124
|
+
charsBefore += installed.length;
|
|
125
|
+
charsAfter += installed.length;
|
|
126
|
+
continue;
|
|
127
|
+
}
|
|
128
|
+
if (preserved.has(path.resolve(target))) {
|
|
129
|
+
preservedHits.push(name);
|
|
130
|
+
charsBefore += installed.length;
|
|
131
|
+
charsAfter += installed.length;
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
const [frontmatter] = split_frontmatter(installed);
|
|
135
|
+
charsBefore += installed.length;
|
|
136
|
+
// `split_frontmatter` answers `['', text]` for a file that OPENS a
|
|
137
|
+
// frontmatter block and never closes it — a truncated write, a file
|
|
138
|
+
// ending exactly on the closing fence with no trailing newline, CRLF.
|
|
139
|
+
// Writing `'' + stub` there would delete the `package:` line this
|
|
140
|
+
// module's header calls the reaper's only evidence, which is the one
|
|
141
|
+
// corruption this pass could cause. A file that claims a block it does
|
|
142
|
+
// not have is left exactly as found and reported.
|
|
143
|
+
//
|
|
144
|
+
// The test is a REGEX rather than `startsWith('---')` because the
|
|
145
|
+
// claim can be preceded by a BOM or by leading whitespace, and either
|
|
146
|
+
// one took the prefix check's "no block here" branch straight into the
|
|
147
|
+
// write it exists to prevent.
|
|
148
|
+
if (frontmatter === '' && /^\uFEFF?[\s]*---/.test(installed)) {
|
|
149
|
+
failed.push({
|
|
150
|
+
rule: name,
|
|
151
|
+
reason: 'opens a frontmatter block that never closes — left untouched so its ' +
|
|
152
|
+
'ownership keys survive',
|
|
153
|
+
});
|
|
154
|
+
charsAfter += installed.length;
|
|
155
|
+
continue;
|
|
156
|
+
}
|
|
157
|
+
const next = `${frontmatter}${stubText}`;
|
|
158
|
+
try {
|
|
159
|
+
if (next !== installed) {
|
|
160
|
+
fs.writeFileSync(target, next, 'utf-8');
|
|
161
|
+
rewritten += 1;
|
|
162
|
+
}
|
|
163
|
+
thinned += 1;
|
|
164
|
+
charsAfter += next.length;
|
|
165
|
+
}
|
|
166
|
+
catch (e) {
|
|
167
|
+
failed.push({ rule: name, reason: String(e) });
|
|
168
|
+
charsAfter += installed.length;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
if (stubs.size === 0) {
|
|
172
|
+
// A ZERO-STUB MAP AND A ZERO-THINNABLE LAYER PRINT THE SAME RECEIPT, so
|
|
173
|
+
// the one that is a failure has to say so. `_globSortedMd` swallows an
|
|
174
|
+
// unreadable directory and answers `[]`, which is what a wrongly
|
|
175
|
+
// resolved package root produces — the hazard `ThinRoots` exists for.
|
|
176
|
+
// Without this the feature would be silently not applied behind a
|
|
177
|
+
// success-shaped line, and the installer's try/catch sees only throws.
|
|
178
|
+
failed.push({
|
|
179
|
+
rule: bodySourceDir,
|
|
180
|
+
reason: 'no rule bodies found to build stubs from — the layer was left full-bodied',
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
return {
|
|
184
|
+
thinned,
|
|
185
|
+
rewritten,
|
|
186
|
+
kept,
|
|
187
|
+
preserved: preservedHits,
|
|
188
|
+
absent,
|
|
189
|
+
failed,
|
|
190
|
+
bodyLinkPrefix,
|
|
191
|
+
charsBefore,
|
|
192
|
+
charsAfter,
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* One receipt line per outcome, for a caller that prints.
|
|
197
|
+
*
|
|
198
|
+
* Returns the lines rather than writing them, so the installer's `--quiet` and
|
|
199
|
+
* its progress-event emitter stay the only things deciding what a consumer sees.
|
|
200
|
+
*/
|
|
201
|
+
export function describeThinInstalledLayer(res) {
|
|
202
|
+
const out = [];
|
|
203
|
+
out.push(res.rewritten === 0 && res.thinned > 0
|
|
204
|
+
? ` claude-code: ${String(res.thinned)} rule(s) already thinned, ` +
|
|
205
|
+
`${String(res.kept)} kept full-bodied; ` +
|
|
206
|
+
`${String(res.charsAfter)} chars — nothing to rewrite`
|
|
207
|
+
: ` claude-code: thinned ${String(res.rewritten)} rule(s) to stubs, ` +
|
|
208
|
+
`${String(res.kept)} kept full-bodied; ` +
|
|
209
|
+
`${String(res.charsBefore)} -> ${String(res.charsAfter)} chars`);
|
|
210
|
+
if (res.preserved.length > 0) {
|
|
211
|
+
out.push(` claude-code: ${String(res.preserved.length)} rule(s) left full — you edited them ` +
|
|
212
|
+
`and they are preserved, never overwritten (${res.preserved.join(', ')})`);
|
|
213
|
+
}
|
|
214
|
+
for (const f of res.failed) {
|
|
215
|
+
out.push(` claude-code: ${f.rule}: could not write stub — ${f.reason}`);
|
|
216
|
+
}
|
|
217
|
+
return out;
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* The install receipt's instruction-budget block — step 1.4's "at install".
|
|
221
|
+
*
|
|
222
|
+
* The step asks for the limit, the split and the 80 % warning AT INSTALL, and
|
|
223
|
+
* the measurement existed only behind the standalone `installed_layer_report`
|
|
224
|
+
* CLI: `buildHostLimitRows`'s own docstring named "the install receipt" as the
|
|
225
|
+
* caller it was exported for, and that caller did not exist. A consumer whose
|
|
226
|
+
* layer is over budget learned it from the host, which is the notice the
|
|
227
|
+
* roadmap exists to remove.
|
|
228
|
+
*
|
|
229
|
+
* Global layers only, deliberately. The install writes `~/.claude/rules` and
|
|
230
|
+
* its siblings; a project layer is not what this run just changed, and folding
|
|
231
|
+
* one in would make the receipt's number disagree with the thing it is a
|
|
232
|
+
* receipt FOR.
|
|
233
|
+
*
|
|
234
|
+
* Never throws. A receipt that cannot be measured is silent rather than fatal —
|
|
235
|
+
* the deploy it describes has already happened correctly.
|
|
236
|
+
*/
|
|
237
|
+
export function installReceiptBudgetLines(packageRoot, home = os.homedir()) {
|
|
238
|
+
try {
|
|
239
|
+
const recorded = (() => {
|
|
240
|
+
try {
|
|
241
|
+
return readRecordedHashes(manifest_path(packageRoot), packageRoot);
|
|
242
|
+
}
|
|
243
|
+
catch {
|
|
244
|
+
return NO_RECORDED_HASHES;
|
|
245
|
+
}
|
|
246
|
+
})();
|
|
247
|
+
const layers = [];
|
|
248
|
+
for (const host of Object.keys(GLOBAL_RULE_DIRS).sort()) {
|
|
249
|
+
const dir = globalRuleLayerPath(host, home);
|
|
250
|
+
if (dir === null)
|
|
251
|
+
continue;
|
|
252
|
+
layers.push(readLayer(host, 'global', dir, recorded));
|
|
253
|
+
}
|
|
254
|
+
const rows = buildHostLimitRows(layers, loadHostInstructionLimits());
|
|
255
|
+
return rows.length === 0 ? [] : renderHostLimitRows(rows).map((l) => ` ${l}`);
|
|
256
|
+
}
|
|
257
|
+
catch {
|
|
258
|
+
return [];
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
//# sourceMappingURL=installThinLayer.js.map
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Do the links inside an installed rule file resolve from where the install
|
|
3
|
+
* puts it?
|
|
4
|
+
*
|
|
5
|
+
* A rule body is authored in `src/rules/` and projected to
|
|
6
|
+
* `dist/agent-src/rules/`, where `](../guidelines/x.md)` resolves because the
|
|
7
|
+
* sibling directory is right there. The installer then copies a SUBSET of
|
|
8
|
+
* those sibling directories into the host's rule directory, so the same link
|
|
9
|
+
* resolves or does not depending on a list in `install.ts` that the rule
|
|
10
|
+
* author never sees. Nothing checked the two against each other.
|
|
11
|
+
*
|
|
12
|
+
* This module answers one question per link — resolved, or why not — against a
|
|
13
|
+
* deploy plan rather than against a materialised tree, so the audit costs a
|
|
14
|
+
* `statSync` per distinct target instead of a copy of 299 skills.
|
|
15
|
+
*
|
|
16
|
+
* Side-effect-free, no CLI entry, no `process.exit`.
|
|
17
|
+
*/
|
|
18
|
+
import * as fs from 'node:fs';
|
|
19
|
+
import * as path from 'node:path';
|
|
20
|
+
/**
|
|
21
|
+
* Build a plan from `GLOBAL_DEPLOY_SOURCES`-shaped pairs.
|
|
22
|
+
*
|
|
23
|
+
* The empty destination (`cline` maps rules to the root) is deliberately kept:
|
|
24
|
+
* a rule installed at the root resolves `../x` differently, and silently
|
|
25
|
+
* dropping the entry would make this module answer a question about a layout
|
|
26
|
+
* that is not the one being installed.
|
|
27
|
+
*/
|
|
28
|
+
export function deployPlanFrom(pairs) {
|
|
29
|
+
const plan = new Map();
|
|
30
|
+
for (const [source, dest] of pairs)
|
|
31
|
+
plan.set(dest, source);
|
|
32
|
+
return plan;
|
|
33
|
+
}
|
|
34
|
+
/** Markdown inline links, minus the ones that are not a path into the tree. */
|
|
35
|
+
export function relativeLinkTargets(markdown) {
|
|
36
|
+
const out = [];
|
|
37
|
+
for (const m of markdown.matchAll(/\]\(([^)\s]+)\)/g)) {
|
|
38
|
+
const target = m[1];
|
|
39
|
+
if (/^[a-z][a-z0-9+.-]*:/i.test(target))
|
|
40
|
+
continue; // http:, mailto:, etc.
|
|
41
|
+
if (target.startsWith('#'))
|
|
42
|
+
continue; // same-file anchor
|
|
43
|
+
if (target.startsWith('/'))
|
|
44
|
+
continue; // absolute — not ours to resolve
|
|
45
|
+
out.push(target);
|
|
46
|
+
}
|
|
47
|
+
return out;
|
|
48
|
+
}
|
|
49
|
+
/** Strip a trailing `#anchor`; a bare directory link keeps its trailing slash. */
|
|
50
|
+
function withoutAnchor(target) {
|
|
51
|
+
const hash = target.indexOf('#');
|
|
52
|
+
return hash === -1 ? target : target.slice(0, hash);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Audit one link written in a rule that the install places at
|
|
56
|
+
* `<install-root>/<rulesDest>/<rule>.md`.
|
|
57
|
+
*/
|
|
58
|
+
export function auditLink(rule, target, rulesDest, plan, packageRoot) {
|
|
59
|
+
const bare = withoutAnchor(target);
|
|
60
|
+
// Resolve the link the way a reader does: from the installed file's own
|
|
61
|
+
// DIRECTORY — `rulesDest` is that directory, not the file — as a POSIX
|
|
62
|
+
// path relative to the install root. A sibling link (`[x](other.md)`, no
|
|
63
|
+
// `../`) therefore stays inside the rules directory, which is where the
|
|
64
|
+
// installer puts its sibling.
|
|
65
|
+
const fromDir = rulesDest === '' ? '.' : rulesDest;
|
|
66
|
+
const resolved = path.posix.normalize(path.posix.join(fromDir, bare));
|
|
67
|
+
if (resolved.startsWith('..')) {
|
|
68
|
+
return { rule, target, resolved_to: null, verdict: 'outside-install-root' };
|
|
69
|
+
}
|
|
70
|
+
const segments = resolved.split('/');
|
|
71
|
+
// Which deployed directory does this land in? Normally the first segment
|
|
72
|
+
// names it. When rules install at the install ROOT (`cline` maps them to
|
|
73
|
+
// `''`), there is no such segment: a sibling link like `](scope-control.md)`
|
|
74
|
+
// resolves to `scope-control.md`, whose first segment is a FILE NAME. Read
|
|
75
|
+
// literally that is `directory-not-deployed` for a file the install writes
|
|
76
|
+
// right beside the rule — 275 of cline's 523 links, every one of them fine.
|
|
77
|
+
// The `''` key exists in the plan precisely for this and could never be
|
|
78
|
+
// reached by a first-segment lookup.
|
|
79
|
+
const rootSource = plan.get('');
|
|
80
|
+
// The root entry answers for a BARE filename only. A link with a directory
|
|
81
|
+
// segment the plan does not carry is `directory-not-deployed`, the same as
|
|
82
|
+
// anywhere else — resolving it against the rules source would probe a path
|
|
83
|
+
// the install never writes and report `file-missing`, whose documented
|
|
84
|
+
// meaning ("the directory IS deployed") would then be false.
|
|
85
|
+
const useRoot = rootSource !== undefined && segments.length === 1;
|
|
86
|
+
const source = useRoot ? rootSource : plan.get(segments[0]);
|
|
87
|
+
const rest = useRoot ? segments : segments.slice(1);
|
|
88
|
+
if (source === undefined) {
|
|
89
|
+
return { rule, target, resolved_to: resolved, verdict: 'directory-not-deployed' };
|
|
90
|
+
}
|
|
91
|
+
// An empty `rest` means the link points at the deployed directory itself.
|
|
92
|
+
const onDisk = path.join(packageRoot, source, ...rest);
|
|
93
|
+
const exists = fs.existsSync(onDisk);
|
|
94
|
+
return {
|
|
95
|
+
rule,
|
|
96
|
+
target,
|
|
97
|
+
resolved_to: resolved,
|
|
98
|
+
verdict: exists ? 'resolved' : 'file-missing',
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
const EMPTY_COUNTS = () => ({
|
|
102
|
+
resolved: 0,
|
|
103
|
+
'outside-install-root': 0,
|
|
104
|
+
'directory-not-deployed': 0,
|
|
105
|
+
'file-missing': 0,
|
|
106
|
+
});
|
|
107
|
+
/**
|
|
108
|
+
* Audit every link in every rule the plan installs.
|
|
109
|
+
*
|
|
110
|
+
* `packageRoot` is the package checkout the installer copies FROM; the rule
|
|
111
|
+
* bodies are read from the plan's own rules source, so the audit cannot drift
|
|
112
|
+
* from what is shipped.
|
|
113
|
+
*/
|
|
114
|
+
export function auditInstalledRuleLinks(plan, packageRoot) {
|
|
115
|
+
const audits = [];
|
|
116
|
+
for (const [dest, source] of plan) {
|
|
117
|
+
if (!source.endsWith('/rules'))
|
|
118
|
+
continue;
|
|
119
|
+
const dir = path.join(packageRoot, source);
|
|
120
|
+
if (!fs.existsSync(dir))
|
|
121
|
+
continue;
|
|
122
|
+
const files = fs
|
|
123
|
+
.readdirSync(dir, { withFileTypes: true })
|
|
124
|
+
.filter((e) => !e.isDirectory() && e.name.endsWith('.md'))
|
|
125
|
+
.map((e) => e.name)
|
|
126
|
+
.sort();
|
|
127
|
+
for (const file of files) {
|
|
128
|
+
const rule = file.replace(/\.md$/, '');
|
|
129
|
+
const body = fs.readFileSync(path.join(dir, file), 'utf8');
|
|
130
|
+
for (const target of relativeLinkTargets(body)) {
|
|
131
|
+
audits.push(auditLink(rule, target, dest, plan, packageRoot));
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
const counts = EMPTY_COUNTS();
|
|
136
|
+
for (const a of audits)
|
|
137
|
+
counts[a.verdict] += 1;
|
|
138
|
+
const grouped = new Map();
|
|
139
|
+
for (const a of audits) {
|
|
140
|
+
if (a.verdict === 'resolved')
|
|
141
|
+
continue;
|
|
142
|
+
const key = a.resolved_to === null ? a.target.replace(/[^/]*$/, '') : a.resolved_to.split('/')[0];
|
|
143
|
+
const row = grouped.get(key);
|
|
144
|
+
if (row)
|
|
145
|
+
row.count += 1;
|
|
146
|
+
else
|
|
147
|
+
grouped.set(key, { count: 1, verdict: a.verdict });
|
|
148
|
+
}
|
|
149
|
+
const by_directory = [...grouped.entries()]
|
|
150
|
+
.map(([directory, v]) => ({ directory, count: v.count, verdict: v.verdict }))
|
|
151
|
+
.sort((a, b) => b.count - a.count || a.directory.localeCompare(b.directory));
|
|
152
|
+
return { audits, counts, by_directory };
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Standing-text cost of the rewrite option, in characters.
|
|
156
|
+
*
|
|
157
|
+
* Option A of this roadmap's step 1.2: leave the install plan alone and
|
|
158
|
+
* rewrite every link to an absolute package path. Each unresolved link then
|
|
159
|
+
* grows by the absolute prefix minus the `../` it replaces — and it grows
|
|
160
|
+
* INSIDE a rule body, which is the text the host loads as instructions.
|
|
161
|
+
*
|
|
162
|
+
* `prefixChars` is the installed package root's own length, which is a
|
|
163
|
+
* property of the machine, so the caller supplies it and the report says which
|
|
164
|
+
* value it used.
|
|
165
|
+
*/
|
|
166
|
+
export function rewriteOptionCost(report, prefixChars) {
|
|
167
|
+
const unresolved = report.audits.filter((a) => a.verdict !== 'resolved');
|
|
168
|
+
let total = 0;
|
|
169
|
+
for (const a of unresolved) {
|
|
170
|
+
// `../x` and `../../x` both become `<abs>/x`: the climb is replaced.
|
|
171
|
+
const climb = (a.target.match(/\.\.\//g) ?? []).length * 3;
|
|
172
|
+
total += prefixChars + 1 - climb;
|
|
173
|
+
}
|
|
174
|
+
return total;
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=installedRuleLinks.js.map
|
|
@@ -59,6 +59,30 @@ export const USER_SCOPE_PATHS = {
|
|
|
59
59
|
/**
|
|
60
60
|
* Universal Anthropic-shaped skill bundle deployed to markdown-skills
|
|
61
61
|
* tools. Mirrors `_CLAUDE_SKILL_BUNDLE` in the retired Python installer (ADR-200).
|
|
62
|
+
*
|
|
63
|
+
* NOT deploying `contexts/` and `guidelines/` here is a held decision, not an
|
|
64
|
+
* oversight — see the `rule-link-targets-change-the-frozen-install-abi` blocker
|
|
65
|
+
* on `road-to-rule-triggers-and-links-that-hold`.
|
|
66
|
+
*
|
|
67
|
+
* A rule is authored against the package tree and projected verbatim, so
|
|
68
|
+
* `](../guidelines/x.md)` resolves in `dist/agent-src/rules/` and then does
|
|
69
|
+
* not resolve in the install, because this table does not carry those two
|
|
70
|
+
* directories. Measured by `report_installed_rule_links` on 2026-10-03: 136 of
|
|
71
|
+
* 523 links in an installed Claude rule directory point nowhere, 112 of them
|
|
72
|
+
* into exactly those two. Adding them is the cheaper of the two repairs on the
|
|
73
|
+
* budget that is scarce — 0 standing characters against **5,152** for rewriting
|
|
74
|
+
* those same 112 links to absolute package paths, at a 48-character install
|
|
75
|
+
* prefix (the report prints the prefix it used; the figure scales with it).
|
|
76
|
+
*
|
|
77
|
+
* The totals were 160 of 550 when this was first measured and 158 of 545 on
|
|
78
|
+
* 2026-10-02; what fell since is the OTHER population — repo-tree link forms no
|
|
79
|
+
* install ever held — so the 112 this paragraph is about has not moved.
|
|
80
|
+
*
|
|
81
|
+
* It is held because this table is part of the FROZEN install ABI
|
|
82
|
+
* (`docs/contracts/install-layout.md`), and any change to it owes an
|
|
83
|
+
* `install_layout_version` bump plus a deprecation window: old and new shape
|
|
84
|
+
* side by side for a minor cycle, with in-place migration. That is a release
|
|
85
|
+
* commitment, not an implementation detail, so it is the owner's to make.
|
|
62
86
|
*/
|
|
63
87
|
const CLAUDE_SKILL_BUNDLE = [
|
|
64
88
|
['dist/agent-src/rules', 'rules'],
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"discovery": {
|
|
3
|
-
"artefact_count":
|
|
3
|
+
"artefact_count": 627,
|
|
4
4
|
"scanner_version": "de0a22b4ac4c"
|
|
5
5
|
},
|
|
6
|
-
"generated_at": "2026-
|
|
6
|
+
"generated_at": "2026-10-05",
|
|
7
7
|
"package": {
|
|
8
8
|
"description": "Governed skills, rules and commands for AI coding tools (Claude Code, Cursor, Windsurf, Copilot) \u2014 every claim machine-checked, including the counts in these badges.",
|
|
9
9
|
"homepage": "https://event4u-app.github.io/agent-config",
|
|
10
10
|
"name": "@event4u/agent-config",
|
|
11
11
|
"repository": "https://github.com/event4u-app/agent-config",
|
|
12
|
-
"version": "16.
|
|
12
|
+
"version": "16.3.0"
|
|
13
13
|
},
|
|
14
14
|
"registries": [
|
|
15
15
|
{
|
package/dist/mcp/server.json
CHANGED
|
@@ -9,12 +9,12 @@
|
|
|
9
9
|
"transport": {
|
|
10
10
|
"type": "stdio"
|
|
11
11
|
},
|
|
12
|
-
"version": "16.
|
|
12
|
+
"version": "16.3.0"
|
|
13
13
|
}
|
|
14
14
|
],
|
|
15
15
|
"repository": {
|
|
16
16
|
"source": "github",
|
|
17
17
|
"url": "https://github.com/event4u-app/agent-config"
|
|
18
18
|
},
|
|
19
|
-
"version": "16.
|
|
19
|
+
"version": "16.3.0"
|
|
20
20
|
}
|