@event4u/agent-config 14.12.0 → 14.13.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 +234 -0
- 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 +109 -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-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 +247 -3
- package/dist/agent-src/scripts/guarded_baseline.ts +328 -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 +400 -0
- package/dist/agent-src/scripts/ticket_bundles.ts +84 -0
- package/dist/agent-src/scripts/update_roadmap_progress.ts +8 -4
- 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 +42 -10
- 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 +57 -57
- 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 +1836 -712
- 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 +4818 -2645
- 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/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 +247 -3
- package/src/agent-src/scripts/guarded_baseline.ts +328 -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 +400 -0
- package/src/agent-src/scripts/ticket_bundles.ts +84 -0
- package/src/agent-src/scripts/update_roadmap_progress.ts +8 -4
- 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 +38 -36
- package/src/config/evaluator-budgets.json +14 -14
- package/src/config/gate-coverage.yml +579 -63
- package/src/config/gate-reachability-exemptions.json +21 -0
- package/src/config/gate-violation-baselines.json +37 -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 +8 -8
- 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 +126 -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 +27 -0
- package/src/scripts/_lib/activation_ladder.ts +211 -0
- package/src/scripts/_lib/activation_states.ts +88 -0
- package/src/scripts/_lib/adherence_detectors.ts +143 -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_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/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/council_settings_block.ts +6 -0
- package/src/scripts/_lib/curator_ops.ts +172 -0
- package/src/scripts/_lib/delivery_arm_experiment.ts +266 -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/eval_publication.ts +354 -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/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 +229 -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/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/prefix_stable_surfaces.ts +123 -0
- package/src/scripts/_lib/privacy_class.ts +47 -0
- package/src/scripts/_lib/regression_neighbourhood.ts +259 -0
- 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/runtime_journal.ts +1499 -0
- package/src/scripts/_lib/runtime_wiring_checks.ts +430 -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/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/disagreement_signal.ts +338 -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/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/response_record.ts +50 -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 +126 -0
- 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 +142 -1
- 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_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/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 +980 -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 +98 -11
- 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/concern_registry.ts +4 -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/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/lint_adr_sweep_routing.ts +12 -0
- package/src/scripts/lint_canonical_terms.ts +604 -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_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/mcp_server/consumer_tool_catalog.json +1 -1
- package/src/scripts/mcp_server/tool_catalog_source.ts +1 -1
- package/src/scripts/measure_docs_dead_links.ts +348 -0
- package/src/scripts/measure_host_capture.ts +461 -0
- package/src/scripts/migration_status.ts +3 -3
- package/src/scripts/model_rule_injection.ts +60 -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_turnaround.ts +384 -0
- package/src/scripts/probe_unblocked_ask.ts +279 -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
|
@@ -71,7 +71,14 @@ import * as path from 'node:path';
|
|
|
71
71
|
import process from 'node:process';
|
|
72
72
|
import { fileURLToPath } from 'node:url';
|
|
73
73
|
|
|
74
|
-
import {
|
|
74
|
+
import {
|
|
75
|
+
ALLOWLIST as OVERLAP_ALLOWLIST,
|
|
76
|
+
OVERLAP_THRESHOLD,
|
|
77
|
+
_cosine,
|
|
78
|
+
_loadAllowlist,
|
|
79
|
+
_pairKey,
|
|
80
|
+
collect,
|
|
81
|
+
} from './audit_skill_overlap.js';
|
|
75
82
|
import { assertScanned, DeadScopeError } from './_lib/scan_scope.js';
|
|
76
83
|
import { parse_frontmatter } from './skill_overlap.js';
|
|
77
84
|
|
|
@@ -168,9 +175,18 @@ const QUOTED_PHRASE_RE = /['"`][^'"`]{3,}['"`]/;
|
|
|
168
175
|
* Uses the canonical instrument, not a second implementation — one metric, one
|
|
169
176
|
* threshold, one answer. Cross-pack pairs are excluded for the same reason a
|
|
170
177
|
* cross-pack merge is out of scope: they do not compete for the same install.
|
|
178
|
+
*
|
|
179
|
+
* "One answer" includes the canonical EXCEPTIONS. A pair in
|
|
180
|
+
* `audit_skill_overlap_allowlist.json` is one a human read both sides of and
|
|
181
|
+
* ruled structural — shared domain vocabulary, distinct responsibility. Reading
|
|
182
|
+
* the same metric at the same threshold while ignoring its reviewed exceptions
|
|
183
|
+
* would be a second implementation wearing the first one's numbers, and it
|
|
184
|
+
* would ask an author to satisfy (e)/(f) for an overlap the project already
|
|
185
|
+
* decided is not a routing hazard.
|
|
171
186
|
*/
|
|
172
187
|
function computeClusters(root: string, threshold: number = OVERLAP_THRESHOLD): Map<string, string[]> {
|
|
173
188
|
const clusters = new Map<string, string[]>();
|
|
189
|
+
const reviewed = _loadAllowlist(OVERLAP_ALLOWLIST);
|
|
174
190
|
const skills = collect(root).map((s) => ({
|
|
175
191
|
slug: path.basename(path.dirname(s.relpath)),
|
|
176
192
|
packs: s.packs,
|
|
@@ -189,6 +205,7 @@ function computeClusters(root: string, threshold: number = OVERLAP_THRESHOLD): M
|
|
|
189
205
|
}
|
|
190
206
|
if (!sharesPack) continue;
|
|
191
207
|
if (_cosine(a.vector, b.vector) < threshold) continue;
|
|
208
|
+
if (reviewed.has(_pairKey(a.slug, b.slug))) continue;
|
|
192
209
|
clusters.set(a.slug, [...(clusters.get(a.slug) ?? []), b.slug]);
|
|
193
210
|
clusters.set(b.slug, [...(clusters.get(b.slug) ?? []), a.slug]);
|
|
194
211
|
}
|
|
@@ -115,6 +115,28 @@ function _exec_block(body: ReadonlyArray<[number, string]>): Record<string, [num
|
|
|
115
115
|
return out;
|
|
116
116
|
}
|
|
117
117
|
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Which grant key is legal on this artefact's surface.
|
|
121
|
+
*
|
|
122
|
+
* `road-to-skill-ecosystem-runtime-enforcement` Phase 3 Step 6. The failure this
|
|
123
|
+
* catches is silent by construction: **a loader ignores an unrecognised
|
|
124
|
+
* frontmatter key**, so a tool restriction written on the wrong surface parses
|
|
125
|
+
* fine, restricts nothing, and the artefact inherits every tool. A parse success
|
|
126
|
+
* is not a restriction — and nothing in the tree said so before this check.
|
|
127
|
+
*
|
|
128
|
+
* - `src/subagents/*.md` — subagent-v1 (`subagent.schema.json`) grants with a
|
|
129
|
+
* TOP-LEVEL `tools:`. It has no `execution:` block at all.
|
|
130
|
+
* - everything else (skills, commands, domain artefacts) — grants live under
|
|
131
|
+
* `execution.allowed_tools`, or as the consumer-format `allowed-tools`.
|
|
132
|
+
* A top-level `tools:` here is read by nothing.
|
|
133
|
+
*/
|
|
134
|
+
export type GrantSurface = 'subagent' | 'skill-like';
|
|
135
|
+
|
|
136
|
+
export function grantSurface(rel: string): GrantSurface {
|
|
137
|
+
return rel.replace(/\\/g, '/').includes('src/subagents/') ? 'subagent' : 'skill-like';
|
|
138
|
+
}
|
|
139
|
+
|
|
118
140
|
export function _scan(sf: sl.ScannedFile): sl.Finding[] {
|
|
119
141
|
if (sf.pragma_allows(CHECK)) {
|
|
120
142
|
return [];
|
|
@@ -130,6 +152,42 @@ export function _scan(sf: sl.ScannedFile): sl.Finding[] {
|
|
|
130
152
|
const handler = _stripQuotes((ex['handler'] ?? [0, ''])[1]);
|
|
131
153
|
const is_execution_skill = Object.keys(ex).length > 0 && handler !== '' && handler !== 'none';
|
|
132
154
|
|
|
155
|
+
// Wrong-surface tool restrictions. A key the loader does not recognise is
|
|
156
|
+
// IGNORED, so the artefact inherits everything — the restriction reads as
|
|
157
|
+
// present and is not. Both directions are checked, because both have a
|
|
158
|
+
// plausible author: a skill copying a subagent's `tools:` list, and a
|
|
159
|
+
// subagent copying a skill's `execution:` block.
|
|
160
|
+
const surface = grantSurface(sf.rel);
|
|
161
|
+
for (const [lineno, text] of body) {
|
|
162
|
+
if (surface === 'skill-like' && _RE_TOOLS_KEY.test(text)) {
|
|
163
|
+
out.push(
|
|
164
|
+
new sl.Finding(
|
|
165
|
+
sf.rel,
|
|
166
|
+
lineno,
|
|
167
|
+
CHECK,
|
|
168
|
+
'HIGH',
|
|
169
|
+
'top-level `tools:` on a non-subagent surface — subagent-v1 only; ' +
|
|
170
|
+
'the loader ignores it here, so this artefact is NOT restricted ' +
|
|
171
|
+
'(use execution.allowed_tools)',
|
|
172
|
+
sf.weight,
|
|
173
|
+
),
|
|
174
|
+
);
|
|
175
|
+
}
|
|
176
|
+
if (surface === 'subagent' && _RE_EXECUTION.test(text)) {
|
|
177
|
+
out.push(
|
|
178
|
+
new sl.Finding(
|
|
179
|
+
sf.rel,
|
|
180
|
+
lineno,
|
|
181
|
+
CHECK,
|
|
182
|
+
'HIGH',
|
|
183
|
+
'`execution:` block on a subagent definition — subagent-v1 has no such ' +
|
|
184
|
+
'key, so any allowed_tools under it restricts nothing (use top-level `tools:`)',
|
|
185
|
+
sf.weight,
|
|
186
|
+
),
|
|
187
|
+
);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
|
|
133
191
|
// consumer consent-bypass header + wildcard `allowed-tools` (hyphen = Claude
|
|
134
192
|
// format; the underscore source key is covered by the execution block below).
|
|
135
193
|
for (const [lineno, text] of body) {
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
/**
|
|
3
|
+
* Cross-skill body links resolve inside the tree a consumer receives.
|
|
4
|
+
*
|
|
5
|
+
* `road-to-inbox-harvest-2026-08-f-skill-selection-evidence` Phase 2.2.
|
|
6
|
+
*
|
|
7
|
+
* ── Why the DELIVERED tree and not `src/` ───────────────────────────────────
|
|
8
|
+
* `check_references` already walks `dist/agent-src` and reports a broken path.
|
|
9
|
+
* What it cannot answer is the question a consumer has: *does this link resolve
|
|
10
|
+
* in the tree I was given*. A link is not broken because its target is missing
|
|
11
|
+
* from the repository — it is broken because the target is missing from the
|
|
12
|
+
* SUBSET that shipped, and those are different failures with different fixes.
|
|
13
|
+
*
|
|
14
|
+
* So the corpus is `dist/agent-src/skills`, which is what the installer
|
|
15
|
+
* deploys. Not `src/skills`, whose contents a consumer never sees, and
|
|
16
|
+
* deliberately not per-pack: the roadmap's own step leaves the per-pack half to
|
|
17
|
+
* a parked owner, and a check that silently widened to it would be answering a
|
|
18
|
+
* question nobody asked here.
|
|
19
|
+
*
|
|
20
|
+
* ── The pattern, and the two links a tighter one misses ─────────────────────
|
|
21
|
+
* `](../<slug>/SKILL.md` — no trailing `\)`. With the paren the count is 974
|
|
22
|
+
* rather than 976, because two links carry an anchor (`SKILL.md#section`). That
|
|
23
|
+
* is the measurement note Phase 2.1 records, and it is the reason this gate does
|
|
24
|
+
* not close the pattern: a two-link blind spot in a link checker is a link
|
|
25
|
+
* checker that reports clean while missing exactly the shape most likely to rot.
|
|
26
|
+
*
|
|
27
|
+
* Exit codes: 0 clean · 1 unresolved link(s) · 2 usage / dead corpus.
|
|
28
|
+
*/
|
|
29
|
+
import * as fs from 'node:fs';
|
|
30
|
+
import * as path from 'node:path';
|
|
31
|
+
import process from 'node:process';
|
|
32
|
+
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
33
|
+
|
|
34
|
+
import { GateLedger } from './_lib/gate_ledger.js';
|
|
35
|
+
import { runGateCli, runSelfTest } from './_lib/gate_self_test.js';
|
|
36
|
+
import { DeadScopeError, reportScanned } from './_lib/scan_scope.js';
|
|
37
|
+
|
|
38
|
+
const _HERE = fileURLToPath(import.meta.url);
|
|
39
|
+
const REPO_ROOT = path.resolve(path.dirname(_HERE), '..', '..');
|
|
40
|
+
|
|
41
|
+
/** The delivered skills tree — what the installer deploys. */
|
|
42
|
+
export const DELIVERED_SKILLS_ROOT = 'dist/agent-src/skills';
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* A relative cross-skill body link.
|
|
46
|
+
*
|
|
47
|
+
* Deliberately NOT anchored on a closing paren — see the header. An anchor
|
|
48
|
+
* suffix (`SKILL.md#heading`) is a link like any other and must resolve.
|
|
49
|
+
*/
|
|
50
|
+
const CROSS_SKILL_LINK = /\]\(\.\.\/([a-z0-9-]+)\/SKILL\.md/g;
|
|
51
|
+
|
|
52
|
+
export interface UnresolvedLink {
|
|
53
|
+
/** Skill whose body carries the link. */
|
|
54
|
+
from: string;
|
|
55
|
+
/** Slug the link points at. */
|
|
56
|
+
to: string;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export interface ReachReport {
|
|
60
|
+
/** Skills present in the delivered tree. */
|
|
61
|
+
delivered: number;
|
|
62
|
+
/** Cross-skill links examined. */
|
|
63
|
+
links: number;
|
|
64
|
+
unresolved: UnresolvedLink[];
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/** Every skill directory in the delivered tree. */
|
|
68
|
+
export function deliveredSkills(root: string): string[] {
|
|
69
|
+
const dir = path.join(root, DELIVERED_SKILLS_ROOT);
|
|
70
|
+
try {
|
|
71
|
+
return fs
|
|
72
|
+
.readdirSync(dir, { withFileTypes: true })
|
|
73
|
+
.filter((e) => e.isDirectory())
|
|
74
|
+
.map((e) => e.name)
|
|
75
|
+
.sort();
|
|
76
|
+
} catch {
|
|
77
|
+
return [];
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/** Check every delivered skill's body links against the delivered set. */
|
|
82
|
+
export function run(root: string, ledger?: GateLedger): ReachReport {
|
|
83
|
+
const slugs = deliveredSkills(root);
|
|
84
|
+
const present = new Set(slugs);
|
|
85
|
+
const unresolved: UnresolvedLink[] = [];
|
|
86
|
+
let links = 0;
|
|
87
|
+
for (const slug of slugs) {
|
|
88
|
+
ledger?.plan(slug);
|
|
89
|
+
const file = path.join(root, DELIVERED_SKILLS_ROOT, slug, 'SKILL.md');
|
|
90
|
+
let source: string;
|
|
91
|
+
try {
|
|
92
|
+
source = fs.readFileSync(file, 'utf-8');
|
|
93
|
+
} catch {
|
|
94
|
+
// A skill directory with no SKILL.md carries no body links. Recorded
|
|
95
|
+
// as a skip rather than silently completed, so the ledger's planned
|
|
96
|
+
// count stays honest about what was actually read.
|
|
97
|
+
ledger?.skip(slug, 'no_applicable_files');
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
let bad = 0;
|
|
101
|
+
for (const m of source.matchAll(CROSS_SKILL_LINK)) {
|
|
102
|
+
links += 1;
|
|
103
|
+
const target = m[1] as string;
|
|
104
|
+
if (!present.has(target)) {
|
|
105
|
+
unresolved.push({ from: slug, to: target });
|
|
106
|
+
bad += 1;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
if (bad > 0) ledger?.fail(slug, `${String(bad)} unresolved cross-skill link(s)`);
|
|
110
|
+
else ledger?.complete(slug);
|
|
111
|
+
}
|
|
112
|
+
return { delivered: slugs.length, links, unresolved };
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/** Self-test. The rejecting case is a link to a skill that is not delivered. */
|
|
116
|
+
function selfTest(): number {
|
|
117
|
+
const tmp = fs.mkdtempSync(path.join(REPO_ROOT, '.link-reach-selftest-'));
|
|
118
|
+
const mk = (slug: string, body: string): void => {
|
|
119
|
+
const d = path.join(tmp, DELIVERED_SKILLS_ROOT, slug);
|
|
120
|
+
fs.mkdirSync(d, { recursive: true });
|
|
121
|
+
fs.writeFileSync(path.join(d, 'SKILL.md'), body, 'utf-8');
|
|
122
|
+
};
|
|
123
|
+
const fresh = (): void => {
|
|
124
|
+
fs.rmSync(path.join(tmp, 'dist'), { recursive: true, force: true });
|
|
125
|
+
};
|
|
126
|
+
const invoke = (): number =>
|
|
127
|
+
runGateCli(REPO_ROOT, 'src/scripts/lint_skill_link_reach.ts', ['--root', tmp, '--quiet'], REPO_ROOT);
|
|
128
|
+
try {
|
|
129
|
+
return runSelfTest({
|
|
130
|
+
gate: 'lint_skill_link_reach',
|
|
131
|
+
minCases: 4,
|
|
132
|
+
minRejectCases: 2,
|
|
133
|
+
cases: [
|
|
134
|
+
{
|
|
135
|
+
name: 'a link to a skill that is NOT delivered is rejected',
|
|
136
|
+
expect: 'reject',
|
|
137
|
+
run: () => {
|
|
138
|
+
fresh();
|
|
139
|
+
mk('a', 'see [b](../b/SKILL.md)\n');
|
|
140
|
+
return invoke();
|
|
141
|
+
},
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
name: 'a link carrying an ANCHOR is checked too — the two-link blind spot',
|
|
145
|
+
expect: 'reject',
|
|
146
|
+
run: () => {
|
|
147
|
+
fresh();
|
|
148
|
+
mk('a', 'see [b](../b/SKILL.md#some-heading)\n');
|
|
149
|
+
return invoke();
|
|
150
|
+
},
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
name: 'a link to a delivered skill is accepted',
|
|
154
|
+
expect: 'accept',
|
|
155
|
+
run: () => {
|
|
156
|
+
fresh();
|
|
157
|
+
mk('a', 'see [b](../b/SKILL.md)\n');
|
|
158
|
+
mk('b', 'body\n');
|
|
159
|
+
return invoke();
|
|
160
|
+
},
|
|
161
|
+
},
|
|
162
|
+
{
|
|
163
|
+
name: 'an empty delivered tree is REFUSED, not passed',
|
|
164
|
+
expect: 'reject',
|
|
165
|
+
run: () => {
|
|
166
|
+
fresh();
|
|
167
|
+
fs.mkdirSync(path.join(tmp, DELIVERED_SKILLS_ROOT), { recursive: true });
|
|
168
|
+
return invoke();
|
|
169
|
+
},
|
|
170
|
+
},
|
|
171
|
+
],
|
|
172
|
+
});
|
|
173
|
+
} finally {
|
|
174
|
+
fs.rmSync(tmp, { recursive: true, force: true });
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
export function main(argv: string[] = process.argv.slice(2)): number {
|
|
179
|
+
if (argv.includes('--self-test')) {
|
|
180
|
+
if (process.env['GATE_SELF_TEST_CHILD'] === '1') {
|
|
181
|
+
process.stderr.write('lint_skill_link_reach: --self-test must not recurse\n');
|
|
182
|
+
return 2;
|
|
183
|
+
}
|
|
184
|
+
return selfTest();
|
|
185
|
+
}
|
|
186
|
+
const rootIdx = argv.indexOf('--root');
|
|
187
|
+
const rootArg = rootIdx >= 0 ? argv[rootIdx + 1] : undefined;
|
|
188
|
+
const root = rootArg === undefined ? REPO_ROOT : path.resolve(rootArg);
|
|
189
|
+
const quiet = argv.includes('--quiet');
|
|
190
|
+
const isFixture = root !== REPO_ROOT;
|
|
191
|
+
|
|
192
|
+
const ledger = isFixture ? undefined : new GateLedger('lint_skill_link_reach');
|
|
193
|
+
const report = run(root, ledger);
|
|
194
|
+
|
|
195
|
+
const sink = (chunk: string): boolean => {
|
|
196
|
+
if (!quiet) process.stdout.write(chunk);
|
|
197
|
+
return true;
|
|
198
|
+
};
|
|
199
|
+
try {
|
|
200
|
+
reportScanned(
|
|
201
|
+
{
|
|
202
|
+
gate: 'lint_skill_link_reach',
|
|
203
|
+
scanned: report.delivered,
|
|
204
|
+
units: 'delivered skill(s)',
|
|
205
|
+
roots: [DELIVERED_SKILLS_ROOT],
|
|
206
|
+
},
|
|
207
|
+
sink,
|
|
208
|
+
);
|
|
209
|
+
} catch (e) {
|
|
210
|
+
if (e instanceof DeadScopeError) {
|
|
211
|
+
process.stderr.write(`❌ ${e.message}\n`);
|
|
212
|
+
return 2;
|
|
213
|
+
}
|
|
214
|
+
throw e;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
if (report.unresolved.length > 0) {
|
|
218
|
+
if (!quiet) {
|
|
219
|
+
process.stderr.write(
|
|
220
|
+
`❌ lint_skill_link_reach: ${String(report.unresolved.length)} cross-skill link(s) ` +
|
|
221
|
+
`do not resolve inside ${DELIVERED_SKILLS_ROOT}:\n`,
|
|
222
|
+
);
|
|
223
|
+
for (const u of report.unresolved) {
|
|
224
|
+
process.stderr.write(` ${u.from}/SKILL.md → ../${u.to}/SKILL.md (not delivered)\n`);
|
|
225
|
+
}
|
|
226
|
+
process.stderr.write(
|
|
227
|
+
' A consumer following that link gets a 404. Either the target belongs in the\n' +
|
|
228
|
+
' delivered set, or the link should point at something that is.\n',
|
|
229
|
+
);
|
|
230
|
+
}
|
|
231
|
+
ledger?.report(quiet ? () => undefined : undefined);
|
|
232
|
+
return 1;
|
|
233
|
+
}
|
|
234
|
+
ledger?.report(quiet ? () => undefined : undefined);
|
|
235
|
+
if (!quiet) {
|
|
236
|
+
process.stdout.write(
|
|
237
|
+
`✅ lint_skill_link_reach: ${String(report.links)} cross-skill link(s) across ` +
|
|
238
|
+
`${String(report.delivered)} delivered skill(s) all resolve.\n`,
|
|
239
|
+
);
|
|
240
|
+
}
|
|
241
|
+
return 0;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
/* c8 ignore start */
|
|
245
|
+
function isCliEntry(): boolean {
|
|
246
|
+
if (process.argv[1] === undefined) return false;
|
|
247
|
+
return pathToFileURL(path.resolve(process.argv[1])).href === pathToFileURL(_HERE).href;
|
|
248
|
+
}
|
|
249
|
+
if (isCliEntry()) {
|
|
250
|
+
process.exit(main());
|
|
251
|
+
}
|
|
252
|
+
/* c8 ignore stop */
|