@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,373 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
/**
|
|
3
|
+
* Host portability — a grant nobody can honour, and a subagent nobody defines.
|
|
4
|
+
*
|
|
5
|
+
* `road-to-skill-ecosystem-runtime-enforcement` Phase 3, Steps 4 and 5. Two
|
|
6
|
+
* checks over authored artefacts, both of the same shape: an artefact NAMES
|
|
7
|
+
* something host-specific, and nothing verifies the name means anything.
|
|
8
|
+
*
|
|
9
|
+
* ── Check 1: tool grants outside the verified vocabulary ────────────────────
|
|
10
|
+
* The step asks for "a tool grant declared for one host and absent for another".
|
|
11
|
+
* That comparison is not available and saying so is the finding:
|
|
12
|
+
* `docs/contracts/host-tool-vocabulary.md` records that this tree verifies tool
|
|
13
|
+
* NAMES for exactly one host, so a cross-host table would be filled with recalled
|
|
14
|
+
* vendor documentation on the very page a porter relies on.
|
|
15
|
+
*
|
|
16
|
+
* What IS decidable is the same defect from the other side: a grant naming a
|
|
17
|
+
* tool outside the verified vocabulary is a grant no host in this tree is known
|
|
18
|
+
* to honour — and an unrecognised key is IGNORED by a loader, so the artefact
|
|
19
|
+
* inherits everything. Non-portability shows up as a name nothing can resolve.
|
|
20
|
+
*
|
|
21
|
+
* ── Check 2: subagent types that resolve to nothing ─────────────────────────
|
|
22
|
+
* A dispatch to a subagent type that does not exist fails at RUNTIME, on the
|
|
23
|
+
* turn that needed it. It resolves if a definition lives in `src/subagents/`,
|
|
24
|
+
* or if it is one of the host's own built-ins — which are allowlisted by name
|
|
25
|
+
* rather than assumed, because a built-in is a fact about the host and this tree
|
|
26
|
+
* carries its own record of them.
|
|
27
|
+
*
|
|
28
|
+
* Exit codes: 0 clean · 1 finding(s) · 2 usage / dead scope.
|
|
29
|
+
*/
|
|
30
|
+
import * as fs from 'node:fs';
|
|
31
|
+
import * as os from 'node:os';
|
|
32
|
+
import * as path from 'node:path';
|
|
33
|
+
import process from 'node:process';
|
|
34
|
+
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
35
|
+
|
|
36
|
+
import { GateLedger } from './_lib/gate_ledger.js';
|
|
37
|
+
import { capPerCategory, envelope } from './_lib/outcome_envelope.js';
|
|
38
|
+
import { runGateCli, runSelfTest } from './_lib/gate_self_test.js';
|
|
39
|
+
import { DeadScopeError, assertScanned } from './_lib/scan_scope.js';
|
|
40
|
+
|
|
41
|
+
const _HERE = fileURLToPath(import.meta.url);
|
|
42
|
+
const REPO_ROOT = path.resolve(path.dirname(_HERE), '..', '..');
|
|
43
|
+
|
|
44
|
+
/** Artefact roots that may name a tool or a subagent type. */
|
|
45
|
+
/** Per-KIND finding cap. A global cap lets one kind hide the other. */
|
|
46
|
+
export const FINDING_CAP_PER_KIND = 20;
|
|
47
|
+
|
|
48
|
+
export const SCAN_ROOTS = ['src/skills', 'src/agent-src', 'src/domains', 'src/subagents'] as const;
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* The verified tool vocabulary, from `docs/contracts/host-tool-vocabulary.md`.
|
|
52
|
+
*
|
|
53
|
+
* Sourced from the names this package's own hooks match on and the grants its
|
|
54
|
+
* skills declare — not from a vendor doc. Extending this list means extending
|
|
55
|
+
* that contract, which is where the evidence rule lives.
|
|
56
|
+
*/
|
|
57
|
+
export const VERIFIED_TOOLS: ReadonlySet<string> = new Set([
|
|
58
|
+
'Bash',
|
|
59
|
+
'Read',
|
|
60
|
+
'Write',
|
|
61
|
+
'Edit',
|
|
62
|
+
'MultiEdit',
|
|
63
|
+
'Grep',
|
|
64
|
+
'Glob',
|
|
65
|
+
'Task',
|
|
66
|
+
'NotebookEdit',
|
|
67
|
+
'WebFetch',
|
|
68
|
+
'WebSearch',
|
|
69
|
+
'TodoWrite',
|
|
70
|
+
'SlashCommand',
|
|
71
|
+
'Skill',
|
|
72
|
+
]);
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Host-provided subagent types — a fact about the host, allowlisted by name.
|
|
76
|
+
*
|
|
77
|
+
* The step calls for "a built-in allowlist for the host's own types". These are
|
|
78
|
+
* the types Claude Code ships; a type here needs no definition in this tree.
|
|
79
|
+
*/
|
|
80
|
+
export const HOST_BUILTIN_SUBAGENTS: ReadonlySet<string> = new Set([
|
|
81
|
+
'general-purpose',
|
|
82
|
+
'Explore',
|
|
83
|
+
'Plan',
|
|
84
|
+
'statusline-setup',
|
|
85
|
+
'fork',
|
|
86
|
+
'claude',
|
|
87
|
+
]);
|
|
88
|
+
|
|
89
|
+
export interface PortabilityFinding {
|
|
90
|
+
file: string;
|
|
91
|
+
line: number;
|
|
92
|
+
kind: 'unverified-tool' | 'unresolved-subagent';
|
|
93
|
+
detail: string;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/** Grant keys, in every spelling this tree uses. */
|
|
97
|
+
const TOOL_KEY_RE = /^\s*(?:allowed_tools|allowed-tools|disallowed_tools|tools):\s*(.*)$/;
|
|
98
|
+
const SEQ_ITEM_RE = /^\s+-\s*(.+)$/;
|
|
99
|
+
const SUBAGENT_TYPE_RE = /\bsubagent_type\s*[:=]\s*['"]?([A-Za-z0-9_-]+)/g;
|
|
100
|
+
|
|
101
|
+
/** Strip a scoped grant down to its tool name: `Bash(git:*)` → `Bash`. */
|
|
102
|
+
export function toolName(grant: string): string {
|
|
103
|
+
return grant
|
|
104
|
+
.trim()
|
|
105
|
+
.replace(/^['"]|['"]$/g, '')
|
|
106
|
+
.replace(/\(.*$/, '')
|
|
107
|
+
.trim();
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/** Parse a grant value that may be inline flow (`[A, B]`) or empty. */
|
|
111
|
+
export function parseInlineGrants(value: string): string[] {
|
|
112
|
+
const v = value.trim();
|
|
113
|
+
if (v === '' || v === '[]') return [];
|
|
114
|
+
const inner = v.startsWith('[') ? v.slice(1, v.endsWith(']') ? -1 : undefined) : v;
|
|
115
|
+
return inner
|
|
116
|
+
.split(',')
|
|
117
|
+
.map((x) => toolName(x))
|
|
118
|
+
.filter((x) => x !== '');
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
export function scanContent(rel: string, content: string): PortabilityFinding[] {
|
|
122
|
+
const out: PortabilityFinding[] = [];
|
|
123
|
+
const lines = content.split('\n');
|
|
124
|
+
|
|
125
|
+
for (let i = 0; i < lines.length; i += 1) {
|
|
126
|
+
const line = lines[i] as string;
|
|
127
|
+
const m = TOOL_KEY_RE.exec(line);
|
|
128
|
+
if (m !== null) {
|
|
129
|
+
const grants = parseInlineGrants(m[1] ?? '');
|
|
130
|
+
// A block sequence follows the key on subsequent lines.
|
|
131
|
+
for (let j = i + 1; j < lines.length; j += 1) {
|
|
132
|
+
const item = SEQ_ITEM_RE.exec(lines[j] as string);
|
|
133
|
+
if (item === null) break;
|
|
134
|
+
grants.push(toolName(item[1] as string));
|
|
135
|
+
}
|
|
136
|
+
for (const g of grants) {
|
|
137
|
+
// `*` and `Bash(*)` are the OVER-BROAD class and belong to
|
|
138
|
+
// lint_skill_frontmatter_safety. Reporting them here too would
|
|
139
|
+
// red the same artefact twice for one defect.
|
|
140
|
+
if (g === '' || g === '*') continue;
|
|
141
|
+
if (VERIFIED_TOOLS.has(g)) continue;
|
|
142
|
+
out.push({
|
|
143
|
+
file: rel,
|
|
144
|
+
line: i + 1,
|
|
145
|
+
kind: 'unverified-tool',
|
|
146
|
+
detail:
|
|
147
|
+
`grant names \`${g}\`, which is not in the verified tool vocabulary — ` +
|
|
148
|
+
'no host in this tree is known to honour it, and a loader IGNORES an ' +
|
|
149
|
+
'unrecognised key, so this artefact is not restricted. Add it to ' +
|
|
150
|
+
'docs/contracts/host-tool-vocabulary.md with its evidence, or use a verified name.',
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
SUBAGENT_TYPE_RE.lastIndex = 0;
|
|
155
|
+
let sm: RegExpExecArray | null;
|
|
156
|
+
while ((sm = SUBAGENT_TYPE_RE.exec(line)) !== null) {
|
|
157
|
+
out.push({ file: rel, line: i + 1, kind: 'unresolved-subagent', detail: sm[1] as string });
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
return out;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/** Subagent definitions in the tree. `_`-prefixed files are partials, never types. */
|
|
164
|
+
export function definedSubagents(repoRoot: string): Set<string> {
|
|
165
|
+
const dir = path.join(repoRoot, 'src', 'subagents');
|
|
166
|
+
const out = new Set<string>();
|
|
167
|
+
if (!fs.existsSync(dir)) return out;
|
|
168
|
+
for (const name of fs.readdirSync(dir)) {
|
|
169
|
+
if (!name.endsWith('.md') || name.startsWith('_')) continue;
|
|
170
|
+
out.add(name.slice(0, -3));
|
|
171
|
+
}
|
|
172
|
+
return out;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
function walkMd(root: string, rel = ''): string[] {
|
|
176
|
+
const abs = path.join(root, rel);
|
|
177
|
+
if (!fs.existsSync(abs)) return [];
|
|
178
|
+
const out: string[] = [];
|
|
179
|
+
for (const ent of fs.readdirSync(abs, { withFileTypes: true })) {
|
|
180
|
+
const r = rel === '' ? ent.name : `${rel}/${ent.name}`;
|
|
181
|
+
if (ent.isDirectory()) out.push(...walkMd(root, r));
|
|
182
|
+
else if (ent.name.endsWith('.md')) out.push(r);
|
|
183
|
+
}
|
|
184
|
+
return out;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
export interface Report {
|
|
188
|
+
findings: PortabilityFinding[];
|
|
189
|
+
scanned: number;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
export function run(repoRoot: string, ledger?: GateLedger): Report {
|
|
193
|
+
const defined = definedSubagents(repoRoot);
|
|
194
|
+
const findings: PortabilityFinding[] = [];
|
|
195
|
+
let scanned = 0;
|
|
196
|
+
const files: string[] = [];
|
|
197
|
+
for (const root of SCAN_ROOTS) {
|
|
198
|
+
for (const rel of walkMd(path.join(repoRoot, root))) files.push(`${root}/${rel}`);
|
|
199
|
+
}
|
|
200
|
+
ledger?.plan(files);
|
|
201
|
+
for (const rel of files) {
|
|
202
|
+
scanned += 1;
|
|
203
|
+
const hits = scanContent(rel, fs.readFileSync(path.join(repoRoot, rel), 'utf8'));
|
|
204
|
+
const real = hits.filter((h) => {
|
|
205
|
+
if (h.kind !== 'unresolved-subagent') return true;
|
|
206
|
+
return !defined.has(h.detail) && !HOST_BUILTIN_SUBAGENTS.has(h.detail);
|
|
207
|
+
});
|
|
208
|
+
for (const h of real) {
|
|
209
|
+
if (h.kind === 'unresolved-subagent') {
|
|
210
|
+
h.detail =
|
|
211
|
+
`subagent_type \`${h.detail}\` resolves to nothing — no src/subagents/${h.detail}.md ` +
|
|
212
|
+
'and not a host built-in. A broken dispatch is invisible until the turn that needs it.';
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
findings.push(...real);
|
|
216
|
+
if (real.length > 0) ledger?.fail(rel, `${String(real.length)} portability finding(s)`);
|
|
217
|
+
else ledger?.complete(rel);
|
|
218
|
+
}
|
|
219
|
+
return { findings, scanned };
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
export function selfTest(): number {
|
|
223
|
+
const tmp = fs.mkdtempSync(path.join(os.tmpdir(), 'portability-'));
|
|
224
|
+
const build = (name: string, rel: string, body: string, subagents: string[] = []): string => {
|
|
225
|
+
const root = path.join(tmp, name);
|
|
226
|
+
const p = path.join(root, rel);
|
|
227
|
+
fs.mkdirSync(path.dirname(p), { recursive: true });
|
|
228
|
+
fs.writeFileSync(p, body, 'utf8');
|
|
229
|
+
for (const s of subagents) {
|
|
230
|
+
fs.mkdirSync(path.join(root, 'src', 'subagents'), { recursive: true });
|
|
231
|
+
fs.writeFileSync(path.join(root, 'src', 'subagents', `${s}.md`), '', 'utf8');
|
|
232
|
+
}
|
|
233
|
+
return root;
|
|
234
|
+
};
|
|
235
|
+
const runIt = (root: string): number =>
|
|
236
|
+
runGateCli(REPO_ROOT, 'src/scripts/lint_host_portability.ts', ['--root', root, '--quiet'], REPO_ROOT);
|
|
237
|
+
|
|
238
|
+
try {
|
|
239
|
+
return runSelfTest({
|
|
240
|
+
gate: 'lint_host_portability',
|
|
241
|
+
minCases: 4,
|
|
242
|
+
minRejectCases: 2,
|
|
243
|
+
cases: [
|
|
244
|
+
{
|
|
245
|
+
name: 'a grant naming a verified tool passes',
|
|
246
|
+
expect: 'accept',
|
|
247
|
+
run: () =>
|
|
248
|
+
runIt(build('ok', 'src/skills/a/SKILL.md', '---\nexecution:\n allowed_tools: ["Bash(git:*)", "Read"]\n---\n')),
|
|
249
|
+
},
|
|
250
|
+
{
|
|
251
|
+
name: 'a grant naming an unverified tool is rejected',
|
|
252
|
+
expect: 'reject',
|
|
253
|
+
run: () =>
|
|
254
|
+
runIt(build('bad', 'src/skills/a/SKILL.md', '---\nexecution:\n allowed_tools: ["FileWriter"]\n---\n')),
|
|
255
|
+
},
|
|
256
|
+
{
|
|
257
|
+
name: 'a subagent_type with a definition in the tree passes',
|
|
258
|
+
expect: 'accept',
|
|
259
|
+
run: () =>
|
|
260
|
+
runIt(build('defined', 'src/skills/a/SKILL.md', 'Dispatch with subagent_type: my-judge\n', ['my-judge'])),
|
|
261
|
+
},
|
|
262
|
+
{
|
|
263
|
+
name: 'a host built-in subagent_type passes without a definition',
|
|
264
|
+
expect: 'accept',
|
|
265
|
+
run: () => runIt(build('builtin', 'src/skills/a/SKILL.md', 'subagent_type: general-purpose\n')),
|
|
266
|
+
},
|
|
267
|
+
{
|
|
268
|
+
name: 'a subagent_type resolving to nothing is rejected',
|
|
269
|
+
expect: 'reject',
|
|
270
|
+
run: () => runIt(build('ghost', 'src/skills/a/SKILL.md', 'subagent_type: no-such-agent\n')),
|
|
271
|
+
},
|
|
272
|
+
],
|
|
273
|
+
});
|
|
274
|
+
} finally {
|
|
275
|
+
fs.rmSync(tmp, { recursive: true, force: true });
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
export function main(argv: string[] = process.argv.slice(2)): number {
|
|
280
|
+
if (argv.includes('-h') || argv.includes('--help')) {
|
|
281
|
+
process.stdout.write(
|
|
282
|
+
'usage: lint_host_portability [--root DIR] [--quiet] [--json] [--self-test]\n' +
|
|
283
|
+
' --json emits an outcome envelope: terminal state, retry class, suggestion,\n' +
|
|
284
|
+
' and a `truncated` flag with per-category pre-cap totals.\n',
|
|
285
|
+
);
|
|
286
|
+
return 0;
|
|
287
|
+
}
|
|
288
|
+
if (argv.includes('--self-test')) return selfTest();
|
|
289
|
+
const quiet = argv.includes('--quiet');
|
|
290
|
+
const rootIdx = argv.indexOf('--root');
|
|
291
|
+
const root = rootIdx !== -1 && rootIdx + 1 < argv.length ? path.resolve(argv[rootIdx + 1] as string) : REPO_ROOT;
|
|
292
|
+
const isFixture = root !== REPO_ROOT;
|
|
293
|
+
|
|
294
|
+
const ledger = isFixture ? undefined : new GateLedger('lint_host_portability');
|
|
295
|
+
const report = run(root, ledger);
|
|
296
|
+
|
|
297
|
+
try {
|
|
298
|
+
// `exactOptionalPropertyTypes` distinguishes an ABSENT key from one set
|
|
299
|
+
// to `undefined`, and `ScannedOptions.allowEmpty` is optional-absent
|
|
300
|
+
// rather than optional-undefined. Spreading the key in only when it
|
|
301
|
+
// applies says the same thing the ternary meant and type-checks: a
|
|
302
|
+
// non-fixture run must not carry an empty-scope escape at all.
|
|
303
|
+
assertScanned({
|
|
304
|
+
gate: 'lint_host_portability',
|
|
305
|
+
scanned: report.scanned,
|
|
306
|
+
units: 'authored artefact(s)',
|
|
307
|
+
roots: SCAN_ROOTS,
|
|
308
|
+
...(isFixture
|
|
309
|
+
? {
|
|
310
|
+
allowEmpty:
|
|
311
|
+
'OPTIONAL_INPUT: a self-test fixture may legitimately contain no artefact under a given root.',
|
|
312
|
+
}
|
|
313
|
+
: {}),
|
|
314
|
+
});
|
|
315
|
+
} catch (e) {
|
|
316
|
+
if (e instanceof DeadScopeError) {
|
|
317
|
+
process.stderr.write(`❌ ${e.message}\n`);
|
|
318
|
+
return 2;
|
|
319
|
+
}
|
|
320
|
+
throw e;
|
|
321
|
+
}
|
|
322
|
+
ledger?.report(quiet ? () => undefined : undefined);
|
|
323
|
+
process.stdout.write(`scanned: ${String(report.scanned)}\n`);
|
|
324
|
+
|
|
325
|
+
// Findings are capped PER KIND, not globally: one high-volume kind would
|
|
326
|
+
// otherwise fill the list and hide the other entirely — the failure a cap is
|
|
327
|
+
// supposed to prevent, arriving through the cap. `truncated` and the pre-cap
|
|
328
|
+
// totals come from the same call, so the flag and the counts cannot drift.
|
|
329
|
+
const capped = capPerCategory(report.findings, (f) => f.kind, FINDING_CAP_PER_KIND);
|
|
330
|
+
|
|
331
|
+
if (argv.includes('--json')) {
|
|
332
|
+
const env = envelope({
|
|
333
|
+
state: report.findings.length > 0 ? 'blocked' : report.scanned === 0 ? 'clean-no-op' : 'success',
|
|
334
|
+
retry: report.findings.length > 0 ? 'hard-blocker' : 'not-applicable',
|
|
335
|
+
suggestion:
|
|
336
|
+
report.findings.length > 0
|
|
337
|
+
? 'rename the grant to a verified tool, or define the subagent type — a retry ' +
|
|
338
|
+
'changes nothing, the artefact has to change'
|
|
339
|
+
: '',
|
|
340
|
+
truncated: capped.truncated,
|
|
341
|
+
totals: capped.totals,
|
|
342
|
+
payload: capped.kept,
|
|
343
|
+
});
|
|
344
|
+
process.stdout.write(`${JSON.stringify(env, null, 2)}\n`);
|
|
345
|
+
return report.findings.length > 0 ? 1 : 0;
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
if (report.findings.length > 0) {
|
|
349
|
+
for (const f of capped.kept) {
|
|
350
|
+
process.stderr.write(` 🔴 [${f.kind}] ${f.file}:${String(f.line)} — ${f.detail}\n`);
|
|
351
|
+
}
|
|
352
|
+
if (capped.truncated) {
|
|
353
|
+
const dropped = Object.entries(capped.totals)
|
|
354
|
+
.map(([k, n]) => `${k}=${String(n)}`)
|
|
355
|
+
.join(' · ');
|
|
356
|
+
process.stderr.write(
|
|
357
|
+
` … list CAPPED at ${String(FINDING_CAP_PER_KIND)} per kind. Pre-cap totals: ${dropped}\n`,
|
|
358
|
+
);
|
|
359
|
+
}
|
|
360
|
+
process.stderr.write(`❌ lint_host_portability: ${String(report.findings.length)} finding(s).\n`);
|
|
361
|
+
return 1;
|
|
362
|
+
}
|
|
363
|
+
if (!quiet) {
|
|
364
|
+
process.stdout.write(`✅ lint_host_portability: ${String(report.scanned)} artefact(s) clean.\n`);
|
|
365
|
+
}
|
|
366
|
+
return 0;
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
/* c8 ignore start */
|
|
370
|
+
if (process.argv[1] !== undefined && pathToFileURL(path.resolve(process.argv[1])).href === pathToFileURL(_HERE).href) {
|
|
371
|
+
process.exit(main());
|
|
372
|
+
}
|
|
373
|
+
/* c8 ignore stop */
|
|
@@ -34,6 +34,7 @@ import * as path from 'node:path';
|
|
|
34
34
|
import process from 'node:process';
|
|
35
35
|
import { fileURLToPath } from 'node:url';
|
|
36
36
|
|
|
37
|
+
import { GateLedger } from './_lib/gate_ledger.js';
|
|
37
38
|
import { reportScanned } from './_lib/scan_scope.js';
|
|
38
39
|
|
|
39
40
|
const _HERE = path.dirname(fileURLToPath(import.meta.url));
|
|
@@ -108,10 +109,35 @@ export function main(argv: readonly string[] = []): number {
|
|
|
108
109
|
const repoRoot = rootIdx >= 0 ? (argv[rootIdx + 1] ?? REPO_ROOT) : REPO_ROOT;
|
|
109
110
|
|
|
110
111
|
const prompts = collectPrompts(repoRoot);
|
|
112
|
+
// Per-target accounting. `collectPrompts` already drops a `.review-input`
|
|
113
|
+
// directory that carries no `prompt.md`, and that drop is the gate's own
|
|
114
|
+
// stated bypass ("omission") — the ledger is what makes it countable instead
|
|
115
|
+
// of invisible, so a run over N review directories cannot look identical to
|
|
116
|
+
// a run over N-3 of them.
|
|
117
|
+
const ledger = new GateLedger('lint_judge_prompt_expectation');
|
|
118
|
+
const dirs = fs.existsSync(path.join(repoRoot, REVIEWS_DIR))
|
|
119
|
+
? fs
|
|
120
|
+
.readdirSync(path.join(repoRoot, REVIEWS_DIR), { withFileTypes: true })
|
|
121
|
+
.filter((e) => e.isDirectory() && e.name.endsWith('.review-input'))
|
|
122
|
+
.map((e) => path.join(REVIEWS_DIR, e.name))
|
|
123
|
+
.sort()
|
|
124
|
+
: [];
|
|
125
|
+
ledger.plan(dirs);
|
|
126
|
+
const withPrompt = new Set(prompts.map((p) => path.dirname(path.relative(repoRoot, p))));
|
|
127
|
+
for (const d of dirs) {
|
|
128
|
+
if (!withPrompt.has(d)) ledger.skip(d, 'no_applicable_files');
|
|
129
|
+
}
|
|
130
|
+
|
|
111
131
|
const findings: Finding[] = [];
|
|
112
132
|
for (const p of prompts) {
|
|
113
|
-
|
|
133
|
+
const rel = path.relative(repoRoot, p);
|
|
134
|
+
const hits = scanPromptText(rel, fs.readFileSync(p, 'utf-8'));
|
|
135
|
+
findings.push(...hits);
|
|
136
|
+
const dir = path.dirname(rel);
|
|
137
|
+
if (hits.length > 0) ledger.fail(dir, `${String(hits.length)} expectation phrase(s)`);
|
|
138
|
+
else ledger.complete(dir);
|
|
114
139
|
}
|
|
140
|
+
ledger.report(quiet ? () => undefined : undefined);
|
|
115
141
|
|
|
116
142
|
reportScanned({
|
|
117
143
|
gate: 'lint_judge_prompt_expectation',
|