@event4u/agent-config 16.5.0 → 17.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.augment-plugin/marketplace.json +3 -3
- package/.augment-plugin/plugin.json +1 -1
- package/.claude-plugin/marketplace.json +2 -2
- package/.claude-plugin/skills/install-agent-config/SKILL.md +4 -4
- package/CHANGELOG.md +463 -498
- package/CONTRIBUTING.md +47 -0
- package/README.md +25 -25
- package/dist/agent-src/commands/{design.md → agent-design.md} +10 -6
- package/dist/agent-src/commands/agents/init.md +66 -3
- package/dist/agent-src/commands/agents/user/init.md +3 -0
- package/dist/agent-src/commands/{optimize/deep.md → analyze/and-optimize.md} +72 -33
- package/dist/agent-src/commands/analyze/inbox.md +168 -37
- package/dist/agent-src/commands/analyze/pr.md +144 -0
- package/dist/agent-src/commands/analyze/{repo.md → reference.md} +85 -14
- package/dist/agent-src/commands/analyze/roadmap-repos.md +19 -10
- package/dist/agent-src/commands/analyze.md +28 -12
- package/dist/agent-src/commands/audit.md +115 -0
- package/dist/agent-src/commands/brand/review.md +13 -2
- package/dist/agent-src/commands/brand/tokens.md +3 -3
- package/dist/agent-src/commands/brand/voice.md +8 -5
- package/dist/agent-src/commands/brand.md +2 -2
- package/dist/agent-src/commands/challenge-me/closure.md +25 -0
- package/dist/agent-src/commands/design-system/import.md +8 -3
- package/dist/agent-src/commands/design-system/sync.md +98 -0
- package/dist/agent-src/commands/design-system.md +6 -1
- package/dist/agent-src/commands/evals/analyze.json +44 -0
- package/dist/agent-src/commands/evals/audit.json +12 -0
- package/dist/agent-src/commands/evals/retro.json +12 -0
- package/dist/agent-src/commands/fix/ci.md +10 -8
- package/dist/agent-src/commands/ghostwriter/write.md +22 -0
- package/dist/agent-src/commands/memory/learn-low-impact.md +70 -83
- package/dist/agent-src/commands/memory/propose.md +12 -0
- package/dist/agent-src/commands/memory.md +1 -1
- package/dist/agent-src/commands/optimize.md +4 -3
- package/dist/agent-src/commands/post-as/me.md +18 -0
- package/dist/agent-src/commands/pr/create.md +17 -342
- package/dist/agent-src/commands/pr/merge.md +129 -368
- package/dist/agent-src/commands/retro.md +121 -0
- package/dist/agent-src/commands/review/routing.md +1 -1
- package/dist/agent-src/commands/roadmap/next.md +4 -1
- package/dist/agent-src/commands/roadmap/process-full.md +46 -333
- package/dist/agent-src/commands/roadmap/triage-parked.md +6 -2
- package/dist/agent-src/commands/team-knowledge/consolidate.md +2 -2
- package/dist/agent-src/commands/team-knowledge.md +1 -1
- package/dist/agent-src/commands/threat-model.md +1 -1
- package/dist/agent-src/commands/upstream-contribute.md +91 -101
- package/dist/agent-src/commands/worktree/cleanup.md +18 -11
- package/dist/agent-src/contexts/contracts/consumer-agents-md-guide.md +54 -0
- package/dist/agent-src/contexts/execution/analysis-loop.md +137 -0
- package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +3 -3
- package/dist/agent-src/contexts/execution/decision-closure-execution.md +1 -1
- package/dist/agent-src/contexts/execution/host-capability-manifest.md +6 -0
- package/dist/agent-src/contexts/execution/orchestration-telemetry.md +11 -4
- package/dist/agent-src/contexts/execution/pr-create-branches-content.md +250 -0
- package/dist/agent-src/contexts/execution/pr-create-branches-freshness.md +150 -0
- package/dist/agent-src/contexts/execution/pr-merge-queue.md +287 -0
- package/dist/agent-src/contexts/execution/pr-merge-sync.md +276 -0
- package/dist/agent-src/contexts/execution/pr-merge-trust-boundary.md +69 -0
- package/dist/agent-src/contexts/execution/process-full-all.md +233 -0
- package/dist/agent-src/contexts/execution/process-full-delivery.md +231 -0
- package/dist/agent-src/contexts/execution/roadmap-execution-contract-branches.md +42 -0
- package/dist/agent-src/contexts/execution/roadmap-execution-contract.md +1 -35
- package/dist/agent-src/contexts/execution/roadmap-process-loop-close.md +235 -0
- package/dist/agent-src/contexts/execution/roadmap-process-loop-prescan.md +216 -0
- package/dist/agent-src/contexts/execution/roadmap-process-loop-run.md +253 -0
- package/dist/agent-src/contexts/execution/roadmap-process-loop-set.md +212 -0
- package/dist/agent-src/contexts/execution/roadmap-process-loop.md +25 -864
- package/dist/agent-src/contexts/execution/subagent-spawn-contract.md +14 -2
- package/dist/agent-src/contexts/execution/subagent-steering.md +65 -8
- package/dist/agent-src/contexts/model-recommendations.md +5 -5
- package/dist/agent-src/contexts/subagent-configuration.md +1 -1
- package/dist/agent-src/guidelines/agent-infra/api-cost-levers.md +4 -3
- package/dist/agent-src/guidelines/agent-infra/model-recommendation.md +11 -5
- package/dist/agent-src/guidelines/agent-infra/rule-body-migration-inventory.md +1 -1
- package/dist/agent-src/guidelines/agent-infra/self-improvement-pipeline.md +47 -24
- package/dist/agent-src/guidelines/design-antipatterns.md +5 -0
- package/dist/agent-src/guidelines/design-asset-discipline.md +17 -0
- package/dist/agent-src/guidelines/design-fidelity-routing.md +1 -0
- package/dist/agent-src/guidelines/php/api-design.md +10 -1
- package/dist/agent-src/rules/brand-source-of-truth.md +7 -6
- package/dist/agent-src/rules/code-provenance.md +1 -1
- package/dist/agent-src/rules/context-hygiene.md +0 -1
- package/dist/agent-src/rules/design-fidelity.md +12 -13
- package/dist/agent-src/rules/external-reference-deep-dive.md +2 -2
- package/dist/agent-src/rules/fix-what-you-see.md +1 -1
- package/dist/agent-src/rules/low-impact-corpus-privacy-floor.md +14 -15
- package/dist/agent-src/rules/missing-skill-recovery.md +12 -11
- package/dist/agent-src/rules/neighbour-precedence.md +1 -1
- package/dist/agent-src/rules/recurring-criticism.md +1 -1
- package/dist/agent-src/rules/roadmap-ci-steps-policy.md +0 -2
- package/dist/agent-src/rules/self-repair-loop.md +2 -2
- package/dist/agent-src/rules/token-budget-discipline.md +1 -1
- package/dist/agent-src/scripts/dashboard_mode.ts +4 -1
- package/dist/agent-src/scripts/roadmap_age.ts +175 -0
- package/dist/agent-src/scripts/update_roadmap_progress.ts +10 -2
- package/dist/agent-src/skills/accessibility-auditor/SKILL.md +3 -3
- package/dist/agent-src/skills/agent-security-review/SKILL.md +2 -2
- package/dist/agent-src/skills/agents-md-thin-root/SKILL.md +12 -4
- package/dist/agent-src/skills/ai-code-blindspots/SKILL.md +7 -0
- package/dist/agent-src/skills/ai-council/references/advanced-modes.md +11 -1
- package/dist/agent-src/skills/ai-council/references/cost-and-redaction.md +7 -0
- package/dist/agent-src/skills/ai-council/references/execution-modes.md +7 -0
- package/dist/agent-src/skills/ai-council/references/output-and-synthesis.md +19 -0
- package/dist/agent-src/skills/ai-council/references/procedure.md +7 -0
- package/dist/agent-src/skills/api-design/SKILL.md +2 -2
- package/dist/agent-src/skills/api-endpoint/SKILL.md +2 -2
- package/dist/agent-src/skills/authz-review/SKILL.md +5 -3
- package/dist/agent-src/skills/blade-ui/SKILL.md +2 -2
- package/dist/agent-src/skills/brand/SKILL.md +7 -3
- package/dist/agent-src/skills/brand-asset-generation/SKILL.md +13 -6
- package/dist/agent-src/skills/brand-audit/SKILL.md +2 -1
- package/dist/agent-src/skills/brand-identity/SKILL.md +5 -4
- package/dist/agent-src/skills/brand-strategy/SKILL.md +5 -4
- package/dist/agent-src/skills/brand-to-tokens/SKILL.md +18 -39
- package/dist/agent-src/skills/brand-to-tokens/templates/marp-brand-deck.md.example +2 -2
- package/dist/agent-src/skills/brand-to-tokens/templates/reveal-brand-deck.yaml +2 -2
- package/dist/agent-src/skills/canvas-design/SKILL.md +12 -2
- package/dist/agent-src/skills/competitive-positioning/SKILL.md +2 -2
- package/dist/agent-src/skills/composer-packages/SKILL.md +18 -0
- package/dist/agent-src/skills/condense-memory/SKILL.md +1 -1
- package/dist/agent-src/skills/content-funnel-design/SKILL.md +8 -1
- package/dist/agent-src/skills/context-authoring/SKILL.md +1 -1
- package/dist/agent-src/skills/context-document/SKILL.md +2 -2
- package/dist/agent-src/skills/corpus-grounding/SKILL.md +6 -6
- package/dist/agent-src/skills/corpus-grounding/scripts/decision_engine.ts +13 -11
- package/dist/agent-src/skills/corpus-grounding/scripts/ground.mjs +1706 -0
- package/dist/agent-src/skills/corpus-grounding/scripts/schema_validator.ts +7 -1
- package/dist/agent-src/skills/dashboard-design/SKILL.md +1 -1
- package/dist/agent-src/skills/data-flow-mapper/SKILL.md +5 -2
- package/dist/agent-src/skills/database/SKILL.md +5 -4
- package/dist/agent-src/skills/decision-record/references/weighted-matrix.md +12 -0
- package/dist/agent-src/skills/deep-reading-analyst/SKILL.md +1 -1
- package/dist/agent-src/skills/dependency-upgrade/SKILL.md +61 -11
- package/dist/agent-src/skills/description-assist/SKILL.md +1 -1
- package/dist/agent-src/skills/design-intelligence/SKILL.md +1 -1
- package/dist/agent-src/skills/design-intelligence/data/landing.csv +1 -1
- package/dist/agent-src/skills/design-intelligence/references/context-and-registers.md +10 -2
- package/dist/agent-src/skills/design-intelligence/references/design-languages.md +1 -1
- package/dist/agent-src/skills/design-intelligence/references/design-rules-checklist.md +4 -3
- package/dist/agent-src/skills/design-intelligence/references/integration-mapping.md +14 -14
- package/dist/agent-src/skills/{wireframe → design-review}/references/story-beat-ledger.schema.json +1 -1
- package/dist/agent-src/skills/design-review/references/verification-automation.md +11 -3
- package/dist/agent-src/skills/design-system-capture/SKILL.md +15 -10
- package/dist/agent-src/skills/design-system-capture/references/design-system-json.md +20 -5
- package/dist/agent-src/skills/design-system-capture/references/import-procedure.md +2 -2
- package/dist/agent-src/skills/design-tokens/SKILL.md +23 -23
- package/dist/agent-src/skills/design-tokens/scripts/tokens.mjs +1037 -0
- package/dist/agent-src/skills/design-tokens/scripts/tokens.ts +336 -13
- package/dist/agent-src/skills/design-tokens/templates/design-tokens-starter.json +52 -53
- package/dist/agent-src/skills/docker/SKILL.md +1 -1
- package/dist/agent-src/skills/estimate-ticket/SKILL.md +1 -1
- package/dist/agent-src/skills/existing-ui-audit/SKILL.md +14 -276
- package/dist/agent-src/skills/existing-ui-audit/procedure.yaml +44 -0
- package/dist/agent-src/skills/existing-ui-audit/references/anti-slop-cross-reference.md +1 -1
- package/dist/agent-src/skills/existing-ui-audit/references/steps/00-inspect-stack-and-input.md +4 -0
- package/dist/agent-src/skills/existing-ui-audit/references/steps/01-enumerate-components.md +26 -0
- package/dist/agent-src/skills/existing-ui-audit/references/steps/01b-detect-component-taxonomy.md +7 -0
- package/dist/agent-src/skills/existing-ui-audit/references/steps/02-identify-design-system.md +12 -0
- package/dist/agent-src/skills/existing-ui-audit/references/steps/03-detect-design-tokens.md +35 -0
- package/dist/agent-src/skills/existing-ui-audit/references/steps/04-detect-shadcn-inventory.md +13 -0
- package/dist/agent-src/skills/existing-ui-audit/references/steps/04b-live-storybook-read.md +26 -0
- package/dist/agent-src/skills/existing-ui-audit/references/steps/05-list-reusable-patterns.md +14 -0
- package/dist/agent-src/skills/existing-ui-audit/references/steps/06-match-candidates.md +52 -0
- package/dist/agent-src/skills/existing-ui-audit/references/steps/07-greenfield-branch.md +29 -0
- package/dist/agent-src/skills/existing-ui-audit/references/steps/08-a11y-baseline.md +40 -0
- package/dist/agent-src/skills/existing-ui-audit/references/steps/09-validate-and-write.md +5 -0
- package/dist/agent-src/skills/experiment-loop/SKILL.md +1 -1
- package/dist/agent-src/skills/fe-design/references/design-patterns.md +16 -2
- package/dist/agent-src/skills/fe-design/references/design-read-and-memory.md +1 -1
- package/dist/agent-src/skills/fe-design/references/source-led-port.md +1 -1
- package/dist/agent-src/skills/finishing-a-development-branch/SKILL.md +6 -6
- package/dist/agent-src/skills/flux/SKILL.md +1 -1
- package/dist/agent-src/skills/form-handler/SKILL.md +15 -2
- package/dist/agent-src/skills/git-workflow/SKILL.md +2 -2
- package/dist/agent-src/skills/git-workflow/references/branch-update.md +7 -0
- package/dist/agent-src/skills/git-workflow/references/commit-subject.md +12 -0
- package/dist/agent-src/skills/git-workflow/references/push-closes-its-loop.md +10 -0
- package/dist/agent-src/skills/gtm-launch/SKILL.md +8 -1
- package/dist/agent-src/skills/html-deck/SKILL.md +7 -2
- package/dist/agent-src/skills/humanizer/SKILL.md +16 -3
- package/dist/agent-src/skills/humanizer/references/anti-aiisms.md +13 -1
- package/dist/agent-src/skills/humanizer/references/fixtures.md +8 -0
- package/dist/agent-src/skills/js-library-packaging/SKILL.md +5 -4
- package/dist/agent-src/skills/js-library-packaging/scripts/check_package_surface.mjs +197 -0
- package/dist/agent-src/skills/judge-artifact-completeness/SKILL.md +1 -1
- package/dist/agent-src/skills/judge-security-auditor/SKILL.md +2 -2
- package/dist/agent-src/skills/launch-readiness/SKILL.md +18 -22
- package/dist/agent-src/skills/learning-to-rule-or-skill/SKILL.md +5 -5
- package/dist/agent-src/skills/livewire/SKILL.md +1 -1
- package/dist/agent-src/skills/llm-provider-knowledge/SKILL.md +18 -0
- package/dist/agent-src/skills/logo-generation/SKILL.md +9 -3
- package/dist/agent-src/skills/market-entry-analysis/SKILL.md +6 -1
- package/dist/agent-src/skills/markitdown/SKILL.md +1 -1
- package/dist/agent-src/skills/memory-consolidation/SKILL.md +2 -2
- package/dist/agent-src/skills/messaging-architecture/SKILL.md +8 -1
- package/dist/agent-src/skills/motion-choreographer/SKILL.md +2 -2
- package/dist/agent-src/skills/playwright-testing/SKILL.md +2 -0
- package/dist/agent-src/skills/positioning-strategy/SKILL.md +10 -2
- package/dist/agent-src/skills/prediction-pool-optimizer/references/ev-fixtures.md +13 -0
- package/dist/agent-src/skills/prediction-pool-optimizer/references/odds-and-bonus.md +7 -0
- package/dist/agent-src/skills/project-analysis-core/SKILL.md +1 -1
- package/dist/agent-src/skills/project-analysis-hypothesis-driven/SKILL.md +1 -1
- package/dist/agent-src/skills/project-analyzer/SKILL.md +14 -75
- package/dist/agent-src/skills/project-analyzer/procedure.yaml +39 -0
- package/dist/agent-src/skills/project-analyzer/references/steps/01-project-overview.md +9 -0
- package/dist/agent-src/skills/project-analyzer/references/steps/02-architecture.md +7 -0
- package/dist/agent-src/skills/project-analyzer/references/steps/03-data-layer.md +6 -0
- package/dist/agent-src/skills/project-analyzer/references/steps/04-business-domains.md +7 -0
- package/dist/agent-src/skills/project-analyzer/references/steps/05-api-surface.md +6 -0
- package/dist/agent-src/skills/project-analyzer/references/steps/06-service-map.md +6 -0
- package/dist/agent-src/skills/project-analyzer/references/steps/07-module-inventory.md +6 -0
- package/dist/agent-src/skills/project-analyzer/references/steps/08-infrastructure-and-testing.md +5 -0
- package/dist/agent-src/skills/project-analyzer/references/steps/09-agent-docs-audit.md +6 -0
- package/dist/agent-src/skills/project-analyzer/references/steps/10-gap-analysis.md +6 -0
- package/dist/agent-src/skills/quality-tools/references/js-ts-tools.md +10 -0
- package/dist/agent-src/skills/quality-tools/references/php-tools.md +13 -0
- package/dist/agent-src/skills/quality-tools/references/python-tools.md +11 -0
- package/dist/agent-src/skills/react-native-setup/SKILL.md +7 -2
- package/dist/agent-src/skills/react-shadcn-ui/SKILL.md +5 -1
- package/dist/agent-src/skills/react-shadcn-ui/references/registry.md +13 -0
- package/dist/agent-src/skills/react-shadcn-ui/scripts/shadcn_add.mjs +315 -0
- package/dist/agent-src/skills/react-shadcn-ui/scripts/shadcn_add.ts +6 -6
- package/dist/agent-src/skills/receiving-code-review/SKILL.md +1 -1
- package/dist/agent-src/skills/refine-ticket/SKILL.md +2 -2
- package/dist/agent-src/skills/release-comms/SKILL.md +2 -1
- package/dist/agent-src/skills/repomix-packer/SKILL.md +2 -2
- package/dist/agent-src/skills/requesting-code-review/SKILL.md +3 -3
- package/dist/agent-src/skills/roadmap-management/references/archival.md +3 -3
- package/dist/agent-src/skills/roadmap-management/references/authoring.md +9 -2
- package/dist/agent-src/skills/roadmap-management/references/dashboard.md +3 -3
- package/dist/agent-src/skills/roadmap-management/references/lifecycle.md +3 -3
- package/dist/agent-src/skills/roadmap-writing/SKILL.md +4 -4
- package/dist/agent-src/skills/rtk-output-filtering/SKILL.md +1 -1
- package/dist/agent-src/skills/rule-writing/SKILL.md +1 -2
- package/dist/agent-src/skills/security/SKILL.md +41 -5
- package/dist/agent-src/skills/skill-improvement-pipeline/SKILL.md +5 -3
- package/dist/agent-src/skills/skill-reviewer/SKILL.md +1 -1
- package/dist/agent-src/skills/skill-writing/SKILL.md +23 -8
- package/dist/agent-src/skills/skill-writing/references/section-patterns.md +19 -1
- package/dist/agent-src/skills/source-discovery/SKILL.md +3 -3
- package/dist/agent-src/skills/sql-writing/SKILL.md +2 -2
- package/dist/agent-src/skills/standards-from-config/SKILL.md +2 -2
- package/dist/agent-src/skills/storybook-workshop/SKILL.md +5 -0
- package/dist/agent-src/skills/storybook-workshop/scripts/story_contrast_floor.mjs +99 -0
- package/dist/agent-src/skills/subagent-orchestration/SKILL.md +13 -13
- package/dist/agent-src/skills/subagent-orchestration/prompts/README.md +4 -3
- package/dist/agent-src/skills/svg-authoring/SKILL.md +7 -1
- package/dist/agent-src/skills/systematic-debugging/SKILL.md +2 -2
- package/dist/agent-src/skills/tailwind-engineer/SKILL.md +8 -3
- package/dist/agent-src/skills/tailwind-engineer/scripts/tailwind_config_gen.mjs +482 -0
- package/dist/agent-src/skills/test-case-discovery/SKILL.md +1 -1
- package/dist/agent-src/skills/threat-modeling/SKILL.md +8 -1
- package/dist/agent-src/skills/threat-modeling/data/manifest.json +5 -2
- package/dist/agent-src/skills/threat-modeling/data/reasoning.csv +10 -10
- package/dist/agent-src/skills/threat-modeling/data/surfaces.csv +11 -10
- package/dist/agent-src/skills/threat-modeling/data/threats.csv +34 -20
- package/dist/agent-src/skills/type-design/SKILL.md +196 -0
- package/dist/agent-src/skills/type-design/references/font-spec.md +90 -0
- package/dist/agent-src/skills/type-design/references/gates.md +113 -0
- package/dist/agent-src/skills/type-design/references/toolchain.md +66 -0
- package/dist/agent-src/skills/typography-system/SKILL.md +21 -11
- package/dist/agent-src/skills/typography-system/references/worked-scales.md +85 -0
- package/dist/agent-src/skills/ui-apply-generic/SKILL.md +1 -1
- package/dist/agent-src/skills/universal-project-analysis/SKILL.md +1 -1
- package/dist/agent-src/skills/upstream-contribute/SKILL.md +120 -125
- package/dist/agent-src/skills/using-git-worktrees/SKILL.md +1 -0
- package/dist/agent-src/skills/verify-repair-loop/SKILL.md +1 -1
- package/dist/agent-src/skills/voice-and-tone-design/SKILL.md +71 -2
- package/dist/agent-src/skills/worktree-lifecycle/SKILL.md +16 -14
- package/dist/agent-src/templates/AGENTS.md +1 -1
- package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
- package/dist/agent-src/templates/agents/proposal.example.md +1 -1
- package/dist/agent-src/templates/github-workflows/advisories-daily.yml +85 -0
- package/dist/agent-src/templates/roadmaps.md +39 -1
- package/dist/agent-src/templates/scripts/check_memory.ts +2 -2
- package/dist/agent-src/templates/scripts/historical-bug-patterns.example.yml +13 -1
- package/dist/agent-src/templates/scripts/work_engine/cli.ts +17 -0
- package/dist/agent-src/templates/scripts/work_engine/cli_args.ts +10 -0
- package/dist/agent-src/templates/scripts/work_engine/directives/ui/scaffold.ts +22 -13
- package/dist/agent-src/templates/scripts/work_engine/dispatcher.ts +18 -4
- package/dist/agent-src/templates/scripts/work_engine/procedure/checks.ts +283 -0
- package/dist/agent-src/templates/scripts/work_engine/procedure/run.ts +432 -0
- package/dist/agent-src/templates/scripts/work_engine/procedure/sidecar.ts +185 -0
- package/dist/agent-src/templates/scripts/work_engine/state.ts +3 -0
- package/dist/cli/commands/uiRender.js +72 -17
- package/dist/cli/commands/uiRenderAsset.js +10 -2
- package/dist/cli/commands/uiRenderAssetFonts.js +158 -0
- package/dist/cli/commands/uiRenderAssetTypes.js +8 -20
- package/dist/cli/initRouting.js +1 -1
- package/dist/cli/mcp/dispatch.js +31 -9
- package/dist/cli/python/knowledge_ingest.js +7 -39
- package/dist/cli/python/workspace_secrets.js +4 -177
- package/dist/cli/registry.js +4 -1
- package/dist/cli-delegate/archive_completed_roadmaps.js +3 -2
- package/dist/cli-delegate/check_update_banner.js +635 -266
- package/dist/cli-delegate/{chunk-TMWYUOK4.js → chunk-2CX7NWRB.js} +224 -437
- package/dist/cli-delegate/{chunk-F3QDG2GT.js → chunk-2SFOOFJJ.js} +259 -159
- package/dist/cli-delegate/chunk-2Y5AMLMY.js +136 -0
- package/dist/cli-delegate/{chunk-OKJUIAPS.js → chunk-4E2W63DA.js} +1 -62
- package/dist/cli-delegate/{chunk-6SRJTYJS.js → chunk-4SHNERBL.js} +37 -16
- package/dist/cli-delegate/chunk-5VO3RTMV.js +208 -0
- package/dist/cli-delegate/chunk-6E2LDY4F.js +27 -0
- package/dist/cli-delegate/{chunk-XQTPXKFA.js → chunk-6ZD2QZMN.js} +8 -17
- package/dist/cli-delegate/{chunk-6V5FMA3P.js → chunk-7CEI2YPS.js} +1 -1
- package/dist/cli-delegate/{chunk-DMSZHXZS.js → chunk-7DRWULEQ.js} +80 -7
- package/dist/cli-delegate/chunk-7NXCZSDL.js +54 -0
- package/dist/cli-delegate/chunk-AX3U3UWJ.js +328 -0
- package/dist/cli-delegate/{chunk-WOKWX5PL.js → chunk-BKALSTBZ.js} +18 -3
- package/dist/cli-delegate/chunk-BMGUGSY6.js +103 -0
- package/dist/cli-delegate/chunk-BYV46VRM.js +3309 -0
- package/dist/cli-delegate/{chunk-5GPULQBE.js → chunk-CAL76ADI.js} +4215 -682
- package/dist/cli-delegate/chunk-DSY6LLCQ.js +127 -0
- package/dist/cli-delegate/chunk-E6XNBVE4.js +581 -0
- package/dist/cli-delegate/{chunk-ZUZKZYCN.js → chunk-ESUNQ5XR.js} +46 -10
- package/dist/cli-delegate/{chunk-G5VVIZRC.js → chunk-F7HLSW6P.js} +1 -1
- package/dist/cli-delegate/chunk-FIEEOH5C.js +133 -0
- package/dist/cli-delegate/chunk-FKYZOWVD.js +719 -0
- package/dist/cli-delegate/chunk-GOMILC3O.js +918 -0
- package/dist/cli-delegate/chunk-I4KJYVPB.js +69 -0
- package/dist/cli-delegate/{chunk-JQOM7TTM.js → chunk-IDAOTDPE.js} +1 -100
- package/dist/cli-delegate/chunk-IROAQ77A.js +137 -0
- package/dist/cli-delegate/chunk-J2SJZICO.js +698 -0
- package/dist/cli-delegate/{chunk-6YQC2HLF.js → chunk-JHMMWNJ2.js} +54 -40
- package/dist/cli-delegate/{chunk-WQWXGIWB.js → chunk-M6CRG5O6.js} +165 -15
- package/dist/cli-delegate/{chunk-PHD7OOLE.js → chunk-MQ2UDEGV.js} +14 -3
- package/dist/cli-delegate/chunk-NTM7G2V4.js +220 -0
- package/dist/cli-delegate/chunk-PV7S5DPJ.js +175 -0
- package/dist/cli-delegate/{chunk-F7DQWYR5.js → chunk-RAXQOETZ.js} +6 -2
- package/dist/cli-delegate/{chunk-T7XSJSUQ.js → chunk-SIOMDAKL.js} +980 -784
- package/dist/cli-delegate/{chunk-KR6EM23A.js → chunk-TULVDQ4L.js} +3 -48
- package/dist/cli-delegate/chunk-UUYEKXKR.js +20 -0
- package/dist/cli-delegate/{chunk-7XGD2OEU.js → chunk-UXWHY6CQ.js} +2 -1
- package/dist/cli-delegate/{chunk-PWX7CKMD.js → chunk-VC3ECUEK.js} +1 -1
- package/dist/cli-delegate/{chunk-KXXWJTDO.js → chunk-WMNYVIYX.js} +1 -1
- package/dist/cli-delegate/chunk-XCY5KKUC.js +181 -0
- package/dist/cli-delegate/{chunk-H76PHZBI.js → chunk-XLY5G3CM.js} +14 -19
- package/dist/cli-delegate/cmd_adr_effective.js +41 -2
- package/dist/cli-delegate/cmd_analyze_session.js +7 -7
- package/dist/cli-delegate/cmd_brand_status.js +1287 -10
- package/dist/cli-delegate/cmd_ci_settle.js +330 -0
- package/dist/cli-delegate/cmd_conformance.js +483 -817
- package/dist/cli-delegate/cmd_doctor.js +26 -16
- package/dist/cli-delegate/cmd_doctor_neighbours.js +10 -7
- package/dist/cli-delegate/cmd_explain.js +9 -24
- package/dist/cli-delegate/cmd_export.js +14 -11
- package/dist/cli-delegate/cmd_fleet.js +5 -3
- package/dist/cli-delegate/cmd_git_convention.js +8 -4
- package/dist/cli-delegate/cmd_handoff.js +79 -242
- package/dist/cli-delegate/cmd_mcp_available.js +1 -1
- package/dist/cli-delegate/cmd_memory_get.js +4 -2
- package/dist/cli-delegate/cmd_migrate.js +2 -2
- package/dist/cli-delegate/cmd_packs_active.js +2 -2
- package/dist/cli-delegate/cmd_preflight.js +7 -5
- package/dist/cli-delegate/cmd_prune.js +16 -13
- package/dist/cli-delegate/cmd_route_audit.js +11 -8
- package/dist/cli-delegate/cmd_route_explain.js +649 -16
- package/dist/cli-delegate/cmd_session_recycle.js +15 -6
- package/dist/cli-delegate/cmd_settings_check.js +2 -2
- package/dist/cli-delegate/cmd_settings_get.js +1 -1
- package/dist/cli-delegate/cmd_settings_migrate.js +14 -11
- package/dist/cli-delegate/cmd_settings_set.js +1 -1
- package/dist/cli-delegate/cmd_sync.js +16 -13
- package/dist/cli-delegate/cmd_uninstall.js +185 -31
- package/dist/cli-delegate/cmd_update.js +67 -3
- package/dist/cli-delegate/cmd_upgrade.js +38 -7
- package/dist/cli-delegate/cmd_validate.js +16 -13
- package/dist/cli-delegate/cmd_versions.js +1 -1
- package/dist/cli-delegate/dashboard_mode.js +1 -1
- package/dist/cli-delegate/gate_execute.js +4 -3
- package/dist/cli-delegate/roadmap_age.js +22 -0
- package/dist/cli-delegate/roadmap_gates.js +4 -3
- package/dist/cli-delegate/update_roadmap_progress.js +3 -2
- package/dist/cli-delegate/upgrade_unattended-VVL6JLSX.js +541 -0
- package/dist/discovery/deprecation-report.md +1 -1
- package/dist/discovery/discovery-manifest.json +373 -190
- package/dist/discovery/discovery-manifest.json.sha256 +1 -1
- package/dist/discovery/discovery-manifest.summary.md +5 -5
- package/dist/discovery/dormancy-report.md +1 -1
- package/dist/discovery/orphan-report.md +1 -1
- package/dist/discovery/packs.json +21 -16
- package/dist/discovery/trust-report.md +3 -3
- package/dist/discovery/workspaces.json +16 -11
- package/dist/hooks/chat_history.chunk.cjs +6852 -0
- package/dist/hooks/chat_history.chunk.cjs.sha256 +1 -0
- package/dist/hooks/dispatch.js +17506 -18692
- package/dist/hooks/dispatch.sha256 +1 -1
- package/dist/hooks/egress_engine.chunk.cjs +915 -0
- package/dist/hooks/egress_engine.chunk.cjs.sha256 +1 -0
- package/dist/hooks/svg_rules.chunk.cjs +281 -49
- package/dist/hooks/svg_rules.chunk.cjs.sha256 +1 -1
- package/dist/install/conflict.js +36 -6
- package/dist/install/conflictTracker.js +81 -7
- package/dist/install/detect.js +3 -3
- package/dist/install/hostPermissionsAdapter.js +106 -0
- package/dist/install/install.mjs +3117 -1949
- package/dist/install/installThinLayer.js +1 -1
- package/dist/install/manifestFiles.js +21 -0
- package/dist/install/noGoDenyRows.js +300 -0
- package/dist/install/noGoRules.js +368 -0
- package/dist/install/ownershipLedger.js +133 -0
- package/dist/install/plan.js +1 -1
- package/dist/install/preflight.js +39 -8
- package/dist/install/preserve.js +74 -12
- package/dist/install/recordedOwnership.js +88 -5
- package/dist/install/rule_scope.js +20 -3
- package/dist/install/stagedRuntime.js +455 -0
- package/dist/install/toolsArg.js +19 -0
- package/dist/install/userPin.js +47 -0
- package/dist/install/wizard-plan.js +26 -4
- package/dist/mcp/awesome-mcp-servers.row.md +1 -1
- package/dist/mcp/mcp-cloudflare-catalogue.json +3 -2
- package/dist/mcp/registry-manifest.json +6 -5
- package/dist/mcp/server.json +3 -3
- package/dist/mcp/server.mjs +9831 -5546
- package/dist/router.json +1 -1
- package/dist/scripts/_lib/agent_settings.js +7 -12
- package/dist/scripts/_lib/asset_render_record.js +219 -0
- package/dist/scripts/_lib/claude_builtin_names.js +9 -4
- package/dist/scripts/_lib/claude_settings_hooks.js +102 -34
- package/dist/scripts/_lib/egress_rules.js +766 -0
- package/dist/scripts/_lib/environment_detector.js +24 -33
- package/dist/scripts/_lib/global_deploy_inventory.js +146 -9
- package/dist/scripts/_lib/guidelines_lane.js +10 -1
- package/dist/scripts/_lib/identifier_redaction.js +24 -0
- package/dist/scripts/_lib/installed_layer.js +17 -0
- package/dist/scripts/_lib/installed_layer_normalise.js +72 -0
- package/dist/scripts/_lib/lean_projection_mode.js +34 -152
- package/dist/scripts/_lib/project_tree_form.js +118 -0
- package/dist/scripts/_lib/scoped_projection.js +133 -3
- package/dist/scripts/_lib/settings_removed_keys.js +29 -0
- package/dist/scripts/_lib/settings_renamed_keys.js +17 -5
- package/dist/scripts/_lib/subagent_native_fields.js +35 -0
- package/dist/scripts/_lib/svg_filled_counter.js +285 -0
- package/dist/scripts/_lib/svg_rules.js +2 -0
- package/dist/scripts/_lib/ui_surface.js +19 -0
- package/dist/scripts/_lib/verification_command.js +364 -0
- package/dist/scripts/_lib/workspace_secrets.js +229 -0
- package/dist/scripts/ai_council/seat_policy.js +27 -0
- package/dist/scripts/ai_council/transport_resolver.js +9 -10
- package/dist/scripts/condense.js +25 -29
- package/dist/server/io/substituteTemplate.js +2 -2
- package/dist/server/io/yamlIO.js +2 -2
- package/dist/server/routes/install.js +5 -1
- package/dist/server/routes/settings.js +2 -2
- package/dist/server/routes/wizard.js +1 -1
- package/dist/server/schemas/settings.js +22 -16
- package/dist/server/serverInfo.js +1 -1
- package/dist/shared/brandTokenDocument.js +47 -0
- package/dist/shared/brandTokenPaths.js +43 -0
- package/dist/shared/settingsCarveOut.js +0 -7
- package/dist/shared/skillRanking.js +103 -5
- package/dist/shared/userMd/formAdapter.js +16 -0
- package/dist/shared/userMd/schema.js +17 -0
- package/dist/ui/assets/index-w70Ado09.js +23 -0
- package/dist/ui/index.html +1 -1
- package/docs/MIGRATION.md +89 -2
- package/docs/THIRD-PARTY-NOTICES.md +27 -0
- package/docs/contracts/settings-classes.md +27 -9
- package/docs/guidelines/agent-infra/api-cost-levers.md +4 -3
- package/docs/guidelines/agent-infra/model-recommendation.md +11 -5
- package/docs/guidelines/agent-infra/rule-body-migration-inventory.md +1 -1
- package/docs/guidelines/agent-infra/self-improvement-pipeline.md +47 -24
- package/docs/guidelines/design-antipatterns.md +5 -0
- package/docs/guidelines/design-asset-discipline.md +17 -0
- package/docs/guidelines/design-fidelity-routing.md +1 -0
- package/docs/guidelines/php/api-design.md +10 -1
- package/llms.txt +12 -10
- package/package.json +13 -4
- package/src/agent-src/scripts/dashboard_mode.ts +4 -1
- package/src/agent-src/scripts/roadmap_age.ts +175 -0
- package/src/agent-src/scripts/update_roadmap_progress.ts +10 -2
- package/src/agent-src/templates/AGENTS.md +1 -1
- package/src/agent-src/templates/scripts/check_memory.ts +2 -2
- package/src/agent-src/templates/scripts/historical-bug-patterns.example.yml +13 -1
- package/src/agent-src/templates/scripts/work_engine/cli.ts +17 -0
- package/src/agent-src/templates/scripts/work_engine/cli_args.ts +10 -0
- package/src/agent-src/templates/scripts/work_engine/directives/ui/scaffold.ts +22 -13
- package/src/agent-src/templates/scripts/work_engine/dispatcher.ts +18 -4
- package/src/agent-src/templates/scripts/work_engine/procedure/checks.ts +283 -0
- package/src/agent-src/templates/scripts/work_engine/procedure/run.ts +432 -0
- package/src/agent-src/templates/scripts/work_engine/procedure/sidecar.ts +185 -0
- package/src/agent-src/templates/scripts/work_engine/state.ts +3 -0
- package/src/config/agent-settings.template.yml +120 -57
- package/src/config/agents-paths.yml +13 -7
- package/src/config/ci-local-parity.yml +44 -0
- package/src/config/continuity-surface.json +51 -2
- package/src/config/depth-audit-samples.json +5 -0
- package/src/config/discovery/command-verbs.yml +1 -0
- package/src/config/dispatch-economy-metrics.json +1 -0
- package/src/config/egress-mutations/class-precedence-swapped.json +7 -0
- package/src/config/egress-mutations/credential-token-restores.json +7 -0
- package/src/config/egress-mutations/iban-checksum-disabled.json +7 -0
- package/src/config/egress-mutations/raw-value-in-the-count-record.json +7 -0
- package/src/config/evaluator-budgets.json +4 -4
- package/src/config/gate-coverage.yml +149 -3
- package/src/config/gate-reachability-exemptions.json +3 -5
- package/src/config/gate-violation-baselines.json +26 -22
- package/src/config/gitignore-block.txt +6 -3
- package/src/config/hook-bundle-budget.json +34 -3
- package/src/config/hook-carrier-probes.json +30 -0
- package/src/config/hook-latency-budget.json +4 -2
- package/src/config/host-injection-effect.json +8 -1
- package/src/config/host-skill-frontmatter-keys.json +56 -0
- package/src/config/layer-form-brakes.json +4 -0
- package/src/config/layer-form-comparison-corpus.json +42 -0
- package/src/config/loop-surfaces.yaml +28 -47
- package/src/config/memory-twin-verdicts.yml +9 -1
- package/src/config/metric-registry.yml +40 -3
- package/src/config/pack-size-budget.json +15 -0
- package/src/config/procedure-core-budget.json +21 -0
- package/src/config/profiles/minimal.ini +1 -1
- package/src/config/project-tree-form.json +24 -0
- package/src/config/reach-channels.yml +3 -3
- package/src/config/reach-prescriptions-intake.yml +1 -1
- package/src/config/roadmap-step-size-baseline.json +118 -0
- package/src/config/routing-coverage-seed.json +93 -2
- package/src/config/skill-body-budget.json +686 -0
- package/src/config/skill-fork-pilot.json +17 -0
- package/src/config/skill-lifecycle-probes-codex.json +57 -0
- package/src/config/skill-lifecycle-probes.json +57 -0
- package/src/config/skill-output-shape.json +316 -0
- package/src/config/step-depth-table.json +58 -0
- package/src/config/turnaround-budget.json +90 -0
- package/src/install/conflict.ts +38 -6
- package/src/install/conflictTracker.ts +126 -8
- package/src/install/detect.ts +3 -3
- package/src/install/hostPermissionsAdapter.ts +136 -0
- package/src/install/installThinLayer.ts +6 -1
- package/src/install/manifestFiles.ts +24 -0
- package/src/install/noGoDenyRows.ts +368 -0
- package/src/install/noGoRules.ts +438 -0
- package/src/install/ownershipLedger.ts +180 -0
- package/src/install/plan.ts +1 -1
- package/src/install/preflight.ts +42 -10
- package/src/install/preserve.ts +94 -12
- package/src/install/recordedOwnership.ts +121 -3
- package/src/install/rule_scope.ts +20 -3
- package/src/install/stagedRuntime.ts +528 -0
- package/src/install/toolsArg.ts +16 -0
- package/src/install/types.ts +23 -2
- package/src/install/userPin.ts +54 -0
- package/src/install/wizard-plan.ts +25 -4
- package/src/scripts/_cli/_doctor_emit.ts +24 -0
- package/src/scripts/_cli/cmd_brand_status.ts +223 -12
- package/src/scripts/_cli/cmd_ci_settle.ts +32 -0
- package/src/scripts/_cli/cmd_doctor.ts +23 -44
- package/src/scripts/_cli/cmd_route_explain.ts +176 -2
- package/src/scripts/_cli/cmd_uninstall.ts +270 -26
- package/src/scripts/_cli/cmd_update.ts +34 -1
- package/src/scripts/_cli/cmd_upgrade.ts +38 -2
- package/src/scripts/_cli/detection_report.ts +7 -0
- package/src/scripts/_cli/doctor_execution.ts +1 -2
- package/src/scripts/_cli/doctor_install_mode.ts +39 -0
- package/src/scripts/_cli/doctor_network_posture.ts +3 -3
- package/src/scripts/_cli/doctor_ownership_ledger.ts +126 -0
- package/src/scripts/_cli/doctor_update_verdict.ts +104 -0
- package/src/scripts/_cli/explain_last/scrubber.ts +9 -21
- package/src/scripts/_cli/upgrade_unattended.ts +548 -0
- package/src/scripts/_dispatch.bash +42 -9
- package/src/scripts/_lib/activation_ladder.ts +1 -1
- package/src/scripts/_lib/advisory_inventory.ts +405 -0
- package/src/scripts/_lib/advisory_notice.ts +270 -0
- package/src/scripts/_lib/advisory_sources.ts +752 -0
- package/src/scripts/_lib/advisory_verdicts.ts +363 -0
- package/src/scripts/_lib/agent_artifact_location.ts +177 -0
- package/src/scripts/_lib/agent_settings.ts +7 -12
- package/src/scripts/_lib/arrival_record.ts +217 -0
- package/src/scripts/_lib/asset_render_record.ts +247 -0
- package/src/scripts/_lib/billing_grant.ts +4 -2
- package/src/scripts/_lib/brand_voice_slot.ts +258 -0
- package/src/scripts/_lib/canary_status.ts +24 -0
- package/src/scripts/_lib/cc_transcript.ts +276 -0
- package/src/scripts/_lib/changelog_eras.ts +83 -0
- package/src/scripts/_lib/claim_phrases.ts +71 -0
- package/src/scripts/_lib/classify_update.ts +171 -0
- package/src/scripts/_lib/claude_builtin_names.ts +9 -4
- package/src/scripts/_lib/claude_hook_scope.ts +195 -0
- package/src/scripts/_lib/claude_settings_hooks.ts +118 -34
- package/src/scripts/_lib/codex_resident_set.ts +460 -0
- package/src/scripts/_lib/codex_skill_finder.ts +225 -0
- package/src/scripts/_lib/confusables.ts +19 -0
- package/src/scripts/_lib/consumer_impact.ts +199 -0
- package/src/scripts/_lib/content_class.ts +127 -0
- package/src/scripts/_lib/counted_probe.ts +68 -1
- package/src/scripts/_lib/credential_deny_rows.ts +151 -0
- package/src/scripts/_lib/credential_files.ts +367 -0
- package/src/scripts/_lib/delivery_arm_experiment.ts +2 -2
- package/src/scripts/_lib/depth_flip.ts +141 -0
- package/src/scripts/_lib/design_lock.ts +117 -0
- package/src/scripts/_lib/design_sync_ledger.ts +142 -0
- package/src/scripts/_lib/design_sync_plan.ts +177 -0
- package/src/scripts/_lib/design_sync_reconcile.ts +159 -0
- package/src/scripts/_lib/design_sync_verify.ts +99 -0
- package/src/scripts/_lib/design_system_claude_design.ts +323 -0
- package/src/scripts/_lib/design_system_import.ts +84 -6
- package/src/scripts/_lib/dispatch_import_closure.ts +42 -11
- package/src/scripts/_lib/egress_credential_env.ts +35 -0
- package/src/scripts/_lib/egress_engine.ts +22 -0
- package/src/scripts/_lib/egress_known_values.ts +223 -0
- package/src/scripts/_lib/egress_normalize.ts +67 -0
- package/src/scripts/_lib/egress_prefixes.ts +42 -0
- package/src/scripts/_lib/egress_rules.ts +896 -0
- package/src/scripts/_lib/egress_rules_linearity.ts +56 -0
- package/src/scripts/_lib/egress_sender_scan.ts +290 -0
- package/src/scripts/_lib/egress_session_table.ts +510 -0
- package/src/scripts/_lib/egress_text.ts +63 -0
- package/src/scripts/_lib/egress_token.ts +252 -0
- package/src/scripts/_lib/empty_cycles.ts +1 -1
- package/src/scripts/_lib/environment_detector.ts +45 -30
- package/src/scripts/_lib/exemption_shape.ts +75 -1
- package/src/scripts/_lib/floor_posture.ts +185 -0
- package/src/scripts/_lib/forge_protection.ts +140 -2
- package/src/scripts/_lib/global_deploy_inventory.ts +159 -6
- package/src/scripts/_lib/guidelines_lane.ts +12 -1
- package/src/scripts/_lib/hand_kinds.ts +65 -0
- package/src/scripts/_lib/headless_invocation.ts +3 -3
- package/src/scripts/_lib/host_capability.ts +34 -2
- package/src/scripts/_lib/host_env_write.ts +39 -18
- package/src/scripts/_lib/host_listing_model.ts +14 -7
- package/src/scripts/_lib/identifier_redaction.ts +26 -0
- package/src/scripts/_lib/impact_bump.ts +70 -0
- package/src/scripts/_lib/install_reach_checks.ts +53 -1
- package/src/scripts/_lib/installed_layer.ts +31 -0
- package/src/scripts/_lib/installed_layer_normalise.ts +75 -0
- package/src/scripts/_lib/instructions_loaded_classify.ts +75 -0
- package/src/scripts/_lib/instructions_loaded_event.ts +53 -0
- package/src/scripts/_lib/knowledge_global_redaction.ts +2 -2
- package/src/scripts/_lib/layer_form_corpus.ts +165 -0
- package/src/scripts/_lib/layer_form_decision.ts +248 -0
- package/src/scripts/_lib/layer_form_evidence.ts +112 -0
- package/src/scripts/_lib/lean_projection_mode.ts +32 -161
- package/src/scripts/_lib/llm_proposer_transport.ts +1 -0
- package/src/scripts/_lib/loop_guards.ts +8 -120
- package/src/scripts/_lib/major_surface.ts +207 -0
- package/src/scripts/_lib/mcp_bridge.ts +30 -69
- package/src/scripts/_lib/merge_clearance_record.ts +384 -0
- package/src/scripts/_lib/neighbour_census.ts +18 -1
- package/src/scripts/_lib/orchestration_record.ts +61 -0
- package/src/scripts/_lib/outcome_vocabularies.ts +15 -23
- package/src/scripts/_lib/pin_advice.ts +49 -0
- package/src/scripts/_lib/platform_anchor.ts +222 -0
- package/src/scripts/_lib/procedure_checks.ts +5 -0
- package/src/scripts/_lib/project_tree_form.ts +134 -0
- package/src/scripts/_lib/projection_key_migration.ts +122 -0
- package/src/scripts/_lib/prompt_shape.ts +13 -2
- package/src/scripts/_lib/provenance_verify.ts +272 -0
- package/src/scripts/_lib/quota_parked.ts +27 -1
- package/src/scripts/_lib/ratification_artifact.ts +64 -1
- package/src/scripts/_lib/ratification_subject.ts +508 -46
- package/src/scripts/_lib/release_findings_ingest.ts +52 -5
- package/src/scripts/_lib/release_highlights.ts +72 -2
- package/src/scripts/_lib/release_settings_surface.ts +392 -0
- package/src/scripts/_lib/review_round.ts +134 -0
- package/src/scripts/_lib/roadmap_checkboxes.ts +1 -1
- package/src/scripts/_lib/roadmap_slug_lock.ts +254 -0
- package/src/scripts/_lib/roadmap_step_size.ts +75 -0
- package/src/scripts/_lib/run_checkpoint.ts +60 -3
- package/src/scripts/_lib/runtime_wiring_checks.ts +15 -1
- package/src/scripts/_lib/scope_guard.sh +64 -5
- package/src/scripts/_lib/scoped_projection.ts +136 -3
- package/src/scripts/_lib/secret_detector.ts +24 -103
- package/src/scripts/_lib/security_fix.ts +429 -0
- package/src/scripts/_lib/security_fix_context.ts +133 -0
- package/src/scripts/_lib/self_repair.ts +69 -39
- package/src/scripts/_lib/self_repair_outgoing.ts +209 -0
- package/src/scripts/_lib/self_repair_payload.ts +86 -0
- package/src/scripts/_lib/session_eol.ts +3 -0
- package/src/scripts/_lib/session_pr_watch.ts +207 -0
- package/src/scripts/_lib/session_register.ts +51 -1
- package/src/scripts/_lib/session_tag.ts +51 -0
- package/src/scripts/_lib/settings_removed_keys.ts +30 -0
- package/src/scripts/_lib/settings_renamed_keys.ts +19 -5
- package/src/scripts/_lib/skill_catalogue.ts +66 -25
- package/src/scripts/_lib/skill_fork_pilot.ts +121 -0
- package/src/scripts/_lib/skill_leases.ts +203 -0
- package/src/scripts/_lib/skill_listing_overrides.ts +294 -0
- package/src/scripts/_lib/skill_materialisation.ts +388 -0
- package/src/scripts/_lib/skill_materialisation_gate.ts +210 -0
- package/src/scripts/_lib/skill_materialisation_lock.ts +149 -0
- package/src/scripts/_lib/skill_materialisation_triggers.ts +96 -0
- package/src/scripts/_lib/skill_origin.ts +21 -1
- package/src/scripts/_lib/skill_reach.ts +342 -0
- package/src/scripts/_lib/source_shape.ts +7 -2
- package/src/scripts/_lib/sqlite_guard.ts +1 -1
- package/src/scripts/_lib/step_anatomy.ts +330 -0
- package/src/scripts/_lib/subagent_capsule.ts +8 -2
- package/src/scripts/_lib/subagent_native_fields.ts +30 -0
- package/src/scripts/_lib/subagent_spawn.ts +36 -0
- package/src/scripts/_lib/subagent_steering.ts +367 -0
- package/src/scripts/_lib/svg_filled_counter.ts +287 -0
- package/src/scripts/_lib/svg_rules.ts +2 -0
- package/src/scripts/_lib/test_delta.ts +89 -6
- package/src/scripts/_lib/tier_downshift_verdict.ts +222 -0
- package/src/scripts/_lib/tool_result_census.ts +62 -0
- package/src/scripts/_lib/trigger_routers.ts +1 -0
- package/src/scripts/_lib/turnaround_throughput.ts +378 -0
- package/src/scripts/_lib/ui_surface.ts +22 -0
- package/src/scripts/_lib/unattended_gates.ts +100 -0
- package/src/scripts/_lib/undeployed_fixes.ts +34 -0
- package/src/scripts/_lib/update_check.ts +143 -12
- package/src/scripts/_lib/update_invite.ts +116 -0
- package/src/scripts/_lib/update_notice.ts +259 -0
- package/src/scripts/_lib/verify_clause.ts +4 -2
- package/src/scripts/_lib/version_order.ts +146 -0
- package/src/scripts/_lib/worker_reuse.ts +191 -0
- package/src/scripts/_lib/workspace_secrets.ts +273 -0
- package/src/scripts/_lib/worktree_git.ts +67 -0
- package/src/scripts/_lib/worktree_ignored.ts +116 -0
- package/src/scripts/adoption_status.ts +330 -3
- package/src/scripts/adr_cite_check.ts +93 -0
- package/src/scripts/advisories.ts +803 -0
- package/src/scripts/ai-image/adapters/flux.sh +1 -0
- package/src/scripts/ai-image/adapters/gemini-image.sh +1 -0
- package/src/scripts/ai-image/adapters/ideogram.sh +1 -0
- package/src/scripts/ai-image/adapters/recraft.sh +1 -0
- package/src/scripts/ai-video/adapters/comfyui.sh +1 -0
- package/src/scripts/ai-video/adapters/fal.sh +1 -0
- package/src/scripts/ai-video/adapters/gemini-veo.sh +1 -0
- package/src/scripts/ai-video/adapters/higgsfield.sh +1 -0
- package/src/scripts/ai-video/adapters/kling.sh +1 -0
- package/src/scripts/ai-video/adapters/musetalk.sh +1 -0
- package/src/scripts/ai-video/adapters/openai-images.sh +1 -0
- package/src/scripts/ai-video/adapters/replicate.sh +1 -0
- package/src/scripts/ai-video/adapters/sora.sh +1 -0
- package/src/scripts/ai-video/adapters/syncso.sh +1 -0
- package/src/scripts/ai-video/stitch.sh +115 -2
- package/src/scripts/ai_council/airgap.ts +1 -0
- package/src/scripts/ai_council/api_transport.ts +27 -4
- package/src/scripts/ai_council/budget_guard.ts +300 -11
- package/src/scripts/ai_council/bundler.ts +20 -29
- package/src/scripts/ai_council/chairman.ts +17 -2
- package/src/scripts/ai_council/cli_agency_bounds.ts +158 -0
- package/src/scripts/ai_council/cli_launch_env.ts +54 -0
- package/src/scripts/ai_council/cli_least_agency_canary.ts +18 -2
- package/src/scripts/ai_council/clients.ts +55 -73
- package/src/scripts/ai_council/config.ts +16 -22
- package/src/scripts/ai_council/council_egress.ts +167 -0
- package/src/scripts/ai_council/exposure_ledger.ts +117 -0
- package/src/scripts/ai_council/free_hand_shadow.ts +276 -0
- package/src/scripts/ai_council/free_route.ts +216 -0
- package/src/scripts/ai_council/free_route_catalog.ts +173 -0
- package/src/scripts/ai_council/free_route_client.ts +95 -0
- package/src/scripts/ai_council/free_rung.ts +61 -0
- package/src/scripts/ai_council/hand_payload.ts +230 -0
- package/src/scripts/ai_council/hand_schemas.ts +123 -0
- package/src/scripts/ai_council/jury_aggregate.ts +155 -1
- package/src/scripts/ai_council/kind_flip.ts +221 -0
- package/src/scripts/ai_council/kind_flip_state.ts +19 -0
- package/src/scripts/ai_council/learn_low_impact_preview.ts +50 -22
- package/src/scripts/ai_council/modification_review.ts +98 -5
- package/src/scripts/ai_council/necessity.ts +7 -0
- package/src/scripts/ai_council/orchestrator.ts +16 -16
- package/src/scripts/ai_council/pricing.ts +10 -0
- package/src/scripts/ai_council/redact_low_impact_entry.ts +5 -2
- package/src/scripts/ai_council/response_render.ts +27 -4
- package/src/scripts/ai_council/round_reservations.ts +119 -0
- package/src/scripts/ai_council/route_chooser.ts +161 -0
- package/src/scripts/ai_council/route_liveness.ts +152 -0
- package/src/scripts/ai_council/route_member.ts +52 -0
- package/src/scripts/ai_council/seat_policy.ts +40 -0
- package/src/scripts/ai_council/seat_resume.ts +40 -0
- package/src/scripts/ai_council/shadow_dispatch.ts +13 -3
- package/src/scripts/ai_council/spend_gate.ts +18 -2
- package/src/scripts/ai_council/status_surface.ts +37 -0
- package/src/scripts/ai_council/transport_resolver.ts +15 -18
- package/src/scripts/analysis_analysts.ts +226 -0
- package/src/scripts/analysis_anchors.ts +140 -0
- package/src/scripts/analysis_and_optimize.ts +44 -0
- package/src/scripts/analysis_emit.ts +150 -0
- package/src/scripts/analysis_exchange.ts +186 -0
- package/src/scripts/analysis_gate.ts +158 -0
- package/src/scripts/analysis_inbox_final.ts +173 -0
- package/src/scripts/analysis_ledger.ts +119 -0
- package/src/scripts/analysis_pr_optimize.ts +219 -0
- package/src/scripts/analysis_pr_review.ts +240 -0
- package/src/scripts/analysis_pr_target.ts +121 -0
- package/src/scripts/analysis_prompts.ts +130 -0
- package/src/scripts/analysis_publish.ts +358 -0
- package/src/scripts/analysis_questions.ts +78 -0
- package/src/scripts/analysis_run.ts +248 -0
- package/src/scripts/analysis_run_record.ts +210 -0
- package/src/scripts/analysis_target.ts +343 -0
- package/src/scripts/analysis_validate.ts +161 -0
- package/src/scripts/anchor_eval_falsify.ts +1 -1
- package/src/scripts/arrival_report.ts +115 -0
- package/src/scripts/ask_transport.ts +284 -35
- package/src/scripts/backfill_model_tier.ts +4 -5
- package/src/scripts/before_complete_hook.ts +48 -2
- package/src/scripts/bench_hook_latency.ts +3 -3
- package/src/scripts/bench_procedure_cursor.ts +440 -0
- package/src/scripts/bootstrap.sh +3 -3
- package/src/scripts/build_exit_code_register.ts +440 -0
- package/src/scripts/build_proof.ts +23 -1
- package/src/scripts/cache_realization_report.ts +155 -14
- package/src/scripts/canary_liveness.ts +117 -0
- package/src/scripts/chat_history.ts +12 -15
- package/src/scripts/check_account_surface.ts +318 -0
- package/src/scripts/check_agent_artifact_location.ts +17 -160
- package/src/scripts/check_bundle_path_leakage.ts +6 -0
- package/src/scripts/check_ci_local_parity.ts +21 -13
- package/src/scripts/check_claims.ts +77 -2
- package/src/scripts/check_completion_review.ts +34 -1
- package/src/scripts/check_concern_admissions.ts +41 -5
- package/src/scripts/check_consumer_scope_flip.ts +1 -1
- package/src/scripts/check_context_paths.ts +2 -0
- package/src/scripts/check_council_layout.ts +9 -0
- package/src/scripts/check_credential_spelling.ts +267 -0
- package/src/scripts/check_egress_mutations.ts +239 -0
- package/src/scripts/check_enforcement_coverage.ts +16 -3
- package/src/scripts/check_estate_count.ts +16 -1
- package/src/scripts/check_finding_dispositions.ts +147 -0
- package/src/scripts/check_gate_coverage.ts +123 -21
- package/src/scripts/check_gate_reachability.ts +16 -2
- package/src/scripts/check_generator_sync.ts +46 -0
- package/src/scripts/check_hook_bundle_composition.ts +139 -1
- package/src/scripts/check_host_docs_digest.ts +142 -5
- package/src/scripts/check_kernel_edit_ratified.ts +301 -76
- package/src/scripts/check_kernel_rule_bundle.ts +14 -10
- package/src/scripts/check_knowledge_cards.ts +83 -3
- package/src/scripts/check_memory.ts +13 -3
- package/src/scripts/check_pack_size.ts +1 -1
- package/src/scripts/check_permission_deny_syntax.ts +247 -0
- package/src/scripts/check_platform_anchor.ts +243 -0
- package/src/scripts/check_proposal.ts +183 -1
- package/src/scripts/check_reach_channels.ts +5 -3
- package/src/scripts/check_references.ts +5 -2
- package/src/scripts/check_release_manifest_content.ts +33 -0
- package/src/scripts/check_release_pr_shape.ts +5 -0
- package/src/scripts/check_rule_invariants.ts +9 -1
- package/src/scripts/check_skill_body_budget.ts +343 -0
- package/src/scripts/check_skill_requires.ts +137 -1
- package/src/scripts/check_step_receipts.ts +246 -0
- package/src/scripts/check_structural_breaking.ts +7 -1
- package/src/scripts/check_suppression_hygiene.ts +8 -0
- package/src/scripts/check_test_weakening.ts +14 -0
- package/src/scripts/check_token_quality_golden.ts +5 -1
- package/src/scripts/check_update_banner.ts +50 -3
- package/src/scripts/check_verify_expectation_delta.ts +2 -1
- package/src/scripts/check_voice_lexicon.ts +531 -0
- package/src/scripts/ci_os_attribution.ts +327 -0
- package/src/scripts/ci_platform_scope.ts +69 -0
- package/src/scripts/ci_settle.ts +4 -1
- package/src/scripts/ci_status.ts +0 -1
- package/src/scripts/ci_time_to_green.ts +748 -0
- package/src/scripts/classify_merge_risk.ts +407 -19
- package/src/scripts/code_graph/sqlite_store.ts +1 -1
- package/src/scripts/compile_trigger_evals.ts +353 -0
- package/src/scripts/condense.ts +25 -31
- package/src/scripts/consumer_matrix.ts +61 -3
- package/src/scripts/council_availability_hook.ts +12 -4
- package/src/scripts/council_cli.ts +48 -38
- package/src/scripts/cross_repo_retrieve.ts +9 -72
- package/src/scripts/design_lock.ts +106 -0
- package/src/scripts/design_slop_rules.ts +30 -0
- package/src/scripts/design_sync.ts +264 -0
- package/src/scripts/design_system_import.ts +30 -13
- package/src/scripts/dispatch_economy_report.ts +46 -1
- package/src/scripts/dispatch_r2_reviewer.ts +41 -5
- package/src/scripts/egress_canary.ts +166 -0
- package/src/scripts/egress_sender_census.ts +101 -0
- package/src/scripts/external_sources_denylist.json +94 -12
- package/src/scripts/generate_catalog.ts +6 -2
- package/src/scripts/generate_owned_digest.ts +163 -0
- package/src/scripts/generate_reference_toc.ts +143 -0
- package/src/scripts/generate_subagent_floor.ts +11 -1
- package/src/scripts/handoff_context_hook.ts +34 -0
- package/src/scripts/hook_carrier_census.ts +263 -0
- package/src/scripts/hook_chunks.d.mts +12 -0
- package/src/scripts/hook_chunks.mjs +114 -0
- package/src/scripts/hook_manifest.json +1 -1
- package/src/scripts/hook_manifest.yaml +65 -42
- package/src/scripts/hooks/block_config_weakening.ts +127 -3
- package/src/scripts/hooks/block_credential_reads.ts +165 -0
- package/src/scripts/hooks/block_no_verify.ts +47 -23
- package/src/scripts/hooks/block_speaking_inbox_dir.ts +38 -7
- package/src/scripts/hooks/category_a.ts +202 -25
- package/src/scripts/hooks/concern_failure_policy.ts +6 -6
- package/src/scripts/hooks/concern_registry.ts +31 -6
- package/src/scripts/hooks/concern_registry_types.ts +11 -0
- package/src/scripts/hooks/delegation_nudge_hook.ts +105 -15
- package/src/scripts/hooks/design_pass_hook.ts +42 -10
- package/src/scripts/hooks/dispatch_hook.ts +13 -12
- package/src/scripts/hooks/egress_engine_loader.ts +125 -0
- package/src/scripts/hooks/egress_stage.ts +440 -0
- package/src/scripts/hooks/hook_stdin.ts +29 -4
- package/src/scripts/hooks/host_docs_pages.ts +194 -0
- package/src/scripts/hooks/host_docs_pages.yaml +75 -0
- package/src/scripts/hooks/host_lowering.json +1 -1
- package/src/scripts/hooks/host_lowering.yaml +22 -21
- package/src/scripts/hooks/host_rate_marker_hook.ts +73 -0
- package/src/scripts/hooks/instructions_observer_hook.ts +170 -0
- package/src/scripts/hooks/interruption_ledger_hook.ts +1 -1
- package/src/scripts/hooks/lazy_concern.ts +148 -0
- package/src/scripts/hooks/orchestration_record_hook.ts +80 -2
- package/src/scripts/hooks/payload_stub.ts +16 -6
- package/src/scripts/hooks/permission_gate.ts +7 -7
- package/src/scripts/hooks/push_settle_hook.ts +32 -3
- package/src/scripts/hooks/replay_hook.ts +43 -0
- package/src/scripts/hooks/reread_guard_hook.ts +87 -10
- package/src/scripts/hooks/rtk_wrap_hook.ts +4 -3
- package/src/scripts/hooks/rule_inject_hook.ts +8 -1
- package/src/scripts/hooks/session_eol_hook.ts +48 -1
- package/src/scripts/hooks/source_first_gate_hook.ts +6 -8
- package/src/scripts/hooks/spawn_guard_shadow_hook.ts +203 -10
- package/src/scripts/hooks/state_io.ts +2 -2
- package/src/scripts/hooks/svg_obligation.ts +75 -19
- package/src/scripts/hooks/tool_result_bytes_hook.ts +14 -5
- package/src/scripts/hooks/turn_end_gate_hook.ts +1 -1
- package/src/scripts/hooks/ui_route_nudge_hook.ts +2 -12
- package/src/scripts/hooks_doctor.ts +31 -0
- package/src/scripts/hooks_status.ts +58 -3
- package/src/scripts/inbox_source_census.ts +74 -13
- package/src/scripts/install +25 -3
- package/src/scripts/install.ts +60 -91
- package/src/scripts/interruption_report.ts +11 -1
- package/src/scripts/layer_baseline_report.ts +267 -0
- package/src/scripts/learning_sidecar.ts +1 -1
- package/src/scripts/lint_agents_layout.ts +3 -0
- package/src/scripts/lint_blocker_citations.ts +104 -0
- package/src/scripts/lint_breaking_changes_index.ts +40 -7
- package/src/scripts/lint_consolidation_lineage.ts +144 -16
- package/src/scripts/lint_consumer_internal_refs.ts +90 -42
- package/src/scripts/lint_context_spine_usage.ts +21 -0
- package/src/scripts/lint_design_antipattern_parity.ts +39 -7
- package/src/scripts/lint_evidence_artifacts.ts +31 -0
- package/src/scripts/lint_example_fences.ts +11 -2
- package/src/scripts/lint_ghostwriter_source.ts +42 -10
- package/src/scripts/lint_hook_manifest.ts +94 -0
- package/src/scripts/lint_marketplace_install_completeness.ts +4 -0
- package/src/scripts/lint_mcp_config_security.ts +9 -11
- package/src/scripts/lint_plan_risk_register.ts +28 -1
- package/src/scripts/lint_positioning.ts +4 -4
- package/src/scripts/lint_provenance.ts +1 -0
- package/src/scripts/lint_roadmap_blockers.ts +65 -4
- package/src/scripts/lint_roadmap_complexity.ts +98 -0
- package/src/scripts/lint_skill_link_reach.ts +251 -9
- package/src/scripts/lint_skill_procedures.ts +252 -0
- package/src/scripts/lint_skill_scripts_readonly.ts +12 -1
- package/src/scripts/lint_subagent_determinism.ts +14 -1
- package/src/scripts/lint_ticked_unmet_criteria.ts +300 -21
- package/src/scripts/mcp_registry_submit.sh +2 -2
- package/src/scripts/mcp_server/consumer_tool_catalog.json +4 -4
- package/src/scripts/mcp_server/suggest_skill.ts +89 -4
- package/src/scripts/mcp_server/tools.ts +2 -33
- package/src/scripts/measure_skill_ranker_baseline.ts +203 -5
- package/src/scripts/measure_turn_end_gate.ts +61 -1
- package/src/scripts/merge_clearance.ts +225 -0
- package/src/scripts/migrate_command_suggestions.ts +1 -1
- package/src/scripts/network_sources.ts +236 -0
- package/src/scripts/no_go_deny_rows.ts +225 -0
- package/src/scripts/orchestration_record.ts +15 -2
- package/src/scripts/plan_test_shards.ts +103 -0
- package/src/scripts/pr_url_reminder_hook.ts +10 -0
- package/src/scripts/print_required_checks.ts +5 -5
- package/src/scripts/probe_depth_shadow.ts +406 -0
- package/src/scripts/probe_turnaround.ts +342 -10
- package/src/scripts/ratification_subject.ts +176 -0
- package/src/scripts/rdp_gate_classify.ts +1 -0
- package/src/scripts/rdp_quality_eval.ts +1 -0
- package/src/scripts/release.ts +26 -55
- package/src/scripts/release_drill.ts +52 -23
- package/src/scripts/release_env.ts +37 -0
- package/src/scripts/release_publication.ts +11 -1
- package/src/scripts/report_consumer_gate_reach.ts +233 -0
- package/src/scripts/report_merge_gate_load.ts +295 -0
- package/src/scripts/report_project_contract.ts +123 -0
- package/src/scripts/report_reducible_classes.ts +342 -0
- package/src/scripts/report_required_checks_drift.ts +5 -3
- package/src/scripts/report_skill_host_census.ts +199 -0
- package/src/scripts/report_standing_payload_by_host.ts +7 -7
- package/src/scripts/retro.ts +758 -0
- package/src/scripts/retro_facts.ts +575 -0
- package/src/scripts/retro_queue.ts +739 -0
- package/src/scripts/retro_session_facts.ts +218 -0
- package/src/scripts/retro_sweep.ts +493 -0
- package/src/scripts/retro_triage.ts +126 -0
- package/src/scripts/roadmap_context.ts +2 -2
- package/src/scripts/roadmap_drain_queue.ts +601 -0
- package/src/scripts/run_supervise.ts +24 -2
- package/src/scripts/schemas/agent-settings.schema.json +0 -16
- package/src/scripts/schemas/command.schema.json +3 -3
- package/src/scripts/schemas/review-findings.schema.json +8 -0
- package/src/scripts/schemas/skill.schema.json +7 -6
- package/src/scripts/schemas/subagent.schema.json +33 -2
- package/src/scripts/score_skill_selection.ts +5 -2
- package/src/scripts/second_brain_retrieval.ts +1 -0
- package/src/scripts/second_brain_run.ts +1 -0
- package/src/scripts/self_repair_cli.ts +563 -87
- package/src/scripts/self_review_gate.ts +59 -4
- package/src/scripts/session_register_hook.ts +91 -4
- package/src/scripts/sessions_cli.ts +100 -5
- package/src/scripts/skill_collision_clusters.ts +1 -1
- package/src/scripts/skill_tools/score_skill_relevance.ts +31 -2
- package/src/scripts/skill_trigger_eval.ts +4 -2
- package/src/scripts/source_adapters.ts +183 -0
- package/src/scripts/step_receipt.ts +100 -0
- package/src/scripts/sync_pr_branch.ts +4 -0
- package/src/scripts/test_council_qualification.ts +1 -1
- package/src/scripts/trigger_eval_grandfather.json +3 -49
- package/src/scripts/trigger_eval_rotation.ts +31 -3
- package/src/scripts/ui_conformance_probe.ts +405 -1
- package/src/scripts/update_counts.ts +230 -11
- package/src/scripts/update_invite_hook.ts +245 -0
- package/src/scripts/update_notice_hook.ts +298 -0
- package/src/scripts/validate_frontmatter.ts +85 -0
- package/src/scripts/worker_reuse_shadow_report.ts +121 -0
- package/src/scripts/worktree_cleanup_check.ts +915 -121
- package/src/server/io/yamlIO.ts +2 -2
- package/src/server/schemas/settings.ts +37 -23
- package/src/shared/brandTokenDocument.ts +46 -0
- package/src/shared/brandTokenPaths.ts +43 -0
- package/src/shared/settingsCarveOut.ts +0 -8
- package/src/shared/skillRanking.ts +106 -5
- package/src/shared/userMd/formAdapter.ts +15 -1
- package/src/shared/userMd/schema.ts +22 -0
- package/src/templates/agent-user.md +4 -0
- package/src/templates/agent-user.yml +4 -0
- package/dist/cli-delegate/chunk-4DBG5K7M.js +0 -1123
- package/dist/cli-delegate/chunk-523HCFYO.js +0 -90
- package/dist/cli-delegate/chunk-AL3RZ22D.js +0 -74
- package/dist/cli-delegate/chunk-KB5FZ655.js +0 -208
- package/dist/cli-delegate/chunk-MDPPKQCQ.js +0 -875
- package/dist/cli-delegate/chunk-OAFSJBHH.js +0 -272
- package/dist/ui/assets/index-C3djEJah.js +0 -23
- package/src/scripts/_lib/continuation_ladder.ts +0 -335
- package/src/scripts/hooks/run_continuation_hook.ts +0 -1524
|
@@ -0,0 +1,548 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `agent-config upgrade --unattended` — the safety envelope around the global
|
|
3
|
+
* upgrade, for a run nobody is watching.
|
|
4
|
+
*
|
|
5
|
+
* It installs only when every gate in `_lib/unattended_gates` passes, only one
|
|
6
|
+
* run at a time (a lock with a TTL and an owner PID), and only on the global
|
|
7
|
+
* surfaces: the binary, the global projection, the global settings file. It
|
|
8
|
+
* never reads the working directory, so it cannot move a project's
|
|
9
|
+
* `agent_config_version` pin or write into a repository.
|
|
10
|
+
*
|
|
11
|
+
* Any failed step restores the version that was installed before and reports
|
|
12
|
+
* the reason; the run then counts as a notification, not an install. `EACCES`
|
|
13
|
+
* prints the exact command for the user to run and never escalates.
|
|
14
|
+
*
|
|
15
|
+
* The production wiring refuses the swap while the machine-wide live-session
|
|
16
|
+
* register reports a running session (`activation_blocked_reason`), because the
|
|
17
|
+
* measured mid-session swap breaks running hooks. With no session live, every
|
|
18
|
+
* other gate still has to pass before anything installs.
|
|
19
|
+
*
|
|
20
|
+
* Exit codes: `0` installed, a dry run whose gates all passed, or `--skip`
|
|
21
|
+
* recorded · `3` refused (a gate — including no newer version — the lock, the
|
|
22
|
+
* registry, a live session) · `1` a step failed and the previous version was
|
|
23
|
+
* restored · `4` a step failed and the restore did not reach the previous version.
|
|
24
|
+
*/
|
|
25
|
+
import * as fs from 'node:fs';
|
|
26
|
+
import * as path from 'node:path';
|
|
27
|
+
import { spawnSync } from 'node:child_process';
|
|
28
|
+
import process from 'node:process';
|
|
29
|
+
|
|
30
|
+
import {
|
|
31
|
+
EXPECTED_WORKFLOW_REF,
|
|
32
|
+
attestation_workflow_ref,
|
|
33
|
+
provenance_matches_publish,
|
|
34
|
+
verify_attestation_signature,
|
|
35
|
+
} from '../_lib/provenance_verify.js';
|
|
36
|
+
import { read_candidate, unattended_decision, type RegistryCandidate } from '../_lib/unattended_gates.js';
|
|
37
|
+
import type { InstallOrigin } from '../_lib/classify_update.js';
|
|
38
|
+
import * as installed_lock from '../_lib/installed_lock.js';
|
|
39
|
+
import { any_live_session, global_register_dir } from '../_lib/session_register.js';
|
|
40
|
+
import { type EnvMap, event4u_root, write_target } from '../_lib/user_global_paths.js';
|
|
41
|
+
import { resolvePackageRoot } from '../_lib/package_root.js';
|
|
42
|
+
import { originForPackageRoot } from './doctor_install_mode.js';
|
|
43
|
+
|
|
44
|
+
export const PACKAGE_NAME = '@event4u/agent-config';
|
|
45
|
+
export const PACKUMENT_URL = `https://registry.npmjs.org/${PACKAGE_NAME}`;
|
|
46
|
+
export const LOCK_TTL_MS = 30 * 60 * 1000;
|
|
47
|
+
export const EXIT_REFUSED = 3;
|
|
48
|
+
export const EXIT_RESTORE_FAILED = 4;
|
|
49
|
+
export const LOCK_FILE = 'upgrade-unattended.lock';
|
|
50
|
+
export const SKIP_FILE = 'upgrade-skip.json';
|
|
51
|
+
/**
|
|
52
|
+
* The production wiring's answer until a global live-session register exists:
|
|
53
|
+
* the mid-session swap probe of 2026-10-18 recorded hook failures, so no
|
|
54
|
+
* unattended swap is safe without knowing that no session is running.
|
|
55
|
+
*/
|
|
56
|
+
export const ACTIVATION_BLOCKED =
|
|
57
|
+
'swapping the global install under a running session breaks its hooks — a session is ' +
|
|
58
|
+
'live on this machine right now; run `agent-config upgrade` yourself once none is open';
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Why the swap may not happen now, read from the machine-wide session register,
|
|
62
|
+
* or `null` when it may.
|
|
63
|
+
*
|
|
64
|
+
* Replaces the standing constant this file shipped until 2026-10-20. That
|
|
65
|
+
* constant was passed unconditionally by the production wiring, so the
|
|
66
|
+
* unattended run refused whether or not a session was live — correct while no
|
|
67
|
+
* register could answer the question, and a permanent `no` once one can.
|
|
68
|
+
*
|
|
69
|
+
* **Machine-wide, not repository-wide, and that is the whole point.** The swap
|
|
70
|
+
* replaces the global binary, so it breaks the hooks of every running session
|
|
71
|
+
* regardless of which checkout it is standing in. A repository-scoped register
|
|
72
|
+
* would clear the gate while a session in a sibling clone was mid-turn, which
|
|
73
|
+
* is exactly the failure the 2026-10-18 probe measured (490 failed hook
|
|
74
|
+
* invocations of 4,190 across four swap rounds).
|
|
75
|
+
*
|
|
76
|
+
* **Fails open on an unreadable register, deliberately and not silently.**
|
|
77
|
+
* `any_live_session` drops a record it cannot parse, so a corrupt directory
|
|
78
|
+
* reads as "nobody is live" and this returns `null`. The swap is not left
|
|
79
|
+
* unguarded by that: the lock with its owner PID, the 72 h release age, the
|
|
80
|
+
* provenance and `deprecated` checks all still stand, and each is independent
|
|
81
|
+
* of this one. The alternative — fail closed on any unreadable file — makes a
|
|
82
|
+
* single stale byte in the global root an unattended upgrade that can never
|
|
83
|
+
* run again on that machine, with no signal to the user that it stopped.
|
|
84
|
+
*/
|
|
85
|
+
export function activation_blocked_reason(env?: EnvMap | null): string | null {
|
|
86
|
+
return any_live_session(global_register_dir(env)) ? ACTIVATION_BLOCKED : null;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
interface OutSink {
|
|
90
|
+
write(text: string): void;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
export interface StepResult {
|
|
94
|
+
readonly rc: number;
|
|
95
|
+
readonly stderr: string;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
export type Packument = { readonly ok: true; readonly doc: unknown } | { readonly ok: false; readonly reason: string };
|
|
99
|
+
|
|
100
|
+
export interface UnattendedDeps {
|
|
101
|
+
readonly fetchPackument: () => Promise<Packument>;
|
|
102
|
+
/** Refusal reason when the attestation does not tie to this package's publish workflow, else `null`. */
|
|
103
|
+
readonly verifyProvenance: (candidate: RegistryCandidate) => Promise<string | null>;
|
|
104
|
+
readonly run: (cmd: string[]) => StepResult;
|
|
105
|
+
/** The version recorded in `installed.lock`; `''` when unknown. */
|
|
106
|
+
readonly readInstalled: () => string;
|
|
107
|
+
/** The version of the global package on disk; `''` when unreadable or half-written. */
|
|
108
|
+
readonly readBinary: () => string;
|
|
109
|
+
/** True once this process received SIGTERM; checked after every step. */
|
|
110
|
+
readonly interrupted: () => boolean;
|
|
111
|
+
readonly origin: InstallOrigin;
|
|
112
|
+
readonly agentConfigBin: string;
|
|
113
|
+
/** Existing GLOBAL settings files only — never a project file. */
|
|
114
|
+
readonly globalSettings: readonly string[];
|
|
115
|
+
readonly lockPath: string;
|
|
116
|
+
readonly skipPath: string;
|
|
117
|
+
readonly env: { readonly ci: boolean; readonly noUpdateCheck: boolean; readonly nodeVersion: string };
|
|
118
|
+
readonly now: () => Date;
|
|
119
|
+
readonly pid: number;
|
|
120
|
+
readonly isAlive: (pid: number) => boolean;
|
|
121
|
+
readonly dryRun: boolean;
|
|
122
|
+
/**
|
|
123
|
+
* Why the swap may not happen now, or `null` when it may. A global install
|
|
124
|
+
* swapped under a live session breaks that session's hooks (Phase 1 probe),
|
|
125
|
+
* so activation waits until a register can say no session is live.
|
|
126
|
+
*/
|
|
127
|
+
readonly activationBlocked: string | null;
|
|
128
|
+
readonly out: OutSink;
|
|
129
|
+
readonly err: OutSink;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
const PREFIX = 'agent-config upgrade --unattended';
|
|
133
|
+
|
|
134
|
+
function say(sink: OutSink, line: string): void {
|
|
135
|
+
sink.write(line + '\n');
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
// --- skip list -------------------------------------------------------------
|
|
139
|
+
|
|
140
|
+
export function read_skips(skipPath: string): string[] {
|
|
141
|
+
try {
|
|
142
|
+
const data: unknown = JSON.parse(fs.readFileSync(skipPath, 'utf-8'));
|
|
143
|
+
const list = (data as { skip?: unknown } | null)?.skip;
|
|
144
|
+
return Array.isArray(list) ? list.filter((v): v is string => typeof v === 'string') : [];
|
|
145
|
+
} catch {
|
|
146
|
+
return [];
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
export function record_skip(skipPath: string, version: string): void {
|
|
151
|
+
const skips = read_skips(skipPath);
|
|
152
|
+
if (!skips.includes(version)) skips.push(version);
|
|
153
|
+
fs.mkdirSync(path.dirname(skipPath), { recursive: true });
|
|
154
|
+
fs.writeFileSync(skipPath, JSON.stringify({ skip: skips.sort() }, null, 2) + '\n', 'utf-8');
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// --- single-flight lock ------------------------------------------------------
|
|
158
|
+
|
|
159
|
+
interface LockRecord {
|
|
160
|
+
readonly pid: number;
|
|
161
|
+
readonly started_at: string;
|
|
162
|
+
readonly ttl_ms: number;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
function read_text(p: string): string | null {
|
|
166
|
+
try {
|
|
167
|
+
return fs.readFileSync(p, 'utf-8');
|
|
168
|
+
} catch {
|
|
169
|
+
return null;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* `null` when the lock is ours now; otherwise the reason it is not.
|
|
175
|
+
*
|
|
176
|
+
* The lock is created by hard-linking a private file into place, which fails
|
|
177
|
+
* when any lock exists. A live owner holds it whatever its age — the TTL only
|
|
178
|
+
* names how long a run is expected to take, it never hands a running swap's
|
|
179
|
+
* lock to a second caller. A dead owner's lock is moved aside by rename, and
|
|
180
|
+
* the moved file is compared with the one judged stale: if it is not the same
|
|
181
|
+
* record, another caller took over in between, and its lock is put back.
|
|
182
|
+
*/
|
|
183
|
+
export function acquire_lock(deps: Pick<UnattendedDeps, 'lockPath' | 'pid' | 'now' | 'isAlive'>): string | null {
|
|
184
|
+
const record: LockRecord = { pid: deps.pid, started_at: deps.now().toISOString(), ttl_ms: LOCK_TTL_MS };
|
|
185
|
+
const mine = `${deps.lockPath}.${deps.pid}.${process.hrtime.bigint()}`;
|
|
186
|
+
try {
|
|
187
|
+
fs.mkdirSync(path.dirname(deps.lockPath), { recursive: true });
|
|
188
|
+
fs.writeFileSync(mine, JSON.stringify(record) + '\n', { flag: 'wx' });
|
|
189
|
+
} catch (exc) {
|
|
190
|
+
return `cannot write the lock: ${String(exc)}`;
|
|
191
|
+
}
|
|
192
|
+
try {
|
|
193
|
+
for (let attempt = 0; attempt < 2; attempt += 1) {
|
|
194
|
+
try {
|
|
195
|
+
fs.linkSync(mine, deps.lockPath);
|
|
196
|
+
return null;
|
|
197
|
+
} catch (exc) {
|
|
198
|
+
if ((exc as NodeJS.ErrnoException).code !== 'EEXIST') return `cannot write the lock: ${String(exc)}`;
|
|
199
|
+
}
|
|
200
|
+
const judged = read_text(deps.lockPath);
|
|
201
|
+
let held: Partial<LockRecord> = {};
|
|
202
|
+
try {
|
|
203
|
+
held = JSON.parse(judged ?? '') as Partial<LockRecord>;
|
|
204
|
+
} catch {
|
|
205
|
+
// An unreadable lock is treated as stale, never as ours.
|
|
206
|
+
}
|
|
207
|
+
if (typeof held.pid === 'number' && deps.isAlive(held.pid)) {
|
|
208
|
+
const age = deps.now().getTime() - Date.parse(String(held.started_at));
|
|
209
|
+
const overdue = age >= (held.ttl_ms ?? LOCK_TTL_MS) ? ` for longer than its ${LOCK_TTL_MS / 60_000} min TTL` : '';
|
|
210
|
+
return `another unattended upgrade holds the lock (pid ${held.pid})${overdue}`;
|
|
211
|
+
}
|
|
212
|
+
const tomb = `${mine}.stale`;
|
|
213
|
+
try {
|
|
214
|
+
fs.renameSync(deps.lockPath, tomb);
|
|
215
|
+
} catch {
|
|
216
|
+
continue;
|
|
217
|
+
}
|
|
218
|
+
if (read_text(tomb) !== judged) {
|
|
219
|
+
try {
|
|
220
|
+
fs.linkSync(tomb, deps.lockPath);
|
|
221
|
+
} catch {
|
|
222
|
+
// A third caller holds it now; either way it is not ours.
|
|
223
|
+
}
|
|
224
|
+
fs.rmSync(tomb, { force: true });
|
|
225
|
+
return 'another unattended upgrade took the lock over first';
|
|
226
|
+
}
|
|
227
|
+
fs.rmSync(tomb, { force: true });
|
|
228
|
+
}
|
|
229
|
+
return 'the lock could not be taken';
|
|
230
|
+
} finally {
|
|
231
|
+
fs.rmSync(mine, { force: true });
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
function release_lock(deps: Pick<UnattendedDeps, 'lockPath' | 'pid'>): void {
|
|
236
|
+
try {
|
|
237
|
+
const held = JSON.parse(fs.readFileSync(deps.lockPath, 'utf-8')) as Partial<LockRecord>;
|
|
238
|
+
if (held.pid === deps.pid) fs.unlinkSync(deps.lockPath);
|
|
239
|
+
} catch {
|
|
240
|
+
// Nothing to release.
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
// --- the run -----------------------------------------------------------------
|
|
245
|
+
|
|
246
|
+
function install_steps(version: string, deps: UnattendedDeps): string[][] {
|
|
247
|
+
return [
|
|
248
|
+
['npm', 'install', '-g', `${PACKAGE_NAME}@${version}`],
|
|
249
|
+
[deps.agentConfigBin, 'global', '--no-ui'],
|
|
250
|
+
...deps.globalSettings.map((target) => [deps.agentConfigBin, 'settings:sync', '--path', target]),
|
|
251
|
+
];
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
function run_steps(steps: string[][], deps: UnattendedDeps, honourSignal = true): { ok: true } | { ok: false; cmd: string[]; result: StepResult } {
|
|
255
|
+
for (const cmd of steps) {
|
|
256
|
+
say(deps.out, '→ ' + cmd.join(' '));
|
|
257
|
+
const result = deps.run(cmd);
|
|
258
|
+
if (result.rc !== 0) return { ok: false, cmd, result };
|
|
259
|
+
if (honourSignal && deps.interrupted()) return { ok: false, cmd, result: { rc: 143, stderr: 'SIGTERM received' } };
|
|
260
|
+
}
|
|
261
|
+
return { ok: true };
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
/** Restored means both the binary and `installed.lock` read the previous version again. */
|
|
265
|
+
function restore(previous: string, deps: UnattendedDeps): number {
|
|
266
|
+
const back = run_steps(install_steps(previous, deps).slice(0, 2), deps, false);
|
|
267
|
+
const lock = deps.readInstalled();
|
|
268
|
+
const binary = deps.readBinary();
|
|
269
|
+
if (back.ok && lock === previous && binary === previous) {
|
|
270
|
+
say(deps.err, `${PREFIX}: restored ${previous}. Run \`agent-config upgrade\` to retry by hand.`);
|
|
271
|
+
return 1;
|
|
272
|
+
}
|
|
273
|
+
say(
|
|
274
|
+
deps.err,
|
|
275
|
+
`❌ ${PREFIX}: the restore did not reach ${previous} (installed.lock: ${lock || 'unknown'}, ` +
|
|
276
|
+
`binary: ${binary || 'unreadable'}). ` +
|
|
277
|
+
`Run \`npm install -g ${PACKAGE_NAME}@${previous}\` then \`agent-config global --no-ui\`.`,
|
|
278
|
+
);
|
|
279
|
+
return EXIT_RESTORE_FAILED;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
async function decide(installed: string, deps: UnattendedDeps): Promise<{ candidate: RegistryCandidate } | { refused: string[] }> {
|
|
283
|
+
const fetched = await deps.fetchPackument();
|
|
284
|
+
if (!fetched.ok) return { refused: [`registry unavailable: ${fetched.reason}`] };
|
|
285
|
+
const candidate = read_candidate(fetched.doc);
|
|
286
|
+
if (candidate === null) return { refused: ['registry document carries no latest version'] };
|
|
287
|
+
const decision = unattended_decision({
|
|
288
|
+
installed,
|
|
289
|
+
candidate,
|
|
290
|
+
origin: deps.origin,
|
|
291
|
+
skipped: read_skips(deps.skipPath),
|
|
292
|
+
env: { ...deps.env, now: deps.now().toISOString() },
|
|
293
|
+
});
|
|
294
|
+
if (!decision.install) return { refused: [...decision.reasons] };
|
|
295
|
+
// 2.1's open half. `decision` accepted an attestation that EXISTS and
|
|
296
|
+
// carries an SLSA predicate; that document is producible by any workflow
|
|
297
|
+
// in any repository with `id-token: write`, so it is checked here against
|
|
298
|
+
// the one workflow this package publishes from before anything installs.
|
|
299
|
+
const provenance = await deps.verifyProvenance(candidate);
|
|
300
|
+
if (provenance !== null) return { refused: [provenance] };
|
|
301
|
+
return { candidate };
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
/**
|
|
305
|
+
* Fetch the attestation bundle, require it to name this package's publish
|
|
306
|
+
* workflow, and require its DSSE signature to verify. Returns a refusal
|
|
307
|
+
* reason, or `null` when both hold.
|
|
308
|
+
*
|
|
309
|
+
* **This used to say the signature half was `npm audit signatures` "in the
|
|
310
|
+
* install step". It was not, and never had been** — `install_steps` runs
|
|
311
|
+
* `npm install -g`, `agent-config global` and `settings:sync`, and no audit.
|
|
312
|
+
* The sentence described a composition nobody wrote, which is the worst shape
|
|
313
|
+
* a security note can have, so it is replaced by what the code does rather
|
|
314
|
+
* than corrected in place.
|
|
315
|
+
*
|
|
316
|
+
* What runs now: the payload is tied to the workflow, the envelope's signature
|
|
317
|
+
* is verified against the certificate the bundle carries, and that
|
|
318
|
+
* certificate's SAN is required to name the same workflow. What does NOT run:
|
|
319
|
+
* any check of who ISSUED that certificate. The residue is the
|
|
320
|
+
* `dsse-trust-root` blocker on the roadmap, and
|
|
321
|
+
* `verify_attestation_signature`'s header states it in full.
|
|
322
|
+
*
|
|
323
|
+
* A bundle that cannot be fetched REFUSES rather than passing. Unlike the live
|
|
324
|
+
* session register, there is no second independent gate behind this one: an
|
|
325
|
+
* unreachable attestation is exactly what an attacker serving a tarball
|
|
326
|
+
* without one produces, so failing open here would hand back the property the
|
|
327
|
+
* check exists to establish.
|
|
328
|
+
*/
|
|
329
|
+
export async function verify_provenance_default(
|
|
330
|
+
candidate: RegistryCandidate,
|
|
331
|
+
fetch_impl: typeof fetch = fetch,
|
|
332
|
+
timeoutMs = 10_000,
|
|
333
|
+
): Promise<string | null> {
|
|
334
|
+
if (candidate.attestationsUrl === null) {
|
|
335
|
+
return `${candidate.version} carries no attestation bundle to verify`;
|
|
336
|
+
}
|
|
337
|
+
// The URL comes from the packument, so a hostile registry answer would
|
|
338
|
+
// otherwise choose both the host fetched and the document verified.
|
|
339
|
+
let origin: string;
|
|
340
|
+
try {
|
|
341
|
+
origin = new URL(candidate.attestationsUrl).origin;
|
|
342
|
+
} catch {
|
|
343
|
+
origin = '';
|
|
344
|
+
}
|
|
345
|
+
if (origin !== new URL(PACKUMENT_URL).origin) {
|
|
346
|
+
return `${candidate.version}: attestation url is not on ${new URL(PACKUMENT_URL).origin}`;
|
|
347
|
+
}
|
|
348
|
+
let doc: unknown;
|
|
349
|
+
try {
|
|
350
|
+
const resp = await fetch_impl(candidate.attestationsUrl, {
|
|
351
|
+
signal: AbortSignal.timeout(timeoutMs),
|
|
352
|
+
headers: { accept: 'application/json' },
|
|
353
|
+
redirect: 'error',
|
|
354
|
+
});
|
|
355
|
+
if (!resp.ok) return `attestation fetch failed: HTTP ${resp.status}`;
|
|
356
|
+
doc = await resp.json();
|
|
357
|
+
} catch (err) {
|
|
358
|
+
return `attestation fetch failed: ${err instanceof Error ? err.message : String(err)}`;
|
|
359
|
+
}
|
|
360
|
+
if (!provenance_matches_publish(doc)) {
|
|
361
|
+
const named = attestation_workflow_ref(doc);
|
|
362
|
+
return named === null
|
|
363
|
+
? `${candidate.version} has no readable provenance workflow in its attestation`
|
|
364
|
+
: `${candidate.version} was built by ${named}, not ${EXPECTED_WORKFLOW_REF}`;
|
|
365
|
+
}
|
|
366
|
+
// The payload says the right thing; this asks whether the payload is the
|
|
367
|
+
// one that was signed, and whether the certificate that signed it carries
|
|
368
|
+
// the same identity. It does NOT establish who issued that certificate —
|
|
369
|
+
// see `verify_attestation_signature`'s own note and the `dsse-trust-root`
|
|
370
|
+
// blocker, which is where the trust root is decided.
|
|
371
|
+
const signature = await verify_attestation_signature(doc);
|
|
372
|
+
if (signature !== null) return `${candidate.version}: ${signature}`;
|
|
373
|
+
return null;
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
/** Contexts where even the registry fetch and the lock file are side effects nobody asked for. */
|
|
377
|
+
function quiet_context(deps: UnattendedDeps): string | null {
|
|
378
|
+
if (deps.env.ci) return 'suppressed: CI';
|
|
379
|
+
if (deps.env.noUpdateCheck) return 'suppressed: AGENT_CONFIG_NO_UPDATE_CHECK=1';
|
|
380
|
+
if (deps.origin === 'source-checkout') return 'suppressed: source checkout';
|
|
381
|
+
return null;
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
export async function run_unattended(deps: UnattendedDeps): Promise<number> {
|
|
385
|
+
const quiet = quiet_context(deps);
|
|
386
|
+
if (quiet !== null) {
|
|
387
|
+
say(deps.out, `ℹ️ ${PREFIX}: not installing — ${quiet}.`);
|
|
388
|
+
return EXIT_REFUSED;
|
|
389
|
+
}
|
|
390
|
+
const previous = deps.readInstalled();
|
|
391
|
+
if (previous === '') {
|
|
392
|
+
say(deps.err, `${PREFIX}: not installing — the installed version is unknown, so nothing could be restored.`);
|
|
393
|
+
return EXIT_REFUSED;
|
|
394
|
+
}
|
|
395
|
+
const locked = acquire_lock(deps);
|
|
396
|
+
if (locked !== null) {
|
|
397
|
+
say(deps.err, `${PREFIX}: not installing — ${locked}.`);
|
|
398
|
+
return EXIT_REFUSED;
|
|
399
|
+
}
|
|
400
|
+
try {
|
|
401
|
+
const verdict = await decide(previous, deps);
|
|
402
|
+
if ('refused' in verdict) {
|
|
403
|
+
say(deps.out, `ℹ️ ${PREFIX}: not installing (installed: ${previous}) — ${verdict.refused.join('; ')}.`);
|
|
404
|
+
return EXIT_REFUSED;
|
|
405
|
+
}
|
|
406
|
+
const target = verdict.candidate.version;
|
|
407
|
+
const steps = install_steps(target, deps);
|
|
408
|
+
if (deps.activationBlocked !== null) {
|
|
409
|
+
const how = deps.dryRun ? 'dry run: a real run would not install' : 'not installing';
|
|
410
|
+
say(deps.out, `ℹ️ ${PREFIX}: every gate passed for ${target}, but ${how} — ${deps.activationBlocked}.`);
|
|
411
|
+
return EXIT_REFUSED;
|
|
412
|
+
}
|
|
413
|
+
if (deps.dryRun) {
|
|
414
|
+
say(deps.out, `${PREFIX} — dry run, every gate passed for ${target}; would execute:`);
|
|
415
|
+
for (const cmd of steps) say(deps.out, ' ' + cmd.join(' '));
|
|
416
|
+
return 0;
|
|
417
|
+
}
|
|
418
|
+
const ran = run_steps(steps, deps);
|
|
419
|
+
if (ran.ok) {
|
|
420
|
+
say(deps.out, `✅ agent-config upgraded unattended: ${previous} → ${target}.`);
|
|
421
|
+
return 0;
|
|
422
|
+
}
|
|
423
|
+
const what = `${ran.cmd.join(' ')} (exit ${ran.result.rc})`;
|
|
424
|
+
if (/\bEACCES\b/.test(ran.result.stderr)) {
|
|
425
|
+
say(
|
|
426
|
+
deps.err,
|
|
427
|
+
`❌ ${PREFIX}: permission denied on ${what}. agent-config never runs sudo; ` +
|
|
428
|
+
`run this yourself with the right permissions: ${ran.cmd.join(' ')}`,
|
|
429
|
+
);
|
|
430
|
+
// Denied on the very first write, npm changed nothing; any later step leaves a mixed install.
|
|
431
|
+
const untouched = ran.cmd === steps[0] && deps.readInstalled() === previous && deps.readBinary() === previous;
|
|
432
|
+
if (untouched) return 1;
|
|
433
|
+
return restore(previous, deps);
|
|
434
|
+
}
|
|
435
|
+
say(deps.err, `❌ ${PREFIX}: step failed: ${what} — restoring ${previous}.`);
|
|
436
|
+
return restore(previous, deps);
|
|
437
|
+
} finally {
|
|
438
|
+
release_lock(deps);
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
// --- production wiring ---------------------------------------------------------
|
|
443
|
+
|
|
444
|
+
export async function fetch_packument(fetch_impl: typeof fetch = fetch, timeoutMs = 10_000): Promise<Packument> {
|
|
445
|
+
try {
|
|
446
|
+
const resp = await fetch_impl(PACKUMENT_URL, {
|
|
447
|
+
headers: { Accept: 'application/json', 'User-Agent': 'agent-config-upgrade-unattended' },
|
|
448
|
+
signal: AbortSignal.timeout(timeoutMs),
|
|
449
|
+
});
|
|
450
|
+
if (!resp.ok) return { ok: false, reason: `HTTP ${resp.status}` };
|
|
451
|
+
return { ok: true, doc: await resp.json() };
|
|
452
|
+
} catch (exc) {
|
|
453
|
+
return { ok: false, reason: exc instanceof Error ? exc.message : String(exc) };
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
export function default_run(cmd: string[], err: OutSink): StepResult {
|
|
458
|
+
const r = spawnSync(cmd[0] as string, cmd.slice(1), { stdio: ['ignore', 'inherit', 'pipe'], encoding: 'utf-8' });
|
|
459
|
+
const stderr = r.stderr ?? '';
|
|
460
|
+
if (stderr) err.write(stderr);
|
|
461
|
+
if (r.error) return { rc: 127, stderr: stderr + String(r.error) };
|
|
462
|
+
return { rc: r.status ?? (r.signal === 'SIGTERM' ? 143 : 1), stderr };
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
export function is_alive(pid: number): boolean {
|
|
466
|
+
try {
|
|
467
|
+
process.kill(pid, 0);
|
|
468
|
+
return true;
|
|
469
|
+
} catch (exc) {
|
|
470
|
+
return (exc as NodeJS.ErrnoException).code === 'EPERM';
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
export { originForPackageRoot } from './doctor_install_mode.js';
|
|
475
|
+
|
|
476
|
+
function running_origin(): InstallOrigin {
|
|
477
|
+
return originForPackageRoot(resolvePackageRoot(import.meta.url));
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
/** `upgrade --skip <version>` — never install that version unattended. */
|
|
481
|
+
export function skip_version(version: string, out: OutSink): number {
|
|
482
|
+
record_skip(write_target(SKIP_FILE), version);
|
|
483
|
+
say(out, `ℹ️ agent-config upgrade --unattended will never install ${version}.`);
|
|
484
|
+
return 0;
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
export async function run_unattended_default(options: {
|
|
488
|
+
dryRun: boolean;
|
|
489
|
+
out: OutSink;
|
|
490
|
+
err: OutSink;
|
|
491
|
+
agentConfigBin: string;
|
|
492
|
+
}): Promise<number> {
|
|
493
|
+
const globalSettings = path.join(event4u_root(), 'settings', '.agent-settings.yml');
|
|
494
|
+
const packageJson = path.join(resolvePackageRoot(import.meta.url), 'package.json');
|
|
495
|
+
let terminated = false;
|
|
496
|
+
const onTerm = (): void => {
|
|
497
|
+
terminated = true;
|
|
498
|
+
};
|
|
499
|
+
process.on('SIGTERM', onTerm);
|
|
500
|
+
try {
|
|
501
|
+
return await run_unattended_wired(options, globalSettings, packageJson, () => terminated);
|
|
502
|
+
} finally {
|
|
503
|
+
process.off('SIGTERM', onTerm);
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
function run_unattended_wired(
|
|
508
|
+
options: { dryRun: boolean; out: OutSink; err: OutSink; agentConfigBin: string },
|
|
509
|
+
globalSettings: string,
|
|
510
|
+
packageJson: string,
|
|
511
|
+
interrupted: () => boolean,
|
|
512
|
+
): Promise<number> {
|
|
513
|
+
return run_unattended({
|
|
514
|
+
readBinary: () => {
|
|
515
|
+
try {
|
|
516
|
+
const v = (JSON.parse(fs.readFileSync(packageJson, 'utf-8')) as { version?: unknown }).version;
|
|
517
|
+
return typeof v === 'string' ? v : '';
|
|
518
|
+
} catch {
|
|
519
|
+
return '';
|
|
520
|
+
}
|
|
521
|
+
},
|
|
522
|
+
interrupted,
|
|
523
|
+
fetchPackument: () => fetch_packument(),
|
|
524
|
+
verifyProvenance: (c) => verify_provenance_default(c),
|
|
525
|
+
run: (cmd) => default_run(cmd, options.err),
|
|
526
|
+
readInstalled: () => {
|
|
527
|
+
const v = installed_lock.read_lockfile()?.agent_config_version;
|
|
528
|
+
return typeof v === 'string' ? v.trim().replace(/^v+/, '') : '';
|
|
529
|
+
},
|
|
530
|
+
origin: running_origin(),
|
|
531
|
+
agentConfigBin: options.agentConfigBin,
|
|
532
|
+
globalSettings: fs.existsSync(globalSettings) ? [globalSettings] : [],
|
|
533
|
+
lockPath: write_target(LOCK_FILE),
|
|
534
|
+
skipPath: write_target(SKIP_FILE),
|
|
535
|
+
env: {
|
|
536
|
+
ci: !['', '0', 'false'].includes((process.env['CI'] ?? '').trim().toLowerCase()),
|
|
537
|
+
noUpdateCheck: process.env['AGENT_CONFIG_NO_UPDATE_CHECK'] === '1',
|
|
538
|
+
nodeVersion: process.version,
|
|
539
|
+
},
|
|
540
|
+
now: () => new Date(),
|
|
541
|
+
pid: process.pid,
|
|
542
|
+
isAlive: is_alive,
|
|
543
|
+
dryRun: options.dryRun,
|
|
544
|
+
activationBlocked: activation_blocked_reason(),
|
|
545
|
+
out: options.out,
|
|
546
|
+
err: options.err,
|
|
547
|
+
});
|
|
548
|
+
}
|
|
@@ -80,6 +80,15 @@ TS-shell native (run via the installed `agent-config` binary):
|
|
|
80
80
|
brand:status Is a consumer brand layer present, and at which of the
|
|
81
81
|
four canonical tokens.json paths. Flags a dot-prefixed
|
|
82
82
|
.tokens.json, which nothing reads.
|
|
83
|
+
ci:settle <pr> Wait for a PR's checks to settle; the last line is the
|
|
84
|
+
verdict (exit 0 green · 1 red · 2 no verdict).
|
|
85
|
+
audit:deps <mode> Security advisories for this project's packages, runtimes
|
|
86
|
+
and toolchain: refresh · show · accept · fix · verify ·
|
|
87
|
+
pr-body · mitigate · track · notice · gaps · issue-body.
|
|
88
|
+
Only `refresh` touches the network.
|
|
89
|
+
worktree:cleanup <mode> Worktree inventory and removal: inventory · apply · check
|
|
90
|
+
<path> · register <path>. `apply` removes only the proven
|
|
91
|
+
set (merged incl. squash, clean, unused), never with force.
|
|
83
92
|
packs:active Which packs are active HERE, and from which file.
|
|
84
93
|
Names the degraded case (settings file without a
|
|
85
94
|
profile.id → zero packs) that nothing else reports.
|
|
@@ -178,7 +187,8 @@ Tier 1 — power-user (release shape, audit, migration):
|
|
|
178
187
|
self-repair:release Publish one defect record — a PR when the fix can be
|
|
179
188
|
pushed, else an issue. Running it is your Hard-Floor
|
|
180
189
|
confirmation.
|
|
181
|
-
Usage: self-repair:release <fingerprint>
|
|
190
|
+
Usage: self-repair:release <fingerprint> --dry-run
|
|
191
|
+
self-repair:release <fingerprint> --approve <digest>
|
|
182
192
|
decision:memo Record or list a question the run resolved without
|
|
183
193
|
asking you, so it stays reviewable afterwards.
|
|
184
194
|
Local-only (gitignored); the locked decision
|
|
@@ -838,6 +848,25 @@ cmd_brand_status() {
|
|
|
838
848
|
exec_ts "$PACKAGE_ROOT/src/scripts/_cli/cmd_brand_status.ts" "$@"
|
|
839
849
|
}
|
|
840
850
|
|
|
851
|
+
# `ci:settle <pr>` — the one CI waiter, through the package's own executable so a
|
|
852
|
+
# shipped command never names a node_modules path or fetches a TS runner.
|
|
853
|
+
cmd_ci_settle() {
|
|
854
|
+
exec_ts "$PACKAGE_ROOT/src/scripts/_cli/cmd_ci_settle.ts" "$@"
|
|
855
|
+
}
|
|
856
|
+
|
|
857
|
+
# `audit:deps <mode>` — advisories heard the same day. The network lives here,
|
|
858
|
+
# never in a hook: a session start only reads the cache this writes.
|
|
859
|
+
cmd_audit_deps() {
|
|
860
|
+
exec_ts "$PACKAGE_ROOT/src/scripts/advisories.ts" "$@"
|
|
861
|
+
}
|
|
862
|
+
|
|
863
|
+
# `worktree:cleanup <mode>` — the worktree safety gate and the removal of the
|
|
864
|
+
# proven set, through the package's own executable so a consumer with a global
|
|
865
|
+
# install reaches it without a node_modules path (ADR-295).
|
|
866
|
+
cmd_worktree_cleanup() {
|
|
867
|
+
exec_ts "$PACKAGE_ROOT/src/scripts/worktree_cleanup_check.ts" "$@"
|
|
868
|
+
}
|
|
869
|
+
|
|
841
870
|
# `--archive`: a completed roadmap is archived here rather than reported as a
|
|
842
871
|
# warning the caller has to act on. `roadmap:progress-check` never passes it —
|
|
843
872
|
# a CI gate must not mutate the tree it is checking. Pass `--no-archive` to get
|
|
@@ -1598,6 +1627,9 @@ main() {
|
|
|
1598
1627
|
git:convention) cmd_git_convention "$@" ;;
|
|
1599
1628
|
mcp:available) cmd_mcp_available "$@" ;;
|
|
1600
1629
|
brand:status) cmd_brand_status "$@" ;;
|
|
1630
|
+
ci:settle) cmd_ci_settle "$@" ;;
|
|
1631
|
+
audit:deps) cmd_audit_deps "$@" ;;
|
|
1632
|
+
worktree:cleanup) cmd_worktree_cleanup "$@" ;;
|
|
1601
1633
|
roadmap:context) cmd_roadmap_context "$@" ;;
|
|
1602
1634
|
roadmap:progress) cmd_roadmap_progress "$@" ;;
|
|
1603
1635
|
roadmap:progress-check) cmd_roadmap_progress_check "$@" ;;
|
|
@@ -1749,20 +1781,21 @@ run_update_check_banner() {
|
|
|
1749
1781
|
esac
|
|
1750
1782
|
# Best-effort: bundle first, then a dev-tree tsx. No `npx tsx` last resort —
|
|
1751
1783
|
# same reason as maybe_pin_reexec: npx runs against the CONSUMER's npm config.
|
|
1752
|
-
local
|
|
1753
|
-
local target=""
|
|
1784
|
+
local -a run=()
|
|
1754
1785
|
local aux
|
|
1755
1786
|
aux="$(delegate_aux_bundle 'check_update_banner.js')"
|
|
1756
1787
|
if [[ -n "$aux" ]]; then
|
|
1757
|
-
|
|
1758
|
-
|
|
1759
|
-
|
|
1760
|
-
|
|
1761
|
-
|
|
1788
|
+
run=(node "$aux")
|
|
1789
|
+
elif [[ -f "$PACKAGE_ROOT/node_modules/tsx/dist/loader.mjs" && -f "$PACKAGE_ROOT/src/scripts/check_update_banner.ts" ]]; then
|
|
1790
|
+
# The loader, not the tsx CLI: the CLI runs the script in a child whose
|
|
1791
|
+
# fd 3 is its IPC channel, and fd 3 is where the notice goes.
|
|
1792
|
+
run=(node --import "file://$PACKAGE_ROOT/node_modules/tsx/dist/loader.mjs" "$PACKAGE_ROOT/src/scripts/check_update_banner.ts")
|
|
1762
1793
|
else
|
|
1763
1794
|
return 0
|
|
1764
1795
|
fi
|
|
1765
|
-
|
|
1796
|
+
# fd 3 is the real stderr: the advisory notice is written there and stamped
|
|
1797
|
+
# only on success; everything else the banner process prints stays discarded.
|
|
1798
|
+
"${run[@]}" --cwd "$CONSUMER_ROOT" 3>&2 2>/dev/null || true
|
|
1766
1799
|
}
|
|
1767
1800
|
|
|
1768
1801
|
# Global `--root <path>` / `--root=<path>` parsing (Step 8 A3).
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
*
|
|
30
30
|
* `projected`, `delivered` and `visible` are three rungs and not one because
|
|
31
31
|
* the shipping substrate already separates them:
|
|
32
|
-
* `_lib/lean_projection_mode.ts
|
|
32
|
+
* `_lib/lean_projection_mode.ts` `LeanProjectionMode` defines `eager-all | thin | delivery`, and
|
|
33
33
|
* under `thin`/`delivery` an artefact can be projected without being visible in
|
|
34
34
|
* a given turn. The 4-rung form collapses all three into `injected`.
|
|
35
35
|
*/
|