@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
|
@@ -3,9 +3,10 @@
|
|
|
3
3
|
* Self-repair CLI — the queue reader and the single gated outward step.
|
|
4
4
|
*
|
|
5
5
|
* self-repair:status list open records
|
|
6
|
-
* self-repair:release <fp>
|
|
6
|
+
* self-repair:release <fp> --dry-run [--repo <owner/name>]
|
|
7
|
+
* self-repair:release <fp> --approve <digest> [--repo <owner/name>]
|
|
7
8
|
*
|
|
8
|
-
* `release` is the ONE
|
|
9
|
+
* `release` is the ONE outward step the loop is designed around: everything up to
|
|
9
10
|
* it — detection, dedup, analysis, the authored fix, the commit — happens
|
|
10
11
|
* without the user. Publishing does not, because a push and a PR/issue are
|
|
11
12
|
* both Hard-Floor actions under `non-destructive-by-default`, and no standing
|
|
@@ -18,15 +19,35 @@
|
|
|
18
19
|
* authorized, failures degrade down the ladder WITHIN the same call (push/PR
|
|
19
20
|
* failure or 30 s timeout → issue; issue failure → the record stays open with
|
|
20
21
|
* the errors attached) — degrading never widens what leaves the machine, only
|
|
21
|
-
* the vehicle. `--dry-run` prints the resolved route
|
|
22
|
-
*
|
|
22
|
+
* the vehicle. `--dry-run` prints the resolved route, the GitHub account the
|
|
23
|
+
* send would carry, its destination and payload and their digest, and creates
|
|
24
|
+
* nothing: it reads the forge (auth status, push rights, the signed-in login)
|
|
25
|
+
* and the local repository, and writes to neither.
|
|
23
26
|
*
|
|
24
27
|
* Fail-closed on privacy: the record's own text goes through the audited
|
|
25
28
|
* privacy floor before anything leaves the machine, and a refusal downgrades
|
|
26
29
|
* the record to local-only rather than scrubbing it into publishable shape.
|
|
30
|
+
*
|
|
31
|
+
* The pull-request route never pushes the author's branch. It builds ONE commit
|
|
32
|
+
* on `origin/main` from the branch's net change, in a temporary index with no
|
|
33
|
+
* working tree, under a noreply identity and a neutral `retro/<fingerprint>`
|
|
34
|
+
* branch name, unsigned and dated in UTC. Nothing from the branch's history —
|
|
35
|
+
* its name, its commits, content added and later removed — is in that commit.
|
|
36
|
+
* The floor then walks every object the push adds to the base: the commit
|
|
37
|
+
* object, every tree and blob path, every blob's content, plus title and body.
|
|
38
|
+
* A finding skips every push rung.
|
|
39
|
+
*
|
|
40
|
+
* Nothing is sent without an approval of the exact bytes and their
|
|
41
|
+
* destination — repository, account, route, remote, base commit: the dry run
|
|
42
|
+
* prints them with their digest, and the release refuses unless
|
|
43
|
+
* `--approve <digest>` names what it is about to send and where. Only the
|
|
44
|
+
* commit date is outside the digest. A blob that is not UTF-8 text, or carries
|
|
45
|
+
* a NUL, is refused rather than scanned (`_lib/self_repair_outgoing.ts`).
|
|
27
46
|
*/
|
|
47
|
+
import { isUtf8 } from 'node:buffer';
|
|
28
48
|
import { spawnSync } from 'node:child_process';
|
|
29
49
|
import * as fs from 'node:fs';
|
|
50
|
+
import * as os from 'node:os';
|
|
30
51
|
import * as path from 'node:path';
|
|
31
52
|
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
32
53
|
|
|
@@ -53,6 +74,29 @@ import {
|
|
|
53
74
|
readOverflow,
|
|
54
75
|
readRecord,
|
|
55
76
|
} from './_lib/self_repair_store.js';
|
|
77
|
+
import {
|
|
78
|
+
consumerDenyList,
|
|
79
|
+
describeFindings,
|
|
80
|
+
scanPayload,
|
|
81
|
+
} from './_lib/self_repair_payload.js';
|
|
82
|
+
import {
|
|
83
|
+
approvalRefusal,
|
|
84
|
+
type CommitIdentity,
|
|
85
|
+
commitMessage,
|
|
86
|
+
isNoreplyEmail,
|
|
87
|
+
noreplyIdentity,
|
|
88
|
+
type Destination,
|
|
89
|
+
type Outgoing,
|
|
90
|
+
type OutgoingPullRequest,
|
|
91
|
+
outgoingDigest,
|
|
92
|
+
renderOutgoing,
|
|
93
|
+
renderUpstreamBody,
|
|
94
|
+
retroBranch,
|
|
95
|
+
} from './_lib/self_repair_outgoing.js';
|
|
96
|
+
import { _detect_project_identifiers } from './check_portability.js';
|
|
97
|
+
import { gitEnv } from './_lib/git_env.js';
|
|
98
|
+
|
|
99
|
+
export { consumerDenyList };
|
|
56
100
|
|
|
57
101
|
export const UPSTREAM_REPO = 'event4u-app/agent-config';
|
|
58
102
|
|
|
@@ -77,41 +121,96 @@ export interface RunResult {
|
|
|
77
121
|
ok: boolean;
|
|
78
122
|
out: string;
|
|
79
123
|
timedOut: boolean;
|
|
124
|
+
/** stdout exactly as the process wrote it — set only when `binary` was asked for. */
|
|
125
|
+
bytes?: Buffer;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
export interface RunOptions {
|
|
129
|
+
/**
|
|
130
|
+
* Keep stdout as bytes. A UTF-8 decode replaces every invalid sequence with
|
|
131
|
+
* U+FFFD, so text read that way is not the content that leaves.
|
|
132
|
+
*/
|
|
133
|
+
binary?: boolean;
|
|
80
134
|
}
|
|
81
135
|
|
|
82
|
-
/**
|
|
83
|
-
|
|
136
|
+
/**
|
|
137
|
+
* Injectable command runner — tests script it, production shells out. `env` is
|
|
138
|
+
* merged over the process environment, never a replacement for it.
|
|
139
|
+
*/
|
|
140
|
+
export type Runner = (
|
|
141
|
+
cmd: string,
|
|
142
|
+
args: string[],
|
|
143
|
+
cwd?: string,
|
|
144
|
+
env?: NodeJS.ProcessEnv,
|
|
145
|
+
opts?: RunOptions,
|
|
146
|
+
) => RunResult;
|
|
84
147
|
|
|
85
|
-
function
|
|
86
|
-
|
|
148
|
+
export function runCommand(
|
|
149
|
+
cmd: string,
|
|
150
|
+
args: string[],
|
|
151
|
+
cwd?: string,
|
|
152
|
+
env?: NodeJS.ProcessEnv,
|
|
153
|
+
opts?: RunOptions,
|
|
154
|
+
): RunResult {
|
|
155
|
+
const r = spawnSync(cmd, args, {
|
|
156
|
+
cwd,
|
|
157
|
+
encoding: 'buffer',
|
|
158
|
+
timeout: EGRESS_STEP_TIMEOUT_MS,
|
|
159
|
+
// An inherited GIT_DIR or GIT_INDEX_FILE (a release run from a hook)
|
|
160
|
+
// would point every git step at another repository or index.
|
|
161
|
+
env: { ...gitEnv(process.env), ...(env ?? {}) },
|
|
162
|
+
});
|
|
87
163
|
// Only spawnSync's own ETIMEDOUT counts: a child killed externally by
|
|
88
164
|
// SIGTERM is a failure, not a timeout, and recording it as "timed out"
|
|
89
165
|
// points the next debugging session at the wrong cause (R2 finding #3).
|
|
90
166
|
const timedOut = (r.error as NodeJS.ErrnoException | undefined)?.code === 'ETIMEDOUT';
|
|
167
|
+
const stdout = r.stdout ?? Buffer.alloc(0);
|
|
168
|
+
const stderr = r.stderr ?? Buffer.alloc(0);
|
|
91
169
|
return {
|
|
92
170
|
ok: r.status === 0 && !timedOut,
|
|
93
|
-
out: `${
|
|
171
|
+
out: `${stdout.toString('utf-8')}${stderr.toString('utf-8')}`,
|
|
94
172
|
timedOut,
|
|
173
|
+
...(opts?.binary === true ? { bytes: Buffer.from(stdout) } : {}),
|
|
95
174
|
};
|
|
96
175
|
}
|
|
97
176
|
|
|
177
|
+
function isPackageCheckout(dir: string): boolean {
|
|
178
|
+
return (
|
|
179
|
+
fs.existsSync(path.join(dir, 'src', 'rules')) &&
|
|
180
|
+
fs.existsSync(path.join(dir, 'src', 'scripts', 'hook_manifest.yaml'))
|
|
181
|
+
);
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
function realOrSelf(p: string): string {
|
|
185
|
+
try {
|
|
186
|
+
return fs.realpathSync(p);
|
|
187
|
+
} catch {
|
|
188
|
+
return path.resolve(p);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
|
|
98
192
|
/**
|
|
99
|
-
*
|
|
100
|
-
*
|
|
101
|
-
*
|
|
193
|
+
* The checkout of this package the release runs FROM, or null. A pull request
|
|
194
|
+
* is opened only from such a checkout (D5): a release run from a consumer
|
|
195
|
+
* project reaches the issue step and stops there, whatever the environment
|
|
196
|
+
* says, because the record it releases was found in that project.
|
|
197
|
+
*
|
|
198
|
+
* `AGENT_CONFIG_SOURCE` points at the checkout when the release runs inside it
|
|
199
|
+
* by a path that is not its root — a subdirectory, or a symlinked path. It is
|
|
200
|
+
* honoured only when the working directory is inside the checkout it names; set
|
|
201
|
+
* in a consumer project it widens nothing. Otherwise the working directory
|
|
202
|
+
* itself must be the package checkout.
|
|
102
203
|
*/
|
|
103
204
|
export function findAgentConfigCheckout(env: NodeJS.ProcessEnv, cwd: string): string | null {
|
|
104
205
|
const explicit = env['AGENT_CONFIG_SOURCE'];
|
|
105
|
-
if (explicit &&
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
) {
|
|
112
|
-
return cwd;
|
|
206
|
+
if (explicit && isPackageCheckout(explicit)) {
|
|
207
|
+
const root = realOrSelf(explicit);
|
|
208
|
+
const here = realOrSelf(cwd);
|
|
209
|
+
if (here === root || here.startsWith(`${root}${path.sep}`)) {
|
|
210
|
+
return explicit;
|
|
211
|
+
}
|
|
113
212
|
}
|
|
114
|
-
return null;
|
|
213
|
+
return isPackageCheckout(cwd) ? cwd : null;
|
|
115
214
|
}
|
|
116
215
|
|
|
117
216
|
/**
|
|
@@ -149,7 +248,7 @@ export function probeUpstreamRights(
|
|
|
149
248
|
export function probeMachine(
|
|
150
249
|
env: NodeJS.ProcessEnv,
|
|
151
250
|
cwd: string,
|
|
152
|
-
runner: Runner =
|
|
251
|
+
runner: Runner = runCommand,
|
|
153
252
|
repo: string = UPSTREAM_REPO,
|
|
154
253
|
): Probe {
|
|
155
254
|
const checkout = findAgentConfigCheckout(env, cwd);
|
|
@@ -239,7 +338,8 @@ export function planRelease(
|
|
|
239
338
|
blocked,
|
|
240
339
|
patch_denied,
|
|
241
340
|
title: titleFor(record),
|
|
242
|
-
|
|
341
|
+
// Only a local-only plan keeps the free-text report: nothing leaves.
|
|
342
|
+
body: choice.route === 'local-only' ? renderReport(record, choice.route) : renderUpstreamBody(record, choice.route),
|
|
243
343
|
};
|
|
244
344
|
}
|
|
245
345
|
|
|
@@ -261,6 +361,191 @@ export interface ReleaseOutcome {
|
|
|
261
361
|
export interface ReleaseDeps {
|
|
262
362
|
runner: Runner;
|
|
263
363
|
now: () => string;
|
|
364
|
+
/** The consumer project's identifiers; none means only the detector table applies. */
|
|
365
|
+
denyIdentifiers?: readonly string[];
|
|
366
|
+
/** The digest the person approved after reading the dry run; absent refuses. */
|
|
367
|
+
approvedDigest?: string | null;
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
/** The base the synthesised commit sits on, and what the pushed objects are compared against. */
|
|
371
|
+
export const PAYLOAD_BASE_REF = 'origin/main';
|
|
372
|
+
|
|
373
|
+
/** The account a send would carry: the login `gh` is authenticated as, or null. */
|
|
374
|
+
export function resolveAccount(runner: Runner): string | null {
|
|
375
|
+
const who = runner('gh', ['api', 'user', '--jq', '.login']);
|
|
376
|
+
const login = who.out.trim();
|
|
377
|
+
return who.ok && login.length > 0 ? login : null;
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
/** The noreply identity of the signed-in account, or null when it cannot be resolved. */
|
|
381
|
+
export function resolveIdentity(runner: Runner): CommitIdentity | null {
|
|
382
|
+
const who = runner('gh', ['api', 'user', '--jq', '"\\(.id) \\(.login)"']);
|
|
383
|
+
if (!who.ok) {
|
|
384
|
+
return null;
|
|
385
|
+
}
|
|
386
|
+
const [id, login] = who.out.trim().split(/\s+/);
|
|
387
|
+
return noreplyIdentity(login ?? '', id ?? '');
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
/** What a release would send, read without sending or building anything. */
|
|
391
|
+
export interface Collected {
|
|
392
|
+
outgoing: Outgoing;
|
|
393
|
+
/** A precondition failed: nothing leaves, not even the issue. */
|
|
394
|
+
precondition: EgressAttempt | null;
|
|
395
|
+
/** The pull request cannot be built; the ladder starts at the issue. */
|
|
396
|
+
prUnavailable: EgressAttempt | null;
|
|
397
|
+
/** The base commit the pull request is built on, when it can be built. */
|
|
398
|
+
baseSha: string | null;
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
/**
|
|
402
|
+
* Read what the plan may send and where. The dry run renders this; the release
|
|
403
|
+
* recomputes it and accepts only an approval of the same bytes.
|
|
404
|
+
*/
|
|
405
|
+
export function collectOutgoing(
|
|
406
|
+
record: DefectRecord,
|
|
407
|
+
plan: ReleasePlan,
|
|
408
|
+
probe: Probe,
|
|
409
|
+
runner: Runner,
|
|
410
|
+
repo: string,
|
|
411
|
+
): Collected {
|
|
412
|
+
const none: Collected = {
|
|
413
|
+
outgoing: { destination: null, pullRequest: null, issue: null },
|
|
414
|
+
precondition: null,
|
|
415
|
+
prUnavailable: null,
|
|
416
|
+
baseSha: null,
|
|
417
|
+
};
|
|
418
|
+
if (plan.route === 'local-only') {
|
|
419
|
+
return none;
|
|
420
|
+
}
|
|
421
|
+
// Re-rendered for the issue rung: a plan that degrades from pull-request
|
|
422
|
+
// must not file an issue whose body claims `Route: pull-request`.
|
|
423
|
+
const issue = { title: plan.title, body: plan.route === 'issue' ? plan.body : renderUpstreamBody(record, 'issue') };
|
|
424
|
+
// Where the bytes go is part of what is approved: the same text sent to
|
|
425
|
+
// another repository, from another account, is another act.
|
|
426
|
+
const account = resolveAccount(runner);
|
|
427
|
+
const issueOnly: Destination = {
|
|
428
|
+
repo,
|
|
429
|
+
account,
|
|
430
|
+
route: plan.route,
|
|
431
|
+
rungs: ['issue'],
|
|
432
|
+
remote: null,
|
|
433
|
+
baseSha: null,
|
|
434
|
+
};
|
|
435
|
+
const out: Collected = { ...none, outgoing: { destination: issueOnly, pullRequest: null, issue } };
|
|
436
|
+
if (plan.route !== 'pull-request') {
|
|
437
|
+
return out;
|
|
438
|
+
}
|
|
439
|
+
const checkout = probe.agentConfigCheckout!;
|
|
440
|
+
const author = runner('git', ['branch', '--show-current'], checkout).out.trim();
|
|
441
|
+
if (!author || author === 'main') {
|
|
442
|
+
// Precondition, not an egress failure: the authored fix exists and
|
|
443
|
+
// must ride its own branch — an issue instead would drop the fix.
|
|
444
|
+
return {
|
|
445
|
+
...out,
|
|
446
|
+
precondition: {
|
|
447
|
+
step: 'branch-check',
|
|
448
|
+
ok: false,
|
|
449
|
+
detail:
|
|
450
|
+
'the fix must sit on its own branch in the agent-config checkout ' +
|
|
451
|
+
`(currently: ${author || 'detached'})`,
|
|
452
|
+
},
|
|
453
|
+
};
|
|
454
|
+
}
|
|
455
|
+
const unavailable = (step: string, detail: string): Collected => ({
|
|
456
|
+
...out,
|
|
457
|
+
outgoing: { ...out.outgoing, destination: { ...issueOnly, route: 'issue' } },
|
|
458
|
+
prUnavailable: { step, ok: false, detail },
|
|
459
|
+
});
|
|
460
|
+
const identity = resolveIdentity(runner);
|
|
461
|
+
if (identity === null) {
|
|
462
|
+
return unavailable('identity', 'identity: no noreply identity could be resolved for the signed-in account');
|
|
463
|
+
}
|
|
464
|
+
const base = runner('git', ['rev-parse', '--verify', `${PAYLOAD_BASE_REF}^{commit}`], checkout);
|
|
465
|
+
if (!base.ok) {
|
|
466
|
+
return unavailable('patch-build', `patch-build: ${PAYLOAD_BASE_REF} cannot be resolved`);
|
|
467
|
+
}
|
|
468
|
+
// The net change since the merge base, binary-safe, never summarised by a
|
|
469
|
+
// textconv or an external driver: this is the patch that is committed.
|
|
470
|
+
const diff = runner(
|
|
471
|
+
'git',
|
|
472
|
+
['diff', '--binary', '--no-color', '--no-ext-diff', '--no-textconv', `${PAYLOAD_BASE_REF}...${author}`],
|
|
473
|
+
checkout,
|
|
474
|
+
);
|
|
475
|
+
if (!diff.ok) {
|
|
476
|
+
return unavailable('patch-build', `patch-build: the change on ${PAYLOAD_BASE_REF}...<branch> could not be read`);
|
|
477
|
+
}
|
|
478
|
+
const rungs: Destination['rungs'] =
|
|
479
|
+
plan.pushVia === 'upstream' && probe.canFork ? ['upstream', 'fork', 'issue'] : [plan.pushVia ?? 'upstream', 'issue'];
|
|
480
|
+
let remote: string | null = null;
|
|
481
|
+
if (rungs[0] === 'upstream') {
|
|
482
|
+
const url = runner('git', ['remote', 'get-url', 'origin'], checkout);
|
|
483
|
+
if (!url.ok || url.out.trim() === '') {
|
|
484
|
+
return unavailable('destination', 'destination: the origin remote of the checkout could not be read');
|
|
485
|
+
}
|
|
486
|
+
remote = url.out.trim();
|
|
487
|
+
} else if (account !== null) {
|
|
488
|
+
remote = `https://github.com/${account}/${repo.split('/')[1] ?? repo}.git`;
|
|
489
|
+
}
|
|
490
|
+
if (account === null || remote === null) {
|
|
491
|
+
return unavailable('destination', 'destination: the account the pull request would carry could not be resolved');
|
|
492
|
+
}
|
|
493
|
+
if (diff.out.trim() === '') {
|
|
494
|
+
return {
|
|
495
|
+
...out,
|
|
496
|
+
precondition: {
|
|
497
|
+
step: 'patch-build',
|
|
498
|
+
ok: false,
|
|
499
|
+
detail: `the branch carries no change against ${PAYLOAD_BASE_REF}; there is no fix to send`,
|
|
500
|
+
},
|
|
501
|
+
};
|
|
502
|
+
}
|
|
503
|
+
return {
|
|
504
|
+
...out,
|
|
505
|
+
baseSha: base.out.trim(),
|
|
506
|
+
outgoing: {
|
|
507
|
+
destination: { repo, account, route: 'pull-request', rungs, remote, baseSha: base.out.trim() },
|
|
508
|
+
issue,
|
|
509
|
+
pullRequest: {
|
|
510
|
+
branch: retroBranch(record.fingerprint),
|
|
511
|
+
identity,
|
|
512
|
+
message: commitMessage(plan.title, record.fingerprint),
|
|
513
|
+
patch: diff.out,
|
|
514
|
+
title: plan.title,
|
|
515
|
+
body: plan.body,
|
|
516
|
+
},
|
|
517
|
+
},
|
|
518
|
+
};
|
|
519
|
+
}
|
|
520
|
+
|
|
521
|
+
/** The dry run: the account, the destination and payload, then their digest. */
|
|
522
|
+
export function renderDryRun(plan: ReleasePlan, account: string | null, collected?: Collected): string {
|
|
523
|
+
let out = '';
|
|
524
|
+
if (plan.route === 'pull-request' || plan.route === 'issue') {
|
|
525
|
+
out +=
|
|
526
|
+
account !== null
|
|
527
|
+
? ` ACCOUNT the ${plan.route} will be opened as GitHub account '${account}'\n`
|
|
528
|
+
: ` ACCOUNT the ${plan.route} will carry the GitHub account gh is signed in as; ` +
|
|
529
|
+
'that account could not be resolved here\n';
|
|
530
|
+
}
|
|
531
|
+
if (collected === undefined) {
|
|
532
|
+
return `${out}\n--- ${plan.title} ---\n${plan.body}\n`;
|
|
533
|
+
}
|
|
534
|
+
if (collected.precondition !== null) {
|
|
535
|
+
return `${out} STOP ${collected.precondition.detail}\n`;
|
|
536
|
+
}
|
|
537
|
+
if (collected.prUnavailable !== null) {
|
|
538
|
+
out += ` NOTE no pull request: ${collected.prUnavailable.detail}; the issue is what would be sent\n`;
|
|
539
|
+
}
|
|
540
|
+
if (collected.outgoing.pullRequest !== null) {
|
|
541
|
+
out += ' DATE the commit is dated at the moment of release, in UTC\n';
|
|
542
|
+
}
|
|
543
|
+
out += `\n${renderOutgoing(collected.outgoing)}`;
|
|
544
|
+
if (plan.route !== 'local-only') {
|
|
545
|
+
out += `\n DIGEST ${outgoingDigest(collected.outgoing)}\n`;
|
|
546
|
+
out += ' Send exactly these bytes: self-repair:release <fingerprint> --approve <digest>\n';
|
|
547
|
+
}
|
|
548
|
+
return out;
|
|
264
549
|
}
|
|
265
550
|
|
|
266
551
|
const FORK_REMOTE = 'self-repair-fork';
|
|
@@ -271,24 +556,131 @@ function failDetail(step: string, r: RunResult): string {
|
|
|
271
556
|
: `${step}: ${r.out.trim() || 'failed'}`;
|
|
272
557
|
}
|
|
273
558
|
|
|
559
|
+
/** A commit date in UTC, so the local timezone offset does not leave with it. */
|
|
560
|
+
function utcDate(nowIso: string): string {
|
|
561
|
+
const ms = Date.parse(nowIso);
|
|
562
|
+
return `${Math.floor((Number.isFinite(ms) ? ms : Date.now()) / 1000)} +0000`;
|
|
563
|
+
}
|
|
564
|
+
|
|
565
|
+
/**
|
|
566
|
+
* Build the one commit that is pushed: the approved patch on the base, in a
|
|
567
|
+
* temporary index with no working tree — so no hook, no checkout state and no
|
|
568
|
+
* file outside the patch can reach it. Unsigned, because a signature would
|
|
569
|
+
* carry the configured identity the noreply one replaces.
|
|
570
|
+
*/
|
|
571
|
+
function buildCleanCommit(
|
|
572
|
+
pr: OutgoingPullRequest,
|
|
573
|
+
baseSha: string,
|
|
574
|
+
checkout: string,
|
|
575
|
+
deps: ReleaseDeps,
|
|
576
|
+
): { sha: string } | EgressAttempt {
|
|
577
|
+
const tmp = fs.mkdtempSync(path.join(os.tmpdir(), 'self-repair-'));
|
|
578
|
+
try {
|
|
579
|
+
const patchFile = path.join(tmp, 'change.patch');
|
|
580
|
+
const messageFile = path.join(tmp, 'message');
|
|
581
|
+
fs.writeFileSync(patchFile, pr.patch);
|
|
582
|
+
fs.writeFileSync(messageFile, pr.message);
|
|
583
|
+
const index = { GIT_INDEX_FILE: path.join(tmp, 'index') };
|
|
584
|
+
const step = (args: string[], env: NodeJS.ProcessEnv): RunResult => deps.runner('git', args, checkout, env);
|
|
585
|
+
const read = step(['read-tree', baseSha], index);
|
|
586
|
+
if (!read.ok) return { step: 'patch-build', ok: false, detail: failDetail('patch-build', read) };
|
|
587
|
+
const applied = step(['apply', '--cached', '--binary', patchFile], index);
|
|
588
|
+
if (!applied.ok) return { step: 'patch-build', ok: false, detail: failDetail('patch-build', applied) };
|
|
589
|
+
const tree = step(['write-tree'], index);
|
|
590
|
+
if (!tree.ok) return { step: 'patch-build', ok: false, detail: failDetail('patch-build', tree) };
|
|
591
|
+
const date = utcDate(deps.now());
|
|
592
|
+
const commit = step(['commit-tree', '--no-gpg-sign', tree.out.trim(), '-p', baseSha, '-F', messageFile], {
|
|
593
|
+
GIT_AUTHOR_NAME: pr.identity.name,
|
|
594
|
+
GIT_AUTHOR_EMAIL: pr.identity.email,
|
|
595
|
+
GIT_AUTHOR_DATE: date,
|
|
596
|
+
GIT_COMMITTER_NAME: pr.identity.name,
|
|
597
|
+
GIT_COMMITTER_EMAIL: pr.identity.email,
|
|
598
|
+
GIT_COMMITTER_DATE: date,
|
|
599
|
+
});
|
|
600
|
+
if (!commit.ok) return { step: 'patch-build', ok: false, detail: failDetail('patch-build', commit) };
|
|
601
|
+
return { sha: commit.out.trim() };
|
|
602
|
+
} finally {
|
|
603
|
+
fs.rmSync(tmp, { recursive: true, force: true });
|
|
604
|
+
}
|
|
605
|
+
}
|
|
606
|
+
|
|
607
|
+
/**
|
|
608
|
+
* Every object the push adds to the base, read from the object store: each
|
|
609
|
+
* commit raw, each tree and blob path, each blob whole. Null when any of it
|
|
610
|
+
* cannot be read — the caller refuses rather than send what nobody read.
|
|
611
|
+
*/
|
|
612
|
+
function readPushedObjects(
|
|
613
|
+
runner: Runner,
|
|
614
|
+
checkout: string,
|
|
615
|
+
baseSha: string,
|
|
616
|
+
sha: string,
|
|
617
|
+
): { commits: string; objects: string; unscannable: number } | null {
|
|
618
|
+
const list = runner('git', ['rev-list', '--objects', `${baseSha}..${sha}`], checkout);
|
|
619
|
+
if (!list.ok) {
|
|
620
|
+
return null;
|
|
621
|
+
}
|
|
622
|
+
let commits = '';
|
|
623
|
+
let objects = '';
|
|
624
|
+
let unscannable = 0;
|
|
625
|
+
for (const line of list.out.split('\n')) {
|
|
626
|
+
const [oid, ...rest] = line.trim().split(' ');
|
|
627
|
+
if (!oid) continue;
|
|
628
|
+
const type = runner('git', ['cat-file', '-t', oid], checkout);
|
|
629
|
+
if (!type.ok) return null;
|
|
630
|
+
const kind = type.out.trim();
|
|
631
|
+
if (kind === 'commit') {
|
|
632
|
+
const body = runner('git', ['cat-file', 'commit', oid], checkout);
|
|
633
|
+
if (!body.ok) return null;
|
|
634
|
+
commits += `${body.out}\n`;
|
|
635
|
+
continue;
|
|
636
|
+
}
|
|
637
|
+
objects += `${rest.join(' ')}\n`;
|
|
638
|
+
if (kind === 'blob') {
|
|
639
|
+
const blob = runner('git', ['cat-file', 'blob', oid], checkout, undefined, { binary: true });
|
|
640
|
+
if (!blob.ok) return null;
|
|
641
|
+
const bytes = blob.bytes ?? Buffer.from(blob.out, 'utf-8');
|
|
642
|
+
// A blob that is not UTF-8 text, or carries a NUL, is not a text
|
|
643
|
+
// the detector table can read: a token spelled in UTF-16, or split
|
|
644
|
+
// by an invalid sequence, survives no text view of it. The floor
|
|
645
|
+
// cannot clear it, so it refuses rather than guesses.
|
|
646
|
+
if (bytes.includes(0) || !isUtf8(bytes)) {
|
|
647
|
+
unscannable += 1;
|
|
648
|
+
}
|
|
649
|
+
// Scanned byte for byte as well: latin1 maps each byte to one
|
|
650
|
+
// character, so nothing is replaced before the rules read it.
|
|
651
|
+
objects += `${bytes.toString('latin1')}\n`;
|
|
652
|
+
}
|
|
653
|
+
}
|
|
654
|
+
return { commits, objects, unscannable };
|
|
655
|
+
}
|
|
656
|
+
|
|
657
|
+
const IDENTITY_LINE_RE = /^(?:author|committer) .* <([^>]*)> \d+ [+-]\d{4}$/gm;
|
|
658
|
+
|
|
659
|
+
/** Every e-mail a commit object records — what the push would show next to the change. */
|
|
660
|
+
function committedEmails(commits: string): string[] {
|
|
661
|
+
return [...commits.matchAll(IDENTITY_LINE_RE)].map((m) => m[1] ?? '');
|
|
662
|
+
}
|
|
663
|
+
|
|
274
664
|
/**
|
|
275
|
-
* Push the
|
|
276
|
-
* PR. Returns null on success; on any step failure or timeout returns
|
|
277
|
-
* failed attempt so the caller degrades down the ladder.
|
|
665
|
+
* Push the synthesised commit — directly, or via fork → cross-repo PR — then
|
|
666
|
+
* open the PR. Returns null on success; on any step failure or timeout returns
|
|
667
|
+
* the failed attempt so the caller degrades down the ladder.
|
|
278
668
|
*/
|
|
279
669
|
function tryPullRequest(
|
|
280
|
-
|
|
670
|
+
pr: OutgoingPullRequest,
|
|
671
|
+
sha: string,
|
|
281
672
|
probe: Probe,
|
|
282
673
|
repo: string,
|
|
283
|
-
branch: string,
|
|
284
674
|
via: PushVia,
|
|
285
675
|
deps: ReleaseDeps,
|
|
676
|
+
approvedAccount: string | null,
|
|
286
677
|
): EgressAttempt | null {
|
|
287
678
|
const checkout = probe.agentConfigCheckout!;
|
|
288
|
-
|
|
679
|
+
const refspec = `${sha}:refs/heads/${pr.branch}`;
|
|
680
|
+
let prHead = pr.branch;
|
|
289
681
|
|
|
290
682
|
if (via === 'upstream') {
|
|
291
|
-
const pushed = deps.runner('git', ['push', '
|
|
683
|
+
const pushed = deps.runner('git', ['push', 'origin', refspec], checkout);
|
|
292
684
|
if (!pushed.ok) {
|
|
293
685
|
return { step: 'push-upstream', ok: false, detail: failDetail('push-upstream', pushed) };
|
|
294
686
|
}
|
|
@@ -302,34 +694,53 @@ function tryPullRequest(
|
|
|
302
694
|
return { step: 'whoami', ok: false, detail: failDetail('whoami', who) };
|
|
303
695
|
}
|
|
304
696
|
const login = who.out.trim();
|
|
697
|
+
if (login !== approvedAccount) {
|
|
698
|
+
return { step: 'whoami', ok: false, detail: 'whoami: the signed-in account changed after the approval — nothing was pushed' };
|
|
699
|
+
}
|
|
305
700
|
const repoName = repo.split('/')[1] ?? repo;
|
|
701
|
+
const forkUrl = `https://github.com/${login}/${repoName}.git`;
|
|
702
|
+
// A remote of that name already in the checkout's config is reused only
|
|
703
|
+
// when it points at the approved fork; anything else is repointed first.
|
|
306
704
|
const hasRemote = deps.runner('git', ['remote', 'get-url', FORK_REMOTE], checkout);
|
|
307
|
-
if (!hasRemote.ok) {
|
|
308
|
-
const added = deps.runner(
|
|
309
|
-
'git',
|
|
310
|
-
['remote', 'add', FORK_REMOTE, `https://github.com/${login}/${repoName}.git`],
|
|
311
|
-
checkout,
|
|
312
|
-
);
|
|
705
|
+
if (!hasRemote.ok || hasRemote.out.trim() !== forkUrl) {
|
|
706
|
+
const added = deps.runner('git', ['remote', hasRemote.ok ? 'set-url' : 'add', FORK_REMOTE, forkUrl], checkout);
|
|
313
707
|
if (!added.ok) {
|
|
314
708
|
return { step: 'fork-remote', ok: false, detail: failDetail('fork-remote', added) };
|
|
315
709
|
}
|
|
316
710
|
}
|
|
317
|
-
const pushed = deps.runner('git', ['push',
|
|
711
|
+
const pushed = deps.runner('git', ['push', FORK_REMOTE, refspec], checkout);
|
|
318
712
|
if (!pushed.ok) {
|
|
319
713
|
return { step: 'push-fork', ok: false, detail: failDetail('push-fork', pushed) };
|
|
320
714
|
}
|
|
321
|
-
prHead = `${login}:${branch}`;
|
|
715
|
+
prHead = `${login}:${pr.branch}`;
|
|
322
716
|
}
|
|
323
717
|
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
718
|
+
// `--draft` on every rung, never only on the fork one. A draft is the
|
|
719
|
+
// weaker of the two states a pull request can arrive in: it asks for no
|
|
720
|
+
// review, notifies no code owner, and runs no required check until someone
|
|
721
|
+
// marks it ready. An upstream finding is a proposal from a machine the
|
|
722
|
+
// maintainer has not met, so the maintainer decides when it becomes a
|
|
723
|
+
// request. Opening ready-for-review is the stronger act and nothing here
|
|
724
|
+
// has the standing to take it. `--head` is always named: the pushed
|
|
725
|
+
// branch is not the one checked out.
|
|
726
|
+
const prArgs = [
|
|
727
|
+
'pr',
|
|
728
|
+
'create',
|
|
729
|
+
'--repo',
|
|
730
|
+
repo,
|
|
731
|
+
'--draft',
|
|
732
|
+
'--title',
|
|
733
|
+
pr.title,
|
|
734
|
+
'--body',
|
|
735
|
+
pr.body,
|
|
736
|
+
'--head',
|
|
737
|
+
prHead,
|
|
738
|
+
];
|
|
739
|
+
const created = deps.runner('gh', prArgs, checkout);
|
|
740
|
+
if (!created.ok) {
|
|
741
|
+
return { step: 'pr-create', ok: false, detail: failDetail('pr-create', created) };
|
|
331
742
|
}
|
|
332
|
-
process.stdout.write(`${
|
|
743
|
+
process.stdout.write(`${created.out}`);
|
|
333
744
|
return null;
|
|
334
745
|
}
|
|
335
746
|
|
|
@@ -348,28 +759,45 @@ export function executeRelease(
|
|
|
348
759
|
deps: ReleaseDeps,
|
|
349
760
|
): ReleaseOutcome {
|
|
350
761
|
const attempts: EgressAttempt[] = [];
|
|
762
|
+
if (plan.route === 'local-only') {
|
|
763
|
+
return { published: null, attempts };
|
|
764
|
+
}
|
|
765
|
+
const collected = collectOutgoing(record, plan, probe, deps.runner, repo);
|
|
766
|
+
if (collected.precondition !== null) {
|
|
767
|
+
attempts.push(collected.precondition);
|
|
768
|
+
return { published: null, attempts };
|
|
769
|
+
}
|
|
770
|
+
const refusal = approvalRefusal(record, collected.outgoing, deps.approvedDigest);
|
|
771
|
+
if (refusal !== null) {
|
|
772
|
+
attempts.push({ step: 'approval', ok: false, detail: `approval: ${refusal} — nothing was sent` });
|
|
773
|
+
return { published: null, attempts };
|
|
774
|
+
}
|
|
775
|
+
const deny = deps.denyIdentifiers ?? [];
|
|
776
|
+
const pr = collected.outgoing.pullRequest;
|
|
351
777
|
|
|
352
778
|
if (plan.route === 'pull-request') {
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
`(currently: ${branch || 'detached'})`,
|
|
364
|
-
});
|
|
779
|
+
// Title and body are scanned before and independently of anything
|
|
780
|
+
// built from the branch, so a build failure cannot skip them. A finding
|
|
781
|
+
// there would leave through the issue too — its title is the same and
|
|
782
|
+
// its body is rendered from the same record.
|
|
783
|
+
const headFindings = scanPayload(
|
|
784
|
+
{ branch: pr?.branch ?? '', commits: '', objects: '', title: plan.title, body: plan.body },
|
|
785
|
+
deny,
|
|
786
|
+
);
|
|
787
|
+
if (headFindings.some((f) => f.part === 'title' || f.part === 'body')) {
|
|
788
|
+
attempts.push({ step: 'payload-scan', ok: false, detail: describeFindings(headFindings) });
|
|
365
789
|
return { published: null, attempts };
|
|
366
790
|
}
|
|
791
|
+
if (collected.prUnavailable !== null) {
|
|
792
|
+
attempts.push(collected.prUnavailable);
|
|
793
|
+
}
|
|
794
|
+
const sha = pr !== null && collected.baseSha !== null ? cleanCommit(pr, collected.baseSha, probe, deps, deny, attempts) : null;
|
|
795
|
+
// Any refusal skips every push rung and degrades to the issue, which
|
|
796
|
+
// carries none of the refused branch, commit or object bytes.
|
|
367
797
|
const ladder: PushVia[] =
|
|
368
|
-
plan.pushVia === 'upstream' && probe.canFork
|
|
369
|
-
? ['upstream', 'fork']
|
|
370
|
-
: [plan.pushVia ?? 'upstream'];
|
|
798
|
+
sha === null ? [] : plan.pushVia === 'upstream' && probe.canFork ? ['upstream', 'fork'] : [plan.pushVia ?? 'upstream'];
|
|
371
799
|
for (const via of ladder) {
|
|
372
|
-
const failed = tryPullRequest(
|
|
800
|
+
const failed = tryPullRequest(pr!, sha!, probe, repo, via, deps, collected.outgoing.destination?.account ?? null);
|
|
373
801
|
if (failed === null) {
|
|
374
802
|
return { published: 'pull-request', attempts };
|
|
375
803
|
}
|
|
@@ -377,32 +805,71 @@ export function executeRelease(
|
|
|
377
805
|
}
|
|
378
806
|
}
|
|
379
807
|
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
'issue',
|
|
388
|
-
'create',
|
|
389
|
-
'--repo',
|
|
390
|
-
repo,
|
|
391
|
-
'--title',
|
|
392
|
-
plan.title,
|
|
393
|
-
'--body',
|
|
394
|
-
issueBody,
|
|
395
|
-
]);
|
|
396
|
-
if (issue.ok) {
|
|
397
|
-
process.stdout.write(`${issue.out}`);
|
|
398
|
-
return { published: 'issue', attempts };
|
|
399
|
-
}
|
|
400
|
-
attempts.push({ step: 'issue-create', ok: false, detail: failDetail('issue-create', issue) });
|
|
808
|
+
const issue = collected.outgoing.issue!;
|
|
809
|
+
// Scanned on every route that reaches here: the degraded body is re-rendered,
|
|
810
|
+
// and an issue-only plan never passed the pull-request scan above.
|
|
811
|
+
const bodyFindings = scanPayload({ branch: '', commits: '', objects: '', title: issue.title, body: issue.body }, deny);
|
|
812
|
+
if (bodyFindings.length > 0) {
|
|
813
|
+
attempts.push({ step: 'payload-scan', ok: false, detail: describeFindings(bodyFindings) });
|
|
814
|
+
return { published: null, attempts };
|
|
401
815
|
}
|
|
402
|
-
|
|
816
|
+
const created = deps.runner('gh', ['issue', 'create', '--repo', repo, '--title', issue.title, '--body', issue.body]);
|
|
817
|
+
if (created.ok) {
|
|
818
|
+
process.stdout.write(`${created.out}`);
|
|
819
|
+
return { published: 'issue', attempts };
|
|
820
|
+
}
|
|
821
|
+
attempts.push({ step: 'issue-create', ok: false, detail: failDetail('issue-create', created) });
|
|
403
822
|
return { published: null, attempts };
|
|
404
823
|
}
|
|
405
824
|
|
|
825
|
+
/**
|
|
826
|
+
* Build the commit and scan every object it adds. Returns the sha only when
|
|
827
|
+
* the floor found nothing and the commit carries the noreply identity alone;
|
|
828
|
+
* otherwise records why and returns null.
|
|
829
|
+
*/
|
|
830
|
+
function cleanCommit(
|
|
831
|
+
pr: OutgoingPullRequest,
|
|
832
|
+
baseSha: string,
|
|
833
|
+
probe: Probe,
|
|
834
|
+
deps: ReleaseDeps,
|
|
835
|
+
deny: readonly string[],
|
|
836
|
+
attempts: EgressAttempt[],
|
|
837
|
+
): string | null {
|
|
838
|
+
const checkout = probe.agentConfigCheckout!;
|
|
839
|
+
const built = buildCleanCommit(pr, baseSha, checkout, deps);
|
|
840
|
+
if (!('sha' in built)) {
|
|
841
|
+
attempts.push(built);
|
|
842
|
+
return null;
|
|
843
|
+
}
|
|
844
|
+
const pushed = readPushedObjects(deps.runner, checkout, baseSha, built.sha);
|
|
845
|
+
if (pushed === null) {
|
|
846
|
+
attempts.push({
|
|
847
|
+
step: 'payload-scan',
|
|
848
|
+
ok: false,
|
|
849
|
+
detail: 'payload floor refused the pull request: the objects the push adds could not be read',
|
|
850
|
+
});
|
|
851
|
+
return null;
|
|
852
|
+
}
|
|
853
|
+
const findings = scanPayload({ commits: pushed.commits, objects: pushed.objects, branch: pr.branch, title: '', body: '' }, deny);
|
|
854
|
+
if (pushed.unscannable > 0) {
|
|
855
|
+
findings.push({ part: 'object', rule: 'unscannable-binary' });
|
|
856
|
+
}
|
|
857
|
+
if (findings.length > 0) {
|
|
858
|
+
attempts.push({ step: 'payload-scan', ok: false, detail: describeFindings(findings) });
|
|
859
|
+
return null;
|
|
860
|
+
}
|
|
861
|
+
const emails = committedEmails(pushed.commits);
|
|
862
|
+
if (emails.length === 0 || emails.some((e) => e !== pr.identity.email || !isNoreplyEmail(e))) {
|
|
863
|
+
attempts.push({
|
|
864
|
+
step: 'identity',
|
|
865
|
+
ok: false,
|
|
866
|
+
detail: 'identity: the built commit records an identity other than the noreply one — nothing was pushed',
|
|
867
|
+
});
|
|
868
|
+
return null;
|
|
869
|
+
}
|
|
870
|
+
return built.sha;
|
|
871
|
+
}
|
|
872
|
+
|
|
406
873
|
/**
|
|
407
874
|
* The creation cap's drop tally, printed whenever it is non-zero. This is the
|
|
408
875
|
* half that keeps the cap honest: a bounded store is only an improvement if
|
|
@@ -446,7 +913,9 @@ function statusCmd(root: string): number {
|
|
|
446
913
|
}
|
|
447
914
|
|
|
448
915
|
function releaseCmd(root: string, argv: string[]): number {
|
|
449
|
-
|
|
916
|
+
// A flag's value is not the fingerprint: `--approve <digest>` and
|
|
917
|
+
// `--repo <owner/name>` both take one.
|
|
918
|
+
const fp = argv.find((a, i) => !a.startsWith('-') && argv[i - 1] !== '--approve' && argv[i - 1] !== '--repo');
|
|
450
919
|
if (!fp) {
|
|
451
920
|
process.stderr.write('self-repair:release needs a fingerprint (see self-repair:status).\n');
|
|
452
921
|
return EXIT_FAIL;
|
|
@@ -473,7 +942,8 @@ function releaseCmd(root: string, argv: string[]): number {
|
|
|
473
942
|
process.stdout.write(` DENY ${plan.patch_denied}\n`);
|
|
474
943
|
}
|
|
475
944
|
if (dryRun) {
|
|
476
|
-
|
|
945
|
+
const account = plan.route === 'local-only' ? null : resolveAccount(runCommand);
|
|
946
|
+
process.stdout.write(renderDryRun(plan, account, collectOutgoing(record, plan, probe, runCommand, repo)));
|
|
477
947
|
return EXIT_OK;
|
|
478
948
|
}
|
|
479
949
|
if (plan.route === 'local-only') {
|
|
@@ -483,7 +953,13 @@ function releaseCmd(root: string, argv: string[]): number {
|
|
|
483
953
|
return EXIT_OK;
|
|
484
954
|
}
|
|
485
955
|
|
|
486
|
-
const
|
|
956
|
+
const approveArg = argv.indexOf('--approve');
|
|
957
|
+
const deps: ReleaseDeps = {
|
|
958
|
+
runner: runCommand,
|
|
959
|
+
now: () => new Date().toISOString(),
|
|
960
|
+
denyIdentifiers: consumerDenyList(_detect_project_identifiers(root), repo),
|
|
961
|
+
approvedDigest: approveArg >= 0 ? (argv[approveArg + 1] ?? null) : null,
|
|
962
|
+
};
|
|
487
963
|
const outcome = executeRelease(record, plan, probe, repo, deps);
|
|
488
964
|
|
|
489
965
|
for (const a of outcome.attempts) {
|