@event4u/agent-config 14.11.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 +368 -516
- 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/evidence-discipline.md +26 -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/code-refactoring/SKILL.md +45 -1
- package/dist/agent-src/skills/code-review/SKILL.md +65 -6
- package/dist/agent-src/skills/command-writing/SKILL.md +35 -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 +25 -2
- 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/project-analysis-core/SKILL.md +23 -0
- package/dist/agent-src/skills/react-shadcn-ui/SKILL.md +30 -13
- package/dist/agent-src/skills/skill-writing/references/procedure.md +29 -7
- 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/storybook-workshop/SKILL.md +9 -0
- 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 +53 -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-L43NCYPB.js → chunk-4FS4WRXP.js} +10 -0
- package/dist/cli-delegate/{chunk-OMIVVCG2.js → chunk-A4QJ6ENT.js} +24 -0
- package/dist/cli-delegate/{chunk-236PNQZK.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 +62 -62
- 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 +2413 -1087
- 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 +639 -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 +6 -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 +30 -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/downstream-changes-mechanics.md +91 -0
- 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 +21 -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/docs/guidelines/redundancy-taxonomy.md +180 -0
- package/llms.txt +2 -2
- package/package.json +10 -3
- 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 +48 -3
- package/src/config/assurance-capability-registry.json +21 -9
- package/src/config/budgets.yml +19 -0
- 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 +95 -0
- package/src/config/discovery/prompt-patterns.yml +56 -0
- package/src/config/drafting-channels.yml +43 -0
- package/src/config/estate-count-budget.json +38 -31
- package/src/config/evaluator-budgets.json +14 -14
- package/src/config/gate-coverage.yml +731 -30
- package/src/config/gate-reachability-exemptions.json +21 -0
- package/src/config/gate-violation-baselines.json +38 -20
- 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 +35 -7
- package/src/config/preamble-payload-budget.json +97 -71
- 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 +43 -0
- package/src/config/rule-stub-ceilings.json +126 -112
- package/src/config/suggestion-capture.json +28 -0
- package/src/config/surface-matrix.yml +21 -2
- package/src/config/turnaround-budget.json +66 -0
- package/src/config/web-launch-readiness.json +188 -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/gate_baseline.ts +150 -1
- 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/skill_estate.ts +115 -0
- 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/argument_exhaustion.ts +130 -0
- 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 +195 -7
- package/src/scripts/check_claims.ts +576 -6
- package/src/scripts/check_command_examples.ts +557 -0
- 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 +263 -3
- 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 +144 -6
- 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_routing_coverage.ts +352 -0
- 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 +528 -0
- package/src/scripts/check_skill_admissions.ts +514 -0
- 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/check_web_launch_readiness.ts +705 -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/description_route_check.ts +494 -0
- 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 +125 -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 +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 +378 -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_budget_ownership.ts +54 -4
- 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 +752 -0
- 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/pack_install_smoke.ts +363 -0
- package/src/scripts/pr_conflict_census.ts +187 -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/report_pack_delta.ts +204 -0
- 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/select_analysis_mode.ts +112 -0
- 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 +40 -1
- package/src/scripts/trigger_eval_grandfather.json +202 -222
- package/src/scripts/utilization_report.ts +22 -2
- package/src/server/schemas/settings.ts +10 -0
- package/src/templates/marketing-copy.yml +1 -1
- package/dist/agent-src/skills/accessibility-auditor/evals/evals.json +0 -15
- package/dist/agent-src/skills/agent-security-review/evals/triggers.json +0 -52
- package/dist/agent-src/skills/ai-code-blindspots/evals/triggers.json +0 -52
- package/dist/agent-src/skills/alerting-doctrine/evals/triggers.json +0 -17
- package/dist/agent-src/skills/analysis-skill-router/evals/evals.json +0 -13
- package/dist/agent-src/skills/brand/evals/triggers.json +0 -17
- package/dist/agent-src/skills/brand-asset-generation/evals/triggers.json +0 -17
- package/dist/agent-src/skills/brand-audit/evals/triggers.json +0 -17
- package/dist/agent-src/skills/brand-identity/evals/triggers.json +0 -17
- package/dist/agent-src/skills/brand-strategy/evals/triggers.json +0 -17
- package/dist/agent-src/skills/brand-to-tokens/evals/triggers.json +0 -17
- package/dist/agent-src/skills/bug-analyzer/evals/evals.json +0 -13
- package/dist/agent-src/skills/canvas-design/evals/triggers.json +0 -17
- package/dist/agent-src/skills/character-consistency/evals/evals.json +0 -16
- package/dist/agent-src/skills/code-intelligence/evals/triggers.json +0 -52
- package/dist/agent-src/skills/code-review/evals/evals.json +0 -100
- package/dist/agent-src/skills/command-routing/evals/evals.json +0 -14
- package/dist/agent-src/skills/complexity-first-planning/evals/triggers.json +0 -17
- package/dist/agent-src/skills/contract-review/evals/triggers.json +0 -17
- package/dist/agent-src/skills/conventional-commits-writing/evals/evals.json +0 -15
- package/dist/agent-src/skills/corpus-grounding/evals/triggers.json +0 -17
- package/dist/agent-src/skills/dashboard-design/evals/evals.json +0 -16
- package/dist/agent-src/skills/dcf-modeling/evals/domain-truth.json +0 -29
- package/dist/agent-src/skills/dcf-modeling/evals/evals.json +0 -20
- package/dist/agent-src/skills/decision-record/evals/evals.json +0 -20
- package/dist/agent-src/skills/decision-record/evals/triggers.json +0 -87
- package/dist/agent-src/skills/design-intelligence/evals/evals.json +0 -14
- package/dist/agent-src/skills/design-intelligence/evals/triggers.json +0 -17
- package/dist/agent-src/skills/design-system-capture/evals/evals.json +0 -15
- package/dist/agent-src/skills/design-tokens/evals/triggers.json +0 -17
- package/dist/agent-src/skills/design-variations/evals/triggers.json +0 -17
- package/dist/agent-src/skills/developer-like-execution/evals/evals.json +0 -16
- package/dist/agent-src/skills/doc-coauthoring/evals/evals.json +0 -16
- package/dist/agent-src/skills/doc-coauthoring/evals/triggers.json +0 -17
- package/dist/agent-src/skills/docx-authoring/evals/triggers.json +0 -52
- package/dist/agent-src/skills/dpa-review/evals/triggers.json +0 -17
- package/dist/agent-src/skills/editorial-calendar/evals/domain-truth.json +0 -16
- package/dist/agent-src/skills/editorial-calendar/evals/evals.json +0 -16
- package/dist/agent-src/skills/eloquent/evals/triggers.json +0 -17
- package/dist/agent-src/skills/estimate-ticket/evals/evals.json +0 -16
- package/dist/agent-src/skills/estimate-ticket/evals/output-schema.yml +0 -20
- package/dist/agent-src/skills/estimate-ticket/evals/triggers.json +0 -19
- package/dist/agent-src/skills/evaluate-llm-feature/evals/triggers.json +0 -52
- package/dist/agent-src/skills/existing-ui-audit/evals/triggers.json +0 -47
- package/dist/agent-src/skills/experiment-loop/evals/output-schema.yml +0 -27
- package/dist/agent-src/skills/experiment-loop/evals/triggers.json +0 -17
- package/dist/agent-src/skills/fe-design/evals/triggers.json +0 -67
- package/dist/agent-src/skills/forecasting/evals/domain-truth.json +0 -29
- package/dist/agent-src/skills/forecasting/evals/evals.json +0 -20
- package/dist/agent-src/skills/forensics-report/evals/triggers.json +0 -17
- package/dist/agent-src/skills/frontend-render-security/evals/triggers.json +0 -52
- package/dist/agent-src/skills/fundraising-narrative/evals/domain-truth.json +0 -16
- package/dist/agent-src/skills/fundraising-narrative/evals/evals.json +0 -16
- package/dist/agent-src/skills/gated-reach/evals/triggers.json +0 -72
- package/dist/agent-src/skills/github-ci/evals/evals.json +0 -25
- package/dist/agent-src/skills/history-design/evals/triggers.json +0 -17
- package/dist/agent-src/skills/html-deck/evals/triggers.json +0 -17
- package/dist/agent-src/skills/humanizer/evals/strip_fixtures.json +0 -57
- package/dist/agent-src/skills/humanizer/evals/triggers.json +0 -17
- package/dist/agent-src/skills/iconography/evals/triggers.json +0 -17
- package/dist/agent-src/skills/image-analyser/evals/triggers.json +0 -17
- package/dist/agent-src/skills/image-creator/evals/triggers.json +0 -17
- package/dist/agent-src/skills/image-editing/evals/triggers.json +0 -17
- package/dist/agent-src/skills/image-generation/evals/triggers.json +0 -17
- package/dist/agent-src/skills/image-provider-routing/evals/triggers.json +0 -17
- package/dist/agent-src/skills/incident-commander/evals/domain-truth.json +0 -16
- package/dist/agent-src/skills/incident-commander/evals/evals.json +0 -20
- package/dist/agent-src/skills/js-library-packaging/evals/triggers.json +0 -17
- package/dist/agent-src/skills/judge-artifact-completeness/evals/triggers.json +0 -17
- package/dist/agent-src/skills/judge-injection-defense/evals/triggers.json +0 -17
- package/dist/agent-src/skills/judge-synthesis/evals/triggers.json +0 -17
- package/dist/agent-src/skills/launch-readiness/evals/evals.json +0 -21
- package/dist/agent-src/skills/learning-tutor/evals/triggers.json +0 -52
- package/dist/agent-src/skills/legal-intake-triage/evals/triggers.json +0 -17
- package/dist/agent-src/skills/legal-practice-profile/evals/triggers.json +0 -17
- package/dist/agent-src/skills/license-compliance-audit/evals/triggers.json +0 -52
- package/dist/agent-src/skills/license-compliance-borrow-check/evals/triggers.json +0 -52
- package/dist/agent-src/skills/license-compliance-credits/evals/triggers.json +0 -52
- package/dist/agent-src/skills/llm-provider-knowledge/evals/triggers.json +0 -20
- package/dist/agent-src/skills/logging-monitoring/evals/evals.json +0 -16
- package/dist/agent-src/skills/logo-generation/evals/triggers.json +0 -17
- package/dist/agent-src/skills/messaging-architecture/evals/domain-truth.json +0 -16
- package/dist/agent-src/skills/messaging-architecture/evals/evals.json +0 -16
- package/dist/agent-src/skills/monorepo-workspace/evals/triggers.json +0 -17
- package/dist/agent-src/skills/nda-triage/evals/triggers.json +0 -17
- package/dist/agent-src/skills/operational-readiness/evals/triggers.json +0 -17
- package/dist/agent-src/skills/pdf-tools/evals/triggers.json +0 -52
- package/dist/agent-src/skills/perf-feedback-craft/evals/evals.json +0 -16
- package/dist/agent-src/skills/persona-improvement/evals/triggers.json +0 -52
- package/dist/agent-src/skills/php-coder/evals/triggers.json +0 -17
- package/dist/agent-src/skills/prediction-pool-optimizer/evals/triggers.json +0 -21
- package/dist/agent-src/skills/prompt-engineering-image/evals/triggers.json +0 -17
- package/dist/agent-src/skills/prompt-engineering-patterns/evals/evals.json +0 -16
- package/dist/agent-src/skills/prompt-validator/evals/triggers.json +0 -17
- package/dist/agent-src/skills/quality-tools/evals/evals.json +0 -15
- package/dist/agent-src/skills/reasoning-orchestrator/evals/triggers.json +0 -17
- package/dist/agent-src/skills/refine-prompt/evals/evals.json +0 -16
- package/dist/agent-src/skills/refine-ticket/evals/evals.json +0 -16
- package/dist/agent-src/skills/refine-ticket/evals/output-schema.yml +0 -16
- package/dist/agent-src/skills/refine-ticket/evals/triggers.json +0 -17
- package/dist/agent-src/skills/release-comms/evals/evals.json +0 -16
- package/dist/agent-src/skills/rice-prioritization/evals/evals.json +0 -20
- package/dist/agent-src/skills/runway-cognition/evals/domain-truth.json +0 -29
- package/dist/agent-src/skills/runway-cognition/evals/evals.json +0 -20
- package/dist/agent-src/skills/scenario-modeling/evals/domain-truth.json +0 -29
- package/dist/agent-src/skills/scenario-modeling/evals/evals.json +0 -20
- package/dist/agent-src/skills/schema-review/evals/triggers.json +0 -17
- package/dist/agent-src/skills/screenshot-hygiene/evals/triggers.json +0 -52
- package/dist/agent-src/skills/security-maturity-assessment/evals/triggers.json +0 -52
- package/dist/agent-src/skills/server-hardening/evals/triggers.json +0 -17
- package/dist/agent-src/skills/skill-writing/evals/triggers.json +0 -17
- package/dist/agent-src/skills/spreadsheet-authoring/evals/triggers.json +0 -47
- package/dist/agent-src/skills/storybook-workshop/evals/triggers.json +0 -17
- package/dist/agent-src/skills/subagent-orchestration/evals/evals.json +0 -60
- package/dist/agent-src/skills/supply-chain-intake/evals/triggers.json +0 -52
- package/dist/agent-src/skills/systematic-debugging/evals/evals.json +0 -20
- package/dist/agent-src/skills/test-case-discovery/evals/triggers.json +0 -52
- package/dist/agent-src/skills/test-driven-development/evals/evals.json +0 -16
- package/dist/agent-src/skills/threat-modeling/evals/evals.json +0 -21
- package/dist/agent-src/skills/typography-system/evals/evals.json +0 -14
- package/dist/agent-src/skills/typography-system/evals/triggers.json +0 -17
- package/dist/agent-src/skills/unit-economics-modeling/evals/domain-truth.json +0 -40
- package/dist/agent-src/skills/unit-economics-modeling/evals/evals.json +0 -24
- package/dist/agent-src/skills/verify-completion-evidence/evals/evals.json +0 -16
- package/dist/agent-src/skills/verify-repair-loop/evals/output-schema.yml +0 -20
- package/dist/agent-src/skills/verify-repair-loop/evals/triggers.json +0 -17
- package/dist/agent-src/skills/vision-articulation/evals/evals.json +0 -16
- package/dist/agent-src/skills/voice-and-tone-design/evals/evals.json +0 -16
- package/dist/agent-src/skills/wireframe/evals/triggers.json +0 -17
- package/dist/agent-src/skills/workspace-link/evals/triggers.json +0 -17
- package/dist/agent-src/skills/worktree-lifecycle/evals/evals.json +0 -38
- package/dist/agent-src/skills/worktree-lifecycle/evals/triggers.json +0 -52
- package/dist/cli/agent-config.js.map +0 -1
- package/dist/cli/bash/runBash.js.map +0 -1
- package/dist/cli/commands/commands.js.map +0 -1
- package/dist/cli/commands/config.js.map +0 -1
- package/dist/cli/commands/doctorShell.js.map +0 -1
- package/dist/cli/commands/mcpServer.js.map +0 -1
- package/dist/cli/commands/packs.js.map +0 -1
- package/dist/cli/commands/profiles.js.map +0 -1
- package/dist/cli/commands/recordTriggerEval.js.map +0 -1
- package/dist/cli/commands/rtkDetect.js.map +0 -1
- package/dist/cli/commands/settings.js.map +0 -1
- package/dist/cli/commands/uiAudit.js.map +0 -1
- package/dist/cli/commands/uiRender.js.map +0 -1
- package/dist/cli/commands/uiServe.js.map +0 -1
- package/dist/cli/commands/versions.js.map +0 -1
- package/dist/cli/commands/workspaces.js.map +0 -1
- package/dist/cli/configRoot.js.map +0 -1
- package/dist/cli/discovery/loadManifest.js.map +0 -1
- package/dist/cli/firstRunNotice.js.map +0 -1
- package/dist/cli/help.js.map +0 -1
- package/dist/cli/initRouting.js.map +0 -1
- package/dist/cli/log/logger.js.map +0 -1
- package/dist/cli/main.js.map +0 -1
- package/dist/cli/mcp/content.js.map +0 -1
- package/dist/cli/mcp/dispatch.js.map +0 -1
- package/dist/cli/mcp/stdio.js.map +0 -1
- package/dist/cli/paths.js.map +0 -1
- package/dist/cli/python/knowledge_ingest.js.map +0 -1
- package/dist/cli/python/workspace_analytics.js.map +0 -1
- package/dist/cli/python/workspace_crypto.js.map +0 -1
- package/dist/cli/python/workspace_documents.js.map +0 -1
- package/dist/cli/python/workspace_drive.js.map +0 -1
- package/dist/cli/python/workspace_drive_health.js.map +0 -1
- package/dist/cli/python/workspace_explain.js.map +0 -1
- package/dist/cli/python/workspace_hosts.js.map +0 -1
- package/dist/cli/python/workspace_inbox.js.map +0 -1
- package/dist/cli/python/workspace_render.js.map +0 -1
- package/dist/cli/python/workspace_roles.js.map +0 -1
- package/dist/cli/python/workspace_secrets.js.map +0 -1
- package/dist/cli/python/workspace_sessions.js.map +0 -1
- package/dist/cli/python/workspace_skills.js.map +0 -1
- package/dist/cli/registry.js.map +0 -1
- package/dist/install/agentSwitchDetection.js.map +0 -1
- package/dist/install/agentSwitchProfile.js.map +0 -1
- package/dist/install/atomic.js.map +0 -1
- package/dist/install/claudePathsPlan.js.map +0 -1
- package/dist/install/conflict.js.map +0 -1
- package/dist/install/detect.js.map +0 -1
- package/dist/install/emit_host_rules_cli.js.map +0 -1
- package/dist/install/globalRuleLayers.js.map +0 -1
- package/dist/install/hostLayerFingerprint.js.map +0 -1
- package/dist/install/partitionEligibility.js.map +0 -1
- package/dist/install/paths.js.map +0 -1
- package/dist/install/plan.js.map +0 -1
- package/dist/install/preflight.js.map +0 -1
- package/dist/install/rtkDetection.js.map +0 -1
- package/dist/install/ruleInScope.js.map +0 -1
- package/dist/install/ruleLayerPartition.js.map +0 -1
- package/dist/install/rule_scope.js.map +0 -1
- package/dist/install/rule_scope_cli.js.map +0 -1
- package/dist/install/selectedTools.js.map +0 -1
- package/dist/install/toolDetection.js.map +0 -1
- package/dist/install/txlog.js.map +0 -1
- package/dist/install/types.js.map +0 -1
- package/dist/install/wizard-plan.js.map +0 -1
- package/dist/install/wizardDismissals.js.map +0 -1
- package/dist/scripts/_lib/agent_settings.js.map +0 -1
- package/dist/scripts/_lib/agent_src.js.map +0 -1
- package/dist/scripts/_lib/claude_builtin_names.js.map +0 -1
- package/dist/scripts/_lib/claude_plugin.js.map +0 -1
- package/dist/scripts/_lib/claude_settings_hooks.js.map +0 -1
- package/dist/scripts/_lib/compile_time_toggles.js.map +0 -1
- package/dist/scripts/_lib/environment_detector.js.map +0 -1
- package/dist/scripts/_lib/host_launch.js.map +0 -1
- package/dist/scripts/_lib/install_layout.js.map +0 -1
- package/dist/scripts/_lib/installed_lock.js.map +0 -1
- package/dist/scripts/_lib/lean_projection_mode.js.map +0 -1
- package/dist/scripts/_lib/model_tier.js.map +0 -1
- package/dist/scripts/_lib/prune_empty_dirs.js.map +0 -1
- package/dist/scripts/_lib/scoped_projection.js.map +0 -1
- package/dist/scripts/_lib/script_output.js.map +0 -1
- package/dist/scripts/_lib/spawn_env.js.map +0 -1
- package/dist/scripts/_lib/surface_tiers.js.map +0 -1
- package/dist/scripts/_lib/token_count.js.map +0 -1
- package/dist/scripts/_lib/trigger_eval_floors.js.map +0 -1
- package/dist/scripts/_lib/ui_surface.js.map +0 -1
- package/dist/scripts/_lib/user_global_paths.js.map +0 -1
- package/dist/scripts/ai_council/modes.js.map +0 -1
- package/dist/scripts/ai_council/transport_resolver.js.map +0 -1
- package/dist/scripts/condense.js.map +0 -1
- package/dist/scripts/project_thin_rules.js.map +0 -1
- package/dist/server/app.js.map +0 -1
- package/dist/server/io/atomicMultiWrite.js.map +0 -1
- package/dist/server/io/atomicWrite.js.map +0 -1
- package/dist/server/io/sharedWriteCheck.js.map +0 -1
- package/dist/server/io/substituteTemplate.js.map +0 -1
- package/dist/server/io/yamlIO.js.map +0 -1
- package/dist/server/nicknameResolver.js.map +0 -1
- package/dist/server/port.js.map +0 -1
- package/dist/server/routes/discovery.js.map +0 -1
- package/dist/server/routes/install.js.map +0 -1
- package/dist/server/routes/ping.js.map +0 -1
- package/dist/server/routes/schema.js.map +0 -1
- package/dist/server/routes/settings.js.map +0 -1
- package/dist/server/routes/settingsChanges.js.map +0 -1
- package/dist/server/routes/userMd.js.map +0 -1
- package/dist/server/routes/wizard.js.map +0 -1
- package/dist/server/routes/workspace.js.map +0 -1
- package/dist/server/schemas/settings.js.map +0 -1
- package/dist/server/serverInfo.js.map +0 -1
- package/dist/server/token.js.map +0 -1
- package/dist/server/writeRoot.js.map +0 -1
- package/dist/shared/capabilities.js.map +0 -1
- package/dist/shared/interactiveContext.js.map +0 -1
- package/dist/shared/nicknamePrefill.js.map +0 -1
- package/dist/shared/settingsAsks.js.map +0 -1
- package/dist/shared/settingsCarveOut.js.map +0 -1
- package/dist/shared/settingsClasses.js.map +0 -1
- package/dist/shared/settingsConsent.js.map +0 -1
- package/dist/shared/settingsSurface.js.map +0 -1
- package/dist/shared/skillRanking.js.map +0 -1
- package/dist/shared/userMd/formAdapter.js.map +0 -1
- package/dist/shared/userMd/schema.js.map +0 -1
- package/dist/shared/userMd/utils.js.map +0 -1
- package/dist/ui/assets/index-Cxgy63kz.js +0 -26
- package/dist/ui/assets/index-Cxgy63kz.js.map +0 -1
- package/src/scripts/_lib/adr_frontmatter.test.ts +0 -365
- package/src/scripts/_lib/adversarial_council_gate.test.ts +0 -112
- package/src/scripts/_lib/adversarial_reconcile.test.ts +0 -197
- package/src/scripts/_lib/auto_dispatch.corpus.test.ts +0 -150
- package/src/scripts/_lib/secret_detector.test.ts +0 -108
- package/src/scripts/_lib/secret_detector_adversarial.test.ts +0 -116
- package/src/scripts/_lib/ui_authority.test.ts +0 -251
- package/src/scripts/_lib/untrusted_content.test.ts +0 -175
- package/src/scripts/check_secret_leak.test.ts +0 -90
- package/src/scripts/design_slop_rules.test.ts +0 -246
- package/src/scripts/self_review_gate.test.ts +0 -296
- package/src/shared/capabilities.test.ts +0 -43
|
@@ -0,0 +1,557 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
/**
|
|
3
|
+
* `check_command_examples` — worked examples on the visible command surface.
|
|
4
|
+
*
|
|
5
|
+
* Three sub-checks over the commands a user can actually see
|
|
6
|
+
* (`visibility: visible | advanced` in `command.md` frontmatter):
|
|
7
|
+
*
|
|
8
|
+
* - **(a) presence** — the command carries an `## Examples` section.
|
|
9
|
+
* - **(b) resolvability** — every invocation in that section names THIS command.
|
|
10
|
+
* A rename leaves its examples naming the old slug, and nothing else in the
|
|
11
|
+
* tree notices; this is the check that does. Flags used in an example must
|
|
12
|
+
* also appear in the command body outside the fence, so a removed flag reds.
|
|
13
|
+
* - **(c) pedagogy** — a Why line cites exactly one id from
|
|
14
|
+
* `src/config/discovery/prompt-patterns.yml`.
|
|
15
|
+
*
|
|
16
|
+
* FORWARD-ONLY, and the anchor is in this file rather than in an editable
|
|
17
|
+
* exemption list. `GRANDFATHERED` below is the set of command identities that
|
|
18
|
+
* were non-compliant when the gate was written, frozen per sub-check. A command
|
|
19
|
+
* added, or promoted into `visible`/`advanced`, after that must comply. The
|
|
20
|
+
* existing surface melts down voluntarily — removing an identity from the set
|
|
21
|
+
* is a one-way ratchet the gate itself enforces (see `staleGrandfathers`).
|
|
22
|
+
*
|
|
23
|
+
* WHY NOT EXTEND `lint_examples.ts`. That gate's scope and observable behaviour
|
|
24
|
+
* are compatibility-pinned — its `DEMO_GLOB` is asserted as a constant by its
|
|
25
|
+
* test and its docstring states the quirks are preserved deliberately — and its
|
|
26
|
+
* grammar (`## Demo N` + Wrong/Right/Failure-mode) is a demo-document grammar,
|
|
27
|
+
* not a command grammar. AI council 2/2 (2026-08-24) decided a separate gate
|
|
28
|
+
* that reuses the Why-line LITERALS rather than the code: the two conventions
|
|
29
|
+
* stay textually aligned, the two populations stay uncoupled.
|
|
30
|
+
*
|
|
31
|
+
* Exit codes: 0 = clean, 1 = findings, 2 = dead scope.
|
|
32
|
+
*/
|
|
33
|
+
import * as fs from 'node:fs';
|
|
34
|
+
import * as os from 'node:os';
|
|
35
|
+
import * as path from 'node:path';
|
|
36
|
+
import process from 'node:process';
|
|
37
|
+
import { fileURLToPath } from 'node:url';
|
|
38
|
+
|
|
39
|
+
import { parse as parseYaml } from 'yaml';
|
|
40
|
+
|
|
41
|
+
import { GateLedger } from './_lib/gate_ledger.js';
|
|
42
|
+
import { type SelfTestCase, runGateCli, runSelfTest } from './_lib/gate_self_test.js';
|
|
43
|
+
import { DeadScopeError, reportScanned } from './_lib/scan_scope.js';
|
|
44
|
+
|
|
45
|
+
const HERE = fileURLToPath(import.meta.url);
|
|
46
|
+
const REAL_REPO_ROOT = path.resolve(path.dirname(HERE), '..', '..');
|
|
47
|
+
/**
|
|
48
|
+
* Scan root. The env override exists for `--self-test`, which drives the REAL
|
|
49
|
+
* CLI against a synthetic tree — an in-process call would skip the argv parsing
|
|
50
|
+
* and the entry guard, the two layers that have silently no-opped here before.
|
|
51
|
+
*/
|
|
52
|
+
const DEFAULT_ROOT = process.env['CHECK_COMMAND_EXAMPLES_ROOT'] ?? REAL_REPO_ROOT;
|
|
53
|
+
export const COMMAND_ROOT = 'src/domains';
|
|
54
|
+
export const VOCAB_FILE = 'src/config/discovery/prompt-patterns.yml';
|
|
55
|
+
|
|
56
|
+
/** The two visibility values that make a command part of the user-facing surface. */
|
|
57
|
+
export const IN_SCOPE_VISIBILITY = ['visible', 'advanced'] as const;
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Command identities non-compliant at the 2026-08-24 baseline, per sub-check.
|
|
61
|
+
*
|
|
62
|
+
* Measured, not estimated. The roadmap step pre-registered "4 of 61 top-level
|
|
63
|
+
* commands"; both halves were wrong. The classifier is `visibility` (the integer
|
|
64
|
+
* `tier:` alias was removed from `command.schema.json`), the in-scope population
|
|
65
|
+
* is 23 — `visible` 5 + `advanced` 18 — and 5 of those carry an `## Examples`
|
|
66
|
+
* heading. So 18 fail (a).
|
|
67
|
+
*
|
|
68
|
+
* (c) is the number that surprises: of the 5 sections that exist, ZERO carry a
|
|
69
|
+
* Why line. Every one is a bare fence of invocations. So the convention this
|
|
70
|
+
* gate enforces is satisfied in full by no command in the tree today, and
|
|
71
|
+
* grandfathering (c) for all 5 is what keeps the gate forward-only rather than
|
|
72
|
+
* a 23-finding wall on the PR that introduces it.
|
|
73
|
+
*/
|
|
74
|
+
export const GRANDFATHERED = {
|
|
75
|
+
/** No `## Examples` section at the baseline. */
|
|
76
|
+
presence: [
|
|
77
|
+
'agents',
|
|
78
|
+
'analyze',
|
|
79
|
+
'condense',
|
|
80
|
+
'council',
|
|
81
|
+
'feature',
|
|
82
|
+
'fix',
|
|
83
|
+
'git-commit',
|
|
84
|
+
'git-pr-create',
|
|
85
|
+
'git-pr-merge',
|
|
86
|
+
'jira-ticket',
|
|
87
|
+
'judge',
|
|
88
|
+
'memory',
|
|
89
|
+
'mode',
|
|
90
|
+
'optimize',
|
|
91
|
+
'review',
|
|
92
|
+
'roadmap',
|
|
93
|
+
'agent-handoff',
|
|
94
|
+
'agent-status',
|
|
95
|
+
] as readonly string[],
|
|
96
|
+
/** Has a section, no Why line at the baseline. */
|
|
97
|
+
whyLine: [
|
|
98
|
+
'estimate-ticket',
|
|
99
|
+
'implement-ticket',
|
|
100
|
+
'mission-upgrade',
|
|
101
|
+
'refine-ticket',
|
|
102
|
+
'work',
|
|
103
|
+
] as readonly string[],
|
|
104
|
+
} as const;
|
|
105
|
+
|
|
106
|
+
export interface CommandRecord {
|
|
107
|
+
/** `name:` frontmatter — the identity used by the grandfather set. */
|
|
108
|
+
name: string;
|
|
109
|
+
visibility: string;
|
|
110
|
+
file: string;
|
|
111
|
+
body: string;
|
|
112
|
+
/** The `## Examples` section text, or null when absent. */
|
|
113
|
+
examples: string | null;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
export interface Finding {
|
|
117
|
+
name: string;
|
|
118
|
+
file: string;
|
|
119
|
+
check: 'presence' | 'resolvable' | 'why-line' | 'stale-grandfather';
|
|
120
|
+
message: string;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/** The approved pattern ids and the two Why-line literals. */
|
|
124
|
+
export function readVocabulary(root = DEFAULT_ROOT): {
|
|
125
|
+
patterns: string[];
|
|
126
|
+
literals: string[];
|
|
127
|
+
} {
|
|
128
|
+
const abs = path.join(root, VOCAB_FILE);
|
|
129
|
+
const doc = parseYaml(fs.readFileSync(abs, 'utf-8')) as {
|
|
130
|
+
approved_patterns?: unknown;
|
|
131
|
+
why_line_literals?: unknown;
|
|
132
|
+
};
|
|
133
|
+
const patterns = Array.isArray(doc.approved_patterns) ? doc.approved_patterns.map(String) : [];
|
|
134
|
+
const literals = Array.isArray(doc.why_line_literals) ? doc.why_line_literals.map(String) : [];
|
|
135
|
+
if (patterns.length === 0 || literals.length === 0) {
|
|
136
|
+
throw new DeadScopeError(
|
|
137
|
+
'check_command_examples',
|
|
138
|
+
`${VOCAB_FILE} carries no approved_patterns or no why_line_literals — ` +
|
|
139
|
+
'the vocabulary is the gate\'s corpus and an empty one checks nothing',
|
|
140
|
+
);
|
|
141
|
+
}
|
|
142
|
+
return { patterns, literals };
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
function frontmatter(text: string): string {
|
|
146
|
+
const m = /^---\n([\s\S]*?)\n---\n/.exec(text);
|
|
147
|
+
return m ? m[1]! : '';
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
function fmValue(fm: string, key: string): string | null {
|
|
151
|
+
const m = new RegExp(`^${key}:\\s*(.+)$`, 'm').exec(fm);
|
|
152
|
+
return m ? m[1]!.trim().replace(/^["']|["']$/g, '') : null;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/** The `## Examples` section body, up to the next same-or-higher heading. */
|
|
156
|
+
export function extractExamples(text: string): string | null {
|
|
157
|
+
const m = /^(#{2,})\s*Examples\b.*$/m.exec(text);
|
|
158
|
+
if (!m) return null;
|
|
159
|
+
const level = m[1]!.length;
|
|
160
|
+
const start = m.index + m[0].length;
|
|
161
|
+
const rest = text.slice(start);
|
|
162
|
+
const next = new RegExp(`^#{1,${level}}\\s`, 'm').exec(rest);
|
|
163
|
+
return next ? rest.slice(0, next.index) : rest;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/** Walk the command corpus and read what the three checks need. */
|
|
167
|
+
export function collectCommands(root = DEFAULT_ROOT): CommandRecord[] {
|
|
168
|
+
const base = path.join(root, COMMAND_ROOT);
|
|
169
|
+
const out: CommandRecord[] = [];
|
|
170
|
+
const walk = (dir: string): void => {
|
|
171
|
+
let entries: fs.Dirent[];
|
|
172
|
+
try {
|
|
173
|
+
entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
174
|
+
} catch {
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
for (const e of entries.sort((a, b) => a.name.localeCompare(b.name))) {
|
|
178
|
+
const p = path.join(dir, e.name);
|
|
179
|
+
if (e.isDirectory()) {
|
|
180
|
+
walk(p);
|
|
181
|
+
} else if (e.name === 'command.md') {
|
|
182
|
+
const text = fs.readFileSync(p, 'utf-8');
|
|
183
|
+
const fm = frontmatter(text);
|
|
184
|
+
const visibility = fmValue(fm, 'visibility') ?? 'internal';
|
|
185
|
+
if (!(IN_SCOPE_VISIBILITY as readonly string[]).includes(visibility)) continue;
|
|
186
|
+
const name = fmValue(fm, 'name');
|
|
187
|
+
if (!name) continue;
|
|
188
|
+
out.push({
|
|
189
|
+
name,
|
|
190
|
+
visibility,
|
|
191
|
+
file: path.relative(root, p),
|
|
192
|
+
body: text,
|
|
193
|
+
examples: extractExamples(text),
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
};
|
|
198
|
+
walk(base);
|
|
199
|
+
return out;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
/** Invocation lines inside the section — the ones a reader would type. */
|
|
203
|
+
export function invocations(section: string): string[] {
|
|
204
|
+
return section
|
|
205
|
+
.split('\n')
|
|
206
|
+
.map((l) => l.trim())
|
|
207
|
+
.filter((l) => l.startsWith('/'))
|
|
208
|
+
.map((l) => l.replace(/\s+#.*$/, '').trim());
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* Does this invocation name the command it sits in?
|
|
213
|
+
*
|
|
214
|
+
* A command's slash form renders three ways across hosts — `/a-b-c`, `/a:b:c`,
|
|
215
|
+
* `/a b c` — and the tree uses all three (`/mission:upgrade` for
|
|
216
|
+
* `mission-upgrade`, `/challenge-me vision` for a nested one). So the leading
|
|
217
|
+
* token run is normalized on `:` and space to `-` and compared to `name`,
|
|
218
|
+
* longest prefix first. An ALIAS that is not the `name:` is deliberately NOT
|
|
219
|
+
* accepted: `/pr:create` does not resolve to `git-pr-create`, and a command
|
|
220
|
+
* that genuinely ships an alias declares it (`replaces:`) rather than having
|
|
221
|
+
* the gate guess.
|
|
222
|
+
*/
|
|
223
|
+
export function invocationResolves(line: string, name: string): boolean {
|
|
224
|
+
const tokens = line.replace(/^\//, '').split(/\s+/).filter(Boolean);
|
|
225
|
+
const segments = name.split('-').length;
|
|
226
|
+
for (let k = Math.min(tokens.length, segments); k >= 1; k--) {
|
|
227
|
+
const candidate = tokens
|
|
228
|
+
.slice(0, k)
|
|
229
|
+
.join('-')
|
|
230
|
+
.replace(/:/g, '-');
|
|
231
|
+
if (candidate === name) return true;
|
|
232
|
+
}
|
|
233
|
+
return false;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
/** Long flags used in the examples (`--personas=+qa` → `--personas`). */
|
|
237
|
+
export function flagsUsed(section: string): string[] {
|
|
238
|
+
const found = new Set<string>();
|
|
239
|
+
for (const m of section.matchAll(/(--[a-z][a-z0-9-]*)/g)) found.add(m[1]!);
|
|
240
|
+
return [...found].sort();
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
export function checkCommand(
|
|
244
|
+
cmd: CommandRecord,
|
|
245
|
+
vocab: { patterns: string[]; literals: string[] },
|
|
246
|
+
): Finding[] {
|
|
247
|
+
const out: Finding[] = [];
|
|
248
|
+
const grandPresence = GRANDFATHERED.presence.includes(cmd.name);
|
|
249
|
+
const grandWhy = GRANDFATHERED.whyLine.includes(cmd.name);
|
|
250
|
+
|
|
251
|
+
if (cmd.examples === null) {
|
|
252
|
+
if (!grandPresence) {
|
|
253
|
+
out.push({
|
|
254
|
+
name: cmd.name,
|
|
255
|
+
file: cmd.file,
|
|
256
|
+
check: 'presence',
|
|
257
|
+
message:
|
|
258
|
+
`visibility: ${cmd.visibility} but no '## Examples' section. ` +
|
|
259
|
+
'A user-facing command shows 1-3 filled invocations.',
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
return out;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
// (a) inverse: the grandfather entry is stale once the command complies.
|
|
266
|
+
if (grandPresence) {
|
|
267
|
+
out.push({
|
|
268
|
+
name: cmd.name,
|
|
269
|
+
file: cmd.file,
|
|
270
|
+
check: 'stale-grandfather',
|
|
271
|
+
message:
|
|
272
|
+
"now has an '## Examples' section — remove it from " +
|
|
273
|
+
'GRANDFATHERED.presence in check_command_examples.ts. The set only shrinks.',
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
// (b) resolvability.
|
|
278
|
+
const invs = invocations(cmd.examples);
|
|
279
|
+
if (invs.length === 0) {
|
|
280
|
+
out.push({
|
|
281
|
+
name: cmd.name,
|
|
282
|
+
file: cmd.file,
|
|
283
|
+
check: 'resolvable',
|
|
284
|
+
message: "'## Examples' section carries no invocation line starting with '/'",
|
|
285
|
+
});
|
|
286
|
+
}
|
|
287
|
+
for (const line of invs) {
|
|
288
|
+
if (!invocationResolves(line, cmd.name)) {
|
|
289
|
+
out.push({
|
|
290
|
+
name: cmd.name,
|
|
291
|
+
file: cmd.file,
|
|
292
|
+
check: 'resolvable',
|
|
293
|
+
message: `example '${line}' does not resolve to '${cmd.name}' — renamed command, or a typo`,
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
const bodyOutsideExamples = cmd.body.replace(cmd.examples, '');
|
|
298
|
+
for (const flag of flagsUsed(cmd.examples)) {
|
|
299
|
+
if (!bodyOutsideExamples.includes(flag)) {
|
|
300
|
+
out.push({
|
|
301
|
+
name: cmd.name,
|
|
302
|
+
file: cmd.file,
|
|
303
|
+
check: 'resolvable',
|
|
304
|
+
message: `example uses '${flag}' but the body never documents it — removed flag, or a typo`,
|
|
305
|
+
});
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
// (c) pedagogy.
|
|
310
|
+
const hasLiteral = vocab.literals.some((l) => cmd.examples!.includes(l));
|
|
311
|
+
if (!hasLiteral) {
|
|
312
|
+
if (!grandWhy) {
|
|
313
|
+
out.push({
|
|
314
|
+
name: cmd.name,
|
|
315
|
+
file: cmd.file,
|
|
316
|
+
check: 'why-line',
|
|
317
|
+
message:
|
|
318
|
+
`no Why line (${vocab.literals.join(' or ')}) in '## Examples'. ` +
|
|
319
|
+
'The Why line is what transfers to a command the reader has not seen.',
|
|
320
|
+
});
|
|
321
|
+
}
|
|
322
|
+
} else {
|
|
323
|
+
if (grandWhy) {
|
|
324
|
+
out.push({
|
|
325
|
+
name: cmd.name,
|
|
326
|
+
file: cmd.file,
|
|
327
|
+
check: 'stale-grandfather',
|
|
328
|
+
message:
|
|
329
|
+
'now carries a Why line — remove it from GRANDFATHERED.whyLine in ' +
|
|
330
|
+
'check_command_examples.ts. The set only shrinks.',
|
|
331
|
+
});
|
|
332
|
+
}
|
|
333
|
+
const cited = vocab.patterns.filter((p) => new RegExp(`\\b${p}\\b`).test(cmd.examples!));
|
|
334
|
+
if (cited.length === 0) {
|
|
335
|
+
out.push({
|
|
336
|
+
name: cmd.name,
|
|
337
|
+
file: cmd.file,
|
|
338
|
+
check: 'why-line',
|
|
339
|
+
message:
|
|
340
|
+
`Why line cites no registered pattern id. Pick one of: ${vocab.patterns.join(', ')} (${VOCAB_FILE}).`,
|
|
341
|
+
});
|
|
342
|
+
} else if (cited.length > 1) {
|
|
343
|
+
out.push({
|
|
344
|
+
name: cmd.name,
|
|
345
|
+
file: cmd.file,
|
|
346
|
+
check: 'why-line',
|
|
347
|
+
message: `Why line cites ${cited.length} pattern ids (${cited.join(', ')}) — cite exactly one.`,
|
|
348
|
+
});
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
return out;
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
/**
|
|
355
|
+
* Grandfather entries naming a command that no longer exists or is no longer
|
|
356
|
+
* in scope. Left in place they would hide a NEW command that happens to reuse
|
|
357
|
+
* the name — the exemption-list failure mode the council named.
|
|
358
|
+
*/
|
|
359
|
+
export function staleGrandfathers(cmds: CommandRecord[]): Finding[] {
|
|
360
|
+
const live = new Set(cmds.map((c) => c.name));
|
|
361
|
+
const out: Finding[] = [];
|
|
362
|
+
for (const [bucket, names] of Object.entries(GRANDFATHERED)) {
|
|
363
|
+
for (const n of names) {
|
|
364
|
+
if (!live.has(n)) {
|
|
365
|
+
out.push({
|
|
366
|
+
name: n,
|
|
367
|
+
file: `src/scripts/check_command_examples.ts (GRANDFATHERED.${bucket})`,
|
|
368
|
+
check: 'stale-grandfather',
|
|
369
|
+
message:
|
|
370
|
+
'grandfathered but no longer an in-scope command — deleted, renamed, ' +
|
|
371
|
+
'or demoted to internal. Remove the entry.',
|
|
372
|
+
});
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
return out;
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
export function evaluate(
|
|
380
|
+
root = DEFAULT_ROOT,
|
|
381
|
+
): { findings: Finding[]; scanned: number; ledger: GateLedger } {
|
|
382
|
+
const vocab = readVocabulary(root);
|
|
383
|
+
const cmds = collectCommands(root);
|
|
384
|
+
const findings = [...staleGrandfathers(cmds)];
|
|
385
|
+
// Per-target accounting: "clean" and "read almost nothing" must not print
|
|
386
|
+
// the same line. Every in-scope command is planned and reaches exactly one
|
|
387
|
+
// outcome, so the denominator is the corpus rather than whatever the walk
|
|
388
|
+
// happened to reach.
|
|
389
|
+
const ledger = new GateLedger('check_command_examples');
|
|
390
|
+
ledger.plan(cmds.map((c) => c.file));
|
|
391
|
+
for (const c of cmds) {
|
|
392
|
+
const own = checkCommand(c, vocab);
|
|
393
|
+
findings.push(...own);
|
|
394
|
+
if (own.length === 0) {
|
|
395
|
+
ledger.complete(c.file);
|
|
396
|
+
} else {
|
|
397
|
+
ledger.fail(c.file, own.map((f) => `[${f.check}] ${f.message}`).join(' · '));
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
return { findings, scanned: cmds.length, ledger };
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
/**
|
|
404
|
+
* A synthetic corpus that is compliant BY CONSTRUCTION, then broken one way per
|
|
405
|
+
* case.
|
|
406
|
+
*
|
|
407
|
+
* The fixture stubs every grandfathered identity, because `staleGrandfathers` is
|
|
408
|
+
* a real check and a corpus missing all 23 would red every case including the
|
|
409
|
+
* accept one — which would make the suite prove nothing about the check under
|
|
410
|
+
* test. A realistic corpus is the only fixture that isolates one variable.
|
|
411
|
+
*/
|
|
412
|
+
function selfTestRoot(tmp: string, extra: { name: string; body: string } | null): string {
|
|
413
|
+
const root = fs.mkdtempSync(path.join(tmp, 'repo-'));
|
|
414
|
+
fs.mkdirSync(path.join(root, path.dirname(VOCAB_FILE)), { recursive: true });
|
|
415
|
+
fs.copyFileSync(path.join(REAL_REPO_ROOT, VOCAB_FILE), path.join(root, VOCAB_FILE));
|
|
416
|
+
const write = (name: string, body: string): void => {
|
|
417
|
+
const dir = path.join(root, COMMAND_ROOT, 'selftest', name);
|
|
418
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
419
|
+
fs.writeFileSync(
|
|
420
|
+
path.join(dir, 'command.md'),
|
|
421
|
+
`---\nname: ${name}\ndescription: fixture\ndisable-model-invocation: true\n` +
|
|
422
|
+
`visibility: visible\n---\n\n# ${name}\n\n${body}\n`,
|
|
423
|
+
);
|
|
424
|
+
};
|
|
425
|
+
for (const n of GRANDFATHERED.presence) write(n, 'No examples — grandfathered on (a).');
|
|
426
|
+
for (const n of GRANDFATHERED.whyLine) {
|
|
427
|
+
write(n, `## Examples\n\n\`\`\`\n/${n} something\n\`\`\`\n`);
|
|
428
|
+
}
|
|
429
|
+
if (extra) write(extra.name, extra.body);
|
|
430
|
+
return root;
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
const GOOD_BODY = [
|
|
434
|
+
'Documented flag: `--deep`.',
|
|
435
|
+
'',
|
|
436
|
+
'## Examples',
|
|
437
|
+
'',
|
|
438
|
+
'```',
|
|
439
|
+
'/selftest-probe tests/feature/auth --deep',
|
|
440
|
+
'```',
|
|
441
|
+
'',
|
|
442
|
+
'**Why it works:** measurable-target — it names the file, not the symptom.',
|
|
443
|
+
].join('\n');
|
|
444
|
+
|
|
445
|
+
export function selfTest(): number {
|
|
446
|
+
const tmp = fs.mkdtempSync(path.join(os.tmpdir(), 'cce-selftest-'));
|
|
447
|
+
const run = (root: string): number => {
|
|
448
|
+
process.env['CHECK_COMMAND_EXAMPLES_ROOT'] = root;
|
|
449
|
+
try {
|
|
450
|
+
return runGateCli(REAL_REPO_ROOT, 'src/scripts/check_command_examples.ts', ['--quiet'], root);
|
|
451
|
+
} finally {
|
|
452
|
+
delete process.env['CHECK_COMMAND_EXAMPLES_ROOT'];
|
|
453
|
+
}
|
|
454
|
+
};
|
|
455
|
+
const probe = (body: string): number => run(selfTestRoot(tmp, { name: 'selftest-probe', body }));
|
|
456
|
+
const cases: SelfTestCase[] = [
|
|
457
|
+
{
|
|
458
|
+
name: 'a compliant new command is accepted',
|
|
459
|
+
expect: 'accept',
|
|
460
|
+
run: () => probe(GOOD_BODY),
|
|
461
|
+
},
|
|
462
|
+
{
|
|
463
|
+
name: 'the grandfathered corpus alone is accepted — forward-only, not a wall',
|
|
464
|
+
expect: 'accept',
|
|
465
|
+
run: () => run(selfTestRoot(tmp, null)),
|
|
466
|
+
},
|
|
467
|
+
{
|
|
468
|
+
name: '(a) a new visible command with no Examples section is rejected',
|
|
469
|
+
expect: 'reject',
|
|
470
|
+
run: () => probe('Just prose, no examples.'),
|
|
471
|
+
},
|
|
472
|
+
{
|
|
473
|
+
name: '(b) an invocation naming a different slug is rejected',
|
|
474
|
+
expect: 'reject',
|
|
475
|
+
run: () => probe(GOOD_BODY.replace('/selftest-probe', '/renamed-away')),
|
|
476
|
+
},
|
|
477
|
+
{
|
|
478
|
+
name: '(b) a flag used in an example but undocumented in the body is rejected',
|
|
479
|
+
expect: 'reject',
|
|
480
|
+
run: () => probe(GOOD_BODY.replace('Documented flag: `--deep`.', '')),
|
|
481
|
+
},
|
|
482
|
+
{
|
|
483
|
+
name: '(c) an Examples section with no Why line is rejected',
|
|
484
|
+
expect: 'reject',
|
|
485
|
+
run: () =>
|
|
486
|
+
probe(
|
|
487
|
+
GOOD_BODY.replace(
|
|
488
|
+
'**Why it works:** measurable-target — it names the file, not the symptom.',
|
|
489
|
+
'',
|
|
490
|
+
),
|
|
491
|
+
),
|
|
492
|
+
},
|
|
493
|
+
{
|
|
494
|
+
name: '(c) an unregistered pattern id is rejected',
|
|
495
|
+
expect: 'reject',
|
|
496
|
+
run: () => probe(GOOD_BODY.replace('measurable-target', 'be-nice-to-the-model')),
|
|
497
|
+
},
|
|
498
|
+
{
|
|
499
|
+
name: 'a dead scan root exits non-zero rather than reporting clean',
|
|
500
|
+
expect: 'reject',
|
|
501
|
+
run: () => {
|
|
502
|
+
const root = selfTestRoot(tmp, { name: 'selftest-probe', body: GOOD_BODY });
|
|
503
|
+
fs.writeFileSync(path.join(root, VOCAB_FILE), 'approved_patterns: []\n');
|
|
504
|
+
return run(root);
|
|
505
|
+
},
|
|
506
|
+
},
|
|
507
|
+
];
|
|
508
|
+
try {
|
|
509
|
+
return runSelfTest({
|
|
510
|
+
gate: 'check_command_examples',
|
|
511
|
+
cases,
|
|
512
|
+
minCases: 8,
|
|
513
|
+
minRejectCases: 6,
|
|
514
|
+
});
|
|
515
|
+
} finally {
|
|
516
|
+
fs.rmSync(tmp, { recursive: true, force: true });
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
export function main(argv: string[] = process.argv.slice(2), root = DEFAULT_ROOT): number {
|
|
521
|
+
if (argv.includes('--self-test')) return selfTest();
|
|
522
|
+
const quiet = argv.includes('--quiet');
|
|
523
|
+
let result: { findings: Finding[]; scanned: number; ledger: GateLedger };
|
|
524
|
+
try {
|
|
525
|
+
result = evaluate(root);
|
|
526
|
+
reportScanned({
|
|
527
|
+
gate: 'check_command_examples',
|
|
528
|
+
scanned: result.scanned,
|
|
529
|
+
units: 'visible/advanced command(s)',
|
|
530
|
+
roots: [COMMAND_ROOT],
|
|
531
|
+
});
|
|
532
|
+
result.ledger.report(quiet ? () => undefined : process.stdout.write.bind(process.stdout));
|
|
533
|
+
} catch (e) {
|
|
534
|
+
if (e instanceof DeadScopeError) {
|
|
535
|
+
process.stderr.write(`❌ ${e.message}\n`);
|
|
536
|
+
return 2;
|
|
537
|
+
}
|
|
538
|
+
throw e;
|
|
539
|
+
}
|
|
540
|
+
if (result.findings.length === 0) {
|
|
541
|
+
if (!quiet) {
|
|
542
|
+
process.stdout.write(
|
|
543
|
+
`✅ ${result.scanned} visible/advanced command(s): examples present, resolvable, and cited.\n`,
|
|
544
|
+
);
|
|
545
|
+
}
|
|
546
|
+
return 0;
|
|
547
|
+
}
|
|
548
|
+
for (const f of result.findings) {
|
|
549
|
+
process.stderr.write(`❌ ${f.file} [${f.check}] ${f.name}: ${f.message}\n`);
|
|
550
|
+
}
|
|
551
|
+
process.stderr.write(`\n${result.findings.length} finding(s).\n`);
|
|
552
|
+
return 1;
|
|
553
|
+
}
|
|
554
|
+
|
|
555
|
+
if (path.resolve(process.argv[1] ?? '') === path.resolve(HERE)) {
|
|
556
|
+
process.exit(main());
|
|
557
|
+
}
|
|
@@ -42,6 +42,7 @@ import * as path from 'node:path';
|
|
|
42
42
|
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
43
43
|
|
|
44
44
|
import { runGateCli, runSelfTest, type SelfTestCase } from './_lib/gate_self_test.js';
|
|
45
|
+
import { GateLedger } from './_lib/gate_ledger.js';
|
|
45
46
|
import { DeadScopeError, reportScanned } from './_lib/scan_scope.js';
|
|
46
47
|
|
|
47
48
|
const _HERE = fileURLToPath(import.meta.url);
|
|
@@ -292,6 +293,40 @@ function main(argv?: readonly string[]): number {
|
|
|
292
293
|
return 1;
|
|
293
294
|
}
|
|
294
295
|
const { readings, malformed } = parseStore(text);
|
|
296
|
+
|
|
297
|
+
// Per-line accounting. `malformed` is a COUNT, and a count cannot say WHICH
|
|
298
|
+
// lines were dropped — a store whose last 40 appends were malformed reads
|
|
299
|
+
// the same as one with 40 fewer readings, which is the "looked at almost
|
|
300
|
+
// nothing" case. The ledger names each dropped line.
|
|
301
|
+
const ledger = new GateLedger('check_composite_arming');
|
|
302
|
+
const storeLines = text.split('\n').map((l, i) => ({ n: i + 1, t: l.trim() })).filter((l) => l.t !== '');
|
|
303
|
+
ledger.plan(storeLines.map((l) => `line:${String(l.n)}`));
|
|
304
|
+
let parsedSeen = 0;
|
|
305
|
+
for (const l of storeLines) {
|
|
306
|
+
let ok = false;
|
|
307
|
+
try {
|
|
308
|
+
const o = JSON.parse(l.t) as { session?: unknown };
|
|
309
|
+
ok = typeof o.session === 'string' && 'composite_ms' in (o as object);
|
|
310
|
+
} catch {
|
|
311
|
+
ok = false;
|
|
312
|
+
}
|
|
313
|
+
if (ok) {
|
|
314
|
+
parsedSeen += 1;
|
|
315
|
+
ledger.complete(`line:${String(l.n)}`);
|
|
316
|
+
} else {
|
|
317
|
+
ledger.skip(`line:${String(l.n)}`, 'precondition_unmet');
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
ledger.report();
|
|
321
|
+
/* c8 ignore next 6 */
|
|
322
|
+
if (parsedSeen !== readings.length) {
|
|
323
|
+
process.stderr.write(
|
|
324
|
+
`❌ check_composite_arming: ledger counted ${String(parsedSeen)} parseable line(s) but ` +
|
|
325
|
+
`parseStore returned ${String(readings.length)} reading(s) — the accounting and the ` +
|
|
326
|
+
'parser disagree, which means one of them is wrong about what was read.\n',
|
|
327
|
+
);
|
|
328
|
+
return 2;
|
|
329
|
+
}
|
|
295
330
|
if (malformed > 0 && readings.length === 0) {
|
|
296
331
|
process.stderr.write(
|
|
297
332
|
`❌ ${path.relative(REPO_ROOT, store)}: ${String(malformed)} malformed line(s) and no usable ` +
|