@event4u/agent-config 14.12.0 → 14.14.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 +118 -155
- package/CONTRIBUTING.md +38 -0
- package/CREDITS.md +135 -0
- package/NOTICE +13 -0
- package/README.md +8 -6
- package/dist/agent-src/commands/analyze/inbox.md +145 -2
- package/dist/agent-src/commands/feature/dev.md +7 -2
- package/dist/agent-src/commands/ghostwriter/write.md +5 -1
- package/dist/agent-src/commands/implement-ticket.md +1 -1
- package/dist/agent-src/commands/mission/upgrade.md +1 -1
- package/dist/agent-src/commands/orchestrate.md +2 -2
- package/dist/agent-src/commands/post-as/me.md +5 -1
- package/dist/agent-src/commands/pr/merge.md +19 -6
- package/dist/agent-src/commands/roadmap/process-full.md +19 -5
- package/dist/agent-src/commands/tdd/red.md +12 -2
- package/dist/agent-src/commands/work.md +1 -1
- package/dist/agent-src/contexts/communication/rules-auto/token-efficiency-mechanics.md +40 -0
- package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +5 -2
- package/dist/agent-src/contexts/execution/autonomy-mechanics.md +21 -0
- package/dist/agent-src/contexts/execution/orchestration-telemetry.md +1 -0
- package/dist/agent-src/contexts/execution/subagent-response-contract.md +40 -0
- package/dist/agent-src/contexts/execution/subagent-steering.md +13 -1
- package/dist/agent-src/contexts/execution/terminal-states.md +96 -0
- package/dist/agent-src/rules/artifact-drafting-protocol.md +1 -1
- package/dist/agent-src/rules/broken-access-control.md +4 -0
- package/dist/agent-src/rules/code-comment-discipline.md +6 -0
- package/dist/agent-src/rules/code-provenance.md +4 -0
- package/dist/agent-src/rules/design-fidelity.md +1 -1
- package/dist/agent-src/rules/domain-safety-pii.md +4 -0
- package/dist/agent-src/rules/domain-safety-retention.md +4 -0
- package/dist/agent-src/rules/engineering-safety-floor.md +2 -0
- package/dist/agent-src/rules/external-code-graph-interop.md +14 -12
- package/dist/agent-src/rules/improve-before-implement.md +6 -8
- package/dist/agent-src/rules/laravel-routing.md +1 -1
- package/dist/agent-src/rules/lethal-trifecta-guard.md +4 -0
- package/dist/agent-src/rules/secret-vcs-guard.md +2 -0
- package/dist/agent-src/rules/security-sensitive-stop.md +2 -0
- package/dist/agent-src/rules/source-confidentiality.md +12 -34
- package/dist/agent-src/rules/symfony-routing.md +1 -1
- package/dist/agent-src/rules/token-efficiency.md +14 -0
- package/dist/agent-src/rules/tool-safety.md +4 -0
- package/dist/agent-src/rules/untrusted-input-defense.md +4 -0
- package/dist/agent-src/scripts/archive_completed_roadmaps.ts +252 -8
- package/dist/agent-src/scripts/guarded_baseline.ts +343 -0
- package/dist/agent-src/scripts/roadmap_set_step.ts +253 -0
- package/dist/agent-src/scripts/stub_queue.ts +82 -0
- package/dist/agent-src/scripts/stubs_due.ts +516 -0
- package/dist/agent-src/scripts/ticket_bundles.ts +84 -0
- package/dist/agent-src/scripts/update_roadmap_progress.ts +16 -12
- package/dist/agent-src/skills/brand-asset-generation/SKILL.md +17 -4
- package/dist/agent-src/skills/brand-audit/SKILL.md +33 -0
- package/dist/agent-src/skills/code-intelligence/SKILL.md +57 -0
- package/dist/agent-src/skills/database/SKILL.md +8 -0
- package/dist/agent-src/skills/dependency-upgrade/SKILL.md +27 -0
- package/dist/agent-src/skills/design-review/SKILL.md +1 -1
- package/dist/agent-src/skills/doc-coauthoring/SKILL.md +1 -1
- package/dist/agent-src/skills/existing-ui-audit/SKILL.md +17 -1
- package/dist/agent-src/skills/feature-planning/SKILL.md +9 -2
- package/dist/agent-src/skills/frontend-render-security/SKILL.md +44 -0
- package/dist/agent-src/skills/git-workflow/SKILL.md +1 -1
- package/dist/agent-src/skills/js-library-packaging/scripts/check_package_surface.ts +38 -4
- package/dist/agent-src/skills/judge-artifact-completeness/rubrics/ticket-quality-score.json +2 -2
- package/dist/agent-src/skills/laravel/SKILL.md +35 -0
- package/dist/agent-src/skills/laravel-migration/SKILL.md +57 -3
- package/dist/agent-src/skills/monorepo-workspace/SKILL.md +26 -0
- package/dist/agent-src/skills/playbook-authoring/SKILL.md +28 -1
- package/dist/agent-src/skills/react-shadcn-ui/SKILL.md +1 -1
- package/dist/agent-src/skills/skill-writing/references/procedure.md +5 -5
- package/dist/agent-src/skills/sql-writing/SKILL.md +7 -1
- package/dist/agent-src/skills/standards-from-config/SKILL.md +27 -4
- package/dist/agent-src/skills/supply-chain-intake/SKILL.md +11 -4
- package/dist/agent-src/skills/symfony-workflow/SKILL.md +35 -0
- package/dist/agent-src/skills/test-case-discovery/SKILL.md +85 -0
- package/dist/agent-src/skills/test-driven-development/SKILL.md +33 -9
- package/dist/agent-src/skills/testing-anti-patterns/SKILL.md +1 -1
- package/dist/agent-src/skills/testing-anti-patterns/process-anti-patterns.md +37 -0
- package/dist/agent-src/skills/ui-component-architect/SKILL.md +45 -2
- package/dist/agent-src/skills/upstream-contribute/SKILL.md +38 -1
- package/dist/agent-src/skills/verify-repair-loop/SKILL.md +9 -4
- package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
- package/dist/agent-src/templates/roadmaps.md +97 -3
- package/dist/agent-src/templates/scripts/check_memory.ts +258 -17
- package/dist/agent-src/templates/scripts/check_memory_proposal.ts +9 -3
- package/dist/agent-src/templates/scripts/memory_lookup.ts +86 -0
- package/dist/agent-src/templates/scripts/memory_signal.ts +44 -0
- package/dist/agent-src/templates/scripts/work_engine/directives/backend/implement.ts +90 -0
- package/dist/agent-src/templates/scripts/work_engine/directives/backend/index.ts +11 -0
- package/dist/agent-src/templates/scripts/work_engine/directives/backend/test.ts +23 -1
- package/dist/agent-src/templates/scripts/work_engine/directives/backend/verify.ts +10 -1
- package/dist/agent-src/templates/scripts/work_engine/directives/mixed/stitch.ts +5 -1
- package/dist/agent-src/templates/scripts/work_engine/stack/runner.ts +102 -14
- package/dist/cli/commands/uiAudit.js +124 -5
- package/dist/cli/registry.js +2 -0
- package/dist/cli-delegate/{chunk-HYWSRNUX.js → chunk-2DK2VJWG.js} +3 -3
- package/dist/cli-delegate/{chunk-JCW7ZLHK.js → chunk-4FS4WRXP.js} +5 -0
- package/dist/cli-delegate/{chunk-OMIVVCG2.js → chunk-A4QJ6ENT.js} +24 -0
- package/dist/cli-delegate/{chunk-JJA2QEWA.js → chunk-AKJGUQNO.js} +466 -285
- package/dist/cli-delegate/{chunk-E46KPN6K.js → chunk-BTWUYDGN.js} +424 -363
- package/dist/cli-delegate/{chunk-K4FFODTS.js → chunk-ILMUPLGW.js} +1227 -316
- package/dist/cli-delegate/{chunk-FF7WAFMR.js → chunk-KPBWFOPZ.js} +5 -1
- package/dist/cli-delegate/cmd_adr_effective.js +102 -0
- package/dist/cli-delegate/cmd_conformance.js +80 -11
- package/dist/cli-delegate/cmd_doctor.js +3 -3
- package/dist/cli-delegate/cmd_export.js +3 -2
- package/dist/cli-delegate/cmd_fleet.js +2 -2
- package/dist/cli-delegate/cmd_handoff.js +1 -1
- package/dist/cli-delegate/cmd_preflight.js +2 -2
- package/dist/cli-delegate/cmd_prune.js +3 -2
- package/dist/cli-delegate/cmd_settings_get.js +1 -1
- package/dist/cli-delegate/cmd_settings_migrate.js +3 -2
- package/dist/cli-delegate/cmd_settings_set.js +2 -2
- package/dist/cli-delegate/cmd_sync.js +3 -2
- package/dist/cli-delegate/cmd_uninstall.js +3 -2
- package/dist/cli-delegate/cmd_validate.js +3 -2
- package/dist/discovery/deprecation-report.md +1 -1
- package/dist/discovery/discovery-manifest.json +58 -58
- package/dist/discovery/discovery-manifest.json.sha256 +1 -1
- package/dist/discovery/discovery-manifest.summary.md +1 -1
- package/dist/discovery/dormancy-report.md +1 -1
- package/dist/discovery/orphan-report.md +1 -1
- package/dist/discovery/packs.json +2 -2
- package/dist/discovery/trust-report.md +1 -1
- package/dist/discovery/workspaces.json +2 -2
- package/dist/hooks/dispatch.js +2900 -1049
- package/dist/install/claudeRuleRewrite.js +254 -0
- package/dist/install/detect.js +29 -16
- package/dist/install/detect_php_shape.js +159 -0
- package/dist/install/install.mjs +634 -428
- package/dist/mcp/awesome-mcp-servers.row.md +1 -1
- package/dist/mcp/mcp-cloudflare-catalogue.json +1 -1
- package/dist/mcp/registry-manifest.json +3 -3
- package/dist/mcp/server.json +3 -3
- package/dist/mcp/server.mjs +4895 -2627
- package/dist/server/schemas/settings.js +3 -0
- package/dist/ui/assets/index-D0jaCRPM.js +29 -0
- package/dist/ui/index.html +1 -1
- package/docs/MIGRATION.md +1 -1
- package/docs/THIRD-PARTY-NOTICES.md +25 -0
- package/docs/contracts/provider-lifecycle.md +1 -1
- package/docs/contracts/settings-classes.md +10 -4
- package/docs/guidelines/agent-infra/5w2h-analysis.md +3 -3
- package/docs/guidelines/agent-infra/agent-interaction-and-decision-quality.md +1 -0
- package/docs/guidelines/agent-infra/artifact-drafting-protocol-mechanics.md +58 -3
- package/docs/guidelines/agent-infra/ask-when-uncertain-demos.md +2 -2
- package/docs/guidelines/agent-infra/asking-and-brevity-examples.md +3 -3
- package/docs/guidelines/agent-infra/break-glass-usage.md +7 -7
- package/docs/guidelines/agent-infra/carve-out-predicates.md +3 -3
- package/docs/guidelines/agent-infra/comparison-matrix.md +1 -1
- package/docs/guidelines/agent-infra/critical-thinking.md +4 -4
- package/docs/guidelines/agent-infra/direct-answers-demos.md +2 -2
- package/docs/guidelines/agent-infra/domain-eval-anti-pattern.md +1 -1
- package/docs/guidelines/agent-infra/engineering-memory-data-format.md +3 -3
- package/docs/guidelines/agent-infra/existence-question-verdicts.md +80 -0
- package/docs/guidelines/agent-infra/first-principles.md +2 -2
- package/docs/guidelines/agent-infra/framework-neutrality-patterns.md +2 -2
- package/docs/guidelines/agent-infra/guarded-baseline.md +39 -0
- package/docs/guidelines/agent-infra/inversion-thinking.md +5 -5
- package/docs/guidelines/agent-infra/language-and-tone-examples.md +1 -1
- package/docs/guidelines/agent-infra/layered-settings.md +10 -10
- package/docs/guidelines/agent-infra/memory-access.md +1 -1
- package/docs/guidelines/agent-infra/mental-models.md +3 -3
- package/docs/guidelines/agent-infra/reuse-verdict-mechanics.md +71 -0
- package/docs/guidelines/agent-infra/review-routing-data-format.md +7 -7
- package/docs/guidelines/agent-infra/roadmap-progress-mechanics.md +13 -7
- package/docs/guidelines/agent-infra/role-contracts.md +2 -2
- package/docs/guidelines/agent-infra/role-mode-router.md +3 -3
- package/docs/guidelines/agent-infra/rule-type-governance.md +2 -2
- package/docs/guidelines/agent-infra/scqa-framework.md +5 -5
- package/docs/guidelines/agent-infra/self-improvement-pipeline.md +6 -6
- package/docs/guidelines/agent-infra/simplicity-and-goal-demos.md +2 -2
- package/docs/guidelines/agent-infra/six-hats.md +3 -3
- package/docs/guidelines/agent-infra/skill-quality-checklist.md +6 -6
- package/docs/guidelines/agent-infra/source-confidentiality-mechanics.md +109 -0
- package/docs/guidelines/agent-infra/systems-thinking.md +1 -1
- package/docs/guidelines/agent-infra/verify-before-complete-demos.md +2 -2
- package/docs/guidelines/augment-portability-patterns.md +6 -4
- package/docs/guidelines/code-clarity.md +18 -0
- package/docs/guidelines/component-oriented-and-oop-development.md +3 -2
- package/docs/guidelines/cross-role-handoff.md +2 -2
- package/docs/guidelines/design-fidelity-mechanics.md +1 -1
- package/docs/guidelines/docs/readme-size-and-splitting.md +3 -3
- package/docs/guidelines/php/database.md +90 -7
- package/docs/guidelines/prompt-templates.md +7 -7
- package/llms.txt +2 -2
- package/package.json +5 -2
- package/src/agent-src/scripts/archive_completed_roadmaps.ts +252 -8
- package/src/agent-src/scripts/guarded_baseline.ts +343 -0
- package/src/agent-src/scripts/roadmap_set_step.ts +253 -0
- package/src/agent-src/scripts/stub_queue.ts +82 -0
- package/src/agent-src/scripts/stubs_due.ts +516 -0
- package/src/agent-src/scripts/ticket_bundles.ts +84 -0
- package/src/agent-src/scripts/update_roadmap_progress.ts +16 -12
- package/src/agent-src/templates/scripts/check_memory.ts +258 -17
- package/src/agent-src/templates/scripts/check_memory_proposal.ts +9 -3
- package/src/agent-src/templates/scripts/memory_lookup.ts +86 -0
- package/src/agent-src/templates/scripts/memory_signal.ts +44 -0
- package/src/agent-src/templates/scripts/work_engine/directives/backend/implement.ts +90 -0
- package/src/agent-src/templates/scripts/work_engine/directives/backend/index.ts +11 -0
- package/src/agent-src/templates/scripts/work_engine/directives/backend/test.ts +23 -1
- package/src/agent-src/templates/scripts/work_engine/directives/backend/verify.ts +10 -1
- package/src/agent-src/templates/scripts/work_engine/directives/mixed/stitch.ts +5 -1
- package/src/agent-src/templates/scripts/work_engine/stack/runner.ts +102 -14
- package/src/config/agent-settings.template.yml +32 -3
- package/src/config/assurance-capability-registry.json +21 -9
- package/src/config/canonical-terms.yml +119 -0
- package/src/config/capability-native-outcome-bars.json +81 -0
- package/src/config/ci-local-parity.yml +80 -0
- package/src/config/drafting-channels.yml +43 -0
- package/src/config/estate-count-budget.json +57 -36
- package/src/config/evaluator-budgets.json +14 -14
- package/src/config/gate-coverage.yml +729 -63
- package/src/config/gate-reachability-exemptions.json +21 -0
- package/src/config/gate-violation-baselines.json +42 -19
- package/src/config/harness-evolution-budget.json +25 -0
- package/src/config/lapsed-beta-baseline.json +96 -0
- package/src/config/memory-twin-verdicts.yml +129 -0
- package/src/config/metric-registry.yml +124 -0
- package/src/config/pack-size-budget.json +16 -15
- package/src/config/preamble-payload-budget.json +12 -4
- package/src/config/profiles/balanced.ini +27 -0
- package/src/config/profiles/full.ini +27 -0
- package/src/config/profiles/minimal.ini +27 -0
- package/src/config/publish-surface.json +9 -2
- package/src/config/routing-coverage-seed.json +16 -2
- package/src/config/rule-stub-ceilings.json +133 -112
- package/src/config/turnaround-budget.json +66 -0
- package/src/install/claudeRuleRewrite.ts +288 -0
- package/src/install/detect.ts +60 -17
- package/src/install/detect_php_shape.ts +191 -0
- package/src/scripts/_cli/cmd_doctor.ts +27 -112
- package/src/scripts/_dispatch.bash +23 -0
- package/src/scripts/_lib/activation_ladder.ts +255 -0
- package/src/scripts/_lib/activation_receipt_producer.ts +341 -0
- package/src/scripts/_lib/activation_states.ts +88 -0
- package/src/scripts/_lib/adherence_detectors.ts +143 -0
- package/src/scripts/_lib/adr_frontmatter.ts +26 -0
- package/src/scripts/_lib/arith_claims.ts +181 -0
- package/src/scripts/_lib/arm_ranking.ts +62 -0
- package/src/scripts/_lib/asset_delivery_ledger.ts +303 -0
- package/src/scripts/_lib/audit_field_provenance.ts +54 -0
- package/src/scripts/_lib/auto_dispatch.ts +32 -3
- package/src/scripts/_lib/bench_ab_size_claim.ts +98 -4
- package/src/scripts/_lib/benchmark_cache_fields.ts +158 -0
- package/src/scripts/_lib/candidate_pair_delta.ts +349 -0
- package/src/scripts/_lib/candidate_proposer.ts +402 -0
- package/src/scripts/_lib/candidate_record.ts +601 -0
- package/src/scripts/_lib/capture_rate.ts +319 -0
- package/src/scripts/_lib/carrier_status.ts +118 -0
- package/src/scripts/_lib/cascade_stage_enumeration.ts +92 -0
- package/src/scripts/_lib/collector_denominator.ts +771 -0
- package/src/scripts/_lib/collector_record.ts +340 -0
- package/src/scripts/_lib/collector_store.ts +664 -0
- package/src/scripts/_lib/collector_supervision.ts +827 -0
- package/src/scripts/_lib/concern_estate.ts +77 -0
- package/src/scripts/_lib/config_chain.ts +477 -0
- package/src/scripts/_lib/config_cost.ts +209 -0
- package/src/scripts/_lib/corpus_manifest.ts +726 -0
- package/src/scripts/_lib/council_settings_block.ts +6 -0
- package/src/scripts/_lib/curator_ops.ts +172 -0
- package/src/scripts/_lib/delivery_arm_experiment.ts +282 -0
- package/src/scripts/_lib/delivery_criticality.ts +126 -0
- package/src/scripts/_lib/doctor_runtime_checks.ts +70 -0
- package/src/scripts/_lib/empty_cycles.ts +88 -0
- package/src/scripts/_lib/estate_carrier_cases.ts +72 -0
- package/src/scripts/_lib/eval_publication.ts +354 -0
- package/src/scripts/_lib/evaluation_cascade.ts +452 -0
- package/src/scripts/_lib/evaluation_vector.ts +283 -0
- package/src/scripts/_lib/evaluator_promotion.ts +225 -0
- package/src/scripts/_lib/evidence_basis.ts +118 -0
- package/src/scripts/_lib/evolution_roi.ts +562 -0
- package/src/scripts/_lib/exec_evidence.ts +8 -0
- package/src/scripts/_lib/experience_card.ts +272 -0
- package/src/scripts/_lib/experience_report.ts +151 -0
- package/src/scripts/_lib/experiment_freeze.ts +112 -0
- package/src/scripts/_lib/generated_by.ts +66 -0
- package/src/scripts/_lib/harness_evolution_guards.ts +239 -0
- package/src/scripts/_lib/hook_effect_probe.ts +141 -0
- package/src/scripts/_lib/host_denominator.ts +687 -0
- package/src/scripts/_lib/host_projection_reach.ts +157 -0
- package/src/scripts/_lib/ignored_blocker.ts +148 -0
- package/src/scripts/_lib/install_reach_checks.ts +495 -0
- package/src/scripts/_lib/json_duplicate_keys.ts +150 -0
- package/src/scripts/_lib/judge_hygiene.ts +228 -0
- package/src/scripts/_lib/legacy_boundary_map.ts +228 -0
- package/src/scripts/_lib/lexical_shortlist.ts +215 -0
- package/src/scripts/_lib/llm_candidate_proposer.ts +461 -0
- package/src/scripts/_lib/llm_proposer_transport.ts +153 -0
- package/src/scripts/_lib/loop_guards.ts +299 -0
- package/src/scripts/_lib/loss_class.ts +129 -0
- package/src/scripts/_lib/machine_wake.ts +51 -0
- package/src/scripts/_lib/md_prose_lines.ts +177 -0
- package/src/scripts/_lib/minimality_tiebreak.ts +168 -0
- package/src/scripts/_lib/one_resolver_invariant.ts +449 -0
- package/src/scripts/_lib/orchestration_record.ts +253 -5
- package/src/scripts/_lib/outcome_envelope.ts +227 -0
- package/src/scripts/_lib/outcome_vocabularies.ts +125 -0
- package/src/scripts/_lib/paired_stats.ts +245 -0
- package/src/scripts/_lib/paired_verdict.ts +226 -0
- package/src/scripts/_lib/pathology_archive.ts +393 -0
- package/src/scripts/_lib/prefix_stable_surfaces.ts +123 -0
- package/src/scripts/_lib/privacy_class.ts +47 -0
- package/src/scripts/_lib/promotion_capability.ts +315 -0
- package/src/scripts/_lib/promotion_evidence.ts +414 -0
- package/src/scripts/_lib/promotion_review.ts +294 -0
- package/src/scripts/_lib/prompt_shape.ts +92 -0
- package/src/scripts/_lib/regression_neighbourhood.ts +259 -0
- package/src/scripts/_lib/release_highlights.ts +70 -1
- package/src/scripts/_lib/release_material.ts +125 -2
- package/src/scripts/_lib/repeated_failure.ts +105 -0
- package/src/scripts/_lib/repo_root.ts +111 -0
- package/src/scripts/_lib/review_skipped_record.ts +37 -0
- package/src/scripts/_lib/role_split.ts +338 -0
- package/src/scripts/_lib/routing_corpus.ts +307 -0
- package/src/scripts/_lib/routing_index_input.ts +104 -0
- package/src/scripts/_lib/rule_injection.ts +22 -1
- package/src/scripts/_lib/runtime_journal.ts +1499 -0
- package/src/scripts/_lib/runtime_wiring_checks.ts +430 -0
- package/src/scripts/_lib/semantic_noop.ts +167 -0
- package/src/scripts/_lib/skill_catalogue.ts +11 -1
- package/src/scripts/_lib/source_digest.ts +200 -0
- package/src/scripts/_lib/source_redact.ts +260 -0
- package/src/scripts/_lib/source_shape.ts +502 -0
- package/src/scripts/_lib/source_snapshot_dedup.ts +199 -0
- package/src/scripts/_lib/strip_comments.d.mts +8 -0
- package/src/scripts/_lib/strip_comments.mjs +65 -0
- package/src/scripts/_lib/test_red_state.ts +154 -0
- package/src/scripts/_lib/trigger_shift.ts +144 -0
- package/src/scripts/_lib/untrusted_content.ts +82 -7
- package/src/scripts/activation_receipt.ts +258 -0
- package/src/scripts/adoption_report.ts +1 -1
- package/src/scripts/adr/evidence_census.ts +1 -1
- package/src/scripts/adr/regenerate_index.ts +26 -2
- package/src/scripts/adr_cite_check.ts +164 -1
- package/src/scripts/ai_council/blind_review.ts +11 -1
- package/src/scripts/ai_council/clients.ts +4 -0
- package/src/scripts/ai_council/config.ts +3 -0
- package/src/scripts/ai_council/consensus.ts +28 -8
- package/src/scripts/ai_council/consensus_round.ts +226 -0
- package/src/scripts/ai_council/cross_exam.ts +128 -0
- package/src/scripts/ai_council/disagreement_signal.ts +338 -0
- package/src/scripts/ai_council/explain_route.ts +157 -0
- package/src/scripts/ai_council/information_gain.ts +293 -0
- package/src/scripts/ai_council/inline_findings.ts +340 -0
- package/src/scripts/ai_council/judge_position_bias.ts +197 -0
- package/src/scripts/ai_council/leakage_corpus.ts +385 -0
- package/src/scripts/ai_council/leakage_patterns.ts +453 -0
- package/src/scripts/ai_council/minority_retention.ts +171 -0
- package/src/scripts/ai_council/orchestrator.ts +16 -203
- package/src/scripts/ai_council/orchestrator_results.ts +23 -3
- package/src/scripts/ai_council/pricing.ts +106 -0
- package/src/scripts/ai_council/prompts.ts +74 -7
- package/src/scripts/ai_council/provider_leakage_bench.ts +327 -0
- package/src/scripts/ai_council/py_format.ts +14 -3
- package/src/scripts/ai_council/recouncil_guard.ts +293 -0
- package/src/scripts/ai_council/recouncil_savings.ts +299 -0
- package/src/scripts/ai_council/replay_route.ts +223 -0
- package/src/scripts/ai_council/response_record.ts +50 -0
- package/src/scripts/ai_council/reviewer_assignment.ts +279 -0
- package/src/scripts/ai_council/routing_training_row.ts +197 -0
- package/src/scripts/ai_council/synthesis_strategy.ts +159 -0
- package/src/scripts/ai_council/topology_bench_manifest.ts +860 -0
- package/src/scripts/ai_council/topology_vocabulary.ts +175 -0
- package/src/scripts/asset_delivery_ledger.ts +157 -0
- package/src/scripts/attest_artifact.ts +193 -0
- package/src/scripts/audit_auto_rules.ts +2 -1
- package/src/scripts/audit_command_surface.ts +1 -1
- package/src/scripts/audit_mcp_tools.ts +2 -2
- package/src/scripts/audit_skill_overlap_allowlist.json +6 -1
- package/src/scripts/audit_user_type_axis.ts +2 -1
- package/src/scripts/bench_ab_clone.ts +215 -10
- package/src/scripts/bench_ab_integrity.ts +119 -5
- package/src/scripts/bench_ab_v2_stats.ts +40 -213
- package/src/scripts/build_archive_index.ts +1 -1
- package/src/scripts/build_linear_digest.ts +1 -1
- package/src/scripts/build_proof.ts +11 -4
- package/src/scripts/build_rule_trigger_matrix.ts +1 -1
- package/src/scripts/build_source_digests.ts +157 -0
- package/src/scripts/cache_realization_report.ts +103 -0
- package/src/scripts/check_adr_frontmatter.ts +131 -10
- package/src/scripts/check_benchmark_report_fields.ts +207 -0
- package/src/scripts/check_beta_review_markers.ts +235 -6
- package/src/scripts/check_bundle_path_leakage.ts +34 -1
- package/src/scripts/check_claims.ts +576 -6
- package/src/scripts/check_composite_arming.ts +35 -0
- package/src/scripts/check_concern_admissions.ts +365 -0
- package/src/scripts/check_enforcement_coverage.ts +28 -0
- package/src/scripts/check_estate_count.ts +347 -25
- package/src/scripts/check_gate_reachability.ts +383 -0
- package/src/scripts/check_host_loadability.ts +104 -0
- package/src/scripts/check_loss_class_declared.ts +308 -0
- package/src/scripts/check_md_language.ts +15 -98
- package/src/scripts/check_memory_proposal.ts +18 -11
- package/src/scripts/check_no_currency_in_cost_surfaces.ts +225 -0
- package/src/scripts/check_no_external_sources.ts +281 -6
- package/src/scripts/check_pack_conformance_fixture.ts +11 -1
- package/src/scripts/check_pack_size.ts +59 -2
- package/src/scripts/check_preamble_payload_budget.ts +114 -3
- package/src/scripts/check_prefix_stable_mutation.ts +372 -0
- package/src/scripts/check_publish_surface.ts +10 -1
- package/src/scripts/check_references.ts +24 -1
- package/src/scripts/check_release_highlights.ts +96 -13
- package/src/scripts/check_roadmap_trackable.ts +17 -2
- package/src/scripts/check_rule_evidence_declaration.ts +316 -0
- package/src/scripts/check_rule_projection_integrity.ts +14 -4
- package/src/scripts/check_score_contract.ts +26 -3
- package/src/scripts/check_static_parity.ts +285 -0
- package/src/scripts/check_supervision_claim_atomicity.ts +498 -0
- package/src/scripts/check_suppression_hygiene.ts +15 -0
- package/src/scripts/ci_settle.ts +39 -2
- package/src/scripts/code_graph/build.ts +60 -3
- package/src/scripts/code_graph/extract.ts +44 -0
- package/src/scripts/code_graph/types.ts +24 -0
- package/src/scripts/collector_daemon.ts +714 -0
- package/src/scripts/config_cost_report.ts +302 -0
- package/src/scripts/consumer_matrix.ts +74 -1
- package/src/scripts/corpus_manifest.ts +235 -0
- package/src/scripts/cost/budget.mjs +10 -3
- package/src/scripts/cost/track.mjs +10 -3
- package/src/scripts/council_cli.ts +37 -54
- package/src/scripts/dispatch_r2_reviewer.ts +46 -5
- package/src/scripts/evolution_lab.ts +1153 -0
- package/src/scripts/external_sources_denylist.json +5 -18
- package/src/scripts/extract_audit_patterns.ts +21 -0
- package/src/scripts/fold_intake.ts +12 -1
- package/src/scripts/gen_discovery_baseline.ts +1 -1
- package/src/scripts/generate_capabilities_index.ts +12 -5
- package/src/scripts/generate_capability_matrix.ts +3 -3
- package/src/scripts/generate_command_flows.ts +2 -2
- package/src/scripts/generate_cookbook.ts +2 -2
- package/src/scripts/generate_index.ts +8 -1
- package/src/scripts/generate_knowledge_index.ts +2 -1
- package/src/scripts/generate_ownership_matrix.ts +2 -1
- package/src/scripts/generate_pack_manifests.ts +10 -2
- package/src/scripts/generate_role_experiences_catalog.ts +2 -2
- package/src/scripts/generate_settings_reference.ts +1 -1
- package/src/scripts/git_authorization_hook.ts +22 -1
- package/src/scripts/grade_target_readiness.ts +48 -5
- package/src/scripts/hook_effect_doctor.ts +261 -0
- package/src/scripts/hook_manifest.json +1 -1
- package/src/scripts/hook_manifest.yaml +125 -16
- package/src/scripts/hooks/block_speaking_inbox_dir.ts +271 -0
- package/src/scripts/hooks/block_unauthorized_git.ts +18 -0
- package/src/scripts/hooks/comment_discipline_hook.ts +146 -0
- package/src/scripts/hooks/concern_registry.ts +6 -0
- package/src/scripts/hooks/dispatch_hook.ts +32 -0
- package/src/scripts/hooks/journal_record_hook.ts +345 -0
- package/src/scripts/hooks/prepush_metadata_sources.sh +110 -0
- package/src/scripts/hooks/run_continuation_hook.ts +44 -9
- package/src/scripts/hooks/shims/install.sh +61 -0
- package/src/scripts/hooks/shims/php +101 -0
- package/src/scripts/hooks/suggestion_capture_hook.ts +10 -0
- package/src/scripts/hooks/turn_end_gate_hook.ts +9 -1
- package/src/scripts/hot_context_hook.ts +16 -0
- package/src/scripts/install-hooks.sh +20 -5
- package/src/scripts/install.ts +17 -35
- package/src/scripts/inventory_frontmatter.ts +2 -1
- package/src/scripts/language_mirror_hook.ts +14 -2
- package/src/scripts/lint_adr_sweep_routing.ts +12 -0
- package/src/scripts/lint_canonical_terms.ts +604 -0
- package/src/scripts/lint_carrier_integrity.ts +820 -0
- package/src/scripts/lint_code_comments.ts +643 -0
- package/src/scripts/lint_composition_review.ts +619 -0
- package/src/scripts/lint_consolidation_lineage.ts +666 -0
- package/src/scripts/lint_eval_specs.ts +593 -0
- package/src/scripts/lint_hook_manifest.ts +19 -0
- package/src/scripts/lint_host_portability.ts +373 -0
- package/src/scripts/lint_judge_prompt_expectation.ts +27 -1
- package/src/scripts/lint_memory_twin_parity.ts +335 -0
- package/src/scripts/lint_metric_consumers.ts +355 -0
- package/src/scripts/lint_plan_risk_register.ts +39 -19
- package/src/scripts/lint_promotion_paths.ts +779 -0
- package/src/scripts/lint_skill_descriptions.ts +18 -1
- package/src/scripts/lint_skill_frontmatter_safety.ts +58 -0
- package/src/scripts/lint_skill_link_reach.ts +252 -0
- package/src/scripts/lint_skill_trigger_corpus.ts +426 -23
- package/src/scripts/lint_ticket_buildable.ts +17 -1
- package/src/scripts/llm_propose.ts +256 -0
- package/src/scripts/mcp_server/consumer_tool_catalog.json +1 -1
- package/src/scripts/mcp_server/tool_catalog_source.ts +1 -1
- package/src/scripts/measure_delivery_sets.ts +361 -0
- package/src/scripts/measure_docs_dead_links.ts +348 -0
- package/src/scripts/measure_host_capture.ts +461 -0
- package/src/scripts/measure_routing_signal.ts +307 -0
- package/src/scripts/migration_status.ts +3 -3
- package/src/scripts/model_rule_injection.ts +76 -0
- package/src/scripts/orchestration_record.ts +14 -0
- package/src/scripts/preamble_byte_census.ts +139 -10
- package/src/scripts/prepack-check.mjs +4 -1
- package/src/scripts/probe_council_retention.ts +495 -0
- package/src/scripts/probe_turnaround.ts +384 -0
- package/src/scripts/probe_unblocked_ask.ts +279 -0
- package/src/scripts/release.ts +21 -37
- package/src/scripts/release_drill.ts +143 -0
- package/src/scripts/release_env.ts +35 -0
- package/src/scripts/release_publication.ts +84 -0
- package/src/scripts/render_benchmark_md.ts +1 -1
- package/src/scripts/rule_activation_census.ts +70 -9
- package/src/scripts/rule_backlinks.ts +1 -1
- package/src/scripts/run_lifecycle_suite.ts +208 -0
- package/src/scripts/run_skill_evals.ts +40 -0
- package/src/scripts/schemas/delivery-manifest.schema.json +43 -0
- package/src/scripts/schemas/drafting-channels.schema.json +43 -0
- package/src/scripts/schemas/evals.schema.json +24 -1
- package/src/scripts/schemas/rule.schema.json +52 -1
- package/src/scripts/schemas/skill.schema.json +17 -2
- package/src/scripts/skill_overlap.ts +7 -1
- package/src/scripts/skill_tools/run_block_d_eval.ts +8 -1
- package/src/scripts/skill_tools/score_skill_relevance.ts +84 -3
- package/src/scripts/skill_tools/suggest_skill_for_task.ts +8 -1
- package/src/scripts/skill_usage_report.ts +2 -1
- package/src/scripts/stubs_due.ts +211 -0
- package/src/scripts/sweep_source_surfaces.ts +678 -0
- package/src/scripts/sync_pr_branch.ts +3 -3
- package/src/scripts/trigger_eval_grandfather.json +202 -222
- package/src/scripts/utilization_report.ts +22 -2
- package/src/server/schemas/settings.ts +5 -0
- package/src/templates/marketing-copy.yml +1 -1
- package/dist/ui/assets/index-Cxgy63kz.js +0 -26
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rewrite installed Claude Code rule files into host form, in place.
|
|
3
|
+
*
|
|
4
|
+
* ## The gap this closes
|
|
5
|
+
*
|
|
6
|
+
* `condense.ts::_emit_claude_rule` shapes a rule for Claude Code — it emits
|
|
7
|
+
* `paths:` and nothing else, because `paths:` is the one activation key the
|
|
8
|
+
* probed contract records this host as reading. It runs on the MAINTAINER
|
|
9
|
+
* projection path only. The installer's deploy loop copies
|
|
10
|
+
* `dist/agent-src/rules/` verbatim into the host anchor
|
|
11
|
+
* (`_copy_dir_dereferencing_symlinks`, `install.ts`), so an installed
|
|
12
|
+
* `~/.claude/rules/` receives the SOURCE form: agent-config's own frontmatter
|
|
13
|
+
* vocabulary (`type`, `tier`, `triggers`, …), none of which this host reads.
|
|
14
|
+
*
|
|
15
|
+
* Measured on a real install, 2026-08-30, before this module existed:
|
|
16
|
+
*
|
|
17
|
+
* ```
|
|
18
|
+
* files 104 · declaring paths: 0
|
|
19
|
+
* ⚠️ diverges from the source verdict (4 scoped)
|
|
20
|
+
* ```
|
|
21
|
+
*
|
|
22
|
+
* The consequence is not cosmetic. On Claude Code `paths:` is EXCLUSIVE — with
|
|
23
|
+
* it a rule loads on a path match, without it the rule loads unconditionally —
|
|
24
|
+
* so three rules the emitter classifies path-only arrived in every session
|
|
25
|
+
* instead of on file contact.
|
|
26
|
+
*
|
|
27
|
+
* ## Why it lives here and not in `condense.ts`
|
|
28
|
+
*
|
|
29
|
+
* Same reasoning `claudePathsPlan.ts` beside it records: this is
|
|
30
|
+
* host-activation-key logic on the INSTALL side, and `condense.ts` is a
|
|
31
|
+
* multi-thousand-line orchestrator already past the source-size ceiling. Both
|
|
32
|
+
* of this module's inputs are already installer-side — `_claude_paths_plan`
|
|
33
|
+
* from `claudePathsPlan.ts` and `parseFrontmatter` from `ruleInScope.ts` — so
|
|
34
|
+
* nothing here reaches back into the projection graph, and the installer bundle
|
|
35
|
+
* gains no dependency on it.
|
|
36
|
+
*
|
|
37
|
+
* The two emitters are held together by a test rather than by a shared call:
|
|
38
|
+
* `tests/install/claude_rule_rewrite.test.ts` asserts, over every rule in
|
|
39
|
+
* `src/rules/`, that this module's plan is byte-identical to the one
|
|
40
|
+
* `condense.ts` emits. A divergence fails there rather than silently shipping
|
|
41
|
+
* two different activation surfaces to the same host.
|
|
42
|
+
*
|
|
43
|
+
* Side-effect-free apart from the writes it is asked to make. No CLI entry, no
|
|
44
|
+
* `process.exit`.
|
|
45
|
+
*/
|
|
46
|
+
import * as fs from 'node:fs';
|
|
47
|
+
import * as path from 'node:path';
|
|
48
|
+
import { _claude_paths_plan } from './claudePathsPlan.js';
|
|
49
|
+
import { parseFrontmatter } from './ruleInScope.js';
|
|
50
|
+
/**
|
|
51
|
+
* Frontmatter keys the rewrite must carry across, and why each one.
|
|
52
|
+
*
|
|
53
|
+
* `_inject_package_tag` (install.ts) writes these during the copy that runs
|
|
54
|
+
* immediately BEFORE this rewrite. `reap_tagged_orphans` then matches on the
|
|
55
|
+
* literal `package:` line — its own docblock calls itself "the only path with
|
|
56
|
+
* ownership proof independent of inventory history" — and doctor's stale-orphan
|
|
57
|
+
* check reads the same tag.
|
|
58
|
+
*
|
|
59
|
+
* A rewrite that rebuilt each file from the activation plan alone therefore
|
|
60
|
+
* DELETED the reaper's only evidence: zero files under the host anchor would
|
|
61
|
+
* carry the tag, the marker-based reaper would be dead for that subtree, and
|
|
62
|
+
* doctor would report `ok` there permanently. Found by the completion review of
|
|
63
|
+
* 2026-08-30, with a fixture: a tagged orphan was reaped before the rewrite and
|
|
64
|
+
* invisible after it.
|
|
65
|
+
*
|
|
66
|
+
* So the host form is activation keys PLUS these, and the two concerns are kept
|
|
67
|
+
* apart on purpose — {@link renderClaudeRule} stays activation-only so it can go
|
|
68
|
+
* on being compared byte-for-byte against the projection emitter, which never
|
|
69
|
+
* sees an install-time tag.
|
|
70
|
+
*/
|
|
71
|
+
export const PRESERVED_KEYS = ['package', 'source_path'];
|
|
72
|
+
/**
|
|
73
|
+
* Splice the ownership keys of `original` into the activation-only `rendered`.
|
|
74
|
+
*
|
|
75
|
+
* Raw lines are carried across verbatim rather than re-serialised, so a quoted
|
|
76
|
+
* or unusually-spaced value cannot drift on the way through — the reaper matches
|
|
77
|
+
* a literal.
|
|
78
|
+
*/
|
|
79
|
+
export function _withPreservedKeys(rendered, original) {
|
|
80
|
+
const keep = [];
|
|
81
|
+
if (original.startsWith('---')) {
|
|
82
|
+
const end = original.indexOf('\n---', 3);
|
|
83
|
+
if (end !== -1) {
|
|
84
|
+
for (const line of original.slice(3, end).split('\n')) {
|
|
85
|
+
if (PRESERVED_KEYS.some((k) => line.startsWith(`${k}:`)))
|
|
86
|
+
keep.push(line);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
if (keep.length === 0)
|
|
91
|
+
return rendered;
|
|
92
|
+
if (rendered.startsWith('---\n')) {
|
|
93
|
+
const end = rendered.indexOf('\n---', 3);
|
|
94
|
+
if (end !== -1) {
|
|
95
|
+
return rendered.slice(0, end) + '\n' + keep.join('\n') + rendered.slice(end);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
// No activation block: the rule loads unconditionally and still needs its
|
|
99
|
+
// tag, so it gets a frontmatter block holding ONLY the ownership keys.
|
|
100
|
+
return ['---', ...keep, '---', '', rendered].join('\n');
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Rewrite, then render the two operator-facing lines the installer prints.
|
|
104
|
+
*
|
|
105
|
+
* The reporting lives here rather than at the call site for the reason
|
|
106
|
+
* `claudePathsPlan.ts` records for itself: `install.ts` is thousands of lines
|
|
107
|
+
* past `check_source_size_budget`'s ceiling, where every added line counts as a
|
|
108
|
+
* violation, and that gate's convention is that the total moves down through
|
|
109
|
+
* extraction and never up through a baseline raise. So the caller gets one call
|
|
110
|
+
* and a list of strings.
|
|
111
|
+
*/
|
|
112
|
+
export function rewriteAndReport(rulesDir, quiet, info, warn, wrappers) {
|
|
113
|
+
const result = rewriteClaudeRules(rulesDir);
|
|
114
|
+
// The flat-command wrapper report rides along rather than sitting at the
|
|
115
|
+
// call site: `install.ts` is thousands of lines past
|
|
116
|
+
// `check_source_size_budget`'s ceiling, and this module is the one place
|
|
117
|
+
// that already owns claude-code post-copy reporting. Moving it here is the
|
|
118
|
+
// reduction that pays for this feature's own lines — that gate's stated
|
|
119
|
+
// convention is that the total falls through extraction and never rises
|
|
120
|
+
// through a baseline edit. Messages are byte-identical to the originals.
|
|
121
|
+
if (wrappers && !quiet) {
|
|
122
|
+
if (wrappers.wrapped.length > 0) {
|
|
123
|
+
info(` claude-code: ${wrappers.wrapped.length} visible flat command(s) projected as ` +
|
|
124
|
+
'skill wrappers (Claude Code flat-command discovery workaround)');
|
|
125
|
+
}
|
|
126
|
+
if (wrappers.reserved.length > 0) {
|
|
127
|
+
info(` claude-code: ${wrappers.reserved.length} flat command(s) withheld — name is a ` +
|
|
128
|
+
`Claude Code built-in (${wrappers.reserved.join(', ')}); nested /cluster:sub ` +
|
|
129
|
+
'commands remain available');
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
if (result.rewritten > 0 && !quiet) {
|
|
133
|
+
info(` claude-code: ${result.rewritten} rule(s) rewritten to host form; ` +
|
|
134
|
+
`${result.scoped.length} path-scoped (${result.scoped.join(', ') || 'none'})`);
|
|
135
|
+
}
|
|
136
|
+
// NOT one line per dropped pattern. Every mixed-trigger rule drops every
|
|
137
|
+
// pattern it has, by design and permanently, so the per-pattern loop emitted
|
|
138
|
+
// 19 stderr lines on every single install — unactionable by any consumer,
|
|
139
|
+
// surviving --quiet because `warn` writes unconditionally. This repository
|
|
140
|
+
// has already recorded its verdict on exactly that pattern elsewhere in the
|
|
141
|
+
// emitter. One counted line under --quiet's own guard; the detail stays in
|
|
142
|
+
// the returned struct for a caller that wants it.
|
|
143
|
+
if (result.dropped.length > 0 && !quiet) {
|
|
144
|
+
const rules = [...new Set(result.dropped.map((d) => d.rule))];
|
|
145
|
+
info(` claude-code: ${rules.length} rule(s) keep unconditional activation ` +
|
|
146
|
+
'(mixed path + keyword triggers; `paths:` is exclusive on this host)');
|
|
147
|
+
}
|
|
148
|
+
for (const f of result.failed) {
|
|
149
|
+
warn(` claude-code: ${f.rule}: could not write host form — ${f.reason}`);
|
|
150
|
+
}
|
|
151
|
+
return result;
|
|
152
|
+
}
|
|
153
|
+
/** Python `str.rstrip()` with no args — mirrors `condense.ts::_pyRstrip`. */
|
|
154
|
+
function pyRstrip(s) {
|
|
155
|
+
return s.replace(/\s+$/u, '');
|
|
156
|
+
}
|
|
157
|
+
/** Mirrors `condense.ts::_yaml_scalar`. */
|
|
158
|
+
function yamlScalar(value) {
|
|
159
|
+
return JSON.stringify(value);
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Render one rule's host form from its source text.
|
|
163
|
+
*
|
|
164
|
+
* Exported for the equivalence test. A rule with no path-shaped trigger gets
|
|
165
|
+
* NO frontmatter at all rather than an empty block the host would ignore —
|
|
166
|
+
* keys that do nothing are bytes in every session's standing context.
|
|
167
|
+
*/
|
|
168
|
+
export function renderClaudeRule(sourceText) {
|
|
169
|
+
const [meta, body] = parseFrontmatter(sourceText);
|
|
170
|
+
const plan = _claude_paths_plan(meta);
|
|
171
|
+
const lines = [];
|
|
172
|
+
if (plan.globs.length > 0) {
|
|
173
|
+
lines.push('---', 'paths:');
|
|
174
|
+
for (const g of plan.globs) {
|
|
175
|
+
lines.push(` - ${yamlScalar(g)}`);
|
|
176
|
+
}
|
|
177
|
+
lines.push('---', '');
|
|
178
|
+
}
|
|
179
|
+
lines.push(pyRstrip(body) + '\n');
|
|
180
|
+
return { text: lines.join('\n'), globs: plan.globs, dropped: plan.dropped };
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Rewrite every `*.md` directly under `rulesDir` into Claude host form.
|
|
184
|
+
*
|
|
185
|
+
* Idempotent: a file already in host form parses to `{paths: [...]}`, which
|
|
186
|
+
* carries no `triggers:` key, so `_claude_paths_plan` returns no globs and the
|
|
187
|
+
* rewrite would DROP the block. That is why the already-rewritten case is
|
|
188
|
+
* detected and skipped rather than re-run — re-running is the silent-widening
|
|
189
|
+
* failure this module exists to fix, applied to its own output.
|
|
190
|
+
*
|
|
191
|
+
* Returns counts rather than printing. The caller owns the reporting surface.
|
|
192
|
+
*/
|
|
193
|
+
export function rewriteClaudeRules(rulesDir) {
|
|
194
|
+
const result = { rewritten: 0, scoped: [], dropped: [], failed: [] };
|
|
195
|
+
let entries;
|
|
196
|
+
try {
|
|
197
|
+
entries = fs.readdirSync(rulesDir);
|
|
198
|
+
}
|
|
199
|
+
catch {
|
|
200
|
+
return result;
|
|
201
|
+
}
|
|
202
|
+
for (const name of entries.filter((n) => n.endsWith('.md')).sort()) {
|
|
203
|
+
const full = path.join(rulesDir, name);
|
|
204
|
+
let stat;
|
|
205
|
+
try {
|
|
206
|
+
stat = fs.lstatSync(full);
|
|
207
|
+
}
|
|
208
|
+
catch {
|
|
209
|
+
continue;
|
|
210
|
+
}
|
|
211
|
+
// A symlink here is the legacy raw-md farm, not an installed copy.
|
|
212
|
+
// Rewriting through it would write into the projection source.
|
|
213
|
+
if (!stat.isFile() || stat.isSymbolicLink())
|
|
214
|
+
continue;
|
|
215
|
+
let text;
|
|
216
|
+
try {
|
|
217
|
+
text = fs.readFileSync(full, 'utf-8');
|
|
218
|
+
}
|
|
219
|
+
catch {
|
|
220
|
+
continue;
|
|
221
|
+
}
|
|
222
|
+
const [meta] = parseFrontmatter(text);
|
|
223
|
+
// Already host form: `paths:` present and no source vocabulary left.
|
|
224
|
+
if (meta['paths'] !== undefined && meta['triggers'] === undefined)
|
|
225
|
+
continue;
|
|
226
|
+
const rendered = renderClaudeRule(text);
|
|
227
|
+
const withOwnership = _withPreservedKeys(rendered.text, text);
|
|
228
|
+
if (withOwnership !== text) {
|
|
229
|
+
try {
|
|
230
|
+
fs.writeFileSync(full, withOwnership, 'utf-8');
|
|
231
|
+
}
|
|
232
|
+
catch (e) {
|
|
233
|
+
// A single unwritable rule — a root-owned file left by an
|
|
234
|
+
// earlier `sudo` install — must not abort the whole install and
|
|
235
|
+
// skip every remaining tool, the inventory record, the lockfile
|
|
236
|
+
// correction and the fingerprint stamp. Report and continue.
|
|
237
|
+
result.failed.push({
|
|
238
|
+
rule: name.slice(0, -3),
|
|
239
|
+
reason: e instanceof Error ? e.message : String(e),
|
|
240
|
+
});
|
|
241
|
+
continue;
|
|
242
|
+
}
|
|
243
|
+
result.rewritten += 1;
|
|
244
|
+
}
|
|
245
|
+
const stem = name.slice(0, -3);
|
|
246
|
+
if (rendered.globs.length > 0)
|
|
247
|
+
result.scoped.push(stem);
|
|
248
|
+
for (const d of rendered.dropped) {
|
|
249
|
+
result.dropped.push({ rule: stem, pattern: d.pattern, reason: d.reason });
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
return result;
|
|
253
|
+
}
|
|
254
|
+
//# sourceMappingURL=claudeRuleRewrite.js.map
|
package/dist/install/detect.js
CHANGED
|
@@ -30,10 +30,16 @@ export const SETTINGS_FILE = '.agent-settings.yml';
|
|
|
30
30
|
/**
|
|
31
31
|
* Manifest files that, when present, count as a project-shape signal.
|
|
32
32
|
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
33
|
+
* `.git/` is intentionally absent — monorepos, dotfile-git repos, and non-Git
|
|
34
|
+
* workspaces all break it (ADR-007 D2). **That clause is about the `.git/`
|
|
35
|
+
* signal and nothing else.** It used to be cited here for a second property as
|
|
36
|
+
* well — that detection "short-circuits on the first hit" — which ADR-007 D2
|
|
37
|
+
* does not state. The citation was corrected on 2026-08-26
|
|
38
|
+
* (road-to-internal-estate-fit 2.2), and the behaviour it described was
|
|
39
|
+
* corrected with it: `detectProjectShape` now returns EVERY detected manifest
|
|
40
|
+
* (2.1), so the order below is a reporting order rather than a tie-break, and
|
|
41
|
+
* a polyglot repository is described as what it is instead of as its first
|
|
42
|
+
* alphabetically-privileged half.
|
|
37
43
|
*/
|
|
38
44
|
export const SCOPE_DETECT_MANIFESTS = [
|
|
39
45
|
'package.json',
|
|
@@ -106,20 +112,27 @@ export function scopeToTarget(scope) {
|
|
|
106
112
|
* Manifest-to-kind mapping mirrors {@link SCOPE_DETECT_MANIFESTS}:
|
|
107
113
|
* `package.json` → npm, `composer.json` → composer, etc.
|
|
108
114
|
*/
|
|
115
|
+
const MANIFEST_KIND = {
|
|
116
|
+
'package.json': 'npm',
|
|
117
|
+
'composer.json': 'composer',
|
|
118
|
+
'pyproject.toml': 'pyproject',
|
|
119
|
+
'Cargo.toml': 'cargo',
|
|
120
|
+
'go.mod': 'go',
|
|
121
|
+
Gemfile: 'ruby',
|
|
122
|
+
};
|
|
109
123
|
export function detectProjectShape(root) {
|
|
110
|
-
const
|
|
111
|
-
if (
|
|
112
|
-
return { kind: 'unknown', root, manifest: null };
|
|
124
|
+
const manifests = SCOPE_DETECT_MANIFESTS.filter((m) => existsSync(join(root, m)));
|
|
125
|
+
if (manifests.length === 0) {
|
|
126
|
+
return { kind: 'unknown', root, manifest: null, kinds: [], manifests: [] };
|
|
113
127
|
}
|
|
114
|
-
const
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
}
|
|
122
|
-
return { kind, root, manifest };
|
|
128
|
+
const kinds = manifests.map((m) => MANIFEST_KIND[m] ?? 'unknown');
|
|
129
|
+
return {
|
|
130
|
+
kind: kinds[0],
|
|
131
|
+
root,
|
|
132
|
+
manifest: manifests[0],
|
|
133
|
+
kinds,
|
|
134
|
+
manifests,
|
|
135
|
+
};
|
|
123
136
|
}
|
|
124
137
|
/** Read AI-tool presence flags from `root`. Pure — no writes. */
|
|
125
138
|
export function detectToolPresence(root) {
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Which PHP application shape is in play — decided from the entry point and the
|
|
3
|
+
* router, never from the dependency list.
|
|
4
|
+
*
|
|
5
|
+
* `road-to-consumer-repo-reality` Phase 3. A dependency proves a library is
|
|
6
|
+
* AVAILABLE. Only the entry point and the routing mechanism prove which
|
|
7
|
+
* application shape is actually running.
|
|
8
|
+
*
|
|
9
|
+
* THE THIRD STATE IS THE POINT. Component-based distribution is a published
|
|
10
|
+
* model: a framework family ships its ORM, container, collections and HTTP
|
|
11
|
+
* layer as independently installable packages, usable with no framework
|
|
12
|
+
* present. PHP has at least two families distributed exactly this way, so the
|
|
13
|
+
* shape is a property of the DISTRIBUTION MODEL and not of any one consumer.
|
|
14
|
+
*
|
|
15
|
+
* Dependency-presence routing sends such an application to the framework's
|
|
16
|
+
* skill, which then offers a CLI that does not exist, a request-validation
|
|
17
|
+
* primitive that is not wired, and a routes file that was never there. Every
|
|
18
|
+
* suggestion is confidently wrong, and the reason is visible only from the
|
|
19
|
+
* entry point.
|
|
20
|
+
*
|
|
21
|
+
* COST IS THE OTHER HALF OF THE DESIGN. Risk-register rank 7: "the third
|
|
22
|
+
* framework state is added but never fires, because the discriminator is
|
|
23
|
+
* expensive to evaluate". So the discriminator is a FIXED SET of at most
|
|
24
|
+
* `PROBE_COUNT` filesystem existence checks plus one manifest read — no
|
|
25
|
+
* directory walk, no content scan, no per-session re-derivation. The probe set
|
|
26
|
+
* is exported so a caller can state the cost rather than estimate it.
|
|
27
|
+
*/
|
|
28
|
+
import * as fs from 'node:fs';
|
|
29
|
+
import * as path from 'node:path';
|
|
30
|
+
/**
|
|
31
|
+
* Skeleton markers — the files a framework's own installer writes and a
|
|
32
|
+
* component consumer never has. Presence of ANY marker for a family is what
|
|
33
|
+
* makes the framework real rather than merely available.
|
|
34
|
+
*
|
|
35
|
+
* These are the framework's console entry point and its bootstrap config, both
|
|
36
|
+
* generated by the official skeleton and both absent when a developer wires the
|
|
37
|
+
* components by hand.
|
|
38
|
+
*/
|
|
39
|
+
export const SKELETON_MARKERS = {
|
|
40
|
+
laravel: ['artisan', path.join('config', 'app.php'), path.join('bootstrap', 'app.php')],
|
|
41
|
+
symfony: [path.join('bin', 'console'), path.join('config', 'bundles.php'), path.join('config', 'services.yaml')],
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* Composer package prefixes that prove a family's COMPONENTS are available.
|
|
45
|
+
* Availability only — this is deliberately never sufficient for a verdict.
|
|
46
|
+
*/
|
|
47
|
+
export const COMPONENT_PREFIXES = {
|
|
48
|
+
laravel: ['illuminate/'],
|
|
49
|
+
symfony: ['symfony/'],
|
|
50
|
+
};
|
|
51
|
+
/** The whole framework, as opposed to its parts. */
|
|
52
|
+
const FRAMEWORK_PACKAGES = {
|
|
53
|
+
laravel: ['laravel/framework'],
|
|
54
|
+
symfony: ['symfony/framework-bundle'],
|
|
55
|
+
};
|
|
56
|
+
/** Every path this module may stat. The cost, stated rather than estimated. */
|
|
57
|
+
export const PROBE_PATHS = [
|
|
58
|
+
'composer.json',
|
|
59
|
+
...SKELETON_MARKERS.laravel,
|
|
60
|
+
...SKELETON_MARKERS.symfony,
|
|
61
|
+
];
|
|
62
|
+
/** Upper bound on filesystem probes for one verdict. */
|
|
63
|
+
export const PROBE_COUNT = PROBE_PATHS.length;
|
|
64
|
+
function _requireKeys(root) {
|
|
65
|
+
try {
|
|
66
|
+
const raw = JSON.parse(fs.readFileSync(path.join(root, 'composer.json'), 'utf8'));
|
|
67
|
+
return [...Object.keys(raw.require ?? {}), ...Object.keys(raw['require-dev'] ?? {})];
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
return [];
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
function _markers(root, family) {
|
|
74
|
+
return SKELETON_MARKERS[family].filter((rel) => fs.existsSync(path.join(root, rel)));
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* The verdict, in one pass.
|
|
78
|
+
*
|
|
79
|
+
* Order matters and is the whole discriminator: a family is only `laravel` or
|
|
80
|
+
* `symfony` when a **skeleton marker exists**. Components present with no
|
|
81
|
+
* marker is the third state, and it is checked before falling through to
|
|
82
|
+
* `plain-php` so a component consumer is never described as a project with no
|
|
83
|
+
* framework libraries at all.
|
|
84
|
+
*/
|
|
85
|
+
export function detectPhpShape(root) {
|
|
86
|
+
let probes = 1;
|
|
87
|
+
const requires = _requireKeys(root);
|
|
88
|
+
if (requires.length === 0 && !fs.existsSync(path.join(root, 'composer.json'))) {
|
|
89
|
+
return {
|
|
90
|
+
shape: 'unknown',
|
|
91
|
+
componentsOf: null,
|
|
92
|
+
markersFound: [],
|
|
93
|
+
reason: 'no composer.json — no PHP application shape to decide',
|
|
94
|
+
probes: probes + 1,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
// TWO PASSES, and the order between them is the fix for a real defect.
|
|
98
|
+
//
|
|
99
|
+
// A single pass that returned on the first family with ANY component present
|
|
100
|
+
// reported a genuine Symfony application as components-without-framework the
|
|
101
|
+
// moment its composer.json also required `illuminate/collections` — because
|
|
102
|
+
// `laravel` is examined first, has a component, has no Laravel skeleton, and
|
|
103
|
+
// returned before Symfony's three markers were ever looked at. Both
|
|
104
|
+
// `illuminate/collections` and `illuminate/support` are widely used
|
|
105
|
+
// standalone, so a mixed manifest is ordinary rather than exotic.
|
|
106
|
+
//
|
|
107
|
+
// PASS 1 — a real skeleton anywhere wins. A framework whose own installer
|
|
108
|
+
// wrote its console entry point and bootstrap config is running, whatever
|
|
109
|
+
// else the manifest happens to carry.
|
|
110
|
+
const present = [];
|
|
111
|
+
for (const family of ['laravel', 'symfony']) {
|
|
112
|
+
const hasFramework = FRAMEWORK_PACKAGES[family].some((p) => requires.includes(p));
|
|
113
|
+
const hasComponents = requires.some((r) => COMPONENT_PREFIXES[family].some((p) => r.startsWith(p)));
|
|
114
|
+
if (!hasFramework && !hasComponents)
|
|
115
|
+
continue;
|
|
116
|
+
present.push(family);
|
|
117
|
+
const markersFound = _markers(root, family);
|
|
118
|
+
probes += SKELETON_MARKERS[family].length;
|
|
119
|
+
if (markersFound.length > 0) {
|
|
120
|
+
return {
|
|
121
|
+
shape: family,
|
|
122
|
+
componentsOf: family,
|
|
123
|
+
markersFound,
|
|
124
|
+
reason: `${family} skeleton present (${markersFound.join(', ')}) — the framework is real, not merely available`,
|
|
125
|
+
probes,
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
// PASS 2 — components present, no skeleton for ANY of them. Only now is the
|
|
130
|
+
// third state the right answer, and it names every family whose components
|
|
131
|
+
// are available rather than only the first one examined.
|
|
132
|
+
const first = present[0];
|
|
133
|
+
if (first !== undefined) {
|
|
134
|
+
const missing = present.flatMap((f) => SKELETON_MARKERS[f]);
|
|
135
|
+
const families = present.join(' and ');
|
|
136
|
+
return {
|
|
137
|
+
shape: 'components-without-framework',
|
|
138
|
+
componentsOf: first,
|
|
139
|
+
markersFound: [],
|
|
140
|
+
reason: `${families} component(s) are required in composer.json but NO skeleton marker exists ` +
|
|
141
|
+
`(none of ${missing.join(', ')}). The entry point and router are the ` +
|
|
142
|
+
`application's own, so the framework CLI, its request-validation primitive and its routes ` +
|
|
143
|
+
'file are not there. Routing to a framework skill would offer all three.',
|
|
144
|
+
probes,
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
return {
|
|
148
|
+
shape: 'plain-php',
|
|
149
|
+
componentsOf: null,
|
|
150
|
+
markersFound: [],
|
|
151
|
+
reason: 'composer.json requires no component of either framework family',
|
|
152
|
+
probes,
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
/** True when a framework-routing rule must NOT claim this tree. */
|
|
156
|
+
export function frameworkRoutingIsWrong(v) {
|
|
157
|
+
return v.shape === 'components-without-framework';
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=detect_php_shape.js.map
|