@event4u/agent-config 16.5.0 → 17.0.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 +2 -2
- package/.claude-plugin/skills/install-agent-config/SKILL.md +4 -4
- package/CHANGELOG.md +463 -498
- package/CONTRIBUTING.md +47 -0
- package/README.md +25 -25
- package/dist/agent-src/commands/{design.md → agent-design.md} +10 -6
- package/dist/agent-src/commands/agents/init.md +66 -3
- package/dist/agent-src/commands/agents/user/init.md +3 -0
- package/dist/agent-src/commands/{optimize/deep.md → analyze/and-optimize.md} +72 -33
- package/dist/agent-src/commands/analyze/inbox.md +168 -37
- package/dist/agent-src/commands/analyze/pr.md +144 -0
- package/dist/agent-src/commands/analyze/{repo.md → reference.md} +85 -14
- package/dist/agent-src/commands/analyze/roadmap-repos.md +19 -10
- package/dist/agent-src/commands/analyze.md +28 -12
- package/dist/agent-src/commands/audit.md +115 -0
- package/dist/agent-src/commands/brand/review.md +13 -2
- package/dist/agent-src/commands/brand/tokens.md +3 -3
- package/dist/agent-src/commands/brand/voice.md +8 -5
- package/dist/agent-src/commands/brand.md +2 -2
- package/dist/agent-src/commands/challenge-me/closure.md +25 -0
- package/dist/agent-src/commands/design-system/import.md +8 -3
- package/dist/agent-src/commands/design-system/sync.md +98 -0
- package/dist/agent-src/commands/design-system.md +6 -1
- package/dist/agent-src/commands/evals/analyze.json +44 -0
- package/dist/agent-src/commands/evals/audit.json +12 -0
- package/dist/agent-src/commands/evals/retro.json +12 -0
- package/dist/agent-src/commands/fix/ci.md +10 -8
- package/dist/agent-src/commands/ghostwriter/write.md +22 -0
- package/dist/agent-src/commands/memory/learn-low-impact.md +70 -83
- package/dist/agent-src/commands/memory/propose.md +12 -0
- package/dist/agent-src/commands/memory.md +1 -1
- package/dist/agent-src/commands/optimize.md +4 -3
- package/dist/agent-src/commands/post-as/me.md +18 -0
- package/dist/agent-src/commands/pr/create.md +17 -342
- package/dist/agent-src/commands/pr/merge.md +129 -368
- package/dist/agent-src/commands/retro.md +121 -0
- package/dist/agent-src/commands/review/routing.md +1 -1
- package/dist/agent-src/commands/roadmap/next.md +4 -1
- package/dist/agent-src/commands/roadmap/process-full.md +46 -333
- package/dist/agent-src/commands/roadmap/triage-parked.md +6 -2
- package/dist/agent-src/commands/team-knowledge/consolidate.md +2 -2
- package/dist/agent-src/commands/team-knowledge.md +1 -1
- package/dist/agent-src/commands/threat-model.md +1 -1
- package/dist/agent-src/commands/upstream-contribute.md +91 -101
- package/dist/agent-src/commands/worktree/cleanup.md +18 -11
- package/dist/agent-src/contexts/contracts/consumer-agents-md-guide.md +54 -0
- package/dist/agent-src/contexts/execution/analysis-loop.md +137 -0
- package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +3 -3
- package/dist/agent-src/contexts/execution/decision-closure-execution.md +1 -1
- package/dist/agent-src/contexts/execution/host-capability-manifest.md +6 -0
- package/dist/agent-src/contexts/execution/orchestration-telemetry.md +11 -4
- package/dist/agent-src/contexts/execution/pr-create-branches-content.md +250 -0
- package/dist/agent-src/contexts/execution/pr-create-branches-freshness.md +150 -0
- package/dist/agent-src/contexts/execution/pr-merge-queue.md +287 -0
- package/dist/agent-src/contexts/execution/pr-merge-sync.md +276 -0
- package/dist/agent-src/contexts/execution/pr-merge-trust-boundary.md +69 -0
- package/dist/agent-src/contexts/execution/process-full-all.md +233 -0
- package/dist/agent-src/contexts/execution/process-full-delivery.md +231 -0
- package/dist/agent-src/contexts/execution/roadmap-execution-contract-branches.md +42 -0
- package/dist/agent-src/contexts/execution/roadmap-execution-contract.md +1 -35
- package/dist/agent-src/contexts/execution/roadmap-process-loop-close.md +235 -0
- package/dist/agent-src/contexts/execution/roadmap-process-loop-prescan.md +216 -0
- package/dist/agent-src/contexts/execution/roadmap-process-loop-run.md +253 -0
- package/dist/agent-src/contexts/execution/roadmap-process-loop-set.md +212 -0
- package/dist/agent-src/contexts/execution/roadmap-process-loop.md +25 -864
- package/dist/agent-src/contexts/execution/subagent-spawn-contract.md +14 -2
- package/dist/agent-src/contexts/execution/subagent-steering.md +65 -8
- package/dist/agent-src/contexts/model-recommendations.md +5 -5
- package/dist/agent-src/contexts/subagent-configuration.md +1 -1
- package/dist/agent-src/guidelines/agent-infra/api-cost-levers.md +4 -3
- package/dist/agent-src/guidelines/agent-infra/model-recommendation.md +11 -5
- package/dist/agent-src/guidelines/agent-infra/rule-body-migration-inventory.md +1 -1
- package/dist/agent-src/guidelines/agent-infra/self-improvement-pipeline.md +47 -24
- package/dist/agent-src/guidelines/design-antipatterns.md +5 -0
- package/dist/agent-src/guidelines/design-asset-discipline.md +17 -0
- package/dist/agent-src/guidelines/design-fidelity-routing.md +1 -0
- package/dist/agent-src/guidelines/php/api-design.md +10 -1
- package/dist/agent-src/rules/brand-source-of-truth.md +7 -6
- package/dist/agent-src/rules/code-provenance.md +1 -1
- package/dist/agent-src/rules/context-hygiene.md +0 -1
- package/dist/agent-src/rules/design-fidelity.md +12 -13
- package/dist/agent-src/rules/external-reference-deep-dive.md +2 -2
- package/dist/agent-src/rules/fix-what-you-see.md +1 -1
- package/dist/agent-src/rules/low-impact-corpus-privacy-floor.md +14 -15
- package/dist/agent-src/rules/missing-skill-recovery.md +12 -11
- package/dist/agent-src/rules/neighbour-precedence.md +1 -1
- package/dist/agent-src/rules/recurring-criticism.md +1 -1
- package/dist/agent-src/rules/roadmap-ci-steps-policy.md +0 -2
- package/dist/agent-src/rules/self-repair-loop.md +2 -2
- package/dist/agent-src/rules/token-budget-discipline.md +1 -1
- package/dist/agent-src/scripts/dashboard_mode.ts +4 -1
- package/dist/agent-src/scripts/roadmap_age.ts +175 -0
- package/dist/agent-src/scripts/update_roadmap_progress.ts +10 -2
- package/dist/agent-src/skills/accessibility-auditor/SKILL.md +3 -3
- package/dist/agent-src/skills/agent-security-review/SKILL.md +2 -2
- package/dist/agent-src/skills/agents-md-thin-root/SKILL.md +12 -4
- package/dist/agent-src/skills/ai-code-blindspots/SKILL.md +7 -0
- package/dist/agent-src/skills/ai-council/references/advanced-modes.md +11 -1
- package/dist/agent-src/skills/ai-council/references/cost-and-redaction.md +7 -0
- package/dist/agent-src/skills/ai-council/references/execution-modes.md +7 -0
- package/dist/agent-src/skills/ai-council/references/output-and-synthesis.md +19 -0
- package/dist/agent-src/skills/ai-council/references/procedure.md +7 -0
- package/dist/agent-src/skills/api-design/SKILL.md +2 -2
- package/dist/agent-src/skills/api-endpoint/SKILL.md +2 -2
- package/dist/agent-src/skills/authz-review/SKILL.md +5 -3
- package/dist/agent-src/skills/blade-ui/SKILL.md +2 -2
- package/dist/agent-src/skills/brand/SKILL.md +7 -3
- package/dist/agent-src/skills/brand-asset-generation/SKILL.md +13 -6
- package/dist/agent-src/skills/brand-audit/SKILL.md +2 -1
- package/dist/agent-src/skills/brand-identity/SKILL.md +5 -4
- package/dist/agent-src/skills/brand-strategy/SKILL.md +5 -4
- package/dist/agent-src/skills/brand-to-tokens/SKILL.md +18 -39
- package/dist/agent-src/skills/brand-to-tokens/templates/marp-brand-deck.md.example +2 -2
- package/dist/agent-src/skills/brand-to-tokens/templates/reveal-brand-deck.yaml +2 -2
- package/dist/agent-src/skills/canvas-design/SKILL.md +12 -2
- package/dist/agent-src/skills/competitive-positioning/SKILL.md +2 -2
- package/dist/agent-src/skills/composer-packages/SKILL.md +18 -0
- package/dist/agent-src/skills/condense-memory/SKILL.md +1 -1
- package/dist/agent-src/skills/content-funnel-design/SKILL.md +8 -1
- package/dist/agent-src/skills/context-authoring/SKILL.md +1 -1
- package/dist/agent-src/skills/context-document/SKILL.md +2 -2
- package/dist/agent-src/skills/corpus-grounding/SKILL.md +6 -6
- package/dist/agent-src/skills/corpus-grounding/scripts/decision_engine.ts +13 -11
- package/dist/agent-src/skills/corpus-grounding/scripts/ground.mjs +1706 -0
- package/dist/agent-src/skills/corpus-grounding/scripts/schema_validator.ts +7 -1
- package/dist/agent-src/skills/dashboard-design/SKILL.md +1 -1
- package/dist/agent-src/skills/data-flow-mapper/SKILL.md +5 -2
- package/dist/agent-src/skills/database/SKILL.md +5 -4
- package/dist/agent-src/skills/decision-record/references/weighted-matrix.md +12 -0
- package/dist/agent-src/skills/deep-reading-analyst/SKILL.md +1 -1
- package/dist/agent-src/skills/dependency-upgrade/SKILL.md +61 -11
- package/dist/agent-src/skills/description-assist/SKILL.md +1 -1
- package/dist/agent-src/skills/design-intelligence/SKILL.md +1 -1
- package/dist/agent-src/skills/design-intelligence/data/landing.csv +1 -1
- package/dist/agent-src/skills/design-intelligence/references/context-and-registers.md +10 -2
- package/dist/agent-src/skills/design-intelligence/references/design-languages.md +1 -1
- package/dist/agent-src/skills/design-intelligence/references/design-rules-checklist.md +4 -3
- package/dist/agent-src/skills/design-intelligence/references/integration-mapping.md +14 -14
- package/dist/agent-src/skills/{wireframe → design-review}/references/story-beat-ledger.schema.json +1 -1
- package/dist/agent-src/skills/design-review/references/verification-automation.md +11 -3
- package/dist/agent-src/skills/design-system-capture/SKILL.md +15 -10
- package/dist/agent-src/skills/design-system-capture/references/design-system-json.md +20 -5
- package/dist/agent-src/skills/design-system-capture/references/import-procedure.md +2 -2
- package/dist/agent-src/skills/design-tokens/SKILL.md +23 -23
- package/dist/agent-src/skills/design-tokens/scripts/tokens.mjs +1037 -0
- package/dist/agent-src/skills/design-tokens/scripts/tokens.ts +336 -13
- package/dist/agent-src/skills/design-tokens/templates/design-tokens-starter.json +52 -53
- package/dist/agent-src/skills/docker/SKILL.md +1 -1
- package/dist/agent-src/skills/estimate-ticket/SKILL.md +1 -1
- package/dist/agent-src/skills/existing-ui-audit/SKILL.md +14 -276
- package/dist/agent-src/skills/existing-ui-audit/procedure.yaml +44 -0
- package/dist/agent-src/skills/existing-ui-audit/references/anti-slop-cross-reference.md +1 -1
- package/dist/agent-src/skills/existing-ui-audit/references/steps/00-inspect-stack-and-input.md +4 -0
- package/dist/agent-src/skills/existing-ui-audit/references/steps/01-enumerate-components.md +26 -0
- package/dist/agent-src/skills/existing-ui-audit/references/steps/01b-detect-component-taxonomy.md +7 -0
- package/dist/agent-src/skills/existing-ui-audit/references/steps/02-identify-design-system.md +12 -0
- package/dist/agent-src/skills/existing-ui-audit/references/steps/03-detect-design-tokens.md +35 -0
- package/dist/agent-src/skills/existing-ui-audit/references/steps/04-detect-shadcn-inventory.md +13 -0
- package/dist/agent-src/skills/existing-ui-audit/references/steps/04b-live-storybook-read.md +26 -0
- package/dist/agent-src/skills/existing-ui-audit/references/steps/05-list-reusable-patterns.md +14 -0
- package/dist/agent-src/skills/existing-ui-audit/references/steps/06-match-candidates.md +52 -0
- package/dist/agent-src/skills/existing-ui-audit/references/steps/07-greenfield-branch.md +29 -0
- package/dist/agent-src/skills/existing-ui-audit/references/steps/08-a11y-baseline.md +40 -0
- package/dist/agent-src/skills/existing-ui-audit/references/steps/09-validate-and-write.md +5 -0
- package/dist/agent-src/skills/experiment-loop/SKILL.md +1 -1
- package/dist/agent-src/skills/fe-design/references/design-patterns.md +16 -2
- package/dist/agent-src/skills/fe-design/references/design-read-and-memory.md +1 -1
- package/dist/agent-src/skills/fe-design/references/source-led-port.md +1 -1
- package/dist/agent-src/skills/finishing-a-development-branch/SKILL.md +6 -6
- package/dist/agent-src/skills/flux/SKILL.md +1 -1
- package/dist/agent-src/skills/form-handler/SKILL.md +15 -2
- package/dist/agent-src/skills/git-workflow/SKILL.md +2 -2
- package/dist/agent-src/skills/git-workflow/references/branch-update.md +7 -0
- package/dist/agent-src/skills/git-workflow/references/commit-subject.md +12 -0
- package/dist/agent-src/skills/git-workflow/references/push-closes-its-loop.md +10 -0
- package/dist/agent-src/skills/gtm-launch/SKILL.md +8 -1
- package/dist/agent-src/skills/html-deck/SKILL.md +7 -2
- package/dist/agent-src/skills/humanizer/SKILL.md +16 -3
- package/dist/agent-src/skills/humanizer/references/anti-aiisms.md +13 -1
- package/dist/agent-src/skills/humanizer/references/fixtures.md +8 -0
- package/dist/agent-src/skills/js-library-packaging/SKILL.md +5 -4
- package/dist/agent-src/skills/js-library-packaging/scripts/check_package_surface.mjs +197 -0
- package/dist/agent-src/skills/judge-artifact-completeness/SKILL.md +1 -1
- package/dist/agent-src/skills/judge-security-auditor/SKILL.md +2 -2
- package/dist/agent-src/skills/launch-readiness/SKILL.md +18 -22
- package/dist/agent-src/skills/learning-to-rule-or-skill/SKILL.md +5 -5
- package/dist/agent-src/skills/livewire/SKILL.md +1 -1
- package/dist/agent-src/skills/llm-provider-knowledge/SKILL.md +18 -0
- package/dist/agent-src/skills/logo-generation/SKILL.md +9 -3
- package/dist/agent-src/skills/market-entry-analysis/SKILL.md +6 -1
- package/dist/agent-src/skills/markitdown/SKILL.md +1 -1
- package/dist/agent-src/skills/memory-consolidation/SKILL.md +2 -2
- package/dist/agent-src/skills/messaging-architecture/SKILL.md +8 -1
- package/dist/agent-src/skills/motion-choreographer/SKILL.md +2 -2
- package/dist/agent-src/skills/playwright-testing/SKILL.md +2 -0
- package/dist/agent-src/skills/positioning-strategy/SKILL.md +10 -2
- package/dist/agent-src/skills/prediction-pool-optimizer/references/ev-fixtures.md +13 -0
- package/dist/agent-src/skills/prediction-pool-optimizer/references/odds-and-bonus.md +7 -0
- package/dist/agent-src/skills/project-analysis-core/SKILL.md +1 -1
- package/dist/agent-src/skills/project-analysis-hypothesis-driven/SKILL.md +1 -1
- package/dist/agent-src/skills/project-analyzer/SKILL.md +14 -75
- package/dist/agent-src/skills/project-analyzer/procedure.yaml +39 -0
- package/dist/agent-src/skills/project-analyzer/references/steps/01-project-overview.md +9 -0
- package/dist/agent-src/skills/project-analyzer/references/steps/02-architecture.md +7 -0
- package/dist/agent-src/skills/project-analyzer/references/steps/03-data-layer.md +6 -0
- package/dist/agent-src/skills/project-analyzer/references/steps/04-business-domains.md +7 -0
- package/dist/agent-src/skills/project-analyzer/references/steps/05-api-surface.md +6 -0
- package/dist/agent-src/skills/project-analyzer/references/steps/06-service-map.md +6 -0
- package/dist/agent-src/skills/project-analyzer/references/steps/07-module-inventory.md +6 -0
- package/dist/agent-src/skills/project-analyzer/references/steps/08-infrastructure-and-testing.md +5 -0
- package/dist/agent-src/skills/project-analyzer/references/steps/09-agent-docs-audit.md +6 -0
- package/dist/agent-src/skills/project-analyzer/references/steps/10-gap-analysis.md +6 -0
- package/dist/agent-src/skills/quality-tools/references/js-ts-tools.md +10 -0
- package/dist/agent-src/skills/quality-tools/references/php-tools.md +13 -0
- package/dist/agent-src/skills/quality-tools/references/python-tools.md +11 -0
- package/dist/agent-src/skills/react-native-setup/SKILL.md +7 -2
- package/dist/agent-src/skills/react-shadcn-ui/SKILL.md +5 -1
- package/dist/agent-src/skills/react-shadcn-ui/references/registry.md +13 -0
- package/dist/agent-src/skills/react-shadcn-ui/scripts/shadcn_add.mjs +315 -0
- package/dist/agent-src/skills/react-shadcn-ui/scripts/shadcn_add.ts +6 -6
- package/dist/agent-src/skills/receiving-code-review/SKILL.md +1 -1
- package/dist/agent-src/skills/refine-ticket/SKILL.md +2 -2
- package/dist/agent-src/skills/release-comms/SKILL.md +2 -1
- package/dist/agent-src/skills/repomix-packer/SKILL.md +2 -2
- package/dist/agent-src/skills/requesting-code-review/SKILL.md +3 -3
- package/dist/agent-src/skills/roadmap-management/references/archival.md +3 -3
- package/dist/agent-src/skills/roadmap-management/references/authoring.md +9 -2
- package/dist/agent-src/skills/roadmap-management/references/dashboard.md +3 -3
- package/dist/agent-src/skills/roadmap-management/references/lifecycle.md +3 -3
- package/dist/agent-src/skills/roadmap-writing/SKILL.md +4 -4
- package/dist/agent-src/skills/rtk-output-filtering/SKILL.md +1 -1
- package/dist/agent-src/skills/rule-writing/SKILL.md +1 -2
- package/dist/agent-src/skills/security/SKILL.md +41 -5
- package/dist/agent-src/skills/skill-improvement-pipeline/SKILL.md +5 -3
- package/dist/agent-src/skills/skill-reviewer/SKILL.md +1 -1
- package/dist/agent-src/skills/skill-writing/SKILL.md +23 -8
- package/dist/agent-src/skills/skill-writing/references/section-patterns.md +19 -1
- package/dist/agent-src/skills/source-discovery/SKILL.md +3 -3
- package/dist/agent-src/skills/sql-writing/SKILL.md +2 -2
- package/dist/agent-src/skills/standards-from-config/SKILL.md +2 -2
- package/dist/agent-src/skills/storybook-workshop/SKILL.md +5 -0
- package/dist/agent-src/skills/storybook-workshop/scripts/story_contrast_floor.mjs +99 -0
- package/dist/agent-src/skills/subagent-orchestration/SKILL.md +13 -13
- package/dist/agent-src/skills/subagent-orchestration/prompts/README.md +4 -3
- package/dist/agent-src/skills/svg-authoring/SKILL.md +7 -1
- package/dist/agent-src/skills/systematic-debugging/SKILL.md +2 -2
- package/dist/agent-src/skills/tailwind-engineer/SKILL.md +8 -3
- package/dist/agent-src/skills/tailwind-engineer/scripts/tailwind_config_gen.mjs +482 -0
- package/dist/agent-src/skills/test-case-discovery/SKILL.md +1 -1
- package/dist/agent-src/skills/threat-modeling/SKILL.md +8 -1
- package/dist/agent-src/skills/threat-modeling/data/manifest.json +5 -2
- package/dist/agent-src/skills/threat-modeling/data/reasoning.csv +10 -10
- package/dist/agent-src/skills/threat-modeling/data/surfaces.csv +11 -10
- package/dist/agent-src/skills/threat-modeling/data/threats.csv +34 -20
- package/dist/agent-src/skills/type-design/SKILL.md +196 -0
- package/dist/agent-src/skills/type-design/references/font-spec.md +90 -0
- package/dist/agent-src/skills/type-design/references/gates.md +113 -0
- package/dist/agent-src/skills/type-design/references/toolchain.md +66 -0
- package/dist/agent-src/skills/typography-system/SKILL.md +21 -11
- package/dist/agent-src/skills/typography-system/references/worked-scales.md +85 -0
- package/dist/agent-src/skills/ui-apply-generic/SKILL.md +1 -1
- package/dist/agent-src/skills/universal-project-analysis/SKILL.md +1 -1
- package/dist/agent-src/skills/upstream-contribute/SKILL.md +120 -125
- package/dist/agent-src/skills/using-git-worktrees/SKILL.md +1 -0
- package/dist/agent-src/skills/verify-repair-loop/SKILL.md +1 -1
- package/dist/agent-src/skills/voice-and-tone-design/SKILL.md +71 -2
- package/dist/agent-src/skills/worktree-lifecycle/SKILL.md +16 -14
- package/dist/agent-src/templates/AGENTS.md +1 -1
- package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
- package/dist/agent-src/templates/agents/proposal.example.md +1 -1
- package/dist/agent-src/templates/github-workflows/advisories-daily.yml +85 -0
- package/dist/agent-src/templates/roadmaps.md +39 -1
- package/dist/agent-src/templates/scripts/check_memory.ts +2 -2
- package/dist/agent-src/templates/scripts/historical-bug-patterns.example.yml +13 -1
- package/dist/agent-src/templates/scripts/work_engine/cli.ts +17 -0
- package/dist/agent-src/templates/scripts/work_engine/cli_args.ts +10 -0
- package/dist/agent-src/templates/scripts/work_engine/directives/ui/scaffold.ts +22 -13
- package/dist/agent-src/templates/scripts/work_engine/dispatcher.ts +18 -4
- package/dist/agent-src/templates/scripts/work_engine/procedure/checks.ts +283 -0
- package/dist/agent-src/templates/scripts/work_engine/procedure/run.ts +432 -0
- package/dist/agent-src/templates/scripts/work_engine/procedure/sidecar.ts +185 -0
- package/dist/agent-src/templates/scripts/work_engine/state.ts +3 -0
- package/dist/cli/commands/uiRender.js +72 -17
- package/dist/cli/commands/uiRenderAsset.js +10 -2
- package/dist/cli/commands/uiRenderAssetFonts.js +158 -0
- package/dist/cli/commands/uiRenderAssetTypes.js +8 -20
- package/dist/cli/initRouting.js +1 -1
- package/dist/cli/mcp/dispatch.js +31 -9
- package/dist/cli/python/knowledge_ingest.js +7 -39
- package/dist/cli/python/workspace_secrets.js +4 -177
- package/dist/cli/registry.js +4 -1
- package/dist/cli-delegate/archive_completed_roadmaps.js +3 -2
- package/dist/cli-delegate/check_update_banner.js +635 -266
- package/dist/cli-delegate/{chunk-TMWYUOK4.js → chunk-2CX7NWRB.js} +224 -437
- package/dist/cli-delegate/{chunk-F3QDG2GT.js → chunk-2SFOOFJJ.js} +259 -159
- package/dist/cli-delegate/chunk-2Y5AMLMY.js +136 -0
- package/dist/cli-delegate/{chunk-OKJUIAPS.js → chunk-4E2W63DA.js} +1 -62
- package/dist/cli-delegate/{chunk-6SRJTYJS.js → chunk-4SHNERBL.js} +37 -16
- package/dist/cli-delegate/chunk-5VO3RTMV.js +208 -0
- package/dist/cli-delegate/chunk-6E2LDY4F.js +27 -0
- package/dist/cli-delegate/{chunk-XQTPXKFA.js → chunk-6ZD2QZMN.js} +8 -17
- package/dist/cli-delegate/{chunk-6V5FMA3P.js → chunk-7CEI2YPS.js} +1 -1
- package/dist/cli-delegate/{chunk-DMSZHXZS.js → chunk-7DRWULEQ.js} +80 -7
- package/dist/cli-delegate/chunk-7NXCZSDL.js +54 -0
- package/dist/cli-delegate/chunk-AX3U3UWJ.js +328 -0
- package/dist/cli-delegate/{chunk-WOKWX5PL.js → chunk-BKALSTBZ.js} +18 -3
- package/dist/cli-delegate/chunk-BMGUGSY6.js +103 -0
- package/dist/cli-delegate/chunk-BYV46VRM.js +3309 -0
- package/dist/cli-delegate/{chunk-5GPULQBE.js → chunk-CAL76ADI.js} +4215 -682
- package/dist/cli-delegate/chunk-DSY6LLCQ.js +127 -0
- package/dist/cli-delegate/chunk-E6XNBVE4.js +581 -0
- package/dist/cli-delegate/{chunk-ZUZKZYCN.js → chunk-ESUNQ5XR.js} +46 -10
- package/dist/cli-delegate/{chunk-G5VVIZRC.js → chunk-F7HLSW6P.js} +1 -1
- package/dist/cli-delegate/chunk-FIEEOH5C.js +133 -0
- package/dist/cli-delegate/chunk-FKYZOWVD.js +719 -0
- package/dist/cli-delegate/chunk-GOMILC3O.js +918 -0
- package/dist/cli-delegate/chunk-I4KJYVPB.js +69 -0
- package/dist/cli-delegate/{chunk-JQOM7TTM.js → chunk-IDAOTDPE.js} +1 -100
- package/dist/cli-delegate/chunk-IROAQ77A.js +137 -0
- package/dist/cli-delegate/chunk-J2SJZICO.js +698 -0
- package/dist/cli-delegate/{chunk-6YQC2HLF.js → chunk-JHMMWNJ2.js} +54 -40
- package/dist/cli-delegate/{chunk-WQWXGIWB.js → chunk-M6CRG5O6.js} +165 -15
- package/dist/cli-delegate/{chunk-PHD7OOLE.js → chunk-MQ2UDEGV.js} +14 -3
- package/dist/cli-delegate/chunk-NTM7G2V4.js +220 -0
- package/dist/cli-delegate/chunk-PV7S5DPJ.js +175 -0
- package/dist/cli-delegate/{chunk-F7DQWYR5.js → chunk-RAXQOETZ.js} +6 -2
- package/dist/cli-delegate/{chunk-T7XSJSUQ.js → chunk-SIOMDAKL.js} +980 -784
- package/dist/cli-delegate/{chunk-KR6EM23A.js → chunk-TULVDQ4L.js} +3 -48
- package/dist/cli-delegate/chunk-UUYEKXKR.js +20 -0
- package/dist/cli-delegate/{chunk-7XGD2OEU.js → chunk-UXWHY6CQ.js} +2 -1
- package/dist/cli-delegate/{chunk-PWX7CKMD.js → chunk-VC3ECUEK.js} +1 -1
- package/dist/cli-delegate/{chunk-KXXWJTDO.js → chunk-WMNYVIYX.js} +1 -1
- package/dist/cli-delegate/chunk-XCY5KKUC.js +181 -0
- package/dist/cli-delegate/{chunk-H76PHZBI.js → chunk-XLY5G3CM.js} +14 -19
- package/dist/cli-delegate/cmd_adr_effective.js +41 -2
- package/dist/cli-delegate/cmd_analyze_session.js +7 -7
- package/dist/cli-delegate/cmd_brand_status.js +1287 -10
- package/dist/cli-delegate/cmd_ci_settle.js +330 -0
- package/dist/cli-delegate/cmd_conformance.js +483 -817
- package/dist/cli-delegate/cmd_doctor.js +26 -16
- package/dist/cli-delegate/cmd_doctor_neighbours.js +10 -7
- package/dist/cli-delegate/cmd_explain.js +9 -24
- package/dist/cli-delegate/cmd_export.js +14 -11
- package/dist/cli-delegate/cmd_fleet.js +5 -3
- package/dist/cli-delegate/cmd_git_convention.js +8 -4
- package/dist/cli-delegate/cmd_handoff.js +79 -242
- package/dist/cli-delegate/cmd_mcp_available.js +1 -1
- package/dist/cli-delegate/cmd_memory_get.js +4 -2
- package/dist/cli-delegate/cmd_migrate.js +2 -2
- package/dist/cli-delegate/cmd_packs_active.js +2 -2
- package/dist/cli-delegate/cmd_preflight.js +7 -5
- package/dist/cli-delegate/cmd_prune.js +16 -13
- package/dist/cli-delegate/cmd_route_audit.js +11 -8
- package/dist/cli-delegate/cmd_route_explain.js +649 -16
- package/dist/cli-delegate/cmd_session_recycle.js +15 -6
- package/dist/cli-delegate/cmd_settings_check.js +2 -2
- package/dist/cli-delegate/cmd_settings_get.js +1 -1
- package/dist/cli-delegate/cmd_settings_migrate.js +14 -11
- package/dist/cli-delegate/cmd_settings_set.js +1 -1
- package/dist/cli-delegate/cmd_sync.js +16 -13
- package/dist/cli-delegate/cmd_uninstall.js +185 -31
- package/dist/cli-delegate/cmd_update.js +67 -3
- package/dist/cli-delegate/cmd_upgrade.js +38 -7
- package/dist/cli-delegate/cmd_validate.js +16 -13
- package/dist/cli-delegate/cmd_versions.js +1 -1
- package/dist/cli-delegate/dashboard_mode.js +1 -1
- package/dist/cli-delegate/gate_execute.js +4 -3
- package/dist/cli-delegate/roadmap_age.js +22 -0
- package/dist/cli-delegate/roadmap_gates.js +4 -3
- package/dist/cli-delegate/update_roadmap_progress.js +3 -2
- package/dist/cli-delegate/upgrade_unattended-VVL6JLSX.js +541 -0
- package/dist/discovery/deprecation-report.md +1 -1
- package/dist/discovery/discovery-manifest.json +373 -190
- package/dist/discovery/discovery-manifest.json.sha256 +1 -1
- package/dist/discovery/discovery-manifest.summary.md +5 -5
- package/dist/discovery/dormancy-report.md +1 -1
- package/dist/discovery/orphan-report.md +1 -1
- package/dist/discovery/packs.json +21 -16
- package/dist/discovery/trust-report.md +3 -3
- package/dist/discovery/workspaces.json +16 -11
- package/dist/hooks/chat_history.chunk.cjs +6852 -0
- package/dist/hooks/chat_history.chunk.cjs.sha256 +1 -0
- package/dist/hooks/dispatch.js +17506 -18692
- package/dist/hooks/dispatch.sha256 +1 -1
- package/dist/hooks/egress_engine.chunk.cjs +915 -0
- package/dist/hooks/egress_engine.chunk.cjs.sha256 +1 -0
- package/dist/hooks/svg_rules.chunk.cjs +281 -49
- package/dist/hooks/svg_rules.chunk.cjs.sha256 +1 -1
- package/dist/install/conflict.js +36 -6
- package/dist/install/conflictTracker.js +81 -7
- package/dist/install/detect.js +3 -3
- package/dist/install/hostPermissionsAdapter.js +106 -0
- package/dist/install/install.mjs +3117 -1949
- package/dist/install/installThinLayer.js +1 -1
- package/dist/install/manifestFiles.js +21 -0
- package/dist/install/noGoDenyRows.js +300 -0
- package/dist/install/noGoRules.js +368 -0
- package/dist/install/ownershipLedger.js +133 -0
- package/dist/install/plan.js +1 -1
- package/dist/install/preflight.js +39 -8
- package/dist/install/preserve.js +74 -12
- package/dist/install/recordedOwnership.js +88 -5
- package/dist/install/rule_scope.js +20 -3
- package/dist/install/stagedRuntime.js +455 -0
- package/dist/install/toolsArg.js +19 -0
- package/dist/install/userPin.js +47 -0
- package/dist/install/wizard-plan.js +26 -4
- package/dist/mcp/awesome-mcp-servers.row.md +1 -1
- package/dist/mcp/mcp-cloudflare-catalogue.json +3 -2
- package/dist/mcp/registry-manifest.json +6 -5
- package/dist/mcp/server.json +3 -3
- package/dist/mcp/server.mjs +9831 -5546
- package/dist/router.json +1 -1
- package/dist/scripts/_lib/agent_settings.js +7 -12
- package/dist/scripts/_lib/asset_render_record.js +219 -0
- package/dist/scripts/_lib/claude_builtin_names.js +9 -4
- package/dist/scripts/_lib/claude_settings_hooks.js +102 -34
- package/dist/scripts/_lib/egress_rules.js +766 -0
- package/dist/scripts/_lib/environment_detector.js +24 -33
- package/dist/scripts/_lib/global_deploy_inventory.js +146 -9
- package/dist/scripts/_lib/guidelines_lane.js +10 -1
- package/dist/scripts/_lib/identifier_redaction.js +24 -0
- package/dist/scripts/_lib/installed_layer.js +17 -0
- package/dist/scripts/_lib/installed_layer_normalise.js +72 -0
- package/dist/scripts/_lib/lean_projection_mode.js +34 -152
- package/dist/scripts/_lib/project_tree_form.js +118 -0
- package/dist/scripts/_lib/scoped_projection.js +133 -3
- package/dist/scripts/_lib/settings_removed_keys.js +29 -0
- package/dist/scripts/_lib/settings_renamed_keys.js +17 -5
- package/dist/scripts/_lib/subagent_native_fields.js +35 -0
- package/dist/scripts/_lib/svg_filled_counter.js +285 -0
- package/dist/scripts/_lib/svg_rules.js +2 -0
- package/dist/scripts/_lib/ui_surface.js +19 -0
- package/dist/scripts/_lib/verification_command.js +364 -0
- package/dist/scripts/_lib/workspace_secrets.js +229 -0
- package/dist/scripts/ai_council/seat_policy.js +27 -0
- package/dist/scripts/ai_council/transport_resolver.js +9 -10
- package/dist/scripts/condense.js +25 -29
- package/dist/server/io/substituteTemplate.js +2 -2
- package/dist/server/io/yamlIO.js +2 -2
- package/dist/server/routes/install.js +5 -1
- package/dist/server/routes/settings.js +2 -2
- package/dist/server/routes/wizard.js +1 -1
- package/dist/server/schemas/settings.js +22 -16
- package/dist/server/serverInfo.js +1 -1
- package/dist/shared/brandTokenDocument.js +47 -0
- package/dist/shared/brandTokenPaths.js +43 -0
- package/dist/shared/settingsCarveOut.js +0 -7
- package/dist/shared/skillRanking.js +103 -5
- package/dist/shared/userMd/formAdapter.js +16 -0
- package/dist/shared/userMd/schema.js +17 -0
- package/dist/ui/assets/index-w70Ado09.js +23 -0
- package/dist/ui/index.html +1 -1
- package/docs/MIGRATION.md +89 -2
- package/docs/THIRD-PARTY-NOTICES.md +27 -0
- package/docs/contracts/settings-classes.md +27 -9
- package/docs/guidelines/agent-infra/api-cost-levers.md +4 -3
- package/docs/guidelines/agent-infra/model-recommendation.md +11 -5
- package/docs/guidelines/agent-infra/rule-body-migration-inventory.md +1 -1
- package/docs/guidelines/agent-infra/self-improvement-pipeline.md +47 -24
- package/docs/guidelines/design-antipatterns.md +5 -0
- package/docs/guidelines/design-asset-discipline.md +17 -0
- package/docs/guidelines/design-fidelity-routing.md +1 -0
- package/docs/guidelines/php/api-design.md +10 -1
- package/llms.txt +12 -10
- package/package.json +13 -4
- package/src/agent-src/scripts/dashboard_mode.ts +4 -1
- package/src/agent-src/scripts/roadmap_age.ts +175 -0
- package/src/agent-src/scripts/update_roadmap_progress.ts +10 -2
- package/src/agent-src/templates/AGENTS.md +1 -1
- package/src/agent-src/templates/scripts/check_memory.ts +2 -2
- package/src/agent-src/templates/scripts/historical-bug-patterns.example.yml +13 -1
- package/src/agent-src/templates/scripts/work_engine/cli.ts +17 -0
- package/src/agent-src/templates/scripts/work_engine/cli_args.ts +10 -0
- package/src/agent-src/templates/scripts/work_engine/directives/ui/scaffold.ts +22 -13
- package/src/agent-src/templates/scripts/work_engine/dispatcher.ts +18 -4
- package/src/agent-src/templates/scripts/work_engine/procedure/checks.ts +283 -0
- package/src/agent-src/templates/scripts/work_engine/procedure/run.ts +432 -0
- package/src/agent-src/templates/scripts/work_engine/procedure/sidecar.ts +185 -0
- package/src/agent-src/templates/scripts/work_engine/state.ts +3 -0
- package/src/config/agent-settings.template.yml +120 -57
- package/src/config/agents-paths.yml +13 -7
- package/src/config/ci-local-parity.yml +44 -0
- package/src/config/continuity-surface.json +51 -2
- package/src/config/depth-audit-samples.json +5 -0
- package/src/config/discovery/command-verbs.yml +1 -0
- package/src/config/dispatch-economy-metrics.json +1 -0
- package/src/config/egress-mutations/class-precedence-swapped.json +7 -0
- package/src/config/egress-mutations/credential-token-restores.json +7 -0
- package/src/config/egress-mutations/iban-checksum-disabled.json +7 -0
- package/src/config/egress-mutations/raw-value-in-the-count-record.json +7 -0
- package/src/config/evaluator-budgets.json +4 -4
- package/src/config/gate-coverage.yml +149 -3
- package/src/config/gate-reachability-exemptions.json +3 -5
- package/src/config/gate-violation-baselines.json +26 -22
- package/src/config/gitignore-block.txt +6 -3
- package/src/config/hook-bundle-budget.json +34 -3
- package/src/config/hook-carrier-probes.json +30 -0
- package/src/config/hook-latency-budget.json +4 -2
- package/src/config/host-injection-effect.json +8 -1
- package/src/config/host-skill-frontmatter-keys.json +56 -0
- package/src/config/layer-form-brakes.json +4 -0
- package/src/config/layer-form-comparison-corpus.json +42 -0
- package/src/config/loop-surfaces.yaml +28 -47
- package/src/config/memory-twin-verdicts.yml +9 -1
- package/src/config/metric-registry.yml +40 -3
- package/src/config/pack-size-budget.json +15 -0
- package/src/config/procedure-core-budget.json +21 -0
- package/src/config/profiles/minimal.ini +1 -1
- package/src/config/project-tree-form.json +24 -0
- package/src/config/reach-channels.yml +3 -3
- package/src/config/reach-prescriptions-intake.yml +1 -1
- package/src/config/roadmap-step-size-baseline.json +118 -0
- package/src/config/routing-coverage-seed.json +93 -2
- package/src/config/skill-body-budget.json +686 -0
- package/src/config/skill-fork-pilot.json +17 -0
- package/src/config/skill-lifecycle-probes-codex.json +57 -0
- package/src/config/skill-lifecycle-probes.json +57 -0
- package/src/config/skill-output-shape.json +316 -0
- package/src/config/step-depth-table.json +58 -0
- package/src/config/turnaround-budget.json +90 -0
- package/src/install/conflict.ts +38 -6
- package/src/install/conflictTracker.ts +126 -8
- package/src/install/detect.ts +3 -3
- package/src/install/hostPermissionsAdapter.ts +136 -0
- package/src/install/installThinLayer.ts +6 -1
- package/src/install/manifestFiles.ts +24 -0
- package/src/install/noGoDenyRows.ts +368 -0
- package/src/install/noGoRules.ts +438 -0
- package/src/install/ownershipLedger.ts +180 -0
- package/src/install/plan.ts +1 -1
- package/src/install/preflight.ts +42 -10
- package/src/install/preserve.ts +94 -12
- package/src/install/recordedOwnership.ts +121 -3
- package/src/install/rule_scope.ts +20 -3
- package/src/install/stagedRuntime.ts +528 -0
- package/src/install/toolsArg.ts +16 -0
- package/src/install/types.ts +23 -2
- package/src/install/userPin.ts +54 -0
- package/src/install/wizard-plan.ts +25 -4
- package/src/scripts/_cli/_doctor_emit.ts +24 -0
- package/src/scripts/_cli/cmd_brand_status.ts +223 -12
- package/src/scripts/_cli/cmd_ci_settle.ts +32 -0
- package/src/scripts/_cli/cmd_doctor.ts +23 -44
- package/src/scripts/_cli/cmd_route_explain.ts +176 -2
- package/src/scripts/_cli/cmd_uninstall.ts +270 -26
- package/src/scripts/_cli/cmd_update.ts +34 -1
- package/src/scripts/_cli/cmd_upgrade.ts +38 -2
- package/src/scripts/_cli/detection_report.ts +7 -0
- package/src/scripts/_cli/doctor_execution.ts +1 -2
- package/src/scripts/_cli/doctor_install_mode.ts +39 -0
- package/src/scripts/_cli/doctor_network_posture.ts +3 -3
- package/src/scripts/_cli/doctor_ownership_ledger.ts +126 -0
- package/src/scripts/_cli/doctor_update_verdict.ts +104 -0
- package/src/scripts/_cli/explain_last/scrubber.ts +9 -21
- package/src/scripts/_cli/upgrade_unattended.ts +548 -0
- package/src/scripts/_dispatch.bash +42 -9
- package/src/scripts/_lib/activation_ladder.ts +1 -1
- package/src/scripts/_lib/advisory_inventory.ts +405 -0
- package/src/scripts/_lib/advisory_notice.ts +270 -0
- package/src/scripts/_lib/advisory_sources.ts +752 -0
- package/src/scripts/_lib/advisory_verdicts.ts +363 -0
- package/src/scripts/_lib/agent_artifact_location.ts +177 -0
- package/src/scripts/_lib/agent_settings.ts +7 -12
- package/src/scripts/_lib/arrival_record.ts +217 -0
- package/src/scripts/_lib/asset_render_record.ts +247 -0
- package/src/scripts/_lib/billing_grant.ts +4 -2
- package/src/scripts/_lib/brand_voice_slot.ts +258 -0
- package/src/scripts/_lib/canary_status.ts +24 -0
- package/src/scripts/_lib/cc_transcript.ts +276 -0
- package/src/scripts/_lib/changelog_eras.ts +83 -0
- package/src/scripts/_lib/claim_phrases.ts +71 -0
- package/src/scripts/_lib/classify_update.ts +171 -0
- package/src/scripts/_lib/claude_builtin_names.ts +9 -4
- package/src/scripts/_lib/claude_hook_scope.ts +195 -0
- package/src/scripts/_lib/claude_settings_hooks.ts +118 -34
- package/src/scripts/_lib/codex_resident_set.ts +460 -0
- package/src/scripts/_lib/codex_skill_finder.ts +225 -0
- package/src/scripts/_lib/confusables.ts +19 -0
- package/src/scripts/_lib/consumer_impact.ts +199 -0
- package/src/scripts/_lib/content_class.ts +127 -0
- package/src/scripts/_lib/counted_probe.ts +68 -1
- package/src/scripts/_lib/credential_deny_rows.ts +151 -0
- package/src/scripts/_lib/credential_files.ts +367 -0
- package/src/scripts/_lib/delivery_arm_experiment.ts +2 -2
- package/src/scripts/_lib/depth_flip.ts +141 -0
- package/src/scripts/_lib/design_lock.ts +117 -0
- package/src/scripts/_lib/design_sync_ledger.ts +142 -0
- package/src/scripts/_lib/design_sync_plan.ts +177 -0
- package/src/scripts/_lib/design_sync_reconcile.ts +159 -0
- package/src/scripts/_lib/design_sync_verify.ts +99 -0
- package/src/scripts/_lib/design_system_claude_design.ts +323 -0
- package/src/scripts/_lib/design_system_import.ts +84 -6
- package/src/scripts/_lib/dispatch_import_closure.ts +42 -11
- package/src/scripts/_lib/egress_credential_env.ts +35 -0
- package/src/scripts/_lib/egress_engine.ts +22 -0
- package/src/scripts/_lib/egress_known_values.ts +223 -0
- package/src/scripts/_lib/egress_normalize.ts +67 -0
- package/src/scripts/_lib/egress_prefixes.ts +42 -0
- package/src/scripts/_lib/egress_rules.ts +896 -0
- package/src/scripts/_lib/egress_rules_linearity.ts +56 -0
- package/src/scripts/_lib/egress_sender_scan.ts +290 -0
- package/src/scripts/_lib/egress_session_table.ts +510 -0
- package/src/scripts/_lib/egress_text.ts +63 -0
- package/src/scripts/_lib/egress_token.ts +252 -0
- package/src/scripts/_lib/empty_cycles.ts +1 -1
- package/src/scripts/_lib/environment_detector.ts +45 -30
- package/src/scripts/_lib/exemption_shape.ts +75 -1
- package/src/scripts/_lib/floor_posture.ts +185 -0
- package/src/scripts/_lib/forge_protection.ts +140 -2
- package/src/scripts/_lib/global_deploy_inventory.ts +159 -6
- package/src/scripts/_lib/guidelines_lane.ts +12 -1
- package/src/scripts/_lib/hand_kinds.ts +65 -0
- package/src/scripts/_lib/headless_invocation.ts +3 -3
- package/src/scripts/_lib/host_capability.ts +34 -2
- package/src/scripts/_lib/host_env_write.ts +39 -18
- package/src/scripts/_lib/host_listing_model.ts +14 -7
- package/src/scripts/_lib/identifier_redaction.ts +26 -0
- package/src/scripts/_lib/impact_bump.ts +70 -0
- package/src/scripts/_lib/install_reach_checks.ts +53 -1
- package/src/scripts/_lib/installed_layer.ts +31 -0
- package/src/scripts/_lib/installed_layer_normalise.ts +75 -0
- package/src/scripts/_lib/instructions_loaded_classify.ts +75 -0
- package/src/scripts/_lib/instructions_loaded_event.ts +53 -0
- package/src/scripts/_lib/knowledge_global_redaction.ts +2 -2
- package/src/scripts/_lib/layer_form_corpus.ts +165 -0
- package/src/scripts/_lib/layer_form_decision.ts +248 -0
- package/src/scripts/_lib/layer_form_evidence.ts +112 -0
- package/src/scripts/_lib/lean_projection_mode.ts +32 -161
- package/src/scripts/_lib/llm_proposer_transport.ts +1 -0
- package/src/scripts/_lib/loop_guards.ts +8 -120
- package/src/scripts/_lib/major_surface.ts +207 -0
- package/src/scripts/_lib/mcp_bridge.ts +30 -69
- package/src/scripts/_lib/merge_clearance_record.ts +384 -0
- package/src/scripts/_lib/neighbour_census.ts +18 -1
- package/src/scripts/_lib/orchestration_record.ts +61 -0
- package/src/scripts/_lib/outcome_vocabularies.ts +15 -23
- package/src/scripts/_lib/pin_advice.ts +49 -0
- package/src/scripts/_lib/platform_anchor.ts +222 -0
- package/src/scripts/_lib/procedure_checks.ts +5 -0
- package/src/scripts/_lib/project_tree_form.ts +134 -0
- package/src/scripts/_lib/projection_key_migration.ts +122 -0
- package/src/scripts/_lib/prompt_shape.ts +13 -2
- package/src/scripts/_lib/provenance_verify.ts +272 -0
- package/src/scripts/_lib/quota_parked.ts +27 -1
- package/src/scripts/_lib/ratification_artifact.ts +64 -1
- package/src/scripts/_lib/ratification_subject.ts +508 -46
- package/src/scripts/_lib/release_findings_ingest.ts +52 -5
- package/src/scripts/_lib/release_highlights.ts +72 -2
- package/src/scripts/_lib/release_settings_surface.ts +392 -0
- package/src/scripts/_lib/review_round.ts +134 -0
- package/src/scripts/_lib/roadmap_checkboxes.ts +1 -1
- package/src/scripts/_lib/roadmap_slug_lock.ts +254 -0
- package/src/scripts/_lib/roadmap_step_size.ts +75 -0
- package/src/scripts/_lib/run_checkpoint.ts +60 -3
- package/src/scripts/_lib/runtime_wiring_checks.ts +15 -1
- package/src/scripts/_lib/scope_guard.sh +64 -5
- package/src/scripts/_lib/scoped_projection.ts +136 -3
- package/src/scripts/_lib/secret_detector.ts +24 -103
- package/src/scripts/_lib/security_fix.ts +429 -0
- package/src/scripts/_lib/security_fix_context.ts +133 -0
- package/src/scripts/_lib/self_repair.ts +69 -39
- package/src/scripts/_lib/self_repair_outgoing.ts +209 -0
- package/src/scripts/_lib/self_repair_payload.ts +86 -0
- package/src/scripts/_lib/session_eol.ts +3 -0
- package/src/scripts/_lib/session_pr_watch.ts +207 -0
- package/src/scripts/_lib/session_register.ts +51 -1
- package/src/scripts/_lib/session_tag.ts +51 -0
- package/src/scripts/_lib/settings_removed_keys.ts +30 -0
- package/src/scripts/_lib/settings_renamed_keys.ts +19 -5
- package/src/scripts/_lib/skill_catalogue.ts +66 -25
- package/src/scripts/_lib/skill_fork_pilot.ts +121 -0
- package/src/scripts/_lib/skill_leases.ts +203 -0
- package/src/scripts/_lib/skill_listing_overrides.ts +294 -0
- package/src/scripts/_lib/skill_materialisation.ts +388 -0
- package/src/scripts/_lib/skill_materialisation_gate.ts +210 -0
- package/src/scripts/_lib/skill_materialisation_lock.ts +149 -0
- package/src/scripts/_lib/skill_materialisation_triggers.ts +96 -0
- package/src/scripts/_lib/skill_origin.ts +21 -1
- package/src/scripts/_lib/skill_reach.ts +342 -0
- package/src/scripts/_lib/source_shape.ts +7 -2
- package/src/scripts/_lib/sqlite_guard.ts +1 -1
- package/src/scripts/_lib/step_anatomy.ts +330 -0
- package/src/scripts/_lib/subagent_capsule.ts +8 -2
- package/src/scripts/_lib/subagent_native_fields.ts +30 -0
- package/src/scripts/_lib/subagent_spawn.ts +36 -0
- package/src/scripts/_lib/subagent_steering.ts +367 -0
- package/src/scripts/_lib/svg_filled_counter.ts +287 -0
- package/src/scripts/_lib/svg_rules.ts +2 -0
- package/src/scripts/_lib/test_delta.ts +89 -6
- package/src/scripts/_lib/tier_downshift_verdict.ts +222 -0
- package/src/scripts/_lib/tool_result_census.ts +62 -0
- package/src/scripts/_lib/trigger_routers.ts +1 -0
- package/src/scripts/_lib/turnaround_throughput.ts +378 -0
- package/src/scripts/_lib/ui_surface.ts +22 -0
- package/src/scripts/_lib/unattended_gates.ts +100 -0
- package/src/scripts/_lib/undeployed_fixes.ts +34 -0
- package/src/scripts/_lib/update_check.ts +143 -12
- package/src/scripts/_lib/update_invite.ts +116 -0
- package/src/scripts/_lib/update_notice.ts +259 -0
- package/src/scripts/_lib/verify_clause.ts +4 -2
- package/src/scripts/_lib/version_order.ts +146 -0
- package/src/scripts/_lib/worker_reuse.ts +191 -0
- package/src/scripts/_lib/workspace_secrets.ts +273 -0
- package/src/scripts/_lib/worktree_git.ts +67 -0
- package/src/scripts/_lib/worktree_ignored.ts +116 -0
- package/src/scripts/adoption_status.ts +330 -3
- package/src/scripts/adr_cite_check.ts +93 -0
- package/src/scripts/advisories.ts +803 -0
- package/src/scripts/ai-image/adapters/flux.sh +1 -0
- package/src/scripts/ai-image/adapters/gemini-image.sh +1 -0
- package/src/scripts/ai-image/adapters/ideogram.sh +1 -0
- package/src/scripts/ai-image/adapters/recraft.sh +1 -0
- package/src/scripts/ai-video/adapters/comfyui.sh +1 -0
- package/src/scripts/ai-video/adapters/fal.sh +1 -0
- package/src/scripts/ai-video/adapters/gemini-veo.sh +1 -0
- package/src/scripts/ai-video/adapters/higgsfield.sh +1 -0
- package/src/scripts/ai-video/adapters/kling.sh +1 -0
- package/src/scripts/ai-video/adapters/musetalk.sh +1 -0
- package/src/scripts/ai-video/adapters/openai-images.sh +1 -0
- package/src/scripts/ai-video/adapters/replicate.sh +1 -0
- package/src/scripts/ai-video/adapters/sora.sh +1 -0
- package/src/scripts/ai-video/adapters/syncso.sh +1 -0
- package/src/scripts/ai-video/stitch.sh +115 -2
- package/src/scripts/ai_council/airgap.ts +1 -0
- package/src/scripts/ai_council/api_transport.ts +27 -4
- package/src/scripts/ai_council/budget_guard.ts +300 -11
- package/src/scripts/ai_council/bundler.ts +20 -29
- package/src/scripts/ai_council/chairman.ts +17 -2
- package/src/scripts/ai_council/cli_agency_bounds.ts +158 -0
- package/src/scripts/ai_council/cli_launch_env.ts +54 -0
- package/src/scripts/ai_council/cli_least_agency_canary.ts +18 -2
- package/src/scripts/ai_council/clients.ts +55 -73
- package/src/scripts/ai_council/config.ts +16 -22
- package/src/scripts/ai_council/council_egress.ts +167 -0
- package/src/scripts/ai_council/exposure_ledger.ts +117 -0
- package/src/scripts/ai_council/free_hand_shadow.ts +276 -0
- package/src/scripts/ai_council/free_route.ts +216 -0
- package/src/scripts/ai_council/free_route_catalog.ts +173 -0
- package/src/scripts/ai_council/free_route_client.ts +95 -0
- package/src/scripts/ai_council/free_rung.ts +61 -0
- package/src/scripts/ai_council/hand_payload.ts +230 -0
- package/src/scripts/ai_council/hand_schemas.ts +123 -0
- package/src/scripts/ai_council/jury_aggregate.ts +155 -1
- package/src/scripts/ai_council/kind_flip.ts +221 -0
- package/src/scripts/ai_council/kind_flip_state.ts +19 -0
- package/src/scripts/ai_council/learn_low_impact_preview.ts +50 -22
- package/src/scripts/ai_council/modification_review.ts +98 -5
- package/src/scripts/ai_council/necessity.ts +7 -0
- package/src/scripts/ai_council/orchestrator.ts +16 -16
- package/src/scripts/ai_council/pricing.ts +10 -0
- package/src/scripts/ai_council/redact_low_impact_entry.ts +5 -2
- package/src/scripts/ai_council/response_render.ts +27 -4
- package/src/scripts/ai_council/round_reservations.ts +119 -0
- package/src/scripts/ai_council/route_chooser.ts +161 -0
- package/src/scripts/ai_council/route_liveness.ts +152 -0
- package/src/scripts/ai_council/route_member.ts +52 -0
- package/src/scripts/ai_council/seat_policy.ts +40 -0
- package/src/scripts/ai_council/seat_resume.ts +40 -0
- package/src/scripts/ai_council/shadow_dispatch.ts +13 -3
- package/src/scripts/ai_council/spend_gate.ts +18 -2
- package/src/scripts/ai_council/status_surface.ts +37 -0
- package/src/scripts/ai_council/transport_resolver.ts +15 -18
- package/src/scripts/analysis_analysts.ts +226 -0
- package/src/scripts/analysis_anchors.ts +140 -0
- package/src/scripts/analysis_and_optimize.ts +44 -0
- package/src/scripts/analysis_emit.ts +150 -0
- package/src/scripts/analysis_exchange.ts +186 -0
- package/src/scripts/analysis_gate.ts +158 -0
- package/src/scripts/analysis_inbox_final.ts +173 -0
- package/src/scripts/analysis_ledger.ts +119 -0
- package/src/scripts/analysis_pr_optimize.ts +219 -0
- package/src/scripts/analysis_pr_review.ts +240 -0
- package/src/scripts/analysis_pr_target.ts +121 -0
- package/src/scripts/analysis_prompts.ts +130 -0
- package/src/scripts/analysis_publish.ts +358 -0
- package/src/scripts/analysis_questions.ts +78 -0
- package/src/scripts/analysis_run.ts +248 -0
- package/src/scripts/analysis_run_record.ts +210 -0
- package/src/scripts/analysis_target.ts +343 -0
- package/src/scripts/analysis_validate.ts +161 -0
- package/src/scripts/anchor_eval_falsify.ts +1 -1
- package/src/scripts/arrival_report.ts +115 -0
- package/src/scripts/ask_transport.ts +284 -35
- package/src/scripts/backfill_model_tier.ts +4 -5
- package/src/scripts/before_complete_hook.ts +48 -2
- package/src/scripts/bench_hook_latency.ts +3 -3
- package/src/scripts/bench_procedure_cursor.ts +440 -0
- package/src/scripts/bootstrap.sh +3 -3
- package/src/scripts/build_exit_code_register.ts +440 -0
- package/src/scripts/build_proof.ts +23 -1
- package/src/scripts/cache_realization_report.ts +155 -14
- package/src/scripts/canary_liveness.ts +117 -0
- package/src/scripts/chat_history.ts +12 -15
- package/src/scripts/check_account_surface.ts +318 -0
- package/src/scripts/check_agent_artifact_location.ts +17 -160
- package/src/scripts/check_bundle_path_leakage.ts +6 -0
- package/src/scripts/check_ci_local_parity.ts +21 -13
- package/src/scripts/check_claims.ts +77 -2
- package/src/scripts/check_completion_review.ts +34 -1
- package/src/scripts/check_concern_admissions.ts +41 -5
- package/src/scripts/check_consumer_scope_flip.ts +1 -1
- package/src/scripts/check_context_paths.ts +2 -0
- package/src/scripts/check_council_layout.ts +9 -0
- package/src/scripts/check_credential_spelling.ts +267 -0
- package/src/scripts/check_egress_mutations.ts +239 -0
- package/src/scripts/check_enforcement_coverage.ts +16 -3
- package/src/scripts/check_estate_count.ts +16 -1
- package/src/scripts/check_finding_dispositions.ts +147 -0
- package/src/scripts/check_gate_coverage.ts +123 -21
- package/src/scripts/check_gate_reachability.ts +16 -2
- package/src/scripts/check_generator_sync.ts +46 -0
- package/src/scripts/check_hook_bundle_composition.ts +139 -1
- package/src/scripts/check_host_docs_digest.ts +142 -5
- package/src/scripts/check_kernel_edit_ratified.ts +301 -76
- package/src/scripts/check_kernel_rule_bundle.ts +14 -10
- package/src/scripts/check_knowledge_cards.ts +83 -3
- package/src/scripts/check_memory.ts +13 -3
- package/src/scripts/check_pack_size.ts +1 -1
- package/src/scripts/check_permission_deny_syntax.ts +247 -0
- package/src/scripts/check_platform_anchor.ts +243 -0
- package/src/scripts/check_proposal.ts +183 -1
- package/src/scripts/check_reach_channels.ts +5 -3
- package/src/scripts/check_references.ts +5 -2
- package/src/scripts/check_release_manifest_content.ts +33 -0
- package/src/scripts/check_release_pr_shape.ts +5 -0
- package/src/scripts/check_rule_invariants.ts +9 -1
- package/src/scripts/check_skill_body_budget.ts +343 -0
- package/src/scripts/check_skill_requires.ts +137 -1
- package/src/scripts/check_step_receipts.ts +246 -0
- package/src/scripts/check_structural_breaking.ts +7 -1
- package/src/scripts/check_suppression_hygiene.ts +8 -0
- package/src/scripts/check_test_weakening.ts +14 -0
- package/src/scripts/check_token_quality_golden.ts +5 -1
- package/src/scripts/check_update_banner.ts +50 -3
- package/src/scripts/check_verify_expectation_delta.ts +2 -1
- package/src/scripts/check_voice_lexicon.ts +531 -0
- package/src/scripts/ci_os_attribution.ts +327 -0
- package/src/scripts/ci_platform_scope.ts +69 -0
- package/src/scripts/ci_settle.ts +4 -1
- package/src/scripts/ci_status.ts +0 -1
- package/src/scripts/ci_time_to_green.ts +748 -0
- package/src/scripts/classify_merge_risk.ts +407 -19
- package/src/scripts/code_graph/sqlite_store.ts +1 -1
- package/src/scripts/compile_trigger_evals.ts +353 -0
- package/src/scripts/condense.ts +25 -31
- package/src/scripts/consumer_matrix.ts +61 -3
- package/src/scripts/council_availability_hook.ts +12 -4
- package/src/scripts/council_cli.ts +48 -38
- package/src/scripts/cross_repo_retrieve.ts +9 -72
- package/src/scripts/design_lock.ts +106 -0
- package/src/scripts/design_slop_rules.ts +30 -0
- package/src/scripts/design_sync.ts +264 -0
- package/src/scripts/design_system_import.ts +30 -13
- package/src/scripts/dispatch_economy_report.ts +46 -1
- package/src/scripts/dispatch_r2_reviewer.ts +41 -5
- package/src/scripts/egress_canary.ts +166 -0
- package/src/scripts/egress_sender_census.ts +101 -0
- package/src/scripts/external_sources_denylist.json +94 -12
- package/src/scripts/generate_catalog.ts +6 -2
- package/src/scripts/generate_owned_digest.ts +163 -0
- package/src/scripts/generate_reference_toc.ts +143 -0
- package/src/scripts/generate_subagent_floor.ts +11 -1
- package/src/scripts/handoff_context_hook.ts +34 -0
- package/src/scripts/hook_carrier_census.ts +263 -0
- package/src/scripts/hook_chunks.d.mts +12 -0
- package/src/scripts/hook_chunks.mjs +114 -0
- package/src/scripts/hook_manifest.json +1 -1
- package/src/scripts/hook_manifest.yaml +65 -42
- package/src/scripts/hooks/block_config_weakening.ts +127 -3
- package/src/scripts/hooks/block_credential_reads.ts +165 -0
- package/src/scripts/hooks/block_no_verify.ts +47 -23
- package/src/scripts/hooks/block_speaking_inbox_dir.ts +38 -7
- package/src/scripts/hooks/category_a.ts +202 -25
- package/src/scripts/hooks/concern_failure_policy.ts +6 -6
- package/src/scripts/hooks/concern_registry.ts +31 -6
- package/src/scripts/hooks/concern_registry_types.ts +11 -0
- package/src/scripts/hooks/delegation_nudge_hook.ts +105 -15
- package/src/scripts/hooks/design_pass_hook.ts +42 -10
- package/src/scripts/hooks/dispatch_hook.ts +13 -12
- package/src/scripts/hooks/egress_engine_loader.ts +125 -0
- package/src/scripts/hooks/egress_stage.ts +440 -0
- package/src/scripts/hooks/hook_stdin.ts +29 -4
- package/src/scripts/hooks/host_docs_pages.ts +194 -0
- package/src/scripts/hooks/host_docs_pages.yaml +75 -0
- package/src/scripts/hooks/host_lowering.json +1 -1
- package/src/scripts/hooks/host_lowering.yaml +22 -21
- package/src/scripts/hooks/host_rate_marker_hook.ts +73 -0
- package/src/scripts/hooks/instructions_observer_hook.ts +170 -0
- package/src/scripts/hooks/interruption_ledger_hook.ts +1 -1
- package/src/scripts/hooks/lazy_concern.ts +148 -0
- package/src/scripts/hooks/orchestration_record_hook.ts +80 -2
- package/src/scripts/hooks/payload_stub.ts +16 -6
- package/src/scripts/hooks/permission_gate.ts +7 -7
- package/src/scripts/hooks/push_settle_hook.ts +32 -3
- package/src/scripts/hooks/replay_hook.ts +43 -0
- package/src/scripts/hooks/reread_guard_hook.ts +87 -10
- package/src/scripts/hooks/rtk_wrap_hook.ts +4 -3
- package/src/scripts/hooks/rule_inject_hook.ts +8 -1
- package/src/scripts/hooks/session_eol_hook.ts +48 -1
- package/src/scripts/hooks/source_first_gate_hook.ts +6 -8
- package/src/scripts/hooks/spawn_guard_shadow_hook.ts +203 -10
- package/src/scripts/hooks/state_io.ts +2 -2
- package/src/scripts/hooks/svg_obligation.ts +75 -19
- package/src/scripts/hooks/tool_result_bytes_hook.ts +14 -5
- package/src/scripts/hooks/turn_end_gate_hook.ts +1 -1
- package/src/scripts/hooks/ui_route_nudge_hook.ts +2 -12
- package/src/scripts/hooks_doctor.ts +31 -0
- package/src/scripts/hooks_status.ts +58 -3
- package/src/scripts/inbox_source_census.ts +74 -13
- package/src/scripts/install +25 -3
- package/src/scripts/install.ts +60 -91
- package/src/scripts/interruption_report.ts +11 -1
- package/src/scripts/layer_baseline_report.ts +267 -0
- package/src/scripts/learning_sidecar.ts +1 -1
- package/src/scripts/lint_agents_layout.ts +3 -0
- package/src/scripts/lint_blocker_citations.ts +104 -0
- package/src/scripts/lint_breaking_changes_index.ts +40 -7
- package/src/scripts/lint_consolidation_lineage.ts +144 -16
- package/src/scripts/lint_consumer_internal_refs.ts +90 -42
- package/src/scripts/lint_context_spine_usage.ts +21 -0
- package/src/scripts/lint_design_antipattern_parity.ts +39 -7
- package/src/scripts/lint_evidence_artifacts.ts +31 -0
- package/src/scripts/lint_example_fences.ts +11 -2
- package/src/scripts/lint_ghostwriter_source.ts +42 -10
- package/src/scripts/lint_hook_manifest.ts +94 -0
- package/src/scripts/lint_marketplace_install_completeness.ts +4 -0
- package/src/scripts/lint_mcp_config_security.ts +9 -11
- package/src/scripts/lint_plan_risk_register.ts +28 -1
- package/src/scripts/lint_positioning.ts +4 -4
- package/src/scripts/lint_provenance.ts +1 -0
- package/src/scripts/lint_roadmap_blockers.ts +65 -4
- package/src/scripts/lint_roadmap_complexity.ts +98 -0
- package/src/scripts/lint_skill_link_reach.ts +251 -9
- package/src/scripts/lint_skill_procedures.ts +252 -0
- package/src/scripts/lint_skill_scripts_readonly.ts +12 -1
- package/src/scripts/lint_subagent_determinism.ts +14 -1
- package/src/scripts/lint_ticked_unmet_criteria.ts +300 -21
- package/src/scripts/mcp_registry_submit.sh +2 -2
- package/src/scripts/mcp_server/consumer_tool_catalog.json +4 -4
- package/src/scripts/mcp_server/suggest_skill.ts +89 -4
- package/src/scripts/mcp_server/tools.ts +2 -33
- package/src/scripts/measure_skill_ranker_baseline.ts +203 -5
- package/src/scripts/measure_turn_end_gate.ts +61 -1
- package/src/scripts/merge_clearance.ts +225 -0
- package/src/scripts/migrate_command_suggestions.ts +1 -1
- package/src/scripts/network_sources.ts +236 -0
- package/src/scripts/no_go_deny_rows.ts +225 -0
- package/src/scripts/orchestration_record.ts +15 -2
- package/src/scripts/plan_test_shards.ts +103 -0
- package/src/scripts/pr_url_reminder_hook.ts +10 -0
- package/src/scripts/print_required_checks.ts +5 -5
- package/src/scripts/probe_depth_shadow.ts +406 -0
- package/src/scripts/probe_turnaround.ts +342 -10
- package/src/scripts/ratification_subject.ts +176 -0
- package/src/scripts/rdp_gate_classify.ts +1 -0
- package/src/scripts/rdp_quality_eval.ts +1 -0
- package/src/scripts/release.ts +26 -55
- package/src/scripts/release_drill.ts +52 -23
- package/src/scripts/release_env.ts +37 -0
- package/src/scripts/release_publication.ts +11 -1
- package/src/scripts/report_consumer_gate_reach.ts +233 -0
- package/src/scripts/report_merge_gate_load.ts +295 -0
- package/src/scripts/report_project_contract.ts +123 -0
- package/src/scripts/report_reducible_classes.ts +342 -0
- package/src/scripts/report_required_checks_drift.ts +5 -3
- package/src/scripts/report_skill_host_census.ts +199 -0
- package/src/scripts/report_standing_payload_by_host.ts +7 -7
- package/src/scripts/retro.ts +758 -0
- package/src/scripts/retro_facts.ts +575 -0
- package/src/scripts/retro_queue.ts +739 -0
- package/src/scripts/retro_session_facts.ts +218 -0
- package/src/scripts/retro_sweep.ts +493 -0
- package/src/scripts/retro_triage.ts +126 -0
- package/src/scripts/roadmap_context.ts +2 -2
- package/src/scripts/roadmap_drain_queue.ts +601 -0
- package/src/scripts/run_supervise.ts +24 -2
- package/src/scripts/schemas/agent-settings.schema.json +0 -16
- package/src/scripts/schemas/command.schema.json +3 -3
- package/src/scripts/schemas/review-findings.schema.json +8 -0
- package/src/scripts/schemas/skill.schema.json +7 -6
- package/src/scripts/schemas/subagent.schema.json +33 -2
- package/src/scripts/score_skill_selection.ts +5 -2
- package/src/scripts/second_brain_retrieval.ts +1 -0
- package/src/scripts/second_brain_run.ts +1 -0
- package/src/scripts/self_repair_cli.ts +563 -87
- package/src/scripts/self_review_gate.ts +59 -4
- package/src/scripts/session_register_hook.ts +91 -4
- package/src/scripts/sessions_cli.ts +100 -5
- package/src/scripts/skill_collision_clusters.ts +1 -1
- package/src/scripts/skill_tools/score_skill_relevance.ts +31 -2
- package/src/scripts/skill_trigger_eval.ts +4 -2
- package/src/scripts/source_adapters.ts +183 -0
- package/src/scripts/step_receipt.ts +100 -0
- package/src/scripts/sync_pr_branch.ts +4 -0
- package/src/scripts/test_council_qualification.ts +1 -1
- package/src/scripts/trigger_eval_grandfather.json +3 -49
- package/src/scripts/trigger_eval_rotation.ts +31 -3
- package/src/scripts/ui_conformance_probe.ts +405 -1
- package/src/scripts/update_counts.ts +230 -11
- package/src/scripts/update_invite_hook.ts +245 -0
- package/src/scripts/update_notice_hook.ts +298 -0
- package/src/scripts/validate_frontmatter.ts +85 -0
- package/src/scripts/worker_reuse_shadow_report.ts +121 -0
- package/src/scripts/worktree_cleanup_check.ts +915 -121
- package/src/server/io/yamlIO.ts +2 -2
- package/src/server/schemas/settings.ts +37 -23
- package/src/shared/brandTokenDocument.ts +46 -0
- package/src/shared/brandTokenPaths.ts +43 -0
- package/src/shared/settingsCarveOut.ts +0 -8
- package/src/shared/skillRanking.ts +106 -5
- package/src/shared/userMd/formAdapter.ts +15 -1
- package/src/shared/userMd/schema.ts +22 -0
- package/src/templates/agent-user.md +4 -0
- package/src/templates/agent-user.yml +4 -0
- package/dist/cli-delegate/chunk-4DBG5K7M.js +0 -1123
- package/dist/cli-delegate/chunk-523HCFYO.js +0 -90
- package/dist/cli-delegate/chunk-AL3RZ22D.js +0 -74
- package/dist/cli-delegate/chunk-KB5FZ655.js +0 -208
- package/dist/cli-delegate/chunk-MDPPKQCQ.js +0 -875
- package/dist/cli-delegate/chunk-OAFSJBHH.js +0 -272
- package/dist/ui/assets/index-C3djEJah.js +0 -23
- package/src/scripts/_lib/continuation_ladder.ts +0 -335
- package/src/scripts/hooks/run_continuation_hook.ts +0 -1524
|
@@ -117,6 +117,32 @@ const PUBLISH_SURFACES = [
|
|
|
117
117
|
'.claude-plugin/marketplace.json',
|
|
118
118
|
];
|
|
119
119
|
|
|
120
|
+
/**
|
|
121
|
+
* Trees whose files justify parked or refused work. A retired phrasing there is
|
|
122
|
+
* a rationale resting on a property the package no longer claims, so it is
|
|
123
|
+
* read like a publish surface; the archive is history and is not.
|
|
124
|
+
*/
|
|
125
|
+
const RATIONALE_DIRS = ['agents/roadmaps/later', 'agents/roadmaps/stubs', 'agents/settings/contexts'];
|
|
126
|
+
|
|
127
|
+
function rationaleFiles(): string[] {
|
|
128
|
+
const out: string[] = [];
|
|
129
|
+
const walk = (rel: string): void => {
|
|
130
|
+
let entries: fs.Dirent[];
|
|
131
|
+
try {
|
|
132
|
+
entries = fs.readdirSync(path.join(REPO, rel), { withFileTypes: true });
|
|
133
|
+
} catch {
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
for (const e of entries) {
|
|
137
|
+
const child = `${rel}/${e.name}`;
|
|
138
|
+
if (e.isDirectory()) walk(child);
|
|
139
|
+
else if (e.isFile() && e.name.endsWith('.md')) out.push(child);
|
|
140
|
+
}
|
|
141
|
+
};
|
|
142
|
+
for (const d of RATIONALE_DIRS) walk(d);
|
|
143
|
+
return out.sort();
|
|
144
|
+
}
|
|
145
|
+
|
|
120
146
|
/** The sentinel `retires_phrasings` value for a claim that never left the ledger. */
|
|
121
147
|
const NEVER_PUBLISHED = 'never-published';
|
|
122
148
|
|
|
@@ -377,6 +403,17 @@ export interface LedgerEntry {
|
|
|
377
403
|
* on legitimate prose and is muted within a release.
|
|
378
404
|
*/
|
|
379
405
|
retires_phrasings: string;
|
|
406
|
+
/**
|
|
407
|
+
* REQUIRED on a `measured-in-repo` entry, forbidden elsewhere: the
|
|
408
|
+
* consumer-side evidence that would promote the row to `backed`.
|
|
409
|
+
*
|
|
410
|
+
* A finished bench or fixture reading of a consumer-facing mechanism, taken
|
|
411
|
+
* in the maintainer tree, is neither `backed` (nothing ran where the
|
|
412
|
+
* consumer stands) nor `unbacked` (the reading is finished, not owed).
|
|
413
|
+
* Without a named closure path the status is the dumping ground the ledger
|
|
414
|
+
* warns about, so the field is required rather than optional.
|
|
415
|
+
*/
|
|
416
|
+
promotion_evidence: string;
|
|
380
417
|
/**
|
|
381
418
|
* Whether the `- retires_phrasings:` LINE exists at all, independent of
|
|
382
419
|
* whether it carries a value.
|
|
@@ -438,6 +475,7 @@ function load_ledger(): Map<string, LedgerEntry> {
|
|
|
438
475
|
measured_on: cur.measured_on ?? '',
|
|
439
476
|
non_inference: cur.non_inference ?? '',
|
|
440
477
|
retires_phrasings: cur.retires_phrasings ?? '',
|
|
478
|
+
promotion_evidence: cur.promotion_evidence ?? '',
|
|
441
479
|
retires_phrasings_present: cur.retires_phrasings_present ?? false,
|
|
442
480
|
});
|
|
443
481
|
}
|
|
@@ -456,7 +494,7 @@ function load_ledger(): Map<string, LedgerEntry> {
|
|
|
456
494
|
// would have silently ignored the second and dropped whichever field
|
|
457
495
|
// came from the other branch. One union, both fields.
|
|
458
496
|
const field = line.match(
|
|
459
|
-
/^-\s+(claim|kind|evidence|status|last_verified|superseded_by|retired_by|measured_on|non_inference|retires_phrasings):\s*(.*)$/,
|
|
497
|
+
/^-\s+(claim|kind|evidence|status|last_verified|superseded_by|retired_by|measured_on|non_inference|retires_phrasings|promotion_evidence):\s*(.*)$/,
|
|
460
498
|
);
|
|
461
499
|
if (field) {
|
|
462
500
|
const key = field[1] as keyof LedgerEntry;
|
|
@@ -671,6 +709,42 @@ function main(argv: string[] = process.argv.slice(2)): number {
|
|
|
671
709
|
}
|
|
672
710
|
}
|
|
673
711
|
|
|
712
|
+
// 2c'. `measured-in-repo` — a finished in-repo reading of a consumer-facing
|
|
713
|
+
// mechanism. It may not carry a public marker (rule 1 already refuses
|
|
714
|
+
// every non-`backed` marker), and it must say what it measured on, keep
|
|
715
|
+
// a resolving report pointer, and name the consumer-side evidence that
|
|
716
|
+
// would promote it.
|
|
717
|
+
for (const entry of ledger.values()) {
|
|
718
|
+
if (entry.status !== 'measured-in-repo') {
|
|
719
|
+
if (entry.promotion_evidence) {
|
|
720
|
+
findings.push({
|
|
721
|
+
id: entry.id,
|
|
722
|
+
file: LEDGER_REL,
|
|
723
|
+
reason: `promotion_evidence is only meaningful on a measured-in-repo entry (status: ${entry.status || 'missing'})`,
|
|
724
|
+
});
|
|
725
|
+
}
|
|
726
|
+
continue;
|
|
727
|
+
}
|
|
728
|
+
if (entry.promotion_evidence.length < 20) {
|
|
729
|
+
findings.push({
|
|
730
|
+
id: entry.id,
|
|
731
|
+
file: LEDGER_REL,
|
|
732
|
+
reason: 'measured-in-repo entry names no `promotion_evidence` — the consumer-side evidence that would make it `backed`',
|
|
733
|
+
});
|
|
734
|
+
}
|
|
735
|
+
if (!entry.measured_on) {
|
|
736
|
+
findings.push({
|
|
737
|
+
id: entry.id,
|
|
738
|
+
file: LEDGER_REL,
|
|
739
|
+
reason: 'measured-in-repo entry names no `measured_on` — the tree, corpus or environment the reading was taken on',
|
|
740
|
+
});
|
|
741
|
+
}
|
|
742
|
+
const un = pointer_unresolved(entry.evidence);
|
|
743
|
+
if (un) {
|
|
744
|
+
findings.push({ id: entry.id, file: LEDGER_REL, reason: `measured-in-repo entry has dangling evidence — ${un}` });
|
|
745
|
+
}
|
|
746
|
+
}
|
|
747
|
+
|
|
674
748
|
// 2d. `retires_phrasings` — shape. A retirement that names no wording
|
|
675
749
|
// forbids no wording, and a wording too short to be specific forbids
|
|
676
750
|
// half the tree. Both are findings at any count; the COVERAGE question
|
|
@@ -777,10 +851,11 @@ function main(argv: string[] = process.argv.slice(2)): number {
|
|
|
777
851
|
});
|
|
778
852
|
}
|
|
779
853
|
}
|
|
854
|
+
const scanned = usableNeedles.size > 0 ? [...liveSurfaces, ...rationaleFiles()] : liveSurfaces;
|
|
780
855
|
for (const entry of ledger.values()) {
|
|
781
856
|
const phrasings = usableNeedles.get(entry.id);
|
|
782
857
|
if (phrasings === undefined) continue;
|
|
783
|
-
for (const rel of
|
|
858
|
+
for (const rel of scanned) {
|
|
784
859
|
const abs = path.join(REPO, rel);
|
|
785
860
|
const body = fs.readFileSync(abs, 'utf8').toLowerCase();
|
|
786
861
|
for (const ph of phrasings) {
|
|
@@ -52,6 +52,7 @@ import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
|
52
52
|
import { gitEnv } from './_lib/git_env.js';
|
|
53
53
|
import { splitMarkdownRow } from './_lib/md_table.js';
|
|
54
54
|
import { completionReviewDisabled } from './_lib/planning_settings.js';
|
|
55
|
+
import { REVIEW_ROUND_CAP, checkReviewRound, countReviewPasses, type RecordedPasses } from './_lib/review_round.js';
|
|
55
56
|
import { DeadScopeError, assertScanned } from './_lib/scan_scope.js';
|
|
56
57
|
import {
|
|
57
58
|
computeReviewScope,
|
|
@@ -62,6 +63,8 @@ import {
|
|
|
62
63
|
type ParsedManifest,
|
|
63
64
|
} from './dispatch_r2_reviewer.js';
|
|
64
65
|
|
|
66
|
+
export { REVIEW_ROUND_CAP };
|
|
67
|
+
|
|
65
68
|
// ---------------------------------------------------------------------------
|
|
66
69
|
// Types
|
|
67
70
|
// ---------------------------------------------------------------------------
|
|
@@ -107,6 +110,17 @@ export interface Marker {
|
|
|
107
110
|
* an attributable record instead of an absent one.
|
|
108
111
|
*/
|
|
109
112
|
promptHash?: string;
|
|
113
|
+
/**
|
|
114
|
+
* OPTIONAL — the review round this artefact records (≥ 1): the number of
|
|
115
|
+
* review passes its path records, this one included.
|
|
116
|
+
*
|
|
117
|
+
* A fix pass re-binds the same artefact in place (§ 2.5), so before this
|
|
118
|
+
* field the number of rounds was agent-carried convention and nothing could
|
|
119
|
+
* count it. Absent reads as round 1, so every committed v1 artefact is valid
|
|
120
|
+
* unchanged; once any version carries it, the header must match the derived
|
|
121
|
+
* count (`round-miscounted`), and the cap applies (`round-cap-exceeded`).
|
|
122
|
+
*/
|
|
123
|
+
round?: number;
|
|
110
124
|
}
|
|
111
125
|
|
|
112
126
|
export interface HonestNull {
|
|
@@ -325,7 +339,7 @@ export function isCodePath(p: string): boolean {
|
|
|
325
339
|
* `| author: …` follow it without being swallowed.
|
|
326
340
|
*/
|
|
327
341
|
const MARKER_RE =
|
|
328
|
-
/^<!--\s*completion-review:\s*v1\s*\|\s*reviewed:\s*(\d{4}-\d{2}-\d{2})\s*\|\s*scope:\s*([0-9a-fA-F]{64})\s*\|\s*diff:\s*([0-9a-fA-F]{7,40})\s*\|\s*reviewer:\s*(\S(?:[^|>]*[^|>\s])?)(?:\s*\|\s*author:\s*(\S(?:[^|>]*[^|>\s])?))?(?:\s*\|\s*prompt_hash:\s*([0-9a-fA-F]{64}))?\s*-->$/;
|
|
342
|
+
/^<!--\s*completion-review:\s*v1\s*\|\s*reviewed:\s*(\d{4}-\d{2}-\d{2})\s*\|\s*scope:\s*([0-9a-fA-F]{64})\s*\|\s*diff:\s*([0-9a-fA-F]{7,40})\s*\|\s*reviewer:\s*(\S(?:[^|>]*[^|>\s])?)(?:\s*\|\s*author:\s*(\S(?:[^|>]*[^|>\s])?))?(?:\s*\|\s*prompt_hash:\s*([0-9a-fA-F]{64}))?(?:\s*\|\s*round:\s*([1-9]\d*))?\s*-->$/;
|
|
329
343
|
|
|
330
344
|
export function parseMarkerLine(line: string): Marker | null {
|
|
331
345
|
const m = MARKER_RE.exec(line.trim());
|
|
@@ -344,6 +358,9 @@ export function parseMarkerLine(line: string): Marker | null {
|
|
|
344
358
|
if (m[6] !== undefined) {
|
|
345
359
|
marker.promptHash = m[6].toLowerCase();
|
|
346
360
|
}
|
|
361
|
+
if (m[7] !== undefined) {
|
|
362
|
+
marker.round = Number(m[7]);
|
|
363
|
+
}
|
|
347
364
|
return marker;
|
|
348
365
|
}
|
|
349
366
|
|
|
@@ -995,6 +1012,10 @@ function evaluate(input: EvalInput): Violation[] {
|
|
|
995
1012
|
detail: 'artifact has neither a findings table nor an honest-null / skip declaration line',
|
|
996
1013
|
});
|
|
997
1014
|
}
|
|
1015
|
+
if (art.marker !== null) {
|
|
1016
|
+
const rel = path.relative(repo, file).split(path.sep).join('/');
|
|
1017
|
+
violations.push(...checkReviewRound(repo, file, art.marker, art.rows, recordedReviewPasses(repo, rel)));
|
|
1018
|
+
}
|
|
998
1019
|
}
|
|
999
1020
|
|
|
1000
1021
|
if (relevant.length === 0) {
|
|
@@ -1030,6 +1051,18 @@ function evaluate(input: EvalInput): Violation[] {
|
|
|
1030
1051
|
return violations;
|
|
1031
1052
|
}
|
|
1032
1053
|
|
|
1054
|
+
/** Every review-artefact version committed at `rel`, read for {@link countReviewPasses}. */
|
|
1055
|
+
export function recordedReviewPasses(repo: string, rel: string): RecordedPasses {
|
|
1056
|
+
const log = gitTry(repo, ['log', '--format=%H', '--', rel]);
|
|
1057
|
+
const shas = log.stdout.split('\n').map((l) => l.trim()).filter(Boolean);
|
|
1058
|
+
return countReviewPasses(
|
|
1059
|
+
shas.map((sha) => {
|
|
1060
|
+
const shown = gitTry(repo, ['show', `${sha}:${rel}`]);
|
|
1061
|
+
return shown.ok ? parseArtifact(shown.stdout).marker : null;
|
|
1062
|
+
}),
|
|
1063
|
+
);
|
|
1064
|
+
}
|
|
1065
|
+
|
|
1033
1066
|
/** Contract §2.5 — the artifact's FIRST-add commit must precede every fix commit. */
|
|
1034
1067
|
function checkFindingsBeforeFixes(repo: string, artifactAbs: string, rows: readonly FindingRow[]): Violation[] {
|
|
1035
1068
|
const violations: Violation[] = [];
|
|
@@ -66,6 +66,16 @@ export const REQUIRED_ANSWERS = [
|
|
|
66
66
|
'per_event_budget_impact',
|
|
67
67
|
] as const;
|
|
68
68
|
|
|
69
|
+
/**
|
|
70
|
+
* Dispatcher stages that run like a concern but are not manifest keys, so the
|
|
71
|
+
* added-concern set difference cannot see them. Each needs a complete admitted
|
|
72
|
+
* row whenever its module exists — always, not only when newly added, because
|
|
73
|
+
* the list is closed and short and a stage has no grandfathered population.
|
|
74
|
+
*/
|
|
75
|
+
export const DISPATCHER_STAGES: readonly { id: string; source: string }[] = [
|
|
76
|
+
{ id: 'egress-stage', source: 'src/scripts/hooks/egress_stage.ts' },
|
|
77
|
+
];
|
|
78
|
+
|
|
69
79
|
export const DECISIONS = ['admitted', 'rejected'] as const;
|
|
70
80
|
export type Decision = (typeof DECISIONS)[number];
|
|
71
81
|
|
|
@@ -188,16 +198,18 @@ export function evaluate(root = REPO_ROOT, baseRef: string | null): Finding[] {
|
|
|
188
198
|
}
|
|
189
199
|
}
|
|
190
200
|
|
|
191
|
-
if (baseRef === null) return findings;
|
|
192
|
-
|
|
193
201
|
const admitted = new Map(rows.filter((r) => r.decision === 'admitted').map((r) => [r.concern, r]));
|
|
194
|
-
|
|
202
|
+
const stages = DISPATCHER_STAGES.filter((s) => fs.existsSync(path.join(root, s.source))).map((s) => s.id);
|
|
203
|
+
const required = baseRef === null ? stages : [...stages, ...addedConcerns(root, baseRef)];
|
|
204
|
+
for (const id of required) {
|
|
195
205
|
const row = admitted.get(id);
|
|
196
206
|
if (row === undefined) {
|
|
197
207
|
findings.push({
|
|
198
208
|
concern: id,
|
|
199
209
|
kind: 'missing_row',
|
|
200
|
-
message:
|
|
210
|
+
message: stages.includes(id)
|
|
211
|
+
? `dispatcher stage with no \`admitted\` row in ${LEDGER_REL}`
|
|
212
|
+
: `added since ${String(baseRef)} with no \`admitted\` row in ${LEDGER_REL}`,
|
|
201
213
|
});
|
|
202
214
|
continue;
|
|
203
215
|
}
|
|
@@ -248,7 +260,12 @@ function selfTest(): number {
|
|
|
248
260
|
const script = path.join('src', 'scripts', 'check_concern_admissions.ts');
|
|
249
261
|
|
|
250
262
|
/** A throwaway repo with a base commit and a working-tree change on top. */
|
|
251
|
-
const fixture = (opts: {
|
|
263
|
+
const fixture = (opts: {
|
|
264
|
+
base: readonly string[];
|
|
265
|
+
head: readonly string[];
|
|
266
|
+
ledger?: string;
|
|
267
|
+
files?: readonly string[];
|
|
268
|
+
}): number => {
|
|
252
269
|
const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'ca-selftest-'));
|
|
253
270
|
roots.push(dir);
|
|
254
271
|
const g = (...a: string[]): void => {
|
|
@@ -267,6 +284,7 @@ function selfTest(): number {
|
|
|
267
284
|
g('commit', '-q', '-m', 'base');
|
|
268
285
|
put(CONCERN_MANIFEST_POSIX, MANIFEST(opts.head));
|
|
269
286
|
if (opts.ledger !== undefined) put(LEDGER_REL, `${opts.ledger}\n`);
|
|
287
|
+
for (const rel of opts.files ?? []) put(rel, '');
|
|
270
288
|
// repoRoot locates tsx AND resolves the relative script path, so it is
|
|
271
289
|
// THIS checkout; cwd and --root are the fixture.
|
|
272
290
|
return runGateCli(REPO_ROOT, script, ['--base', 'main', '--root', dir], dir);
|
|
@@ -301,6 +319,24 @@ function selfTest(): number {
|
|
|
301
319
|
expect: 'reject',
|
|
302
320
|
run: () => fixture({ base: ['one', 'two'], head: ['one', 'two'], ledger: ROW('two', 'rejected') }),
|
|
303
321
|
},
|
|
322
|
+
{
|
|
323
|
+
// A dispatcher stage is not a manifest key, so the set difference
|
|
324
|
+
// cannot see it; its row is required whenever its module exists.
|
|
325
|
+
name: 'a dispatcher stage with no ledger row → reject',
|
|
326
|
+
expect: 'reject',
|
|
327
|
+
run: () => fixture({ base: ['one'], head: ['one'], files: [DISPATCHER_STAGES[0]!.source] }),
|
|
328
|
+
},
|
|
329
|
+
{
|
|
330
|
+
name: 'a dispatcher stage WITH a complete admitted row → accept',
|
|
331
|
+
expect: 'accept',
|
|
332
|
+
run: () =>
|
|
333
|
+
fixture({
|
|
334
|
+
base: ['one'],
|
|
335
|
+
head: ['one'],
|
|
336
|
+
files: [DISPATCHER_STAGES[0]!.source],
|
|
337
|
+
ledger: ROW(DISPATCHER_STAGES[0]!.id, 'admitted'),
|
|
338
|
+
}),
|
|
339
|
+
},
|
|
304
340
|
{
|
|
305
341
|
// The grandfathering, asserted rather than assumed: pre-existing
|
|
306
342
|
// concerns must never demand a row.
|
|
@@ -66,7 +66,7 @@ export function verify_flip(repoRoot = '.'): FlipVerdict {
|
|
|
66
66
|
const template = parseYaml(fs.readFileSync(path.join(repoRoot, TEMPLATE), 'utf-8')) as Record<string, unknown>;
|
|
67
67
|
const scope = ruleScopeFromSettings(template, repoRoot);
|
|
68
68
|
if (scope.workspaces === null) {
|
|
69
|
-
throw new Error('
|
|
69
|
+
throw new Error('the derived consumer workspace set is empty — packs.yml unreadable, nothing to verify');
|
|
70
70
|
}
|
|
71
71
|
const rulesDir = path.join(repoRoot, RULES_DIR);
|
|
72
72
|
const excluded = excludedRuleBasenames(rulesDir, scope);
|
|
@@ -32,6 +32,12 @@ const CANONICAL_DIRS: readonly string[] = [
|
|
|
32
32
|
];
|
|
33
33
|
// Top-level subdirectories exempt from the layout check.
|
|
34
34
|
const EXEMPT_DIR_PREFIXES = ['audits', 'runtime'] as const;
|
|
35
|
+
// Tracked evidence homes that may hold a council record deliberately kept as
|
|
36
|
+
// evidence (AI council 2026-10-14, 2/2): a narrow allowlist, never the whole of
|
|
37
|
+
// `evidence/`, because a retention class is not a placement licence.
|
|
38
|
+
const EVIDENCE_COUNCIL_DIRS: readonly string[] = ['evidence/council', 'evidence/audits'];
|
|
39
|
+
// A completion-review artefact is named after its branch slug.
|
|
40
|
+
const REVIEW_FINDINGS_RE = /^evidence\/reviews\/council-[a-z0-9-]+\.findings\.md$/;
|
|
35
41
|
// `council-` or `.council-` prefix (excludes `road-to-ai-council.md`).
|
|
36
42
|
const COUNCIL_PREFIX_RE = /^\.?council-/;
|
|
37
43
|
|
|
@@ -138,6 +144,9 @@ function find_violations(root: string): string[] {
|
|
|
138
144
|
if (EXEMPT_DIR_PREFIXES.some((d) => parts[0]!.startsWith(d))) {
|
|
139
145
|
continue;
|
|
140
146
|
}
|
|
147
|
+
if (EVIDENCE_COUNCIL_DIRS.some((d) => relPosix.startsWith(d + '/')) || REVIEW_FINDINGS_RE.test(relPosix)) {
|
|
148
|
+
continue;
|
|
149
|
+
}
|
|
141
150
|
findings.push(
|
|
142
151
|
`${_posix(p)}: council artefact in non-canonical directory ` +
|
|
143
152
|
`agents/${parts[0]}/ — only ` +
|
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
/**
|
|
3
|
+
* Within `src/scripts` and `src/cli`, the rule table is the only place a raw-key
|
|
4
|
+
* prefix is spelled. `src/server`, `src/shared`, `src/install`, skill scripts,
|
|
5
|
+
* test files and `fixtures/` directories are outside the scan.
|
|
6
|
+
*
|
|
7
|
+
* Every non-test TypeScript file under `src/scripts` and `src/cli` is read, from
|
|
8
|
+
* the filesystem rather than the index so a file not yet added is seen too; a
|
|
9
|
+
* code line outside `src/scripts/_lib/egress_rules.ts` (and its generated,
|
|
10
|
+
* equality-checked projection `egress_prefixes.ts`) that spells one of the
|
|
11
|
+
* table's declared prefixes at a token start fails. A second spelling is how the
|
|
12
|
+
* seven private copies of F2 drifted apart — one key shape caught by one
|
|
13
|
+
* consumer and passed unchanged by the next.
|
|
14
|
+
*
|
|
15
|
+
* What it sees: a prefix written as a literal, in a string or a regex, with
|
|
16
|
+
* backslash escapes removed first so `ya29\.` counts; a prefix spelled through a
|
|
17
|
+
* character class or an alternation (`gh[pousr]_`, `(sk|pk)-`) that expands to
|
|
18
|
+
* one of the table's prefixes; and a keyword-assignment shape — a credential
|
|
19
|
+
* keyword of the table's vocabulary and the `[:=]` operator class on one line
|
|
20
|
+
* (step 2.7). What it does not see: a shape assembled across lines, or a keyword
|
|
21
|
+
* spelled through a variable. A line that names a prefix in prose or as an inert
|
|
22
|
+
* fake value carries `not-a-credential-pattern: <reason>`; a bare marker does
|
|
23
|
+
* not mute.
|
|
24
|
+
*
|
|
25
|
+
* Exit: 0 one spelling · 1 a second spelling found.
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
import * as fs from 'node:fs';
|
|
29
|
+
import * as os from 'node:os';
|
|
30
|
+
import * as path from 'node:path';
|
|
31
|
+
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
32
|
+
|
|
33
|
+
import { CREDENTIAL_PREFIXES as PROJECTED } from './_lib/egress_prefixes.js';
|
|
34
|
+
import { ASSIGNMENT_KEYWORDS, CREDENTIAL_PREFIXES, EGRESS_RULES } from './_lib/egress_rules.js';
|
|
35
|
+
import { GateLedger } from './_lib/gate_ledger.js';
|
|
36
|
+
import { runGateCli, runSelfTest } from './_lib/gate_self_test.js';
|
|
37
|
+
import { reportScanned } from './_lib/scan_scope.js';
|
|
38
|
+
|
|
39
|
+
const GATE = 'check_credential_spelling';
|
|
40
|
+
const REPO_ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..', '..');
|
|
41
|
+
export const SCAN_DIRS: readonly string[] = ['src/scripts', 'src/cli'];
|
|
42
|
+
export const OWNER = 'src/scripts/_lib/egress_rules.ts';
|
|
43
|
+
/** The bundled projection of the table's prefix list, checked equal to it by its own test. */
|
|
44
|
+
export const PROJECTION = 'src/scripts/_lib/egress_prefixes.ts';
|
|
45
|
+
|
|
46
|
+
function walk(dir: string, out: string[]): void {
|
|
47
|
+
if (!fs.existsSync(dir)) return;
|
|
48
|
+
for (const e of fs.readdirSync(dir, { withFileTypes: true })) {
|
|
49
|
+
const p = path.join(dir, e.name);
|
|
50
|
+
if (e.isDirectory()) {
|
|
51
|
+
if (e.name === 'node_modules' || e.name === 'fixtures') continue;
|
|
52
|
+
walk(p, out);
|
|
53
|
+
} else if (/\.(ts|mts)$/.test(e.name) && !/\.(test|spec)\.ts$/.test(e.name)) {
|
|
54
|
+
out.push(p);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
const escapeRe = (s: string): string => s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
60
|
+
|
|
61
|
+
/** A prefix at a token start; `task-` does not spell `sk-`. */
|
|
62
|
+
function prefixSpelling(prefixes: readonly string[]): RegExp {
|
|
63
|
+
const alt = [...prefixes].sort((a, b) => b.length - a.length).map(escapeRe).join('|');
|
|
64
|
+
return new RegExp(`(?<![A-Za-z0-9])(?:${alt})`);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
const NOT_A_PATTERN = /not-a-credential-pattern: \S/;
|
|
68
|
+
|
|
69
|
+
// A quoted rule id names a row (`'xai-api-key'`); it is not a spelling of the
|
|
70
|
+
// prefix it happens to start with, so it is removed before the line is judged.
|
|
71
|
+
const RULE_ID = new RegExp(
|
|
72
|
+
`(['"\`])(?:${EGRESS_RULES.map((r) => escapeRe(r.rule)).join('|')})\\1`,
|
|
73
|
+
'g',
|
|
74
|
+
);
|
|
75
|
+
|
|
76
|
+
// One alternative of a class spelling: a stem with at most one character class.
|
|
77
|
+
const CLASS_ALT = /^([a-z_]{1,16})(?:\[([a-z]{1,16})\])?$/;
|
|
78
|
+
// What follows a class spelling: one separator, or a class of separators.
|
|
79
|
+
const SEPARATOR = /^(?:\[[-_]{1,2}\]|[-_])/;
|
|
80
|
+
const CLASS_GROUP = /\(([a-z_|[\]]{1,80})\)/g;
|
|
81
|
+
const BARE_CLASS = /(?<![A-Za-z0-9_(|])([a-z]{1,16})\[([a-z]{1,16})\]/g;
|
|
82
|
+
|
|
83
|
+
function expandAlt(alt: string): string[] {
|
|
84
|
+
const m = CLASS_ALT.exec(alt);
|
|
85
|
+
if (m === null) return [];
|
|
86
|
+
const stem = m[1] as string;
|
|
87
|
+
return m[2] === undefined ? [stem] : [...(m[2] as string)].map((c) => stem + c);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/** The table prefixes a class or alternation spelling on this line expands to. */
|
|
91
|
+
export function classSpelledHits(code: string, prefixes: readonly string[] = CREDENTIAL_PREFIXES): string[] {
|
|
92
|
+
const hits = new Set<string>();
|
|
93
|
+
const judge = (stems: readonly string[], after: string): void => {
|
|
94
|
+
const sep = SEPARATOR.exec(after)?.[0];
|
|
95
|
+
if (sep === undefined) return;
|
|
96
|
+
const seps = sep.length === 1 ? [sep] : [...sep.slice(1, -1)];
|
|
97
|
+
for (const stem of stems) for (const c of seps) if (prefixes.includes(stem + c)) hits.add(stem + c);
|
|
98
|
+
};
|
|
99
|
+
for (const m of code.matchAll(CLASS_GROUP)) {
|
|
100
|
+
judge(
|
|
101
|
+
(m[1] as string).split('|').flatMap(expandAlt),
|
|
102
|
+
code.slice((m.index ?? 0) + m[0].length),
|
|
103
|
+
);
|
|
104
|
+
}
|
|
105
|
+
for (const m of code.matchAll(BARE_CLASS)) {
|
|
106
|
+
judge(expandAlt(`${m[1] as string}[${m[2] as string}]`), code.slice((m.index ?? 0) + m[0].length));
|
|
107
|
+
}
|
|
108
|
+
return [...hits];
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
const KEYWORD = new RegExp(Object.values(ASSIGNMENT_KEYWORDS).map(escapeRe).join('|'), 'i');
|
|
112
|
+
const ASSIGNMENT_OPERATOR = /\[:=\]/;
|
|
113
|
+
|
|
114
|
+
/** A keyword-assignment shape spelled on one line: a table keyword beside the `[:=]` operator class. */
|
|
115
|
+
export function spellsAssignmentShape(code: string): boolean {
|
|
116
|
+
return ASSIGNMENT_OPERATOR.test(code) && KEYWORD.test(code);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/** 1-based lines that spell a prefix or a shape; comment lines and reasoned markers excluded. */
|
|
120
|
+
export function offendingLines(text: string, prefixes: readonly string[] = CREDENTIAL_PREFIXES): number[] {
|
|
121
|
+
const re = prefixSpelling(prefixes);
|
|
122
|
+
const out: number[] = [];
|
|
123
|
+
text.split('\n').forEach((line, i) => {
|
|
124
|
+
const code = line.trim();
|
|
125
|
+
if (code.startsWith('//') || code.startsWith('*') || code.startsWith('/*')) return;
|
|
126
|
+
if (NOT_A_PATTERN.test(code)) return;
|
|
127
|
+
const bare = code.replace(RULE_ID, '');
|
|
128
|
+
if (
|
|
129
|
+
re.test(bare.replace(/\\/g, '')) ||
|
|
130
|
+
classSpelledHits(bare, prefixes).length > 0 ||
|
|
131
|
+
spellsAssignmentShape(bare)
|
|
132
|
+
) {
|
|
133
|
+
out.push(i + 1);
|
|
134
|
+
}
|
|
135
|
+
});
|
|
136
|
+
return out;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/** Every `file:line` outside the table that spells a prefix, and the file count read. */
|
|
140
|
+
export function findSpellings(root: string, ledger?: GateLedger): { hits: string[]; scanned: number } {
|
|
141
|
+
const files: string[] = [];
|
|
142
|
+
for (const d of SCAN_DIRS) walk(path.join(root, d), files);
|
|
143
|
+
const hits: string[] = [];
|
|
144
|
+
for (const f of files) {
|
|
145
|
+
const rel = path.relative(root, f).split(path.sep).join('/');
|
|
146
|
+
ledger?.plan(rel);
|
|
147
|
+
if (rel === OWNER || rel === PROJECTION) {
|
|
148
|
+
ledger?.outOfScope(rel, 'declared_exemption');
|
|
149
|
+
continue;
|
|
150
|
+
}
|
|
151
|
+
const lines = offendingLines(fs.readFileSync(f, 'utf-8'));
|
|
152
|
+
for (const line of lines) hits.push(`${rel}:${String(line)}`);
|
|
153
|
+
if (lines.length > 0) ledger?.fail(rel, `${String(lines.length)} spelling(s)`);
|
|
154
|
+
else ledger?.complete(rel);
|
|
155
|
+
}
|
|
156
|
+
return { hits, scanned: files.length };
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
export function check(root: string): number {
|
|
160
|
+
const ledger = new GateLedger(GATE);
|
|
161
|
+
const { hits, scanned } = findSpellings(root, ledger);
|
|
162
|
+
ledger.report();
|
|
163
|
+
reportScanned({ gate: GATE, scanned, units: 'TypeScript source file(s)', roots: [...SCAN_DIRS] });
|
|
164
|
+
if (JSON.stringify(PROJECTED) !== JSON.stringify(CREDENTIAL_PREFIXES)) {
|
|
165
|
+
process.stderr.write(`❌ ${GATE}: ${PROJECTION} no longer equals the table's prefix list — regenerate it.\n`);
|
|
166
|
+
return 1;
|
|
167
|
+
}
|
|
168
|
+
if (hits.length > 0) {
|
|
169
|
+
process.stderr.write(`❌ ${GATE}: a raw-key prefix is spelled outside ${OWNER}:\n`);
|
|
170
|
+
for (const h of hits) process.stderr.write(` · ${h}\n`);
|
|
171
|
+
process.stderr.write(
|
|
172
|
+
'\nRead the shape from the table (prefixesOf, rawKeyPrefixPattern, detect) instead of spelling it,\n' +
|
|
173
|
+
'or mark an inert mention with `not-a-credential-pattern: <reason>`.\n',
|
|
174
|
+
);
|
|
175
|
+
return 1;
|
|
176
|
+
}
|
|
177
|
+
process.stdout.write(`✅ ${GATE}: one spelling — every raw-key prefix under ${SCAN_DIRS.join(', ')} lives in ${OWNER}.\n`);
|
|
178
|
+
return 0;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
function selfTest(): number {
|
|
182
|
+
const tmp = fs.mkdtempSync(path.join(os.tmpdir(), 'credential-spelling-selftest-'));
|
|
183
|
+
const prefix = CREDENTIAL_PREFIXES.find((p) => p.endsWith('_')) ?? (CREDENTIAL_PREFIXES[0] as string);
|
|
184
|
+
const dotted = CREDENTIAL_PREFIXES.find((p) => p.includes('.')) ?? prefix;
|
|
185
|
+
const fixture = (name: string, rel: string, body: string): string => {
|
|
186
|
+
const root = path.join(tmp, name);
|
|
187
|
+
fs.mkdirSync(path.join(root, path.dirname(rel)), { recursive: true });
|
|
188
|
+
fs.writeFileSync(path.join(root, rel), body);
|
|
189
|
+
fs.mkdirSync(path.join(root, 'src/scripts'), { recursive: true });
|
|
190
|
+
fs.writeFileSync(path.join(root, 'src/scripts/clean.ts'), 'export const x = 1;\n');
|
|
191
|
+
return root;
|
|
192
|
+
};
|
|
193
|
+
const run = (root: string): number => runGateCli(REPO_ROOT, 'src/scripts/check_credential_spelling.ts', ['--root', root], root);
|
|
194
|
+
try {
|
|
195
|
+
return runSelfTest({
|
|
196
|
+
gate: GATE,
|
|
197
|
+
minCases: 8,
|
|
198
|
+
minRejectCases: 5,
|
|
199
|
+
cases: [
|
|
200
|
+
{
|
|
201
|
+
name: 'a prefix spelled in a regex under src/scripts is rejected',
|
|
202
|
+
expect: 'reject',
|
|
203
|
+
run: () => run(fixture('regex', 'src/scripts/a.ts', `const RE = /${prefix}[A-Za-z0-9]{36}/;\n`)),
|
|
204
|
+
},
|
|
205
|
+
{
|
|
206
|
+
name: 'a regex-escaped prefix under src/cli is rejected',
|
|
207
|
+
expect: 'reject',
|
|
208
|
+
run: () => run(fixture('escaped', 'src/cli/b.ts', `const P = ['${escapeRe(dotted)}', 'x'];\n`)),
|
|
209
|
+
},
|
|
210
|
+
{
|
|
211
|
+
name: 'a bare marker with no reason does not mute',
|
|
212
|
+
expect: 'reject',
|
|
213
|
+
run: () => run(fixture('bare', 'src/scripts/c.ts', `const k = '${prefix}x'; // not-a-credential-pattern:\n`)),
|
|
214
|
+
},
|
|
215
|
+
{
|
|
216
|
+
name: 'a reasoned marker mutes an inert value',
|
|
217
|
+
expect: 'accept',
|
|
218
|
+
run: () =>
|
|
219
|
+
run(fixture('marked', 'src/scripts/d.ts', `const k = '${prefix}x'; // not-a-credential-pattern: fake\n`)),
|
|
220
|
+
},
|
|
221
|
+
{
|
|
222
|
+
name: 'a prefix family spelled as a character class is rejected',
|
|
223
|
+
expect: 'reject',
|
|
224
|
+
run: () => run(fixture('class', 'src/scripts/e.ts', 'const RE = /\\b(gh[pousr]|x)[-_][A-Za-z0-9]{8,}/g;\n')), // not-a-credential-pattern: self-test fixture
|
|
225
|
+
},
|
|
226
|
+
{
|
|
227
|
+
name: 'a keyword-assignment shape spelled outside the table is rejected',
|
|
228
|
+
expect: 'reject',
|
|
229
|
+
run: () => run(fixture('assign', 'src/cli/f.ts', 'const RE = /(?:password|api[_-]?key)\\s*[:=]\\s*\\S{8,}/i;\n')), // not-a-credential-pattern: self-test fixture
|
|
230
|
+
},
|
|
231
|
+
{
|
|
232
|
+
name: 'a shape read from the table passes',
|
|
233
|
+
expect: 'accept',
|
|
234
|
+
run: () =>
|
|
235
|
+
run(
|
|
236
|
+
fixture(
|
|
237
|
+
'reads',
|
|
238
|
+
'src/scripts/g.ts',
|
|
239
|
+
"const RE = assignmentPattern({ keywords: ['password'], value: '\\\\S{8,}' }, 'i');\n",
|
|
240
|
+
),
|
|
241
|
+
),
|
|
242
|
+
},
|
|
243
|
+
{
|
|
244
|
+
name: 'a spelling inside the table itself passes',
|
|
245
|
+
expect: 'accept',
|
|
246
|
+
run: () => run(fixture('owner', OWNER, `const RE = /${prefix}[A-Za-z0-9]{36}/;\n`)),
|
|
247
|
+
},
|
|
248
|
+
],
|
|
249
|
+
});
|
|
250
|
+
} finally {
|
|
251
|
+
fs.rmSync(tmp, { recursive: true, force: true });
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
export function main(argv: readonly string[]): number {
|
|
256
|
+
if (argv.includes('--help') || argv.includes('-h')) {
|
|
257
|
+
process.stdout.write(`usage: ${GATE} [--root DIR] [--self-test]\n`);
|
|
258
|
+
return 0;
|
|
259
|
+
}
|
|
260
|
+
if (argv.includes('--self-test')) return selfTest();
|
|
261
|
+
const i = argv.indexOf('--root');
|
|
262
|
+
return check(i === -1 ? REPO_ROOT : (argv[i + 1] ?? REPO_ROOT));
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
if (process.argv[1] !== undefined && import.meta.url === pathToFileURL(path.resolve(process.argv[1])).href) {
|
|
266
|
+
process.exit(main(process.argv.slice(2)));
|
|
267
|
+
}
|