@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
|
@@ -2,38 +2,53 @@
|
|
|
2
2
|
* ratification_subject — the digest a ratification record carries over the
|
|
3
3
|
* gated content it reviewed.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
* re-assembles — it never restates the membership rule, because a second
|
|
5
|
+
* The record says WHO reviewed; without a digest it does not say WHAT, so a
|
|
6
|
+
* gated file edited after its review would still ship under a record that
|
|
7
|
+
* approved something else.
|
|
8
|
+
*
|
|
9
|
+
* WHY IT ASKS THE GATE RATHER THAN RE-DECIDING IT. The gate's `classifyPaths`
|
|
10
|
+
* returns the kernel rules, hooks and plumbing by name but reports the self
|
|
11
|
+
* surface as a BOOLEAN, so that part of the gated list cannot be read back out
|
|
12
|
+
* of it. This module therefore filters the changed files through the gate's own
|
|
13
|
+
* `isMechanismPath` — it never restates the membership rule, because a second
|
|
15
14
|
* definition of "gated" is a second thing to keep in step, and the first time
|
|
16
15
|
* the two diverged a file would be reviewed by one and digested by the other.
|
|
16
|
+
* Asking the predicate means a path the gate adds to its mechanism set is
|
|
17
|
+
* digested with no edit here. It is called per file, never at module scope,
|
|
18
|
+
* because the two modules import each other and the gate's constants are not
|
|
19
|
+
* initialised while this one evaluates.
|
|
20
|
+
*
|
|
21
|
+
* WHAT IT READS: GIT OBJECTS AT A NAMED REVISION, NEVER THE WORKING TREE. The
|
|
22
|
+
* revision is resolved to a commit, each gated path is looked up in that
|
|
23
|
+
* commit's tree, and a blob's bytes come from the object store. The filesystem
|
|
24
|
+
* is not consulted for gated content at all, so a dirty working tree, a
|
|
25
|
+
* symbolic link at the path or at any ancestor directory, a FIFO, a device and
|
|
26
|
+
* a file swapped between two system calls are outside what the digest can
|
|
27
|
+
* observe — not defended against one by one, but unreachable by construction.
|
|
28
|
+
* The digest therefore describes what a commit contains, which is what a push
|
|
29
|
+
* or a merge would land.
|
|
30
|
+
*
|
|
31
|
+
* WHAT A TREE ENTRY MAY BE. Absent, or a blob with a regular-file mode
|
|
32
|
+
* (`100644`, `100755`). A blob with mode `120000` — a symbolic link — is
|
|
33
|
+
* REFUSED: its effective content lives at whatever path it names, which the
|
|
34
|
+
* gate's classifier does not see, so neither hashing the target string nor
|
|
35
|
+
* following it would describe what a reviewer approves. A tree (directory) or
|
|
36
|
+
* a gitlink (submodule) at a gated path is refused for the same reason: it is
|
|
37
|
+
* not a file whose bytes a review could have read.
|
|
17
38
|
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
39
|
+
* WHAT IT DOES NOT COVER. Which paths are gated is still decided by code and
|
|
40
|
+
* by an import closure read from the running checkout — in CI that code is the
|
|
41
|
+
* base revision's, locally it is the checkout's own, and a local edit to the
|
|
42
|
+
* judging code is outside what any digest can answer.
|
|
22
43
|
*/
|
|
23
44
|
|
|
45
|
+
import { spawnSync, type SpawnSyncReturns } from 'node:child_process';
|
|
24
46
|
import { createHash } from 'node:crypto';
|
|
25
|
-
import * as fs from 'node:fs';
|
|
26
|
-
import * as path from 'node:path';
|
|
27
47
|
|
|
28
|
-
import {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
READER_PATH,
|
|
33
|
-
SELF_PATH,
|
|
34
|
-
WORKFLOW_PATH,
|
|
35
|
-
classifyPaths,
|
|
36
|
-
} from '../check_kernel_edit_ratified.js';
|
|
48
|
+
import { classifyPaths, isMechanismPath } from '../check_kernel_edit_ratified.js';
|
|
49
|
+
|
|
50
|
+
/** The revision a digest is taken at when the caller names none. */
|
|
51
|
+
export const DEFAULT_REVISION = 'HEAD';
|
|
37
52
|
|
|
38
53
|
/**
|
|
39
54
|
* Stands in for the content of a gated file the change deletes. A deleted file
|
|
@@ -43,15 +58,404 @@ import {
|
|
|
43
58
|
*/
|
|
44
59
|
export const DELETED_MARKER = '\u0000deleted\u0000';
|
|
45
60
|
|
|
46
|
-
/**
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
]);
|
|
61
|
+
/**
|
|
62
|
+
* The mode slot of a deleted entry — Git's own null mode, which no tree entry
|
|
63
|
+
* carries, so a deletion cannot collide with a file whose bytes happen to be
|
|
64
|
+
* {@link DELETED_MARKER}.
|
|
65
|
+
*/
|
|
66
|
+
export const DELETED_MODE = '000000';
|
|
67
|
+
|
|
68
|
+
/** The tree-entry modes this digest describes: a regular file, plain or executable. */
|
|
69
|
+
const REGULAR_MODES: ReadonlySet<string> = new Set(['100644', '100755']);
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Upper bound on one blob read. A gated file is a rule, a hook or a config;
|
|
73
|
+
* one larger than this is not something a review read either, and exceeding it
|
|
74
|
+
* is a refusal rather than a silent truncation.
|
|
75
|
+
*/
|
|
76
|
+
const MAX_BLOB_BYTES = 32 * 1024 * 1024;
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Every way the subject computation declines to describe a revision.
|
|
80
|
+
*
|
|
81
|
+
* The callers — the gate's `evaluate()` and the CLI — catch THIS class and
|
|
82
|
+
* nothing broader, so a new refusal is one subclass rather than an edit to
|
|
83
|
+
* every catch, and an error that is not a refusal (a defect in this code)
|
|
84
|
+
* still escapes as a crash instead of being reported as a property of the
|
|
85
|
+
* repository.
|
|
86
|
+
*/
|
|
87
|
+
export class GatedSubjectRefusal extends Error {
|
|
88
|
+
readonly rel: string;
|
|
89
|
+
|
|
90
|
+
constructor(rel: string, message: string) {
|
|
91
|
+
super(message);
|
|
92
|
+
this.rel = rel;
|
|
93
|
+
this.name = 'GatedSubjectRefusal';
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Raised when a gated path is not a path inside a tree.
|
|
99
|
+
*
|
|
100
|
+
* Fails CLOSED rather than dropping the path — see {@link assertContained}
|
|
101
|
+
* for why that direction is the safe one.
|
|
102
|
+
*/
|
|
103
|
+
export class GatedPathEscapes extends GatedSubjectRefusal {
|
|
104
|
+
constructor(rel: string) {
|
|
105
|
+
super(
|
|
106
|
+
rel,
|
|
107
|
+
`gated path \`${rel}\` is absolute or contains a \`..\` segment, so it names nothing ` +
|
|
108
|
+
'inside the revision under review — the digest refuses rather than describing ' +
|
|
109
|
+
'content that is not in the change',
|
|
110
|
+
);
|
|
111
|
+
this.name = 'GatedPathEscapes';
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Raised when a gated path's tree entry is not absent and not a regular file.
|
|
117
|
+
*/
|
|
118
|
+
export class GatedPathUnsupported extends GatedSubjectRefusal {
|
|
119
|
+
readonly kind: string;
|
|
120
|
+
|
|
121
|
+
constructor(rel: string, kind: string, why: string) {
|
|
122
|
+
super(rel, `gated path \`${rel}\` ${why} — the digest refuses rather than describing it`);
|
|
123
|
+
this.kind = kind;
|
|
124
|
+
this.name = 'GatedPathUnsupported';
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Raised when the revision does not resolve to a commit in the repository at
|
|
130
|
+
* the root — an unknown name, a root that is not a repository, or a string that
|
|
131
|
+
* would be read as an option.
|
|
132
|
+
*/
|
|
133
|
+
export class GatedRevisionUnresolved extends GatedSubjectRefusal {
|
|
134
|
+
readonly revision: string;
|
|
135
|
+
|
|
136
|
+
constructor(revision: string, detail: string) {
|
|
137
|
+
super(
|
|
138
|
+
'',
|
|
139
|
+
`revision \`${revision}\` does not resolve to a commit (${detail}) — the digest is ` +
|
|
140
|
+
'taken over a commit and refuses rather than guessing which one',
|
|
141
|
+
);
|
|
142
|
+
this.revision = revision;
|
|
143
|
+
this.name = 'GatedRevisionUnresolved';
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/** Raised when no `git` executable can be started. */
|
|
148
|
+
export class GitUnavailable extends GatedSubjectRefusal {
|
|
149
|
+
constructor(detail: string) {
|
|
150
|
+
super(
|
|
151
|
+
'',
|
|
152
|
+
`git could not be started (${detail}) — the digest is read from Git objects and ` +
|
|
153
|
+
'refuses rather than falling back to the working tree',
|
|
154
|
+
);
|
|
155
|
+
this.name = 'GitUnavailable';
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/** Raised when a git command over a resolved revision fails. */
|
|
160
|
+
export class GitReadFailed extends GatedSubjectRefusal {
|
|
161
|
+
constructor(rel: string, what: string, detail: string) {
|
|
162
|
+
super(
|
|
163
|
+
rel,
|
|
164
|
+
`git ${what} failed (${detail}) — the digest refuses to describe a revision it ` +
|
|
165
|
+
'could not read',
|
|
166
|
+
);
|
|
167
|
+
this.name = 'GitReadFailed';
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* `..` as a whole segment, under either separator. The CLI and the gate
|
|
173
|
+
* normalise `\` to `/` before classifying, but this bound is checked on the
|
|
174
|
+
* string it is given so that it holds for any caller.
|
|
175
|
+
*/
|
|
176
|
+
const ESCAPING_SEGMENT = /(?:^|[\\/])\.\.(?:[\\/]|$)/u;
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* POSIX-absolute, UNC (`\\server\share`, `//server/share`), rooted (`\x`) and
|
|
180
|
+
* drive-qualified (`C:\x`, `C:x`) paths.
|
|
181
|
+
*/
|
|
182
|
+
const ABSOLUTE_SHAPE = /^(?:[\\/]|[A-Za-z]:)/u;
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* Refuse a gated path that is not a path inside a tree.
|
|
186
|
+
*
|
|
187
|
+
* The gate's `KERNEL_RULE_PATH_RE` is not anchored at the start, so a path
|
|
188
|
+
* such as `../../elsewhere/rules/commit-policy.md` classifies as a kernel rule.
|
|
189
|
+
* No tree entry can carry that name, so looking it up would report it ABSENT
|
|
190
|
+
* and enter it as a deletion — a gated path silently described as something
|
|
191
|
+
* it is not. It FAILS CLOSED rather than dropping the path: dropping it would
|
|
192
|
+
* make the digest cover less than the gate gated.
|
|
193
|
+
*/
|
|
194
|
+
export function assertContained(rel: string): void {
|
|
195
|
+
if (ABSOLUTE_SHAPE.test(rel) || ESCAPING_SEGMENT.test(rel)) {
|
|
196
|
+
throw new GatedPathEscapes(rel);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
/**
|
|
201
|
+
* Environment variables that tell git which repository to use. Inherited from
|
|
202
|
+
* a calling hook they would point every command below at that repository
|
|
203
|
+
* instead of `root`, so they are dropped and `-C root` alone decides.
|
|
204
|
+
*/
|
|
205
|
+
const LOCATING_ENV = [
|
|
206
|
+
'GIT_DIR',
|
|
207
|
+
'GIT_WORK_TREE',
|
|
208
|
+
'GIT_INDEX_FILE',
|
|
209
|
+
'GIT_OBJECT_DIRECTORY',
|
|
210
|
+
'GIT_ALTERNATE_OBJECT_DIRECTORIES',
|
|
211
|
+
'GIT_COMMON_DIR',
|
|
212
|
+
'GIT_NAMESPACE',
|
|
213
|
+
];
|
|
214
|
+
|
|
215
|
+
function gitEnv(): NodeJS.ProcessEnv {
|
|
216
|
+
// Literal pathspecs: a gated path is a name, and a `*` in it must not
|
|
217
|
+
// match a sibling.
|
|
218
|
+
const env: NodeJS.ProcessEnv = { ...process.env, GIT_LITERAL_PATHSPECS: '1' };
|
|
219
|
+
for (const k of LOCATING_ENV) delete env[k];
|
|
220
|
+
return env;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
/**
|
|
224
|
+
* Run git in `root`. A spawn that could not start is a typed refusal; a
|
|
225
|
+
* non-zero exit is left to the caller, which knows what it means.
|
|
226
|
+
*
|
|
227
|
+
* Invalid arguments make `spawnSync` THROW rather than return an error, so a
|
|
228
|
+
* programming defect here is never mistaken for a property of the repository.
|
|
229
|
+
*/
|
|
230
|
+
function runGit(root: string, args: readonly string[], rel: string): SpawnSyncReturns<Buffer> {
|
|
231
|
+
const res = spawnSync('git', ['-C', root, ...args], {
|
|
232
|
+
env: gitEnv(),
|
|
233
|
+
maxBuffer: MAX_BLOB_BYTES,
|
|
234
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
235
|
+
});
|
|
236
|
+
if (res.error !== undefined) {
|
|
237
|
+
const code = (res.error as NodeJS.ErrnoException).code;
|
|
238
|
+
if (code === 'ENOENT') {
|
|
239
|
+
throw new GitUnavailable(code);
|
|
240
|
+
}
|
|
241
|
+
throw new GitReadFailed(rel, args[0] ?? '', res.error.message);
|
|
242
|
+
}
|
|
243
|
+
return res;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
function stderrOf(res: SpawnSyncReturns<Buffer>): string {
|
|
247
|
+
const text = res.stderr.toString('utf8').trim().split('\n')[0] ?? '';
|
|
248
|
+
return text === '' ? `exit ${String(res.status)}` : text;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
/**
|
|
252
|
+
* Resolve `revision` to a commit id in the repository whose top level is
|
|
253
|
+
* `root`.
|
|
254
|
+
*
|
|
255
|
+
* A revision beginning with `-` is refused before git sees it, so it can never
|
|
256
|
+
* be read as an option. A `root` that is a SUBDIRECTORY of a repository is
|
|
257
|
+
* refused too: git would discover the enclosing repository and the gated
|
|
258
|
+
* paths, which are relative to `root`, would be looked up at its top level.
|
|
259
|
+
*/
|
|
260
|
+
export function resolveRevision(root: string, revision: string): string {
|
|
261
|
+
if (revision === '' || revision.startsWith('-')) {
|
|
262
|
+
throw new GatedRevisionUnresolved(revision, 'empty, or shaped like an option');
|
|
263
|
+
}
|
|
264
|
+
const prefix = runGit(root, ['rev-parse', '--show-prefix'], '');
|
|
265
|
+
if (prefix.status !== 0) {
|
|
266
|
+
throw new GatedRevisionUnresolved(revision, stderrOf(prefix));
|
|
267
|
+
}
|
|
268
|
+
if (prefix.stdout.toString('utf8').trim() !== '') {
|
|
269
|
+
throw new GatedRevisionUnresolved(
|
|
270
|
+
revision,
|
|
271
|
+
`\`${root}\` is inside a repository but is not its top level`,
|
|
272
|
+
);
|
|
273
|
+
}
|
|
274
|
+
const res = runGit(root, ['rev-parse', '--verify', '--quiet', `${revision}^{commit}`], '');
|
|
275
|
+
const oid = res.stdout.toString('utf8').trim();
|
|
276
|
+
if (res.status !== 0 || !/^[0-9a-f]{40,64}$/u.test(oid)) {
|
|
277
|
+
throw new GatedRevisionUnresolved(revision, stderrOf(res));
|
|
278
|
+
}
|
|
279
|
+
return oid;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
/**
|
|
283
|
+
* Whether `ref` names a commit in the repository at `root`, through the
|
|
284
|
+
* scrubbed runner — the gate's default-base probe, which must look in the same
|
|
285
|
+
* repository the diff and the digest read.
|
|
286
|
+
*/
|
|
287
|
+
export function refExists(root: string, ref: string): boolean {
|
|
288
|
+
// Same guard as resolveRevision: a `-`-led ref would be read as an option.
|
|
289
|
+
if (ref === '' || ref.startsWith('-')) return false;
|
|
290
|
+
return runGit(root, ['rev-parse', '--verify', '--quiet', `${ref}^{commit}`], '').status === 0;
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
/**
|
|
294
|
+
* The paths changed between `base` and `commit`, through the same scrubbed
|
|
295
|
+
* runner as the subject, so an inherited `GIT_DIR` cannot point the list at a
|
|
296
|
+
* different repository from the one the digest reads.
|
|
297
|
+
*
|
|
298
|
+
* `commit` must already be a commit id from {@link resolveRevision}: the list,
|
|
299
|
+
* the digest and the record are only one reading of one commit if the name was
|
|
300
|
+
* resolved once, before any of them.
|
|
301
|
+
*/
|
|
302
|
+
export function changedFilesBetween(root: string, base: string, commit: string): string[] {
|
|
303
|
+
if (base === '' || base.startsWith('-')) {
|
|
304
|
+
throw new GitReadFailed(
|
|
305
|
+
'',
|
|
306
|
+
'diff',
|
|
307
|
+
`base ref \`${base}\` is empty or shaped like an option`,
|
|
308
|
+
);
|
|
309
|
+
}
|
|
310
|
+
// `--no-renames`: rename detection reports only the destination, so a
|
|
311
|
+
// gated file moved to an ungated path would vanish from the list.
|
|
312
|
+
const args = ['diff', '--no-renames', '--name-only', '-z', `${base}...${commit}`];
|
|
313
|
+
const res = runGit(root, args, '');
|
|
314
|
+
if (res.status !== 0) {
|
|
315
|
+
throw new GitReadFailed('', 'diff', stderrOf(res));
|
|
316
|
+
}
|
|
317
|
+
return res.stdout
|
|
318
|
+
.toString('utf8')
|
|
319
|
+
.split('\u0000')
|
|
320
|
+
.filter((l) => l.trim() !== '');
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
/**
|
|
324
|
+
* The value following option `argv[i]`, or `null` when there is none — the end
|
|
325
|
+
* of the arguments, or another `--option` in its place.
|
|
326
|
+
*
|
|
327
|
+
* Shared by the gate and the subject CLI so the two refuse the same shapes: a
|
|
328
|
+
* `--rev` with no value used to fall back to `HEAD` in the gate while the CLI
|
|
329
|
+
* refused it.
|
|
330
|
+
*/
|
|
331
|
+
export function optionValue(argv: readonly string[], i: number): string | null {
|
|
332
|
+
const value = argv[i + 1];
|
|
333
|
+
return value === undefined || value.startsWith('--') ? null : value;
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
/** One entry of a commit's tree, as `git ls-tree` reports it. */
|
|
337
|
+
interface TreeEntry {
|
|
338
|
+
readonly mode: string;
|
|
339
|
+
readonly type: string;
|
|
340
|
+
readonly oid: string;
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
/**
|
|
344
|
+
* The tree entries of `paths` in `commit`, keyed by exact path. A path with no
|
|
345
|
+
* entry is absent from the map — including one reached through an ancestor
|
|
346
|
+
* that is not a directory in that commit, which is the same statement.
|
|
347
|
+
*/
|
|
348
|
+
function treeEntriesAt(
|
|
349
|
+
root: string,
|
|
350
|
+
commit: string,
|
|
351
|
+
paths: readonly string[],
|
|
352
|
+
): ReadonlyMap<string, TreeEntry> {
|
|
353
|
+
const out = new Map<string, TreeEntry>();
|
|
354
|
+
if (paths.length === 0) {
|
|
355
|
+
return out;
|
|
356
|
+
}
|
|
357
|
+
const res = runGit(root, ['ls-tree', '-z', '--full-tree', commit, '--', ...paths], '');
|
|
358
|
+
if (res.status !== 0) {
|
|
359
|
+
throw new GitReadFailed('', 'ls-tree', stderrOf(res));
|
|
360
|
+
}
|
|
361
|
+
const wanted = new Set(paths);
|
|
362
|
+
for (const record of res.stdout.toString('utf8').split('\u0000')) {
|
|
363
|
+
const tab = record.indexOf('\t');
|
|
364
|
+
if (tab < 0) continue;
|
|
365
|
+
const name = record.slice(tab + 1);
|
|
366
|
+
if (!wanted.has(name)) continue;
|
|
367
|
+
const [mode, type, oid] = record.slice(0, tab).split(' ');
|
|
368
|
+
if (mode === undefined || type === undefined || oid === undefined) {
|
|
369
|
+
throw new GitReadFailed(name, 'ls-tree', `unparseable entry \`${record}\``);
|
|
370
|
+
}
|
|
371
|
+
out.set(name, { mode, type, oid });
|
|
372
|
+
}
|
|
373
|
+
return out;
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
/** The bytes of blob `oid`. */
|
|
377
|
+
function blobBytes(root: string, oid: string, rel: string): Buffer {
|
|
378
|
+
const res = runGit(root, ['cat-file', 'blob', oid], rel);
|
|
379
|
+
if (res.status !== 0) {
|
|
380
|
+
throw new GitReadFailed(rel, 'cat-file', stderrOf(res));
|
|
381
|
+
}
|
|
382
|
+
return res.stdout;
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
/**
|
|
386
|
+
* The content of `rel` in `commit`: `null` when absent, the bytes and mode when
|
|
387
|
+
* a regular file, and a refusal for every other kind of entry.
|
|
388
|
+
*/
|
|
389
|
+
function regularFileAt(
|
|
390
|
+
entry: TreeEntry | undefined,
|
|
391
|
+
root: string,
|
|
392
|
+
rel: string,
|
|
393
|
+
): { readonly mode: string; readonly bytes: Buffer } | null {
|
|
394
|
+
if (entry === undefined) {
|
|
395
|
+
return null;
|
|
396
|
+
}
|
|
397
|
+
if (entry.type === 'blob' && REGULAR_MODES.has(entry.mode)) {
|
|
398
|
+
return { mode: entry.mode, bytes: blobBytes(root, entry.oid, rel) };
|
|
399
|
+
}
|
|
400
|
+
const kind =
|
|
401
|
+
entry.mode === '120000'
|
|
402
|
+
? 'symbolic link'
|
|
403
|
+
: entry.type === 'tree'
|
|
404
|
+
? 'directory'
|
|
405
|
+
: entry.type === 'commit'
|
|
406
|
+
? 'submodule'
|
|
407
|
+
: `${entry.type} with mode ${entry.mode}`;
|
|
408
|
+
throw new GatedPathUnsupported(
|
|
409
|
+
rel,
|
|
410
|
+
kind,
|
|
411
|
+
`is a ${kind} in the revision (mode ${entry.mode}), not an absent path or a regular file`,
|
|
412
|
+
);
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
/**
|
|
416
|
+
* The bytes of `rel` in `commit` when it is a regular file there, or `null`
|
|
417
|
+
* when it is absent — read from the object store, never from the working tree.
|
|
418
|
+
* Any other kind of entry is a {@link GatedPathUnsupported} refusal.
|
|
419
|
+
*/
|
|
420
|
+
export function fileAtRevision(root: string, commit: string, rel: string): Buffer | null {
|
|
421
|
+
assertContained(rel);
|
|
422
|
+
return regularFileAt(treeEntriesAt(root, commit, [rel]).get(rel), root, rel)?.bytes ?? null;
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
/**
|
|
426
|
+
* The regular files of `commit` as a source the dispatcher-closure walk reads,
|
|
427
|
+
* so a run can read the BASE side of a change from Git objects instead of from
|
|
428
|
+
* a second checkout. One `ls-tree` lists the tree; each blob is read on demand
|
|
429
|
+
* and kept. A path that is absent or is not a regular file reads as `null`.
|
|
430
|
+
*/
|
|
431
|
+
export function treeAtRevision(root: string, commit: string): { read(rel: string): string | null } {
|
|
432
|
+
const res = runGit(root, ['ls-tree', '-r', '-z', '--full-tree', commit], '');
|
|
433
|
+
if (res.status !== 0) {
|
|
434
|
+
throw new GitReadFailed('', 'ls-tree', stderrOf(res));
|
|
435
|
+
}
|
|
436
|
+
const blobs = new Map<string, string>();
|
|
437
|
+
for (const record of res.stdout.toString('utf8').split('\u0000')) {
|
|
438
|
+
const tab = record.indexOf('\t');
|
|
439
|
+
if (tab < 0) continue;
|
|
440
|
+
const [mode, type, oid] = record.slice(0, tab).split(' ');
|
|
441
|
+
if (type === 'blob' && mode !== undefined && REGULAR_MODES.has(mode) && oid !== undefined) {
|
|
442
|
+
blobs.set(record.slice(tab + 1), oid);
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
const read = new Map<string, string>();
|
|
446
|
+
return {
|
|
447
|
+
read(rel: string): string | null {
|
|
448
|
+
const oid = blobs.get(rel);
|
|
449
|
+
if (oid === undefined) return null;
|
|
450
|
+
let text = read.get(rel);
|
|
451
|
+
if (text === undefined) {
|
|
452
|
+
text = blobBytes(root, oid, rel).toString('utf8');
|
|
453
|
+
read.set(rel, text);
|
|
454
|
+
}
|
|
455
|
+
return text;
|
|
456
|
+
},
|
|
457
|
+
};
|
|
458
|
+
}
|
|
55
459
|
|
|
56
460
|
/**
|
|
57
461
|
* The gated subset of a changed-file list: sorted, deduplicated, and stable
|
|
@@ -65,28 +469,86 @@ export function gatedFilesOf(
|
|
|
65
469
|
const g = derived === undefined ? classifyPaths(normalized) : classifyPaths(normalized, derived);
|
|
66
470
|
const out = new Set<string>([...g.kernelRules, ...g.governanceHooks, ...g.plumbing]);
|
|
67
471
|
for (const f of normalized) {
|
|
68
|
-
if (
|
|
472
|
+
if (isMechanismPath(f)) out.add(f);
|
|
69
473
|
}
|
|
70
|
-
|
|
474
|
+
const sorted = [...out].sort();
|
|
475
|
+
for (const rel of sorted) {
|
|
476
|
+
assertContained(rel);
|
|
477
|
+
}
|
|
478
|
+
return sorted;
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
/** A digest and, from the SAME classification, exactly what it covers and where. */
|
|
482
|
+
export interface SubjectReading {
|
|
483
|
+
/** The `subject` a record must carry to answer for this change. */
|
|
484
|
+
readonly digest: string;
|
|
485
|
+
/** The gated files that digest is taken over, sorted. */
|
|
486
|
+
readonly gatedFiles: readonly string[];
|
|
487
|
+
/**
|
|
488
|
+
* The commit the digest was read from, or `null` when nothing is gated —
|
|
489
|
+
* a digest over no files reads nothing, so it resolves nothing either.
|
|
490
|
+
*/
|
|
491
|
+
readonly revision: string | null;
|
|
71
492
|
}
|
|
72
493
|
|
|
73
494
|
/**
|
|
74
|
-
* One digest over the sorted paths
|
|
75
|
-
* `
|
|
495
|
+
* One digest over the sorted paths, modes and contents of the gated files as
|
|
496
|
+
* they are in the commit `revision` resolves to, together with the list it
|
|
497
|
+
* covers and that commit.
|
|
498
|
+
*
|
|
499
|
+
* Each entry is serialised as `path NUL mode NUL sha256hex(content) LF`. NUL
|
|
500
|
+
* cannot occur in a Git path, the mode is six octal digits and the content
|
|
501
|
+
* slot is a fixed 64 hex characters, so the serialisation is unambiguous and
|
|
502
|
+
* no crafted path can reproduce another entry's framing. The path is hashed
|
|
503
|
+
* alongside its content, so two files with identical bytes do not collide and
|
|
504
|
+
* a rename moves the digest; the mode is hashed so that a change of the
|
|
505
|
+
* executable bit is a change.
|
|
76
506
|
*
|
|
77
|
-
*
|
|
78
|
-
*
|
|
79
|
-
*
|
|
507
|
+
* `derived` is the plumbing closure the caller already computed, passed through
|
|
508
|
+
* to {@link gatedFilesOf} unchanged: a digest that classified without it would
|
|
509
|
+
* cover fewer files than the gate gated.
|
|
510
|
+
*
|
|
511
|
+
* THROWS a {@link GatedSubjectRefusal} for every revision it declines to
|
|
512
|
+
* describe.
|
|
80
513
|
*/
|
|
81
|
-
export function
|
|
514
|
+
export function subjectOf(
|
|
515
|
+
root: string,
|
|
516
|
+
files: readonly string[],
|
|
517
|
+
derived?: readonly string[],
|
|
518
|
+
revision: string = DEFAULT_REVISION,
|
|
519
|
+
): SubjectReading {
|
|
520
|
+
const gatedFiles = gatedFilesOf(files, derived);
|
|
82
521
|
const h = createHash('sha256');
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
522
|
+
if (gatedFiles.length === 0) {
|
|
523
|
+
return { digest: h.digest('hex'), gatedFiles, revision: null };
|
|
524
|
+
}
|
|
525
|
+
const commit = resolveRevision(root, revision);
|
|
526
|
+
const entries = treeEntriesAt(root, commit, gatedFiles);
|
|
527
|
+
for (const rel of gatedFiles) {
|
|
528
|
+
const file = regularFileAt(entries.get(rel), root, rel);
|
|
529
|
+
const mode = file === null ? DELETED_MODE : file.mode;
|
|
530
|
+
const content = file === null ? Buffer.from(DELETED_MARKER) : file.bytes;
|
|
86
531
|
h.update(rel);
|
|
87
532
|
h.update('\u0000');
|
|
533
|
+
h.update(mode);
|
|
534
|
+
h.update('\u0000');
|
|
88
535
|
h.update(createHash('sha256').update(content).digest('hex'));
|
|
89
536
|
h.update('\n');
|
|
90
537
|
}
|
|
91
|
-
return h.digest('hex');
|
|
538
|
+
return { digest: h.digest('hex'), gatedFiles, revision: commit };
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
/**
|
|
542
|
+
* The digest alone, for a caller that has no use for the covered list.
|
|
543
|
+
*
|
|
544
|
+
* Delegates rather than re-implementing: there is ONE classification and ONE
|
|
545
|
+
* hashing loop, and this is a projection of its result.
|
|
546
|
+
*/
|
|
547
|
+
export function subjectDigest(
|
|
548
|
+
root: string,
|
|
549
|
+
files: readonly string[],
|
|
550
|
+
derived?: readonly string[],
|
|
551
|
+
revision: string = DEFAULT_REVISION,
|
|
552
|
+
): string {
|
|
553
|
+
return subjectOf(root, files, derived, revision).digest;
|
|
92
554
|
}
|
|
@@ -47,6 +47,44 @@ export function ledgerRelPath(version: string): string {
|
|
|
47
47
|
return `agents/evidence/release-findings/${version}.json`;
|
|
48
48
|
}
|
|
49
49
|
|
|
50
|
+
/**
|
|
51
|
+
* The `Known limitations` line a cut taken on an override owes its readers.
|
|
52
|
+
*
|
|
53
|
+
* An override is the one way a release ships without having reviewed itself,
|
|
54
|
+
* and it is recorded where only a releaser looks — inside the ledger JSON. A
|
|
55
|
+
* consumer reading the published notes would see a release indistinguishable
|
|
56
|
+
* from one that passed its self-review, which is the same silence-reads-as-
|
|
57
|
+
* acceptance defect `assurance` was added to end one layer down.
|
|
58
|
+
*
|
|
59
|
+
* Returns null for every ordinary release: no ledger, a reviewed one, or one
|
|
60
|
+
* carrying no override. The caller appends; it never replaces a derived line.
|
|
61
|
+
*/
|
|
62
|
+
export function assuranceOverrideLimitation(version: string, repoRoot: string): string | null {
|
|
63
|
+
const abs = path.join(repoRoot, ledgerRelPath(version));
|
|
64
|
+
if (!fs.existsSync(abs)) {
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
let ledger: { assurance?: unknown; assurance_override?: unknown };
|
|
68
|
+
try {
|
|
69
|
+
ledger = JSON.parse(fs.readFileSync(abs, 'utf-8')) as typeof ledger;
|
|
70
|
+
} catch {
|
|
71
|
+
// A malformed ledger is the disposition gate's finding, not this line's.
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
// Printed into public release notes: one line, no markdown, bounded. Whether
|
|
75
|
+
// it names a committed directive is check_finding_dispositions' to refuse.
|
|
76
|
+
const override = typeof ledger.assurance_override === 'string'
|
|
77
|
+
? ledger.assurance_override.replace(/[\u0000-\u001f\u007f]+/g, ' ').replace(/[`*[\]<>|#!]/g, '').trim().slice(0, 200)
|
|
78
|
+
: '';
|
|
79
|
+
if (override === '' || String(ledger.assurance ?? '').trim() !== 'unreviewed') {
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
return (
|
|
83
|
+
`This release was cut without a self-review: nothing reviewed ${version}, and the cut `
|
|
84
|
+
+ `was taken on an owner directive recorded at ${override}.`
|
|
85
|
+
);
|
|
86
|
+
}
|
|
87
|
+
|
|
50
88
|
/**
|
|
51
89
|
* The workflow that produces and commits the ledger, named so a message can
|
|
52
90
|
* point the operator at the right run log.
|
|
@@ -98,8 +136,12 @@ export function ledgerAbsentMessage(version: string, branch: string, remote: str
|
|
|
98
136
|
` The ${FINDINGS_WORKFLOW} workflow commits it to the release branch once it has ` +
|
|
99
137
|
'reviewed the head. Ordinary causes, in the order to check them: the review has not ' +
|
|
100
138
|
'finished yet (wait, then resume); the review found nothing and its commit is still in ' +
|
|
101
|
-
'flight (same); no ANTHROPIC_API_KEY, so no review ran and no ledger will appear —
|
|
102
|
-
|
|
139
|
+
'flight (same); no ANTHROPIC_API_KEY, so no review ran in CI and no ledger will appear — ' +
|
|
140
|
+
'review it locally instead, which needs no credit because the gate resolves the ' +
|
|
141
|
+
'subscription CLI before any metered key: `./scripts-run src/scripts/self_review_gate ' +
|
|
142
|
+
'--findings-out agents/runtime/release-findings.json`, then `./scripts-run ' +
|
|
143
|
+
'src/scripts/check_finding_dispositions --ingest agents/runtime/release-findings.json --release ' +
|
|
144
|
+
`${version}\`, and push the ledger to ${branch}; no RELEASE_PR_TOKEN, in which ` +
|
|
103
145
|
'case the job refuses to push rather than deadlock this wait and says so as a warning in ' +
|
|
104
146
|
'its run log — configure the PAT, or write the ledger by hand; or the workflow could not ' +
|
|
105
147
|
'push, which its run log will say.\n' +
|
|
@@ -133,9 +175,14 @@ export function ledgerAbsentAfterMergeMessage(
|
|
|
133
175
|
' The release stops: tagging now ships a version whose findings ledger does not exist, ' +
|
|
134
176
|
'and an absent ledger for a shipped version reds every pull request in the repository.\n' +
|
|
135
177
|
` The release branch is gone, so the ${FINDINGS_WORKFLOW} run that would have committed ` +
|
|
136
|
-
'the ledger cannot be waited for.
|
|
137
|
-
|
|
138
|
-
'
|
|
178
|
+
'the ledger cannot be waited for. Put the ledger on the trunk instead: recover what the ' +
|
|
179
|
+
"review for this version reported in its own workflow run, or — if none ran — review it " +
|
|
180
|
+
'now with `./scripts-run src/scripts/self_review_gate --findings-out agents/runtime/release-findings.json`, ' +
|
|
181
|
+
'which needs no credit because the gate resolves the subscription CLI before any metered ' +
|
|
182
|
+
`key. Ingest with \`--ingest agents/runtime/release-findings.json --release ${version}\`, push, and resume.\n` +
|
|
183
|
+
' A ledger that reviewed nothing no longer clears the cut on a reason string: an ' +
|
|
184
|
+
'`assurance: unreviewed` ledger is refused unless it carries an `assurance_override` ' +
|
|
185
|
+
'naming a committed owner directive.'
|
|
139
186
|
);
|
|
140
187
|
}
|
|
141
188
|
|