@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
|
@@ -118,8 +118,38 @@ export interface DefectFinding {
|
|
|
118
118
|
* worse than free text — it looks joined and joins to nothing.
|
|
119
119
|
*/
|
|
120
120
|
proposes?: string[];
|
|
121
|
+
/**
|
|
122
|
+
* The canonical claim, a stable slug (`drain/baseline-drift`). A retro
|
|
123
|
+
* writes its `Candidate.subject` here; two syntheses that agree on the
|
|
124
|
+
* claim spell it identically, which is what lets two installations meet.
|
|
125
|
+
*
|
|
126
|
+
* The upstream body carries it (`renderUpstreamBody`, D10); the key does
|
|
127
|
+
* not — whether it may identify a record across installations waits on a
|
|
128
|
+
* corpus showing one subject per mechanism.
|
|
129
|
+
*/
|
|
130
|
+
principle?: string;
|
|
131
|
+
/** One bounded line naming how the defect happens. No producer field yet. Free text, so it never leaves. */
|
|
132
|
+
mechanism?: string;
|
|
133
|
+
/** One bounded line naming what would refute the claim; a retro's `Candidate.falsifier`. Never leaves. */
|
|
134
|
+
falsifier?: string;
|
|
135
|
+
/**
|
|
136
|
+
* The retro unit keys that named this record (`docs/contracts/retro-v1.md`).
|
|
137
|
+
* Local bookkeeping only, like `release_errors`: no renderer reads it and
|
|
138
|
+
* the fingerprint ignores it, so it joins a record to the finished work it
|
|
139
|
+
* came from without widening what can leave the machine.
|
|
140
|
+
*/
|
|
141
|
+
unit_keys?: string[];
|
|
121
142
|
}
|
|
122
143
|
|
|
144
|
+
/** `principle` shape: non-empty lowercase segments joined by single `/`, `.`, `_` or `-`; at most 80 characters. */
|
|
145
|
+
export const PRINCIPLE_RE = /^(?=.{1,80}$)[a-z0-9]+(?:[/._-][a-z0-9]+)*$/;
|
|
146
|
+
|
|
147
|
+
/** Control characters, including the Unicode line and paragraph separators. */
|
|
148
|
+
const CONTROL_RE = /[\u0000-\u001f\u007f\u2028\u2029]/;
|
|
149
|
+
|
|
150
|
+
/** Length bound for `mechanism` and `falsifier`, the same as an evidence span. */
|
|
151
|
+
export const MAX_CLAIM_LINE = 160;
|
|
152
|
+
|
|
123
153
|
/** The four asset kinds a `target` entry may address. */
|
|
124
154
|
export const TARGET_KINDS = ['rule', 'skill', 'command', 'hook'] as const;
|
|
125
155
|
export type TargetKind = (typeof TARGET_KINDS)[number];
|
|
@@ -234,7 +264,13 @@ export function sanitizeEvidence(raw: string): string {
|
|
|
234
264
|
* of being scrubbed into publishable shape.
|
|
235
265
|
*/
|
|
236
266
|
export function egressBlockedReason(record: DefectRecord, repoRoot?: string | null): string | null {
|
|
237
|
-
|
|
267
|
+
// Every free value the record carries, not only the two a report renders
|
|
268
|
+
// today — a field the floor never saw must not become sendable later by a
|
|
269
|
+
// renderer change alone.
|
|
270
|
+
const text = [record.suggested_surface, record.evidence, record.principle, record.mechanism, record.falsifier]
|
|
271
|
+
.filter((v): v is string => typeof v === 'string' && v.length > 0)
|
|
272
|
+
.join('\n');
|
|
273
|
+
const result = redact_low_impact_entry(text, {
|
|
238
274
|
repoRoot: repoRoot ?? null,
|
|
239
275
|
});
|
|
240
276
|
if (result.ok) {
|
|
@@ -752,6 +788,15 @@ export function validateRecord(record: DefectRecord): string[] {
|
|
|
752
788
|
out.push(`target '${value}' is not \`<rule|skill|command|hook>:<id>\``);
|
|
753
789
|
}
|
|
754
790
|
}
|
|
791
|
+
if (record.principle !== undefined && !PRINCIPLE_RE.test(record.principle)) {
|
|
792
|
+
out.push(`principle '${record.principle}' is not a lowercase slug of at most 80 characters`);
|
|
793
|
+
}
|
|
794
|
+
for (const field of ['mechanism', 'falsifier'] as const) {
|
|
795
|
+
const value = record[field];
|
|
796
|
+
if (value !== undefined && (value.trim() === '' || value.length > MAX_CLAIM_LINE || CONTROL_RE.test(value))) {
|
|
797
|
+
out.push(`${field} must be one non-empty line of at most ${MAX_CLAIM_LINE} characters`);
|
|
798
|
+
}
|
|
799
|
+
}
|
|
755
800
|
return out;
|
|
756
801
|
}
|
|
757
802
|
|
|
@@ -764,6 +809,20 @@ function _mergeIds(a: readonly string[] | undefined, b: readonly string[] | unde
|
|
|
764
809
|
return out;
|
|
765
810
|
}
|
|
766
811
|
|
|
812
|
+
const CLAIM_FIELDS = ['principle', 'mechanism', 'falsifier'] as const;
|
|
813
|
+
|
|
814
|
+
// The three fields are one claim: they are adopted together from one source,
|
|
815
|
+
// never merged per field, so a falsifier is never paired with a claim it was
|
|
816
|
+
// not written for.
|
|
817
|
+
function claimFields(existing: DefectFinding, finding: DefectFinding): Partial<DefectFinding> {
|
|
818
|
+
const source = CLAIM_FIELDS.some((f) => existing[f] !== undefined) ? existing : finding;
|
|
819
|
+
const out: Partial<DefectFinding> = {};
|
|
820
|
+
for (const field of CLAIM_FIELDS) {
|
|
821
|
+
if (source[field] !== undefined) out[field] = source[field];
|
|
822
|
+
}
|
|
823
|
+
return out;
|
|
824
|
+
}
|
|
825
|
+
|
|
767
826
|
export function mergeRecord(
|
|
768
827
|
existing: DefectRecord | null,
|
|
769
828
|
finding: DefectFinding,
|
|
@@ -773,6 +832,7 @@ export function mergeRecord(
|
|
|
773
832
|
if (existing !== null && existing.fingerprint === fp) {
|
|
774
833
|
const target = _mergeIds(existing.target, finding.target);
|
|
775
834
|
const proposes = _mergeIds(existing.proposes, finding.proposes);
|
|
835
|
+
const unitKeys = _mergeIds(existing.unit_keys, finding.unit_keys);
|
|
776
836
|
const merged: DefectRecord = {
|
|
777
837
|
...existing,
|
|
778
838
|
last_seen: now,
|
|
@@ -783,6 +843,9 @@ export function mergeRecord(
|
|
|
783
843
|
status: 'open',
|
|
784
844
|
...(target.length > 0 ? { target } : {}),
|
|
785
845
|
...(proposes.length > 0 ? { proposes } : {}),
|
|
846
|
+
...(unitKeys.length > 0 ? { unit_keys: unitKeys } : {}),
|
|
847
|
+
// A detector-opened record that a retro later names keeps the name.
|
|
848
|
+
...claimFields(existing, finding),
|
|
786
849
|
};
|
|
787
850
|
// `open` carries no wake condition; a stale one would read as a park.
|
|
788
851
|
delete merged.parked_until;
|
|
@@ -844,7 +907,11 @@ export function chooseEgress(cap: EgressCapability): EgressChoice {
|
|
|
844
907
|
return { route: 'local-only', pushVia: null };
|
|
845
908
|
}
|
|
846
909
|
|
|
847
|
-
/**
|
|
910
|
+
/**
|
|
911
|
+
* The full local report, free-text fields included. Deterministic — same
|
|
912
|
+
* record, same bytes. Used for a local-only record and the Class-B case; what
|
|
913
|
+
* leaves the machine is `renderUpstreamBody` in `self_repair_outgoing.ts`.
|
|
914
|
+
*/
|
|
848
915
|
export function renderReport(record: DefectRecord, route: EgressRoute): string {
|
|
849
916
|
const seen =
|
|
850
917
|
record.occurrences === 1
|
|
@@ -879,40 +946,3 @@ export function renderReport(record: DefectRecord, route: EgressRoute): string {
|
|
|
879
946
|
'construction — the record type has no field that can carry them.',
|
|
880
947
|
].join('\n');
|
|
881
948
|
}
|
|
882
|
-
|
|
883
|
-
/** The structured fields the upstream intake form collects. */
|
|
884
|
-
export interface ParsedReport {
|
|
885
|
-
defect_class: string;
|
|
886
|
-
fingerprint: string;
|
|
887
|
-
occurrences: number;
|
|
888
|
-
evidence: string;
|
|
889
|
-
suggested_surface: string;
|
|
890
|
-
}
|
|
891
|
-
|
|
892
|
-
/**
|
|
893
|
-
* Inverse of `renderReport` for the structured fields — the round-trip that
|
|
894
|
-
* pins the rendered body to the upstream issue form: every field the form
|
|
895
|
-
* collects is recoverable from a rendered report, so a `release` body and a
|
|
896
|
-
* manually-filed form carry the same clustering keys (fingerprint above all).
|
|
897
|
-
*/
|
|
898
|
-
export function parseReport(body: string): ParsedReport | null {
|
|
899
|
-
const cls = /^## Self-repair report — `([^`]+)`$/m.exec(body)?.[1];
|
|
900
|
-
const fp = /^- \*\*Fingerprint:\*\* `([^`]+)`$/m.exec(body)?.[1];
|
|
901
|
-
const seen = /^- \*\*Seen:\*\* (.+)$/m.exec(body)?.[1];
|
|
902
|
-
const evidence = /^### Evidence\n\n> (.*)$/m.exec(body)?.[1];
|
|
903
|
-
const surface = /### What the fix should address\n\n([\s\S]*?)\n\n---/.exec(body)?.[1];
|
|
904
|
-
if (!cls || !fp || !seen || evidence === undefined || !surface) {
|
|
905
|
-
return null;
|
|
906
|
-
}
|
|
907
|
-
const occurrences = seen.startsWith('once') ? 1 : Number(/^(\d+)×/.exec(seen)?.[1] ?? Number.NaN);
|
|
908
|
-
if (!Number.isFinite(occurrences)) {
|
|
909
|
-
return null;
|
|
910
|
-
}
|
|
911
|
-
return {
|
|
912
|
-
defect_class: cls,
|
|
913
|
-
fingerprint: fp,
|
|
914
|
-
occurrences,
|
|
915
|
-
evidence,
|
|
916
|
-
suggested_surface: surface.trim(),
|
|
917
|
-
};
|
|
918
|
-
}
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The exact bytes a release would send, rendered once for the person to read
|
|
3
|
+
* and digested once for the release to check.
|
|
4
|
+
*
|
|
5
|
+
* The dry run and the release build this from the same inputs, so an approval
|
|
6
|
+
* names the bytes that leave and where they go: the target repository, the
|
|
7
|
+
* account, the route and its fallback rungs, the push remote and the base
|
|
8
|
+
* commit; the branch name, the commit identity and message, the diff, the
|
|
9
|
+
* title and the body of the pull request; and the title and body of the issue
|
|
10
|
+
* the ladder degrades to. A change to any of them after the person read them
|
|
11
|
+
* changes the digest, and the release refuses. The comparison is `self_repair_class_b`'s `approve` — the one
|
|
12
|
+
* digest-bound approval in the tree — rather than a second one. The
|
|
13
|
+
* ratification `subjectDigest` was the other candidate and is not used: it
|
|
14
|
+
* digests the gated paths of a ratification subject at a revision, not an
|
|
15
|
+
* arbitrary outgoing payload.
|
|
16
|
+
*
|
|
17
|
+
* The commit date is not part of the digest. It is the moment of the release,
|
|
18
|
+
* stated in UTC so the local timezone offset does not leave with it.
|
|
19
|
+
*/
|
|
20
|
+
import { type DefectRecord, type EgressRoute } from './self_repair.js';
|
|
21
|
+
import { approve, caseDigest } from './self_repair_class_b.js';
|
|
22
|
+
|
|
23
|
+
/** A neutral branch: the fingerprint, never the author's branch name. */
|
|
24
|
+
export function retroBranch(fingerprint: string): string {
|
|
25
|
+
return `retro/${fingerprint.slice(0, 8)}`;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* The body of the pull request and the issue, built from closed fields only:
|
|
30
|
+
* the defect class, the intake source, the fingerprint, the occurrence count,
|
|
31
|
+
* the resolved targets and the principle slug — all shape-validated, none of
|
|
32
|
+
* them prose. The evidence span, the suggested surface, the mechanism and the
|
|
33
|
+
* falsifier are free text whatever their field name, so they stay on the
|
|
34
|
+
* machine (D10 of road-to-one-upstream-that-checks-what-leaves); `renderReport`
|
|
35
|
+
* still carries them for the local and Class-B case. No dates either: when a
|
|
36
|
+
* defect was seen is activity on the reporting machine, not part of the claim.
|
|
37
|
+
*/
|
|
38
|
+
export function renderUpstreamBody(record: DefectRecord, route: EgressRoute): string {
|
|
39
|
+
const targets = record.target !== undefined && record.target.length > 0 ? record.target.map((t) => `\`${t}\``).join(', ') : 'none identified';
|
|
40
|
+
const principle = record.principle !== undefined ? `\`${record.principle}\`` : 'not stated';
|
|
41
|
+
return [
|
|
42
|
+
`## Self-repair report — \`${record.defect_class}\``,
|
|
43
|
+
'',
|
|
44
|
+
`- **Source:** \`${record.source}\``,
|
|
45
|
+
`- **Fingerprint:** \`${record.fingerprint}\``,
|
|
46
|
+
`- **Occurrences:** ${record.occurrences}`,
|
|
47
|
+
`- **Route:** ${route}`,
|
|
48
|
+
`- **Targets:** ${targets}`,
|
|
49
|
+
`- **Principle:** ${principle}`,
|
|
50
|
+
'',
|
|
51
|
+
'### Package fixture',
|
|
52
|
+
'',
|
|
53
|
+
`Reproduce against this package's own \`${record.defect_class}\` detector in`,
|
|
54
|
+
'`src/scripts/_lib/self_repair.ts` and the targets named above.',
|
|
55
|
+
'',
|
|
56
|
+
'---',
|
|
57
|
+
'',
|
|
58
|
+
'Filed by the agent-config self-repair loop from closed fields only. The',
|
|
59
|
+
'evidence span, the suggested surface, the mechanism and the falsifier stayed',
|
|
60
|
+
'on the reporting machine; the person approved these exact bytes.',
|
|
61
|
+
].join('\n');
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/** The structured fields the upstream intake form collects. */
|
|
65
|
+
export interface ParsedUpstreamBody {
|
|
66
|
+
defect_class: string;
|
|
67
|
+
source: string;
|
|
68
|
+
fingerprint: string;
|
|
69
|
+
occurrences: number;
|
|
70
|
+
targets: string;
|
|
71
|
+
principle: string;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Inverse of {@link renderUpstreamBody} — the round-trip that pins the body to
|
|
76
|
+
* the upstream issue form, so a released body and a hand-filed form carry the
|
|
77
|
+
* same clustering keys. `targets` and `principle` come back as rendered.
|
|
78
|
+
*/
|
|
79
|
+
export function parseUpstreamBody(body: string): ParsedUpstreamBody | null {
|
|
80
|
+
const field = (label: string): string | undefined => new RegExp(`^- \\*\\*${label}:\\*\\* (.+)$`, 'm').exec(body)?.[1];
|
|
81
|
+
const unquote = (v: string): string => v.replace(/`/g, '');
|
|
82
|
+
const cls = /^## Self-repair report — `([^`]+)`$/m.exec(body)?.[1];
|
|
83
|
+
const [source, fp, occ, targets, principle] = ['Source', 'Fingerprint', 'Occurrences', 'Targets', 'Principle'].map(field);
|
|
84
|
+
if (!cls || !source || !fp || !occ || !targets || !principle || !/^\d+$/.test(occ)) {
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
return {
|
|
88
|
+
defect_class: cls,
|
|
89
|
+
source: unquote(source),
|
|
90
|
+
fingerprint: unquote(fp),
|
|
91
|
+
occurrences: Number(occ),
|
|
92
|
+
targets: unquote(targets),
|
|
93
|
+
principle: unquote(principle),
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
export interface CommitIdentity {
|
|
98
|
+
name: string;
|
|
99
|
+
email: string;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
const NOREPLY_DOMAIN = 'users.noreply.github.com';
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* GitHub's noreply form for the account `gh` is signed in as. That account is
|
|
106
|
+
* already visible on the pull request; the configured git identity, which is
|
|
107
|
+
* often a company address, is not, and is never used.
|
|
108
|
+
*/
|
|
109
|
+
export function noreplyIdentity(login: string, id: string): CommitIdentity | null {
|
|
110
|
+
if (!/^[A-Za-z0-9](?:[A-Za-z0-9-]{0,38})$/.test(login) || !/^\d+$/.test(id)) {
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
113
|
+
return { name: login, email: `${id}+${login}@${NOREPLY_DOMAIN}` };
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
export function isNoreplyEmail(email: string): boolean {
|
|
117
|
+
return email.toLowerCase().endsWith(`@${NOREPLY_DOMAIN}`);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/** Built from the title and the fingerprint only — both closed, both in the digest. */
|
|
121
|
+
export function commitMessage(title: string, fingerprint: string): string {
|
|
122
|
+
return `${title}\n\nSelf-repair fingerprint: ${fingerprint}\n`;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
export interface OutgoingPullRequest {
|
|
126
|
+
branch: string;
|
|
127
|
+
identity: CommitIdentity;
|
|
128
|
+
message: string;
|
|
129
|
+
/** The author branch's net change against the base, as `git diff --binary` prints it. */
|
|
130
|
+
patch: string;
|
|
131
|
+
title: string;
|
|
132
|
+
body: string;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
export interface OutgoingIssue {
|
|
136
|
+
title: string;
|
|
137
|
+
body: string;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/** Where the bytes go — approved with them, because the same text sent elsewhere is another act. */
|
|
141
|
+
export interface Destination {
|
|
142
|
+
/** `owner/name` the pull request or issue is opened against. */
|
|
143
|
+
repo: string;
|
|
144
|
+
/** The GitHub login the send carries, or null when it could not be resolved. */
|
|
145
|
+
account: string | null;
|
|
146
|
+
/** The planned route; `rungs` is the ladder it may degrade along. */
|
|
147
|
+
route: 'pull-request' | 'issue' | 'local-only';
|
|
148
|
+
rungs: Array<'upstream' | 'fork' | 'issue'>;
|
|
149
|
+
/** The URL the first push rung pushes to; null on the issue route. */
|
|
150
|
+
remote: string | null;
|
|
151
|
+
/** The commit the pull request's one commit sits on; null on the issue route. */
|
|
152
|
+
baseSha: string | null;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
export interface Outgoing {
|
|
156
|
+
destination: Destination | null;
|
|
157
|
+
pullRequest: OutgoingPullRequest | null;
|
|
158
|
+
issue: OutgoingIssue | null;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
function section(label: string, text: string): string {
|
|
162
|
+
// The byte count makes the concatenation unambiguous: no section's content
|
|
163
|
+
// can be shifted into its neighbour without the digest changing.
|
|
164
|
+
return `--- ${label} (${Buffer.byteLength(text, 'utf-8')} bytes) ---\n${text}\n`;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/** Every byte that may leave, in one deterministic text. */
|
|
168
|
+
export function renderOutgoing(o: Outgoing): string {
|
|
169
|
+
let out = '';
|
|
170
|
+
if (o.destination !== null) {
|
|
171
|
+
const d = o.destination;
|
|
172
|
+
out += '=== destination ===\n';
|
|
173
|
+
out += section('repository', d.repo);
|
|
174
|
+
out += section('account', d.account ?? '(unresolved)');
|
|
175
|
+
out += section('route', `${d.route} (rungs: ${d.rungs.join(' -> ')})`);
|
|
176
|
+
out += section('push remote', d.remote ?? '(none)');
|
|
177
|
+
out += section('base commit', d.baseSha ?? '(none)');
|
|
178
|
+
}
|
|
179
|
+
if (o.pullRequest !== null) {
|
|
180
|
+
const pr = o.pullRequest;
|
|
181
|
+
out += '=== pull request ===\n';
|
|
182
|
+
out += section('branch', pr.branch);
|
|
183
|
+
out += section('author and committer', `${pr.identity.name} <${pr.identity.email}>`);
|
|
184
|
+
out += section('commit message', pr.message);
|
|
185
|
+
out += section('diff', pr.patch);
|
|
186
|
+
out += section('title', pr.title);
|
|
187
|
+
out += section('body', pr.body);
|
|
188
|
+
}
|
|
189
|
+
if (o.issue !== null) {
|
|
190
|
+
out += o.pullRequest !== null ? '=== issue, if the pull request fails ===\n' : '=== issue ===\n';
|
|
191
|
+
out += section('title', o.issue.title);
|
|
192
|
+
out += section('body', o.issue.body);
|
|
193
|
+
}
|
|
194
|
+
return out;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
/** The digest the person approves: SHA-256 of {@link renderOutgoing}. */
|
|
198
|
+
export function outgoingDigest(o: Outgoing): string {
|
|
199
|
+
return caseDigest(renderOutgoing(o));
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
/** Null when the approval names exactly these bytes; otherwise the reason it does not. */
|
|
203
|
+
export function approvalRefusal(record: DefectRecord, o: Outgoing, approvedDigest: string | null | undefined): string | null {
|
|
204
|
+
if (approvedDigest === null || approvedDigest === undefined || approvedDigest.trim() === '') {
|
|
205
|
+
return 'no approval: run the dry run, read every byte, then release with --approve <digest>';
|
|
206
|
+
}
|
|
207
|
+
const verdict = approve(record, renderOutgoing(o), approvedDigest.trim());
|
|
208
|
+
return verdict.ok ? null : verdict.reason;
|
|
209
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The release's floor over the WHOLE outgoing payload — branch name, the
|
|
3
|
+
* synthesised commit (identity and message), every object the push adds to the
|
|
4
|
+
* base (paths and blob contents), title and body — where `egressBlockedReason`
|
|
5
|
+
* reads only the record's own text.
|
|
6
|
+
*
|
|
7
|
+
* Credentials come from the one detector table (`egress_rules`); no pattern is
|
|
8
|
+
* defined here. Identifiers are the consumer project's own, passed in as a deny
|
|
9
|
+
* list. A finding refuses and is named by WHERE it was found and which rule
|
|
10
|
+
* fired — never by the value, because the refusal is printed and stored.
|
|
11
|
+
*/
|
|
12
|
+
import { CREDENTIAL_RULES, detect } from './egress_rules.js';
|
|
13
|
+
|
|
14
|
+
export type PayloadPart = 'branch' | 'commit' | 'object' | 'title' | 'body';
|
|
15
|
+
|
|
16
|
+
export interface ReleasePayload {
|
|
17
|
+
branch: string;
|
|
18
|
+
/** Every commit object the push adds, raw: tree, parents, identities, message. */
|
|
19
|
+
commits: string;
|
|
20
|
+
/** Every tree and blob the push adds: its path and, for a blob, its whole content. */
|
|
21
|
+
objects: string;
|
|
22
|
+
title: string;
|
|
23
|
+
body: string;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export interface PayloadFinding {
|
|
27
|
+
part: PayloadPart;
|
|
28
|
+
rule: string;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function escapeRegExp(s: string): string {
|
|
32
|
+
return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* The consumer's identifiers minus every token of the target repository: a
|
|
37
|
+
* fix to this package names this package, and refusing on that would refuse
|
|
38
|
+
* every release made from the package's own checkout.
|
|
39
|
+
*/
|
|
40
|
+
export function consumerDenyList(identifiers: Iterable<string>, targetRepo: string): string[] {
|
|
41
|
+
const own = new Set<string>();
|
|
42
|
+
for (const part of targetRepo.toLowerCase().split('/')) {
|
|
43
|
+
own.add(part);
|
|
44
|
+
for (const sub of part.split('-')) {
|
|
45
|
+
own.add(sub);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return [...new Set([...identifiers].map((i) => i.trim()).filter((i) => i.length > 0))]
|
|
49
|
+
.filter((i) => !own.has(i.toLowerCase()))
|
|
50
|
+
.sort();
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export function scanPayload(payload: ReleasePayload, deny: readonly string[]): PayloadFinding[] {
|
|
54
|
+
const denyRes = deny.map((ident) => ({
|
|
55
|
+
rule: 'consumer-identifier',
|
|
56
|
+
re: new RegExp(`(?<![A-Za-z0-9])${escapeRegExp(ident)}(?![A-Za-z0-9])`, 'i'),
|
|
57
|
+
}));
|
|
58
|
+
const findings: PayloadFinding[] = [];
|
|
59
|
+
const parts: Array<[PayloadPart, string]> = [
|
|
60
|
+
['branch', payload.branch],
|
|
61
|
+
['commit', payload.commits],
|
|
62
|
+
['object', payload.objects],
|
|
63
|
+
['title', payload.title],
|
|
64
|
+
['body', payload.body],
|
|
65
|
+
];
|
|
66
|
+
for (const [part, text] of parts) {
|
|
67
|
+
const rules = new Set<string>();
|
|
68
|
+
for (const span of detect(text, CREDENTIAL_RULES)) {
|
|
69
|
+
rules.add(span.rule);
|
|
70
|
+
}
|
|
71
|
+
for (const d of denyRes) {
|
|
72
|
+
if (d.re.test(text)) {
|
|
73
|
+
rules.add(d.rule);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
for (const rule of [...rules].sort()) {
|
|
77
|
+
findings.push({ part, rule });
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return findings;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export function describeFindings(findings: readonly PayloadFinding[]): string {
|
|
84
|
+
const named = findings.map((f) => `${f.rule} in ${f.part}`).join(', ');
|
|
85
|
+
return `payload floor refused the pull request (${named}) — nothing was pushed`;
|
|
86
|
+
}
|
|
@@ -28,6 +28,9 @@
|
|
|
28
28
|
* `scanEolSlice` accepts prior counters and only the newly appended complete
|
|
29
29
|
* lines (`readNewCompleteLines`). A full rescan is only ever the bounded
|
|
30
30
|
* 50 MB `isSafeTranscriptPath` cap away.
|
|
31
|
+
*
|
|
32
|
+
* loss_class: recoverable-lossy
|
|
33
|
+
* loss_recovery: the transcript JSONL itself — `readNewCompleteLines` returns only the bytes after `fromByte`, cut at the last complete line, and the rest stays in the file at its byte offsets.
|
|
31
34
|
*/
|
|
32
35
|
|
|
33
36
|
import * as crypto from 'node:crypto';
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The live state of the pull requests THIS session opened, carried into every
|
|
3
|
+
* prompt — so a session never reports a PR as waiting after it merged.
|
|
4
|
+
*
|
|
5
|
+
* Measured 2026-10-20: a session told the owner "#2534 waits for you" an hour
|
|
6
|
+
* after the owner had merged it. The state it reported was the one it saw when
|
|
7
|
+
* it opened the PR; nothing told a running session that a PR changed state, and
|
|
8
|
+
* the live-state rule that forbids answering from memory is model-carried. This
|
|
9
|
+
* module is the carrier: the `pr-url-reminder` concern records a PR the moment
|
|
10
|
+
* `gh pr create` prints its URL, and the `session-register` concern's
|
|
11
|
+
* `user_prompt_submit` beat re-reads the recorded PRs and injects their state.
|
|
12
|
+
*
|
|
13
|
+
* - **Store:** `<git-common-dir>/agent-session-prs/<session>.json`, one file per
|
|
14
|
+
* session and one writer each, shared by every worktree of the repo.
|
|
15
|
+
* - **Throttle:** at most one `gh` call per {@link PROBE_INTERVAL_MS}, one GraphQL
|
|
16
|
+
* query for every tracked PR at once, bounded by {@link PROBE_TIMEOUT_MS}.
|
|
17
|
+
* Between probes the block repeats the last reading with its time, so a stale
|
|
18
|
+
* reading is labelled stale rather than passed off as live.
|
|
19
|
+
* - **Lifetime:** a merged or closed PR is reported once more, as a change, and
|
|
20
|
+
* then dropped; the block disappears when nothing open is tracked.
|
|
21
|
+
* - **Failure:** an unreachable `gh` keeps the last reading and says the probe
|
|
22
|
+
* failed. Never throws, never blocks.
|
|
23
|
+
* - **What reaches the model from GitHub:** a state coerced to four enum values,
|
|
24
|
+
* and a merge time that must read as an ISO timestamp after `sanitize_text`,
|
|
25
|
+
* else it is dropped. No other remote byte is emitted.
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
import { execFileSync } from 'node:child_process';
|
|
29
|
+
import * as fs from 'node:fs';
|
|
30
|
+
import * as path from 'node:path';
|
|
31
|
+
|
|
32
|
+
import { write_atomic } from './fs_atomic.js';
|
|
33
|
+
import { git_common_dir } from './git_common_dir.js';
|
|
34
|
+
import { sanitize_text } from './retrieval_sanitize.js';
|
|
35
|
+
import { safe_stem } from './session_register.js';
|
|
36
|
+
|
|
37
|
+
export const PROBE_INTERVAL_MS = 5 * 60 * 1000;
|
|
38
|
+
export const PROBE_TIMEOUT_MS = 8_000;
|
|
39
|
+
const MAX_TRACKED = 10;
|
|
40
|
+
const STORE_DIRNAME = 'agent-session-prs';
|
|
41
|
+
|
|
42
|
+
export type PrState = 'OPEN' | 'MERGED' | 'CLOSED' | 'UNKNOWN';
|
|
43
|
+
|
|
44
|
+
export interface TrackedPr {
|
|
45
|
+
number: number;
|
|
46
|
+
url: string;
|
|
47
|
+
state: PrState;
|
|
48
|
+
/** Set when the last probe saw a state different from the one before it, until reported. */
|
|
49
|
+
changed_from?: PrState;
|
|
50
|
+
merged_at?: string | null;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export interface PrStore {
|
|
54
|
+
prs: TrackedPr[];
|
|
55
|
+
/** ISO time of the last probe attempt; absent before the first. */
|
|
56
|
+
probed_at?: string;
|
|
57
|
+
probe_failed?: boolean;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/** `{number: {state, mergedAt}}` for the asked numbers, or null when unreadable. */
|
|
61
|
+
export type PrProbe = (cwd: string, numbers: readonly number[]) => Record<number, { state: PrState; merged_at: string | null }> | null;
|
|
62
|
+
|
|
63
|
+
function store_file(root: string, session_id: string): string | null {
|
|
64
|
+
const common = git_common_dir(root);
|
|
65
|
+
return common === null ? null : path.join(common, STORE_DIRNAME, `${safe_stem(session_id)}.json`);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export function read_store(root: string, session_id: string): PrStore {
|
|
69
|
+
const file = store_file(root, session_id);
|
|
70
|
+
if (file === null) return { prs: [] };
|
|
71
|
+
try {
|
|
72
|
+
const o = JSON.parse(fs.readFileSync(file, 'utf-8')) as PrStore;
|
|
73
|
+
return Array.isArray(o.prs) ? o : { prs: [] };
|
|
74
|
+
} catch {
|
|
75
|
+
return { prs: [] };
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function write_store(root: string, session_id: string, store: PrStore): void {
|
|
80
|
+
const file = store_file(root, session_id);
|
|
81
|
+
if (file === null) return;
|
|
82
|
+
fs.mkdirSync(path.dirname(file), { recursive: true });
|
|
83
|
+
write_atomic(file, `${JSON.stringify(store, null, 2)}\n`);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/** Record a PR this session created. Idempotent per number. */
|
|
87
|
+
/** `owner/repo` of the repository's `origin`, lower-cased, or null when it cannot be read. */
|
|
88
|
+
function origin_slug(root: string): string | null {
|
|
89
|
+
try {
|
|
90
|
+
const url = execFileSync('git', ['-C', root, 'config', '--get', 'remote.origin.url'], {
|
|
91
|
+
encoding: 'utf-8',
|
|
92
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
93
|
+
}).trim();
|
|
94
|
+
const m = /[/:]([^/:]+)\/([^/]+?)(?:\.git)?\/?$/.exec(url);
|
|
95
|
+
return m === null ? null : `${m[1]}/${m[2]}`.toLowerCase();
|
|
96
|
+
} catch {
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
export function record_pr(root: string, session_id: string, url: string): void {
|
|
102
|
+
const m = /\/([^/]+)\/([^/]+)\/pull\/(\d+)/.exec(url);
|
|
103
|
+
if (m === null || session_id === '') return;
|
|
104
|
+
// The probe asks for a PR NUMBER in this repository: a PR of another repo
|
|
105
|
+
// or a fork would be read as whatever this repo's PR of that number is.
|
|
106
|
+
const here = origin_slug(root);
|
|
107
|
+
if (here !== null && `${m[1]}/${m[2]}`.toLowerCase() !== here) return;
|
|
108
|
+
const number = Number.parseInt(m[3] ?? '', 10);
|
|
109
|
+
const store = read_store(root, session_id);
|
|
110
|
+
if (store.prs.some((p) => p.number === number)) return;
|
|
111
|
+
store.prs = [...store.prs, { number, url, state: 'OPEN' as PrState }].slice(-MAX_TRACKED);
|
|
112
|
+
// A new PR should be read on the next prompt, not after the throttle window.
|
|
113
|
+
delete store.probed_at;
|
|
114
|
+
write_store(root, session_id, store);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
const ISO_RE = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?Z$/;
|
|
118
|
+
|
|
119
|
+
function iso_or_null(v: unknown): string | null {
|
|
120
|
+
if (typeof v !== 'string') return null;
|
|
121
|
+
const clean = sanitize_text(v);
|
|
122
|
+
return ISO_RE.test(clean) ? clean : null;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
export const gh_probe: PrProbe = (cwd, numbers) => {
|
|
126
|
+
const fields = numbers.map((n) => `p${n}: pullRequest(number: ${n}) { state mergedAt }`).join(' ');
|
|
127
|
+
const query = `query($owner: String!, $repo: String!) { repository(owner: $owner, name: $repo) { ${fields} } }`;
|
|
128
|
+
try {
|
|
129
|
+
const out = execFileSync(
|
|
130
|
+
'gh',
|
|
131
|
+
['api', 'graphql', '-f', `query=${query}`, '-F', 'owner={owner}', '-F', 'repo={repo}'],
|
|
132
|
+
{ cwd, encoding: 'utf-8', timeout: PROBE_TIMEOUT_MS, stdio: ['ignore', 'pipe', 'ignore'] },
|
|
133
|
+
);
|
|
134
|
+
const repo = (JSON.parse(out) as { data?: { repository?: Record<string, { state?: string; mergedAt?: string | null } | null> } })
|
|
135
|
+
.data?.repository;
|
|
136
|
+
if (repo === undefined) return null;
|
|
137
|
+
const res: Record<number, { state: PrState; merged_at: string | null }> = {};
|
|
138
|
+
for (const n of numbers) {
|
|
139
|
+
const pr = repo[`p${n}`];
|
|
140
|
+
const s = pr?.state;
|
|
141
|
+
res[n] = {
|
|
142
|
+
state: s === 'OPEN' || s === 'MERGED' || s === 'CLOSED' ? s : 'UNKNOWN',
|
|
143
|
+
merged_at: iso_or_null(pr?.mergedAt),
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
return res;
|
|
147
|
+
} catch {
|
|
148
|
+
return null;
|
|
149
|
+
}
|
|
150
|
+
};
|
|
151
|
+
|
|
152
|
+
function hhmm(iso: string): string {
|
|
153
|
+
return iso.slice(11, 16);
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* Probe when the throttle allows, persist, and render the block. `null` when
|
|
158
|
+
* this session tracks no PR. Never throws.
|
|
159
|
+
*/
|
|
160
|
+
export function pr_watch_block(
|
|
161
|
+
root: string,
|
|
162
|
+
session_id: string,
|
|
163
|
+
now: Date = new Date(),
|
|
164
|
+
probe: PrProbe = gh_probe,
|
|
165
|
+
): string | null {
|
|
166
|
+
try {
|
|
167
|
+
const store = read_store(root, session_id);
|
|
168
|
+
if (store.prs.length === 0) return null;
|
|
169
|
+
const last = store.probed_at === undefined ? Number.NaN : Date.parse(store.probed_at);
|
|
170
|
+
if (!(now.getTime() - last < PROBE_INTERVAL_MS)) {
|
|
171
|
+
const live = probe(root, store.prs.map((p) => p.number));
|
|
172
|
+
store.probed_at = now.toISOString();
|
|
173
|
+
store.probe_failed = live === null;
|
|
174
|
+
if (live !== null) {
|
|
175
|
+
for (const p of store.prs) {
|
|
176
|
+
const got = live[p.number];
|
|
177
|
+
if (got === undefined) continue;
|
|
178
|
+
if (got.state !== p.state) p.changed_from = p.state;
|
|
179
|
+
p.state = got.state;
|
|
180
|
+
p.merged_at = got.merged_at;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
const lines = store.prs.map((p) => {
|
|
185
|
+
const change = p.changed_from !== undefined ? ` ← CHANGED from ${p.changed_from}` : '';
|
|
186
|
+
const when = p.state === 'MERGED' && p.merged_at ? ` at ${p.merged_at}` : '';
|
|
187
|
+
return `- #${p.number} ${p.state}${when}${change}`;
|
|
188
|
+
});
|
|
189
|
+
const asOf = store.probed_at === undefined ? 'never read' : `read ${hhmm(store.probed_at)} UTC`;
|
|
190
|
+
const block = [
|
|
191
|
+
'<session-prs>',
|
|
192
|
+
`Pull requests this session opened (${asOf}${store.probe_failed ? ', the last read FAILED — state unverified' : ''}):`,
|
|
193
|
+
...lines,
|
|
194
|
+
'State them from this block, or run `gh pr view <n>` first — never from memory.',
|
|
195
|
+
'A merged PR waits for nobody.',
|
|
196
|
+
'</session-prs>',
|
|
197
|
+
].join('\n');
|
|
198
|
+
// Every change is in the block just rendered; keep only what can still change.
|
|
199
|
+
store.prs = store.prs
|
|
200
|
+
.filter((p) => p.state === 'OPEN' || p.state === 'UNKNOWN')
|
|
201
|
+
.map(({ changed_from: _reported, ...rest }) => rest);
|
|
202
|
+
write_store(root, session_id, store);
|
|
203
|
+
return block;
|
|
204
|
+
} catch {
|
|
205
|
+
return null;
|
|
206
|
+
}
|
|
207
|
+
}
|