@event4u/agent-config 16.4.0 → 17.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.augment-plugin/marketplace.json +3 -3
- package/.augment-plugin/plugin.json +1 -1
- package/.claude-plugin/marketplace.json +2 -2
- package/.claude-plugin/skills/install-agent-config/SKILL.md +4 -4
- package/CHANGELOG.md +483 -669
- package/CONTRIBUTING.md +47 -0
- package/README.md +25 -25
- package/dist/agent-src/commands/{design.md → agent-design.md} +11 -7
- package/dist/agent-src/commands/agents/init.md +66 -3
- package/dist/agent-src/commands/agents/user/init.md +3 -0
- package/dist/agent-src/commands/{optimize/deep.md → analyze/and-optimize.md} +72 -33
- package/dist/agent-src/commands/analyze/inbox.md +168 -37
- package/dist/agent-src/commands/analyze/pr.md +144 -0
- package/dist/agent-src/commands/analyze/{repo.md → reference.md} +85 -14
- package/dist/agent-src/commands/analyze/roadmap-repos.md +19 -10
- package/dist/agent-src/commands/analyze.md +28 -12
- package/dist/agent-src/commands/audit.md +115 -0
- package/dist/agent-src/commands/brand/review.md +13 -2
- package/dist/agent-src/commands/brand/tokens.md +3 -3
- package/dist/agent-src/commands/brand/voice.md +8 -5
- package/dist/agent-src/commands/brand.md +2 -2
- package/dist/agent-src/commands/challenge-me/closure.md +25 -0
- package/dist/agent-src/commands/design-system/import.md +8 -3
- package/dist/agent-src/commands/design-system/sync.md +98 -0
- package/dist/agent-src/commands/design-system.md +6 -1
- package/dist/agent-src/commands/evals/analyze.json +44 -0
- package/dist/agent-src/commands/evals/audit.json +12 -0
- package/dist/agent-src/commands/evals/retro.json +12 -0
- package/dist/agent-src/commands/fix/ci.md +10 -8
- package/dist/agent-src/commands/ghostwriter/write.md +22 -0
- package/dist/agent-src/commands/memory/learn-low-impact.md +70 -83
- package/dist/agent-src/commands/memory/propose.md +12 -0
- package/dist/agent-src/commands/memory.md +1 -1
- package/dist/agent-src/commands/optimize.md +4 -3
- package/dist/agent-src/commands/post-as/me.md +18 -0
- package/dist/agent-src/commands/pr/create.md +17 -342
- package/dist/agent-src/commands/pr/merge.md +129 -368
- package/dist/agent-src/commands/retro.md +121 -0
- package/dist/agent-src/commands/review/routing.md +1 -1
- package/dist/agent-src/commands/roadmap/next.md +4 -1
- package/dist/agent-src/commands/roadmap/process-full.md +46 -333
- package/dist/agent-src/commands/roadmap/triage-parked.md +6 -2
- package/dist/agent-src/commands/team-knowledge/consolidate.md +2 -2
- package/dist/agent-src/commands/team-knowledge.md +1 -1
- package/dist/agent-src/commands/threat-model.md +1 -1
- package/dist/agent-src/commands/upstream-contribute.md +91 -101
- package/dist/agent-src/commands/worktree/cleanup.md +18 -11
- package/dist/agent-src/contexts/contracts/consumer-agents-md-guide.md +54 -0
- package/dist/agent-src/contexts/execution/analysis-loop.md +137 -0
- package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +3 -3
- package/dist/agent-src/contexts/execution/decision-closure-execution.md +1 -1
- package/dist/agent-src/contexts/execution/host-capability-manifest.md +6 -0
- package/dist/agent-src/contexts/execution/orchestration-telemetry.md +11 -4
- package/dist/agent-src/contexts/execution/pr-create-branches-content.md +250 -0
- package/dist/agent-src/contexts/execution/pr-create-branches-freshness.md +150 -0
- package/dist/agent-src/contexts/execution/pr-merge-queue.md +287 -0
- package/dist/agent-src/contexts/execution/pr-merge-sync.md +276 -0
- package/dist/agent-src/contexts/execution/pr-merge-trust-boundary.md +69 -0
- package/dist/agent-src/contexts/execution/process-full-all.md +233 -0
- package/dist/agent-src/contexts/execution/process-full-delivery.md +231 -0
- package/dist/agent-src/contexts/execution/roadmap-execution-contract-branches.md +42 -0
- package/dist/agent-src/contexts/execution/roadmap-execution-contract.md +1 -35
- package/dist/agent-src/contexts/execution/roadmap-process-loop-close.md +235 -0
- package/dist/agent-src/contexts/execution/roadmap-process-loop-prescan.md +216 -0
- package/dist/agent-src/contexts/execution/roadmap-process-loop-run.md +253 -0
- package/dist/agent-src/contexts/execution/roadmap-process-loop-set.md +212 -0
- package/dist/agent-src/contexts/execution/roadmap-process-loop.md +25 -864
- package/dist/agent-src/contexts/execution/subagent-spawn-contract.md +14 -2
- package/dist/agent-src/contexts/execution/subagent-steering.md +65 -8
- package/dist/agent-src/contexts/model-recommendations.md +5 -5
- package/dist/agent-src/contexts/subagent-configuration.md +1 -1
- package/dist/agent-src/guidelines/agent-infra/api-cost-levers.md +4 -3
- package/dist/agent-src/guidelines/agent-infra/model-recommendation.md +11 -5
- package/dist/agent-src/guidelines/agent-infra/rule-body-migration-inventory.md +1 -1
- package/dist/agent-src/guidelines/agent-infra/self-improvement-pipeline.md +47 -24
- package/dist/agent-src/guidelines/design-antipatterns.md +6 -1
- package/dist/agent-src/guidelines/design-asset-discipline.md +17 -0
- package/dist/agent-src/guidelines/design-fidelity-routing.md +1 -0
- package/dist/agent-src/guidelines/php/api-design.md +10 -1
- package/dist/agent-src/rules/brand-source-of-truth.md +7 -6
- package/dist/agent-src/rules/code-provenance.md +1 -1
- package/dist/agent-src/rules/context-hygiene.md +0 -1
- package/dist/agent-src/rules/design-fidelity.md +12 -13
- package/dist/agent-src/rules/external-reference-deep-dive.md +2 -2
- package/dist/agent-src/rules/fix-what-you-see.md +1 -1
- package/dist/agent-src/rules/low-impact-corpus-privacy-floor.md +14 -15
- package/dist/agent-src/rules/missing-skill-recovery.md +12 -11
- package/dist/agent-src/rules/neighbour-precedence.md +1 -1
- package/dist/agent-src/rules/recurring-criticism.md +1 -1
- package/dist/agent-src/rules/roadmap-ci-steps-policy.md +0 -2
- package/dist/agent-src/rules/self-repair-loop.md +2 -2
- package/dist/agent-src/rules/token-budget-discipline.md +2 -2
- package/dist/agent-src/scripts/dashboard_mode.ts +4 -1
- package/dist/agent-src/scripts/roadmap_age.ts +175 -0
- package/dist/agent-src/scripts/update_roadmap_progress.ts +10 -2
- package/dist/agent-src/skills/accessibility-auditor/SKILL.md +3 -3
- package/dist/agent-src/skills/accessibility-auditor/data/aria-patterns.csv +2 -0
- package/dist/agent-src/skills/accessibility-auditor/data/manifest.json +3 -3
- package/dist/agent-src/skills/agent-security-review/SKILL.md +2 -2
- package/dist/agent-src/skills/agents-md-thin-root/SKILL.md +12 -4
- package/dist/agent-src/skills/ai-code-blindspots/SKILL.md +7 -0
- package/dist/agent-src/skills/ai-council/references/advanced-modes.md +11 -1
- package/dist/agent-src/skills/ai-council/references/cost-and-redaction.md +7 -0
- package/dist/agent-src/skills/ai-council/references/execution-modes.md +7 -0
- package/dist/agent-src/skills/ai-council/references/output-and-synthesis.md +19 -0
- package/dist/agent-src/skills/ai-council/references/procedure.md +7 -0
- package/dist/agent-src/skills/api-design/SKILL.md +2 -2
- package/dist/agent-src/skills/api-endpoint/SKILL.md +2 -2
- package/dist/agent-src/skills/authz-review/SKILL.md +5 -3
- package/dist/agent-src/skills/blade-ui/SKILL.md +2 -2
- package/dist/agent-src/skills/brand/SKILL.md +7 -3
- package/dist/agent-src/skills/brand-asset-generation/SKILL.md +13 -6
- package/dist/agent-src/skills/brand-audit/SKILL.md +2 -1
- package/dist/agent-src/skills/brand-identity/SKILL.md +5 -4
- package/dist/agent-src/skills/brand-strategy/SKILL.md +5 -4
- package/dist/agent-src/skills/brand-to-tokens/SKILL.md +18 -39
- package/dist/agent-src/skills/brand-to-tokens/templates/marp-brand-deck.md.example +2 -2
- package/dist/agent-src/skills/brand-to-tokens/templates/reveal-brand-deck.yaml +2 -2
- package/dist/agent-src/skills/canvas-design/SKILL.md +16 -4
- package/dist/agent-src/skills/competitive-positioning/SKILL.md +2 -2
- package/dist/agent-src/skills/composer-packages/SKILL.md +18 -0
- package/dist/agent-src/skills/condense-memory/SKILL.md +1 -1
- package/dist/agent-src/skills/content-funnel-design/SKILL.md +8 -1
- package/dist/agent-src/skills/context-authoring/SKILL.md +1 -1
- package/dist/agent-src/skills/context-document/SKILL.md +2 -2
- package/dist/agent-src/skills/corpus-grounding/SKILL.md +6 -6
- package/dist/agent-src/skills/corpus-grounding/scripts/decision_engine.ts +13 -11
- package/dist/agent-src/skills/corpus-grounding/scripts/ground.mjs +1706 -0
- package/dist/agent-src/skills/corpus-grounding/scripts/schema_validator.ts +7 -1
- package/dist/agent-src/skills/dashboard-design/SKILL.md +1 -1
- package/dist/agent-src/skills/data-flow-mapper/SKILL.md +5 -2
- package/dist/agent-src/skills/database/SKILL.md +5 -4
- package/dist/agent-src/skills/decision-record/references/weighted-matrix.md +12 -0
- package/dist/agent-src/skills/deep-reading-analyst/SKILL.md +1 -1
- package/dist/agent-src/skills/dependency-upgrade/SKILL.md +61 -11
- package/dist/agent-src/skills/description-assist/SKILL.md +1 -1
- package/dist/agent-src/skills/design-intelligence/SKILL.md +1 -1
- package/dist/agent-src/skills/design-intelligence/data/landing.csv +1 -1
- package/dist/agent-src/skills/design-intelligence/references/context-and-registers.md +10 -2
- package/dist/agent-src/skills/design-intelligence/references/design-languages.md +1 -1
- package/dist/agent-src/skills/design-intelligence/references/design-rules-checklist.md +4 -3
- package/dist/agent-src/skills/design-intelligence/references/integration-mapping.md +25 -22
- package/dist/agent-src/skills/{wireframe → design-review}/references/story-beat-ledger.schema.json +1 -1
- package/dist/agent-src/skills/design-review/references/verification-automation.md +11 -3
- package/dist/agent-src/skills/design-system-capture/SKILL.md +15 -10
- package/dist/agent-src/skills/design-system-capture/references/design-system-json.md +20 -5
- package/dist/agent-src/skills/design-system-capture/references/import-procedure.md +2 -2
- package/dist/agent-src/skills/design-tokens/SKILL.md +23 -23
- package/dist/agent-src/skills/design-tokens/scripts/tokens.mjs +1037 -0
- package/dist/agent-src/skills/design-tokens/scripts/tokens.ts +336 -13
- package/dist/agent-src/skills/design-tokens/templates/design-tokens-starter.json +52 -53
- package/dist/agent-src/skills/docker/SKILL.md +1 -1
- package/dist/agent-src/skills/estimate-ticket/SKILL.md +1 -1
- package/dist/agent-src/skills/existing-ui-audit/SKILL.md +14 -276
- package/dist/agent-src/skills/existing-ui-audit/procedure.yaml +44 -0
- package/dist/agent-src/skills/existing-ui-audit/references/anti-slop-cross-reference.md +1 -1
- package/dist/agent-src/skills/existing-ui-audit/references/steps/00-inspect-stack-and-input.md +4 -0
- package/dist/agent-src/skills/existing-ui-audit/references/steps/01-enumerate-components.md +26 -0
- package/dist/agent-src/skills/existing-ui-audit/references/steps/01b-detect-component-taxonomy.md +7 -0
- package/dist/agent-src/skills/existing-ui-audit/references/steps/02-identify-design-system.md +12 -0
- package/dist/agent-src/skills/existing-ui-audit/references/steps/03-detect-design-tokens.md +35 -0
- package/dist/agent-src/skills/existing-ui-audit/references/steps/04-detect-shadcn-inventory.md +13 -0
- package/dist/agent-src/skills/existing-ui-audit/references/steps/04b-live-storybook-read.md +26 -0
- package/dist/agent-src/skills/existing-ui-audit/references/steps/05-list-reusable-patterns.md +14 -0
- package/dist/agent-src/skills/existing-ui-audit/references/steps/06-match-candidates.md +52 -0
- package/dist/agent-src/skills/existing-ui-audit/references/steps/07-greenfield-branch.md +29 -0
- package/dist/agent-src/skills/existing-ui-audit/references/steps/08-a11y-baseline.md +40 -0
- package/dist/agent-src/skills/existing-ui-audit/references/steps/09-validate-and-write.md +5 -0
- package/dist/agent-src/skills/experiment-loop/SKILL.md +1 -1
- package/dist/agent-src/skills/fe-design/references/design-patterns.md +65 -4
- package/dist/agent-src/skills/fe-design/references/design-read-and-memory.md +1 -1
- package/dist/agent-src/skills/fe-design/references/source-led-port.md +1 -1
- package/dist/agent-src/skills/finishing-a-development-branch/SKILL.md +6 -6
- package/dist/agent-src/skills/flux/SKILL.md +1 -1
- package/dist/agent-src/skills/form-handler/SKILL.md +15 -2
- package/dist/agent-src/skills/frontend-render-security/SKILL.md +9 -0
- package/dist/agent-src/skills/git-workflow/SKILL.md +2 -2
- package/dist/agent-src/skills/git-workflow/references/branch-update.md +7 -0
- package/dist/agent-src/skills/git-workflow/references/commit-subject.md +12 -0
- package/dist/agent-src/skills/git-workflow/references/push-closes-its-loop.md +10 -0
- package/dist/agent-src/skills/gtm-launch/SKILL.md +8 -1
- package/dist/agent-src/skills/html-deck/SKILL.md +7 -2
- package/dist/agent-src/skills/humanizer/SKILL.md +16 -3
- package/dist/agent-src/skills/humanizer/references/anti-aiisms.md +13 -1
- package/dist/agent-src/skills/humanizer/references/fixtures.md +8 -0
- package/dist/agent-src/skills/iconography/SKILL.md +4 -2
- package/dist/agent-src/skills/image-provider-routing/SKILL.md +16 -5
- package/dist/agent-src/skills/js-library-packaging/SKILL.md +5 -4
- package/dist/agent-src/skills/js-library-packaging/scripts/check_package_surface.mjs +197 -0
- package/dist/agent-src/skills/judge-artifact-completeness/SKILL.md +1 -1
- package/dist/agent-src/skills/judge-security-auditor/SKILL.md +2 -2
- package/dist/agent-src/skills/launch-readiness/SKILL.md +18 -22
- package/dist/agent-src/skills/learning-to-rule-or-skill/SKILL.md +5 -5
- package/dist/agent-src/skills/livewire/SKILL.md +1 -1
- package/dist/agent-src/skills/llm-provider-knowledge/SKILL.md +18 -0
- package/dist/agent-src/skills/logo-generation/SKILL.md +21 -11
- package/dist/agent-src/skills/market-entry-analysis/SKILL.md +6 -1
- package/dist/agent-src/skills/markitdown/SKILL.md +1 -1
- package/dist/agent-src/skills/memory-consolidation/SKILL.md +2 -2
- package/dist/agent-src/skills/messaging-architecture/SKILL.md +8 -1
- package/dist/agent-src/skills/motion-choreographer/SKILL.md +2 -2
- package/dist/agent-src/skills/playwright-testing/SKILL.md +2 -0
- package/dist/agent-src/skills/positioning-strategy/SKILL.md +10 -2
- package/dist/agent-src/skills/prediction-pool-optimizer/references/ev-fixtures.md +13 -0
- package/dist/agent-src/skills/prediction-pool-optimizer/references/odds-and-bonus.md +7 -0
- package/dist/agent-src/skills/project-analysis-core/SKILL.md +1 -1
- package/dist/agent-src/skills/project-analysis-hypothesis-driven/SKILL.md +1 -1
- package/dist/agent-src/skills/project-analyzer/SKILL.md +14 -75
- package/dist/agent-src/skills/project-analyzer/procedure.yaml +39 -0
- package/dist/agent-src/skills/project-analyzer/references/steps/01-project-overview.md +9 -0
- package/dist/agent-src/skills/project-analyzer/references/steps/02-architecture.md +7 -0
- package/dist/agent-src/skills/project-analyzer/references/steps/03-data-layer.md +6 -0
- package/dist/agent-src/skills/project-analyzer/references/steps/04-business-domains.md +7 -0
- package/dist/agent-src/skills/project-analyzer/references/steps/05-api-surface.md +6 -0
- package/dist/agent-src/skills/project-analyzer/references/steps/06-service-map.md +6 -0
- package/dist/agent-src/skills/project-analyzer/references/steps/07-module-inventory.md +6 -0
- package/dist/agent-src/skills/project-analyzer/references/steps/08-infrastructure-and-testing.md +5 -0
- package/dist/agent-src/skills/project-analyzer/references/steps/09-agent-docs-audit.md +6 -0
- package/dist/agent-src/skills/project-analyzer/references/steps/10-gap-analysis.md +6 -0
- package/dist/agent-src/skills/quality-tools/references/js-ts-tools.md +10 -0
- package/dist/agent-src/skills/quality-tools/references/php-tools.md +13 -0
- package/dist/agent-src/skills/quality-tools/references/python-tools.md +11 -0
- package/dist/agent-src/skills/react-native-setup/SKILL.md +7 -2
- package/dist/agent-src/skills/react-shadcn-ui/SKILL.md +5 -1
- package/dist/agent-src/skills/react-shadcn-ui/references/registry.md +13 -0
- package/dist/agent-src/skills/react-shadcn-ui/scripts/shadcn_add.mjs +315 -0
- package/dist/agent-src/skills/react-shadcn-ui/scripts/shadcn_add.ts +6 -6
- package/dist/agent-src/skills/receiving-code-review/SKILL.md +1 -1
- package/dist/agent-src/skills/refine-ticket/SKILL.md +2 -2
- package/dist/agent-src/skills/release-comms/SKILL.md +2 -1
- package/dist/agent-src/skills/repomix-packer/SKILL.md +2 -2
- package/dist/agent-src/skills/requesting-code-review/SKILL.md +3 -3
- package/dist/agent-src/skills/roadmap-management/references/archival.md +3 -3
- package/dist/agent-src/skills/roadmap-management/references/authoring.md +9 -2
- package/dist/agent-src/skills/roadmap-management/references/dashboard.md +3 -3
- package/dist/agent-src/skills/roadmap-management/references/lifecycle.md +3 -3
- package/dist/agent-src/skills/roadmap-writing/SKILL.md +4 -4
- package/dist/agent-src/skills/rtk-output-filtering/SKILL.md +1 -1
- package/dist/agent-src/skills/rule-writing/SKILL.md +1 -2
- package/dist/agent-src/skills/security/SKILL.md +41 -5
- package/dist/agent-src/skills/skill-improvement-pipeline/SKILL.md +5 -3
- package/dist/agent-src/skills/skill-reviewer/SKILL.md +1 -1
- package/dist/agent-src/skills/skill-writing/SKILL.md +23 -8
- package/dist/agent-src/skills/skill-writing/references/section-patterns.md +19 -1
- package/dist/agent-src/skills/source-discovery/SKILL.md +3 -3
- package/dist/agent-src/skills/sql-writing/SKILL.md +2 -2
- package/dist/agent-src/skills/standards-from-config/SKILL.md +2 -2
- package/dist/agent-src/skills/storybook-workshop/SKILL.md +5 -0
- package/dist/agent-src/skills/storybook-workshop/scripts/story_contrast_floor.mjs +99 -0
- package/dist/agent-src/skills/subagent-orchestration/SKILL.md +13 -13
- package/dist/agent-src/skills/subagent-orchestration/prompts/README.md +4 -3
- package/dist/agent-src/skills/svg-authoring/SKILL.md +324 -0
- package/dist/agent-src/skills/systematic-debugging/SKILL.md +2 -2
- package/dist/agent-src/skills/tailwind-engineer/SKILL.md +8 -3
- package/dist/agent-src/skills/tailwind-engineer/scripts/tailwind_config_gen.mjs +482 -0
- package/dist/agent-src/skills/test-case-discovery/SKILL.md +1 -1
- package/dist/agent-src/skills/threat-modeling/SKILL.md +8 -1
- package/dist/agent-src/skills/threat-modeling/data/manifest.json +5 -2
- package/dist/agent-src/skills/threat-modeling/data/reasoning.csv +10 -10
- package/dist/agent-src/skills/threat-modeling/data/surfaces.csv +11 -10
- package/dist/agent-src/skills/threat-modeling/data/threats.csv +34 -20
- package/dist/agent-src/skills/type-design/SKILL.md +196 -0
- package/dist/agent-src/skills/type-design/references/font-spec.md +90 -0
- package/dist/agent-src/skills/type-design/references/gates.md +113 -0
- package/dist/agent-src/skills/type-design/references/toolchain.md +66 -0
- package/dist/agent-src/skills/typography-system/SKILL.md +21 -11
- package/dist/agent-src/skills/typography-system/references/worked-scales.md +85 -0
- package/dist/agent-src/skills/ui-apply-generic/SKILL.md +1 -1
- package/dist/agent-src/skills/universal-project-analysis/SKILL.md +1 -1
- package/dist/agent-src/skills/upstream-contribute/SKILL.md +120 -125
- package/dist/agent-src/skills/using-git-worktrees/SKILL.md +1 -0
- package/dist/agent-src/skills/verify-repair-loop/SKILL.md +1 -1
- package/dist/agent-src/skills/voice-and-tone-design/SKILL.md +71 -2
- package/dist/agent-src/skills/wireframe/SKILL.md +5 -2
- package/dist/agent-src/skills/worktree-lifecycle/SKILL.md +16 -14
- package/dist/agent-src/templates/AGENTS.md +1 -1
- package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
- package/dist/agent-src/templates/agents/proposal.example.md +1 -1
- package/dist/agent-src/templates/github-workflows/advisories-daily.yml +85 -0
- package/dist/agent-src/templates/roadmaps.md +39 -1
- package/dist/agent-src/templates/scripts/check_memory.ts +2 -2
- package/dist/agent-src/templates/scripts/historical-bug-patterns.example.yml +13 -1
- package/dist/agent-src/templates/scripts/work_engine/cli.ts +17 -0
- package/dist/agent-src/templates/scripts/work_engine/cli_args.ts +10 -0
- package/dist/agent-src/templates/scripts/work_engine/directives/ui/scaffold.ts +22 -13
- package/dist/agent-src/templates/scripts/work_engine/dispatcher.ts +18 -4
- package/dist/agent-src/templates/scripts/work_engine/procedure/checks.ts +283 -0
- package/dist/agent-src/templates/scripts/work_engine/procedure/run.ts +432 -0
- package/dist/agent-src/templates/scripts/work_engine/procedure/sidecar.ts +185 -0
- package/dist/agent-src/templates/scripts/work_engine/state.ts +3 -0
- package/dist/cli/commands/uiRender.js +265 -13
- package/dist/cli/commands/uiRenderAsset.js +1316 -0
- package/dist/cli/commands/uiRenderAssetCompare.js +752 -0
- package/dist/cli/commands/uiRenderAssetFonts.js +158 -0
- package/dist/cli/commands/uiRenderAssetGrid.js +265 -0
- package/dist/cli/commands/uiRenderAssetGrounds.js +323 -0
- package/dist/cli/commands/uiRenderAssetIsolation.js +85 -0
- package/dist/cli/commands/uiRenderAssetTypes.js +133 -0
- package/dist/cli/initRouting.js +1 -1
- package/dist/cli/main.js +47 -1
- package/dist/cli/mcp/dispatch.js +31 -9
- package/dist/cli/python/knowledge_ingest.js +7 -39
- package/dist/cli/python/workspace_secrets.js +4 -177
- package/dist/cli/registry.js +5 -2
- package/dist/cli-delegate/archive_completed_roadmaps.js +3 -2
- package/dist/cli-delegate/check_update_banner.js +635 -266
- package/dist/cli-delegate/{chunk-AED2VQGM.js → chunk-2CX7NWRB.js} +233 -437
- package/dist/cli-delegate/{chunk-F3QDG2GT.js → chunk-2SFOOFJJ.js} +259 -159
- package/dist/cli-delegate/chunk-2Y5AMLMY.js +136 -0
- package/dist/cli-delegate/{chunk-OKJUIAPS.js → chunk-4E2W63DA.js} +1 -62
- package/dist/cli-delegate/{chunk-6SRJTYJS.js → chunk-4SHNERBL.js} +37 -16
- package/dist/cli-delegate/chunk-5VO3RTMV.js +208 -0
- package/dist/cli-delegate/chunk-6E2LDY4F.js +27 -0
- package/dist/cli-delegate/{chunk-XQTPXKFA.js → chunk-6ZD2QZMN.js} +8 -17
- package/dist/cli-delegate/{chunk-6V5FMA3P.js → chunk-7CEI2YPS.js} +1 -1
- package/dist/cli-delegate/{chunk-DMSZHXZS.js → chunk-7DRWULEQ.js} +80 -7
- package/dist/cli-delegate/chunk-7NXCZSDL.js +54 -0
- package/dist/cli-delegate/chunk-AX3U3UWJ.js +328 -0
- package/dist/cli-delegate/{chunk-WOKWX5PL.js → chunk-BKALSTBZ.js} +18 -3
- package/dist/cli-delegate/chunk-BMGUGSY6.js +103 -0
- package/dist/cli-delegate/chunk-BYV46VRM.js +3309 -0
- package/dist/cli-delegate/{chunk-5GPULQBE.js → chunk-CAL76ADI.js} +4215 -682
- package/dist/cli-delegate/chunk-DSY6LLCQ.js +127 -0
- package/dist/cli-delegate/chunk-E6XNBVE4.js +581 -0
- package/dist/cli-delegate/{chunk-ZUZKZYCN.js → chunk-ESUNQ5XR.js} +46 -10
- package/dist/cli-delegate/{chunk-G5VVIZRC.js → chunk-F7HLSW6P.js} +1 -1
- package/dist/cli-delegate/chunk-FIEEOH5C.js +133 -0
- package/dist/cli-delegate/chunk-FKYZOWVD.js +719 -0
- package/dist/cli-delegate/chunk-GOMILC3O.js +918 -0
- package/dist/cli-delegate/chunk-I4KJYVPB.js +69 -0
- package/dist/cli-delegate/{chunk-JQOM7TTM.js → chunk-IDAOTDPE.js} +1 -100
- package/dist/cli-delegate/chunk-IROAQ77A.js +137 -0
- package/dist/cli-delegate/chunk-J2SJZICO.js +698 -0
- package/dist/cli-delegate/{chunk-6YQC2HLF.js → chunk-JHMMWNJ2.js} +54 -40
- package/dist/cli-delegate/{chunk-WQWXGIWB.js → chunk-M6CRG5O6.js} +165 -15
- package/dist/cli-delegate/{chunk-PHD7OOLE.js → chunk-MQ2UDEGV.js} +14 -3
- package/dist/cli-delegate/chunk-NTM7G2V4.js +220 -0
- package/dist/cli-delegate/chunk-PV7S5DPJ.js +175 -0
- package/dist/cli-delegate/{chunk-F7DQWYR5.js → chunk-RAXQOETZ.js} +6 -2
- package/dist/cli-delegate/{chunk-T7XSJSUQ.js → chunk-SIOMDAKL.js} +980 -784
- package/dist/cli-delegate/{chunk-KR6EM23A.js → chunk-TULVDQ4L.js} +3 -48
- package/dist/cli-delegate/chunk-UUYEKXKR.js +20 -0
- package/dist/cli-delegate/{chunk-7XGD2OEU.js → chunk-UXWHY6CQ.js} +2 -1
- package/dist/cli-delegate/{chunk-PWX7CKMD.js → chunk-VC3ECUEK.js} +1 -1
- package/dist/cli-delegate/{chunk-KXXWJTDO.js → chunk-WMNYVIYX.js} +1 -1
- package/dist/cli-delegate/chunk-XCY5KKUC.js +181 -0
- package/dist/cli-delegate/{chunk-H76PHZBI.js → chunk-XLY5G3CM.js} +14 -19
- package/dist/cli-delegate/cmd_adr_effective.js +41 -2
- package/dist/cli-delegate/cmd_analyze_session.js +7 -7
- package/dist/cli-delegate/cmd_brand_status.js +1287 -10
- package/dist/cli-delegate/cmd_ci_settle.js +330 -0
- package/dist/cli-delegate/cmd_conformance.js +669 -822
- package/dist/cli-delegate/cmd_doctor.js +26 -16
- package/dist/cli-delegate/cmd_doctor_neighbours.js +10 -7
- package/dist/cli-delegate/cmd_explain.js +9 -24
- package/dist/cli-delegate/cmd_export.js +14 -11
- package/dist/cli-delegate/cmd_fleet.js +5 -3
- package/dist/cli-delegate/cmd_git_convention.js +8 -4
- package/dist/cli-delegate/cmd_handoff.js +79 -242
- package/dist/cli-delegate/cmd_mcp_available.js +1 -1
- package/dist/cli-delegate/cmd_memory_get.js +4 -2
- package/dist/cli-delegate/cmd_migrate.js +2 -2
- package/dist/cli-delegate/cmd_packs_active.js +2 -2
- package/dist/cli-delegate/cmd_preflight.js +7 -5
- package/dist/cli-delegate/cmd_prune.js +16 -13
- package/dist/cli-delegate/cmd_route_audit.js +11 -8
- package/dist/cli-delegate/cmd_route_explain.js +649 -16
- package/dist/cli-delegate/cmd_session_recycle.js +15 -6
- package/dist/cli-delegate/cmd_settings_check.js +2 -2
- package/dist/cli-delegate/cmd_settings_get.js +1 -1
- package/dist/cli-delegate/cmd_settings_migrate.js +14 -11
- package/dist/cli-delegate/cmd_settings_set.js +1 -1
- package/dist/cli-delegate/cmd_sync.js +16 -13
- package/dist/cli-delegate/cmd_uninstall.js +185 -31
- package/dist/cli-delegate/cmd_update.js +67 -3
- package/dist/cli-delegate/cmd_upgrade.js +38 -7
- package/dist/cli-delegate/cmd_validate.js +16 -13
- package/dist/cli-delegate/cmd_versions.js +1 -1
- package/dist/cli-delegate/dashboard_mode.js +1 -1
- package/dist/cli-delegate/gate_execute.js +4 -3
- package/dist/cli-delegate/roadmap_age.js +22 -0
- package/dist/cli-delegate/roadmap_gates.js +4 -3
- package/dist/cli-delegate/update_roadmap_progress.js +3 -2
- package/dist/cli-delegate/upgrade_unattended-VVL6JLSX.js +541 -0
- package/dist/discovery/deprecation-report.md +1 -1
- package/dist/discovery/discovery-manifest.json +409 -201
- package/dist/discovery/discovery-manifest.json.sha256 +1 -1
- package/dist/discovery/discovery-manifest.summary.md +8 -8
- package/dist/discovery/dormancy-report.md +1 -1
- package/dist/discovery/orphan-report.md +1 -1
- package/dist/discovery/packs.json +36 -27
- package/dist/discovery/trust-report.md +3 -3
- package/dist/discovery/workspaces.json +25 -16
- package/dist/hooks/chat_history.chunk.cjs +6852 -0
- package/dist/hooks/chat_history.chunk.cjs.sha256 +1 -0
- package/dist/hooks/dispatch.js +17706 -18627
- package/dist/hooks/dispatch.sha256 +1 -1
- package/dist/hooks/egress_engine.chunk.cjs +915 -0
- package/dist/hooks/egress_engine.chunk.cjs.sha256 +1 -0
- package/dist/hooks/svg_rules.chunk.cjs +1858 -0
- package/dist/hooks/svg_rules.chunk.cjs.sha256 +1 -0
- package/dist/install/conflict.js +36 -6
- package/dist/install/conflictTracker.js +81 -7
- package/dist/install/detect.js +3 -3
- package/dist/install/hostPermissionsAdapter.js +106 -0
- package/dist/install/install.mjs +3117 -1949
- package/dist/install/installThinLayer.js +1 -1
- package/dist/install/manifestFiles.js +21 -0
- package/dist/install/noGoDenyRows.js +300 -0
- package/dist/install/noGoRules.js +368 -0
- package/dist/install/ownershipLedger.js +133 -0
- package/dist/install/plan.js +1 -1
- package/dist/install/preflight.js +39 -8
- package/dist/install/preserve.js +74 -12
- package/dist/install/recordedOwnership.js +88 -5
- package/dist/install/rule_scope.js +20 -3
- package/dist/install/stagedRuntime.js +455 -0
- package/dist/install/toolsArg.js +19 -0
- package/dist/install/userPin.js +47 -0
- package/dist/install/wizard-plan.js +26 -4
- package/dist/mcp/awesome-mcp-servers.row.md +1 -1
- package/dist/mcp/mcp-cloudflare-catalogue.json +3 -2
- package/dist/mcp/registry-manifest.json +6 -5
- package/dist/mcp/server.json +3 -3
- package/dist/mcp/server.mjs +9814 -5333
- package/dist/router.json +1 -1
- package/dist/scripts/_lib/agent_settings.js +7 -12
- package/dist/scripts/_lib/asset_render_record.js +219 -0
- package/dist/scripts/_lib/claude_builtin_names.js +9 -4
- package/dist/scripts/_lib/claude_settings_hooks.js +102 -34
- package/dist/scripts/_lib/egress_rules.js +766 -0
- package/dist/scripts/_lib/environment_detector.js +24 -33
- package/dist/scripts/_lib/global_deploy_inventory.js +146 -9
- package/dist/scripts/_lib/guidelines_lane.js +10 -1
- package/dist/scripts/_lib/identifier_redaction.js +24 -0
- package/dist/scripts/_lib/installed_layer.js +17 -0
- package/dist/scripts/_lib/installed_layer_normalise.js +72 -0
- package/dist/scripts/_lib/lean_projection_mode.js +34 -152
- package/dist/scripts/_lib/project_tree_form.js +118 -0
- package/dist/scripts/_lib/scan_scope.js +105 -0
- package/dist/scripts/_lib/scoped_projection.js +133 -3
- package/dist/scripts/_lib/settings_removed_keys.js +29 -0
- package/dist/scripts/_lib/settings_renamed_keys.js +17 -5
- package/dist/scripts/_lib/subagent_native_fields.js +35 -0
- package/dist/scripts/_lib/svg_dom.js +284 -0
- package/dist/scripts/_lib/svg_filled_counter.js +285 -0
- package/dist/scripts/_lib/svg_geometry.js +477 -0
- package/dist/scripts/_lib/svg_motion.js +179 -0
- package/dist/scripts/_lib/svg_rules.js +1339 -0
- package/dist/scripts/_lib/svg_urls.js +67 -0
- package/dist/scripts/_lib/ui_surface.js +19 -0
- package/dist/scripts/_lib/verification_command.js +364 -0
- package/dist/scripts/_lib/workspace_secrets.js +229 -0
- package/dist/scripts/ai_council/seat_policy.js +27 -0
- package/dist/scripts/ai_council/transport_resolver.js +9 -10
- package/dist/scripts/condense.js +25 -29
- package/dist/scripts/lint_svg_asset.js +324 -0
- package/dist/server/io/substituteTemplate.js +2 -2
- package/dist/server/io/yamlIO.js +2 -2
- package/dist/server/routes/install.js +5 -1
- package/dist/server/routes/settings.js +2 -2
- package/dist/server/routes/wizard.js +1 -1
- package/dist/server/schemas/settings.js +22 -16
- package/dist/server/serverInfo.js +1 -1
- package/dist/shared/brandTokenDocument.js +47 -0
- package/dist/shared/brandTokenPaths.js +43 -0
- package/dist/shared/settingsCarveOut.js +0 -7
- package/dist/shared/skillRanking.js +103 -5
- package/dist/shared/userMd/formAdapter.js +16 -0
- package/dist/shared/userMd/schema.js +17 -0
- package/dist/ui/assets/index-w70Ado09.js +23 -0
- package/dist/ui/index.html +1 -1
- package/docs/MIGRATION.md +89 -2
- package/docs/THIRD-PARTY-NOTICES.md +27 -0
- package/docs/contracts/settings-classes.md +27 -9
- package/docs/guidelines/agent-infra/api-cost-levers.md +4 -3
- package/docs/guidelines/agent-infra/model-recommendation.md +11 -5
- package/docs/guidelines/agent-infra/rule-body-migration-inventory.md +1 -1
- package/docs/guidelines/agent-infra/self-improvement-pipeline.md +47 -24
- package/docs/guidelines/design-antipatterns.md +6 -1
- package/docs/guidelines/design-asset-discipline.md +17 -0
- package/docs/guidelines/design-fidelity-routing.md +1 -0
- package/docs/guidelines/php/api-design.md +10 -1
- package/llms.txt +12 -10
- package/package.json +15 -5
- package/src/agent-src/scripts/dashboard_mode.ts +4 -1
- package/src/agent-src/scripts/roadmap_age.ts +175 -0
- package/src/agent-src/scripts/update_roadmap_progress.ts +10 -2
- package/src/agent-src/templates/AGENTS.md +1 -1
- package/src/agent-src/templates/scripts/check_memory.ts +2 -2
- package/src/agent-src/templates/scripts/historical-bug-patterns.example.yml +13 -1
- package/src/agent-src/templates/scripts/work_engine/cli.ts +17 -0
- package/src/agent-src/templates/scripts/work_engine/cli_args.ts +10 -0
- package/src/agent-src/templates/scripts/work_engine/directives/ui/scaffold.ts +22 -13
- package/src/agent-src/templates/scripts/work_engine/dispatcher.ts +18 -4
- package/src/agent-src/templates/scripts/work_engine/procedure/checks.ts +283 -0
- package/src/agent-src/templates/scripts/work_engine/procedure/run.ts +432 -0
- package/src/agent-src/templates/scripts/work_engine/procedure/sidecar.ts +185 -0
- package/src/agent-src/templates/scripts/work_engine/state.ts +3 -0
- package/src/config/agent-settings.template.yml +120 -57
- package/src/config/agents-paths.yml +13 -7
- package/src/config/ci-local-parity.yml +44 -0
- package/src/config/continuity-surface.json +51 -2
- package/src/config/depth-audit-samples.json +5 -0
- package/src/config/discovery/command-verbs.yml +1 -0
- package/src/config/dispatch-economy-metrics.json +1 -0
- package/src/config/egress-mutations/class-precedence-swapped.json +7 -0
- package/src/config/egress-mutations/credential-token-restores.json +7 -0
- package/src/config/egress-mutations/iban-checksum-disabled.json +7 -0
- package/src/config/egress-mutations/raw-value-in-the-count-record.json +7 -0
- package/src/config/evaluator-budgets.json +4 -4
- package/src/config/gate-coverage.yml +149 -3
- package/src/config/gate-reachability-exemptions.json +3 -5
- package/src/config/gate-violation-baselines.json +29 -25
- package/src/config/gitignore-block.txt +6 -3
- package/src/config/hook-bundle-budget.json +34 -3
- package/src/config/hook-carrier-probes.json +30 -0
- package/src/config/hook-latency-budget.json +4 -2
- package/src/config/host-injection-effect.json +8 -1
- package/src/config/host-skill-frontmatter-keys.json +56 -0
- package/src/config/layer-form-brakes.json +4 -0
- package/src/config/layer-form-comparison-corpus.json +42 -0
- package/src/config/loop-surfaces.yaml +28 -47
- package/src/config/memory-twin-verdicts.yml +9 -1
- package/src/config/metric-registry.yml +40 -3
- package/src/config/pack-size-budget.json +15 -0
- package/src/config/procedure-core-budget.json +21 -0
- package/src/config/profiles/minimal.ini +1 -1
- package/src/config/project-tree-form.json +24 -0
- package/src/config/reach-channels.yml +3 -3
- package/src/config/reach-prescriptions-intake.yml +1 -1
- package/src/config/roadmap-step-size-baseline.json +118 -0
- package/src/config/routing-coverage-seed.json +100 -2
- package/src/config/skill-body-budget.json +686 -0
- package/src/config/skill-fork-pilot.json +17 -0
- package/src/config/skill-lifecycle-probes-codex.json +57 -0
- package/src/config/skill-lifecycle-probes.json +57 -0
- package/src/config/skill-output-shape.json +316 -0
- package/src/config/step-depth-table.json +58 -0
- package/src/config/turnaround-budget.json +90 -0
- package/src/install/conflict.ts +38 -6
- package/src/install/conflictTracker.ts +126 -8
- package/src/install/detect.ts +3 -3
- package/src/install/hostPermissionsAdapter.ts +136 -0
- package/src/install/installThinLayer.ts +6 -1
- package/src/install/manifestFiles.ts +24 -0
- package/src/install/noGoDenyRows.ts +368 -0
- package/src/install/noGoRules.ts +438 -0
- package/src/install/ownershipLedger.ts +180 -0
- package/src/install/plan.ts +1 -1
- package/src/install/preflight.ts +42 -10
- package/src/install/preserve.ts +94 -12
- package/src/install/recordedOwnership.ts +121 -3
- package/src/install/rule_scope.ts +20 -3
- package/src/install/stagedRuntime.ts +528 -0
- package/src/install/toolsArg.ts +16 -0
- package/src/install/types.ts +23 -2
- package/src/install/userPin.ts +54 -0
- package/src/install/wizard-plan.ts +25 -4
- package/src/scripts/_cli/_doctor_emit.ts +24 -0
- package/src/scripts/_cli/cmd_brand_status.ts +223 -12
- package/src/scripts/_cli/cmd_ci_settle.ts +32 -0
- package/src/scripts/_cli/cmd_doctor.ts +23 -44
- package/src/scripts/_cli/cmd_route_explain.ts +176 -2
- package/src/scripts/_cli/cmd_uninstall.ts +270 -26
- package/src/scripts/_cli/cmd_update.ts +34 -1
- package/src/scripts/_cli/cmd_upgrade.ts +38 -2
- package/src/scripts/_cli/detection_report.ts +7 -0
- package/src/scripts/_cli/doctor_execution.ts +1 -2
- package/src/scripts/_cli/doctor_install_mode.ts +39 -0
- package/src/scripts/_cli/doctor_network_posture.ts +3 -3
- package/src/scripts/_cli/doctor_ownership_ledger.ts +126 -0
- package/src/scripts/_cli/doctor_update_verdict.ts +104 -0
- package/src/scripts/_cli/explain_last/scrubber.ts +9 -21
- package/src/scripts/_cli/upgrade_unattended.ts +548 -0
- package/src/scripts/_dispatch.bash +42 -9
- package/src/scripts/_lib/activation_ladder.ts +1 -1
- package/src/scripts/_lib/advisory_inventory.ts +405 -0
- package/src/scripts/_lib/advisory_notice.ts +270 -0
- package/src/scripts/_lib/advisory_sources.ts +752 -0
- package/src/scripts/_lib/advisory_verdicts.ts +363 -0
- package/src/scripts/_lib/agent_artifact_location.ts +177 -0
- package/src/scripts/_lib/agent_settings.ts +7 -12
- package/src/scripts/_lib/arrival_record.ts +217 -0
- package/src/scripts/_lib/asset_render_record.ts +247 -0
- package/src/scripts/_lib/billing_grant.ts +4 -2
- package/src/scripts/_lib/brand_voice_slot.ts +258 -0
- package/src/scripts/_lib/canary_status.ts +24 -0
- package/src/scripts/_lib/cc_transcript.ts +276 -0
- package/src/scripts/_lib/changelog_eras.ts +83 -0
- package/src/scripts/_lib/claim_phrases.ts +71 -0
- package/src/scripts/_lib/classify_update.ts +171 -0
- package/src/scripts/_lib/claude_builtin_names.ts +9 -4
- package/src/scripts/_lib/claude_hook_scope.ts +195 -0
- package/src/scripts/_lib/claude_settings_hooks.ts +118 -34
- package/src/scripts/_lib/codex_resident_set.ts +460 -0
- package/src/scripts/_lib/codex_skill_finder.ts +225 -0
- package/src/scripts/_lib/confusables.ts +19 -0
- package/src/scripts/_lib/consumer_impact.ts +199 -0
- package/src/scripts/_lib/content_class.ts +127 -0
- package/src/scripts/_lib/counted_probe.ts +68 -1
- package/src/scripts/_lib/credential_deny_rows.ts +151 -0
- package/src/scripts/_lib/credential_files.ts +367 -0
- package/src/scripts/_lib/delivery_arm_experiment.ts +2 -2
- package/src/scripts/_lib/depth_flip.ts +141 -0
- package/src/scripts/_lib/design_lock.ts +117 -0
- package/src/scripts/_lib/design_sync_ledger.ts +142 -0
- package/src/scripts/_lib/design_sync_plan.ts +177 -0
- package/src/scripts/_lib/design_sync_reconcile.ts +159 -0
- package/src/scripts/_lib/design_sync_verify.ts +99 -0
- package/src/scripts/_lib/design_system_claude_design.ts +323 -0
- package/src/scripts/_lib/design_system_import.ts +84 -6
- package/src/scripts/_lib/dispatch_import_closure.ts +42 -11
- package/src/scripts/_lib/egress_credential_env.ts +35 -0
- package/src/scripts/_lib/egress_engine.ts +22 -0
- package/src/scripts/_lib/egress_known_values.ts +223 -0
- package/src/scripts/_lib/egress_normalize.ts +67 -0
- package/src/scripts/_lib/egress_prefixes.ts +42 -0
- package/src/scripts/_lib/egress_rules.ts +896 -0
- package/src/scripts/_lib/egress_rules_linearity.ts +56 -0
- package/src/scripts/_lib/egress_sender_scan.ts +290 -0
- package/src/scripts/_lib/egress_session_table.ts +510 -0
- package/src/scripts/_lib/egress_text.ts +63 -0
- package/src/scripts/_lib/egress_token.ts +252 -0
- package/src/scripts/_lib/empty_cycles.ts +1 -1
- package/src/scripts/_lib/environment_detector.ts +45 -30
- package/src/scripts/_lib/exemption_shape.ts +75 -1
- package/src/scripts/_lib/floor_posture.ts +185 -0
- package/src/scripts/_lib/forge_protection.ts +140 -2
- package/src/scripts/_lib/global_deploy_inventory.ts +159 -6
- package/src/scripts/_lib/guidelines_lane.ts +12 -1
- package/src/scripts/_lib/hand_kinds.ts +65 -0
- package/src/scripts/_lib/headless_invocation.ts +3 -3
- package/src/scripts/_lib/host_capability.ts +34 -2
- package/src/scripts/_lib/host_env_write.ts +39 -18
- package/src/scripts/_lib/host_listing_model.ts +14 -7
- package/src/scripts/_lib/identifier_redaction.ts +26 -0
- package/src/scripts/_lib/impact_bump.ts +70 -0
- package/src/scripts/_lib/install_reach_checks.ts +53 -1
- package/src/scripts/_lib/installed_layer.ts +31 -0
- package/src/scripts/_lib/installed_layer_normalise.ts +75 -0
- package/src/scripts/_lib/instructions_loaded_classify.ts +75 -0
- package/src/scripts/_lib/instructions_loaded_event.ts +53 -0
- package/src/scripts/_lib/knowledge_global_redaction.ts +2 -2
- package/src/scripts/_lib/layer_form_corpus.ts +165 -0
- package/src/scripts/_lib/layer_form_decision.ts +248 -0
- package/src/scripts/_lib/layer_form_evidence.ts +112 -0
- package/src/scripts/_lib/lean_projection_mode.ts +32 -161
- package/src/scripts/_lib/llm_proposer_transport.ts +1 -0
- package/src/scripts/_lib/loop_guards.ts +8 -120
- package/src/scripts/_lib/major_surface.ts +207 -0
- package/src/scripts/_lib/mcp_bridge.ts +30 -69
- package/src/scripts/_lib/merge_clearance_record.ts +384 -0
- package/src/scripts/_lib/neighbour_census.ts +18 -1
- package/src/scripts/_lib/orchestration_record.ts +61 -0
- package/src/scripts/_lib/outcome_vocabularies.ts +15 -23
- package/src/scripts/_lib/pin_advice.ts +49 -0
- package/src/scripts/_lib/platform_anchor.ts +222 -0
- package/src/scripts/_lib/procedure_checks.ts +5 -0
- package/src/scripts/_lib/project_tree_form.ts +134 -0
- package/src/scripts/_lib/projection_key_migration.ts +122 -0
- package/src/scripts/_lib/prompt_shape.ts +13 -2
- package/src/scripts/_lib/provenance_verify.ts +272 -0
- package/src/scripts/_lib/quota_parked.ts +27 -1
- package/src/scripts/_lib/ratification_artifact.ts +64 -1
- package/src/scripts/_lib/ratification_subject.ts +508 -46
- package/src/scripts/_lib/release_findings_ingest.ts +52 -5
- package/src/scripts/_lib/release_highlights.ts +72 -2
- package/src/scripts/_lib/release_settings_surface.ts +392 -0
- package/src/scripts/_lib/review_round.ts +134 -0
- package/src/scripts/_lib/roadmap_checkboxes.ts +1 -1
- package/src/scripts/_lib/roadmap_slug_lock.ts +254 -0
- package/src/scripts/_lib/roadmap_step_size.ts +75 -0
- package/src/scripts/_lib/run_checkpoint.ts +60 -3
- package/src/scripts/_lib/runtime_wiring_checks.ts +15 -1
- package/src/scripts/_lib/scope_guard.sh +64 -5
- package/src/scripts/_lib/scoped_projection.ts +136 -3
- package/src/scripts/_lib/secret_detector.ts +24 -103
- package/src/scripts/_lib/security_fix.ts +429 -0
- package/src/scripts/_lib/security_fix_context.ts +133 -0
- package/src/scripts/_lib/self_repair.ts +69 -39
- package/src/scripts/_lib/self_repair_outgoing.ts +209 -0
- package/src/scripts/_lib/self_repair_payload.ts +86 -0
- package/src/scripts/_lib/session_eol.ts +3 -0
- package/src/scripts/_lib/session_pr_watch.ts +207 -0
- package/src/scripts/_lib/session_register.ts +51 -1
- package/src/scripts/_lib/session_tag.ts +51 -0
- package/src/scripts/_lib/settings_removed_keys.ts +30 -0
- package/src/scripts/_lib/settings_renamed_keys.ts +19 -5
- package/src/scripts/_lib/skill_catalogue.ts +66 -25
- package/src/scripts/_lib/skill_fork_pilot.ts +121 -0
- package/src/scripts/_lib/skill_leases.ts +203 -0
- package/src/scripts/_lib/skill_listing_overrides.ts +294 -0
- package/src/scripts/_lib/skill_materialisation.ts +388 -0
- package/src/scripts/_lib/skill_materialisation_gate.ts +210 -0
- package/src/scripts/_lib/skill_materialisation_lock.ts +149 -0
- package/src/scripts/_lib/skill_materialisation_triggers.ts +96 -0
- package/src/scripts/_lib/skill_origin.ts +21 -1
- package/src/scripts/_lib/skill_reach.ts +342 -0
- package/src/scripts/_lib/source_shape.ts +7 -2
- package/src/scripts/_lib/sqlite_guard.ts +1 -1
- package/src/scripts/_lib/step_anatomy.ts +330 -0
- package/src/scripts/_lib/subagent_capsule.ts +8 -2
- package/src/scripts/_lib/subagent_native_fields.ts +30 -0
- package/src/scripts/_lib/subagent_spawn.ts +36 -0
- package/src/scripts/_lib/subagent_steering.ts +367 -0
- package/src/scripts/_lib/svg_dom.ts +318 -0
- package/src/scripts/_lib/svg_filled_counter.ts +287 -0
- package/src/scripts/_lib/svg_geometry.ts +480 -0
- package/src/scripts/_lib/svg_motion.ts +208 -0
- package/src/scripts/_lib/svg_rules.ts +1455 -0
- package/src/scripts/_lib/svg_urls.ts +72 -0
- package/src/scripts/_lib/test_delta.ts +89 -6
- package/src/scripts/_lib/tier_downshift_verdict.ts +222 -0
- package/src/scripts/_lib/tool_result_census.ts +62 -0
- package/src/scripts/_lib/trigger_routers.ts +1 -0
- package/src/scripts/_lib/turnaround_throughput.ts +378 -0
- package/src/scripts/_lib/ui_surface.ts +22 -0
- package/src/scripts/_lib/unattended_gates.ts +100 -0
- package/src/scripts/_lib/undeployed_fixes.ts +34 -0
- package/src/scripts/_lib/update_check.ts +143 -12
- package/src/scripts/_lib/update_invite.ts +116 -0
- package/src/scripts/_lib/update_notice.ts +259 -0
- package/src/scripts/_lib/verification_command.ts +59 -0
- package/src/scripts/_lib/verify_clause.ts +31 -19
- package/src/scripts/_lib/version_order.ts +146 -0
- package/src/scripts/_lib/worker_reuse.ts +191 -0
- package/src/scripts/_lib/workspace_secrets.ts +273 -0
- package/src/scripts/_lib/worktree_git.ts +67 -0
- package/src/scripts/_lib/worktree_ignored.ts +116 -0
- package/src/scripts/adoption_status.ts +330 -3
- package/src/scripts/adr_cite_check.ts +93 -0
- package/src/scripts/advisories.ts +803 -0
- package/src/scripts/ai-image/adapters/flux.sh +1 -0
- package/src/scripts/ai-image/adapters/gemini-image.sh +1 -0
- package/src/scripts/ai-image/adapters/ideogram.sh +1 -0
- package/src/scripts/ai-image/adapters/recraft.sh +1 -0
- package/src/scripts/ai-video/adapters/comfyui.sh +1 -0
- package/src/scripts/ai-video/adapters/fal.sh +1 -0
- package/src/scripts/ai-video/adapters/gemini-veo.sh +1 -0
- package/src/scripts/ai-video/adapters/higgsfield.sh +1 -0
- package/src/scripts/ai-video/adapters/kling.sh +1 -0
- package/src/scripts/ai-video/adapters/musetalk.sh +1 -0
- package/src/scripts/ai-video/adapters/openai-images.sh +1 -0
- package/src/scripts/ai-video/adapters/replicate.sh +1 -0
- package/src/scripts/ai-video/adapters/sora.sh +1 -0
- package/src/scripts/ai-video/adapters/syncso.sh +1 -0
- package/src/scripts/ai-video/stitch.sh +115 -2
- package/src/scripts/ai_council/airgap.ts +1 -0
- package/src/scripts/ai_council/api_transport.ts +27 -4
- package/src/scripts/ai_council/budget_guard.ts +300 -11
- package/src/scripts/ai_council/bundler.ts +20 -29
- package/src/scripts/ai_council/chairman.ts +17 -2
- package/src/scripts/ai_council/cli_agency_bounds.ts +158 -0
- package/src/scripts/ai_council/cli_launch_env.ts +54 -0
- package/src/scripts/ai_council/cli_least_agency_canary.ts +18 -2
- package/src/scripts/ai_council/clients.ts +55 -73
- package/src/scripts/ai_council/config.ts +16 -22
- package/src/scripts/ai_council/council_egress.ts +167 -0
- package/src/scripts/ai_council/exposure_ledger.ts +117 -0
- package/src/scripts/ai_council/free_hand_shadow.ts +276 -0
- package/src/scripts/ai_council/free_route.ts +216 -0
- package/src/scripts/ai_council/free_route_catalog.ts +173 -0
- package/src/scripts/ai_council/free_route_client.ts +95 -0
- package/src/scripts/ai_council/free_rung.ts +61 -0
- package/src/scripts/ai_council/hand_payload.ts +230 -0
- package/src/scripts/ai_council/hand_schemas.ts +123 -0
- package/src/scripts/ai_council/jury_aggregate.ts +155 -1
- package/src/scripts/ai_council/kind_flip.ts +221 -0
- package/src/scripts/ai_council/kind_flip_state.ts +19 -0
- package/src/scripts/ai_council/learn_low_impact_preview.ts +50 -22
- package/src/scripts/ai_council/modification_review.ts +98 -5
- package/src/scripts/ai_council/necessity.ts +7 -0
- package/src/scripts/ai_council/orchestrator.ts +16 -16
- package/src/scripts/ai_council/pricing.ts +10 -0
- package/src/scripts/ai_council/redact_low_impact_entry.ts +5 -2
- package/src/scripts/ai_council/response_render.ts +27 -4
- package/src/scripts/ai_council/round_reservations.ts +119 -0
- package/src/scripts/ai_council/route_chooser.ts +161 -0
- package/src/scripts/ai_council/route_liveness.ts +152 -0
- package/src/scripts/ai_council/route_member.ts +52 -0
- package/src/scripts/ai_council/seat_policy.ts +40 -0
- package/src/scripts/ai_council/seat_resume.ts +40 -0
- package/src/scripts/ai_council/shadow_dispatch.ts +13 -3
- package/src/scripts/ai_council/spend_gate.ts +18 -2
- package/src/scripts/ai_council/status_surface.ts +37 -0
- package/src/scripts/ai_council/transport_resolver.ts +15 -18
- package/src/scripts/analysis_analysts.ts +226 -0
- package/src/scripts/analysis_anchors.ts +140 -0
- package/src/scripts/analysis_and_optimize.ts +44 -0
- package/src/scripts/analysis_emit.ts +150 -0
- package/src/scripts/analysis_exchange.ts +186 -0
- package/src/scripts/analysis_gate.ts +158 -0
- package/src/scripts/analysis_inbox_final.ts +173 -0
- package/src/scripts/analysis_ledger.ts +119 -0
- package/src/scripts/analysis_pr_optimize.ts +219 -0
- package/src/scripts/analysis_pr_review.ts +240 -0
- package/src/scripts/analysis_pr_target.ts +121 -0
- package/src/scripts/analysis_prompts.ts +130 -0
- package/src/scripts/analysis_publish.ts +358 -0
- package/src/scripts/analysis_questions.ts +78 -0
- package/src/scripts/analysis_run.ts +248 -0
- package/src/scripts/analysis_run_record.ts +210 -0
- package/src/scripts/analysis_target.ts +343 -0
- package/src/scripts/analysis_validate.ts +161 -0
- package/src/scripts/anchor_eval_falsify.ts +1 -1
- package/src/scripts/arrival_report.ts +115 -0
- package/src/scripts/ask_transport.ts +284 -35
- package/src/scripts/backfill_model_tier.ts +4 -5
- package/src/scripts/before_complete_hook.ts +48 -2
- package/src/scripts/bench_hook_latency.ts +3 -3
- package/src/scripts/bench_procedure_cursor.ts +440 -0
- package/src/scripts/bootstrap.sh +3 -3
- package/src/scripts/build_exit_code_register.ts +440 -0
- package/src/scripts/build_proof.ts +23 -1
- package/src/scripts/cache_realization_report.ts +155 -14
- package/src/scripts/canary_liveness.ts +117 -0
- package/src/scripts/chat_history.ts +12 -15
- package/src/scripts/check_account_surface.ts +318 -0
- package/src/scripts/check_agent_artifact_location.ts +17 -160
- package/src/scripts/check_bundle_path_leakage.ts +6 -0
- package/src/scripts/check_ci_local_parity.ts +21 -13
- package/src/scripts/check_claims.ts +77 -2
- package/src/scripts/check_completion_review.ts +34 -1
- package/src/scripts/check_concern_admissions.ts +41 -5
- package/src/scripts/check_consumer_scope_flip.ts +1 -1
- package/src/scripts/check_context_paths.ts +2 -0
- package/src/scripts/check_council_layout.ts +9 -0
- package/src/scripts/check_credential_spelling.ts +267 -0
- package/src/scripts/check_egress_mutations.ts +239 -0
- package/src/scripts/check_enforcement_coverage.ts +16 -3
- package/src/scripts/check_estate_count.ts +16 -1
- package/src/scripts/check_finding_dispositions.ts +147 -0
- package/src/scripts/check_gate_coverage.ts +123 -21
- package/src/scripts/check_gate_reachability.ts +16 -2
- package/src/scripts/check_generator_sync.ts +46 -0
- package/src/scripts/check_hook_bundle_composition.ts +139 -1
- package/src/scripts/check_host_docs_digest.ts +142 -5
- package/src/scripts/check_kernel_edit_ratified.ts +301 -76
- package/src/scripts/check_kernel_rule_bundle.ts +14 -10
- package/src/scripts/check_knowledge_cards.ts +83 -3
- package/src/scripts/check_memory.ts +13 -3
- package/src/scripts/check_pack_size.ts +1 -1
- package/src/scripts/check_permission_deny_syntax.ts +247 -0
- package/src/scripts/check_platform_anchor.ts +243 -0
- package/src/scripts/check_proposal.ts +183 -1
- package/src/scripts/check_reach_channels.ts +5 -3
- package/src/scripts/check_references.ts +5 -2
- package/src/scripts/check_release_manifest_content.ts +33 -0
- package/src/scripts/check_release_pr_shape.ts +5 -0
- package/src/scripts/check_rule_invariants.ts +9 -1
- package/src/scripts/check_skill_body_budget.ts +343 -0
- package/src/scripts/check_skill_requires.ts +137 -1
- package/src/scripts/check_step_receipts.ts +246 -0
- package/src/scripts/check_structural_breaking.ts +7 -1
- package/src/scripts/check_suppression_hygiene.ts +8 -0
- package/src/scripts/check_test_weakening.ts +14 -0
- package/src/scripts/check_token_quality_golden.ts +5 -1
- package/src/scripts/check_update_banner.ts +50 -3
- package/src/scripts/check_verify_expectation_delta.ts +2 -1
- package/src/scripts/check_voice_lexicon.ts +531 -0
- package/src/scripts/ci_os_attribution.ts +327 -0
- package/src/scripts/ci_platform_scope.ts +69 -0
- package/src/scripts/ci_settle.ts +4 -1
- package/src/scripts/ci_status.ts +0 -1
- package/src/scripts/ci_time_to_green.ts +748 -0
- package/src/scripts/classify_merge_risk.ts +407 -19
- package/src/scripts/code_graph/sqlite_store.ts +1 -1
- package/src/scripts/compile_trigger_evals.ts +353 -0
- package/src/scripts/condense.ts +25 -31
- package/src/scripts/consumer_matrix.ts +61 -3
- package/src/scripts/council_availability_hook.ts +12 -4
- package/src/scripts/council_cli.ts +48 -38
- package/src/scripts/cross_repo_retrieve.ts +9 -72
- package/src/scripts/design_lock.ts +106 -0
- package/src/scripts/design_slop_rules.ts +30 -0
- package/src/scripts/design_sync.ts +264 -0
- package/src/scripts/design_system_import.ts +30 -13
- package/src/scripts/dispatch_economy_report.ts +46 -1
- package/src/scripts/dispatch_r2_reviewer.ts +41 -5
- package/src/scripts/egress_canary.ts +166 -0
- package/src/scripts/egress_sender_census.ts +101 -0
- package/src/scripts/external_sources_denylist.json +94 -12
- package/src/scripts/generate_catalog.ts +6 -2
- package/src/scripts/generate_owned_digest.ts +163 -0
- package/src/scripts/generate_reference_toc.ts +143 -0
- package/src/scripts/generate_subagent_floor.ts +11 -1
- package/src/scripts/handoff_context_hook.ts +34 -0
- package/src/scripts/hook_carrier_census.ts +263 -0
- package/src/scripts/hook_chunks.d.mts +12 -0
- package/src/scripts/hook_chunks.mjs +114 -0
- package/src/scripts/hook_manifest.json +1 -1
- package/src/scripts/hook_manifest.yaml +65 -42
- package/src/scripts/hooks/block_config_weakening.ts +127 -3
- package/src/scripts/hooks/block_credential_reads.ts +165 -0
- package/src/scripts/hooks/block_no_verify.ts +47 -23
- package/src/scripts/hooks/block_speaking_inbox_dir.ts +54 -8
- package/src/scripts/hooks/category_a.ts +202 -25
- package/src/scripts/hooks/concern_failure_policy.ts +6 -6
- package/src/scripts/hooks/concern_registry.ts +31 -6
- package/src/scripts/hooks/concern_registry_types.ts +11 -0
- package/src/scripts/hooks/delegation_nudge_hook.ts +105 -15
- package/src/scripts/hooks/design_pass_hook.ts +199 -13
- package/src/scripts/hooks/dispatch_hook.ts +13 -12
- package/src/scripts/hooks/egress_engine_loader.ts +125 -0
- package/src/scripts/hooks/egress_stage.ts +440 -0
- package/src/scripts/hooks/hook_stdin.ts +29 -4
- package/src/scripts/hooks/host_docs_pages.ts +194 -0
- package/src/scripts/hooks/host_docs_pages.yaml +75 -0
- package/src/scripts/hooks/host_lowering.json +1 -1
- package/src/scripts/hooks/host_lowering.yaml +22 -21
- package/src/scripts/hooks/host_rate_marker_hook.ts +73 -0
- package/src/scripts/hooks/instructions_observer_hook.ts +170 -0
- package/src/scripts/hooks/interruption_ledger_hook.ts +1 -1
- package/src/scripts/hooks/lazy_concern.ts +148 -0
- package/src/scripts/hooks/orchestration_record_hook.ts +80 -2
- package/src/scripts/hooks/payload_stub.ts +16 -6
- package/src/scripts/hooks/permission_gate.ts +7 -7
- package/src/scripts/hooks/push_settle_hook.ts +32 -3
- package/src/scripts/hooks/replay_hook.ts +43 -0
- package/src/scripts/hooks/reread_guard_hook.ts +87 -10
- package/src/scripts/hooks/rtk_wrap_hook.ts +4 -3
- package/src/scripts/hooks/rule_inject_hook.ts +8 -1
- package/src/scripts/hooks/session_eol_hook.ts +48 -1
- package/src/scripts/hooks/source_first_gate_hook.ts +6 -8
- package/src/scripts/hooks/spawn_guard_shadow_hook.ts +203 -10
- package/src/scripts/hooks/state_io.ts +2 -2
- package/src/scripts/hooks/svg_obligation.ts +553 -0
- package/src/scripts/hooks/svg_rules_loader.ts +133 -0
- package/src/scripts/hooks/tool_result_bytes_hook.ts +14 -5
- package/src/scripts/hooks/turn_end_gate_hook.ts +5 -3
- package/src/scripts/hooks/ui_route_nudge_hook.ts +2 -12
- package/src/scripts/hooks_doctor.ts +31 -0
- package/src/scripts/hooks_status.ts +58 -3
- package/src/scripts/inbox_source_census.ts +74 -13
- package/src/scripts/install +25 -3
- package/src/scripts/install.ts +60 -91
- package/src/scripts/interruption_report.ts +11 -1
- package/src/scripts/layer_baseline_report.ts +267 -0
- package/src/scripts/learning_sidecar.ts +1 -1
- package/src/scripts/lint_agents_layout.ts +3 -0
- package/src/scripts/lint_blocker_citations.ts +104 -0
- package/src/scripts/lint_breaking_changes_index.ts +40 -7
- package/src/scripts/lint_consolidation_lineage.ts +150 -19
- package/src/scripts/lint_consumer_internal_refs.ts +90 -42
- package/src/scripts/lint_context_spine_usage.ts +21 -0
- package/src/scripts/lint_design_antipattern_parity.ts +39 -7
- package/src/scripts/lint_design_quality.ts +60 -12
- package/src/scripts/lint_evidence_artifacts.ts +31 -0
- package/src/scripts/lint_example_fences.ts +11 -2
- package/src/scripts/lint_ghostwriter_source.ts +42 -10
- package/src/scripts/lint_hook_manifest.ts +94 -0
- package/src/scripts/lint_marketplace_install_completeness.ts +4 -0
- package/src/scripts/lint_mcp_config_security.ts +9 -11
- package/src/scripts/lint_motion_authority_drift.ts +27 -0
- package/src/scripts/lint_plan_risk_register.ts +28 -1
- package/src/scripts/lint_positioning.ts +4 -4
- package/src/scripts/lint_provenance.ts +1 -0
- package/src/scripts/lint_roadmap_blockers.ts +65 -4
- package/src/scripts/lint_roadmap_complexity.ts +98 -0
- package/src/scripts/lint_skill_link_reach.ts +251 -9
- package/src/scripts/lint_skill_procedures.ts +252 -0
- package/src/scripts/lint_skill_scripts_readonly.ts +12 -1
- package/src/scripts/lint_subagent_determinism.ts +14 -1
- package/src/scripts/lint_svg_asset.ts +365 -0
- package/src/scripts/lint_ticked_unmet_criteria.ts +300 -21
- package/src/scripts/mcp_registry_submit.sh +2 -2
- package/src/scripts/mcp_server/consumer_tool_catalog.json +4 -4
- package/src/scripts/mcp_server/suggest_skill.ts +89 -4
- package/src/scripts/mcp_server/tools.ts +2 -33
- package/src/scripts/measure_skill_ranker_baseline.ts +203 -5
- package/src/scripts/measure_turn_end_gate.ts +61 -1
- package/src/scripts/merge_clearance.ts +225 -0
- package/src/scripts/migrate_command_suggestions.ts +1 -1
- package/src/scripts/network_sources.ts +236 -0
- package/src/scripts/no_go_deny_rows.ts +225 -0
- package/src/scripts/orchestration_record.ts +15 -2
- package/src/scripts/plan_test_shards.ts +103 -0
- package/src/scripts/pr_url_reminder_hook.ts +10 -0
- package/src/scripts/print_required_checks.ts +5 -5
- package/src/scripts/probe_depth_shadow.ts +406 -0
- package/src/scripts/probe_turnaround.ts +342 -10
- package/src/scripts/ratification_subject.ts +176 -0
- package/src/scripts/rdp_gate_classify.ts +1 -0
- package/src/scripts/rdp_quality_eval.ts +1 -0
- package/src/scripts/release.ts +26 -55
- package/src/scripts/release_drill.ts +52 -23
- package/src/scripts/release_env.ts +37 -0
- package/src/scripts/release_publication.ts +11 -1
- package/src/scripts/report_consumer_gate_reach.ts +233 -0
- package/src/scripts/report_merge_gate_load.ts +295 -0
- package/src/scripts/report_project_contract.ts +123 -0
- package/src/scripts/report_reducible_classes.ts +342 -0
- package/src/scripts/report_required_checks_drift.ts +5 -3
- package/src/scripts/report_skill_host_census.ts +199 -0
- package/src/scripts/report_standing_payload_by_host.ts +7 -7
- package/src/scripts/retro.ts +758 -0
- package/src/scripts/retro_facts.ts +575 -0
- package/src/scripts/retro_queue.ts +739 -0
- package/src/scripts/retro_session_facts.ts +218 -0
- package/src/scripts/retro_sweep.ts +493 -0
- package/src/scripts/retro_triage.ts +126 -0
- package/src/scripts/roadmap_context.ts +2 -2
- package/src/scripts/roadmap_drain_queue.ts +601 -0
- package/src/scripts/run_supervise.ts +24 -2
- package/src/scripts/schemas/agent-settings.schema.json +0 -16
- package/src/scripts/schemas/command.schema.json +3 -3
- package/src/scripts/schemas/review-findings.schema.json +8 -0
- package/src/scripts/schemas/skill.schema.json +7 -6
- package/src/scripts/schemas/subagent.schema.json +33 -2
- package/src/scripts/score_skill_selection.ts +5 -2
- package/src/scripts/second_brain_retrieval.ts +1 -0
- package/src/scripts/second_brain_run.ts +1 -0
- package/src/scripts/self_repair_cli.ts +563 -87
- package/src/scripts/self_review_gate.ts +59 -4
- package/src/scripts/session_register_hook.ts +91 -4
- package/src/scripts/sessions_cli.ts +100 -5
- package/src/scripts/skill_collision_clusters.ts +1 -1
- package/src/scripts/skill_tools/score_skill_relevance.ts +31 -2
- package/src/scripts/skill_trigger_eval.ts +4 -2
- package/src/scripts/source_adapters.ts +183 -0
- package/src/scripts/step_receipt.ts +100 -0
- package/src/scripts/sync_pr_branch.ts +4 -0
- package/src/scripts/test_council_qualification.ts +1 -1
- package/src/scripts/trigger_eval_grandfather.json +3 -49
- package/src/scripts/trigger_eval_rotation.ts +31 -3
- package/src/scripts/ui_conformance_probe.ts +405 -1
- package/src/scripts/update_counts.ts +230 -11
- package/src/scripts/update_invite_hook.ts +245 -0
- package/src/scripts/update_notice_hook.ts +298 -0
- package/src/scripts/validate_frontmatter.ts +85 -0
- package/src/scripts/worker_reuse_shadow_report.ts +121 -0
- package/src/scripts/worktree_cleanup_check.ts +915 -121
- package/src/server/io/yamlIO.ts +2 -2
- package/src/server/schemas/settings.ts +37 -23
- package/src/shared/brandTokenDocument.ts +46 -0
- package/src/shared/brandTokenPaths.ts +43 -0
- package/src/shared/settingsCarveOut.ts +0 -8
- package/src/shared/skillRanking.ts +106 -5
- package/src/shared/userMd/formAdapter.ts +15 -1
- package/src/shared/userMd/schema.ts +22 -0
- package/src/templates/agent-user.md +4 -0
- package/src/templates/agent-user.yml +4 -0
- package/dist/cli-delegate/chunk-523HCFYO.js +0 -90
- package/dist/cli-delegate/chunk-AL3RZ22D.js +0 -74
- package/dist/cli-delegate/chunk-KB5FZ655.js +0 -208
- package/dist/cli-delegate/chunk-MDPPKQCQ.js +0 -875
- package/dist/cli-delegate/chunk-MSUL5NYP.js +0 -1123
- package/dist/cli-delegate/chunk-OAFSJBHH.js +0 -272
- package/dist/ui/assets/index-C3djEJah.js +0 -23
- package/src/scripts/_lib/continuation_ladder.ts +0 -335
- package/src/scripts/hooks/run_continuation_hook.ts +0 -1524
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The one-release-window read of the projection keys ADR-293 removed.
|
|
3
|
+
*
|
|
4
|
+
* WHAT A REMOVED KEY MAY STILL DO, AND WHAT IT MAY NOT. A consumer who wrote
|
|
5
|
+
* `lean_projection.mode: eager-all` or `projection.mode: legacy-all` asked for
|
|
6
|
+
* one thing — keep the full rule layer — and the package can still honour that
|
|
7
|
+
* intent without the key: it is exactly what the install receipt's `user_pin`
|
|
8
|
+
* expresses. So for one window those two values are read once and converted
|
|
9
|
+
* into the pin. Every OTHER prior value is dropped, because every other value
|
|
10
|
+
* asked for a form the package now decides for itself from machine evidence,
|
|
11
|
+
* and applying it would reinstate the key under another name.
|
|
12
|
+
*
|
|
13
|
+
* BOTH DISPOSITIONS ARE PRINTED. A value silently honoured and a value silently
|
|
14
|
+
* dropped are indistinguishable to the consumer who wrote it, and the dropped
|
|
15
|
+
* case is the one that changes what their machine does. {@link migrationLines}
|
|
16
|
+
* emits one line per leftover key whichever way it went.
|
|
17
|
+
*
|
|
18
|
+
* THE WINDOW IS NAMED IN THE OUTPUT, NOT ONLY IN A COMMENT. After it closes
|
|
19
|
+
* this module goes and `REMOVED_KEYS` is what remains: a leftover key is then
|
|
20
|
+
* named as ignored by the loader's own deprecation line, with no conversion.
|
|
21
|
+
* That is a deliberate narrowing — the conversion exists to carry an intent
|
|
22
|
+
* across one upgrade, not to become a second settings reader with a longer
|
|
23
|
+
* life than the key it replaced.
|
|
24
|
+
*
|
|
25
|
+
* Pure: it takes a merged settings tree and returns a verdict. It reads no
|
|
26
|
+
* file, writes none, and never throws on a malformed branch — a settings layer
|
|
27
|
+
* nothing can parse must not fail an install.
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
type SettingsDict = Record<string, unknown>;
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* The release window this conversion is open for, as it appears in every line
|
|
34
|
+
* the module prints. Delete this module when the window closes; the tombstones
|
|
35
|
+
* in `REMOVED_KEYS` carry the keys from then on.
|
|
36
|
+
*/
|
|
37
|
+
export const MIGRATION_WINDOW = 'one release window after the 2026-10 key removal';
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Per removed key, the ONE prior value that meant "keep the full layer". Both
|
|
41
|
+
* are the value an absent key already resolved to, which is why they are the
|
|
42
|
+
* only two that survive: honouring them changes nothing about the machine, and
|
|
43
|
+
* dropping them would silently thin a consumer who had asked not to be.
|
|
44
|
+
*/
|
|
45
|
+
export const LEGACY_FULL_VALUE: Readonly<Record<string, string>> = Object.freeze({
|
|
46
|
+
'lean_projection.mode': 'eager-all',
|
|
47
|
+
'projection.mode': 'legacy-all',
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
export type Disposition = 'pin' | 'dropped';
|
|
51
|
+
|
|
52
|
+
export interface LegacyRow {
|
|
53
|
+
readonly key: string;
|
|
54
|
+
/** The value as written, trimmed; never normalised onto a known enum. */
|
|
55
|
+
readonly value: string;
|
|
56
|
+
readonly disposition: Disposition;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export interface LegacyProjectionIntent {
|
|
60
|
+
/** The receipt pin this upgrade should write, if any leftover asked for the full form. */
|
|
61
|
+
readonly pin: boolean;
|
|
62
|
+
/** One row per leftover key found, in the order of {@link LEGACY_FULL_VALUE}. */
|
|
63
|
+
readonly rows: readonly LegacyRow[];
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/** One dotted path out of a merged settings tree; `undefined` when absent or unreachable. */
|
|
67
|
+
function readDotted(root: SettingsDict, dotted: string): unknown {
|
|
68
|
+
let node: unknown = root;
|
|
69
|
+
for (const part of dotted.split('.')) {
|
|
70
|
+
if (typeof node !== 'object' || node === null || Array.isArray(node)) return undefined;
|
|
71
|
+
node = (node as SettingsDict)[part];
|
|
72
|
+
}
|
|
73
|
+
return node;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* What the leftover projection keys in `merged` ask for, and what is done about
|
|
78
|
+
* it. A key whose value is not a string is not a value this package ever wrote,
|
|
79
|
+
* so it yields no row rather than a guess.
|
|
80
|
+
*/
|
|
81
|
+
export function readLegacyProjectionIntent(merged: SettingsDict): LegacyProjectionIntent {
|
|
82
|
+
const rows: LegacyRow[] = [];
|
|
83
|
+
let pin = false;
|
|
84
|
+
for (const [key, full] of Object.entries(LEGACY_FULL_VALUE)) {
|
|
85
|
+
const raw = readDotted(merged, key);
|
|
86
|
+
if (typeof raw !== 'string') continue;
|
|
87
|
+
const value = raw.trim();
|
|
88
|
+
if (value === '') continue;
|
|
89
|
+
const disposition: Disposition = value.toLowerCase() === full ? 'pin' : 'dropped';
|
|
90
|
+
if (disposition === 'pin') pin = true;
|
|
91
|
+
rows.push({ key, value, disposition });
|
|
92
|
+
}
|
|
93
|
+
return { pin, rows };
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/** One line per leftover key, naming what was done with it and for how long this happens. */
|
|
97
|
+
export function migrationLines(intent: LegacyProjectionIntent): string[] {
|
|
98
|
+
return intent.rows.map((row) =>
|
|
99
|
+
row.disposition === 'pin'
|
|
100
|
+
? `${row.key}: "${row.value}" was removed (ADR-293); read once as a request to keep the rule layer full, ` +
|
|
101
|
+
`and kept as the install receipt's pin — ${MIGRATION_WINDOW}.`
|
|
102
|
+
: `${row.key}: "${row.value}" was removed (ADR-293); ignored — the package decides the layer form from ` +
|
|
103
|
+
`machine evidence, and \`doctor --check layer-form\` says which form it chose and why — ${MIGRATION_WINDOW}.`,
|
|
104
|
+
);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* The installer's whole use of this module: read the leftover keys out of the
|
|
109
|
+
* machine's own settings, print what was done with each, and say whether the
|
|
110
|
+
* receipt pin should be written. Returns `false` on any unreadable layer — a
|
|
111
|
+
* settings file nothing can parse states no preference, and the absence of a
|
|
112
|
+
* preference is the full form either way.
|
|
113
|
+
*/
|
|
114
|
+
export function legacyProjectionPin(
|
|
115
|
+
merged: SettingsDict | null,
|
|
116
|
+
emit: (line: string) => void,
|
|
117
|
+
): boolean {
|
|
118
|
+
if (merged === null) return false;
|
|
119
|
+
const intent = readLegacyProjectionIntent(merged);
|
|
120
|
+
for (const line of migrationLines(intent)) emit(line);
|
|
121
|
+
return intent.pin;
|
|
122
|
+
}
|
|
@@ -79,7 +79,8 @@
|
|
|
79
79
|
* slot (the git-authorization ledger, the suggestion latch) while this one
|
|
80
80
|
* guards the language pin. As of this change both know `<task-notification>`,
|
|
81
81
|
* `<system-reminder>` and `<agent-message`; only this one knows
|
|
82
|
-
* `[SYSTEM NOTIFICATION
|
|
82
|
+
* `[SYSTEM NOTIFICATION`, `<local-command-caveat>` and the host's framed
|
|
83
|
+
* agent-message delivery (`AGENT_MESSAGE_FRAME`). That asymmetry is NOT
|
|
83
84
|
* obviously a defect and was deliberately left: mistaking a real turn for a
|
|
84
85
|
* machine one costs a mis-pinned reply here and a RETAINED AUTHORIZATION
|
|
85
86
|
* there, so the two sides do not want the same error budget — and
|
|
@@ -95,10 +96,20 @@ export function isSyntheticPrompt(prompt: string): boolean {
|
|
|
95
96
|
head.startsWith("<local-command-caveat>") ||
|
|
96
97
|
head.startsWith("<agent-message") ||
|
|
97
98
|
head.startsWith("Your claude.ai usage limit has reset") ||
|
|
98
|
-
/^\[SYSTEM NOTIFICATION\b/.test(head)
|
|
99
|
+
/^\[SYSTEM NOTIFICATION\b/.test(head) ||
|
|
100
|
+
AGENT_MESSAGE_FRAME.test(head)
|
|
99
101
|
);
|
|
100
102
|
}
|
|
101
103
|
|
|
104
|
+
/**
|
|
105
|
+
* How Claude Code actually delivers a subagent hand-back or a cross-session
|
|
106
|
+
* message to `user_prompt_submit`: one fixed host sentence, then the wrapper
|
|
107
|
+
* tag, which the bare `<agent-message` case above never matched. Both halves
|
|
108
|
+
* are required so a human quoting the sentence keeps their turn.
|
|
109
|
+
*/
|
|
110
|
+
const AGENT_MESSAGE_FRAME =
|
|
111
|
+
/^Another Claude session sent a message:\s*\n\s*<(?:agent-message|cross-session-message)\b/;
|
|
112
|
+
|
|
102
113
|
/**
|
|
103
114
|
* A line that starts pasted DOCUMENT content rather than typed instruction.
|
|
104
115
|
*
|
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tie a published version's provenance attestation to THIS package's OIDC
|
|
3
|
+
* publish workflow.
|
|
4
|
+
*
|
|
5
|
+
* The gate this replaces read `dist.attestations.provenance.predicateType` out
|
|
6
|
+
* of the packument and accepted anything starting with the SLSA provenance
|
|
7
|
+
* URL. That is a presence check wearing a verification's clothes: any workflow
|
|
8
|
+
* in any repository with `id-token: write` produces a document that passes it,
|
|
9
|
+
* so an attacker who can publish from their own CI already satisfies it. The
|
|
10
|
+
* step that opened this file (`road-to-an-update-that-installs-itself-only-when-it-is-safe`
|
|
11
|
+
* 2.1) named exactly that gap — *"does not verify the attestation's signature
|
|
12
|
+
* or tie it to `publish-npm.yml`"* — and this module closes the second half.
|
|
13
|
+
*
|
|
14
|
+
* **The first half is only partly closed here, and the distinction is
|
|
15
|
+
* load-bearing.** `provenance_matches_publish` parses an UNSIGNED reading of
|
|
16
|
+
* the DSSE payload. `verify_attestation_signature` below checks the envelope's
|
|
17
|
+
* signature against the certificate the bundle carries, and requires the
|
|
18
|
+
* payload it verified to name the same workflow — but checks no trust root
|
|
19
|
+
* (see its own note). The registry-key half is `npm audit signatures`, which
|
|
20
|
+
* verifies against npm's own trusted keys and is run by the caller as a
|
|
21
|
+
* separate step; these functions are only meaningful WITH it, and the caller
|
|
22
|
+
* says so where it composes them.
|
|
23
|
+
*
|
|
24
|
+
* Why not verify the signature in-process: it needs a sigstore/cosign
|
|
25
|
+
* verification path, which is a dependency this package does not carry and
|
|
26
|
+
* which the hook and pack byte budgets would both have to absorb. Shelling out
|
|
27
|
+
* to the npm client — already a hard dependency of an upgrade — buys the same
|
|
28
|
+
* property for nothing.
|
|
29
|
+
*/
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* The workflow path every legitimate release of this package is built by.
|
|
33
|
+
*
|
|
34
|
+
* A literal rather than a read of `.github/workflows/`: the question is which
|
|
35
|
+
* workflow the REGISTRY says produced the tarball, and answering it from the
|
|
36
|
+
* local tree would let a checkout vouch for itself.
|
|
37
|
+
*/
|
|
38
|
+
export const EXPECTED_WORKFLOW_REF = '.github/workflows/publish-npm.yml';
|
|
39
|
+
|
|
40
|
+
/** The repository every legitimate release of this package is built from. */
|
|
41
|
+
export const EXPECTED_REPOSITORY = 'https://github.com/event4u-app/agent-config';
|
|
42
|
+
|
|
43
|
+
function asRecord(v: unknown): Record<string, unknown> | null {
|
|
44
|
+
return v !== null && typeof v === 'object' && !Array.isArray(v) ? (v as Record<string, unknown>) : null;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/** Decode the DSSE payload of the first attestation; `null` when unreadable. */
|
|
48
|
+
function decode_payload(doc: unknown): Record<string, unknown> | null {
|
|
49
|
+
const list = asRecord(doc)?.['attestations'];
|
|
50
|
+
if (!Array.isArray(list) || list.length === 0) return null;
|
|
51
|
+
for (const entry of list) {
|
|
52
|
+
const payload = asRecord(asRecord(asRecord(entry)?.['bundle'])?.['dsseEnvelope'])?.['payload'];
|
|
53
|
+
if (typeof payload !== 'string' || payload === '') continue;
|
|
54
|
+
try {
|
|
55
|
+
const parsed: unknown = JSON.parse(Buffer.from(payload, 'base64').toString('utf8'));
|
|
56
|
+
const rec = asRecord(parsed);
|
|
57
|
+
if (rec !== null) return rec;
|
|
58
|
+
} catch {
|
|
59
|
+
// A payload that is not base64 JSON is not evidence of anything.
|
|
60
|
+
// Keep looking: npm may serve several attestations and only one of
|
|
61
|
+
// them has to be the provenance statement.
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function external_workflow(doc: unknown): Record<string, unknown> | null {
|
|
68
|
+
const payload = decode_payload(doc);
|
|
69
|
+
if (payload === null) return null;
|
|
70
|
+
const predicate = asRecord(payload['predicate']);
|
|
71
|
+
const external = asRecord(asRecord(predicate?.['buildDefinition'])?.['externalParameters']);
|
|
72
|
+
return asRecord(external?.['workflow']);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* The workflow path named by the attestation, or `null` when the document
|
|
77
|
+
* carries none that can be read.
|
|
78
|
+
*/
|
|
79
|
+
export function attestation_workflow_ref(doc: unknown): string | null {
|
|
80
|
+
const path_value = external_workflow(doc)?.['path'];
|
|
81
|
+
return typeof path_value === 'string' && path_value !== '' ? path_value : null;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/** The repository named by the attestation, or `null`. */
|
|
85
|
+
export function attestation_repository(doc: unknown): string | null {
|
|
86
|
+
const repo = external_workflow(doc)?.['repository'];
|
|
87
|
+
return typeof repo === 'string' && repo !== '' ? repo : null;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Does this attestation say the tarball was built by this package's publish
|
|
92
|
+
* workflow, in this package's repository?
|
|
93
|
+
*
|
|
94
|
+
* Both halves are required and both reject on absence: a document that names
|
|
95
|
+
* no workflow is not a document that names the right one. Repository is
|
|
96
|
+
* compared with the trailing `.git` and any trailing slash removed, because
|
|
97
|
+
* the same remote is written both ways and neither spelling is an attacker
|
|
98
|
+
* signal.
|
|
99
|
+
*/
|
|
100
|
+
export function provenance_matches_publish(doc: unknown): boolean {
|
|
101
|
+
return payload_names_publish(decode_payload(doc));
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/** The workflow and repository check, over one already-decoded payload. */
|
|
105
|
+
function payload_names_publish(payload: Record<string, unknown> | null): boolean {
|
|
106
|
+
const predicate = asRecord(payload?.['predicate']);
|
|
107
|
+
const workflow = asRecord(asRecord(asRecord(predicate?.['buildDefinition'])?.['externalParameters'])?.['workflow']);
|
|
108
|
+
if (workflow?.['path'] !== EXPECTED_WORKFLOW_REF) return false;
|
|
109
|
+
const repo = workflow['repository'];
|
|
110
|
+
if (typeof repo !== 'string' || repo === '') return false;
|
|
111
|
+
return repo.replace(/\.git$/, '').replace(/\/$/, '') === EXPECTED_REPOSITORY;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Does the certificate's SAN carry the workflow identity as a whole URI entry?
|
|
116
|
+
* Anchored: the entry is the expected workflow followed by `@<ref>`, never a
|
|
117
|
+
* SAN that merely contains the string.
|
|
118
|
+
*/
|
|
119
|
+
function san_names_workflow(san: string): boolean {
|
|
120
|
+
return san.split(/,\s*/).some((e) => e.startsWith(`URI:${SAN_WORKFLOW_MARKER}@`));
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// --- the signature half -------------------------------------------------------
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* What the clauses below do and do not establish.
|
|
127
|
+
*
|
|
128
|
+
* The header above says the signature half is not closed here. It is now
|
|
129
|
+
* HALF-closed, and the half that is missing is stated first so nothing below
|
|
130
|
+
* reads as more than it is.
|
|
131
|
+
*
|
|
132
|
+
* **Closed:** the DSSE envelope's signature is verified against the public key
|
|
133
|
+
* of the certificate the bundle itself carries, over the DSSE
|
|
134
|
+
* pre-authentication encoding — so a payload edited after signing is caught,
|
|
135
|
+
* and a bundle whose signature does not belong to its own certificate is
|
|
136
|
+
* caught. And the certificate's own SAN is required to name the expected
|
|
137
|
+
* workflow, so a bundle whose PAYLOAD claims `publish-npm.yml` while its
|
|
138
|
+
* certificate was issued to some other identity is caught. Before this, both
|
|
139
|
+
* were a base64 decode and a string compare.
|
|
140
|
+
*
|
|
141
|
+
* **Not closed, and this is the residue:** there is no trust root. Nothing
|
|
142
|
+
* here checks that the certificate was issued by Fulcio, and nothing checks a
|
|
143
|
+
* Rekor inclusion proof. An attacker who can serve a registry response can mint
|
|
144
|
+
* a self-signed certificate carrying the expected SAN, sign their own payload
|
|
145
|
+
* with it, and pass every check in this file. Closing that needs a sigstore
|
|
146
|
+
* verification path with pinned roots — a dependency decision, not a line in
|
|
147
|
+
* this function, and it is registered as the `dsse-trust-root` blocker on
|
|
148
|
+
* `road-to-an-update-that-installs-itself-only-when-it-is-safe`.
|
|
149
|
+
*
|
|
150
|
+
* So the honest statement of what the provenance gate is worth today: it
|
|
151
|
+
* defeats a partial compromise — a mis-scoped workflow, an edited payload, a
|
|
152
|
+
* bundle reused from another build — and it does not defeat a forged bundle
|
|
153
|
+
* from someone who already controls what the install reads.
|
|
154
|
+
*/
|
|
155
|
+
|
|
156
|
+
/** Why the signature does not verify, or `null` when it does. */
|
|
157
|
+
export type SignatureVerdict = string | null;
|
|
158
|
+
|
|
159
|
+
/** The SAN extension OID the Fulcio leaf carries the workflow identity in. */
|
|
160
|
+
const SAN_WORKFLOW_MARKER = `${EXPECTED_REPOSITORY}/${EXPECTED_WORKFLOW_REF}`;
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* The DSSE pre-authentication encoding — the exact bytes a DSSE signature is
|
|
164
|
+
* taken over.
|
|
165
|
+
*
|
|
166
|
+
* `DSSEv1 SP len(payloadType) SP payloadType SP len(payload) SP payload`, with
|
|
167
|
+
* both lengths in BYTES rather than characters. Built as a Buffer throughout
|
|
168
|
+
* because the payload is arbitrary bytes and a string round-trip would mangle
|
|
169
|
+
* any that are not valid UTF-8.
|
|
170
|
+
*/
|
|
171
|
+
export function dssePae(payloadType: string, payload: Buffer): Buffer {
|
|
172
|
+
const type = Buffer.from(payloadType, 'utf8');
|
|
173
|
+
return Buffer.concat([
|
|
174
|
+
Buffer.from(`DSSEv1 ${String(type.length)} `, 'utf8'),
|
|
175
|
+
type,
|
|
176
|
+
Buffer.from(` ${String(payload.length)} `, 'utf8'),
|
|
177
|
+
payload,
|
|
178
|
+
]);
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
interface Envelope {
|
|
182
|
+
readonly payloadType: string;
|
|
183
|
+
readonly payload: Buffer;
|
|
184
|
+
readonly sig: Buffer;
|
|
185
|
+
readonly certDer: Buffer;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
function readEnvelope(entry: unknown): Envelope | null {
|
|
189
|
+
const bundle = asRecord(asRecord(entry)?.['bundle']);
|
|
190
|
+
const dsse = asRecord(bundle?.['dsseEnvelope']);
|
|
191
|
+
if (dsse === null) return null;
|
|
192
|
+
const payloadB64 = dsse['payload'];
|
|
193
|
+
const payloadType = dsse['payloadType'];
|
|
194
|
+
const sigs = dsse['signatures'];
|
|
195
|
+
if (typeof payloadB64 !== 'string' || typeof payloadType !== 'string' || !Array.isArray(sigs) || sigs.length === 0) return null;
|
|
196
|
+
const sigB64 = asRecord(sigs[0])?.['sig'];
|
|
197
|
+
if (typeof sigB64 !== 'string' || sigB64 === '') return null;
|
|
198
|
+
|
|
199
|
+
const material = asRecord(bundle?.['verificationMaterial']);
|
|
200
|
+
// Both shapes sigstore has used: a single certificate, and a chain.
|
|
201
|
+
const single = asRecord(material?.['certificate'])?.['rawBytes'];
|
|
202
|
+
const chain = asRecord(material?.['x509CertificateChain'])?.['certificates'];
|
|
203
|
+
const first = Array.isArray(chain) ? asRecord(chain[0])?.['rawBytes'] : undefined;
|
|
204
|
+
const certB64 = typeof single === 'string' ? single : typeof first === 'string' ? first : null;
|
|
205
|
+
if (certB64 === null || certB64 === '') return null;
|
|
206
|
+
|
|
207
|
+
return {
|
|
208
|
+
payloadType,
|
|
209
|
+
payload: Buffer.from(payloadB64, 'base64'),
|
|
210
|
+
sig: Buffer.from(sigB64, 'base64'),
|
|
211
|
+
certDer: Buffer.from(certB64, 'base64'),
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
/**
|
|
216
|
+
* Verify the first readable attestation's DSSE signature against its own
|
|
217
|
+
* certificate, and require that certificate to name this package's workflow.
|
|
218
|
+
*
|
|
219
|
+
* Returns a reason on every failure rather than a boolean, because the caller
|
|
220
|
+
* prints it: a refusal a user cannot act on is a refusal they route around.
|
|
221
|
+
* `crypto` is imported lazily so a caller that never verifies a signature does
|
|
222
|
+
* not pay for the module — this runs on an install path, never in a hook.
|
|
223
|
+
*/
|
|
224
|
+
export async function verify_attestation_signature(doc: unknown): Promise<SignatureVerdict> {
|
|
225
|
+
const list = asRecord(doc)?.['attestations'];
|
|
226
|
+
if (!Array.isArray(list) || list.length === 0) return 'the attestation bundle carries no attestations';
|
|
227
|
+
const crypto = await import('node:crypto');
|
|
228
|
+
|
|
229
|
+
let lastReason = 'no attestation carried a readable DSSE envelope';
|
|
230
|
+
for (const entry of list) {
|
|
231
|
+
const env = readEnvelope(entry);
|
|
232
|
+
if (env === null) continue;
|
|
233
|
+
let cert: InstanceType<typeof crypto.X509Certificate>;
|
|
234
|
+
try {
|
|
235
|
+
cert = new crypto.X509Certificate(env.certDer);
|
|
236
|
+
} catch {
|
|
237
|
+
lastReason = 'the signing certificate could not be parsed';
|
|
238
|
+
continue;
|
|
239
|
+
}
|
|
240
|
+
// The certificate's own identity, not the payload's claim about it.
|
|
241
|
+
const san = cert.subjectAltName ?? '';
|
|
242
|
+
if (!san_names_workflow(san)) {
|
|
243
|
+
lastReason = `the signing certificate names ${san === '' ? 'no identity' : san}, not ${SAN_WORKFLOW_MARKER}`;
|
|
244
|
+
continue;
|
|
245
|
+
}
|
|
246
|
+
let ok = false;
|
|
247
|
+
try {
|
|
248
|
+
ok = crypto.verify(null, dssePae(env.payloadType, env.payload), cert.publicKey, env.sig);
|
|
249
|
+
} catch {
|
|
250
|
+
ok = false;
|
|
251
|
+
}
|
|
252
|
+
if (!ok) {
|
|
253
|
+
lastReason = 'the DSSE signature does not verify against the certificate in the bundle';
|
|
254
|
+
continue;
|
|
255
|
+
}
|
|
256
|
+
// The payload this signature covers must itself name the workflow:
|
|
257
|
+
// otherwise a valid signature on one entry vouches for a claim made in
|
|
258
|
+
// another, which is all the unsigned check reads.
|
|
259
|
+
let verified: Record<string, unknown> | null = null;
|
|
260
|
+
try {
|
|
261
|
+
verified = asRecord(JSON.parse(env.payload.toString('utf8')));
|
|
262
|
+
} catch {
|
|
263
|
+
verified = null;
|
|
264
|
+
}
|
|
265
|
+
if (!payload_names_publish(verified)) {
|
|
266
|
+
lastReason = 'the signed payload does not name this package\'s publish workflow';
|
|
267
|
+
continue;
|
|
268
|
+
}
|
|
269
|
+
return null;
|
|
270
|
+
}
|
|
271
|
+
return lastReason;
|
|
272
|
+
}
|
|
@@ -42,6 +42,8 @@ export interface QuotaParkedMarker {
|
|
|
42
42
|
/** Providers whose plan quota was exhausted, sorted and deduplicated. */
|
|
43
43
|
readonly providers: string[];
|
|
44
44
|
readonly parked_at: string;
|
|
45
|
+
/** Who established the exhaustion: the council's own seat gate, or the host's `StopFailure`. */
|
|
46
|
+
readonly source: 'council' | 'host';
|
|
45
47
|
}
|
|
46
48
|
|
|
47
49
|
/** Filesystem-safe path for a run's marker. Mirrors `billing_grant.grantFile`. */
|
|
@@ -65,6 +67,7 @@ export function writeQuotaParked(
|
|
|
65
67
|
runId: string,
|
|
66
68
|
providers: readonly string[],
|
|
67
69
|
now: () => Date = () => new Date(),
|
|
70
|
+
source: 'council' | 'host' = 'council',
|
|
68
71
|
): QuotaParkedMarker {
|
|
69
72
|
const file = markerFile(repoRoot, runId);
|
|
70
73
|
const existing = readMarker(file);
|
|
@@ -73,6 +76,7 @@ export function writeQuotaParked(
|
|
|
73
76
|
run_id: runId,
|
|
74
77
|
providers: merged,
|
|
75
78
|
parked_at: existing?.parked_at ?? now().toISOString(),
|
|
79
|
+
source: existing?.source ?? source,
|
|
76
80
|
};
|
|
77
81
|
fs.mkdirSync(path.dirname(file), { recursive: true });
|
|
78
82
|
fs.writeFileSync(file, `${JSON.stringify(marker, null, 2)}\n`, 'utf8');
|
|
@@ -118,6 +122,27 @@ export function findQuotaParked(repoRoot: string, sessionId: string): QuotaParke
|
|
|
118
122
|
return null;
|
|
119
123
|
}
|
|
120
124
|
|
|
125
|
+
/** The plan's rolling rate window; a host marker older than this no longer describes it. */
|
|
126
|
+
export const HOST_RATE_WINDOW_MS = 5 * 3_600_000;
|
|
127
|
+
|
|
128
|
+
/** True when a host-sourced marker was parked inside the rate window ending at `nowMs`. */
|
|
129
|
+
export function recentHostMarker(repoRoot: string, nowMs: number = Date.now(), windowMs: number = HOST_RATE_WINDOW_MS): boolean {
|
|
130
|
+
let names: string[];
|
|
131
|
+
try {
|
|
132
|
+
names = fs.readdirSync(path.join(repoRoot, QUOTA_PARKED_DIR_REL));
|
|
133
|
+
} catch {
|
|
134
|
+
return false;
|
|
135
|
+
}
|
|
136
|
+
for (const name of names) {
|
|
137
|
+
if (!name.endsWith('.json')) continue;
|
|
138
|
+
const m = readMarker(path.join(repoRoot, QUOTA_PARKED_DIR_REL, name));
|
|
139
|
+
if (m === null || m.source !== 'host') continue;
|
|
140
|
+
const at = Date.parse(m.parked_at);
|
|
141
|
+
if (Number.isFinite(at) && nowMs - at >= 0 && nowMs - at < windowMs) return true;
|
|
142
|
+
}
|
|
143
|
+
return false;
|
|
144
|
+
}
|
|
145
|
+
|
|
121
146
|
function readMarker(file: string): QuotaParkedMarker | null {
|
|
122
147
|
try {
|
|
123
148
|
const raw: unknown = JSON.parse(fs.readFileSync(file, 'utf8'));
|
|
@@ -126,7 +151,8 @@ function readMarker(file: string): QuotaParkedMarker | null {
|
|
|
126
151
|
if (typeof o['run_id'] !== 'string' || typeof o['parked_at'] !== 'string') return null;
|
|
127
152
|
if (!Array.isArray(o['providers'])) return null;
|
|
128
153
|
const providers = o['providers'].filter((p): p is string => typeof p === 'string');
|
|
129
|
-
|
|
154
|
+
const source = o['source'] === 'host' ? 'host' : 'council';
|
|
155
|
+
return { run_id: o['run_id'], providers, parked_at: o['parked_at'], source };
|
|
130
156
|
} catch {
|
|
131
157
|
return null;
|
|
132
158
|
}
|
|
@@ -84,6 +84,18 @@ export interface RatificationArtifact {
|
|
|
84
84
|
verdict: RatificationVerdict;
|
|
85
85
|
/** `merge`, or an ISO-8601 instant. Never a bare "later". */
|
|
86
86
|
effective_after: string;
|
|
87
|
+
/**
|
|
88
|
+
* The digest of the gated content this record reviewed, or `null` on a
|
|
89
|
+
* record that carries none.
|
|
90
|
+
*
|
|
91
|
+
* Not in {@link RATIFICATION_FIELDS}: those six are required of every
|
|
92
|
+
* record, and the 23 records on the trunk predate this field. What makes
|
|
93
|
+
* it required in practice is the CALLER — `check_kernel_edit_ratified`
|
|
94
|
+
* passes an expected digest on every run, and a record with no `subject`
|
|
95
|
+
* then fails `subject-absent`. A record is only ever read as part of the
|
|
96
|
+
* diff it ships in, so nothing on the trunk is re-judged.
|
|
97
|
+
*/
|
|
98
|
+
subject: string | null;
|
|
87
99
|
}
|
|
88
100
|
|
|
89
101
|
export interface RatificationProblem {
|
|
@@ -103,7 +115,10 @@ export interface RatificationProblem {
|
|
|
103
115
|
| 'unknown-seat-verdict'
|
|
104
116
|
| 'seat-dissent'
|
|
105
117
|
| 'providers-exceed-seats'
|
|
106
|
-
| 'header-not-derived'
|
|
118
|
+
| 'header-not-derived'
|
|
119
|
+
| 'subject-absent'
|
|
120
|
+
| 'subject-malformed'
|
|
121
|
+
| 'subject-mismatch';
|
|
107
122
|
message: string;
|
|
108
123
|
}
|
|
109
124
|
|
|
@@ -322,6 +337,16 @@ export interface RatificationReading {
|
|
|
322
337
|
problems: RatificationProblem[];
|
|
323
338
|
}
|
|
324
339
|
|
|
340
|
+
/**
|
|
341
|
+
* A `subject` digest: the lower-case hex sha-256 `subjectDigest` produces.
|
|
342
|
+
*
|
|
343
|
+
* Shape is checked apart from equality on purpose. A typo'd digest and a
|
|
344
|
+
* digest that moved because a gated file was edited after the review are
|
|
345
|
+
* different failures, and a reader that reported both as "mismatch" would
|
|
346
|
+
* send an author looking for an edit that never happened.
|
|
347
|
+
*/
|
|
348
|
+
export const SUBJECT_RE = /^[0-9a-f]{64}$/u;
|
|
349
|
+
|
|
325
350
|
/** `merge`, or an ISO-8601 instant with a timezone. */
|
|
326
351
|
const EFFECTIVE_AFTER_RE =
|
|
327
352
|
/^(merge|\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2}))$/;
|
|
@@ -364,10 +389,18 @@ export function readProviders(fm: AdrFrontmatter): string[] {
|
|
|
364
389
|
* Pass `null` when it could not be established — the diversity rule then does
|
|
365
390
|
* not fire, and the caller says so, because an unmeasured count is not
|
|
366
391
|
* evidence that diversity was unavailable.
|
|
392
|
+
*
|
|
393
|
+
* `expectedSubject` is the digest of the gated content the record is being
|
|
394
|
+
* read against, recomputed from the tree by the caller. Pass `null` to read a
|
|
395
|
+
* record's shape without binding it to any content — which is what a reader
|
|
396
|
+
* that is not judging a diff does. Pass a digest and the record must carry
|
|
397
|
+
* `subject`, and carry that one: a record whose `subject` is absent or
|
|
398
|
+
* different did not review this content, whatever its verdict says.
|
|
367
399
|
*/
|
|
368
400
|
export function readRatification(
|
|
369
401
|
text: string,
|
|
370
402
|
configuredProviders: number | null,
|
|
403
|
+
expectedSubject: string | null = null,
|
|
371
404
|
): RatificationReading {
|
|
372
405
|
const problems: RatificationProblem[] = [];
|
|
373
406
|
const fm = readAdrFrontmatter(text);
|
|
@@ -427,6 +460,35 @@ export function readRatification(
|
|
|
427
460
|
|
|
428
461
|
problems.push(...seatProblems(readSeats(fm, text), providers, verdict));
|
|
429
462
|
|
|
463
|
+
// The content binding. Shape first, then equality, so a malformed digest is
|
|
464
|
+
// never reported as content that moved.
|
|
465
|
+
const subject = scalarOf(fm, 'subject');
|
|
466
|
+
if (subject !== null && !SUBJECT_RE.test(subject)) {
|
|
467
|
+
problems.push({
|
|
468
|
+
code: 'subject-malformed',
|
|
469
|
+
message:
|
|
470
|
+
`subject \`${subject}\` is not a sha-256 hex digest (${String(SUBJECT_RE)}) — ` +
|
|
471
|
+
'print it with `ratification_subject`',
|
|
472
|
+
});
|
|
473
|
+
} else if (expectedSubject !== null) {
|
|
474
|
+
if (subject === null) {
|
|
475
|
+
problems.push({
|
|
476
|
+
code: 'subject-absent',
|
|
477
|
+
message:
|
|
478
|
+
'missing `subject:` — a record names who reviewed; without a digest it does not ' +
|
|
479
|
+
`name WHAT, so the gated content may have changed since. Expected \`${expectedSubject}\``,
|
|
480
|
+
});
|
|
481
|
+
} else if (subject !== expectedSubject) {
|
|
482
|
+
problems.push({
|
|
483
|
+
code: 'subject-mismatch',
|
|
484
|
+
message:
|
|
485
|
+
`subject \`${subject}\` is not the digest of this diff's gated content ` +
|
|
486
|
+
`(\`${expectedSubject}\`) — the record reviewed different content, so it does not ` +
|
|
487
|
+
'answer for this change',
|
|
488
|
+
});
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
|
|
430
492
|
// Diversity, against the REQUIRED count.
|
|
431
493
|
//
|
|
432
494
|
// Round 1 refused the previous shape: the count came from the user-global
|
|
@@ -465,6 +527,7 @@ export function readRatification(
|
|
|
465
527
|
providers,
|
|
466
528
|
verdict: verdict as RatificationVerdict,
|
|
467
529
|
effective_after: effective as string,
|
|
530
|
+
subject,
|
|
468
531
|
},
|
|
469
532
|
problems: [],
|
|
470
533
|
};
|