@event4u/agent-config 16.4.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 +483 -669
- package/CONTRIBUTING.md +47 -0
- package/README.md +25 -25
- package/dist/agent-src/commands/{design.md → agent-design.md} +11 -7
- 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 +6 -1
- 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 +2 -2
- 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/accessibility-auditor/data/aria-patterns.csv +2 -0
- package/dist/agent-src/skills/accessibility-auditor/data/manifest.json +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 +16 -4
- 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 +25 -22
- 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 +65 -4
- 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/frontend-render-security/SKILL.md +9 -0
- 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/iconography/SKILL.md +4 -2
- package/dist/agent-src/skills/image-provider-routing/SKILL.md +16 -5
- 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 +21 -11
- 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 +324 -0
- 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/wireframe/SKILL.md +5 -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 +265 -13
- package/dist/cli/commands/uiRenderAsset.js +1316 -0
- package/dist/cli/commands/uiRenderAssetCompare.js +752 -0
- package/dist/cli/commands/uiRenderAssetFonts.js +158 -0
- package/dist/cli/commands/uiRenderAssetGrid.js +265 -0
- package/dist/cli/commands/uiRenderAssetGrounds.js +323 -0
- package/dist/cli/commands/uiRenderAssetIsolation.js +85 -0
- package/dist/cli/commands/uiRenderAssetTypes.js +133 -0
- package/dist/cli/initRouting.js +1 -1
- package/dist/cli/main.js +47 -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 +5 -2
- 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-AED2VQGM.js → chunk-2CX7NWRB.js} +233 -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 +669 -822
- 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 +409 -201
- package/dist/discovery/discovery-manifest.json.sha256 +1 -1
- package/dist/discovery/discovery-manifest.summary.md +8 -8
- package/dist/discovery/dormancy-report.md +1 -1
- package/dist/discovery/orphan-report.md +1 -1
- package/dist/discovery/packs.json +36 -27
- package/dist/discovery/trust-report.md +3 -3
- package/dist/discovery/workspaces.json +25 -16
- package/dist/hooks/chat_history.chunk.cjs +6852 -0
- package/dist/hooks/chat_history.chunk.cjs.sha256 +1 -0
- package/dist/hooks/dispatch.js +17706 -18627
- 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 +1858 -0
- package/dist/hooks/svg_rules.chunk.cjs.sha256 +1 -0
- 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 +9814 -5333
- 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/scan_scope.js +105 -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_dom.js +284 -0
- package/dist/scripts/_lib/svg_filled_counter.js +285 -0
- package/dist/scripts/_lib/svg_geometry.js +477 -0
- package/dist/scripts/_lib/svg_motion.js +179 -0
- package/dist/scripts/_lib/svg_rules.js +1339 -0
- package/dist/scripts/_lib/svg_urls.js +67 -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/scripts/lint_svg_asset.js +324 -0
- 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 +6 -1
- 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 +15 -5
- 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 +29 -25
- 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 +100 -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_dom.ts +318 -0
- package/src/scripts/_lib/svg_filled_counter.ts +287 -0
- package/src/scripts/_lib/svg_geometry.ts +480 -0
- package/src/scripts/_lib/svg_motion.ts +208 -0
- package/src/scripts/_lib/svg_rules.ts +1455 -0
- package/src/scripts/_lib/svg_urls.ts +72 -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/verification_command.ts +59 -0
- package/src/scripts/_lib/verify_clause.ts +31 -19
- 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 +54 -8
- 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 +199 -13
- 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 +553 -0
- package/src/scripts/hooks/svg_rules_loader.ts +133 -0
- package/src/scripts/hooks/tool_result_bytes_hook.ts +14 -5
- package/src/scripts/hooks/turn_end_gate_hook.ts +5 -3
- 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 +150 -19
- 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_design_quality.ts +60 -12
- 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_motion_authority_drift.ts +27 -0
- 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_svg_asset.ts +365 -0
- 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-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-MSUL5NYP.js +0 -1123
- 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
|
@@ -0,0 +1,318 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
/**
|
|
3
|
+
* `check_account_surface` — a lexical, offline, read-only audit of a consumer
|
|
4
|
+
* repository's account-flow code (`road-to-account-surface-detector` Phase 2).
|
|
5
|
+
*
|
|
6
|
+
* It reports only what a local pattern proves. A class finding no pattern is
|
|
7
|
+
* listed as undecided, never as a passing surface: a regex that sees nothing
|
|
8
|
+
* has not seen a safe login. Until `claim:account-surface-finds-planted` is
|
|
9
|
+
* backed, every finding is printed as unmeasured.
|
|
10
|
+
*
|
|
11
|
+
* Remediation classes bind to `active-remediation`: `mechanical` is a fix that
|
|
12
|
+
* reuses a primitive the project already has and invents no policy, so it is a
|
|
13
|
+
* fix-now candidate; `policy` and `migration` are never applied — they are
|
|
14
|
+
* note-and-ask items carrying a "leave it as is" option.
|
|
15
|
+
*
|
|
16
|
+
* No writes, no subprocess, no network. Symlinks are not followed and files
|
|
17
|
+
* above {@link MAX_FILE_BYTES} are skipped and reported, so a hostile tree can
|
|
18
|
+
* neither escape the scanned root nor make the scan unbounded.
|
|
19
|
+
*
|
|
20
|
+
* Exit codes: 0 = the scan ran over at least one account-surface file
|
|
21
|
+
* (findings are advisory) · 1 = zero account-surface files matched — not a
|
|
22
|
+
* pass, since a scan that read nothing has not seen a safe login, so a
|
|
23
|
+
* repository with no login code reads 1 and its caller says why · 2 = usage.
|
|
24
|
+
*/
|
|
25
|
+
import * as fs from 'node:fs';
|
|
26
|
+
import * as path from 'node:path';
|
|
27
|
+
import process from 'node:process';
|
|
28
|
+
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
29
|
+
|
|
30
|
+
import { DeadScopeError, assertScanned } from './_lib/scan_scope.js';
|
|
31
|
+
|
|
32
|
+
export type Evidence = 'violated' | 'suspected' | 'unknown' | 'not-applicable';
|
|
33
|
+
export type Remediation = 'mechanical' | 'policy' | 'migration' | 'informational';
|
|
34
|
+
|
|
35
|
+
export const MAX_FILE_BYTES = 256 * 1024;
|
|
36
|
+
|
|
37
|
+
const PREDICATE = /login|register|signup|password|reset|verify|session|oauth|callback|mfa|otp|passkey/i;
|
|
38
|
+
const CODE_EXT = new Set(['.php', '.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs']);
|
|
39
|
+
const SKIP_DIRS = new Set(['node_modules', 'vendor', '.git', 'dist', 'build', 'coverage']);
|
|
40
|
+
|
|
41
|
+
interface ClassDef {
|
|
42
|
+
id: string;
|
|
43
|
+
threat_row: string;
|
|
44
|
+
evidence: Evidence;
|
|
45
|
+
remediation: Remediation;
|
|
46
|
+
/** Returns a short, secret-free description of the hit, or null. */
|
|
47
|
+
match: (line: string, file: string) => string | null;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
const FAST_HASH = /\b(md5|sha1)\s*\(|createHash\(\s*['"](md5|sha1|sha256|sha512)['"]|\bhash\(\s*['"](md5|sha1|sha256|sha512)['"]/i;
|
|
51
|
+
const CONSTANT_TIME = /hash_equals|timingSafeEqual|compare_digest|secure_compare|safeCompare/i;
|
|
52
|
+
const SECRET_WORDS = new Set(['otp', 'token', 'secret', 'signature', 'sig', 'hmac', 'mac', 'nonce']);
|
|
53
|
+
|
|
54
|
+
/** True when one word of the operand, split on case and punctuation, names a secret. */
|
|
55
|
+
function namesSecret(operand: string): boolean {
|
|
56
|
+
return operand
|
|
57
|
+
.replace(/([a-z0-9])([A-Z])/g, '$1 $2')
|
|
58
|
+
.toLowerCase()
|
|
59
|
+
.split(/[^a-z0-9]+/)
|
|
60
|
+
.some((w) => SECRET_WORDS.has(w));
|
|
61
|
+
}
|
|
62
|
+
const SECRET_PATH = /otp|mfa|totp|2fa|signature|webhook/i;
|
|
63
|
+
const LITERAL = /^(null|undefined|true|false|NULL|\d+|'[^']*'|"[^"]*"|`[^`]*`)$/;
|
|
64
|
+
const HOST_SOURCE = /getHost\(\)|getHttpHost\(\)|getSchemeAndHttpHost\(\)|\$_SERVER\[['"]HTTP_HOST['"]\]|req(uest)?\.headers\.host|req(uest)?\.get\(\s*['"]host['"]\s*\)|req\.hostname/;
|
|
65
|
+
const TOKEN_KEY = String.raw`[^'"\x60]*(token|jwt|session|auth|bearer)[^'"\x60]*`;
|
|
66
|
+
const WEB_STORAGE_SET = new RegExp(String.raw`(localStorage|sessionStorage)\.setItem\(\s*['"\x60]${TOKEN_KEY}['"\x60]`, 'i');
|
|
67
|
+
const WEB_STORAGE_ASSIGN = new RegExp(
|
|
68
|
+
String.raw`(localStorage|sessionStorage)(\[\s*['"\x60]${TOKEN_KEY}['"\x60]\s*\]|\.\w*(token|jwt|session|auth|bearer)\w*)\s*=(?!=)`,
|
|
69
|
+
'i',
|
|
70
|
+
);
|
|
71
|
+
const DISCLOSURE = /['"`][^'"`]*(no account with|not registered|user not found|no such (user|account)|account (does not|doesn't) exist|unknown (email|user)|email (is )?not found)[^'"`]*['"`]/i;
|
|
72
|
+
|
|
73
|
+
function equalityOperands(line: string): [string, string] | null {
|
|
74
|
+
const m = line.match(/(?<![=!<>])(===|!==|==|!=)(?![=])/);
|
|
75
|
+
if (!m || m.index === undefined) return null;
|
|
76
|
+
const left = line.slice(0, m.index).trimEnd().match(/([\w$>\-.'"()[\]]+)\s*$/)?.[1] ?? '';
|
|
77
|
+
const right = line.slice(m.index + m[0].length).match(/^\s*([\w$>\-.'"()[\]]+)/)?.[1] ?? '';
|
|
78
|
+
return [left.replace(/^\(+/, ''), right.replace(/\)+$/, '')];
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export const CLASSES: readonly ClassDef[] = [
|
|
82
|
+
{
|
|
83
|
+
id: 'fast-hash',
|
|
84
|
+
threat_row: 'Fast or home-made password storage',
|
|
85
|
+
evidence: 'violated',
|
|
86
|
+
remediation: 'migration',
|
|
87
|
+
match: (line) => (FAST_HASH.test(line) && /password/i.test(line) ? 'general-purpose digest over a password' : null),
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
id: 'secret-compare',
|
|
91
|
+
threat_row: 'Unsafe secret comparison and home-made credential primitives',
|
|
92
|
+
evidence: 'violated',
|
|
93
|
+
remediation: 'mechanical',
|
|
94
|
+
match: (line, file) => {
|
|
95
|
+
if (CONSTANT_TIME.test(line)) return null;
|
|
96
|
+
const ops = equalityOperands(line);
|
|
97
|
+
if (!ops) return null;
|
|
98
|
+
const [a, b] = ops;
|
|
99
|
+
if (a === '' || b === '' || LITERAL.test(a) || LITERAL.test(b)) return null;
|
|
100
|
+
if (/\.length$|->length$|typeof/.test(a) || /\.length$|typeof/.test(b)) return null;
|
|
101
|
+
const secret = namesSecret(a) || namesSecret(b) || SECRET_PATH.test(file);
|
|
102
|
+
return secret ? 'secret compared with an ordinary equality operator' : null;
|
|
103
|
+
},
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
id: 'pepper-literal',
|
|
107
|
+
threat_row: 'Fast or home-made password storage',
|
|
108
|
+
evidence: 'violated',
|
|
109
|
+
remediation: 'migration',
|
|
110
|
+
match: (line) =>
|
|
111
|
+
/pepper\w*['"]?\s*(=>|=|:)\s*['"][^'"]+['"]/i.test(line) ? 'pepper assigned from a source literal (value withheld)' : null,
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
id: 'host-derived-reset',
|
|
115
|
+
threat_row: 'Password reset beyond the token',
|
|
116
|
+
evidence: 'violated',
|
|
117
|
+
remediation: 'mechanical',
|
|
118
|
+
match: (line, file) => (/reset|forgot|password/i.test(file) && HOST_SOURCE.test(line) ? 'link host taken from the request' : null),
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
id: 'email-linking',
|
|
122
|
+
threat_row: 'Federated sign-in account takeover',
|
|
123
|
+
evidence: 'violated',
|
|
124
|
+
remediation: 'policy',
|
|
125
|
+
match: (line) => (/allowDangerousEmailAccountLinking\s*:\s*true/.test(line) ? 'provider accounts linked on email alone' : null),
|
|
126
|
+
},
|
|
127
|
+
{
|
|
128
|
+
id: 'token-verify-off',
|
|
129
|
+
threat_row: 'Self-contained token validation bypass',
|
|
130
|
+
evidence: 'violated',
|
|
131
|
+
remediation: 'policy',
|
|
132
|
+
match: (line) =>
|
|
133
|
+
/algorithms?['"]?\s*(:|=>|=)\s*\[[^\]]*['"]none['"]/i.test(line) ||
|
|
134
|
+
/['"]?alg['"]?\s*(:|=>|=)\s*['"]none['"]/i.test(line) ||
|
|
135
|
+
/['"]?verify(_signature)?['"]?\s*(=>|:)\s*false\b/i.test(line)
|
|
136
|
+
? 'token signature verification disabled or `none` accepted'
|
|
137
|
+
: null,
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
id: 'token-in-localstorage',
|
|
141
|
+
threat_row: 'Authentication token in script-readable browser storage',
|
|
142
|
+
evidence: 'violated',
|
|
143
|
+
remediation: 'migration',
|
|
144
|
+
match: (line) =>
|
|
145
|
+
WEB_STORAGE_SET.test(line) || WEB_STORAGE_ASSIGN.test(line) ? 'auth token written to script-readable storage' : null,
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
id: 'account-disclosure',
|
|
149
|
+
threat_row: 'Account enumeration through an observable difference',
|
|
150
|
+
evidence: 'suspected',
|
|
151
|
+
remediation: 'policy',
|
|
152
|
+
match: (line) => (DISCLOSURE.test(line) ? 'response text separates an unknown account from a wrong secret' : null),
|
|
153
|
+
},
|
|
154
|
+
];
|
|
155
|
+
|
|
156
|
+
export const REMEDIATION_BY_CLASS: Readonly<Record<string, Remediation>> = Object.fromEntries(
|
|
157
|
+
CLASSES.map((c) => [c.id, c.remediation]),
|
|
158
|
+
);
|
|
159
|
+
|
|
160
|
+
/** Sub-cases the lexical classes cannot decide; listed so absence never reads as a pass. */
|
|
161
|
+
const UNDECIDED: readonly { class: string; reason: string }[] = [
|
|
162
|
+
{ class: 'pepper-literal', reason: 'a credential-table column used as the pepper needs data flow, not a line pattern' },
|
|
163
|
+
{ class: 'account-disclosure', reason: 'status codes, redirects, cookies and timing that differ per account are not string literals' },
|
|
164
|
+
{ class: 'rate-limiting', reason: 'whether a limiter is wired to the login route needs a route relation the code graph does not emit' },
|
|
165
|
+
{ class: 'session-lifecycle', reason: 'session rotation and server-side logout are behaviour, not a pattern on one line' },
|
|
166
|
+
{ class: 'mfa-enforcement', reason: 'server-side second-factor enforcement cannot be read off a single file' },
|
|
167
|
+
];
|
|
168
|
+
|
|
169
|
+
export interface Finding {
|
|
170
|
+
class: string;
|
|
171
|
+
threat_row: string;
|
|
172
|
+
file: string;
|
|
173
|
+
line: number;
|
|
174
|
+
evidence: Evidence;
|
|
175
|
+
remediation: Remediation;
|
|
176
|
+
action: 'fix-now-candidate' | 'note-and-ask';
|
|
177
|
+
options: string[];
|
|
178
|
+
detail: string;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
export interface Report {
|
|
182
|
+
measured: boolean;
|
|
183
|
+
root: string;
|
|
184
|
+
scanned_files: number;
|
|
185
|
+
findings: Finding[];
|
|
186
|
+
skipped: { file: string; reason: string }[];
|
|
187
|
+
undecided: { class: string; reason: string }[];
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
export function onAccountSurface(rel: string): boolean {
|
|
191
|
+
return CODE_EXT.has(path.extname(rel).toLowerCase()) && PREDICATE.test(rel);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
function isComment(line: string): boolean {
|
|
195
|
+
return /^\s*(\/\/|#|\*|\/\*)/.test(line);
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
function optionsFor(remediation: Remediation): string[] {
|
|
199
|
+
if (remediation === 'mechanical') return ["apply the fix with the project's existing primitive", 'leave it as is'];
|
|
200
|
+
if (remediation === 'migration') return ['plan a migration with the owner', 'leave it as is'];
|
|
201
|
+
return ['decide the policy with the owner', 'leave it as is'];
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
export function scanAccountSurface(root: string): Report {
|
|
205
|
+
const findings: Finding[] = [];
|
|
206
|
+
const skipped: { file: string; reason: string }[] = [];
|
|
207
|
+
let scanned = 0;
|
|
208
|
+
|
|
209
|
+
const walk = (dir: string): void => {
|
|
210
|
+
for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
|
|
211
|
+
const full = path.join(dir, entry.name);
|
|
212
|
+
const rel = path.relative(root, full).split(path.sep).join('/');
|
|
213
|
+
if (entry.isSymbolicLink()) {
|
|
214
|
+
skipped.push({ file: rel, reason: 'symlink not followed' });
|
|
215
|
+
continue;
|
|
216
|
+
}
|
|
217
|
+
if (entry.isDirectory()) {
|
|
218
|
+
if (!SKIP_DIRS.has(entry.name)) walk(full);
|
|
219
|
+
continue;
|
|
220
|
+
}
|
|
221
|
+
if (!entry.isFile() || !onAccountSurface(rel)) continue;
|
|
222
|
+
if (fs.statSync(full).size > MAX_FILE_BYTES) {
|
|
223
|
+
skipped.push({ file: rel, reason: `larger than ${MAX_FILE_BYTES} bytes` });
|
|
224
|
+
continue;
|
|
225
|
+
}
|
|
226
|
+
scanned += 1;
|
|
227
|
+
const lines = fs.readFileSync(full, 'utf8').split('\n');
|
|
228
|
+
lines.forEach((line, i) => {
|
|
229
|
+
if (isComment(line)) return;
|
|
230
|
+
for (const cls of CLASSES) {
|
|
231
|
+
const detail = cls.match(line, rel);
|
|
232
|
+
if (detail === null) continue;
|
|
233
|
+
findings.push({
|
|
234
|
+
class: cls.id,
|
|
235
|
+
threat_row: cls.threat_row,
|
|
236
|
+
file: rel,
|
|
237
|
+
line: i + 1,
|
|
238
|
+
evidence: cls.evidence,
|
|
239
|
+
remediation: cls.remediation,
|
|
240
|
+
action: cls.remediation === 'mechanical' ? 'fix-now-candidate' : 'note-and-ask',
|
|
241
|
+
options: optionsFor(cls.remediation),
|
|
242
|
+
detail,
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
};
|
|
248
|
+
|
|
249
|
+
walk(root);
|
|
250
|
+
|
|
251
|
+
return { measured: false, root, scanned_files: scanned, findings, skipped, undecided: [...UNDECIDED] };
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
function main(argv: string[]): number {
|
|
255
|
+
const json = argv.includes('--json');
|
|
256
|
+
const target = argv.find((a) => !a.startsWith('--'));
|
|
257
|
+
if (target === undefined) {
|
|
258
|
+
process.stderr.write('usage: check_account_surface <repo-root> [--json]\n');
|
|
259
|
+
return 2;
|
|
260
|
+
}
|
|
261
|
+
const root = path.resolve(target);
|
|
262
|
+
if (!fs.existsSync(root) || !fs.statSync(root).isDirectory()) {
|
|
263
|
+
process.stderr.write(`check_account_surface: ${root} is not a directory\n`);
|
|
264
|
+
return 2;
|
|
265
|
+
}
|
|
266
|
+
const report = scanAccountSurface(root);
|
|
267
|
+
if (json) {
|
|
268
|
+
process.stdout.write(`${JSON.stringify(report, null, 2)}\n`);
|
|
269
|
+
} else {
|
|
270
|
+
process.stdout.write('check_account_surface — UNMEASURED: claim account-surface-finds-planted is unbacked\n');
|
|
271
|
+
for (const f of report.findings) {
|
|
272
|
+
process.stdout.write(` [${f.evidence}] ${f.class} ${f.file}:${f.line} — ${f.detail} (${f.remediation}, ${f.action}; threat: ${f.threat_row})\n`);
|
|
273
|
+
}
|
|
274
|
+
for (const s of report.skipped) process.stdout.write(` skipped ${s.file}: ${s.reason}\n`);
|
|
275
|
+
for (const u of report.undecided) process.stdout.write(` undecided ${u.class}: ${u.reason}\n`);
|
|
276
|
+
process.stdout.write(`${report.scanned_files} account-surface file(s) scanned, ${report.findings.length} finding(s); absence of a finding is not a pass\n`);
|
|
277
|
+
}
|
|
278
|
+
// A warning here used to sit beside `return 0`: a gate whose predicate
|
|
279
|
+
// matched nothing reported "no findings" and passed, which is the shape
|
|
280
|
+
// `assertScanned` exists to refuse — an absence of findings over an empty
|
|
281
|
+
// corpus is not a reading. The deletion test applies: if the account
|
|
282
|
+
// surface moved or the predicate stopped matching, the reason "no findings"
|
|
283
|
+
// would still print and still be false, so no `allowEmpty` is written here.
|
|
284
|
+
try {
|
|
285
|
+
assertScanned({
|
|
286
|
+
gate: 'check_account_surface',
|
|
287
|
+
scanned: report.scanned_files,
|
|
288
|
+
units: 'account-surface file(s)',
|
|
289
|
+
roots: [path.relative(root, root) || '.'],
|
|
290
|
+
});
|
|
291
|
+
} catch (exc) {
|
|
292
|
+
if (exc instanceof DeadScopeError) {
|
|
293
|
+
process.stderr.write(`❌ ${exc.message}\n`);
|
|
294
|
+
return 1;
|
|
295
|
+
}
|
|
296
|
+
throw exc;
|
|
297
|
+
}
|
|
298
|
+
return 0;
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
/**
|
|
302
|
+
* True when this module is the process entry. Compared as resolved URLs, then
|
|
303
|
+
* as real paths: a raw `file://` string misses spaces, percent-encoding and
|
|
304
|
+
* symlinked paths (macOS `/var`), and a missed match exits 0 having run nothing.
|
|
305
|
+
*/
|
|
306
|
+
function isCliEntry(): boolean {
|
|
307
|
+
if (process.argv[1] === undefined) return false;
|
|
308
|
+
try {
|
|
309
|
+
return import.meta.url === pathToFileURL(path.resolve(process.argv[1])).href ||
|
|
310
|
+
fs.realpathSync(fileURLToPath(import.meta.url)) === fs.realpathSync(path.resolve(process.argv[1]));
|
|
311
|
+
} catch {
|
|
312
|
+
return false;
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
if (isCliEntry()) {
|
|
317
|
+
process.exit(main(process.argv.slice(2)));
|
|
318
|
+
}
|
|
@@ -11,8 +11,10 @@
|
|
|
11
11
|
* possible here, but it IS a reason to write the limit down: a gate whose reach
|
|
12
12
|
* is not stated gets cited as broader than it is.
|
|
13
13
|
*
|
|
14
|
-
* The outward-facing half is `
|
|
15
|
-
*
|
|
14
|
+
* The outward-facing half is the `artifact-location` row of `agent-config
|
|
15
|
+
* doctor` (`_lib/install_reach_checks.ts`). It runs the SAME detector, imported
|
|
16
|
+
* from `_lib/agent_artifact_location.ts`, reports a `warn` that never moves a
|
|
17
|
+
* file, and fails only under `doctor --strict --strict-level warn`.
|
|
16
18
|
*
|
|
17
19
|
* The constraint the detection rests on: every other mechanism that governs a
|
|
18
20
|
* roadmap is keyed on the roadmap root, so a file placed outside it is governed
|
|
@@ -46,170 +48,25 @@ import * as os from 'node:os';
|
|
|
46
48
|
import * as path from 'node:path';
|
|
47
49
|
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
48
50
|
|
|
49
|
-
import {
|
|
51
|
+
import { ROADMAP_ROOT_REL, scan, type ScanResult } from './_lib/agent_artifact_location.js';
|
|
50
52
|
import { reportScanned, DeadScopeError } from './_lib/scan_scope.js';
|
|
51
53
|
import { runGateCli, runSelfTest, type SelfTestCase } from './_lib/gate_self_test.js';
|
|
52
54
|
|
|
55
|
+
// The detector moved to `_lib/agent_artifact_location.ts` so `doctor` can share
|
|
56
|
+
// it; re-exported here so this gate's existing importers keep resolving.
|
|
57
|
+
export {
|
|
58
|
+
ROADMAP_ROOT_REL,
|
|
59
|
+
isReviewInputRoadmapSnapshot,
|
|
60
|
+
roadmapShape,
|
|
61
|
+
scan,
|
|
62
|
+
type Finding,
|
|
63
|
+
type ScanResult,
|
|
64
|
+
type Shape,
|
|
65
|
+
} from './_lib/agent_artifact_location.js';
|
|
66
|
+
|
|
53
67
|
const _HERE = fileURLToPath(import.meta.url);
|
|
54
68
|
const REPO_ROOT = path.resolve(path.dirname(_HERE), '..', '..');
|
|
55
69
|
|
|
56
|
-
/** The one legitimate home. Everything else is a finding. */
|
|
57
|
-
export const ROADMAP_ROOT_REL = 'agents/roadmaps';
|
|
58
|
-
|
|
59
|
-
/**
|
|
60
|
-
* Directories the walk never enters.
|
|
61
|
-
*
|
|
62
|
-
* `dist/` and the per-tool projection trees are generated copies — a finding
|
|
63
|
-
* there is a finding about `src/`, reported twice. `node_modules` and `.git`
|
|
64
|
-
* are not this repository's prose.
|
|
65
|
-
*/
|
|
66
|
-
const SKIP_DIRS: ReadonlySet<string> = new Set([
|
|
67
|
-
'.git',
|
|
68
|
-
'node_modules',
|
|
69
|
-
'dist',
|
|
70
|
-
'.augment',
|
|
71
|
-
'.claude',
|
|
72
|
-
'.cursor',
|
|
73
|
-
'.clinerules',
|
|
74
|
-
'.agents',
|
|
75
|
-
'coverage',
|
|
76
|
-
'.venv',
|
|
77
|
-
]);
|
|
78
|
-
|
|
79
|
-
/** Frontmatter keys that only a roadmap carries in this tree. */
|
|
80
|
-
const FM_ROADMAP_RE = /^complexity:[ \t]*(lightweight|structural)[ \t]*$/m;
|
|
81
|
-
/**
|
|
82
|
-
* Anchored at the absolute start of the string — `^` with no `m` flag — on
|
|
83
|
-
* purpose: this is a FRONTMATTER fence, which by the project's own convention
|
|
84
|
-
* only means something at byte offset 0 of the file. A `---` fence that
|
|
85
|
-
* begins three lines in is not frontmatter, it is a horizontal rule or a
|
|
86
|
-
* quoted example, so loosening this to `m` would create false positives of
|
|
87
|
-
* its own.
|
|
88
|
-
*
|
|
89
|
-
* The R2 review-input roadmap snapshots used to depend on that strictness as an
|
|
90
|
-
* INCIDENTAL exemption: their two-line HTML-comment header, written for a
|
|
91
|
-
* different gate, pushed this fence off offset 0. They are now exempt by path —
|
|
92
|
-
* see `isReviewInputRoadmapSnapshot` — so neither the header nor this regex's
|
|
93
|
-
* anchoring decides their fate any more.
|
|
94
|
-
*
|
|
95
|
-
* Tested in `check_agent_artifact_location.test.ts`
|
|
96
|
-
* (describe: "review-input snapshot convention").
|
|
97
|
-
*/
|
|
98
|
-
const FM_RE = /^---\n([\s\S]*?)\n---/;
|
|
99
|
-
const PHASE_RE = /^##[ \t]+Phase[ \t]/m;
|
|
100
|
-
const CHECKBOX_RE = /^[ \t]*- \[[ x~-]\][ \t]/m;
|
|
101
|
-
|
|
102
|
-
export interface Shape {
|
|
103
|
-
/** Which signals fired. Empty means not roadmap-shaped. */
|
|
104
|
-
readonly signals: readonly string[];
|
|
105
|
-
readonly isRoadmap: boolean;
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
/**
|
|
109
|
-
* Decide whether a file's CONTENT is a roadmap.
|
|
110
|
-
*
|
|
111
|
-
* All three signals are required. Each is individually common; together they are
|
|
112
|
-
* this repository's roadmap format and nothing else's.
|
|
113
|
-
*/
|
|
114
|
-
export function roadmapShape(text: string): Shape {
|
|
115
|
-
const signals: string[] = [];
|
|
116
|
-
const fm = FM_RE.exec(text);
|
|
117
|
-
if (fm !== null && FM_ROADMAP_RE.test(fm[1] as string)) {
|
|
118
|
-
signals.push('roadmap frontmatter (`complexity:` lightweight|structural)');
|
|
119
|
-
}
|
|
120
|
-
if (PHASE_RE.test(text)) {
|
|
121
|
-
signals.push('a `## Phase` heading');
|
|
122
|
-
}
|
|
123
|
-
if (CHECKBOX_RE.test(text)) {
|
|
124
|
-
signals.push('at least one checkbox step');
|
|
125
|
-
}
|
|
126
|
-
return { signals, isRoadmap: signals.length === 3 };
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
export interface Finding {
|
|
130
|
-
readonly rel: string;
|
|
131
|
-
readonly signals: readonly string[];
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
export interface ScanResult {
|
|
135
|
-
readonly findings: readonly Finding[];
|
|
136
|
-
/** Every `.md` file the walk visited — the scope, not the matches. */
|
|
137
|
-
readonly scanned: number;
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
function walkMarkdown(root: string): string[] {
|
|
141
|
-
const out: string[] = [];
|
|
142
|
-
const stack = [root];
|
|
143
|
-
while (stack.length > 0) {
|
|
144
|
-
const cur = stack.pop() as string;
|
|
145
|
-
let entries: fs.Dirent[];
|
|
146
|
-
try {
|
|
147
|
-
entries = fs.readdirSync(cur, { withFileTypes: true });
|
|
148
|
-
} catch {
|
|
149
|
-
continue;
|
|
150
|
-
}
|
|
151
|
-
for (const e of entries) {
|
|
152
|
-
if (e.isSymbolicLink()) continue;
|
|
153
|
-
const full = path.join(cur, e.name);
|
|
154
|
-
if (e.isDirectory()) {
|
|
155
|
-
if (!SKIP_DIRS.has(e.name)) stack.push(full);
|
|
156
|
-
} else if (e.name.toLowerCase().endsWith('.md')) {
|
|
157
|
-
out.push(full);
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
return out.sort();
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
/**
|
|
165
|
-
* The one declared exemption: an R2 review-input roadmap snapshot.
|
|
166
|
-
*
|
|
167
|
-
* `dispatch_r2_reviewer.ts` writes a verbatim roadmap copy to exactly this
|
|
168
|
-
* shape, and a file in it is non-authoritative evidence whoever wrote it —
|
|
169
|
-
* nothing reads it back as a roadmap. Decided by path, not by a marker an
|
|
170
|
-
* author could type anywhere (authority-routing roadmap 5.1, `## Decisions`):
|
|
171
|
-
* measured 2026-10-07, every roadmap-shaped file outside the root was one of
|
|
172
|
-
* these snapshots, so the path names the whole population and nothing else.
|
|
173
|
-
* Takes the repository-relative POSIX path the walker produces; the walker
|
|
174
|
-
* never follows a symlink, so a link cannot manufacture an exempt path.
|
|
175
|
-
*/
|
|
176
|
-
const REVIEW_INPUT_SNAPSHOT_PATH_RE = /^agents\/evidence\/(?:[^/]+\/)*[^/.][^/]*\.review-input\/roadmap\.md$/;
|
|
177
|
-
|
|
178
|
-
export function isReviewInputRoadmapSnapshot(rel: string): boolean {
|
|
179
|
-
return REVIEW_INPUT_SNAPSHOT_PATH_RE.test(rel) && !rel.split('/').some((s) => s === '..' || s === '.');
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
/** `true` when `child` is at or below `root`. */
|
|
183
|
-
function isUnder(child: string, root: string): boolean {
|
|
184
|
-
const rel = path.relative(root, child);
|
|
185
|
-
return rel !== '' && !rel.startsWith('..') && !path.isAbsolute(rel);
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
export function scan(root: string): ScanResult {
|
|
189
|
-
const roadmapRoot = path.join(root, ...ROADMAP_ROOT_REL.split('/'));
|
|
190
|
-
const files = walkMarkdown(root);
|
|
191
|
-
const findings: Finding[] = [];
|
|
192
|
-
for (const f of files) {
|
|
193
|
-
if (isUnder(f, roadmapRoot)) continue;
|
|
194
|
-
if (isReviewInputRoadmapSnapshot(path.relative(root, f).split(path.sep).join('/'))) continue;
|
|
195
|
-
// Cheap name pre-filter first — the SHARED definition, imported, so the
|
|
196
|
-
// roadmap corpus and this guard cannot drift apart.
|
|
197
|
-
if (!isRoadmapCandidate(f)) continue;
|
|
198
|
-
let text: string;
|
|
199
|
-
try {
|
|
200
|
-
text = fs.readFileSync(f, 'utf-8');
|
|
201
|
-
} catch {
|
|
202
|
-
continue;
|
|
203
|
-
}
|
|
204
|
-
const shape = roadmapShape(text);
|
|
205
|
-
if (!shape.isRoadmap) continue;
|
|
206
|
-
findings.push({
|
|
207
|
-
rel: path.relative(root, f).split(path.sep).join('/'),
|
|
208
|
-
signals: shape.signals,
|
|
209
|
-
});
|
|
210
|
-
}
|
|
211
|
-
return { findings, scanned: files.length };
|
|
212
|
-
}
|
|
213
70
|
|
|
214
71
|
interface Args {
|
|
215
72
|
quiet: boolean;
|
|
@@ -103,11 +103,17 @@ const REPO = path.resolve(path.dirname(_HERE), '..', '..');
|
|
|
103
103
|
// in case a future change tracks them too — `git ls-files` on an untracked
|
|
104
104
|
// directory returns nothing, so listing an as-yet-untracked root here is
|
|
105
105
|
// always safe.
|
|
106
|
+
// The last entry is a pathspec, not a directory: the skill-script bundles sit
|
|
107
|
+
// one per skill under `src/skills/`, and naming that directory would pull in
|
|
108
|
+
// every corpus and prose file beside them. `src/` rather than the projection
|
|
109
|
+
// because the two are byte-identical by the condensation invariant, and this
|
|
110
|
+
// is the copy whose author can fix it.
|
|
106
111
|
const BUNDLE_ROOTS: readonly string[] = [
|
|
107
112
|
'dist/install',
|
|
108
113
|
'dist/hooks',
|
|
109
114
|
'dist/mcp',
|
|
110
115
|
'dist/cli-delegate',
|
|
116
|
+
'src/skills/*/scripts/*.mjs',
|
|
111
117
|
];
|
|
112
118
|
|
|
113
119
|
/**
|
|
@@ -349,6 +349,14 @@ export function main(argv: readonly string[] = process.argv.slice(2)): number {
|
|
|
349
349
|
}
|
|
350
350
|
const r = analyse(REPO, mf);
|
|
351
351
|
|
|
352
|
+
// In `--format json` every other line goes to stderr: stdout carries the
|
|
353
|
+
// document and nothing else. Measured 2026-10-14 before this change —
|
|
354
|
+
// `JSON.parse` on stdout failed at position 28 039, because the narration
|
|
355
|
+
// below was appended to the document a caller was trying to read.
|
|
356
|
+
const say = (text: string): void => {
|
|
357
|
+
(wantJson ? process.stderr : process.stdout).write(text);
|
|
358
|
+
};
|
|
359
|
+
|
|
352
360
|
if (wantJson) {
|
|
353
361
|
process.stdout.write(`${JSON.stringify({ generated_by: 'check_ci_local_parity', ...r }, null, 2)}\n`);
|
|
354
362
|
}
|
|
@@ -360,11 +368,11 @@ export function main(argv: readonly string[] = process.argv.slice(2)): number {
|
|
|
360
368
|
let failed = false;
|
|
361
369
|
if (r.undeclared_ci_only.length > 0) {
|
|
362
370
|
failed = true;
|
|
363
|
-
|
|
371
|
+
say(
|
|
364
372
|
`❌ ${String(r.undeclared_ci_only.length)} gate(s) run in CI but are unreachable locally:\n`,
|
|
365
373
|
);
|
|
366
|
-
for (const g of r.undeclared_ci_only)
|
|
367
|
-
|
|
374
|
+
for (const g of r.undeclared_ci_only) say(` - ${g}\n`);
|
|
375
|
+
say(
|
|
368
376
|
"\n Either wire it into the `task ci` chain, or declare it under `ci_only:` in\n" +
|
|
369
377
|
' src/config/ci-local-parity.yml with the reason it cannot run locally.\n' +
|
|
370
378
|
' Undeclared, it means a contributor discovers this failure only after pushing.\n',
|
|
@@ -387,30 +395,30 @@ export function main(argv: readonly string[] = process.argv.slice(2)): number {
|
|
|
387
395
|
});
|
|
388
396
|
if (!parity.ok) {
|
|
389
397
|
failed = true;
|
|
390
|
-
|
|
391
|
-
for (const g of r.undeclared_local_only)
|
|
392
|
-
|
|
398
|
+
say(`❌ ${parity.message}\n`);
|
|
399
|
+
for (const g of r.undeclared_local_only) say(` - ${g}\n`);
|
|
400
|
+
say(
|
|
393
401
|
'\n Prefer adding it to a workflow — this is the direction that let real defects\n' +
|
|
394
402
|
' merge (16 stale index rows reached main behind a local-only check-index).\n' +
|
|
395
403
|
' If remote enforcement is genuinely not wanted, declare it under `local_only:`.\n' +
|
|
396
404
|
' Raising the baseline is a defect, not a fix.\n',
|
|
397
405
|
);
|
|
398
406
|
} else {
|
|
399
|
-
|
|
407
|
+
say(`ℹ️ ${parity.message}\n`);
|
|
400
408
|
}
|
|
401
409
|
if (r.stale_declarations.length > 0) {
|
|
402
410
|
failed = true;
|
|
403
|
-
|
|
411
|
+
say(
|
|
404
412
|
`❌ ${String(r.stale_declarations.length)} stale declaration(s) — now on BOTH sides, so the exemption is dead:\n`,
|
|
405
413
|
);
|
|
406
|
-
for (const g of r.stale_declarations)
|
|
414
|
+
for (const g of r.stale_declarations) say(` - ${g}\n`);
|
|
407
415
|
}
|
|
408
416
|
|
|
409
417
|
// Round 7 § 3.2 — printed on EVERY path, pass or fail, because the number is
|
|
410
418
|
// the deliverable. A green parity verdict above says the local MIRROR matches
|
|
411
419
|
// CI; it says nothing about the pass a contributor is told to run, and reading
|
|
412
420
|
// the green line as if it did is the implication this block removes.
|
|
413
|
-
|
|
421
|
+
say(
|
|
414
422
|
`ℹ️ preflight: ${String(r.preflight_gates.length)} gate(s) of the ${String(r.local_gates.length)} local ones; ` +
|
|
415
423
|
`${String(r.ci_not_in_preflight.length)} CI-enforced gate(s) run NEITHER in \`task preflight\` NOR\n` +
|
|
416
424
|
' anywhere else the pre-push hook reaches — i.e. the set that can only fail after\n' +
|
|
@@ -418,10 +426,10 @@ export function main(argv: readonly string[] = process.argv.slice(2)): number {
|
|
|
418
426
|
' Report-only: the subset is deliberate (see the preflight docstring). A green\n' +
|
|
419
427
|
' preflight is therefore not a prediction that CI will be green.\n',
|
|
420
428
|
);
|
|
421
|
-
for (const g of r.ci_not_in_preflight)
|
|
429
|
+
for (const g of r.ci_not_in_preflight) say(` · ${g}\n`);
|
|
422
430
|
|
|
423
431
|
if (!failed) {
|
|
424
|
-
|
|
432
|
+
say(
|
|
425
433
|
`✅ CI ↔ local parity: ${String(r.ci_gates.length)} CI gate(s), ${String(r.local_gates.length)} local, ` +
|
|
426
434
|
`${String(mf.ci_only.length)} declared CI-only, ${String(mf.local_only.length)} declared local-only.\n`,
|
|
427
435
|
);
|
|
@@ -441,5 +449,5 @@ function _isCliEntry(): boolean {
|
|
|
441
449
|
}
|
|
442
450
|
|
|
443
451
|
if (_isCliEntry()) {
|
|
444
|
-
process.
|
|
452
|
+
process.exitCode = main();
|
|
445
453
|
}
|