@event4u/agent-config 14.10.0 → 14.12.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 +161 -208
- package/README.md +1 -1
- package/dist/agent-src/commands/design.md +88 -0
- package/dist/agent-src/commands/project/analyze.md +47 -0
- package/dist/agent-src/commands/review/changes.md +67 -6
- package/dist/agent-src/commands/roadmap/create.md +49 -0
- package/dist/agent-src/commands/roadmap/next.md +27 -11
- package/dist/agent-src/commands/roadmap/process-full.md +14 -0
- package/dist/agent-src/commands/video/from-script.md +60 -3
- package/dist/agent-src/commands/video/stitch.md +14 -0
- package/dist/agent-src/contexts/communication/rules-auto/guidelines-mechanics.md +1 -0
- package/dist/agent-src/contexts/execution/evidence-discipline.md +26 -0
- package/dist/agent-src/contexts/execution/roadmap-process-loop.md +154 -2
- package/dist/agent-src/rules/active-remediation.md +3 -3
- package/dist/agent-src/rules/code-provenance.md +2 -2
- package/dist/agent-src/rules/context-hygiene.md +13 -33
- package/dist/agent-src/rules/council-availability.md +2 -2
- package/dist/agent-src/rules/decision-revisit-gate.md +3 -1
- package/dist/agent-src/rules/design-fidelity.md +18 -0
- package/dist/agent-src/rules/design-review-after-ui-write.md +2 -2
- package/dist/agent-src/rules/evaluator-independence.md +56 -44
- package/dist/agent-src/rules/fix-what-you-see.md +9 -1
- package/dist/agent-src/rules/framework-neutrality-in-generic-skills.md +1 -1
- package/dist/agent-src/rules/minimal-safe-diff.md +14 -20
- package/dist/agent-src/rules/missing-skill-recovery.md +13 -1
- package/dist/agent-src/rules/playbook-precedence.md +105 -0
- package/dist/agent-src/rules/recurring-criticism.md +3 -1
- package/dist/agent-src/rules/roadmap-progress-sync.md +14 -13
- package/dist/agent-src/rules/scale-discipline.md +24 -0
- package/dist/agent-src/rules/security-sensitive-stop.md +2 -2
- package/dist/agent-src/rules/settings-ask-protocol.md +2 -2
- package/dist/agent-src/rules/ui-audit-gate.md +27 -15
- package/dist/agent-src/rules/untrusted-input-defense.md +2 -2
- package/dist/agent-src/skills/accessibility-auditor/SKILL.md +19 -0
- package/dist/agent-src/skills/adr-create/SKILL.md +7 -0
- package/dist/agent-src/skills/agents-md-thin-root/SKILL.md +33 -0
- package/dist/agent-src/skills/ai-council/references/advanced-modes.md +17 -3
- package/dist/agent-src/skills/ai-council/references/output-and-synthesis.md +31 -0
- package/dist/agent-src/skills/ai-council/references/procedure.md +19 -0
- package/dist/agent-src/skills/alerting-doctrine/SKILL.md +225 -0
- package/dist/agent-src/skills/authz-review/SKILL.md +0 -1
- package/dist/agent-src/skills/blast-radius-analyzer/SKILL.md +32 -0
- package/dist/agent-src/skills/brand/SKILL.md +3 -0
- package/dist/agent-src/skills/brand-asset-generation/SKILL.md +3 -0
- package/dist/agent-src/skills/brand-audit/SKILL.md +3 -0
- package/dist/agent-src/skills/brand-identity/SKILL.md +3 -0
- package/dist/agent-src/skills/brand-strategy/SKILL.md +3 -0
- package/dist/agent-src/skills/brand-to-tokens/SKILL.md +3 -0
- package/dist/agent-src/skills/check-refs/SKILL.md +3 -0
- package/dist/agent-src/skills/code-refactoring/SKILL.md +45 -1
- package/dist/agent-src/skills/code-review/SKILL.md +75 -5
- package/dist/agent-src/skills/command-routing/SKILL.md +6 -0
- package/dist/agent-src/skills/command-writing/SKILL.md +35 -0
- package/dist/agent-src/skills/condense-memory/SKILL.md +3 -0
- package/dist/agent-src/skills/context-authoring/SKILL.md +1 -1
- package/dist/agent-src/skills/conventional-commits-writing/SKILL.md +3 -0
- package/dist/agent-src/skills/copilot-agents-optimization/SKILL.md +10 -0
- package/dist/agent-src/skills/corpus-grounding/SKILL.md +3 -0
- package/dist/agent-src/skills/design-intelligence/SKILL.md +3 -0
- package/dist/agent-src/skills/design-intelligence/data/landing.csv +36 -35
- package/dist/agent-src/skills/design-intelligence/data/stacks/threejs.csv +1 -0
- package/dist/agent-src/skills/design-review/SKILL.md +79 -1
- package/dist/agent-src/skills/design-review/references/verification-automation.md +41 -0
- package/dist/agent-src/skills/design-system-capture/SKILL.md +35 -40
- package/dist/agent-src/skills/design-system-capture/references/import-procedure.md +50 -0
- package/dist/agent-src/skills/design-tokens/SKILL.md +3 -0
- package/dist/agent-src/skills/design-variations/SKILL.md +3 -0
- package/dist/agent-src/skills/developer-like-execution/SKILL.md +3 -0
- package/dist/agent-src/skills/estimate-ticket/SKILL.md +3 -0
- package/dist/agent-src/skills/existing-ui-audit/SKILL.md +28 -4
- package/dist/agent-src/skills/fe-design/SKILL.md +74 -41
- package/dist/agent-src/skills/fe-design/references/craft-floor.md +52 -0
- package/dist/agent-src/skills/fe-design/references/source-led-port.md +36 -0
- package/dist/agent-src/skills/file-editor/SKILL.md +5 -0
- package/dist/agent-src/skills/finishing-a-development-branch/SKILL.md +2 -2
- package/dist/agent-src/skills/git-workflow/SKILL.md +3 -0
- package/dist/agent-src/skills/html-deck/SKILL.md +3 -0
- package/dist/agent-src/skills/iconography/SKILL.md +3 -0
- package/dist/agent-src/skills/image-editing/SKILL.md +3 -0
- package/dist/agent-src/skills/image-generation/SKILL.md +3 -0
- package/dist/agent-src/skills/image-provider-routing/SKILL.md +3 -0
- package/dist/agent-src/skills/incident-commander/SKILL.md +10 -0
- package/dist/agent-src/skills/js-library-packaging/SKILL.md +173 -0
- package/dist/agent-src/skills/js-library-packaging/scripts/check_package_surface.ts +270 -0
- package/dist/agent-src/skills/laravel-migration/SKILL.md +3 -0
- package/dist/agent-src/skills/learning-to-rule-or-skill/SKILL.md +3 -0
- package/dist/agent-src/skills/lint-skills/SKILL.md +3 -0
- package/dist/agent-src/skills/llm-provider-knowledge/SKILL.md +3 -0
- package/dist/agent-src/skills/logging-monitoring/SKILL.md +234 -51
- package/dist/agent-src/skills/logo-generation/SKILL.md +3 -0
- package/dist/agent-src/skills/md-language-check/SKILL.md +3 -0
- package/dist/agent-src/skills/monorepo-workspace/SKILL.md +149 -0
- package/dist/agent-src/skills/motion-choreographer/SKILL.md +6 -0
- package/dist/agent-src/skills/multi-tenancy/SKILL.md +4 -0
- package/dist/agent-src/skills/operational-readiness/SKILL.md +184 -0
- package/dist/agent-src/skills/override-management/SKILL.md +3 -0
- package/dist/agent-src/skills/persona-improvement/SKILL.md +3 -0
- package/dist/agent-src/skills/pest-testing/SKILL.md +3 -0
- package/dist/agent-src/skills/playbook-authoring/SKILL.md +162 -0
- package/dist/agent-src/skills/playwright-testing/SKILL.md +3 -0
- package/dist/agent-src/skills/privacy-review/SKILL.md +3 -0
- package/dist/agent-src/skills/project-analysis-core/SKILL.md +23 -0
- package/dist/agent-src/skills/prompt-engineering-image/SKILL.md +3 -0
- package/dist/agent-src/skills/quality-tools/SKILL.md +5 -0
- package/dist/agent-src/skills/react-shadcn-ui/SKILL.md +81 -33
- package/dist/agent-src/skills/readme-reviewer/SKILL.md +3 -0
- package/dist/agent-src/skills/readme-writing/SKILL.md +3 -0
- package/dist/agent-src/skills/readme-writing-package/SKILL.md +3 -0
- package/dist/agent-src/skills/receiving-code-review/SKILL.md +2 -2
- package/dist/agent-src/skills/refine-prompt/SKILL.md +3 -0
- package/dist/agent-src/skills/refine-ticket/SKILL.md +3 -0
- package/dist/agent-src/skills/requesting-code-review/SKILL.md +2 -2
- package/dist/agent-src/skills/review-routing/SKILL.md +2 -2
- package/dist/agent-src/skills/roadmap-writing/SKILL.md +23 -41
- package/dist/agent-src/skills/roadmap-writing/references/follow-up-roadmap-shape.md +47 -0
- package/dist/agent-src/skills/rtk-output-filtering/SKILL.md +22 -6
- package/dist/agent-src/skills/runway-cognition/SKILL.md +3 -0
- package/dist/agent-src/skills/scene-expander/scene-blueprint.schema.yaml +26 -0
- package/dist/agent-src/skills/secrets-management/SKILL.md +4 -0
- package/dist/agent-src/skills/server-hardening/SKILL.md +159 -0
- package/dist/agent-src/skills/skill-improvement-pipeline/SKILL.md +3 -0
- package/dist/agent-src/skills/skill-management/SKILL.md +3 -0
- package/dist/agent-src/skills/skill-reviewer/SKILL.md +3 -0
- package/dist/agent-src/skills/skill-writing/SKILL.md +6 -0
- package/dist/agent-src/skills/skill-writing/references/procedure.md +24 -2
- package/dist/agent-src/skills/spreadsheet-authoring/SKILL.md +3 -0
- package/dist/agent-src/skills/storybook-workshop/SKILL.md +203 -0
- package/dist/agent-src/skills/storybook-workshop/scripts/story_contrast_floor.ts +134 -0
- package/dist/agent-src/skills/subagent-orchestration/SKILL.md +1 -1
- package/dist/agent-src/skills/subagent-orchestration/prompts/README.md +25 -0
- package/dist/agent-src/skills/supply-chain-intake/SKILL.md +12 -0
- package/dist/agent-src/skills/systematic-debugging/SKILL.md +1 -1
- package/dist/agent-src/skills/terraform/SKILL.md +3 -0
- package/dist/agent-src/skills/test-driven-development/SKILL.md +1 -1
- package/dist/agent-src/skills/threat-modeling/SKILL.md +0 -3
- package/dist/agent-src/skills/token-optimizer/SKILL.md +3 -0
- package/dist/agent-src/skills/typography-system/SKILL.md +3 -0
- package/dist/agent-src/skills/ui-component-architect/SKILL.md +17 -1
- package/dist/agent-src/skills/upstream-contribute/SKILL.md +3 -0
- package/dist/agent-src/skills/validate-feature-fit/SKILL.md +3 -0
- package/dist/agent-src/skills/verify-completion-evidence/SKILL.md +2 -2
- package/dist/agent-src/skills/wireframe/SKILL.md +3 -0
- package/dist/agent-src/skills/wireframe/references/story-beat-ledger.schema.json +115 -0
- package/dist/agent-src/skills/workspace-link/SKILL.md +131 -0
- package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
- package/dist/agent-src/templates/playbook.md +75 -0
- package/dist/agent-src/templates/roadmaps.md +37 -0
- package/dist/agent-src/templates/scripts/check_playbook_invokes.ts +231 -0
- package/dist/agent-src/templates/scripts/work_engine/directives/ui/apply.ts +24 -0
- package/dist/agent-src/templates/scripts/work_engine/directives/ui/polish.ts +2 -0
- package/dist/agent-src/templates/scripts/work_engine/directives/ui/review.ts +216 -0
- package/dist/agent-src/templates/scripts/work_engine/directives/ui/scaffold.ts +159 -0
- package/dist/agent-src/templates/scripts/work_engine/directives/ui/stack_bundles.ts +73 -4
- package/dist/agent-src/templates/scripts/work_engine/stack/detect.ts +325 -40
- package/dist/cli/commands/uiAudit.js +221 -0
- package/dist/cli/commands/uiRender.js +206 -0
- package/dist/cli/main.js +22 -1
- package/dist/cli/mcp/content.js +64 -1
- package/dist/cli/mcp/dispatch.js +175 -10
- package/dist/cli/registry.js +3 -0
- package/dist/cli-delegate/{chunk-G23AT6GD.js → chunk-DMSZHXZS.js} +57 -1
- package/dist/cli-delegate/{chunk-77GR3VD4.js → chunk-FF7WAFMR.js} +58 -3
- package/dist/cli-delegate/{chunk-YM4GZDJG.js → chunk-JCW7ZLHK.js} +10 -0
- package/dist/cli-delegate/{chunk-H4VIVD4C.js → chunk-JJA2QEWA.js} +413 -391
- package/dist/cli-delegate/{chunk-PLSG6UL5.js → chunk-K4FFODTS.js} +341 -204
- package/dist/cli-delegate/{chunk-B2ERU2VA.js → chunk-WOKWX5PL.js} +1 -1
- package/dist/cli-delegate/cmd_brand_status.js +8 -6
- package/dist/cli-delegate/cmd_conformance.js +3 -3
- package/dist/cli-delegate/cmd_doctor.js +3 -3
- package/dist/cli-delegate/cmd_export.js +4 -4
- 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 +4 -4
- package/dist/cli-delegate/cmd_session_recycle.js +70 -9
- package/dist/cli-delegate/cmd_settings_migrate.js +4 -4
- package/dist/cli-delegate/cmd_settings_set.js +1 -1
- package/dist/cli-delegate/cmd_sync.js +4 -4
- package/dist/cli-delegate/cmd_uninstall.js +4 -4
- package/dist/cli-delegate/cmd_validate.js +4 -4
- package/dist/discovery/deprecation-report.md +1 -1
- package/dist/discovery/discovery-manifest.json +362 -127
- package/dist/discovery/discovery-manifest.json.sha256 +1 -1
- package/dist/discovery/discovery-manifest.summary.md +4 -4
- package/dist/discovery/dormancy-report.md +1 -1
- package/dist/discovery/orphan-report.md +1 -1
- package/dist/discovery/packs.json +18 -8
- package/dist/discovery/trust-report.md +3 -3
- package/dist/discovery/workspaces.json +16 -6
- package/dist/hooks/dispatch.js +2575 -1472
- package/dist/install/install.mjs +800 -708
- package/dist/mcp/registry-manifest.json +3 -3
- package/dist/mcp/server.json +2 -2
- package/dist/mcp/server.mjs +1685 -1250
- package/dist/router.json +1 -1
- package/dist/scripts/_lib/lean_projection_mode.js +40 -0
- package/dist/scripts/_lib/scoped_projection.js +84 -0
- package/dist/scripts/_lib/ui_surface.js +89 -0
- package/dist/scripts/condense.js +6 -10
- package/dist/scripts/project_thin_rules.js +40 -2
- package/dist/server/schemas/settings.js +6 -0
- package/dist/shared/skillRanking.js +159 -0
- package/docs/contracts/provider-lifecycle.md +47 -18
- package/docs/contracts/settings-classes.md +35 -5
- package/docs/guidelines/agent-infra/context-hygiene-mechanics.md +49 -0
- package/docs/guidelines/agent-infra/downstream-changes-mechanics.md +91 -0
- package/docs/guidelines/agent-infra/evaluator-independence-mechanics.md +92 -0
- package/docs/guidelines/agent-infra/minimal-safe-diff-mechanics.md +45 -1
- package/docs/guidelines/agent-infra/roadmap-deferred-resolution-provenance.md +54 -0
- package/docs/guidelines/code-clarity.md +21 -0
- package/docs/guidelines/design-antipatterns.md +4 -2
- package/docs/guidelines/design-asset-discipline.md +38 -0
- package/docs/guidelines/design-fidelity-mechanics.md +45 -29
- package/docs/guidelines/design-handover-extraction.md +35 -5
- package/docs/guidelines/design-modes.md +41 -1
- package/docs/guidelines/monorepo-antipatterns.md +141 -0
- package/docs/guidelines/redundancy-taxonomy.md +180 -0
- package/llms.txt +50 -39
- package/package.json +6 -2
- package/src/agent-src/templates/scripts/check_playbook_invokes.ts +231 -0
- package/src/agent-src/templates/scripts/work_engine/directives/ui/apply.ts +24 -0
- package/src/agent-src/templates/scripts/work_engine/directives/ui/polish.ts +2 -0
- package/src/agent-src/templates/scripts/work_engine/directives/ui/review.ts +216 -0
- package/src/agent-src/templates/scripts/work_engine/directives/ui/scaffold.ts +159 -0
- package/src/agent-src/templates/scripts/work_engine/directives/ui/stack_bundles.ts +73 -4
- package/src/agent-src/templates/scripts/work_engine/stack/detect.ts +325 -40
- package/src/config/agent-settings.template.yml +44 -0
- package/src/config/assurance-capability-registry.json +223 -0
- package/src/config/assurance-threshold-budget.json +65 -0
- package/src/config/budgets.yml +19 -0
- package/src/config/ci-local-parity.yml +29 -0
- package/src/config/discovery/prompt-patterns.yml +56 -0
- package/src/config/discovery/unassigned-artefacts.yml +2 -0
- package/src/config/dispatch-economy-metrics.json +4 -2
- package/src/config/estate-count-budget.json +8 -3
- package/src/config/evaluator-budgets.json +14 -14
- package/src/config/gate-coverage.yml +392 -8
- package/src/config/gate-violation-baselines.json +76 -72
- package/src/config/hook-latency-budget.json +1 -0
- package/src/config/hook-token-budget.json +137 -125
- package/src/config/pack-size-budget.json +39 -10
- package/src/config/preamble-payload-budget.json +97 -71
- package/src/config/quorum-attendance-budget.json +12 -4
- package/src/config/routing-coverage-seed.json +29 -0
- package/src/config/rule-activation-census.json +7 -3
- package/src/config/rule-enforcement-baseline.json +0 -1
- package/src/config/rule-stub-ceilings.json +112 -91
- package/src/config/suggestion-capture.json +28 -0
- package/src/config/surface-matrix.yml +21 -2
- package/src/config/web-launch-readiness.json +188 -0
- package/src/scripts/_cli/cmd_doctor.ts +15 -16
- package/src/scripts/_cli/doctor_install_mode.ts +49 -0
- package/src/scripts/_cli/doctor_overrides.ts +154 -0
- package/src/scripts/_dispatch.bash +17 -0
- package/src/scripts/_lib/as_of.ts +412 -0
- package/src/scripts/_lib/exec_evidence.ts +7 -0
- package/src/scripts/_lib/gate_baseline.ts +150 -1
- package/src/scripts/_lib/hook_settings.ts +33 -0
- package/src/scripts/_lib/host_listing_model.ts +192 -0
- package/src/scripts/_lib/lean_projection_mode.ts +44 -0
- package/src/scripts/_lib/mcp_bridge.ts +199 -0
- package/src/scripts/_lib/review_independence.ts +62 -10
- package/src/scripts/_lib/rule_injection.ts +239 -0
- package/src/scripts/_lib/run_checkpoint.ts +54 -1
- package/src/scripts/_lib/scoped_projection.ts +96 -0
- package/src/scripts/_lib/session_register.ts +44 -2
- package/src/scripts/_lib/skill_catalogue.ts +38 -2
- package/src/scripts/_lib/skill_estate.ts +115 -0
- package/src/scripts/_lib/transcript_reads.ts +207 -0
- package/src/scripts/_lib/ui_authority.ts +343 -0
- package/src/scripts/ai-video/adapters/fal.sh +8 -3
- package/src/scripts/ai-video/adapters/gemini-veo.sh +10 -0
- package/src/scripts/ai-video/adapters/higgsfield.sh +10 -2
- package/src/scripts/ai-video/adapters/kling.sh +10 -0
- package/src/scripts/ai-video/adapters/sora.sh +10 -0
- package/src/scripts/ai-video/lib/calibrate-cost.sh +145 -0
- package/src/scripts/ai-video/lib/model-capabilities/README.md +53 -7
- package/src/scripts/ai-video/lib/model-capabilities/comfyui.json +15 -3
- package/src/scripts/ai-video/lib/model-capabilities/fal.json +36 -6
- package/src/scripts/ai-video/lib/model-capabilities/gemini-veo.json +23 -0
- package/src/scripts/ai-video/lib/model-capabilities/higgsfield.json +23 -0
- package/src/scripts/ai-video/lib/model-capabilities/kling.json +23 -0
- package/src/scripts/ai-video/lib/model-capabilities/musetalk.json +8 -2
- package/src/scripts/ai-video/lib/model-capabilities/replicate.json +36 -6
- package/src/scripts/ai-video/lib/model-capabilities/sora.json +45 -0
- package/src/scripts/ai-video/lib/model-capabilities/syncso.json +8 -2
- package/src/scripts/ai-video/lib/parse-blueprint.sh +52 -5
- package/src/scripts/ai-video/lib/resume-scan.sh +92 -3
- package/src/scripts/ai-video/lib/seam-plan.sh +212 -0
- package/src/scripts/ai-video/smoke-trace.sh +450 -2
- package/src/scripts/ai-video/stitch.sh +191 -10
- package/src/scripts/ai-video/test-pipeline.sh +84 -6
- package/src/scripts/ai_council/argument_exhaustion.ts +130 -0
- package/src/scripts/ai_council/cli_agency_bounds.ts +139 -0
- package/src/scripts/ai_council/cli_least_agency_canary.ts +347 -0
- package/src/scripts/ai_council/clients.ts +3 -2
- package/src/scripts/ai_council/consensus.ts +63 -6
- package/src/scripts/ai_council/events_log.ts +46 -1
- package/src/scripts/ai_council/orchestrator.ts +103 -108
- package/src/scripts/ai_council/orchestrator_results.ts +166 -0
- package/src/scripts/ai_council/prompts.ts +12 -5
- package/src/scripts/ai_council/quorum.ts +82 -1
- package/src/scripts/ai_council/quorum_wiring.ts +82 -5
- package/src/scripts/ai_council/stance_tally.ts +22 -0
- package/src/scripts/bench_hook_latency.ts +62 -0
- package/src/scripts/build_proof.ts +12 -1
- package/src/scripts/capture_skill_catalogue.ts +21 -0
- package/src/scripts/check_always_budget.ts +2 -1
- package/src/scripts/check_augmentignore.ts +2 -1
- package/src/scripts/check_beta_review_markers.ts +2 -1
- package/src/scripts/check_bundle_path_leakage.ts +162 -7
- package/src/scripts/check_command_examples.ts +557 -0
- package/src/scripts/check_composite_arming.ts +364 -0
- package/src/scripts/check_corpus_staleness.ts +2 -1
- package/src/scripts/check_council_pin_staleness.ts +3 -1
- package/src/scripts/check_enforcement_coverage.ts +116 -3
- package/src/scripts/check_enforcement_denominator.ts +365 -0
- package/src/scripts/check_estate_count.ts +122 -3
- package/src/scripts/check_gate_coverage.ts +2 -1
- package/src/scripts/check_hook_bundle_freshness.ts +13 -1
- package/src/scripts/check_knowledge_cards.ts +2 -1
- package/src/scripts/check_knowledge_pages.ts +3 -2
- package/src/scripts/check_memory.ts +2 -1
- package/src/scripts/check_no_automerge_key.ts +287 -0
- package/src/scripts/check_pack_conformance_fixture.ts +565 -0
- package/src/scripts/check_preamble_payload_budget.ts +30 -3
- package/src/scripts/check_proposal.ts +2 -1
- package/src/scripts/check_reach_staleness.ts +2 -1
- package/src/scripts/check_release_adjacent_health.ts +2 -1
- package/src/scripts/check_release_pr_shape.ts +5 -0
- package/src/scripts/check_review_schema.ts +34 -1
- package/src/scripts/check_roadmap_trackable.ts +48 -3
- package/src/scripts/check_routing_coverage.ts +352 -0
- package/src/scripts/check_score_contract.ts +505 -0
- package/src/scripts/check_skill_admissions.ts +514 -0
- package/src/scripts/check_source_size_budget.ts +2 -1
- package/src/scripts/check_standing_payload_delta.ts +505 -0
- package/src/scripts/check_trigger_evals.ts +2 -1
- package/src/scripts/check_web_launch_readiness.ts +705 -0
- package/src/scripts/classify_change_risk.ts +281 -0
- package/src/scripts/compute_skill_tiers.ts +186 -0
- package/src/scripts/condense.ts +8 -13
- package/src/scripts/council_attendance_metrics.ts +183 -0
- package/src/scripts/council_cli.ts +10 -8
- package/src/scripts/council_parse_rate.ts +116 -0
- package/src/scripts/derive_playbooks.ts +406 -0
- package/src/scripts/description_route_check.ts +494 -0
- package/src/scripts/design_slop_rules.ts +56 -2
- package/src/scripts/dispatch_r2_reviewer.ts +16 -0
- package/src/scripts/frontend_corpus_hash.ts +116 -0
- package/src/scripts/grade_target_readiness.ts +478 -0
- package/src/scripts/hook_manifest.json +1 -1
- package/src/scripts/hook_manifest.yaml +124 -16
- package/src/scripts/hooks/concern_registry.ts +6 -0
- package/src/scripts/hooks/design_pass_hook.ts +356 -0
- package/src/scripts/hooks/rtk_wrap_hook.ts +30 -7
- package/src/scripts/hooks/rule_inject_hook.ts +318 -0
- package/src/scripts/hooks/suggestion_capture_hook.ts +368 -0
- package/src/scripts/hot_context_hook.ts +74 -7
- package/src/scripts/install.ts +40 -89
- package/src/scripts/lint_adapter_tier.ts +663 -0
- package/src/scripts/lint_archived_skills.ts +93 -0
- package/src/scripts/lint_budget_ownership.ts +56 -5
- package/src/scripts/lint_deterministic_time.ts +470 -0
- package/src/scripts/lint_framework_leakage.ts +5 -0
- package/src/scripts/lint_handoffs.ts +525 -1
- package/src/scripts/lint_judge_prompt_expectation.ts +155 -0
- package/src/scripts/lint_marketplace.ts +88 -0
- package/src/scripts/lint_media_policy_linkage.ts +140 -1
- package/src/scripts/lint_one_off_age.ts +6 -1
- package/src/scripts/lint_override_kernel_guard.ts +87 -5
- package/src/scripts/lint_roadmap_complexity.ts +56 -0
- package/src/scripts/lint_rule_enforcement_declaration.ts +24 -7
- package/src/scripts/lint_rule_norm_pin.ts +321 -0
- package/src/scripts/lint_skill_trigger_corpus.ts +349 -0
- package/src/scripts/lint_spawn_payload.ts +42 -5
- package/src/scripts/lint_symptom_intake.ts +2 -1
- package/src/scripts/mcp_parity_smoke.ts +30 -4
- package/src/scripts/mcp_render.ts +66 -1
- package/src/scripts/mcp_tool_fingerprint.ts +241 -0
- package/src/scripts/measure_risk_class_drift.ts +140 -0
- package/src/scripts/measure_skill_ranker_baseline.ts +212 -0
- package/src/scripts/media/lib/adapter-common.sh +211 -1
- package/src/scripts/media/lib/adapter-contract.md +74 -6
- package/src/scripts/model_rule_injection.ts +907 -0
- package/src/scripts/pack_install_smoke.ts +363 -0
- package/src/scripts/pr_conflict_census.ts +187 -0
- package/src/scripts/project_thin_rules.ts +45 -2
- package/src/scripts/release.ts +66 -860
- package/src/scripts/release_drill.ts +59 -3
- package/src/scripts/release_env.ts +298 -0
- package/src/scripts/release_publication.ts +720 -0
- package/src/scripts/report_pack_delta.ts +204 -0
- package/src/scripts/roadmap_context.ts +778 -0
- package/src/scripts/schemas/fidelity-measurement-sheet.schema.json +169 -0
- package/src/scripts/schemas/rule.schema.json +24 -2
- package/src/scripts/schemas/skill.schema.json +39 -0
- package/src/scripts/schemas/ui-authority.schema.json +114 -0
- package/src/scripts/select_analysis_mode.ts +112 -0
- package/src/scripts/session_register_hook.ts +29 -3
- package/src/scripts/sessions_cli.ts +67 -3
- package/src/scripts/skill_tools/score_skill_relevance.ts +36 -53
- package/src/scripts/sync_pr_branch.ts +40 -1
- package/src/scripts/token_sink_report.ts +239 -0
- package/src/scripts/trigger_coverage.ts +122 -3
- package/src/scripts/update_counts.ts +7 -3
- package/src/scripts/validate_frontmatter.ts +66 -0
- package/src/server/schemas/settings.ts +10 -0
- package/src/shared/skillRanking.ts +183 -0
- 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/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 -55
- 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/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/nda-triage/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/skill-writing/evals/triggers.json +0 -17
- package/dist/agent-src/skills/spreadsheet-authoring/evals/triggers.json +0 -47
- 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/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/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/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/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/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.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/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 -239
- package/src/scripts/self_review_gate.test.ts +0 -296
- package/src/shared/capabilities.test.ts +0 -43
|
@@ -0,0 +1,349 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
/**
|
|
3
|
+
* `lint_skill_trigger_corpus` — the routing-matrix corpus DISCIPLINE, applied
|
|
4
|
+
* to the skill corpus that already exists.
|
|
5
|
+
*
|
|
6
|
+
* `road-to-routing-assurance` Phase 2.1, as re-scoped by the AI council
|
|
7
|
+
* (2/2 convergent, recorded at the step): the roadmap's literal text said "one
|
|
8
|
+
* YAML per skill", which would have created a THIRD corpus surface next to the
|
|
9
|
+
* 74 `queries`-shaped and 2 `should_trigger`-shaped JSON files already in the
|
|
10
|
+
* tree. The step's *verify* condition is format-agnostic — "a corpus file
|
|
11
|
+
* failing the discipline is rejected by a schema check, not by review" — so the
|
|
12
|
+
* discipline is enforced on the existing JSON and the amendment is recorded
|
|
13
|
+
* rather than performed silently.
|
|
14
|
+
*
|
|
15
|
+
* ## Three separate contracts, and this gate owns exactly one
|
|
16
|
+
*
|
|
17
|
+
* The council's sharpest point: serialization, case semantics, and coverage are
|
|
18
|
+
* three different questions and choosing JSON answers only the first.
|
|
19
|
+
*
|
|
20
|
+
* - **Coverage** — how many skills have a corpus at all — is
|
|
21
|
+
* `check_routing_coverage`'s ratio, and stays there.
|
|
22
|
+
* - **Discipline** — is each covered skill's corpus adequate — is this gate.
|
|
23
|
+
* - **Semantics** — is a `trigger: false` case a genuine NEAR-MISS rather
|
|
24
|
+
* than an unrelated negative — is NOT machine-decidable and this gate does
|
|
25
|
+
* not pretend otherwise. It counts negatives; whether they are near enough
|
|
26
|
+
* to be informative stays a human read, and saying so is cheaper than a
|
|
27
|
+
* heuristic that would be wrong quietly.
|
|
28
|
+
*
|
|
29
|
+
* ## Why language is metadata, never detection
|
|
30
|
+
*
|
|
31
|
+
* The discipline asks for at least one German positive. A gate that *detected*
|
|
32
|
+
* German would be a heuristic in a file called a schema check: it would pass a
|
|
33
|
+
* German-looking English sentence and fail a short German one, and its
|
|
34
|
+
* failures would be unactionable. So German is declared — `"language": "de"`
|
|
35
|
+
* on the case — and declaration is checked. Forward-only, because zero of the
|
|
36
|
+
* 76 existing files carry the field: requiring it everywhere today would red
|
|
37
|
+
* 76 files for a field that did not exist when they were written.
|
|
38
|
+
*
|
|
39
|
+
* ## Forward-only, in two different senses
|
|
40
|
+
*
|
|
41
|
+
* The COUNT discipline (>=3 positives, >=2 near-misses) applies to every file
|
|
42
|
+
* today: exactly two files fail it, and both are listed as grandfathered by
|
|
43
|
+
* name rather than by a numeric baseline, so a third failure cannot hide inside
|
|
44
|
+
* a count. The LANGUAGE discipline applies only to files the diff adds or
|
|
45
|
+
* changes.
|
|
46
|
+
*
|
|
47
|
+
* Exit codes: 0 = clean · 1 = a discipline violation · 2 = dead scope.
|
|
48
|
+
*/
|
|
49
|
+
import { execFileSync } from 'node:child_process';
|
|
50
|
+
import * as fs from 'node:fs';
|
|
51
|
+
import * as path from 'node:path';
|
|
52
|
+
import process from 'node:process';
|
|
53
|
+
import { fileURLToPath } from 'node:url';
|
|
54
|
+
|
|
55
|
+
import { GateLedger } from './_lib/gate_ledger.js';
|
|
56
|
+
import { type SelfTestCase, runGateCli, runSelfTest } from './_lib/gate_self_test.js';
|
|
57
|
+
import { DeadScopeError, reportScanned } from './_lib/scan_scope.js';
|
|
58
|
+
|
|
59
|
+
const HERE = fileURLToPath(import.meta.url);
|
|
60
|
+
const REAL_REPO_ROOT = path.resolve(path.dirname(HERE), '..', '..');
|
|
61
|
+
const REPO_ROOT = process.env['LINT_SKILL_TRIGGER_CORPUS_ROOT'] ?? REAL_REPO_ROOT;
|
|
62
|
+
|
|
63
|
+
export const MIN_POSITIVES = 3;
|
|
64
|
+
export const MIN_NEAR_MISSES = 2;
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* The two corpus files that predate the discipline, named rather than counted.
|
|
68
|
+
*
|
|
69
|
+
* A numeric baseline would let a third failure arrive while the number stayed
|
|
70
|
+
* put if one of these were fixed in the same change. Names cannot do that.
|
|
71
|
+
*/
|
|
72
|
+
export const GRANDFATHERED = new Set(['brand-asset-generation', 'estimate-ticket']);
|
|
73
|
+
|
|
74
|
+
export interface CorpusStats {
|
|
75
|
+
unit: string;
|
|
76
|
+
positives: number;
|
|
77
|
+
nearMisses: number;
|
|
78
|
+
germanPositives: number;
|
|
79
|
+
/** True when at least one case declares a language at all. */
|
|
80
|
+
declaresLanguage: boolean;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export interface Violation {
|
|
84
|
+
unit: string;
|
|
85
|
+
rule: 'positives' | 'near-misses' | 'german' | 'malformed';
|
|
86
|
+
message: string;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
interface RawCase {
|
|
90
|
+
q?: string;
|
|
91
|
+
trigger?: boolean;
|
|
92
|
+
language?: string;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/** Read one corpus file into counts, across both shapes that exist. */
|
|
96
|
+
export function statsFor(unit: string, file: string): CorpusStats {
|
|
97
|
+
const doc = JSON.parse(fs.readFileSync(file, 'utf-8')) as {
|
|
98
|
+
queries?: RawCase[];
|
|
99
|
+
should_trigger?: string[];
|
|
100
|
+
should_not_trigger?: string[];
|
|
101
|
+
};
|
|
102
|
+
const queries = doc.queries ?? [];
|
|
103
|
+
let positives = queries.filter((q) => q.trigger === true).length;
|
|
104
|
+
let nearMisses = queries.filter((q) => q.trigger === false).length;
|
|
105
|
+
positives += (doc.should_trigger ?? []).length;
|
|
106
|
+
nearMisses += (doc.should_not_trigger ?? []).length;
|
|
107
|
+
return {
|
|
108
|
+
unit,
|
|
109
|
+
positives,
|
|
110
|
+
nearMisses,
|
|
111
|
+
germanPositives: queries.filter((q) => q.trigger === true && q.language === 'de').length,
|
|
112
|
+
declaresLanguage: queries.some((q) => typeof q.language === 'string'),
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
export function judge(s: CorpusStats, requireLanguage: boolean): Violation[] {
|
|
117
|
+
const out: Violation[] = [];
|
|
118
|
+
if (GRANDFATHERED.has(s.unit)) return out;
|
|
119
|
+
if (s.positives < MIN_POSITIVES) {
|
|
120
|
+
out.push({
|
|
121
|
+
unit: s.unit,
|
|
122
|
+
rule: 'positives',
|
|
123
|
+
message: `${String(s.positives)} positive(s), the discipline asks for ${String(MIN_POSITIVES)}`,
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
if (s.nearMisses < MIN_NEAR_MISSES) {
|
|
127
|
+
out.push({
|
|
128
|
+
unit: s.unit,
|
|
129
|
+
rule: 'near-misses',
|
|
130
|
+
message: `${String(s.nearMisses)} near-miss(es), the discipline asks for ${String(MIN_NEAR_MISSES)}`,
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
if (requireLanguage && s.germanPositives < 1) {
|
|
134
|
+
out.push({
|
|
135
|
+
unit: s.unit,
|
|
136
|
+
rule: 'german',
|
|
137
|
+
message:
|
|
138
|
+
'no positive declares `"language": "de"`. Declared, never detected — ' +
|
|
139
|
+
'a detector would pass German-looking English and fail short German',
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
return out;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/** Corpus files the diff added or modified, relative to a base ref. */
|
|
146
|
+
export function changedUnits(root: string, base: string): Set<string> {
|
|
147
|
+
let out = '';
|
|
148
|
+
try {
|
|
149
|
+
out = execFileSync('git', ['diff', '--name-only', `${base}...HEAD`], {
|
|
150
|
+
cwd: root,
|
|
151
|
+
encoding: 'utf-8',
|
|
152
|
+
// Silenced deliberately: outside a repo (a self-test fixture, a
|
|
153
|
+
// tarball install) git prints its whole usage text to stderr, and
|
|
154
|
+
// a gate that dumps a manual page on a path it already handles is
|
|
155
|
+
// noise a reader has to learn to ignore.
|
|
156
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
157
|
+
});
|
|
158
|
+
} catch {
|
|
159
|
+
return new Set();
|
|
160
|
+
}
|
|
161
|
+
const units = new Set<string>();
|
|
162
|
+
for (const line of out.split('\n')) {
|
|
163
|
+
const m = /^src\/skills\/([^/]+)\/evals\/triggers\.json$/.exec(line.trim());
|
|
164
|
+
if (m?.[1] !== undefined) units.add(m[1]);
|
|
165
|
+
}
|
|
166
|
+
return units;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
export interface Result {
|
|
170
|
+
violations: Violation[];
|
|
171
|
+
scanned: number;
|
|
172
|
+
ledger: GateLedger;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
export function evaluate(root = REPO_ROOT, base = 'origin/main'): Result {
|
|
176
|
+
const dir = path.join(root, 'src', 'skills');
|
|
177
|
+
let entries: fs.Dirent[];
|
|
178
|
+
try {
|
|
179
|
+
entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
180
|
+
} catch {
|
|
181
|
+
throw new DeadScopeError(
|
|
182
|
+
'lint_skill_trigger_corpus',
|
|
183
|
+
'src/skills is unreadable — a corpus gate with no corpus passes every tree.',
|
|
184
|
+
);
|
|
185
|
+
}
|
|
186
|
+
const changed = changedUnits(root, base);
|
|
187
|
+
const ledger = new GateLedger('lint_skill_trigger_corpus');
|
|
188
|
+
const violations: Violation[] = [];
|
|
189
|
+
let scanned = 0;
|
|
190
|
+
for (const e of entries) {
|
|
191
|
+
if (!e.isDirectory()) continue;
|
|
192
|
+
const file = path.join(dir, e.name, 'evals', 'triggers.json');
|
|
193
|
+
if (!fs.existsSync(file)) continue;
|
|
194
|
+
scanned += 1;
|
|
195
|
+
ledger.plan(e.name);
|
|
196
|
+
let own: Violation[];
|
|
197
|
+
try {
|
|
198
|
+
own = judge(statsFor(e.name, file), changed.has(e.name));
|
|
199
|
+
} catch {
|
|
200
|
+
own = [{ unit: e.name, rule: 'malformed', message: 'is not parseable JSON' }];
|
|
201
|
+
}
|
|
202
|
+
if (own.length === 0) ledger.complete(e.name);
|
|
203
|
+
else ledger.fail(e.name, own.map((v) => `[${v.rule}] ${v.message}`).join(' · '));
|
|
204
|
+
violations.push(...own);
|
|
205
|
+
}
|
|
206
|
+
if (scanned === 0) {
|
|
207
|
+
throw new DeadScopeError(
|
|
208
|
+
'lint_skill_trigger_corpus',
|
|
209
|
+
'zero corpus files found under src/skills/*/evals/triggers.json — 76 exist ' +
|
|
210
|
+
'in the shipped tree, so an empty scan is a moved root, not a clean one.',
|
|
211
|
+
);
|
|
212
|
+
}
|
|
213
|
+
return { violations, scanned, ledger };
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
export function selfTest(): number {
|
|
217
|
+
const os = process.env['TMPDIR'] ?? '/tmp';
|
|
218
|
+
const tmp = fs.mkdtempSync(path.join(os, 'lstc-'));
|
|
219
|
+
const mkRoot = (unit: string, body: unknown): string => {
|
|
220
|
+
const root = fs.mkdtempSync(path.join(tmp, 'repo-'));
|
|
221
|
+
const d = path.join(root, 'src', 'skills', unit, 'evals');
|
|
222
|
+
fs.mkdirSync(d, { recursive: true });
|
|
223
|
+
fs.writeFileSync(path.join(d, 'triggers.json'), JSON.stringify(body));
|
|
224
|
+
return root;
|
|
225
|
+
};
|
|
226
|
+
const run = (root: string): number => {
|
|
227
|
+
process.env['LINT_SKILL_TRIGGER_CORPUS_ROOT'] = root;
|
|
228
|
+
try {
|
|
229
|
+
return runGateCli(REAL_REPO_ROOT, 'src/scripts/lint_skill_trigger_corpus.ts', [], root);
|
|
230
|
+
} finally {
|
|
231
|
+
delete process.env['LINT_SKILL_TRIGGER_CORPUS_ROOT'];
|
|
232
|
+
}
|
|
233
|
+
};
|
|
234
|
+
const good = {
|
|
235
|
+
queries: [
|
|
236
|
+
{ q: 'a', trigger: true },
|
|
237
|
+
{ q: 'b', trigger: true },
|
|
238
|
+
{ q: 'c', trigger: true },
|
|
239
|
+
{ q: 'd', trigger: false },
|
|
240
|
+
{ q: 'e', trigger: false },
|
|
241
|
+
],
|
|
242
|
+
};
|
|
243
|
+
const cases: SelfTestCase[] = [
|
|
244
|
+
{
|
|
245
|
+
name: 'a compliant corpus is accepted',
|
|
246
|
+
expect: 'accept',
|
|
247
|
+
run: () => run(mkRoot('probe', good)),
|
|
248
|
+
},
|
|
249
|
+
{
|
|
250
|
+
name: 'the should_trigger shape is read, not silently skipped',
|
|
251
|
+
expect: 'accept',
|
|
252
|
+
run: () =>
|
|
253
|
+
run(
|
|
254
|
+
mkRoot('probe', {
|
|
255
|
+
should_trigger: ['a', 'b', 'c'],
|
|
256
|
+
should_not_trigger: ['d', 'e'],
|
|
257
|
+
}),
|
|
258
|
+
),
|
|
259
|
+
},
|
|
260
|
+
{
|
|
261
|
+
name: 'a grandfathered unit stays accepted at zero cases',
|
|
262
|
+
expect: 'accept',
|
|
263
|
+
run: () => run(mkRoot('estimate-ticket', { queries: [] })),
|
|
264
|
+
},
|
|
265
|
+
{
|
|
266
|
+
name: 'too few positives is rejected',
|
|
267
|
+
expect: 'reject',
|
|
268
|
+
run: () => run(mkRoot('probe', { queries: good.queries.slice(1) })),
|
|
269
|
+
},
|
|
270
|
+
{
|
|
271
|
+
name: 'too few near-misses is rejected',
|
|
272
|
+
expect: 'reject',
|
|
273
|
+
run: () => run(mkRoot('probe', { queries: good.queries.slice(0, 4) })),
|
|
274
|
+
},
|
|
275
|
+
{
|
|
276
|
+
name: 'a malformed corpus file is rejected, not skipped',
|
|
277
|
+
expect: 'reject',
|
|
278
|
+
run: () => {
|
|
279
|
+
const root = mkRoot('probe', good);
|
|
280
|
+
fs.writeFileSync(
|
|
281
|
+
path.join(root, 'src', 'skills', 'probe', 'evals', 'triggers.json'),
|
|
282
|
+
'{ not json',
|
|
283
|
+
);
|
|
284
|
+
return run(root);
|
|
285
|
+
},
|
|
286
|
+
},
|
|
287
|
+
{
|
|
288
|
+
name: 'a scan root with no corpus at all exits 2 rather than reporting clean',
|
|
289
|
+
expect: 'reject',
|
|
290
|
+
run: () => {
|
|
291
|
+
const root = fs.mkdtempSync(path.join(tmp, 'empty-'));
|
|
292
|
+
fs.mkdirSync(path.join(root, 'src', 'skills'), { recursive: true });
|
|
293
|
+
return run(root);
|
|
294
|
+
},
|
|
295
|
+
},
|
|
296
|
+
];
|
|
297
|
+
try {
|
|
298
|
+
return runSelfTest({
|
|
299
|
+
gate: 'lint_skill_trigger_corpus',
|
|
300
|
+
cases,
|
|
301
|
+
minCases: 7,
|
|
302
|
+
minRejectCases: 4,
|
|
303
|
+
});
|
|
304
|
+
} finally {
|
|
305
|
+
fs.rmSync(tmp, { recursive: true, force: true });
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
export function main(argv: string[] = process.argv.slice(2), root = REPO_ROOT): number {
|
|
310
|
+
if (argv.includes('--self-test')) return selfTest();
|
|
311
|
+
const quiet = argv.includes('--quiet');
|
|
312
|
+
let r: Result;
|
|
313
|
+
try {
|
|
314
|
+
r = evaluate(root);
|
|
315
|
+
reportScanned({
|
|
316
|
+
gate: 'lint_skill_trigger_corpus',
|
|
317
|
+
scanned: r.scanned,
|
|
318
|
+
units: 'skill corpus file(s)',
|
|
319
|
+
roots: ['src/skills/*/evals/triggers.json'],
|
|
320
|
+
});
|
|
321
|
+
} catch (e) {
|
|
322
|
+
if (e instanceof DeadScopeError) {
|
|
323
|
+
process.stderr.write(`${e.message}\n`);
|
|
324
|
+
return 2;
|
|
325
|
+
}
|
|
326
|
+
throw e;
|
|
327
|
+
}
|
|
328
|
+
r.ledger.report(quiet ? () => undefined : process.stdout.write.bind(process.stdout));
|
|
329
|
+
if (r.violations.length === 0) {
|
|
330
|
+
process.stdout.write(
|
|
331
|
+
`lint_skill_trigger_corpus: ${String(r.scanned)} corpus file(s) hold the discipline ` +
|
|
332
|
+
`(>=${String(MIN_POSITIVES)} positives, >=${String(MIN_NEAR_MISSES)} near-misses; ` +
|
|
333
|
+
`${String(GRANDFATHERED.size)} grandfathered by name).\n`,
|
|
334
|
+
);
|
|
335
|
+
return 0;
|
|
336
|
+
}
|
|
337
|
+
for (const v of r.violations) {
|
|
338
|
+
process.stderr.write(` ${v.unit}: [${v.rule}] ${v.message}\n`);
|
|
339
|
+
}
|
|
340
|
+
process.stderr.write(
|
|
341
|
+
`${String(r.violations.length)} discipline violation(s). Add the missing cases — ` +
|
|
342
|
+
'widening GRANDFATHERED is a defect, not a fix.\n',
|
|
343
|
+
);
|
|
344
|
+
return 1;
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
if (path.resolve(process.argv[1] ?? '') === path.resolve(HERE)) {
|
|
348
|
+
process.exit(main());
|
|
349
|
+
}
|
|
@@ -4,7 +4,19 @@
|
|
|
4
4
|
* ("NEVER BULK-DUMP CONTEXT INTO A SUBAGENT") deterministic
|
|
5
5
|
* (road-to-lean-agent-init Phase 3).
|
|
6
6
|
*
|
|
7
|
-
*
|
|
7
|
+
* WIDENED 2026-08-23 (road-to-review-independence step 0.4) to a THIRD surface: the
|
|
8
|
+
* SHIPPED prompt templates under `src/skills/subagent-orchestration/prompts/`. The gate
|
|
9
|
+
* made the "NEVER BULK-DUMP CONTEXT INTO A SUBAGENT" Iron Law deterministic over test
|
|
10
|
+
* fixtures and golden transcripts — i.e. over the places a violation is *simulated* —
|
|
11
|
+
* while the templates that actually construct a spawn brief in production sat outside
|
|
12
|
+
* it. Eight diff-payload placeholder sites across five of those files, plus two further
|
|
13
|
+
* placeholder shapes in two more, were unscanned.
|
|
14
|
+
*
|
|
15
|
+
* Still WARN-ONLY, exactly as before: this surface is prose with placeholders, and a
|
|
16
|
+
* placeholder is not yet a payload. What the widening buys is that a template growing a
|
|
17
|
+
* bulk-dump shape is now visible rather than invisible.
|
|
18
|
+
*
|
|
19
|
+
* Scans three surfaces for spawn-brief-shaped payloads: (a) JSON fixtures
|
|
8
20
|
* matching `tests/fixtures/**\/*spawn*.json`; (b) fenced code blocks in
|
|
9
21
|
* `tests/reasoning-layer-eval/golden-transcripts/*.md` that either parse as
|
|
10
22
|
* JSON with both a `task` and a `knowledge_refs` key, or are introduced by
|
|
@@ -41,7 +53,7 @@ import * as fs from 'node:fs';
|
|
|
41
53
|
import * as path from 'node:path';
|
|
42
54
|
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
43
55
|
|
|
44
|
-
import {
|
|
56
|
+
import { reportScanned, DeadScopeError } from './_lib/scan_scope.js';
|
|
45
57
|
|
|
46
58
|
const _HERE = path.dirname(fileURLToPath(import.meta.url));
|
|
47
59
|
const REPO_ROOT = path.resolve(_HERE, '..', '..');
|
|
@@ -219,6 +231,22 @@ function scanRepo(repoRoot: string): Finding[] {
|
|
|
219
231
|
}
|
|
220
232
|
}
|
|
221
233
|
|
|
234
|
+
// The shipped templates — step 0.4's surface. Counted the same way as the other two
|
|
235
|
+
// (the walk, not the filter), so "no violations" and "no files read" stay
|
|
236
|
+
// distinguishable; that distinction is why `scanned` is incremented before any
|
|
237
|
+
// content test in all three loops.
|
|
238
|
+
const templatesDir = path.join(repoRoot, 'src', 'skills', 'subagent-orchestration', 'prompts');
|
|
239
|
+
if (fs.existsSync(templatesDir)) {
|
|
240
|
+
for (const entry of fs.readdirSync(templatesDir, { withFileTypes: true })) {
|
|
241
|
+
if (entry.isFile() && entry.name.endsWith('.md')) {
|
|
242
|
+
scanned += 1;
|
|
243
|
+
findings.push(
|
|
244
|
+
...scanMarkdownTranscript(path.join(templatesDir, entry.name), repoRoot),
|
|
245
|
+
);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
|
|
222
250
|
const transcriptsDir = path.join(repoRoot, 'tests', 'reasoning-layer-eval', 'golden-transcripts');
|
|
223
251
|
if (fs.existsSync(transcriptsDir)) {
|
|
224
252
|
for (const entry of fs.readdirSync(transcriptsDir, { withFileTypes: true })) {
|
|
@@ -229,11 +257,20 @@ function scanRepo(repoRoot: string): Finding[] {
|
|
|
229
257
|
}
|
|
230
258
|
}
|
|
231
259
|
|
|
232
|
-
assertScanned
|
|
260
|
+
// `reportScanned`, not `assertScanned`: step 0.4's verify compares the scanned count
|
|
261
|
+
// against the pre-change one, and a count the gate never prints cannot be compared.
|
|
262
|
+
// The helper's own docstring makes the same point — "a count only visible without
|
|
263
|
+
// `--quiet` is not a count, since CI passes `--quiet`" — so the line goes to stdout
|
|
264
|
+
// unconditionally.
|
|
265
|
+
reportScanned({
|
|
233
266
|
gate: 'lint_spawn_payload',
|
|
234
267
|
scanned,
|
|
235
|
-
units: 'fixture / transcript file(s)',
|
|
236
|
-
roots: [
|
|
268
|
+
units: 'fixture / transcript / template file(s)',
|
|
269
|
+
roots: [
|
|
270
|
+
'tests/fixtures',
|
|
271
|
+
'tests/reasoning-layer-eval/golden-transcripts',
|
|
272
|
+
'src/skills/subagent-orchestration/prompts',
|
|
273
|
+
],
|
|
237
274
|
});
|
|
238
275
|
return findings;
|
|
239
276
|
}
|
|
@@ -30,6 +30,7 @@ import * as fs from 'node:fs';
|
|
|
30
30
|
import * as path from 'node:path';
|
|
31
31
|
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
32
32
|
|
|
33
|
+
import { asOf } from './_lib/as_of.js';
|
|
33
34
|
import { GateLedger } from './_lib/gate_ledger.js';
|
|
34
35
|
import { assertScanned, DeadScopeError } from './_lib/scan_scope.js';
|
|
35
36
|
|
|
@@ -132,7 +133,7 @@ function _now(): Date {
|
|
|
132
133
|
const parsed = Date.parse(`${flag.slice('--now='.length)}T00:00:00Z`);
|
|
133
134
|
if (!Number.isNaN(parsed)) return new Date(parsed);
|
|
134
135
|
}
|
|
135
|
-
return
|
|
136
|
+
return asOf();
|
|
136
137
|
}
|
|
137
138
|
|
|
138
139
|
function main(): number {
|
|
@@ -420,6 +420,15 @@ async function _run_http_leg(target: string): Promise<number> {
|
|
|
420
420
|
return failed;
|
|
421
421
|
}
|
|
422
422
|
|
|
423
|
+
/**
|
|
424
|
+
* The turnkey stdio surface's tool names, code-point sorted and joined.
|
|
425
|
+
* Kept as a literal rather than imported from `src/cli/` so this maintainer
|
|
426
|
+
* script does not take a build dependency on the CLI bundle; the CLI-side
|
|
427
|
+
* source of truth is `LITE_TOOLS` in `src/cli/mcp/dispatch.ts`, and
|
|
428
|
+
* `tests/scripts/mcp_lite_tools.test.ts` pins that side.
|
|
429
|
+
*/
|
|
430
|
+
const LITE_TOOL_NAMES_EXPECTED = 'read_skill,suggest_skill_for_task';
|
|
431
|
+
|
|
423
432
|
/** ALL skill+command prompt metas (uncapped — for full-set parity). */
|
|
424
433
|
function _local_prompts_all(): Record<string, unknown>[] {
|
|
425
434
|
const [prompts] = load_all_prompts();
|
|
@@ -438,7 +447,8 @@ function _local_resources_all(): Record<string, unknown>[] {
|
|
|
438
447
|
* Compares the FULL SUBSET the turnkey surface serves (skill/command prompts,
|
|
439
448
|
* rule/guideline resources — contexts excluded by design) via cursor
|
|
440
449
|
* pagination, on name/kind/uri keys, and asserts the read-only boundary
|
|
441
|
-
* (
|
|
450
|
+
* (the two read-only discovery tools and nothing else). Skips with a note if
|
|
451
|
+
* the binary isn't built.
|
|
442
452
|
*/
|
|
443
453
|
function _run_node_leg(cli: string): number {
|
|
444
454
|
if (!_exists(cli)) {
|
|
@@ -473,13 +483,29 @@ function _run_node_leg(cli: string): number {
|
|
|
473
483
|
_subset_resources(_normalize_resources({ resources: _local_resources_all() })),
|
|
474
484
|
_subset_resources(_normalize_resources({ resources: nodeResources })),
|
|
475
485
|
);
|
|
476
|
-
|
|
486
|
+
// Phase 1.1 of `road-to-skill-delivery-over-mcp`: the turnkey surface now
|
|
487
|
+
// serves exactly two read-only discovery tools, and this leg is where risk 6
|
|
488
|
+
// ("two implementations diverge silently") stops being a claim. Both names
|
|
489
|
+
// are checked, not counted — a count would pass on the wrong pair.
|
|
490
|
+
//
|
|
491
|
+
// `suggest_skill_for_task` is shared with the kernel and both now compute
|
|
492
|
+
// their score through the single `src/shared/skillRanking.ts` formula.
|
|
493
|
+
// `read_skill` is lite-only and deliberately NARROWER than the kernel's
|
|
494
|
+
// `read_resource_body`: it resolves a skill NAME through the content tree's
|
|
495
|
+
// uri map and can reach nothing else.
|
|
496
|
+
const nodeToolNames = nodeTools
|
|
497
|
+
.map((t) => String(t.name ?? ''))
|
|
498
|
+
.sort(_cmpCodePoints)
|
|
499
|
+
.join(',');
|
|
500
|
+
if (nodeToolNames !== LITE_TOOL_NAMES_EXPECTED) {
|
|
477
501
|
process.stdout.write(
|
|
478
|
-
`❌ node tools/list: expected
|
|
502
|
+
`❌ node tools/list: expected exactly [${LITE_TOOL_NAMES_EXPECTED}], got [${nodeToolNames}]\n`,
|
|
479
503
|
);
|
|
480
504
|
failed += 1;
|
|
481
505
|
} else {
|
|
482
|
-
process.stdout.write(
|
|
506
|
+
process.stdout.write(
|
|
507
|
+
`✅ node tools/list: ${LITE_TOOL_NAMES_EXPECTED} (read-only discovery, ADR-085 + Phase 1.1)\n`,
|
|
508
|
+
);
|
|
483
509
|
}
|
|
484
510
|
process.stdout.write(
|
|
485
511
|
`${`${failed ? '' : 'node-stdio parity OK '}(${path.basename(cli)})`.trim()}\n`,
|
|
@@ -13,6 +13,15 @@
|
|
|
13
13
|
* .windsurf/mcp.json (in-project)
|
|
14
14
|
* ~/.config/claude-desktop/claude_desktop_config.json (user, opt-in)
|
|
15
15
|
*
|
|
16
|
+
* `.mcp.json` — Claude Code's project-scope config — is a CHECK-ONLY target
|
|
17
|
+
* (Phase 1.3 of `road-to-skill-delivery-over-mcp`). It is deliberately not
|
|
18
|
+
* rendered: the installer writes it with `merge_json_file`, which touches only
|
|
19
|
+
* this package's own server key and records it in `agents/installed-tools.lock`
|
|
20
|
+
* so uninstall subtracts exactly that key. Rendering it here would overwrite a
|
|
21
|
+
* file the consumer also edits and silently delete servers they added by hand.
|
|
22
|
+
* `--check` therefore asserts CONTAINMENT of our entry rather than equality with
|
|
23
|
+
* a rendering, and says so on the same line.
|
|
24
|
+
*
|
|
16
25
|
* All targets use the same `mcpServers` top-level key. The source file uses
|
|
17
26
|
* `servers` to keep our internal schema stable if a downstream format ever
|
|
18
27
|
* diverges.
|
|
@@ -40,6 +49,36 @@ export function default_project_root(): string {
|
|
|
40
49
|
return fs.realpathSync(process.cwd());
|
|
41
50
|
}
|
|
42
51
|
|
|
52
|
+
/** The one entry `.mcp.json` must contain. Mirrors `install.ts:MCP_SERVER_KEY`. */
|
|
53
|
+
export const MCP_JSON_SERVER_KEY = 'agent-config';
|
|
54
|
+
|
|
55
|
+
/** Claude Code's project-scope MCP config. Checked here, written by the installer. */
|
|
56
|
+
export function claude_code_mcp_target(projectRoot: string): string {
|
|
57
|
+
return path.join(projectRoot, '.mcp.json');
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Does `.mcp.json` carry this package's server entry?
|
|
62
|
+
*
|
|
63
|
+
* `absent` is a distinct verdict from `missing-entry` on purpose: absent means
|
|
64
|
+
* the installer has not run for `claude-code` here, which is a hint; a file that
|
|
65
|
+
* exists WITHOUT our key means something removed it, which is a failure.
|
|
66
|
+
*/
|
|
67
|
+
export function check_mcp_json(projectRoot: string): 'absent' | 'ok' | 'missing-entry' | 'unreadable' {
|
|
68
|
+
const target = claude_code_mcp_target(projectRoot);
|
|
69
|
+
if (!fs.existsSync(target)) return 'absent';
|
|
70
|
+
let parsed: unknown;
|
|
71
|
+
try {
|
|
72
|
+
parsed = JSON.parse(fs.readFileSync(target, 'utf-8'));
|
|
73
|
+
} catch {
|
|
74
|
+
return 'unreadable';
|
|
75
|
+
}
|
|
76
|
+
if (parsed === null || typeof parsed !== 'object' || Array.isArray(parsed)) return 'unreadable';
|
|
77
|
+
const servers = (parsed as Record<string, unknown>)['mcpServers'];
|
|
78
|
+
if (servers === null || typeof servers !== 'object' || Array.isArray(servers)) return 'missing-entry';
|
|
79
|
+
return MCP_JSON_SERVER_KEY in (servers as Record<string, unknown>) ? 'ok' : 'missing-entry';
|
|
80
|
+
}
|
|
81
|
+
|
|
43
82
|
export function in_project_targets(projectRoot: string): Record<string, string> {
|
|
44
83
|
return {
|
|
45
84
|
cursor: path.join(projectRoot, '.cursor', 'mcp.json'),
|
|
@@ -274,7 +313,33 @@ function cmd_check(args: ParsedArgs): number {
|
|
|
274
313
|
return 1;
|
|
275
314
|
}
|
|
276
315
|
process.stdout.write('✅ All MCP targets match source.\n');
|
|
277
|
-
return
|
|
316
|
+
return _report_mcp_json(projectRoot);
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
/**
|
|
320
|
+
* The `.mcp.json` leg of `--check`. Additive: it can only turn a green run red
|
|
321
|
+
* when the file EXISTS and has lost our entry, never on a fresh tree where the
|
|
322
|
+
* installer has not run.
|
|
323
|
+
*/
|
|
324
|
+
function _report_mcp_json(projectRoot: string): number {
|
|
325
|
+
const verdict = check_mcp_json(projectRoot);
|
|
326
|
+
const rel = path.relative(projectRoot, claude_code_mcp_target(projectRoot)) || '.mcp.json';
|
|
327
|
+
if (verdict === 'ok') {
|
|
328
|
+
process.stdout.write(`✅ ${rel} carries the \`${MCP_JSON_SERVER_KEY}\` server (containment, not equality).\n`);
|
|
329
|
+
return 0;
|
|
330
|
+
}
|
|
331
|
+
if (verdict === 'absent') {
|
|
332
|
+
process.stdout.write(
|
|
333
|
+
`ℹ️ ${rel} not present — written by \`agent-config install\` for the ` +
|
|
334
|
+
'claude-code tool, never rendered from mcp.json.\n',
|
|
335
|
+
);
|
|
336
|
+
return 0;
|
|
337
|
+
}
|
|
338
|
+
process.stderr.write(
|
|
339
|
+
`❌ ${rel} exists but does not carry the \`${MCP_JSON_SERVER_KEY}\` server ` +
|
|
340
|
+
`(${verdict}). Re-run \`agent-config install\`.\n`,
|
|
341
|
+
);
|
|
342
|
+
return 1;
|
|
278
343
|
}
|
|
279
344
|
|
|
280
345
|
class ArgError extends Error {}
|