@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
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Daily update-check banner for the `agent-config` dispatcher.
|
|
3
3
|
*
|
|
4
|
-
* Ported from
|
|
4
|
+
* Ported from its retired Python twin (ADR-200,
|
|
5
5
|
* Phase 2 / Wave 1 batch B). Pure functions: `check_for_update()`
|
|
6
6
|
* decides whether a banner should be emitted and returns the banner
|
|
7
7
|
* string (or `null`). The dispatcher prints the returned string to
|
|
@@ -31,6 +31,7 @@ import * as path from 'node:path';
|
|
|
31
31
|
|
|
32
32
|
import type { EnvMap } from './user_global_paths';
|
|
33
33
|
import * as user_global_paths from './user_global_paths';
|
|
34
|
+
import { compare_versions } from './version_order';
|
|
34
35
|
|
|
35
36
|
export const PACKAGE_NAME = '@event4u/agent-config';
|
|
36
37
|
export const NPM_REGISTRY_URL = `https://registry.npmjs.org/${PACKAGE_NAME}/latest`;
|
|
@@ -79,6 +80,32 @@ export async function fetch_latest_from_npm(
|
|
|
79
80
|
fetch_impl?: typeof fetch;
|
|
80
81
|
} = {},
|
|
81
82
|
): Promise<string | null> {
|
|
83
|
+
return (await fetch_latest_document(options))?.version ?? null;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/** The version, and the impact block worth caching beside it. */
|
|
87
|
+
export interface LatestDocument {
|
|
88
|
+
readonly version: string;
|
|
89
|
+
/** The registry's `agentConfig.impact` block, UNVALIDATED — see {@link _cacheable_impact}. */
|
|
90
|
+
readonly impact: unknown;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* The registry's `latest` document, reduced to what a cached decision needs.
|
|
95
|
+
*
|
|
96
|
+
* One fetch, two consumers: the banner wants the version, and the
|
|
97
|
+
* `update-notice` session concern wants to know whether a security fix lies in
|
|
98
|
+
* range — a question the version alone cannot answer and that a hook has no
|
|
99
|
+
* business opening a socket for. Adding a second network call for the second
|
|
100
|
+
* reader would make a once-a-day probe a twice-a-day one.
|
|
101
|
+
*/
|
|
102
|
+
export async function fetch_latest_document(
|
|
103
|
+
options: {
|
|
104
|
+
timeout?: number;
|
|
105
|
+
url?: string;
|
|
106
|
+
fetch_impl?: typeof fetch;
|
|
107
|
+
} = {},
|
|
108
|
+
): Promise<LatestDocument | null> {
|
|
82
109
|
const timeout = options.timeout ?? FETCH_TIMEOUT_S;
|
|
83
110
|
const url = options.url ?? NPM_REGISTRY_URL;
|
|
84
111
|
const fetch_impl = options.fetch_impl ?? fetch;
|
|
@@ -92,9 +119,12 @@ export async function fetch_latest_from_npm(
|
|
|
92
119
|
});
|
|
93
120
|
const payload: unknown = await resp.json();
|
|
94
121
|
if (payload !== null && typeof payload === 'object' && !Array.isArray(payload)) {
|
|
95
|
-
const
|
|
122
|
+
const doc = payload as Record<string, unknown>;
|
|
123
|
+
const version = doc['version'];
|
|
96
124
|
if (typeof version === 'string' && version.trim()) {
|
|
97
|
-
|
|
125
|
+
const cfg = doc['agentConfig'];
|
|
126
|
+
const impact = cfg !== null && typeof cfg === 'object' && !Array.isArray(cfg) ? (cfg as Record<string, unknown>)['impact'] : null;
|
|
127
|
+
return { version: version.trim(), impact: impact ?? null };
|
|
98
128
|
}
|
|
99
129
|
}
|
|
100
130
|
} catch {
|
|
@@ -103,6 +133,30 @@ export async function fetch_latest_from_npm(
|
|
|
103
133
|
return null;
|
|
104
134
|
}
|
|
105
135
|
|
|
136
|
+
/**
|
|
137
|
+
* The impact block reduced to what may be written into the state file.
|
|
138
|
+
*
|
|
139
|
+
* The cache is the SANITISING BOUNDARY, deliberately: everything downstream
|
|
140
|
+
* reads this file rather than the registry, so a hostile description, version
|
|
141
|
+
* label or nested object is dropped here once instead of being re-checked by
|
|
142
|
+
* every reader. Keys must parse as versions and values must carry an impact
|
|
143
|
+
* from the published enum; a `security` flag survives only as a boolean.
|
|
144
|
+
* Anything else is simply absent, which every reader already handles as an
|
|
145
|
+
* unknown — and an unknown never resolves to `auto`.
|
|
146
|
+
*/
|
|
147
|
+
export function _cacheable_impact(impact: unknown): Record<string, { impact: string; security: boolean }> | null {
|
|
148
|
+
if (impact === null || typeof impact !== 'object' || Array.isArray(impact)) return null;
|
|
149
|
+
const out: Record<string, { impact: string; security: boolean }> = {};
|
|
150
|
+
for (const [version, entry] of Object.entries(impact as Record<string, unknown>)) {
|
|
151
|
+
if (!/^\d+\.\d+\.\d+(?:[-+][0-9A-Za-z.-]+)?$/.test(version)) continue;
|
|
152
|
+
if (entry === null || typeof entry !== 'object' || Array.isArray(entry)) continue;
|
|
153
|
+
const value = (entry as Record<string, unknown>)['impact'];
|
|
154
|
+
if (!['none', 'automatic', 'notice', 'action'].includes(String(value))) continue;
|
|
155
|
+
out[version] = { impact: String(value), security: (entry as Record<string, unknown>)['security'] === true };
|
|
156
|
+
}
|
|
157
|
+
return Object.keys(out).length > 0 ? out : null;
|
|
158
|
+
}
|
|
159
|
+
|
|
106
160
|
function _read_state(state_path: string): Record<string, unknown> {
|
|
107
161
|
try {
|
|
108
162
|
const raw = fs.readFileSync(state_path, 'utf-8');
|
|
@@ -161,11 +215,58 @@ function _should_check(state: Record<string, unknown>, now: Date): boolean {
|
|
|
161
215
|
return now.getTime() - last_ms >= CHECK_WINDOW_MS;
|
|
162
216
|
}
|
|
163
217
|
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
218
|
+
/**
|
|
219
|
+
* The install shape that is running. It decides which command the banner may
|
|
220
|
+
* name: `upgrade` replaces the global binary, `update` flips a project's
|
|
221
|
+
* `agent_config_version` pin, and an ephemeral `npx` run has nothing to update.
|
|
222
|
+
*/
|
|
223
|
+
export type InstallOrigin = 'global' | 'project-pin' | 'ephemeral' | 'unknown';
|
|
224
|
+
|
|
225
|
+
const GLOBAL_TREE = /[\\/](?:lib|npm)[\\/]node_modules[\\/]@event4u[\\/]agent-config[\\/]?$/;
|
|
226
|
+
|
|
227
|
+
/**
|
|
228
|
+
* Classify the running install from signals the caller gathers.
|
|
229
|
+
*
|
|
230
|
+
* Order matters: a pinned project also runs from the npx cache, so the pin is
|
|
231
|
+
* read before the `_npx` segment. `latest` is the registry version the banner
|
|
232
|
+
* announces; the pin is compared against it, never the running executable. An origin nobody enumerated is `unknown` and
|
|
233
|
+
* gets no command, because a guessed command is the defect this replaces.
|
|
234
|
+
*/
|
|
235
|
+
export function classify_install_origin(signals: {
|
|
236
|
+
package_root: string;
|
|
237
|
+
project_pin: string | null;
|
|
238
|
+
latest: string | null;
|
|
239
|
+
is_global_consumer: boolean;
|
|
240
|
+
}): InstallOrigin {
|
|
241
|
+
const pin = signals.project_pin?.trim() ?? '';
|
|
242
|
+
if (pin !== '') {
|
|
243
|
+
// `update` moves the pin, not the running executable: a pin already at
|
|
244
|
+
// or past latest has nothing to move, and no other command is known
|
|
245
|
+
// to be right for a pinned project.
|
|
246
|
+
return signals.latest && _is_newer(signals.latest, pin) ? 'project-pin' : 'unknown';
|
|
247
|
+
}
|
|
248
|
+
if (signals.package_root.split(/[\\/]+/).includes('_npx')) {
|
|
249
|
+
return 'ephemeral';
|
|
250
|
+
}
|
|
251
|
+
if (signals.is_global_consumer || GLOBAL_TREE.test(signals.package_root)) {
|
|
252
|
+
return 'global';
|
|
253
|
+
}
|
|
254
|
+
return 'unknown';
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
export function _format_banner(
|
|
258
|
+
latest: string,
|
|
259
|
+
installed: string,
|
|
260
|
+
origin: InstallOrigin = 'unknown',
|
|
261
|
+
): string {
|
|
262
|
+
const head = `ℹ️ agent-config ${latest} available (you have ${installed}).`;
|
|
263
|
+
if (origin === 'global') {
|
|
264
|
+
return `${head}\n Update: agent-config upgrade`;
|
|
265
|
+
}
|
|
266
|
+
if (origin === 'project-pin') {
|
|
267
|
+
return `${head}\n Update: agent-config update`;
|
|
268
|
+
}
|
|
269
|
+
return head;
|
|
169
270
|
}
|
|
170
271
|
|
|
171
272
|
/** Strict integer parse mirroring Python's `int(p)` (else 0). */
|
|
@@ -212,6 +313,23 @@ export function _is_newer(latest: string, installed: string): boolean {
|
|
|
212
313
|
return false;
|
|
213
314
|
}
|
|
214
315
|
|
|
316
|
+
/**
|
|
317
|
+
* The comparator for policy decisions: full SemVer precedence, so a final
|
|
318
|
+
* release is newer than its own prerelease, and unparseable input on either
|
|
319
|
+
* side is never newer. `_is_newer` above keeps its truncating behaviour and
|
|
320
|
+
* still feeds the banner; it is the regression witness that the two differ.
|
|
321
|
+
*/
|
|
322
|
+
export function is_newer_version(latest: string, installed: string): boolean {
|
|
323
|
+
return compare_versions(latest, installed) === 1;
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
function _resolve_origin(
|
|
327
|
+
origin: InstallOrigin | ((latest: string) => InstallOrigin) | undefined,
|
|
328
|
+
latest: string,
|
|
329
|
+
): InstallOrigin | undefined {
|
|
330
|
+
return typeof origin === 'function' ? origin(latest) : origin;
|
|
331
|
+
}
|
|
332
|
+
|
|
215
333
|
/** Format a Date as `%Y-%m-%dT%H:%M:%SZ` (UTC, no milliseconds). */
|
|
216
334
|
function _format_utc(d: Date): string {
|
|
217
335
|
return d.toISOString().replace(/\.\d{3}Z$/, 'Z');
|
|
@@ -233,6 +351,7 @@ export async function check_for_update(
|
|
|
233
351
|
is_tty?: boolean | null;
|
|
234
352
|
settings_enabled?: boolean;
|
|
235
353
|
fetcher?: Fetcher;
|
|
354
|
+
origin?: InstallOrigin | ((latest: string) => InstallOrigin);
|
|
236
355
|
} = {},
|
|
237
356
|
): Promise<string | null> {
|
|
238
357
|
const env = options.env ?? process.env;
|
|
@@ -264,13 +383,22 @@ export async function check_for_update(
|
|
|
264
383
|
if (!_should_check(state, now)) {
|
|
265
384
|
const latest = state.last_seen_version;
|
|
266
385
|
if (typeof latest === 'string' && _is_newer(latest, installed_version)) {
|
|
267
|
-
return _format_banner(latest, installed_version);
|
|
386
|
+
return _format_banner(latest, installed_version, _resolve_origin(options.origin, latest));
|
|
268
387
|
}
|
|
269
388
|
return null;
|
|
270
389
|
}
|
|
271
390
|
|
|
272
|
-
|
|
273
|
-
|
|
391
|
+
// An injected fetcher yields a version only, so no impact is cached on that
|
|
392
|
+
// path — a caller that pins the network pins what reaches the state file too.
|
|
393
|
+
let impact: unknown = null;
|
|
394
|
+
let latest: string | null;
|
|
395
|
+
if (options.fetcher === undefined) {
|
|
396
|
+
const doc = await fetch_latest_document();
|
|
397
|
+
latest = doc?.version ?? null;
|
|
398
|
+
impact = doc?.impact ?? null;
|
|
399
|
+
} else {
|
|
400
|
+
latest = await options.fetcher();
|
|
401
|
+
}
|
|
274
402
|
const fallback_seen = Object.prototype.hasOwnProperty.call(state, 'last_seen_version')
|
|
275
403
|
? state.last_seen_version
|
|
276
404
|
: '';
|
|
@@ -280,6 +408,9 @@ export async function check_for_update(
|
|
|
280
408
|
last_seen_version: latest ? latest : fallback_seen,
|
|
281
409
|
installed_version,
|
|
282
410
|
};
|
|
411
|
+
const cacheable = _cacheable_impact(impact);
|
|
412
|
+
if (cacheable !== null) payload['last_seen_impact'] = cacheable;
|
|
413
|
+
else if (state['last_seen_impact'] !== undefined && !latest) payload['last_seen_impact'] = state['last_seen_impact'];
|
|
283
414
|
try {
|
|
284
415
|
_write_state(write_path, payload);
|
|
285
416
|
} catch (err) {
|
|
@@ -293,5 +424,5 @@ export async function check_for_update(
|
|
|
293
424
|
if (!latest || !_is_newer(latest, installed_version)) {
|
|
294
425
|
return null;
|
|
295
426
|
}
|
|
296
|
-
return _format_banner(latest, installed_version);
|
|
427
|
+
return _format_banner(latest, installed_version, _resolve_origin(options.origin, latest));
|
|
297
428
|
}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Whether an install that already exists may be ASKED, once, to let updates
|
|
3
|
+
* install themselves — and the question it would be asked.
|
|
4
|
+
*
|
|
5
|
+
* ADR-291 settled the policy: `auto` may default for a NEW install; an
|
|
6
|
+
* existing one is asked once, after the ring-0 exit and the live-session
|
|
7
|
+
* register, with a binding "never", and a dismissal keeps `notify`. This
|
|
8
|
+
* module is that policy as a function, so the thing a reviewer checks is a
|
|
9
|
+
* table of conditions rather than a hook's control flow.
|
|
10
|
+
*
|
|
11
|
+
* **Narrower than ADR-291 reads, on purpose.** A council round of 2026-10-20
|
|
12
|
+
* refused the ring-0 record as the gate — a rollout switch opens the question
|
|
13
|
+
* for every install at once, which is not consent — and asked for a user-owned
|
|
14
|
+
* opt-in. The opt-in is `update.mode: ask`, a class-C value only a human can
|
|
15
|
+
* set, and ring-0 stays as an additional kill switch. An install that never
|
|
16
|
+
* chose `ask` is therefore never asked, which is ADR-291's dismissal outcome
|
|
17
|
+
* (`notify`) reached without the question. Whether that is the reading the
|
|
18
|
+
* next round accepts is for that round; this module only stops the rollout
|
|
19
|
+
* switch from standing in for consent.
|
|
20
|
+
*
|
|
21
|
+
* **Every condition is a reason to stay silent.** The function returns the
|
|
22
|
+
* question only when all of them clear, and returns WHY otherwise, because a
|
|
23
|
+
* prompt that appears in CI, in a pipe, in a headless run, under `--json` or
|
|
24
|
+
* inside a subagent is not a question — it is output nobody can answer, in a
|
|
25
|
+
* place that may be parsed.
|
|
26
|
+
*
|
|
27
|
+
* **It never writes the setting.** `update.mode` is class C: only a human's
|
|
28
|
+
* hand-edit or the GUI's write route may set it. The invitation says how, and
|
|
29
|
+
* stopping it is the same setting: `ask` is the opt-in, so any other value
|
|
30
|
+
* ends every future invitation. One mechanism, rather than a second "never"
|
|
31
|
+
* record that could disagree with the setting.
|
|
32
|
+
*
|
|
33
|
+
* **It is one-way text on every host.** The concern collects no answer; the
|
|
34
|
+
* user acts by editing the setting. A host with a native ask shape may relay
|
|
35
|
+
* the text through it, which changes how it is shown, not what it can decide.
|
|
36
|
+
*/
|
|
37
|
+
import type { UpdateMode } from './classify_update.js';
|
|
38
|
+
|
|
39
|
+
/** The exact line `ring-0-unattended-record-*.md` carries, and the only one read. */
|
|
40
|
+
export const RING_ZERO_EXIT_LINE = /^ring-0-exit:\s*(yes|no)\s*$/m;
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Whether the ring-0 record says the exit happened.
|
|
44
|
+
*
|
|
45
|
+
* Absent file, absent line, or anything but a literal `yes` is `false`. The
|
|
46
|
+
* line is written by a human after reading the table; nothing recomputes it
|
|
47
|
+
* from the rows, because a count an agent could compute is a count an agent
|
|
48
|
+
* could be wrong about, and this one authorises a prompt on an install the
|
|
49
|
+
* user already has.
|
|
50
|
+
*/
|
|
51
|
+
export function ringZeroExited(recordText: string | null): boolean {
|
|
52
|
+
if (recordText === null) return false;
|
|
53
|
+
const m = RING_ZERO_EXIT_LINE.exec(recordText);
|
|
54
|
+
return m !== null && m[1] === 'yes';
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export interface InviteEnv {
|
|
58
|
+
readonly ci: boolean;
|
|
59
|
+
/** `AGENT_CONFIG_NO_UPDATE_CHECK=1`, the kill switch both update concerns honour. */
|
|
60
|
+
readonly noUpdateCheck: boolean;
|
|
61
|
+
/** stdout AND stderr are a terminal a human is looking at. */
|
|
62
|
+
readonly interactive: boolean;
|
|
63
|
+
readonly headless: boolean;
|
|
64
|
+
/** The run was asked for machine-readable output. */
|
|
65
|
+
readonly jsonOutput: boolean;
|
|
66
|
+
readonly subagent: boolean;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export interface InviteInput {
|
|
70
|
+
readonly mode: UpdateMode | undefined;
|
|
71
|
+
/** The ring-0 record's exit line. */
|
|
72
|
+
readonly ringZeroExited: boolean;
|
|
73
|
+
/** True once a global live-session register exists — step 1.4. */
|
|
74
|
+
readonly registerAvailable: boolean;
|
|
75
|
+
/** The invitation was already shown once. It is a once, not a cadence. */
|
|
76
|
+
readonly alreadyInvited: boolean;
|
|
77
|
+
/** The turn that just ended finished on a verified success. */
|
|
78
|
+
readonly turnEndedOnVerifiedSuccess: boolean;
|
|
79
|
+
readonly env: InviteEnv;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
export type InviteDecision = { readonly ask: true; readonly lines: readonly string[] } | { readonly ask: false; readonly reason: string };
|
|
83
|
+
|
|
84
|
+
/** The question, once, or the reason there is none. */
|
|
85
|
+
export function autoInviteDecision(input: InviteInput): InviteDecision {
|
|
86
|
+
if (input.env.ci) return { ask: false, reason: 'CI' };
|
|
87
|
+
if (input.env.noUpdateCheck) return { ask: false, reason: 'AGENT_CONFIG_NO_UPDATE_CHECK=1' };
|
|
88
|
+
if (input.env.jsonOutput) return { ask: false, reason: '--json output' };
|
|
89
|
+
if (input.env.subagent) return { ask: false, reason: 'subagent run' };
|
|
90
|
+
if (input.env.headless) return { ask: false, reason: 'headless' };
|
|
91
|
+
if (!input.env.interactive) return { ask: false, reason: 'non-TTY' };
|
|
92
|
+
// A user-owned opt-in before the rollout switch: the council round of
|
|
93
|
+
// 2026-10-20 refused a ring-0 record as consent, because once it flips it
|
|
94
|
+
// opens the question for every install at once. `ask` is the only value
|
|
95
|
+
// that says "ask me", and only a human can write it.
|
|
96
|
+
if (input.mode !== 'ask') return { ask: false, reason: 'no user opt-in: update.mode is not ask' };
|
|
97
|
+
if (!input.ringZeroExited) return { ask: false, reason: 'ring-0 has not exited' };
|
|
98
|
+
if (!input.registerAvailable) return { ask: false, reason: 'no machine-wide session register' };
|
|
99
|
+
if (input.alreadyInvited) return { ask: false, reason: 'already invited once' };
|
|
100
|
+
if (!input.turnEndedOnVerifiedSuccess) return { ask: false, reason: 'the turn did not end on a verified success' };
|
|
101
|
+
return {
|
|
102
|
+
ask: true,
|
|
103
|
+
lines: [
|
|
104
|
+
'agent-config can install its own updates at a session start, once every gate passes',
|
|
105
|
+
'and no other session is open on this machine. It is off on your install, and it stays',
|
|
106
|
+
'off unless you say otherwise — nothing here changes it for you.',
|
|
107
|
+
'',
|
|
108
|
+
' 1. Turn it on — set `update: { mode: auto }` in your user-global settings,',
|
|
109
|
+
' by hand or in `agent-config setup`.',
|
|
110
|
+
' 2. Leave it as it is — you keep being told, and nothing installs itself.',
|
|
111
|
+
' 3. Stop these invitations — set `update.mode` back to `notify`; update notices continue.',
|
|
112
|
+
'',
|
|
113
|
+
'Recommendation: 2, unless this machine is one you maintain rather than one you work on.',
|
|
114
|
+
],
|
|
115
|
+
};
|
|
116
|
+
}
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What a session start should say about an available update, and whether it may
|
|
3
|
+
* activate one — pure, so the hook around it is a thin wiring layer.
|
|
4
|
+
*
|
|
5
|
+
* Three properties this module exists to hold, in the order they matter:
|
|
6
|
+
*
|
|
7
|
+
* **No fetched text ever reaches the reader.** Everything in the notice is
|
|
8
|
+
* either a number this module parsed as a semver, a sentence written here, or a
|
|
9
|
+
* line read from the CHANGELOG of the package that is ALREADY INSTALLED. The
|
|
10
|
+
* impact map arrives from the registry and is therefore attacker-influenceable;
|
|
11
|
+
* {@link sanitiseImpactMap} reduces it to a closed enum and a boolean before
|
|
12
|
+
* anything else looks at it, so a hostile changelog, description or version
|
|
13
|
+
* label has nothing to travel on. That is roadmap decision D3, implemented as a
|
|
14
|
+
* shape rather than as a scrubbing pass that could miss a case.
|
|
15
|
+
*
|
|
16
|
+
* **Nothing is activated at all, and that is narrower than it started.** A
|
|
17
|
+
* candidate is STAGED and reported; the install stays with
|
|
18
|
+
* `upgrade --unattended`, which a human or a scheduler runs. The concern used
|
|
19
|
+
* to be able to spawn that run itself, and an independent review of 2026-10-20
|
|
20
|
+
* refused the manifest for it: `effect: notification` means "tells the human
|
|
21
|
+
* something and changes nothing else", and a hook that can replace the global
|
|
22
|
+
* install is not that, whatever its `severity` says. The capability was
|
|
23
|
+
* removed rather than the label widened.
|
|
24
|
+
*
|
|
25
|
+
* **A security release is loud in every mode but `off`.** It is the one notice
|
|
26
|
+
* that does not wait for a mode to invite it, because `SECURITY.md:21` backports
|
|
27
|
+
* nothing: an install that is not current is an install that is unpatched.
|
|
28
|
+
*/
|
|
29
|
+
import { CONSUMER_IMPACT_VALUES, type ConsumerImpact } from './consumer_impact.js';
|
|
30
|
+
import type { InstallOrigin, UpdateMode } from './classify_update.js';
|
|
31
|
+
import { compare_versions, parse_version } from './version_order.js';
|
|
32
|
+
|
|
33
|
+
/** The `SECURITY.md` line the security notice names, so the reader can check it. */
|
|
34
|
+
export const SECURITY_POLICY_REF = 'SECURITY.md:21 — fixes land on the latest version only; older releases are not backported';
|
|
35
|
+
|
|
36
|
+
/** The curated-head labels, most consequential first — the order the one line is picked in. */
|
|
37
|
+
export const HEAD_PRIORITY: readonly string[] = [
|
|
38
|
+
'Security and correctness',
|
|
39
|
+
'Default changes + migration',
|
|
40
|
+
'Known limitations',
|
|
41
|
+
'Behaviour changes',
|
|
42
|
+
'Honest nulls',
|
|
43
|
+
];
|
|
44
|
+
|
|
45
|
+
/** One release's entry in the published impact map, after validation. */
|
|
46
|
+
export interface ImpactEntry {
|
|
47
|
+
readonly impact: ConsumerImpact;
|
|
48
|
+
readonly security: boolean;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* The registry's `agentConfig.impact` block reduced to versions this module
|
|
53
|
+
* parsed and values from a closed enum.
|
|
54
|
+
*
|
|
55
|
+
* Anything else is dropped rather than reported: a map that does not validate
|
|
56
|
+
* is an unknown, and an unknown is already handled by never resolving to
|
|
57
|
+
* `auto`. Returning the forged text so the notice could explain itself would
|
|
58
|
+
* put attacker-chosen bytes in front of the reader, which is the one thing this
|
|
59
|
+
* surface may not do.
|
|
60
|
+
*/
|
|
61
|
+
export function sanitiseImpactMap(map: unknown): ReadonlyMap<string, ImpactEntry> {
|
|
62
|
+
const clean = new Map<string, ImpactEntry>();
|
|
63
|
+
if (map === null || typeof map !== 'object' || Array.isArray(map)) return clean;
|
|
64
|
+
for (const [version, entry] of Object.entries(map as Record<string, unknown>)) {
|
|
65
|
+
if (parse_version(version) === null) continue;
|
|
66
|
+
if (entry === null || typeof entry !== 'object' || Array.isArray(entry)) continue;
|
|
67
|
+
const impact = (entry as Record<string, unknown>)['impact'];
|
|
68
|
+
if (!(CONSUMER_IMPACT_VALUES as readonly unknown[]).includes(impact)) continue;
|
|
69
|
+
clean.set(version, { impact: impact as ConsumerImpact, security: (entry as Record<string, unknown>)['security'] === true });
|
|
70
|
+
}
|
|
71
|
+
return clean;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/** The worst impact and whether any security fix lies in `(installed, candidate]`. */
|
|
75
|
+
export function impactInRange(
|
|
76
|
+
map: ReadonlyMap<string, ImpactEntry>,
|
|
77
|
+
installed: string,
|
|
78
|
+
candidate: string,
|
|
79
|
+
): { readonly worst: ConsumerImpact | null; readonly security: boolean } {
|
|
80
|
+
const rank = (i: ConsumerImpact): number => CONSUMER_IMPACT_VALUES.indexOf(i);
|
|
81
|
+
let worst: ConsumerImpact | null = null;
|
|
82
|
+
let security = false;
|
|
83
|
+
for (const [version, entry] of map) {
|
|
84
|
+
if (compare_versions(version, installed) !== 1 || compare_versions(version, candidate) === 1) continue;
|
|
85
|
+
if (worst === null || rank(entry.impact) > rank(worst)) worst = entry.impact;
|
|
86
|
+
security = security || entry.security;
|
|
87
|
+
}
|
|
88
|
+
return { worst, security };
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
export interface NoticeEnv {
|
|
92
|
+
readonly ci: boolean;
|
|
93
|
+
readonly interactive: boolean;
|
|
94
|
+
readonly noUpdateCheck: boolean;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
export interface NoticeInput {
|
|
98
|
+
/** The version running right now, from the installed `package.json`. */
|
|
99
|
+
readonly installed: string;
|
|
100
|
+
/** The newest version the update probe cached; `null` when it has never run. */
|
|
101
|
+
readonly candidate: string | null;
|
|
102
|
+
/** The registry's impact block as cached — untrusted, validated here. */
|
|
103
|
+
readonly impactMap: unknown;
|
|
104
|
+
readonly mode: UpdateMode | undefined;
|
|
105
|
+
readonly origin: InstallOrigin;
|
|
106
|
+
readonly env: NoticeEnv;
|
|
107
|
+
/** `{label: text}` from the INSTALLED package's changelog section for {@link installed}. */
|
|
108
|
+
readonly curatedHead: ReadonlyMap<string, string>;
|
|
109
|
+
/** The version a previous session staged, if any. */
|
|
110
|
+
readonly staged: string | null;
|
|
111
|
+
/** The version this concern last reported as installed, if any. */
|
|
112
|
+
readonly lastSeenInstalled: string | null;
|
|
113
|
+
/** True when another session is live on this machine right now. */
|
|
114
|
+
readonly foreignSessionLive: boolean;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
export interface NoticeOutcome {
|
|
118
|
+
/** Lines for the user, in order. Empty means say nothing. */
|
|
119
|
+
readonly lines: readonly string[];
|
|
120
|
+
/** The version to record as staged, or `null` to clear the staging record. */
|
|
121
|
+
readonly stage: string | null;
|
|
122
|
+
/**
|
|
123
|
+
* Always `null`. Kept as a field, not deleted, because its absence is the
|
|
124
|
+
* finding: an independent review of 2026-10-20 refused the manifest while
|
|
125
|
+
* this concern could spawn `upgrade --unattended`, on the ground that
|
|
126
|
+
* `effect: notification` means "tells the human something and changes
|
|
127
|
+
* nothing else" and a concern that can mutate the installation is not
|
|
128
|
+
* that. The capability was removed rather than the label widened —
|
|
129
|
+
* widening a closed effect vocabulary to fit one concern is the shape that
|
|
130
|
+
* makes the vocabulary stop meaning anything. Activation stays with
|
|
131
|
+
* `upgrade --unattended`, which a human or a scheduler runs.
|
|
132
|
+
*/
|
|
133
|
+
readonly activate: null;
|
|
134
|
+
/** Why nothing was said, for the lifecycle log. `null` when something was. */
|
|
135
|
+
readonly suppressed: string | null;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
const NOTHING = (reason: string): NoticeOutcome => ({ lines: [], stage: null, activate: null, suppressed: reason });
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Silences that still reconcile the record: nothing newer is cached, so a
|
|
142
|
+
* previously staged candidate is stale — typically because it was installed.
|
|
143
|
+
* Every other silence ({@link noticeSuppression}) is a context that writes
|
|
144
|
+
* nothing at all, the kill switch included.
|
|
145
|
+
*/
|
|
146
|
+
export const RECONCILE_REASONS: ReadonlySet<string> = new Set(['no cached candidate', 'nothing newer cached']);
|
|
147
|
+
|
|
148
|
+
/** Contexts where a session start says nothing and writes nothing. */
|
|
149
|
+
export function noticeSuppression(input: Pick<NoticeInput, 'env' | 'origin' | 'mode'>): string | null {
|
|
150
|
+
if (input.env.ci) return 'CI';
|
|
151
|
+
if (!input.env.interactive) return 'non-interactive';
|
|
152
|
+
if (input.env.noUpdateCheck) return 'AGENT_CONFIG_NO_UPDATE_CHECK=1';
|
|
153
|
+
if (input.origin === 'source-checkout') return 'source checkout';
|
|
154
|
+
if (input.origin === 'ephemeral') return 'ephemeral run';
|
|
155
|
+
if (input.mode === 'off') return 'update.mode off';
|
|
156
|
+
return null;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/** The one curated-head line for a version, or `null` when the head says nothing. */
|
|
160
|
+
export function oneCuratedLine(head: ReadonlyMap<string, string>): string | null {
|
|
161
|
+
for (const label of HEAD_PRIORITY) {
|
|
162
|
+
const text = head.get(label);
|
|
163
|
+
if (text !== undefined && text.trim() !== '' && text.trim() !== '_none_') {
|
|
164
|
+
return `${label}: ${text.trim()}`;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
return null;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* The candidate as the reader sees it: rebuilt from the parsed numeric core.
|
|
172
|
+
* The cached string came from the registry, and `parse_version` accepts a
|
|
173
|
+
* prerelease label of any length, so the label itself is never printed.
|
|
174
|
+
*/
|
|
175
|
+
function shownVersion(candidate: string): string {
|
|
176
|
+
const v = parse_version(candidate)!;
|
|
177
|
+
return `${v.major}.${v.minor}.${v.patch}${v.pre.length > 0 ? ' (pre-release)' : ''}`;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* What to say and what may happen.
|
|
182
|
+
*
|
|
183
|
+
* The post-update branch comes first because it is the one that reports a
|
|
184
|
+
* change that already occurred; an available-update notice about a version the
|
|
185
|
+
* reader just moved past would be noise.
|
|
186
|
+
*/
|
|
187
|
+
export function updateNotice(input: NoticeInput): NoticeOutcome {
|
|
188
|
+
const suppressed = noticeSuppression(input);
|
|
189
|
+
if (suppressed !== null) return NOTHING(suppressed);
|
|
190
|
+
|
|
191
|
+
// Post-update: the installed version moved since this concern last looked.
|
|
192
|
+
if (input.lastSeenInstalled !== null && compare_versions(input.installed, input.lastSeenInstalled) === 1) {
|
|
193
|
+
const line = oneCuratedLine(input.curatedHead);
|
|
194
|
+
const lines = [`agent-config is now ${input.installed} (was ${input.lastSeenInstalled}).`];
|
|
195
|
+
if (line !== null) lines.push(` ${line}`);
|
|
196
|
+
return { lines, stage: null, activate: null, suppressed: null };
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
if (input.candidate === null || parse_version(input.candidate) === null) return NOTHING('no cached candidate');
|
|
200
|
+
if (compare_versions(input.candidate, input.installed) !== 1) return NOTHING('nothing newer cached');
|
|
201
|
+
|
|
202
|
+
const range = impactInRange(sanitiseImpactMap(input.impactMap), input.installed, input.candidate);
|
|
203
|
+
const lines = [`agent-config ${shownVersion(input.candidate)} is available (installed: ${input.installed}).`];
|
|
204
|
+
if (range.security) lines.push(` Security fix in range. ${SECURITY_POLICY_REF}.`);
|
|
205
|
+
if (range.worst === 'notice') lines.push(' A release in range carries a notice — read it before upgrading.');
|
|
206
|
+
if (range.worst === 'action') lines.push(' A release in range needs a hand; it is never installed unattended.');
|
|
207
|
+
|
|
208
|
+
// Staging only. This concern records which candidate it verified and says
|
|
209
|
+
// so; it installs nothing, ever. Under `auto` it still names the live-session
|
|
210
|
+
// state, because that is what decides whether an `upgrade --unattended` run
|
|
211
|
+
// would be allowed to swap at all, and a reader under `auto` is entitled to
|
|
212
|
+
// know which of the two reasons is holding their install back.
|
|
213
|
+
const stageable = range.worst !== 'action';
|
|
214
|
+
|
|
215
|
+
if (input.mode === 'auto' && stageable) {
|
|
216
|
+
lines.push(
|
|
217
|
+
input.foreignSessionLive
|
|
218
|
+
? ' Staged. Another session is open on this machine, so a swap would break its hooks.'
|
|
219
|
+
: ' Staged. Run `agent-config upgrade --unattended` to install it.',
|
|
220
|
+
);
|
|
221
|
+
} else {
|
|
222
|
+
lines.push(' Run `agent-config upgrade` to install it.');
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
return { lines, stage: stageable ? input.candidate : null, activate: null, suppressed: null };
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
/**
|
|
229
|
+
* The curated head of one version's CHANGELOG section, as `{label: text}`.
|
|
230
|
+
*
|
|
231
|
+
* Parses the SHIPPED changelog — the one inside the installed package — which
|
|
232
|
+
* is why this takes text rather than a path: the caller decides which tree it
|
|
233
|
+
* is reading, and no caller may point it at a fetched document.
|
|
234
|
+
*
|
|
235
|
+
* The shape is the one `_lib/release_highlights.ts` writes: a `## [<version>]`
|
|
236
|
+
* section, a `### Release highlights` heading inside it, then one
|
|
237
|
+
* `- **<Label>:** <text>` bullet per label. A section without a highlights
|
|
238
|
+
* heading yields an empty map, which the notice renders as no line at all —
|
|
239
|
+
* absence is a legitimate answer here, not an error.
|
|
240
|
+
*/
|
|
241
|
+
export function parseCuratedHead(changelog: string, version: string): ReadonlyMap<string, string> {
|
|
242
|
+
const head = new Map<string, string>();
|
|
243
|
+
const lines = changelog.split('\n');
|
|
244
|
+
const sectionStart = lines.findIndex((l) => new RegExp(`^## \\[?${version.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}\\]?(\\s|$)`).test(l));
|
|
245
|
+
if (sectionStart < 0) return head;
|
|
246
|
+
let inHighlights = false;
|
|
247
|
+
for (let i = sectionStart + 1; i < lines.length; i += 1) {
|
|
248
|
+
const line = lines[i] as string;
|
|
249
|
+
if (/^#{1,2} /.test(line)) break; // the next release section, or a new era
|
|
250
|
+
if (/^### /.test(line)) {
|
|
251
|
+
inHighlights = /^### Release highlights\s*$/.test(line);
|
|
252
|
+
continue;
|
|
253
|
+
}
|
|
254
|
+
if (!inHighlights) continue;
|
|
255
|
+
const m = /^- \*\*(.+?):\*\*\s*(.*)$/.exec(line);
|
|
256
|
+
if (m !== null) head.set(m[1] as string, (m[2] as string).trim());
|
|
257
|
+
}
|
|
258
|
+
return head;
|
|
259
|
+
}
|