@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
|
@@ -50,7 +50,25 @@ const _HERE = fileURLToPath(import.meta.url);
|
|
|
50
50
|
// src/scripts/skill_tools/score_skill_relevance.ts → parents[3] of the .py
|
|
51
51
|
// (skill_tools → scripts → src → repo root) is the package root.
|
|
52
52
|
export const ROOT = path.resolve(path.dirname(_HERE), '..', '..', '..');
|
|
53
|
-
|
|
53
|
+
/**
|
|
54
|
+
* The skills root, resolved the way the two real consumers already resolve it.
|
|
55
|
+
*
|
|
56
|
+
* `road-to-inbox-harvest-2026-08-f-skill-selection-evidence` 1.1. This used to be
|
|
57
|
+
* a hardcoded path to a directory that no longer exists, and the failure was
|
|
58
|
+
* SILENT: `--task "review a pull request"` printed `(no relevant skills found)`
|
|
59
|
+
* and exited 0, which is indistinguishable from a task that genuinely matches
|
|
60
|
+
* nothing. A ranker that reports an empty catalogue as an empty result is worse
|
|
61
|
+
* than one that crashes.
|
|
62
|
+
*
|
|
63
|
+
* `resolveSkillsRoot` is the shared resolver the `skill-route` concern and the
|
|
64
|
+
* `suggest_skill_for_task` MCP handler use — deliberately shared, because two
|
|
65
|
+
* resolvers over one catalogue is how a ranker and the tool that exposes it
|
|
66
|
+
* start ranking different trees. `null` when no candidate root exists, and the
|
|
67
|
+
* CLI turns that into a distinct exit code rather than an empty list.
|
|
68
|
+
*/
|
|
69
|
+
import { DEFAULT_CATALOGUE_ROOTS, resolveSkillsRoot } from '../_lib/skill_catalogue.js';
|
|
70
|
+
|
|
71
|
+
export const DEFAULT_SKILLS_DIR: string | null = resolveSkillsRoot(ROOT);
|
|
54
72
|
|
|
55
73
|
/** Mirror Python len(str) — count Unicode code points, not UTF-16 units. */
|
|
56
74
|
function pyLen(s: string): number {
|
|
@@ -364,7 +382,8 @@ const PROG = 'score_skill_relevance.py';
|
|
|
364
382
|
|
|
365
383
|
interface Args {
|
|
366
384
|
task: string;
|
|
367
|
-
|
|
385
|
+
/** `null` when no catalogue root exists — a DIFFERENT answer from an empty ranking. */
|
|
386
|
+
skills_dir: string | null;
|
|
368
387
|
top: number;
|
|
369
388
|
json: boolean;
|
|
370
389
|
sample: boolean;
|
|
@@ -433,13 +452,75 @@ export const _SAMPLE = {
|
|
|
433
452
|
task: 'build a livewire component for the user dashboard with reactive state',
|
|
434
453
|
};
|
|
435
454
|
|
|
455
|
+
/**
|
|
456
|
+
* Why this catalogue root cannot be ranked, or `null` when it can.
|
|
457
|
+
*
|
|
458
|
+
* `road-to-inbox-harvest-2026-08-f-skill-selection-evidence` 1.2. Three states,
|
|
459
|
+
* and the middle one is the one that actually bit: a root that does not exist, a
|
|
460
|
+
* root that exists and is EMPTY, and a readable root. `.claude/skills` is a
|
|
461
|
+
* gitignored projection, so a fresh worktree has the second — and the ranker
|
|
462
|
+
* reported it as "no relevant skills found", exit 0, on a task that scores 47
|
|
463
|
+
* against `src/skills`.
|
|
464
|
+
*
|
|
465
|
+
* An empty directory is not a missing directory, and neither is an empty result.
|
|
466
|
+
*/
|
|
467
|
+
function catalogueDeficit(dir: string | null): string | null {
|
|
468
|
+
if (dir === null) {
|
|
469
|
+
return `no catalogue root resolved — tried ${DEFAULT_CATALOGUE_ROOTS.join(', ')} under ${ROOT}`;
|
|
470
|
+
}
|
|
471
|
+
try {
|
|
472
|
+
if (!fs.existsSync(dir) || !fs.statSync(dir).isDirectory()) {
|
|
473
|
+
return `${dir} is not a directory`;
|
|
474
|
+
}
|
|
475
|
+
if (fs.readdirSync(dir).length === 0) {
|
|
476
|
+
return `${dir} exists and is EMPTY — an empty catalogue, not an empty result`;
|
|
477
|
+
}
|
|
478
|
+
} catch (e) {
|
|
479
|
+
return `${dir} could not be read: ${e instanceof Error ? e.message : String(e)}`;
|
|
480
|
+
}
|
|
481
|
+
return null;
|
|
482
|
+
}
|
|
483
|
+
|
|
436
484
|
export function main(argv: string[] | null = null): number {
|
|
437
485
|
const args = parse_args(argv ?? process.argv.slice(2));
|
|
438
486
|
const task = args.sample ? _SAMPLE.task : args.task;
|
|
439
487
|
if (!task) {
|
|
440
488
|
_argError('--task is required (or pass --sample)');
|
|
441
489
|
}
|
|
442
|
-
|
|
490
|
+
// 1.2 — "no matches" and "no catalogue" are DIFFERENT answers and now have
|
|
491
|
+
// different exit codes. `missing-skill-recovery` already draws that line for
|
|
492
|
+
// the MCP tool (`status: no_catalogue`); the CLI did not, and an agent
|
|
493
|
+
// reading `(no relevant skills found)` from an unreachable catalogue
|
|
494
|
+
// concludes "no skill covers this" — the exact wrong conclusion that rule
|
|
495
|
+
// exists to prevent.
|
|
496
|
+
// The check covers an EXPLICIT --skills-dir too, not only the default. An
|
|
497
|
+
// operator who passes a wrong path is in exactly the position the silent
|
|
498
|
+
// failure was about, and answering them with "(no relevant skills found)"
|
|
499
|
+
// is the same wrong answer with a different cause.
|
|
500
|
+
const unreadable = catalogueDeficit(args.skills_dir);
|
|
501
|
+
if (unreadable !== null) {
|
|
502
|
+
if (args.json) {
|
|
503
|
+
process.stdout.write(
|
|
504
|
+
pyJsonDumpsIndent2({
|
|
505
|
+
task,
|
|
506
|
+
status: 'no_catalogue',
|
|
507
|
+
reason: unreadable,
|
|
508
|
+
...(args.skills_dir === null ? { tried: [...DEFAULT_CATALOGUE_ROOTS] } : { skills_dir: args.skills_dir }),
|
|
509
|
+
}),
|
|
510
|
+
);
|
|
511
|
+
process.stdout.write('\n');
|
|
512
|
+
} else {
|
|
513
|
+
process.stderr.write(
|
|
514
|
+
`(no skills catalogue read — ${unreadable})\n` +
|
|
515
|
+
'This is NOT "no skill matches": nothing was read, so no conclusion about ' +
|
|
516
|
+
'skill coverage follows from it.\n',
|
|
517
|
+
);
|
|
518
|
+
}
|
|
519
|
+
return 3;
|
|
520
|
+
}
|
|
521
|
+
// Non-null past the deficit check above, which returns before this line
|
|
522
|
+
// whenever the root cannot be ranked.
|
|
523
|
+
const rows = rank(task, args.skills_dir as string);
|
|
443
524
|
if (args.json) {
|
|
444
525
|
const sliced = args.top ? rows.slice(0, args.top) : rows;
|
|
445
526
|
const payload = sliced.map(([n, s, p]) => ({ name: n, score: s, personas: p }));
|
|
@@ -29,6 +29,9 @@ import * as fs from 'node:fs';
|
|
|
29
29
|
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
30
30
|
|
|
31
31
|
import { audit, type PersonaRow } from './audit_persona_coverage.js';
|
|
32
|
+
/** Sentinel for "no catalogue root resolved" — never a readable path. */
|
|
33
|
+
const NO_CATALOGUE = '<no-skills-catalogue>';
|
|
34
|
+
|
|
32
35
|
import { DEFAULT_SKILLS_DIR, rank } from './score_skill_relevance.js';
|
|
33
36
|
|
|
34
37
|
const _HERE = fileURLToPath(import.meta.url);
|
|
@@ -211,7 +214,11 @@ function _parseInt(raw: string): number {
|
|
|
211
214
|
export function parse_args(argv: string[]): Args {
|
|
212
215
|
const args: Args = {
|
|
213
216
|
task: '',
|
|
214
|
-
|
|
217
|
+
// `?? ''` is deliberately NOT used here: an empty string re-creates
|
|
218
|
+
// exactly the silent-empty-catalogue defect that repointing
|
|
219
|
+
// DEFAULT_SKILLS_DIR removed. When no catalogue resolves, this reads
|
|
220
|
+
// as the literal marker below and the caller's own check reports it.
|
|
221
|
+
skills_dir: DEFAULT_SKILLS_DIR ?? NO_CATALOGUE,
|
|
215
222
|
personas_dir: DEFAULT_PERSONAS,
|
|
216
223
|
top: 3,
|
|
217
224
|
json: false,
|
|
@@ -24,6 +24,7 @@ import { assertScanned, DeadScopeError } from './_lib/scan_scope.js';
|
|
|
24
24
|
// tier-usage re-tier already ships. Imported rather than restated so the sink
|
|
25
25
|
// section and the re-tier decision cannot drift to two different numbers.
|
|
26
26
|
import { DEFAULT_TIER_USAGE_RETIER } from '../agent-src/templates/scripts/telemetry/settings.js';
|
|
27
|
+
import { generatedByQuote } from './_lib/generated_by.js';
|
|
27
28
|
|
|
28
29
|
const _HERE = path.dirname(fileURLToPath(import.meta.url));
|
|
29
30
|
// parent.parent.parent of the .py file (src/scripts/skill_usage_report.py)
|
|
@@ -469,7 +470,7 @@ export function render(
|
|
|
469
470
|
const lines: string[] = [
|
|
470
471
|
'# Skill Usage Report (baseline)',
|
|
471
472
|
'',
|
|
472
|
-
'
|
|
473
|
+
generatedByQuote('skill_usage_report', 'Source:'),
|
|
473
474
|
'> `agents/runtime/metrics/skill-usage.jsonl` (collector emits per-turn',
|
|
474
475
|
'> exposure/mention records). See',
|
|
475
476
|
'> [`step-2-skill-inventory-rationalization.md`](../roadmaps/step-2-skill-inventory-rationalization.md)',
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
/**
|
|
3
|
+
* `stubs:due` — what in the parked estate is waiting, and on whom.
|
|
4
|
+
*
|
|
5
|
+
* `road-to-inbox-harvest-2026-08-f-owner-decision-queue` Phase 2. The estate is
|
|
6
|
+
* not short of plans; it was short of a front door. 76 stubs sit under
|
|
7
|
+
* `agents/roadmaps/stubs/`, the progress dashboard excludes that directory ON
|
|
8
|
+
* PURPOSE, and before this command nothing ever re-read them: exactly one of the
|
|
9
|
+
* 76 carried a next-read date.
|
|
10
|
+
*
|
|
11
|
+
* ── What it does NOT do, and this is the load-bearing part ───────────────────
|
|
12
|
+
* It is READ-ONLY and it authors nothing inside `agents/roadmaps/stubs/`. The AI
|
|
13
|
+
* council of 2026-08-21 deleted the hand-maintained index that used to live in
|
|
14
|
+
* `stubs/README.md`, because an authored append surface conflicted in every open
|
|
15
|
+
* PR and drifted stale within a day of its own repair;
|
|
16
|
+
* `check_no_stub_inventory_table` refuses its return.
|
|
17
|
+
*
|
|
18
|
+
* That verdict settled *an inventory of the directory living inside the
|
|
19
|
+
* directory's own README*. This is a frontmatter field plus a query: the stub
|
|
20
|
+
* files stay the single source, no row is authored twice, and there is no append
|
|
21
|
+
* surface to conflict on. Different mechanism, so the lock does not apply —
|
|
22
|
+
* recorded here rather than left for a later reader to re-derive.
|
|
23
|
+
*
|
|
24
|
+
* ── Three buckets, because they are three different problems ─────────────────
|
|
25
|
+
* · OVERDUE — `review_by:` has passed. Late; re-read it.
|
|
26
|
+
* · NO PROBE — carries `probe: none`. Not late: it has no finish line at all,
|
|
27
|
+
* which is an abandonment wearing a directory name.
|
|
28
|
+
* · OWNER — the text routes a decision to the owner. Not late and not
|
|
29
|
+
* abandoned: it is waiting on a person, and no amount of re-reading moves it.
|
|
30
|
+
*
|
|
31
|
+
* Collapsing them into one count would tell a reader to re-read a file that
|
|
32
|
+
* needs a decision, and to decide about a file that needs a probe.
|
|
33
|
+
*
|
|
34
|
+
* Exit codes: 0 always on the report path (this is a QUERY, not a gate) ·
|
|
35
|
+
* 2 usage / unreadable corpus.
|
|
36
|
+
*/
|
|
37
|
+
import * as fs from 'node:fs';
|
|
38
|
+
import * as path from 'node:path';
|
|
39
|
+
import process from 'node:process';
|
|
40
|
+
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
41
|
+
|
|
42
|
+
const _HERE = fileURLToPath(import.meta.url);
|
|
43
|
+
const REPO_ROOT = path.resolve(path.dirname(_HERE), '..', '..');
|
|
44
|
+
|
|
45
|
+
/** Where the parked estate lives. */
|
|
46
|
+
export const STUB_DIR = 'agents/roadmaps/stubs';
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Phrases that mean "a person has to decide this".
|
|
50
|
+
*
|
|
51
|
+
* A literal list, never a heuristic: a general "looks like a decision" match
|
|
52
|
+
* would flag every stub that mentions the word, and a query that over-reports is
|
|
53
|
+
* a query nobody runs twice. Each entry is a phrase this repository's own stubs
|
|
54
|
+
* and roadmaps actually use.
|
|
55
|
+
*/
|
|
56
|
+
const OWNER_ROUTING = [
|
|
57
|
+
'owner-reserved',
|
|
58
|
+
'owner reserved',
|
|
59
|
+
'owner: maintainer',
|
|
60
|
+
'reserved to the owner',
|
|
61
|
+
'requires owner',
|
|
62
|
+
'maintainer decision',
|
|
63
|
+
'owner decision',
|
|
64
|
+
'owner sign-off',
|
|
65
|
+
'awaiting the owner',
|
|
66
|
+
];
|
|
67
|
+
|
|
68
|
+
export interface StubRecord {
|
|
69
|
+
/** Repo-relative path. */
|
|
70
|
+
file: string;
|
|
71
|
+
/** Parsed `review_by:`, or `null` when absent or unparseable. */
|
|
72
|
+
reviewBy: string | null;
|
|
73
|
+
/** True when the file declares `probe: none`. */
|
|
74
|
+
probeNone: boolean;
|
|
75
|
+
/** The owner-routing phrase that matched, or `null`. */
|
|
76
|
+
ownerPhrase: string | null;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/** Read one stub's fields. Frontmatter only — the body is scanned separately. */
|
|
80
|
+
export function readStub(root: string, rel: string): StubRecord {
|
|
81
|
+
const source = fs.readFileSync(path.join(root, rel), 'utf-8');
|
|
82
|
+
const fm = /^---\n([\s\S]*?)\n---\n/.exec(source);
|
|
83
|
+
const front = fm?.[1] ?? '';
|
|
84
|
+
const dateMatch = /^review_by:\s*(\d{4}-\d{2}-\d{2})\s*$/m.exec(front);
|
|
85
|
+
const lower = source.toLowerCase();
|
|
86
|
+
const phrase = OWNER_ROUTING.find((p) => lower.includes(p)) ?? null;
|
|
87
|
+
return {
|
|
88
|
+
file: rel,
|
|
89
|
+
reviewBy: dateMatch?.[1] ?? null,
|
|
90
|
+
probeNone: /^probe:\s*none\s*$/m.test(front),
|
|
91
|
+
ownerPhrase: phrase,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/** Every stub file, sorted. `README.md` is the contract, not a stub. */
|
|
96
|
+
export function listStubs(root: string): string[] {
|
|
97
|
+
const dir = path.join(root, STUB_DIR);
|
|
98
|
+
let entries: string[];
|
|
99
|
+
try {
|
|
100
|
+
entries = fs.readdirSync(dir);
|
|
101
|
+
} catch {
|
|
102
|
+
return [];
|
|
103
|
+
}
|
|
104
|
+
return entries
|
|
105
|
+
.filter((n) => n.endsWith('.md') && n !== 'README.md')
|
|
106
|
+
.map((n) => `${STUB_DIR}/${n}`)
|
|
107
|
+
.sort();
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
export interface DueReport {
|
|
111
|
+
total: number;
|
|
112
|
+
/** `review_by:` in the past, or absent — both mean nobody scheduled a read. */
|
|
113
|
+
overdue: readonly StubRecord[];
|
|
114
|
+
/** `probe: none` — no finish line, which is not the same as late. */
|
|
115
|
+
noProbe: readonly StubRecord[];
|
|
116
|
+
/** Text routes a decision to a person. */
|
|
117
|
+
owner: readonly StubRecord[];
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Classify the corpus against a date.
|
|
122
|
+
*
|
|
123
|
+
* `today` is a parameter rather than read from the clock, because a query whose
|
|
124
|
+
* output depends on an unstated `Date.now()` cannot be tested and cannot be
|
|
125
|
+
* quoted in a commit. The CLI passes the real date; a test passes a fixed one.
|
|
126
|
+
*/
|
|
127
|
+
export function report(root: string, today: string): DueReport {
|
|
128
|
+
const records = listStubs(root).map((rel) => readStub(root, rel));
|
|
129
|
+
return {
|
|
130
|
+
total: records.length,
|
|
131
|
+
// An ABSENT date counts as overdue, deliberately. The field is required
|
|
132
|
+
// by the contract, so a missing one means the file predates the contract
|
|
133
|
+
// or somebody skipped it — either way nobody has scheduled a read, which
|
|
134
|
+
// is the state this query exists to surface.
|
|
135
|
+
overdue: records.filter((r) => r.reviewBy === null || r.reviewBy <= today),
|
|
136
|
+
noProbe: records.filter((r) => r.probeNone),
|
|
137
|
+
owner: records.filter((r) => r.ownerPhrase !== null),
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
function render(r: DueReport, today: string, write: (s: string) => void): void {
|
|
142
|
+
write(`stubs:due — ${String(r.total)} stub(s) under ${STUB_DIR}, as of ${today}\n\n`);
|
|
143
|
+
|
|
144
|
+
const section = (label: string, rows: readonly StubRecord[], detail: (s: StubRecord) => string): void => {
|
|
145
|
+
write(`${label}: ${String(rows.length)}\n`);
|
|
146
|
+
for (const s of rows) write(` ${s.file} ${detail(s)}\n`);
|
|
147
|
+
if (rows.length > 0) write('\n');
|
|
148
|
+
};
|
|
149
|
+
|
|
150
|
+
section('OVERDUE — review_by has passed or is absent', r.overdue, (s) =>
|
|
151
|
+
s.reviewBy === null ? '(no review_by — nobody scheduled a read)' : `review_by ${s.reviewBy}`,
|
|
152
|
+
);
|
|
153
|
+
section('NO PROBE — declares `probe: none`; no finish line, not merely late', r.noProbe, () => '');
|
|
154
|
+
section('OWNER — the text routes a decision to a person', r.owner, (s) => `matched "${s.ownerPhrase ?? ''}"`);
|
|
155
|
+
|
|
156
|
+
write(
|
|
157
|
+
'This is a QUERY and exits 0 whatever it finds. It writes nothing and authors\n' +
|
|
158
|
+
`no file under ${STUB_DIR} — see the header for why that boundary matters.\n`,
|
|
159
|
+
);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
export function main(argv: string[] = process.argv.slice(2)): number {
|
|
163
|
+
if (argv.includes('-h') || argv.includes('--help')) {
|
|
164
|
+
process.stdout.write(
|
|
165
|
+
'usage: stubs_due [--root DIR] [--today YYYY-MM-DD] [--json] [--counts]\n' +
|
|
166
|
+
' --today classify against this date instead of the system clock\n' +
|
|
167
|
+
' --counts print only the two dashboard integers\n',
|
|
168
|
+
);
|
|
169
|
+
return 0;
|
|
170
|
+
}
|
|
171
|
+
const rootIdx = argv.indexOf('--root');
|
|
172
|
+
const rootArg = rootIdx >= 0 ? argv[rootIdx + 1] : undefined;
|
|
173
|
+
const root = rootArg === undefined ? REPO_ROOT : path.resolve(rootArg);
|
|
174
|
+
const todayIdx = argv.indexOf('--today');
|
|
175
|
+
const todayArg = todayIdx >= 0 ? argv[todayIdx + 1] : undefined;
|
|
176
|
+
const today = todayArg ?? new Date().toISOString().slice(0, 10);
|
|
177
|
+
if (!/^\d{4}-\d{2}-\d{2}$/.test(today)) {
|
|
178
|
+
process.stderr.write(`stubs_due: --today must be YYYY-MM-DD, got "${today}"\n`);
|
|
179
|
+
return 2;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
const r = report(root, today);
|
|
183
|
+
if (r.total === 0) {
|
|
184
|
+
process.stderr.write(
|
|
185
|
+
`stubs_due: found no stub under ${root}/${STUB_DIR} — the root moved, or this is not the repository root\n`,
|
|
186
|
+
);
|
|
187
|
+
return 2;
|
|
188
|
+
}
|
|
189
|
+
if (argv.includes('--json')) {
|
|
190
|
+
process.stdout.write(`${JSON.stringify({ today, ...r }, null, 2)}\n`);
|
|
191
|
+
return 0;
|
|
192
|
+
}
|
|
193
|
+
if (argv.includes('--counts')) {
|
|
194
|
+
// The two integers Phase 2.3 puts on the dashboard. Two integers are not
|
|
195
|
+
// an inventory: no row, no link, nothing to conflict on.
|
|
196
|
+
process.stdout.write(`${String(r.overdue.length)} ${String(r.owner.length)}\n`);
|
|
197
|
+
return 0;
|
|
198
|
+
}
|
|
199
|
+
render(r, today, (s) => void process.stdout.write(s));
|
|
200
|
+
return 0;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
/* c8 ignore start */
|
|
204
|
+
function isCliEntry(): boolean {
|
|
205
|
+
if (process.argv[1] === undefined) return false;
|
|
206
|
+
return pathToFileURL(path.resolve(process.argv[1])).href === pathToFileURL(_HERE).href;
|
|
207
|
+
}
|
|
208
|
+
if (isCliEntry()) {
|
|
209
|
+
process.exit(main());
|
|
210
|
+
}
|
|
211
|
+
/* c8 ignore stop */
|