@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
|
@@ -36,7 +36,12 @@ const QUIET = process.argv.slice(2).includes('--quiet');
|
|
|
36
36
|
const REPO = path.resolve(path.dirname(_HERE), '..', '..');
|
|
37
37
|
// 6.0.x (ADR-051): ghostwriter fixtures live at src/agent-src/ghostwriter/.
|
|
38
38
|
const PACKAGE_DIR = path.join(REPO, 'src', 'agent-src', 'ghostwriter');
|
|
39
|
-
|
|
39
|
+
// Every ghostwriter command writes profiles to `agents/reference/ghostwriter/`
|
|
40
|
+
// (docs/contracts/ghostwriter-schema.md); `agents/ghostwriter/` is the legacy
|
|
41
|
+
// path. Both are linted, canonical first, so a profile at either is checked.
|
|
42
|
+
const CONSUMER_DIR = path.join(REPO, 'agents', 'reference', 'ghostwriter');
|
|
43
|
+
const LEGACY_CONSUMER_DIR = path.join(REPO, 'agents', 'ghostwriter');
|
|
44
|
+
const CONSUMER_DIRS: readonly string[] = [CONSUMER_DIR, LEGACY_CONSUMER_DIR];
|
|
40
45
|
const ALLOWLIST = path.join(REPO, 'src', 'scripts', 'ghostwriter_fixture_allowlist.txt');
|
|
41
46
|
const EXEMPT_STEMS: ReadonlySet<string> = new Set(['README']);
|
|
42
47
|
|
|
@@ -86,6 +91,35 @@ function _globMdSorted(dir: string): string[] {
|
|
|
86
91
|
return out.sort();
|
|
87
92
|
}
|
|
88
93
|
|
|
94
|
+
/** Sorted `*.md` files anywhere under `dir`, nested directories included. */
|
|
95
|
+
function _globMdRecursiveSorted(dir: string): string[] {
|
|
96
|
+
let entries: fs.Dirent[];
|
|
97
|
+
try {
|
|
98
|
+
entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
99
|
+
} catch {
|
|
100
|
+
return [];
|
|
101
|
+
}
|
|
102
|
+
const out: string[] = [];
|
|
103
|
+
for (const entry of entries) {
|
|
104
|
+
const full = path.join(dir, entry.name);
|
|
105
|
+
if (entry.isDirectory()) {
|
|
106
|
+
out.push(..._globMdRecursiveSorted(full));
|
|
107
|
+
} else if (entry.isFile() && entry.name.endsWith('.md')) {
|
|
108
|
+
out.push(full);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return out.sort();
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/** Every consumer-side profile file, canonical path first, then legacy. */
|
|
115
|
+
function consumer_profile_files(dirs: readonly string[] = CONSUMER_DIRS): string[] {
|
|
116
|
+
const out: string[] = [];
|
|
117
|
+
for (const dir of dirs) {
|
|
118
|
+
out.push(..._globMdRecursiveSorted(dir));
|
|
119
|
+
}
|
|
120
|
+
return out;
|
|
121
|
+
}
|
|
122
|
+
|
|
89
123
|
function _stem(p: string): string {
|
|
90
124
|
const base = path.basename(p);
|
|
91
125
|
const dot = base.lastIndexOf('.');
|
|
@@ -213,14 +247,11 @@ function lint_package_side(allowlist: Set<string>): string[] {
|
|
|
213
247
|
return errors;
|
|
214
248
|
}
|
|
215
249
|
|
|
216
|
-
function lint_consumer_side(): string[] {
|
|
250
|
+
function lint_consumer_side(dirs: readonly string[] = CONSUMER_DIRS): string[] {
|
|
217
251
|
const errors: string[] = [];
|
|
218
|
-
if (!_exists(CONSUMER_DIR)) {
|
|
219
|
-
return errors;
|
|
220
|
-
}
|
|
221
252
|
// (alias_ci → [source_path, source_value, source_kind])
|
|
222
253
|
const seen = new Map<string, [string, string, string]>();
|
|
223
|
-
for (const p of
|
|
254
|
+
for (const p of consumer_profile_files(dirs)) {
|
|
224
255
|
if (EXEMPT_STEMS.has(_stem(p))) {
|
|
225
256
|
continue;
|
|
226
257
|
}
|
|
@@ -302,15 +333,13 @@ function main(): number {
|
|
|
302
333
|
const pkg_count = _exists(PACKAGE_DIR)
|
|
303
334
|
? _globMdSorted(PACKAGE_DIR).filter((p) => !EXEMPT_STEMS.has(_stem(p))).length
|
|
304
335
|
: 0;
|
|
305
|
-
const cons_count =
|
|
306
|
-
? _globMdSorted(CONSUMER_DIR).filter((p) => !EXEMPT_STEMS.has(_stem(p))).length
|
|
307
|
-
: 0;
|
|
336
|
+
const cons_count = consumer_profile_files().filter((p) => !EXEMPT_STEMS.has(_stem(p))).length;
|
|
308
337
|
try {
|
|
309
338
|
assertScanned({
|
|
310
339
|
gate: 'lint_ghostwriter_source',
|
|
311
340
|
scanned: pkg_count + cons_count,
|
|
312
341
|
units: 'profile(s)',
|
|
313
|
-
roots: ['src/agent-src/ghostwriter', 'agents/ghostwriter'],
|
|
342
|
+
roots: ['src/agent-src/ghostwriter', 'agents/reference/ghostwriter', 'agents/ghostwriter'],
|
|
314
343
|
});
|
|
315
344
|
} catch (exc) {
|
|
316
345
|
if (exc instanceof DeadScopeError) {
|
|
@@ -414,6 +443,9 @@ export {
|
|
|
414
443
|
REPO,
|
|
415
444
|
PACKAGE_DIR,
|
|
416
445
|
CONSUMER_DIR,
|
|
446
|
+
LEGACY_CONSUMER_DIR,
|
|
447
|
+
CONSUMER_DIRS,
|
|
448
|
+
consumer_profile_files,
|
|
417
449
|
ALLOWLIST,
|
|
418
450
|
EXEMPT_STEMS,
|
|
419
451
|
ALIAS_MIN_LEN,
|
|
@@ -36,6 +36,7 @@ import { assertScanned, DeadScopeError } from "./_lib/scan_scope.js";
|
|
|
36
36
|
import { asOf } from "./_lib/as_of.js";
|
|
37
37
|
import { parseHostLowering, type HostLowering } from "./hooks/host_lowering.js";
|
|
38
38
|
import { RE_ARM_EVENTS } from "./_lib/prefix_stable_surfaces.js";
|
|
39
|
+
import { EXECUTION_VIEW_GRANTS } from "./hooks/egress_stage.js";
|
|
39
40
|
|
|
40
41
|
// src/scripts/lint_hook_manifest.ts → two levels up is the repo root.
|
|
41
42
|
const REPO_ROOT = path.resolve(
|
|
@@ -826,6 +827,97 @@ export function _check_slot_answers(table: HostLowering, errors: string[]): void
|
|
|
826
827
|
}
|
|
827
828
|
}
|
|
828
829
|
|
|
830
|
+
/**
|
|
831
|
+
* Host fields that replace what a tool or the model receives. The tool-output
|
|
832
|
+
* name is assembled rather than spelled, because a test pins that no file under
|
|
833
|
+
* src/ names it until the egress stage emits it (road-to-placeholders-on-the-wire
|
|
834
|
+
* step 3.2); refusing the field is not emitting it.
|
|
835
|
+
*/
|
|
836
|
+
const HOST_REWRITE_FIELDS: readonly string[] = ["updatedInput", ["updated", "ToolOutput"].join("")];
|
|
837
|
+
const REWRITE_DECLARATION_KEYS: readonly string[] = ["rewrite", "rewrites"];
|
|
838
|
+
|
|
839
|
+
/**
|
|
840
|
+
* ADR-285 — one dispatcher stage is the only rewriter. A concern that declares
|
|
841
|
+
* a rewrite, or whose own script names a host rewrite field, is refused: two
|
|
842
|
+
* concerns rewriting one input have no composition answer, so none may try.
|
|
843
|
+
*/
|
|
844
|
+
function _check_no_concern_rewrites(manifest: YamlObject, errors: string[]): void {
|
|
845
|
+
const concernsRaw = manifest["concerns"];
|
|
846
|
+
if (!isObject(concernsRaw)) return;
|
|
847
|
+
for (const [name, spec] of Object.entries(concernsRaw)) {
|
|
848
|
+
if (!isObject(spec)) continue;
|
|
849
|
+
const declared = REWRITE_DECLARATION_KEYS.find((k) => spec[k] !== undefined);
|
|
850
|
+
if (declared !== undefined) {
|
|
851
|
+
errors.push(
|
|
852
|
+
`concerns.${name}: rewrite-concern-refused — declares '${declared}', but only the ` +
|
|
853
|
+
`dispatcher's egress stage may produce a rewrite (ADR-285)`,
|
|
854
|
+
);
|
|
855
|
+
}
|
|
856
|
+
const script = spec["script"];
|
|
857
|
+
if (typeof script !== "string") continue;
|
|
858
|
+
let source = "";
|
|
859
|
+
try {
|
|
860
|
+
source = fs.readFileSync(path.join(REPO_ROOT, script), "utf8");
|
|
861
|
+
} catch {
|
|
862
|
+
continue; // missing script is already reported by _check_concerns
|
|
863
|
+
}
|
|
864
|
+
// Code forms only — a key, a quoted name, a property read. A header that
|
|
865
|
+
// explains the field in backticks (rtk_wrap_hook does) produces nothing.
|
|
866
|
+
const field = HOST_REWRITE_FIELDS.find((f) =>
|
|
867
|
+
[`${f}:`, `'${f}'`, `"${f}"`, `.${f}`].some((form) => source.includes(form)),
|
|
868
|
+
);
|
|
869
|
+
if (field !== undefined) {
|
|
870
|
+
errors.push(
|
|
871
|
+
`concerns.${name}: rewrite-concern-refused — ${script} names the host rewrite ` +
|
|
872
|
+
`field '${field}'; only the dispatcher's egress stage may produce a rewrite (ADR-285)`,
|
|
873
|
+
);
|
|
874
|
+
}
|
|
875
|
+
}
|
|
876
|
+
}
|
|
877
|
+
|
|
878
|
+
/**
|
|
879
|
+
* The execution view is granted by the dispatcher's closed list, never
|
|
880
|
+
* requested. Refused: a concern declaring `payload_view: execution` off the
|
|
881
|
+
* list, a blocking concern the list omits (it would be served tokens instead
|
|
882
|
+
* of the value it guards), and a listed concern that is not blocking.
|
|
883
|
+
*/
|
|
884
|
+
function _check_execution_view_grants(manifest: YamlObject, errors: string[]): void {
|
|
885
|
+
const concernsRaw = manifest["concerns"];
|
|
886
|
+
if (!isObject(concernsRaw)) return;
|
|
887
|
+
for (const [name, spec] of Object.entries(concernsRaw)) {
|
|
888
|
+
if (!isObject(spec)) continue;
|
|
889
|
+
const view = spec["payload_view"];
|
|
890
|
+
const granted = EXECUTION_VIEW_GRANTS.has(name);
|
|
891
|
+
const blocking = spec["severity"] === "blocking";
|
|
892
|
+
if (view !== undefined && view !== "execution" && view !== "placeholder") {
|
|
893
|
+
errors.push(`concerns.${name}: 'payload_view' must be execution or placeholder, got ${JSON.stringify(view)}`);
|
|
894
|
+
} else if (view === "execution" && !granted) {
|
|
895
|
+
errors.push(
|
|
896
|
+
`concerns.${name}: execution-view-not-granted — declares 'payload_view: execution' but is not on ` +
|
|
897
|
+
`EXECUTION_VIEW_GRANTS in src/scripts/hooks/egress_stage.ts; a declaration grants nothing`,
|
|
898
|
+
);
|
|
899
|
+
}
|
|
900
|
+
if (blocking && !granted) {
|
|
901
|
+
errors.push(
|
|
902
|
+
`concerns.${name}: execution-view-not-granted — severity: blocking but missing from ` +
|
|
903
|
+
`EXECUTION_VIEW_GRANTS; under protect it would be served placeholder tokens instead of the values it guards`,
|
|
904
|
+
);
|
|
905
|
+
} else if (granted && !blocking) {
|
|
906
|
+
errors.push(
|
|
907
|
+
`concerns.${name}: execution-view-not-granted — on EXECUTION_VIEW_GRANTS but not severity: blocking; ` +
|
|
908
|
+
`the execution view is for concerns that decide whether a call runs`,
|
|
909
|
+
);
|
|
910
|
+
}
|
|
911
|
+
if (granted && spec["script"] !== EXECUTION_VIEW_GRANTS.get(name)) {
|
|
912
|
+
errors.push(
|
|
913
|
+
`concerns.${name}: execution-view-not-granted — the grant is bound to ` +
|
|
914
|
+
`${String(EXECUTION_VIEW_GRANTS.get(name))}, but the manifest runs ${JSON.stringify(spec["script"])}; ` +
|
|
915
|
+
`the dispatcher will serve it the placeholder view`,
|
|
916
|
+
);
|
|
917
|
+
}
|
|
918
|
+
}
|
|
919
|
+
}
|
|
920
|
+
|
|
829
921
|
export function lint(
|
|
830
922
|
manifestPath: string,
|
|
831
923
|
strict: boolean,
|
|
@@ -858,6 +950,8 @@ export function lint(
|
|
|
858
950
|
const concernNames = _check_concerns(manifest, errors);
|
|
859
951
|
const bound = _check_platforms(manifest, concernNames, errors, warnings);
|
|
860
952
|
_check_guard_payload_bodies(manifest, errors);
|
|
953
|
+
_check_no_concern_rewrites(manifest, errors);
|
|
954
|
+
_check_execution_view_grants(manifest, errors);
|
|
861
955
|
_check_roles(manifest, concernNames, errors);
|
|
862
956
|
_check_aliases(manifest, errors);
|
|
863
957
|
_check_orphan_trampolines(manifest, errors);
|
|
@@ -97,6 +97,10 @@ function load_hook_commands(hooks_path: string): Array<[string, string]> {
|
|
|
97
97
|
|
|
98
98
|
/** Pull the agent-config subcommand out of a hooks.json command line. */
|
|
99
99
|
function extract_subcommand(command_line: string): string | null {
|
|
100
|
+
// What `echo` or `printf` prints is not what the line runs: the
|
|
101
|
+
// no-dispatcher branch echoes prose that names "agent-config hook". A
|
|
102
|
+
// quoted string a shell executes, as in `sh -c '…'`, is left to match.
|
|
103
|
+
command_line = command_line.replace(/\b(echo|printf)((?:\s+(?:-\w+|'[^']*'))+)/g, (_m, verb: string) => verb);
|
|
100
104
|
const m = _CMD_RE.exec(command_line);
|
|
101
105
|
if (m) {
|
|
102
106
|
return m[1] as string;
|
|
@@ -23,6 +23,7 @@ import * as path from 'node:path';
|
|
|
23
23
|
import * as fs from 'node:fs';
|
|
24
24
|
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
25
25
|
|
|
26
|
+
import { detect } from './_lib/egress_rules.js';
|
|
26
27
|
import * as sl from './_lib/security_lint.js';
|
|
27
28
|
import { assertScanned, DeadScopeError } from './_lib/scan_scope.js';
|
|
28
29
|
|
|
@@ -31,16 +32,13 @@ export const CHECK = 'mcp-config-security';
|
|
|
31
32
|
// Python: re.compile(r"(^|/)(\.mcp\.json|mcp\.json|claude_desktop_config\.json)")
|
|
32
33
|
const _NAME_HINTS = /(^|\/)(\.mcp\.json|mcp\.json|claude_desktop_config\.json)/;
|
|
33
34
|
|
|
34
|
-
// Real secret VALUES
|
|
35
|
-
//
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
'|ghp_[0-9A-Za-z]{36}' +
|
|
42
|
-
'|eyJ[A-Za-z0-9_\\-]{10,}\\.[A-Za-z0-9_\\-]{10,}\\.[A-Za-z0-9_\\-]{10,}',
|
|
43
|
-
);
|
|
35
|
+
// Real secret VALUES — detected by the one rule table, which owns every
|
|
36
|
+
// credential pattern (road-to-one-detector-and-the-senders-we-own 2.2). The
|
|
37
|
+
// heuristic keyword assignment is not a structural credential and never was HIGH
|
|
38
|
+
// here; this lint's HIGH tier stays the structural rows.
|
|
39
|
+
export function hasInlineSecret(text: string): boolean {
|
|
40
|
+
return detect(text).some((span) => span.class === 'credential' && span.rule !== 'generic-assignment');
|
|
41
|
+
}
|
|
44
42
|
|
|
45
43
|
// Line-level smells (match on a single line).
|
|
46
44
|
const _MED: ReadonlyArray<[RegExp, string]> = [
|
|
@@ -135,7 +133,7 @@ export function _scan(sf: sl.ScannedFile): sl.Finding[] {
|
|
|
135
133
|
const out: sl.Finding[] = [];
|
|
136
134
|
for (const [start, numbered] of _candidate_chunks(sf)) {
|
|
137
135
|
for (const [lineno, text] of numbered) {
|
|
138
|
-
if (
|
|
136
|
+
if (hasInlineSecret(text)) {
|
|
139
137
|
out.push(
|
|
140
138
|
new sl.Finding(
|
|
141
139
|
sf.rel,
|
|
@@ -42,6 +42,7 @@ import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
|
42
42
|
import { parse as parseYaml } from 'yaml';
|
|
43
43
|
|
|
44
44
|
import { isAcceptanceCriteriaHeading } from './_lib/ac_heading.js';
|
|
45
|
+
import { asOfMs } from './_lib/as_of.js';
|
|
45
46
|
import { workspaceIdentity } from './_lib/git_common_dir.js';
|
|
46
47
|
import { gitEnv } from './_lib/git_env.js';
|
|
47
48
|
import { splitMarkdownRow } from './_lib/md_table.js';
|
|
@@ -609,6 +610,12 @@ function _reviewedIn(text: string): string | null {
|
|
|
609
610
|
* reviewed exactly as the contract asks — every author-today/merge-tomorrow PR
|
|
610
611
|
* reproduces it.
|
|
611
612
|
*
|
|
613
|
+
* Within the run, a commit dated on or before the stamp is preferred, newest
|
|
614
|
+
* first: the marker takes a bare date, so a plan changed again the same day it
|
|
615
|
+
* was reviewed has no later value to write, and the contract (§ 1, "Residual
|
|
616
|
+
* (accepted)") resolves that same-day pair in favour of passing. A run with no
|
|
617
|
+
* such commit falls back to the commit that introduced the stamp.
|
|
618
|
+
*
|
|
612
619
|
* The oldest commit of the run is the honest baseline, and the age matters:
|
|
613
620
|
* comparing against the NEWEST commit carrying the stamp would compare the
|
|
614
621
|
* current content with itself, making every committed file trivially fresh and
|
|
@@ -620,12 +627,22 @@ function _stampIntroducedAt(
|
|
|
620
627
|
reviewed: string,
|
|
621
628
|
): HistoryEntry | undefined {
|
|
622
629
|
let introduced: HistoryEntry | undefined;
|
|
630
|
+
let sameDay: HistoryEntry | undefined;
|
|
623
631
|
for (const entry of history) {
|
|
624
632
|
const blob = _blobAt(absPath, entry.sha);
|
|
625
633
|
if (blob === null || _reviewedIn(blob) !== reviewed) break;
|
|
626
634
|
introduced = entry;
|
|
635
|
+
// History is newest-first, so the first run member dated on or before
|
|
636
|
+
// the stamp is the newest such commit: a change committed the day the
|
|
637
|
+
// stamp names is covered by it (contract § 1, accepted residual).
|
|
638
|
+
if (sameDay === undefined && entry.date <= reviewed) sameDay = entry;
|
|
627
639
|
}
|
|
628
|
-
return introduced;
|
|
640
|
+
return sameDay ?? introduced;
|
|
641
|
+
}
|
|
642
|
+
|
|
643
|
+
/** The latest calendar day anywhere on earth at the as-of instant (UTC+14), so no author's real today reads as future. */
|
|
644
|
+
function _latestToday(now: number = asOfMs()): string {
|
|
645
|
+
return new Date(now + 14 * 3_600_000).toISOString().slice(0, 10);
|
|
629
646
|
}
|
|
630
647
|
|
|
631
648
|
export type FileStatus = 'ok' | 'draft-exempt' | 'grandfathered' | 'fail';
|
|
@@ -689,6 +706,16 @@ export function checkFile(absPath: string): FileResult {
|
|
|
689
706
|
};
|
|
690
707
|
}
|
|
691
708
|
const violations = [...content.violations];
|
|
709
|
+
// A stamp after today would cover every commit made until that date as
|
|
710
|
+
// "reviewed" — the same-day residual of contract § 1 holds for today only.
|
|
711
|
+
if (content.reviewed !== null && content.reviewed > _latestToday()) {
|
|
712
|
+
violations.push({
|
|
713
|
+
file: absPath,
|
|
714
|
+
line: 1,
|
|
715
|
+
kind: 'future_review',
|
|
716
|
+
detail: `\`reviewed: ${content.reviewed}\` is later than today — stamp the day the review happened`,
|
|
717
|
+
});
|
|
718
|
+
}
|
|
692
719
|
// A file with uncommitted modifications has no committed baseline for the
|
|
693
720
|
// current content, so staleness is not judgeable — see
|
|
694
721
|
// hasUncommittedChanges. The committed-history case below is unchanged.
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* Positioning consistency lint for event4u/agent-config.
|
|
4
4
|
*
|
|
5
|
-
* Ported from
|
|
5
|
+
* Ported from its retired Python twin (ADR-200, Phase 4 /
|
|
6
6
|
* Wave 4b). Mirrors the CLI contract EXACTLY — the `--quiet` argparse flag,
|
|
7
7
|
* exit codes (0 clean, 1 drift, 2 missing PyYAML — inert here since `yaml`
|
|
8
8
|
* is always present), byte-identical stdout (success line) and stderr
|
|
@@ -134,8 +134,8 @@ interface ParsedArgs {
|
|
|
134
134
|
}
|
|
135
135
|
|
|
136
136
|
function _argparse_error(message: string): never {
|
|
137
|
-
process.stderr.write('usage: lint_positioning
|
|
138
|
-
process.stderr.write(`lint_positioning
|
|
137
|
+
process.stderr.write('usage: lint_positioning [-h] [--quiet]\n');
|
|
138
|
+
process.stderr.write(`lint_positioning: error: ${message}\n`);
|
|
139
139
|
process.exit(2);
|
|
140
140
|
}
|
|
141
141
|
|
|
@@ -145,7 +145,7 @@ function parse_args(argv: readonly string[]): ParsedArgs {
|
|
|
145
145
|
if (arg === '--quiet') {
|
|
146
146
|
quiet = true;
|
|
147
147
|
} else if (arg === '-h' || arg === '--help') {
|
|
148
|
-
process.stdout.write('usage: lint_positioning
|
|
148
|
+
process.stdout.write('usage: lint_positioning [-h] [--quiet]\n');
|
|
149
149
|
process.exit(0);
|
|
150
150
|
} else {
|
|
151
151
|
_argparse_error(`unrecognized arguments: ${arg}`);
|
|
@@ -76,6 +76,7 @@ const WEAK_COPYLEFT_SPDX_IDS = [
|
|
|
76
76
|
'LGPL-2.1-only', 'LGPL-2.1-or-later', 'LGPL-2.1',
|
|
77
77
|
'LGPL-3.0-only', 'LGPL-3.0-or-later', 'LGPL-3.0',
|
|
78
78
|
'EPL-1.0', 'EPL-2.0', 'CDDL-1.0', 'CDDL-1.1',
|
|
79
|
+
'OFL-1.1',
|
|
79
80
|
];
|
|
80
81
|
// The conservative fallback deny set (GPL/AGPL/SSPL family) — see the header
|
|
81
82
|
// comment. Also part of the known-SPDX-id catalog, so a real GPL/AGPL/SSPL
|
|
@@ -201,6 +201,18 @@ interface TargetIndex {
|
|
|
201
201
|
*/
|
|
202
202
|
const USER_DECISION_OWNER_RE = /^-[ \t]*\*\*Owner:\*\*[ \t]*(maintainer|user|owner)\b/im;
|
|
203
203
|
|
|
204
|
+
/**
|
|
205
|
+
* Template rule 20 "Route before you file": a human-owned blocker records the
|
|
206
|
+
* council verdict that sent it to a human, or why no council could be asked.
|
|
207
|
+
* Absent is ratcheted (the backlog predates the field); present-but-malformed
|
|
208
|
+
* is hard, since no entry carried the field on the day it shipped. Counted over
|
|
209
|
+
* this lint's own scope, so a blocker filed straight into a parked roadmap is
|
|
210
|
+
* not seen — parking itself is held by check_estate_count's later_roadmaps floor.
|
|
211
|
+
*/
|
|
212
|
+
const ROUTED_FIELD_RE = /^-[ \t]*\*\*Routed:\*\*[ \t]*(.*)$/im;
|
|
213
|
+
const ROUTED_VALUE_RE =
|
|
214
|
+
/^(?:council[ \t]+\d{4}-\d{2}-\d{2}[ \t]+ESCALATE[ \t]+[—-][ \t]*\S|pending[ \t]+[—-][ \t]*\S)/;
|
|
215
|
+
|
|
204
216
|
const REQUIRED_FIELDS: ReadonlyArray<readonly [string, RegExp]> = [
|
|
205
217
|
['Status', /^-[ \t]*\*\*Status:\*\*/im],
|
|
206
218
|
['Owner', /^-[ \t]*\*\*Owner:\*\*/im],
|
|
@@ -327,6 +339,8 @@ interface ScanResult {
|
|
|
327
339
|
hard: Violation[];
|
|
328
340
|
/** Open entries that are not yet decidable — counted against the ratchet. */
|
|
329
341
|
decidability: Violation[];
|
|
342
|
+
/** Open human-owned entries with no `Routed:` field — counted against its own ratchet. */
|
|
343
|
+
routing: Violation[];
|
|
330
344
|
}
|
|
331
345
|
|
|
332
346
|
/** What a scan needs to resolve a qualified reference: who it is, and where it may point. */
|
|
@@ -339,6 +353,7 @@ interface ScanContext {
|
|
|
339
353
|
function _scanBoth(rawText: string, ctx: ScanContext = {}): ScanResult {
|
|
340
354
|
const violations: Violation[] = [];
|
|
341
355
|
const decidability: Violation[] = [];
|
|
356
|
+
const routing: Violation[] = [];
|
|
342
357
|
const text = _stripFencedCode(rawText);
|
|
343
358
|
const declaredIds = new Set<string>();
|
|
344
359
|
const userDecisionIds = new Set<string>();
|
|
@@ -452,6 +467,24 @@ function _scanBoth(rawText: string, ctx: ScanContext = {}): ScanResult {
|
|
|
452
467
|
});
|
|
453
468
|
}
|
|
454
469
|
}
|
|
470
|
+
if (USER_DECISION_OWNER_RE.test(body)) {
|
|
471
|
+
const routed = ROUTED_FIELD_RE.exec(body);
|
|
472
|
+
const at = _lineAt(text, sectionStart + cur.start);
|
|
473
|
+
if (routed === null) {
|
|
474
|
+
routing.push({
|
|
475
|
+
line: at,
|
|
476
|
+
message: `blocker '${cur.id}' has a human Owner but no **Routed:** field`,
|
|
477
|
+
});
|
|
478
|
+
} else if (!ROUTED_VALUE_RE.test((routed[1] as string).trim())) {
|
|
479
|
+
violations.push({
|
|
480
|
+
line: at,
|
|
481
|
+
message:
|
|
482
|
+
`blocker '${cur.id}' declares **Routed:** '${(routed[1] as string).trim()}' — ` +
|
|
483
|
+
"expected 'council YYYY-MM-DD ESCALATE — <reserved row>' or " +
|
|
484
|
+
"'pending — <why the council was unreachable>' (templates/roadmaps.md rule 20)",
|
|
485
|
+
});
|
|
486
|
+
}
|
|
487
|
+
}
|
|
455
488
|
const gaps = DECIDABILITY_FIELDS.filter(([, re]) => !re.test(body)).map(
|
|
456
489
|
([name]) => name,
|
|
457
490
|
);
|
|
@@ -518,7 +551,8 @@ function _scanBoth(rawText: string, ctx: ScanContext = {}): ScanResult {
|
|
|
518
551
|
}
|
|
519
552
|
violations.sort((a, b) => a.line - b.line);
|
|
520
553
|
decidability.sort((a, b) => a.line - b.line);
|
|
521
|
-
|
|
554
|
+
routing.sort((a, b) => a.line - b.line);
|
|
555
|
+
return { hard: violations, decidability, routing };
|
|
522
556
|
}
|
|
523
557
|
|
|
524
558
|
interface LocalBlockers {
|
|
@@ -534,7 +568,7 @@ interface LocalBlockers {
|
|
|
534
568
|
* `<roadmap-stem>#<id>` resolves against the in-scope target named — never
|
|
535
569
|
* estate-wide, so an unrelated roadmap adding a same-named blocker cannot change
|
|
536
570
|
* what an existing marker means. A target that is declared but resolved makes
|
|
537
|
-
* the marker STALE: `run-continuation`
|
|
571
|
+
* the marker STALE: the withdrawn `run-continuation` treated every marker as blocked, so a
|
|
538
572
|
* marker on a resolved blocker would hold a step nothing holds any more.
|
|
539
573
|
* "Superseded" is not a state — the format has no replacement pointer, so a
|
|
540
574
|
* moved blocker is a reference to update, reported here as missing.
|
|
@@ -885,13 +919,20 @@ function main(): number {
|
|
|
885
919
|
const index = _targetIndex();
|
|
886
920
|
let failed = 0;
|
|
887
921
|
const undecidable: Array<{ rel: string; v: Violation }> = [];
|
|
922
|
+
const unrouted: Array<{ rel: string; v: Violation }> = [];
|
|
888
923
|
for (const roadmap of roadmaps) {
|
|
889
924
|
const rel = _relPosix(roadmap, REPO_ROOT);
|
|
890
925
|
const text = fs.readFileSync(roadmap, 'utf-8');
|
|
891
|
-
const { hard, decidability } = _scanBoth(text, {
|
|
926
|
+
const { hard, decidability, routing } = _scanBoth(text, {
|
|
927
|
+
selfStem: path.basename(roadmap, '.md'),
|
|
928
|
+
index,
|
|
929
|
+
});
|
|
892
930
|
for (const v of decidability) {
|
|
893
931
|
undecidable.push({ rel, v });
|
|
894
932
|
}
|
|
933
|
+
for (const v of routing) {
|
|
934
|
+
unrouted.push({ rel, v });
|
|
935
|
+
}
|
|
895
936
|
if (hard.length) {
|
|
896
937
|
failed += 1;
|
|
897
938
|
process.stderr.write(`❌ ${rel}\n`);
|
|
@@ -962,10 +1003,30 @@ function main(): number {
|
|
|
962
1003
|
' **What to do:** carrying a command, a path or an enumerated option set.\n' +
|
|
963
1004
|
' See templates/roadmaps.md rule 20.\n',
|
|
964
1005
|
);
|
|
1006
|
+
}
|
|
1007
|
+
const routingVerdict = checkRatchet({
|
|
1008
|
+
gate: 'lint_roadmap_blockers:routing',
|
|
1009
|
+
actual: unrouted.length,
|
|
1010
|
+
repoRoot: REPO_ROOT,
|
|
1011
|
+
});
|
|
1012
|
+
if (!routingVerdict.ok) {
|
|
1013
|
+
process.stderr.write(`❌ ${routingVerdict.message}\n`);
|
|
1014
|
+
for (const { rel, v } of unrouted) {
|
|
1015
|
+
process.stderr.write(` ${rel}:${v.line}: ${v.message}\n`);
|
|
1016
|
+
}
|
|
1017
|
+
process.stderr.write(
|
|
1018
|
+
'\n Route a human-owned blocker through the council before filing it, and record\n' +
|
|
1019
|
+
" **Routed:** council YYYY-MM-DD ESCALATE — <reserved row>, or 'pending — <reason>'\n" +
|
|
1020
|
+
' when no council could be reached. A DECIDE is a ## Decisions row, not a blocker.\n' +
|
|
1021
|
+
' See templates/roadmaps.md rule 20 "Route before you file".\n',
|
|
1022
|
+
);
|
|
1023
|
+
}
|
|
1024
|
+
if (!verdict.ok || !routingVerdict.ok) {
|
|
965
1025
|
return 1;
|
|
966
1026
|
}
|
|
967
1027
|
if (!QUIET) {
|
|
968
1028
|
process.stdout.write(`\n✅ ${roadmaps.length} roadmap(s) blocker-contract-clean\n`);
|
|
1029
|
+
process.stdout.write(`✅ ${routingVerdict.message}\n`);
|
|
969
1030
|
process.stdout.write(
|
|
970
1031
|
`✅ 0 blocker id(s) open in both an active and an archived roadmap ` +
|
|
971
1032
|
`(${_globArchivedRoadmaps().length} archived file(s) read)\n`,
|
|
@@ -998,7 +1059,7 @@ function _isCliEntry(): boolean {
|
|
|
998
1059
|
}
|
|
999
1060
|
|
|
1000
1061
|
if (_isCliEntry() || process.argv[1] === _HERE) {
|
|
1001
|
-
process.
|
|
1062
|
+
process.exitCode = main();
|
|
1002
1063
|
}
|
|
1003
1064
|
|
|
1004
1065
|
export {
|
|
@@ -21,9 +21,12 @@ import * as path from 'node:path';
|
|
|
21
21
|
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
22
22
|
|
|
23
23
|
import { project_settings_path } from './_lib/agent_settings.js';
|
|
24
|
+
import { asOf } from './_lib/as_of.js';
|
|
24
25
|
import { GateLedger } from './_lib/gate_ledger.js';
|
|
25
26
|
import { runGateCli, runSelfTest } from './_lib/gate_self_test.js';
|
|
26
27
|
import { granularity_problems } from './_lib/roadmap_granularity.js';
|
|
28
|
+
import { loadStepSizeBaseline, staleHeld, stepSizeProblems } from './_lib/roadmap_step_size.js';
|
|
29
|
+
import { screenRoadmap } from './roadmap_drain_queue.js';
|
|
27
30
|
import { assertScanned, DeadScopeError } from './_lib/scan_scope.js';
|
|
28
31
|
|
|
29
32
|
/** Mirror `QUIET = "--quiet" in sys.argv` (computed at import). */
|
|
@@ -198,6 +201,12 @@ function _check_no_plate(text: string, problems: string[]): void {
|
|
|
198
201
|
}
|
|
199
202
|
}
|
|
200
203
|
|
|
204
|
+
let _stepSizeHeld: Set<string> | null = null;
|
|
205
|
+
function _stepSizeBaseline(): Set<string> {
|
|
206
|
+
_stepSizeHeld ??= loadStepSizeBaseline(REPO_ROOT);
|
|
207
|
+
return _stepSizeHeld;
|
|
208
|
+
}
|
|
209
|
+
|
|
201
210
|
function lint_roadmap(
|
|
202
211
|
p: string,
|
|
203
212
|
horizon_weeks: number,
|
|
@@ -222,21 +231,46 @@ function lint_roadmap(
|
|
|
222
231
|
// here rather than shipped as its own gate; `_lib/roadmap_granularity.ts`
|
|
223
232
|
// carries the reason.
|
|
224
233
|
problems.push(...granularity_problems(text));
|
|
234
|
+
problems.push(...stepSizeProblems(path.basename(p), text, _stepSizeBaseline()));
|
|
235
|
+
if (warnings) {
|
|
236
|
+
for (const key of staleHeld(path.basename(p), text, _stepSizeBaseline())) {
|
|
237
|
+
warnings.push(`${key} fits under the step cap now — delete it from src/config/roadmap-step-size-baseline.json`);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
225
240
|
if (horizon_weeks <= 0) {
|
|
226
241
|
_check_no_plate(text, problems);
|
|
227
242
|
}
|
|
228
243
|
_check_execution_mode(fm, problems);
|
|
229
244
|
_check_relates(fm, problems);
|
|
245
|
+
_check_cross_file_waits(text, fm, path.dirname(p), problems);
|
|
230
246
|
if (warnings) {
|
|
231
247
|
_check_autonomous_authoring(text, fm, warnings);
|
|
232
248
|
_check_human_gate_steps(text, warnings);
|
|
233
249
|
_check_human_gate_phase_headings(text, warnings);
|
|
234
250
|
_check_human_gate_exit_criteria(text, warnings);
|
|
235
251
|
_check_external_population_gates(text, warnings);
|
|
252
|
+
_check_dated_waits(text, warnings);
|
|
236
253
|
}
|
|
237
254
|
return problems;
|
|
238
255
|
}
|
|
239
256
|
|
|
257
|
+
/**
|
|
258
|
+
* An open step that waits on a future date keeps an otherwise finished roadmap
|
|
259
|
+
* from reaching zero open steps, so a drain can never close it. Such a step
|
|
260
|
+
* belongs in a `stubs/` entry with its trigger. Same reading the drain queue
|
|
261
|
+
* uses, so the lint and the queue cannot disagree on what is time-gated.
|
|
262
|
+
*/
|
|
263
|
+
function _check_dated_waits(text: string, warnings: string[], today?: string): void {
|
|
264
|
+
const day = today ?? asOf().toISOString().slice(0, 10);
|
|
265
|
+
for (const step of screenRoadmap('', '', text, day).steps) {
|
|
266
|
+
if (step.cls !== 'time') continue;
|
|
267
|
+
warnings.push(
|
|
268
|
+
`step waits on a future date: "${step.text.slice(0, 80)}" — move it to a ` +
|
|
269
|
+
'stubs/ entry with its trigger so this roadmap can close when its work is done',
|
|
270
|
+
);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
|
|
240
274
|
// Vague-step patterns (ask-when-uncertain trigger subset) — under
|
|
241
275
|
// execution.mode: autonomous these guarantee mid-run ambiguity halts,
|
|
242
276
|
// so they warn at authoring time instead. Warnings never fail the lint.
|
|
@@ -500,6 +534,69 @@ export function _check_relates(fm: string, problems: string[]): void {
|
|
|
500
534
|
}
|
|
501
535
|
}
|
|
502
536
|
|
|
537
|
+
const BLOCKED_BY_FILE_PAT = /<!--[ \t]*blocked-by:[ \t]*((?:(?:later|stubs|archive)\/)?road-to-[a-z0-9-]+)#/g;
|
|
538
|
+
|
|
539
|
+
function _relates_rows(fm: string): Array<{ slug: string; relation: string }> {
|
|
540
|
+
const rows: Array<{ slug: string; relation: string }> = [];
|
|
541
|
+
for (const chunk of fm.split(/^[ \t]*-[ \t]+slug:/m).slice(1)) {
|
|
542
|
+
const slug = /^[ \t]*['"]?([^\s'"#]+)/.exec(chunk)?.[1];
|
|
543
|
+
const relation = /^[ \t]+relation:[ \t]*['"]?([^\s'"#]+)/m.exec(chunk)?.[1];
|
|
544
|
+
if (slug && relation) rows.push({ slug, relation });
|
|
545
|
+
}
|
|
546
|
+
return rows;
|
|
547
|
+
}
|
|
548
|
+
|
|
549
|
+
function _is_archived(slug: string, roadmap_dir: string): boolean {
|
|
550
|
+
if (slug.startsWith('archive/')) return true;
|
|
551
|
+
const base = slug.replace(/^(?:later|stubs)\//, '');
|
|
552
|
+
return (
|
|
553
|
+
!fs.existsSync(path.join(roadmap_dir, `${slug}.md`)) &&
|
|
554
|
+
fs.existsSync(path.join(roadmap_dir, 'archive', `${base}.md`))
|
|
555
|
+
);
|
|
556
|
+
}
|
|
557
|
+
|
|
558
|
+
/**
|
|
559
|
+
* A step that waits on another roadmap says so twice or not at all: an inline
|
|
560
|
+
* `blocked-by: road-to-X#…` marker needs a `relates:` row for X with
|
|
561
|
+
* `relation: depends`, and a `depends` row may not name an archived file,
|
|
562
|
+
* which can no longer land the thing waited on. Both halves fail. The archived
|
|
563
|
+
* half warned rather than failed until 2026-10-17, while one active file still
|
|
564
|
+
* carried such a row; that row is now `extends` and the active glob carries
|
|
565
|
+
* none, so road-to-an-intake-the-queue-can-carry 1.2's flip condition is met.
|
|
566
|
+
* Neither half warns any more, so this check no longer takes a `warnings`
|
|
567
|
+
* sink; `lint_roadmap` still has one for the checks that do.
|
|
568
|
+
*/
|
|
569
|
+
export function _check_cross_file_waits(
|
|
570
|
+
text: string,
|
|
571
|
+
fm: string,
|
|
572
|
+
roadmap_dir: string,
|
|
573
|
+
problems: string[],
|
|
574
|
+
): void {
|
|
575
|
+
const rows = _relates_rows(fm);
|
|
576
|
+
const strip = (s: string): string => s.replace(/^(?:later|stubs|archive)\//, '');
|
|
577
|
+
const depends = new Set(rows.filter((r) => r.relation === 'depends').map((r) => strip(r.slug)));
|
|
578
|
+
const seen = new Set<string>();
|
|
579
|
+
BLOCKED_BY_FILE_PAT.lastIndex = 0;
|
|
580
|
+
let m: RegExpExecArray | null;
|
|
581
|
+
while ((m = BLOCKED_BY_FILE_PAT.exec(text)) !== null) {
|
|
582
|
+
const target = strip(m[1]!);
|
|
583
|
+
if (seen.has(target) || depends.has(target)) continue;
|
|
584
|
+
seen.add(target);
|
|
585
|
+
problems.push(
|
|
586
|
+
`blocked-by marker names '${target}' but no relates: row declares it ` +
|
|
587
|
+
'with relation: depends (templates/roadmaps.md rule 18)',
|
|
588
|
+
);
|
|
589
|
+
}
|
|
590
|
+
for (const r of rows) {
|
|
591
|
+
if (r.relation === 'depends' && _is_archived(r.slug, roadmap_dir)) {
|
|
592
|
+
problems.push(
|
|
593
|
+
`depends row names '${r.slug}', which is under archive/ — an archived ` +
|
|
594
|
+
'file lands nothing; drop the row or depend on its successor',
|
|
595
|
+
);
|
|
596
|
+
}
|
|
597
|
+
}
|
|
598
|
+
}
|
|
599
|
+
|
|
503
600
|
function _check_execution_mode(fm: string, problems: string[]): void {
|
|
504
601
|
if (!fm || !/^execution:/m.test(fm)) {
|
|
505
602
|
// Absent is VALID and stays valid — but it no longer means "interactive".
|
|
@@ -774,6 +871,7 @@ export {
|
|
|
774
871
|
_frontmatter,
|
|
775
872
|
_read_horizon_weeks,
|
|
776
873
|
_read_complexity,
|
|
874
|
+
_check_dated_waits,
|
|
777
875
|
lint_roadmap,
|
|
778
876
|
main,
|
|
779
877
|
};
|