@event4u/agent-config 16.5.0 → 17.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.augment-plugin/marketplace.json +3 -3
- package/.augment-plugin/plugin.json +1 -1
- package/.claude-plugin/marketplace.json +2 -2
- package/.claude-plugin/skills/install-agent-config/SKILL.md +4 -4
- package/CHANGELOG.md +463 -498
- package/CONTRIBUTING.md +47 -0
- package/README.md +25 -25
- package/dist/agent-src/commands/{design.md → agent-design.md} +10 -6
- package/dist/agent-src/commands/agents/init.md +66 -3
- package/dist/agent-src/commands/agents/user/init.md +3 -0
- package/dist/agent-src/commands/{optimize/deep.md → analyze/and-optimize.md} +72 -33
- package/dist/agent-src/commands/analyze/inbox.md +168 -37
- package/dist/agent-src/commands/analyze/pr.md +144 -0
- package/dist/agent-src/commands/analyze/{repo.md → reference.md} +85 -14
- package/dist/agent-src/commands/analyze/roadmap-repos.md +19 -10
- package/dist/agent-src/commands/analyze.md +28 -12
- package/dist/agent-src/commands/audit.md +115 -0
- package/dist/agent-src/commands/brand/review.md +13 -2
- package/dist/agent-src/commands/brand/tokens.md +3 -3
- package/dist/agent-src/commands/brand/voice.md +8 -5
- package/dist/agent-src/commands/brand.md +2 -2
- package/dist/agent-src/commands/challenge-me/closure.md +25 -0
- package/dist/agent-src/commands/design-system/import.md +8 -3
- package/dist/agent-src/commands/design-system/sync.md +98 -0
- package/dist/agent-src/commands/design-system.md +6 -1
- package/dist/agent-src/commands/evals/analyze.json +44 -0
- package/dist/agent-src/commands/evals/audit.json +12 -0
- package/dist/agent-src/commands/evals/retro.json +12 -0
- package/dist/agent-src/commands/fix/ci.md +10 -8
- package/dist/agent-src/commands/ghostwriter/write.md +22 -0
- package/dist/agent-src/commands/memory/learn-low-impact.md +70 -83
- package/dist/agent-src/commands/memory/propose.md +12 -0
- package/dist/agent-src/commands/memory.md +1 -1
- package/dist/agent-src/commands/optimize.md +4 -3
- package/dist/agent-src/commands/post-as/me.md +18 -0
- package/dist/agent-src/commands/pr/create.md +17 -342
- package/dist/agent-src/commands/pr/merge.md +129 -368
- package/dist/agent-src/commands/retro.md +121 -0
- package/dist/agent-src/commands/review/routing.md +1 -1
- package/dist/agent-src/commands/roadmap/next.md +4 -1
- package/dist/agent-src/commands/roadmap/process-full.md +46 -333
- package/dist/agent-src/commands/roadmap/triage-parked.md +6 -2
- package/dist/agent-src/commands/team-knowledge/consolidate.md +2 -2
- package/dist/agent-src/commands/team-knowledge.md +1 -1
- package/dist/agent-src/commands/threat-model.md +1 -1
- package/dist/agent-src/commands/upstream-contribute.md +91 -101
- package/dist/agent-src/commands/worktree/cleanup.md +18 -11
- package/dist/agent-src/contexts/contracts/consumer-agents-md-guide.md +54 -0
- package/dist/agent-src/contexts/execution/analysis-loop.md +137 -0
- package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +3 -3
- package/dist/agent-src/contexts/execution/decision-closure-execution.md +1 -1
- package/dist/agent-src/contexts/execution/host-capability-manifest.md +6 -0
- package/dist/agent-src/contexts/execution/orchestration-telemetry.md +11 -4
- package/dist/agent-src/contexts/execution/pr-create-branches-content.md +250 -0
- package/dist/agent-src/contexts/execution/pr-create-branches-freshness.md +150 -0
- package/dist/agent-src/contexts/execution/pr-merge-queue.md +287 -0
- package/dist/agent-src/contexts/execution/pr-merge-sync.md +276 -0
- package/dist/agent-src/contexts/execution/pr-merge-trust-boundary.md +69 -0
- package/dist/agent-src/contexts/execution/process-full-all.md +233 -0
- package/dist/agent-src/contexts/execution/process-full-delivery.md +231 -0
- package/dist/agent-src/contexts/execution/roadmap-execution-contract-branches.md +42 -0
- package/dist/agent-src/contexts/execution/roadmap-execution-contract.md +1 -35
- package/dist/agent-src/contexts/execution/roadmap-process-loop-close.md +235 -0
- package/dist/agent-src/contexts/execution/roadmap-process-loop-prescan.md +216 -0
- package/dist/agent-src/contexts/execution/roadmap-process-loop-run.md +253 -0
- package/dist/agent-src/contexts/execution/roadmap-process-loop-set.md +212 -0
- package/dist/agent-src/contexts/execution/roadmap-process-loop.md +25 -864
- package/dist/agent-src/contexts/execution/subagent-spawn-contract.md +14 -2
- package/dist/agent-src/contexts/execution/subagent-steering.md +65 -8
- package/dist/agent-src/contexts/model-recommendations.md +5 -5
- package/dist/agent-src/contexts/subagent-configuration.md +1 -1
- package/dist/agent-src/guidelines/agent-infra/api-cost-levers.md +4 -3
- package/dist/agent-src/guidelines/agent-infra/model-recommendation.md +11 -5
- package/dist/agent-src/guidelines/agent-infra/rule-body-migration-inventory.md +1 -1
- package/dist/agent-src/guidelines/agent-infra/self-improvement-pipeline.md +47 -24
- package/dist/agent-src/guidelines/design-antipatterns.md +5 -0
- package/dist/agent-src/guidelines/design-asset-discipline.md +17 -0
- package/dist/agent-src/guidelines/design-fidelity-routing.md +1 -0
- package/dist/agent-src/guidelines/php/api-design.md +10 -1
- package/dist/agent-src/rules/brand-source-of-truth.md +7 -6
- package/dist/agent-src/rules/code-provenance.md +1 -1
- package/dist/agent-src/rules/context-hygiene.md +0 -1
- package/dist/agent-src/rules/design-fidelity.md +12 -13
- package/dist/agent-src/rules/external-reference-deep-dive.md +2 -2
- package/dist/agent-src/rules/fix-what-you-see.md +1 -1
- package/dist/agent-src/rules/low-impact-corpus-privacy-floor.md +14 -15
- package/dist/agent-src/rules/missing-skill-recovery.md +12 -11
- package/dist/agent-src/rules/neighbour-precedence.md +1 -1
- package/dist/agent-src/rules/recurring-criticism.md +1 -1
- package/dist/agent-src/rules/roadmap-ci-steps-policy.md +0 -2
- package/dist/agent-src/rules/self-repair-loop.md +2 -2
- package/dist/agent-src/rules/token-budget-discipline.md +1 -1
- package/dist/agent-src/scripts/dashboard_mode.ts +4 -1
- package/dist/agent-src/scripts/roadmap_age.ts +175 -0
- package/dist/agent-src/scripts/update_roadmap_progress.ts +10 -2
- package/dist/agent-src/skills/accessibility-auditor/SKILL.md +3 -3
- package/dist/agent-src/skills/agent-security-review/SKILL.md +2 -2
- package/dist/agent-src/skills/agents-md-thin-root/SKILL.md +12 -4
- package/dist/agent-src/skills/ai-code-blindspots/SKILL.md +7 -0
- package/dist/agent-src/skills/ai-council/references/advanced-modes.md +11 -1
- package/dist/agent-src/skills/ai-council/references/cost-and-redaction.md +7 -0
- package/dist/agent-src/skills/ai-council/references/execution-modes.md +7 -0
- package/dist/agent-src/skills/ai-council/references/output-and-synthesis.md +19 -0
- package/dist/agent-src/skills/ai-council/references/procedure.md +7 -0
- package/dist/agent-src/skills/api-design/SKILL.md +2 -2
- package/dist/agent-src/skills/api-endpoint/SKILL.md +2 -2
- package/dist/agent-src/skills/authz-review/SKILL.md +5 -3
- package/dist/agent-src/skills/blade-ui/SKILL.md +2 -2
- package/dist/agent-src/skills/brand/SKILL.md +7 -3
- package/dist/agent-src/skills/brand-asset-generation/SKILL.md +13 -6
- package/dist/agent-src/skills/brand-audit/SKILL.md +2 -1
- package/dist/agent-src/skills/brand-identity/SKILL.md +5 -4
- package/dist/agent-src/skills/brand-strategy/SKILL.md +5 -4
- package/dist/agent-src/skills/brand-to-tokens/SKILL.md +18 -39
- package/dist/agent-src/skills/brand-to-tokens/templates/marp-brand-deck.md.example +2 -2
- package/dist/agent-src/skills/brand-to-tokens/templates/reveal-brand-deck.yaml +2 -2
- package/dist/agent-src/skills/canvas-design/SKILL.md +12 -2
- package/dist/agent-src/skills/competitive-positioning/SKILL.md +2 -2
- package/dist/agent-src/skills/composer-packages/SKILL.md +18 -0
- package/dist/agent-src/skills/condense-memory/SKILL.md +1 -1
- package/dist/agent-src/skills/content-funnel-design/SKILL.md +8 -1
- package/dist/agent-src/skills/context-authoring/SKILL.md +1 -1
- package/dist/agent-src/skills/context-document/SKILL.md +2 -2
- package/dist/agent-src/skills/corpus-grounding/SKILL.md +6 -6
- package/dist/agent-src/skills/corpus-grounding/scripts/decision_engine.ts +13 -11
- package/dist/agent-src/skills/corpus-grounding/scripts/ground.mjs +1706 -0
- package/dist/agent-src/skills/corpus-grounding/scripts/schema_validator.ts +7 -1
- package/dist/agent-src/skills/dashboard-design/SKILL.md +1 -1
- package/dist/agent-src/skills/data-flow-mapper/SKILL.md +5 -2
- package/dist/agent-src/skills/database/SKILL.md +5 -4
- package/dist/agent-src/skills/decision-record/references/weighted-matrix.md +12 -0
- package/dist/agent-src/skills/deep-reading-analyst/SKILL.md +1 -1
- package/dist/agent-src/skills/dependency-upgrade/SKILL.md +61 -11
- package/dist/agent-src/skills/description-assist/SKILL.md +1 -1
- package/dist/agent-src/skills/design-intelligence/SKILL.md +1 -1
- package/dist/agent-src/skills/design-intelligence/data/landing.csv +1 -1
- package/dist/agent-src/skills/design-intelligence/references/context-and-registers.md +10 -2
- package/dist/agent-src/skills/design-intelligence/references/design-languages.md +1 -1
- package/dist/agent-src/skills/design-intelligence/references/design-rules-checklist.md +4 -3
- package/dist/agent-src/skills/design-intelligence/references/integration-mapping.md +14 -14
- package/dist/agent-src/skills/{wireframe → design-review}/references/story-beat-ledger.schema.json +1 -1
- package/dist/agent-src/skills/design-review/references/verification-automation.md +11 -3
- package/dist/agent-src/skills/design-system-capture/SKILL.md +15 -10
- package/dist/agent-src/skills/design-system-capture/references/design-system-json.md +20 -5
- package/dist/agent-src/skills/design-system-capture/references/import-procedure.md +2 -2
- package/dist/agent-src/skills/design-tokens/SKILL.md +23 -23
- package/dist/agent-src/skills/design-tokens/scripts/tokens.mjs +1037 -0
- package/dist/agent-src/skills/design-tokens/scripts/tokens.ts +336 -13
- package/dist/agent-src/skills/design-tokens/templates/design-tokens-starter.json +52 -53
- package/dist/agent-src/skills/docker/SKILL.md +1 -1
- package/dist/agent-src/skills/estimate-ticket/SKILL.md +1 -1
- package/dist/agent-src/skills/existing-ui-audit/SKILL.md +14 -276
- package/dist/agent-src/skills/existing-ui-audit/procedure.yaml +44 -0
- package/dist/agent-src/skills/existing-ui-audit/references/anti-slop-cross-reference.md +1 -1
- package/dist/agent-src/skills/existing-ui-audit/references/steps/00-inspect-stack-and-input.md +4 -0
- package/dist/agent-src/skills/existing-ui-audit/references/steps/01-enumerate-components.md +26 -0
- package/dist/agent-src/skills/existing-ui-audit/references/steps/01b-detect-component-taxonomy.md +7 -0
- package/dist/agent-src/skills/existing-ui-audit/references/steps/02-identify-design-system.md +12 -0
- package/dist/agent-src/skills/existing-ui-audit/references/steps/03-detect-design-tokens.md +35 -0
- package/dist/agent-src/skills/existing-ui-audit/references/steps/04-detect-shadcn-inventory.md +13 -0
- package/dist/agent-src/skills/existing-ui-audit/references/steps/04b-live-storybook-read.md +26 -0
- package/dist/agent-src/skills/existing-ui-audit/references/steps/05-list-reusable-patterns.md +14 -0
- package/dist/agent-src/skills/existing-ui-audit/references/steps/06-match-candidates.md +52 -0
- package/dist/agent-src/skills/existing-ui-audit/references/steps/07-greenfield-branch.md +29 -0
- package/dist/agent-src/skills/existing-ui-audit/references/steps/08-a11y-baseline.md +40 -0
- package/dist/agent-src/skills/existing-ui-audit/references/steps/09-validate-and-write.md +5 -0
- package/dist/agent-src/skills/experiment-loop/SKILL.md +1 -1
- package/dist/agent-src/skills/fe-design/references/design-patterns.md +16 -2
- package/dist/agent-src/skills/fe-design/references/design-read-and-memory.md +1 -1
- package/dist/agent-src/skills/fe-design/references/source-led-port.md +1 -1
- package/dist/agent-src/skills/finishing-a-development-branch/SKILL.md +6 -6
- package/dist/agent-src/skills/flux/SKILL.md +1 -1
- package/dist/agent-src/skills/form-handler/SKILL.md +15 -2
- package/dist/agent-src/skills/git-workflow/SKILL.md +2 -2
- package/dist/agent-src/skills/git-workflow/references/branch-update.md +7 -0
- package/dist/agent-src/skills/git-workflow/references/commit-subject.md +12 -0
- package/dist/agent-src/skills/git-workflow/references/push-closes-its-loop.md +10 -0
- package/dist/agent-src/skills/gtm-launch/SKILL.md +8 -1
- package/dist/agent-src/skills/html-deck/SKILL.md +7 -2
- package/dist/agent-src/skills/humanizer/SKILL.md +16 -3
- package/dist/agent-src/skills/humanizer/references/anti-aiisms.md +13 -1
- package/dist/agent-src/skills/humanizer/references/fixtures.md +8 -0
- package/dist/agent-src/skills/js-library-packaging/SKILL.md +5 -4
- package/dist/agent-src/skills/js-library-packaging/scripts/check_package_surface.mjs +197 -0
- package/dist/agent-src/skills/judge-artifact-completeness/SKILL.md +1 -1
- package/dist/agent-src/skills/judge-security-auditor/SKILL.md +2 -2
- package/dist/agent-src/skills/launch-readiness/SKILL.md +18 -22
- package/dist/agent-src/skills/learning-to-rule-or-skill/SKILL.md +5 -5
- package/dist/agent-src/skills/livewire/SKILL.md +1 -1
- package/dist/agent-src/skills/llm-provider-knowledge/SKILL.md +18 -0
- package/dist/agent-src/skills/logo-generation/SKILL.md +9 -3
- package/dist/agent-src/skills/market-entry-analysis/SKILL.md +6 -1
- package/dist/agent-src/skills/markitdown/SKILL.md +1 -1
- package/dist/agent-src/skills/memory-consolidation/SKILL.md +2 -2
- package/dist/agent-src/skills/messaging-architecture/SKILL.md +8 -1
- package/dist/agent-src/skills/motion-choreographer/SKILL.md +2 -2
- package/dist/agent-src/skills/playwright-testing/SKILL.md +2 -0
- package/dist/agent-src/skills/positioning-strategy/SKILL.md +10 -2
- package/dist/agent-src/skills/prediction-pool-optimizer/references/ev-fixtures.md +13 -0
- package/dist/agent-src/skills/prediction-pool-optimizer/references/odds-and-bonus.md +7 -0
- package/dist/agent-src/skills/project-analysis-core/SKILL.md +1 -1
- package/dist/agent-src/skills/project-analysis-hypothesis-driven/SKILL.md +1 -1
- package/dist/agent-src/skills/project-analyzer/SKILL.md +14 -75
- package/dist/agent-src/skills/project-analyzer/procedure.yaml +39 -0
- package/dist/agent-src/skills/project-analyzer/references/steps/01-project-overview.md +9 -0
- package/dist/agent-src/skills/project-analyzer/references/steps/02-architecture.md +7 -0
- package/dist/agent-src/skills/project-analyzer/references/steps/03-data-layer.md +6 -0
- package/dist/agent-src/skills/project-analyzer/references/steps/04-business-domains.md +7 -0
- package/dist/agent-src/skills/project-analyzer/references/steps/05-api-surface.md +6 -0
- package/dist/agent-src/skills/project-analyzer/references/steps/06-service-map.md +6 -0
- package/dist/agent-src/skills/project-analyzer/references/steps/07-module-inventory.md +6 -0
- package/dist/agent-src/skills/project-analyzer/references/steps/08-infrastructure-and-testing.md +5 -0
- package/dist/agent-src/skills/project-analyzer/references/steps/09-agent-docs-audit.md +6 -0
- package/dist/agent-src/skills/project-analyzer/references/steps/10-gap-analysis.md +6 -0
- package/dist/agent-src/skills/quality-tools/references/js-ts-tools.md +10 -0
- package/dist/agent-src/skills/quality-tools/references/php-tools.md +13 -0
- package/dist/agent-src/skills/quality-tools/references/python-tools.md +11 -0
- package/dist/agent-src/skills/react-native-setup/SKILL.md +7 -2
- package/dist/agent-src/skills/react-shadcn-ui/SKILL.md +5 -1
- package/dist/agent-src/skills/react-shadcn-ui/references/registry.md +13 -0
- package/dist/agent-src/skills/react-shadcn-ui/scripts/shadcn_add.mjs +315 -0
- package/dist/agent-src/skills/react-shadcn-ui/scripts/shadcn_add.ts +6 -6
- package/dist/agent-src/skills/receiving-code-review/SKILL.md +1 -1
- package/dist/agent-src/skills/refine-ticket/SKILL.md +2 -2
- package/dist/agent-src/skills/release-comms/SKILL.md +2 -1
- package/dist/agent-src/skills/repomix-packer/SKILL.md +2 -2
- package/dist/agent-src/skills/requesting-code-review/SKILL.md +3 -3
- package/dist/agent-src/skills/roadmap-management/references/archival.md +3 -3
- package/dist/agent-src/skills/roadmap-management/references/authoring.md +9 -2
- package/dist/agent-src/skills/roadmap-management/references/dashboard.md +3 -3
- package/dist/agent-src/skills/roadmap-management/references/lifecycle.md +3 -3
- package/dist/agent-src/skills/roadmap-writing/SKILL.md +4 -4
- package/dist/agent-src/skills/rtk-output-filtering/SKILL.md +1 -1
- package/dist/agent-src/skills/rule-writing/SKILL.md +1 -2
- package/dist/agent-src/skills/security/SKILL.md +41 -5
- package/dist/agent-src/skills/skill-improvement-pipeline/SKILL.md +5 -3
- package/dist/agent-src/skills/skill-reviewer/SKILL.md +1 -1
- package/dist/agent-src/skills/skill-writing/SKILL.md +23 -8
- package/dist/agent-src/skills/skill-writing/references/section-patterns.md +19 -1
- package/dist/agent-src/skills/source-discovery/SKILL.md +3 -3
- package/dist/agent-src/skills/sql-writing/SKILL.md +2 -2
- package/dist/agent-src/skills/standards-from-config/SKILL.md +2 -2
- package/dist/agent-src/skills/storybook-workshop/SKILL.md +5 -0
- package/dist/agent-src/skills/storybook-workshop/scripts/story_contrast_floor.mjs +99 -0
- package/dist/agent-src/skills/subagent-orchestration/SKILL.md +13 -13
- package/dist/agent-src/skills/subagent-orchestration/prompts/README.md +4 -3
- package/dist/agent-src/skills/svg-authoring/SKILL.md +7 -1
- package/dist/agent-src/skills/systematic-debugging/SKILL.md +2 -2
- package/dist/agent-src/skills/tailwind-engineer/SKILL.md +8 -3
- package/dist/agent-src/skills/tailwind-engineer/scripts/tailwind_config_gen.mjs +482 -0
- package/dist/agent-src/skills/test-case-discovery/SKILL.md +1 -1
- package/dist/agent-src/skills/threat-modeling/SKILL.md +8 -1
- package/dist/agent-src/skills/threat-modeling/data/manifest.json +5 -2
- package/dist/agent-src/skills/threat-modeling/data/reasoning.csv +10 -10
- package/dist/agent-src/skills/threat-modeling/data/surfaces.csv +11 -10
- package/dist/agent-src/skills/threat-modeling/data/threats.csv +34 -20
- package/dist/agent-src/skills/type-design/SKILL.md +196 -0
- package/dist/agent-src/skills/type-design/references/font-spec.md +90 -0
- package/dist/agent-src/skills/type-design/references/gates.md +113 -0
- package/dist/agent-src/skills/type-design/references/toolchain.md +66 -0
- package/dist/agent-src/skills/typography-system/SKILL.md +21 -11
- package/dist/agent-src/skills/typography-system/references/worked-scales.md +85 -0
- package/dist/agent-src/skills/ui-apply-generic/SKILL.md +1 -1
- package/dist/agent-src/skills/universal-project-analysis/SKILL.md +1 -1
- package/dist/agent-src/skills/upstream-contribute/SKILL.md +120 -125
- package/dist/agent-src/skills/using-git-worktrees/SKILL.md +1 -0
- package/dist/agent-src/skills/verify-repair-loop/SKILL.md +1 -1
- package/dist/agent-src/skills/voice-and-tone-design/SKILL.md +71 -2
- package/dist/agent-src/skills/worktree-lifecycle/SKILL.md +16 -14
- package/dist/agent-src/templates/AGENTS.md +1 -1
- package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
- package/dist/agent-src/templates/agents/proposal.example.md +1 -1
- package/dist/agent-src/templates/github-workflows/advisories-daily.yml +85 -0
- package/dist/agent-src/templates/roadmaps.md +39 -1
- package/dist/agent-src/templates/scripts/check_memory.ts +2 -2
- package/dist/agent-src/templates/scripts/historical-bug-patterns.example.yml +13 -1
- package/dist/agent-src/templates/scripts/work_engine/cli.ts +17 -0
- package/dist/agent-src/templates/scripts/work_engine/cli_args.ts +10 -0
- package/dist/agent-src/templates/scripts/work_engine/directives/ui/scaffold.ts +22 -13
- package/dist/agent-src/templates/scripts/work_engine/dispatcher.ts +18 -4
- package/dist/agent-src/templates/scripts/work_engine/procedure/checks.ts +283 -0
- package/dist/agent-src/templates/scripts/work_engine/procedure/run.ts +432 -0
- package/dist/agent-src/templates/scripts/work_engine/procedure/sidecar.ts +185 -0
- package/dist/agent-src/templates/scripts/work_engine/state.ts +3 -0
- package/dist/cli/commands/uiRender.js +72 -17
- package/dist/cli/commands/uiRenderAsset.js +10 -2
- package/dist/cli/commands/uiRenderAssetFonts.js +158 -0
- package/dist/cli/commands/uiRenderAssetTypes.js +8 -20
- package/dist/cli/initRouting.js +1 -1
- package/dist/cli/mcp/dispatch.js +31 -9
- package/dist/cli/python/knowledge_ingest.js +7 -39
- package/dist/cli/python/workspace_secrets.js +4 -177
- package/dist/cli/registry.js +4 -1
- package/dist/cli-delegate/archive_completed_roadmaps.js +3 -2
- package/dist/cli-delegate/check_update_banner.js +635 -266
- package/dist/cli-delegate/{chunk-TMWYUOK4.js → chunk-2CX7NWRB.js} +224 -437
- package/dist/cli-delegate/{chunk-F3QDG2GT.js → chunk-2SFOOFJJ.js} +259 -159
- package/dist/cli-delegate/chunk-2Y5AMLMY.js +136 -0
- package/dist/cli-delegate/{chunk-OKJUIAPS.js → chunk-4E2W63DA.js} +1 -62
- package/dist/cli-delegate/{chunk-6SRJTYJS.js → chunk-4SHNERBL.js} +37 -16
- package/dist/cli-delegate/chunk-5VO3RTMV.js +208 -0
- package/dist/cli-delegate/chunk-6E2LDY4F.js +27 -0
- package/dist/cli-delegate/{chunk-XQTPXKFA.js → chunk-6ZD2QZMN.js} +8 -17
- package/dist/cli-delegate/{chunk-6V5FMA3P.js → chunk-7CEI2YPS.js} +1 -1
- package/dist/cli-delegate/{chunk-DMSZHXZS.js → chunk-7DRWULEQ.js} +80 -7
- package/dist/cli-delegate/chunk-7NXCZSDL.js +54 -0
- package/dist/cli-delegate/chunk-AX3U3UWJ.js +328 -0
- package/dist/cli-delegate/{chunk-WOKWX5PL.js → chunk-BKALSTBZ.js} +18 -3
- package/dist/cli-delegate/chunk-BMGUGSY6.js +103 -0
- package/dist/cli-delegate/chunk-BYV46VRM.js +3309 -0
- package/dist/cli-delegate/{chunk-5GPULQBE.js → chunk-CAL76ADI.js} +4215 -682
- package/dist/cli-delegate/chunk-DSY6LLCQ.js +127 -0
- package/dist/cli-delegate/chunk-E6XNBVE4.js +581 -0
- package/dist/cli-delegate/{chunk-ZUZKZYCN.js → chunk-ESUNQ5XR.js} +46 -10
- package/dist/cli-delegate/{chunk-G5VVIZRC.js → chunk-F7HLSW6P.js} +1 -1
- package/dist/cli-delegate/chunk-FIEEOH5C.js +133 -0
- package/dist/cli-delegate/chunk-FKYZOWVD.js +719 -0
- package/dist/cli-delegate/chunk-GOMILC3O.js +918 -0
- package/dist/cli-delegate/chunk-I4KJYVPB.js +69 -0
- package/dist/cli-delegate/{chunk-JQOM7TTM.js → chunk-IDAOTDPE.js} +1 -100
- package/dist/cli-delegate/chunk-IROAQ77A.js +137 -0
- package/dist/cli-delegate/chunk-J2SJZICO.js +698 -0
- package/dist/cli-delegate/{chunk-6YQC2HLF.js → chunk-JHMMWNJ2.js} +54 -40
- package/dist/cli-delegate/{chunk-WQWXGIWB.js → chunk-M6CRG5O6.js} +165 -15
- package/dist/cli-delegate/{chunk-PHD7OOLE.js → chunk-MQ2UDEGV.js} +14 -3
- package/dist/cli-delegate/chunk-NTM7G2V4.js +220 -0
- package/dist/cli-delegate/chunk-PV7S5DPJ.js +175 -0
- package/dist/cli-delegate/{chunk-F7DQWYR5.js → chunk-RAXQOETZ.js} +6 -2
- package/dist/cli-delegate/{chunk-T7XSJSUQ.js → chunk-SIOMDAKL.js} +980 -784
- package/dist/cli-delegate/{chunk-KR6EM23A.js → chunk-TULVDQ4L.js} +3 -48
- package/dist/cli-delegate/chunk-UUYEKXKR.js +20 -0
- package/dist/cli-delegate/{chunk-7XGD2OEU.js → chunk-UXWHY6CQ.js} +2 -1
- package/dist/cli-delegate/{chunk-PWX7CKMD.js → chunk-VC3ECUEK.js} +1 -1
- package/dist/cli-delegate/{chunk-KXXWJTDO.js → chunk-WMNYVIYX.js} +1 -1
- package/dist/cli-delegate/chunk-XCY5KKUC.js +181 -0
- package/dist/cli-delegate/{chunk-H76PHZBI.js → chunk-XLY5G3CM.js} +14 -19
- package/dist/cli-delegate/cmd_adr_effective.js +41 -2
- package/dist/cli-delegate/cmd_analyze_session.js +7 -7
- package/dist/cli-delegate/cmd_brand_status.js +1287 -10
- package/dist/cli-delegate/cmd_ci_settle.js +330 -0
- package/dist/cli-delegate/cmd_conformance.js +483 -817
- package/dist/cli-delegate/cmd_doctor.js +26 -16
- package/dist/cli-delegate/cmd_doctor_neighbours.js +10 -7
- package/dist/cli-delegate/cmd_explain.js +9 -24
- package/dist/cli-delegate/cmd_export.js +14 -11
- package/dist/cli-delegate/cmd_fleet.js +5 -3
- package/dist/cli-delegate/cmd_git_convention.js +8 -4
- package/dist/cli-delegate/cmd_handoff.js +79 -242
- package/dist/cli-delegate/cmd_mcp_available.js +1 -1
- package/dist/cli-delegate/cmd_memory_get.js +4 -2
- package/dist/cli-delegate/cmd_migrate.js +2 -2
- package/dist/cli-delegate/cmd_packs_active.js +2 -2
- package/dist/cli-delegate/cmd_preflight.js +7 -5
- package/dist/cli-delegate/cmd_prune.js +16 -13
- package/dist/cli-delegate/cmd_route_audit.js +11 -8
- package/dist/cli-delegate/cmd_route_explain.js +649 -16
- package/dist/cli-delegate/cmd_session_recycle.js +15 -6
- package/dist/cli-delegate/cmd_settings_check.js +2 -2
- package/dist/cli-delegate/cmd_settings_get.js +1 -1
- package/dist/cli-delegate/cmd_settings_migrate.js +14 -11
- package/dist/cli-delegate/cmd_settings_set.js +1 -1
- package/dist/cli-delegate/cmd_sync.js +16 -13
- package/dist/cli-delegate/cmd_uninstall.js +185 -31
- package/dist/cli-delegate/cmd_update.js +67 -3
- package/dist/cli-delegate/cmd_upgrade.js +38 -7
- package/dist/cli-delegate/cmd_validate.js +16 -13
- package/dist/cli-delegate/cmd_versions.js +1 -1
- package/dist/cli-delegate/dashboard_mode.js +1 -1
- package/dist/cli-delegate/gate_execute.js +4 -3
- package/dist/cli-delegate/roadmap_age.js +22 -0
- package/dist/cli-delegate/roadmap_gates.js +4 -3
- package/dist/cli-delegate/update_roadmap_progress.js +3 -2
- package/dist/cli-delegate/upgrade_unattended-VVL6JLSX.js +541 -0
- package/dist/discovery/deprecation-report.md +1 -1
- package/dist/discovery/discovery-manifest.json +373 -190
- package/dist/discovery/discovery-manifest.json.sha256 +1 -1
- package/dist/discovery/discovery-manifest.summary.md +5 -5
- package/dist/discovery/dormancy-report.md +1 -1
- package/dist/discovery/orphan-report.md +1 -1
- package/dist/discovery/packs.json +21 -16
- package/dist/discovery/trust-report.md +3 -3
- package/dist/discovery/workspaces.json +16 -11
- package/dist/hooks/chat_history.chunk.cjs +6852 -0
- package/dist/hooks/chat_history.chunk.cjs.sha256 +1 -0
- package/dist/hooks/dispatch.js +17506 -18692
- package/dist/hooks/dispatch.sha256 +1 -1
- package/dist/hooks/egress_engine.chunk.cjs +915 -0
- package/dist/hooks/egress_engine.chunk.cjs.sha256 +1 -0
- package/dist/hooks/svg_rules.chunk.cjs +281 -49
- package/dist/hooks/svg_rules.chunk.cjs.sha256 +1 -1
- package/dist/install/conflict.js +36 -6
- package/dist/install/conflictTracker.js +81 -7
- package/dist/install/detect.js +3 -3
- package/dist/install/hostPermissionsAdapter.js +106 -0
- package/dist/install/install.mjs +3117 -1949
- package/dist/install/installThinLayer.js +1 -1
- package/dist/install/manifestFiles.js +21 -0
- package/dist/install/noGoDenyRows.js +300 -0
- package/dist/install/noGoRules.js +368 -0
- package/dist/install/ownershipLedger.js +133 -0
- package/dist/install/plan.js +1 -1
- package/dist/install/preflight.js +39 -8
- package/dist/install/preserve.js +74 -12
- package/dist/install/recordedOwnership.js +88 -5
- package/dist/install/rule_scope.js +20 -3
- package/dist/install/stagedRuntime.js +455 -0
- package/dist/install/toolsArg.js +19 -0
- package/dist/install/userPin.js +47 -0
- package/dist/install/wizard-plan.js +26 -4
- package/dist/mcp/awesome-mcp-servers.row.md +1 -1
- package/dist/mcp/mcp-cloudflare-catalogue.json +3 -2
- package/dist/mcp/registry-manifest.json +6 -5
- package/dist/mcp/server.json +3 -3
- package/dist/mcp/server.mjs +9831 -5546
- package/dist/router.json +1 -1
- package/dist/scripts/_lib/agent_settings.js +7 -12
- package/dist/scripts/_lib/asset_render_record.js +219 -0
- package/dist/scripts/_lib/claude_builtin_names.js +9 -4
- package/dist/scripts/_lib/claude_settings_hooks.js +102 -34
- package/dist/scripts/_lib/egress_rules.js +766 -0
- package/dist/scripts/_lib/environment_detector.js +24 -33
- package/dist/scripts/_lib/global_deploy_inventory.js +146 -9
- package/dist/scripts/_lib/guidelines_lane.js +10 -1
- package/dist/scripts/_lib/identifier_redaction.js +24 -0
- package/dist/scripts/_lib/installed_layer.js +17 -0
- package/dist/scripts/_lib/installed_layer_normalise.js +72 -0
- package/dist/scripts/_lib/lean_projection_mode.js +34 -152
- package/dist/scripts/_lib/project_tree_form.js +118 -0
- package/dist/scripts/_lib/scoped_projection.js +133 -3
- package/dist/scripts/_lib/settings_removed_keys.js +29 -0
- package/dist/scripts/_lib/settings_renamed_keys.js +17 -5
- package/dist/scripts/_lib/subagent_native_fields.js +35 -0
- package/dist/scripts/_lib/svg_filled_counter.js +285 -0
- package/dist/scripts/_lib/svg_rules.js +2 -0
- package/dist/scripts/_lib/ui_surface.js +19 -0
- package/dist/scripts/_lib/verification_command.js +364 -0
- package/dist/scripts/_lib/workspace_secrets.js +229 -0
- package/dist/scripts/ai_council/seat_policy.js +27 -0
- package/dist/scripts/ai_council/transport_resolver.js +9 -10
- package/dist/scripts/condense.js +25 -29
- package/dist/server/io/substituteTemplate.js +2 -2
- package/dist/server/io/yamlIO.js +2 -2
- package/dist/server/routes/install.js +5 -1
- package/dist/server/routes/settings.js +2 -2
- package/dist/server/routes/wizard.js +1 -1
- package/dist/server/schemas/settings.js +22 -16
- package/dist/server/serverInfo.js +1 -1
- package/dist/shared/brandTokenDocument.js +47 -0
- package/dist/shared/brandTokenPaths.js +43 -0
- package/dist/shared/settingsCarveOut.js +0 -7
- package/dist/shared/skillRanking.js +103 -5
- package/dist/shared/userMd/formAdapter.js +16 -0
- package/dist/shared/userMd/schema.js +17 -0
- package/dist/ui/assets/index-w70Ado09.js +23 -0
- package/dist/ui/index.html +1 -1
- package/docs/MIGRATION.md +89 -2
- package/docs/THIRD-PARTY-NOTICES.md +27 -0
- package/docs/contracts/settings-classes.md +27 -9
- package/docs/guidelines/agent-infra/api-cost-levers.md +4 -3
- package/docs/guidelines/agent-infra/model-recommendation.md +11 -5
- package/docs/guidelines/agent-infra/rule-body-migration-inventory.md +1 -1
- package/docs/guidelines/agent-infra/self-improvement-pipeline.md +47 -24
- package/docs/guidelines/design-antipatterns.md +5 -0
- package/docs/guidelines/design-asset-discipline.md +17 -0
- package/docs/guidelines/design-fidelity-routing.md +1 -0
- package/docs/guidelines/php/api-design.md +10 -1
- package/llms.txt +12 -10
- package/package.json +13 -4
- package/src/agent-src/scripts/dashboard_mode.ts +4 -1
- package/src/agent-src/scripts/roadmap_age.ts +175 -0
- package/src/agent-src/scripts/update_roadmap_progress.ts +10 -2
- package/src/agent-src/templates/AGENTS.md +1 -1
- package/src/agent-src/templates/scripts/check_memory.ts +2 -2
- package/src/agent-src/templates/scripts/historical-bug-patterns.example.yml +13 -1
- package/src/agent-src/templates/scripts/work_engine/cli.ts +17 -0
- package/src/agent-src/templates/scripts/work_engine/cli_args.ts +10 -0
- package/src/agent-src/templates/scripts/work_engine/directives/ui/scaffold.ts +22 -13
- package/src/agent-src/templates/scripts/work_engine/dispatcher.ts +18 -4
- package/src/agent-src/templates/scripts/work_engine/procedure/checks.ts +283 -0
- package/src/agent-src/templates/scripts/work_engine/procedure/run.ts +432 -0
- package/src/agent-src/templates/scripts/work_engine/procedure/sidecar.ts +185 -0
- package/src/agent-src/templates/scripts/work_engine/state.ts +3 -0
- package/src/config/agent-settings.template.yml +120 -57
- package/src/config/agents-paths.yml +13 -7
- package/src/config/ci-local-parity.yml +44 -0
- package/src/config/continuity-surface.json +51 -2
- package/src/config/depth-audit-samples.json +5 -0
- package/src/config/discovery/command-verbs.yml +1 -0
- package/src/config/dispatch-economy-metrics.json +1 -0
- package/src/config/egress-mutations/class-precedence-swapped.json +7 -0
- package/src/config/egress-mutations/credential-token-restores.json +7 -0
- package/src/config/egress-mutations/iban-checksum-disabled.json +7 -0
- package/src/config/egress-mutations/raw-value-in-the-count-record.json +7 -0
- package/src/config/evaluator-budgets.json +4 -4
- package/src/config/gate-coverage.yml +149 -3
- package/src/config/gate-reachability-exemptions.json +3 -5
- package/src/config/gate-violation-baselines.json +26 -22
- package/src/config/gitignore-block.txt +6 -3
- package/src/config/hook-bundle-budget.json +34 -3
- package/src/config/hook-carrier-probes.json +30 -0
- package/src/config/hook-latency-budget.json +4 -2
- package/src/config/host-injection-effect.json +8 -1
- package/src/config/host-skill-frontmatter-keys.json +56 -0
- package/src/config/layer-form-brakes.json +4 -0
- package/src/config/layer-form-comparison-corpus.json +42 -0
- package/src/config/loop-surfaces.yaml +28 -47
- package/src/config/memory-twin-verdicts.yml +9 -1
- package/src/config/metric-registry.yml +40 -3
- package/src/config/pack-size-budget.json +15 -0
- package/src/config/procedure-core-budget.json +21 -0
- package/src/config/profiles/minimal.ini +1 -1
- package/src/config/project-tree-form.json +24 -0
- package/src/config/reach-channels.yml +3 -3
- package/src/config/reach-prescriptions-intake.yml +1 -1
- package/src/config/roadmap-step-size-baseline.json +118 -0
- package/src/config/routing-coverage-seed.json +93 -2
- package/src/config/skill-body-budget.json +686 -0
- package/src/config/skill-fork-pilot.json +17 -0
- package/src/config/skill-lifecycle-probes-codex.json +57 -0
- package/src/config/skill-lifecycle-probes.json +57 -0
- package/src/config/skill-output-shape.json +316 -0
- package/src/config/step-depth-table.json +58 -0
- package/src/config/turnaround-budget.json +90 -0
- package/src/install/conflict.ts +38 -6
- package/src/install/conflictTracker.ts +126 -8
- package/src/install/detect.ts +3 -3
- package/src/install/hostPermissionsAdapter.ts +136 -0
- package/src/install/installThinLayer.ts +6 -1
- package/src/install/manifestFiles.ts +24 -0
- package/src/install/noGoDenyRows.ts +368 -0
- package/src/install/noGoRules.ts +438 -0
- package/src/install/ownershipLedger.ts +180 -0
- package/src/install/plan.ts +1 -1
- package/src/install/preflight.ts +42 -10
- package/src/install/preserve.ts +94 -12
- package/src/install/recordedOwnership.ts +121 -3
- package/src/install/rule_scope.ts +20 -3
- package/src/install/stagedRuntime.ts +528 -0
- package/src/install/toolsArg.ts +16 -0
- package/src/install/types.ts +23 -2
- package/src/install/userPin.ts +54 -0
- package/src/install/wizard-plan.ts +25 -4
- package/src/scripts/_cli/_doctor_emit.ts +24 -0
- package/src/scripts/_cli/cmd_brand_status.ts +223 -12
- package/src/scripts/_cli/cmd_ci_settle.ts +32 -0
- package/src/scripts/_cli/cmd_doctor.ts +23 -44
- package/src/scripts/_cli/cmd_route_explain.ts +176 -2
- package/src/scripts/_cli/cmd_uninstall.ts +270 -26
- package/src/scripts/_cli/cmd_update.ts +34 -1
- package/src/scripts/_cli/cmd_upgrade.ts +38 -2
- package/src/scripts/_cli/detection_report.ts +7 -0
- package/src/scripts/_cli/doctor_execution.ts +1 -2
- package/src/scripts/_cli/doctor_install_mode.ts +39 -0
- package/src/scripts/_cli/doctor_network_posture.ts +3 -3
- package/src/scripts/_cli/doctor_ownership_ledger.ts +126 -0
- package/src/scripts/_cli/doctor_update_verdict.ts +104 -0
- package/src/scripts/_cli/explain_last/scrubber.ts +9 -21
- package/src/scripts/_cli/upgrade_unattended.ts +548 -0
- package/src/scripts/_dispatch.bash +42 -9
- package/src/scripts/_lib/activation_ladder.ts +1 -1
- package/src/scripts/_lib/advisory_inventory.ts +405 -0
- package/src/scripts/_lib/advisory_notice.ts +270 -0
- package/src/scripts/_lib/advisory_sources.ts +752 -0
- package/src/scripts/_lib/advisory_verdicts.ts +363 -0
- package/src/scripts/_lib/agent_artifact_location.ts +177 -0
- package/src/scripts/_lib/agent_settings.ts +7 -12
- package/src/scripts/_lib/arrival_record.ts +217 -0
- package/src/scripts/_lib/asset_render_record.ts +247 -0
- package/src/scripts/_lib/billing_grant.ts +4 -2
- package/src/scripts/_lib/brand_voice_slot.ts +258 -0
- package/src/scripts/_lib/canary_status.ts +24 -0
- package/src/scripts/_lib/cc_transcript.ts +276 -0
- package/src/scripts/_lib/changelog_eras.ts +83 -0
- package/src/scripts/_lib/claim_phrases.ts +71 -0
- package/src/scripts/_lib/classify_update.ts +171 -0
- package/src/scripts/_lib/claude_builtin_names.ts +9 -4
- package/src/scripts/_lib/claude_hook_scope.ts +195 -0
- package/src/scripts/_lib/claude_settings_hooks.ts +118 -34
- package/src/scripts/_lib/codex_resident_set.ts +460 -0
- package/src/scripts/_lib/codex_skill_finder.ts +225 -0
- package/src/scripts/_lib/confusables.ts +19 -0
- package/src/scripts/_lib/consumer_impact.ts +199 -0
- package/src/scripts/_lib/content_class.ts +127 -0
- package/src/scripts/_lib/counted_probe.ts +68 -1
- package/src/scripts/_lib/credential_deny_rows.ts +151 -0
- package/src/scripts/_lib/credential_files.ts +367 -0
- package/src/scripts/_lib/delivery_arm_experiment.ts +2 -2
- package/src/scripts/_lib/depth_flip.ts +141 -0
- package/src/scripts/_lib/design_lock.ts +117 -0
- package/src/scripts/_lib/design_sync_ledger.ts +142 -0
- package/src/scripts/_lib/design_sync_plan.ts +177 -0
- package/src/scripts/_lib/design_sync_reconcile.ts +159 -0
- package/src/scripts/_lib/design_sync_verify.ts +99 -0
- package/src/scripts/_lib/design_system_claude_design.ts +323 -0
- package/src/scripts/_lib/design_system_import.ts +84 -6
- package/src/scripts/_lib/dispatch_import_closure.ts +42 -11
- package/src/scripts/_lib/egress_credential_env.ts +35 -0
- package/src/scripts/_lib/egress_engine.ts +22 -0
- package/src/scripts/_lib/egress_known_values.ts +223 -0
- package/src/scripts/_lib/egress_normalize.ts +67 -0
- package/src/scripts/_lib/egress_prefixes.ts +42 -0
- package/src/scripts/_lib/egress_rules.ts +896 -0
- package/src/scripts/_lib/egress_rules_linearity.ts +56 -0
- package/src/scripts/_lib/egress_sender_scan.ts +290 -0
- package/src/scripts/_lib/egress_session_table.ts +510 -0
- package/src/scripts/_lib/egress_text.ts +63 -0
- package/src/scripts/_lib/egress_token.ts +252 -0
- package/src/scripts/_lib/empty_cycles.ts +1 -1
- package/src/scripts/_lib/environment_detector.ts +45 -30
- package/src/scripts/_lib/exemption_shape.ts +75 -1
- package/src/scripts/_lib/floor_posture.ts +185 -0
- package/src/scripts/_lib/forge_protection.ts +140 -2
- package/src/scripts/_lib/global_deploy_inventory.ts +159 -6
- package/src/scripts/_lib/guidelines_lane.ts +12 -1
- package/src/scripts/_lib/hand_kinds.ts +65 -0
- package/src/scripts/_lib/headless_invocation.ts +3 -3
- package/src/scripts/_lib/host_capability.ts +34 -2
- package/src/scripts/_lib/host_env_write.ts +39 -18
- package/src/scripts/_lib/host_listing_model.ts +14 -7
- package/src/scripts/_lib/identifier_redaction.ts +26 -0
- package/src/scripts/_lib/impact_bump.ts +70 -0
- package/src/scripts/_lib/install_reach_checks.ts +53 -1
- package/src/scripts/_lib/installed_layer.ts +31 -0
- package/src/scripts/_lib/installed_layer_normalise.ts +75 -0
- package/src/scripts/_lib/instructions_loaded_classify.ts +75 -0
- package/src/scripts/_lib/instructions_loaded_event.ts +53 -0
- package/src/scripts/_lib/knowledge_global_redaction.ts +2 -2
- package/src/scripts/_lib/layer_form_corpus.ts +165 -0
- package/src/scripts/_lib/layer_form_decision.ts +248 -0
- package/src/scripts/_lib/layer_form_evidence.ts +112 -0
- package/src/scripts/_lib/lean_projection_mode.ts +32 -161
- package/src/scripts/_lib/llm_proposer_transport.ts +1 -0
- package/src/scripts/_lib/loop_guards.ts +8 -120
- package/src/scripts/_lib/major_surface.ts +207 -0
- package/src/scripts/_lib/mcp_bridge.ts +30 -69
- package/src/scripts/_lib/merge_clearance_record.ts +384 -0
- package/src/scripts/_lib/neighbour_census.ts +18 -1
- package/src/scripts/_lib/orchestration_record.ts +61 -0
- package/src/scripts/_lib/outcome_vocabularies.ts +15 -23
- package/src/scripts/_lib/pin_advice.ts +49 -0
- package/src/scripts/_lib/platform_anchor.ts +222 -0
- package/src/scripts/_lib/procedure_checks.ts +5 -0
- package/src/scripts/_lib/project_tree_form.ts +134 -0
- package/src/scripts/_lib/projection_key_migration.ts +122 -0
- package/src/scripts/_lib/prompt_shape.ts +13 -2
- package/src/scripts/_lib/provenance_verify.ts +272 -0
- package/src/scripts/_lib/quota_parked.ts +27 -1
- package/src/scripts/_lib/ratification_artifact.ts +64 -1
- package/src/scripts/_lib/ratification_subject.ts +508 -46
- package/src/scripts/_lib/release_findings_ingest.ts +52 -5
- package/src/scripts/_lib/release_highlights.ts +72 -2
- package/src/scripts/_lib/release_settings_surface.ts +392 -0
- package/src/scripts/_lib/review_round.ts +134 -0
- package/src/scripts/_lib/roadmap_checkboxes.ts +1 -1
- package/src/scripts/_lib/roadmap_slug_lock.ts +254 -0
- package/src/scripts/_lib/roadmap_step_size.ts +75 -0
- package/src/scripts/_lib/run_checkpoint.ts +60 -3
- package/src/scripts/_lib/runtime_wiring_checks.ts +15 -1
- package/src/scripts/_lib/scope_guard.sh +64 -5
- package/src/scripts/_lib/scoped_projection.ts +136 -3
- package/src/scripts/_lib/secret_detector.ts +24 -103
- package/src/scripts/_lib/security_fix.ts +429 -0
- package/src/scripts/_lib/security_fix_context.ts +133 -0
- package/src/scripts/_lib/self_repair.ts +69 -39
- package/src/scripts/_lib/self_repair_outgoing.ts +209 -0
- package/src/scripts/_lib/self_repair_payload.ts +86 -0
- package/src/scripts/_lib/session_eol.ts +3 -0
- package/src/scripts/_lib/session_pr_watch.ts +207 -0
- package/src/scripts/_lib/session_register.ts +51 -1
- package/src/scripts/_lib/session_tag.ts +51 -0
- package/src/scripts/_lib/settings_removed_keys.ts +30 -0
- package/src/scripts/_lib/settings_renamed_keys.ts +19 -5
- package/src/scripts/_lib/skill_catalogue.ts +66 -25
- package/src/scripts/_lib/skill_fork_pilot.ts +121 -0
- package/src/scripts/_lib/skill_leases.ts +203 -0
- package/src/scripts/_lib/skill_listing_overrides.ts +294 -0
- package/src/scripts/_lib/skill_materialisation.ts +388 -0
- package/src/scripts/_lib/skill_materialisation_gate.ts +210 -0
- package/src/scripts/_lib/skill_materialisation_lock.ts +149 -0
- package/src/scripts/_lib/skill_materialisation_triggers.ts +96 -0
- package/src/scripts/_lib/skill_origin.ts +21 -1
- package/src/scripts/_lib/skill_reach.ts +342 -0
- package/src/scripts/_lib/source_shape.ts +7 -2
- package/src/scripts/_lib/sqlite_guard.ts +1 -1
- package/src/scripts/_lib/step_anatomy.ts +330 -0
- package/src/scripts/_lib/subagent_capsule.ts +8 -2
- package/src/scripts/_lib/subagent_native_fields.ts +30 -0
- package/src/scripts/_lib/subagent_spawn.ts +36 -0
- package/src/scripts/_lib/subagent_steering.ts +367 -0
- package/src/scripts/_lib/svg_filled_counter.ts +287 -0
- package/src/scripts/_lib/svg_rules.ts +2 -0
- package/src/scripts/_lib/test_delta.ts +89 -6
- package/src/scripts/_lib/tier_downshift_verdict.ts +222 -0
- package/src/scripts/_lib/tool_result_census.ts +62 -0
- package/src/scripts/_lib/trigger_routers.ts +1 -0
- package/src/scripts/_lib/turnaround_throughput.ts +378 -0
- package/src/scripts/_lib/ui_surface.ts +22 -0
- package/src/scripts/_lib/unattended_gates.ts +100 -0
- package/src/scripts/_lib/undeployed_fixes.ts +34 -0
- package/src/scripts/_lib/update_check.ts +143 -12
- package/src/scripts/_lib/update_invite.ts +116 -0
- package/src/scripts/_lib/update_notice.ts +259 -0
- package/src/scripts/_lib/verify_clause.ts +4 -2
- package/src/scripts/_lib/version_order.ts +146 -0
- package/src/scripts/_lib/worker_reuse.ts +191 -0
- package/src/scripts/_lib/workspace_secrets.ts +273 -0
- package/src/scripts/_lib/worktree_git.ts +67 -0
- package/src/scripts/_lib/worktree_ignored.ts +116 -0
- package/src/scripts/adoption_status.ts +330 -3
- package/src/scripts/adr_cite_check.ts +93 -0
- package/src/scripts/advisories.ts +803 -0
- package/src/scripts/ai-image/adapters/flux.sh +1 -0
- package/src/scripts/ai-image/adapters/gemini-image.sh +1 -0
- package/src/scripts/ai-image/adapters/ideogram.sh +1 -0
- package/src/scripts/ai-image/adapters/recraft.sh +1 -0
- package/src/scripts/ai-video/adapters/comfyui.sh +1 -0
- package/src/scripts/ai-video/adapters/fal.sh +1 -0
- package/src/scripts/ai-video/adapters/gemini-veo.sh +1 -0
- package/src/scripts/ai-video/adapters/higgsfield.sh +1 -0
- package/src/scripts/ai-video/adapters/kling.sh +1 -0
- package/src/scripts/ai-video/adapters/musetalk.sh +1 -0
- package/src/scripts/ai-video/adapters/openai-images.sh +1 -0
- package/src/scripts/ai-video/adapters/replicate.sh +1 -0
- package/src/scripts/ai-video/adapters/sora.sh +1 -0
- package/src/scripts/ai-video/adapters/syncso.sh +1 -0
- package/src/scripts/ai-video/stitch.sh +115 -2
- package/src/scripts/ai_council/airgap.ts +1 -0
- package/src/scripts/ai_council/api_transport.ts +27 -4
- package/src/scripts/ai_council/budget_guard.ts +300 -11
- package/src/scripts/ai_council/bundler.ts +20 -29
- package/src/scripts/ai_council/chairman.ts +17 -2
- package/src/scripts/ai_council/cli_agency_bounds.ts +158 -0
- package/src/scripts/ai_council/cli_launch_env.ts +54 -0
- package/src/scripts/ai_council/cli_least_agency_canary.ts +18 -2
- package/src/scripts/ai_council/clients.ts +55 -73
- package/src/scripts/ai_council/config.ts +16 -22
- package/src/scripts/ai_council/council_egress.ts +167 -0
- package/src/scripts/ai_council/exposure_ledger.ts +117 -0
- package/src/scripts/ai_council/free_hand_shadow.ts +276 -0
- package/src/scripts/ai_council/free_route.ts +216 -0
- package/src/scripts/ai_council/free_route_catalog.ts +173 -0
- package/src/scripts/ai_council/free_route_client.ts +95 -0
- package/src/scripts/ai_council/free_rung.ts +61 -0
- package/src/scripts/ai_council/hand_payload.ts +230 -0
- package/src/scripts/ai_council/hand_schemas.ts +123 -0
- package/src/scripts/ai_council/jury_aggregate.ts +155 -1
- package/src/scripts/ai_council/kind_flip.ts +221 -0
- package/src/scripts/ai_council/kind_flip_state.ts +19 -0
- package/src/scripts/ai_council/learn_low_impact_preview.ts +50 -22
- package/src/scripts/ai_council/modification_review.ts +98 -5
- package/src/scripts/ai_council/necessity.ts +7 -0
- package/src/scripts/ai_council/orchestrator.ts +16 -16
- package/src/scripts/ai_council/pricing.ts +10 -0
- package/src/scripts/ai_council/redact_low_impact_entry.ts +5 -2
- package/src/scripts/ai_council/response_render.ts +27 -4
- package/src/scripts/ai_council/round_reservations.ts +119 -0
- package/src/scripts/ai_council/route_chooser.ts +161 -0
- package/src/scripts/ai_council/route_liveness.ts +152 -0
- package/src/scripts/ai_council/route_member.ts +52 -0
- package/src/scripts/ai_council/seat_policy.ts +40 -0
- package/src/scripts/ai_council/seat_resume.ts +40 -0
- package/src/scripts/ai_council/shadow_dispatch.ts +13 -3
- package/src/scripts/ai_council/spend_gate.ts +18 -2
- package/src/scripts/ai_council/status_surface.ts +37 -0
- package/src/scripts/ai_council/transport_resolver.ts +15 -18
- package/src/scripts/analysis_analysts.ts +226 -0
- package/src/scripts/analysis_anchors.ts +140 -0
- package/src/scripts/analysis_and_optimize.ts +44 -0
- package/src/scripts/analysis_emit.ts +150 -0
- package/src/scripts/analysis_exchange.ts +186 -0
- package/src/scripts/analysis_gate.ts +158 -0
- package/src/scripts/analysis_inbox_final.ts +173 -0
- package/src/scripts/analysis_ledger.ts +119 -0
- package/src/scripts/analysis_pr_optimize.ts +219 -0
- package/src/scripts/analysis_pr_review.ts +240 -0
- package/src/scripts/analysis_pr_target.ts +121 -0
- package/src/scripts/analysis_prompts.ts +130 -0
- package/src/scripts/analysis_publish.ts +358 -0
- package/src/scripts/analysis_questions.ts +78 -0
- package/src/scripts/analysis_run.ts +248 -0
- package/src/scripts/analysis_run_record.ts +210 -0
- package/src/scripts/analysis_target.ts +343 -0
- package/src/scripts/analysis_validate.ts +161 -0
- package/src/scripts/anchor_eval_falsify.ts +1 -1
- package/src/scripts/arrival_report.ts +115 -0
- package/src/scripts/ask_transport.ts +284 -35
- package/src/scripts/backfill_model_tier.ts +4 -5
- package/src/scripts/before_complete_hook.ts +48 -2
- package/src/scripts/bench_hook_latency.ts +3 -3
- package/src/scripts/bench_procedure_cursor.ts +440 -0
- package/src/scripts/bootstrap.sh +3 -3
- package/src/scripts/build_exit_code_register.ts +440 -0
- package/src/scripts/build_proof.ts +23 -1
- package/src/scripts/cache_realization_report.ts +155 -14
- package/src/scripts/canary_liveness.ts +117 -0
- package/src/scripts/chat_history.ts +12 -15
- package/src/scripts/check_account_surface.ts +318 -0
- package/src/scripts/check_agent_artifact_location.ts +17 -160
- package/src/scripts/check_bundle_path_leakage.ts +6 -0
- package/src/scripts/check_ci_local_parity.ts +21 -13
- package/src/scripts/check_claims.ts +77 -2
- package/src/scripts/check_completion_review.ts +34 -1
- package/src/scripts/check_concern_admissions.ts +41 -5
- package/src/scripts/check_consumer_scope_flip.ts +1 -1
- package/src/scripts/check_context_paths.ts +2 -0
- package/src/scripts/check_council_layout.ts +9 -0
- package/src/scripts/check_credential_spelling.ts +267 -0
- package/src/scripts/check_egress_mutations.ts +239 -0
- package/src/scripts/check_enforcement_coverage.ts +16 -3
- package/src/scripts/check_estate_count.ts +16 -1
- package/src/scripts/check_finding_dispositions.ts +147 -0
- package/src/scripts/check_gate_coverage.ts +123 -21
- package/src/scripts/check_gate_reachability.ts +16 -2
- package/src/scripts/check_generator_sync.ts +46 -0
- package/src/scripts/check_hook_bundle_composition.ts +139 -1
- package/src/scripts/check_host_docs_digest.ts +142 -5
- package/src/scripts/check_kernel_edit_ratified.ts +301 -76
- package/src/scripts/check_kernel_rule_bundle.ts +14 -10
- package/src/scripts/check_knowledge_cards.ts +83 -3
- package/src/scripts/check_memory.ts +13 -3
- package/src/scripts/check_pack_size.ts +1 -1
- package/src/scripts/check_permission_deny_syntax.ts +247 -0
- package/src/scripts/check_platform_anchor.ts +243 -0
- package/src/scripts/check_proposal.ts +183 -1
- package/src/scripts/check_reach_channels.ts +5 -3
- package/src/scripts/check_references.ts +5 -2
- package/src/scripts/check_release_manifest_content.ts +33 -0
- package/src/scripts/check_release_pr_shape.ts +5 -0
- package/src/scripts/check_rule_invariants.ts +9 -1
- package/src/scripts/check_skill_body_budget.ts +343 -0
- package/src/scripts/check_skill_requires.ts +137 -1
- package/src/scripts/check_step_receipts.ts +246 -0
- package/src/scripts/check_structural_breaking.ts +7 -1
- package/src/scripts/check_suppression_hygiene.ts +8 -0
- package/src/scripts/check_test_weakening.ts +14 -0
- package/src/scripts/check_token_quality_golden.ts +5 -1
- package/src/scripts/check_update_banner.ts +50 -3
- package/src/scripts/check_verify_expectation_delta.ts +2 -1
- package/src/scripts/check_voice_lexicon.ts +531 -0
- package/src/scripts/ci_os_attribution.ts +327 -0
- package/src/scripts/ci_platform_scope.ts +69 -0
- package/src/scripts/ci_settle.ts +4 -1
- package/src/scripts/ci_status.ts +0 -1
- package/src/scripts/ci_time_to_green.ts +748 -0
- package/src/scripts/classify_merge_risk.ts +407 -19
- package/src/scripts/code_graph/sqlite_store.ts +1 -1
- package/src/scripts/compile_trigger_evals.ts +353 -0
- package/src/scripts/condense.ts +25 -31
- package/src/scripts/consumer_matrix.ts +61 -3
- package/src/scripts/council_availability_hook.ts +12 -4
- package/src/scripts/council_cli.ts +48 -38
- package/src/scripts/cross_repo_retrieve.ts +9 -72
- package/src/scripts/design_lock.ts +106 -0
- package/src/scripts/design_slop_rules.ts +30 -0
- package/src/scripts/design_sync.ts +264 -0
- package/src/scripts/design_system_import.ts +30 -13
- package/src/scripts/dispatch_economy_report.ts +46 -1
- package/src/scripts/dispatch_r2_reviewer.ts +41 -5
- package/src/scripts/egress_canary.ts +166 -0
- package/src/scripts/egress_sender_census.ts +101 -0
- package/src/scripts/external_sources_denylist.json +94 -12
- package/src/scripts/generate_catalog.ts +6 -2
- package/src/scripts/generate_owned_digest.ts +163 -0
- package/src/scripts/generate_reference_toc.ts +143 -0
- package/src/scripts/generate_subagent_floor.ts +11 -1
- package/src/scripts/handoff_context_hook.ts +34 -0
- package/src/scripts/hook_carrier_census.ts +263 -0
- package/src/scripts/hook_chunks.d.mts +12 -0
- package/src/scripts/hook_chunks.mjs +114 -0
- package/src/scripts/hook_manifest.json +1 -1
- package/src/scripts/hook_manifest.yaml +65 -42
- package/src/scripts/hooks/block_config_weakening.ts +127 -3
- package/src/scripts/hooks/block_credential_reads.ts +165 -0
- package/src/scripts/hooks/block_no_verify.ts +47 -23
- package/src/scripts/hooks/block_speaking_inbox_dir.ts +38 -7
- package/src/scripts/hooks/category_a.ts +202 -25
- package/src/scripts/hooks/concern_failure_policy.ts +6 -6
- package/src/scripts/hooks/concern_registry.ts +31 -6
- package/src/scripts/hooks/concern_registry_types.ts +11 -0
- package/src/scripts/hooks/delegation_nudge_hook.ts +105 -15
- package/src/scripts/hooks/design_pass_hook.ts +42 -10
- package/src/scripts/hooks/dispatch_hook.ts +13 -12
- package/src/scripts/hooks/egress_engine_loader.ts +125 -0
- package/src/scripts/hooks/egress_stage.ts +440 -0
- package/src/scripts/hooks/hook_stdin.ts +29 -4
- package/src/scripts/hooks/host_docs_pages.ts +194 -0
- package/src/scripts/hooks/host_docs_pages.yaml +75 -0
- package/src/scripts/hooks/host_lowering.json +1 -1
- package/src/scripts/hooks/host_lowering.yaml +22 -21
- package/src/scripts/hooks/host_rate_marker_hook.ts +73 -0
- package/src/scripts/hooks/instructions_observer_hook.ts +170 -0
- package/src/scripts/hooks/interruption_ledger_hook.ts +1 -1
- package/src/scripts/hooks/lazy_concern.ts +148 -0
- package/src/scripts/hooks/orchestration_record_hook.ts +80 -2
- package/src/scripts/hooks/payload_stub.ts +16 -6
- package/src/scripts/hooks/permission_gate.ts +7 -7
- package/src/scripts/hooks/push_settle_hook.ts +32 -3
- package/src/scripts/hooks/replay_hook.ts +43 -0
- package/src/scripts/hooks/reread_guard_hook.ts +87 -10
- package/src/scripts/hooks/rtk_wrap_hook.ts +4 -3
- package/src/scripts/hooks/rule_inject_hook.ts +8 -1
- package/src/scripts/hooks/session_eol_hook.ts +48 -1
- package/src/scripts/hooks/source_first_gate_hook.ts +6 -8
- package/src/scripts/hooks/spawn_guard_shadow_hook.ts +203 -10
- package/src/scripts/hooks/state_io.ts +2 -2
- package/src/scripts/hooks/svg_obligation.ts +75 -19
- package/src/scripts/hooks/tool_result_bytes_hook.ts +14 -5
- package/src/scripts/hooks/turn_end_gate_hook.ts +1 -1
- package/src/scripts/hooks/ui_route_nudge_hook.ts +2 -12
- package/src/scripts/hooks_doctor.ts +31 -0
- package/src/scripts/hooks_status.ts +58 -3
- package/src/scripts/inbox_source_census.ts +74 -13
- package/src/scripts/install +25 -3
- package/src/scripts/install.ts +60 -91
- package/src/scripts/interruption_report.ts +11 -1
- package/src/scripts/layer_baseline_report.ts +267 -0
- package/src/scripts/learning_sidecar.ts +1 -1
- package/src/scripts/lint_agents_layout.ts +3 -0
- package/src/scripts/lint_blocker_citations.ts +104 -0
- package/src/scripts/lint_breaking_changes_index.ts +40 -7
- package/src/scripts/lint_consolidation_lineage.ts +144 -16
- package/src/scripts/lint_consumer_internal_refs.ts +90 -42
- package/src/scripts/lint_context_spine_usage.ts +21 -0
- package/src/scripts/lint_design_antipattern_parity.ts +39 -7
- package/src/scripts/lint_evidence_artifacts.ts +31 -0
- package/src/scripts/lint_example_fences.ts +11 -2
- package/src/scripts/lint_ghostwriter_source.ts +42 -10
- package/src/scripts/lint_hook_manifest.ts +94 -0
- package/src/scripts/lint_marketplace_install_completeness.ts +4 -0
- package/src/scripts/lint_mcp_config_security.ts +9 -11
- package/src/scripts/lint_plan_risk_register.ts +28 -1
- package/src/scripts/lint_positioning.ts +4 -4
- package/src/scripts/lint_provenance.ts +1 -0
- package/src/scripts/lint_roadmap_blockers.ts +65 -4
- package/src/scripts/lint_roadmap_complexity.ts +98 -0
- package/src/scripts/lint_skill_link_reach.ts +251 -9
- package/src/scripts/lint_skill_procedures.ts +252 -0
- package/src/scripts/lint_skill_scripts_readonly.ts +12 -1
- package/src/scripts/lint_subagent_determinism.ts +14 -1
- package/src/scripts/lint_ticked_unmet_criteria.ts +300 -21
- package/src/scripts/mcp_registry_submit.sh +2 -2
- package/src/scripts/mcp_server/consumer_tool_catalog.json +4 -4
- package/src/scripts/mcp_server/suggest_skill.ts +89 -4
- package/src/scripts/mcp_server/tools.ts +2 -33
- package/src/scripts/measure_skill_ranker_baseline.ts +203 -5
- package/src/scripts/measure_turn_end_gate.ts +61 -1
- package/src/scripts/merge_clearance.ts +225 -0
- package/src/scripts/migrate_command_suggestions.ts +1 -1
- package/src/scripts/network_sources.ts +236 -0
- package/src/scripts/no_go_deny_rows.ts +225 -0
- package/src/scripts/orchestration_record.ts +15 -2
- package/src/scripts/plan_test_shards.ts +103 -0
- package/src/scripts/pr_url_reminder_hook.ts +10 -0
- package/src/scripts/print_required_checks.ts +5 -5
- package/src/scripts/probe_depth_shadow.ts +406 -0
- package/src/scripts/probe_turnaround.ts +342 -10
- package/src/scripts/ratification_subject.ts +176 -0
- package/src/scripts/rdp_gate_classify.ts +1 -0
- package/src/scripts/rdp_quality_eval.ts +1 -0
- package/src/scripts/release.ts +26 -55
- package/src/scripts/release_drill.ts +52 -23
- package/src/scripts/release_env.ts +37 -0
- package/src/scripts/release_publication.ts +11 -1
- package/src/scripts/report_consumer_gate_reach.ts +233 -0
- package/src/scripts/report_merge_gate_load.ts +295 -0
- package/src/scripts/report_project_contract.ts +123 -0
- package/src/scripts/report_reducible_classes.ts +342 -0
- package/src/scripts/report_required_checks_drift.ts +5 -3
- package/src/scripts/report_skill_host_census.ts +199 -0
- package/src/scripts/report_standing_payload_by_host.ts +7 -7
- package/src/scripts/retro.ts +758 -0
- package/src/scripts/retro_facts.ts +575 -0
- package/src/scripts/retro_queue.ts +739 -0
- package/src/scripts/retro_session_facts.ts +218 -0
- package/src/scripts/retro_sweep.ts +493 -0
- package/src/scripts/retro_triage.ts +126 -0
- package/src/scripts/roadmap_context.ts +2 -2
- package/src/scripts/roadmap_drain_queue.ts +601 -0
- package/src/scripts/run_supervise.ts +24 -2
- package/src/scripts/schemas/agent-settings.schema.json +0 -16
- package/src/scripts/schemas/command.schema.json +3 -3
- package/src/scripts/schemas/review-findings.schema.json +8 -0
- package/src/scripts/schemas/skill.schema.json +7 -6
- package/src/scripts/schemas/subagent.schema.json +33 -2
- package/src/scripts/score_skill_selection.ts +5 -2
- package/src/scripts/second_brain_retrieval.ts +1 -0
- package/src/scripts/second_brain_run.ts +1 -0
- package/src/scripts/self_repair_cli.ts +563 -87
- package/src/scripts/self_review_gate.ts +59 -4
- package/src/scripts/session_register_hook.ts +91 -4
- package/src/scripts/sessions_cli.ts +100 -5
- package/src/scripts/skill_collision_clusters.ts +1 -1
- package/src/scripts/skill_tools/score_skill_relevance.ts +31 -2
- package/src/scripts/skill_trigger_eval.ts +4 -2
- package/src/scripts/source_adapters.ts +183 -0
- package/src/scripts/step_receipt.ts +100 -0
- package/src/scripts/sync_pr_branch.ts +4 -0
- package/src/scripts/test_council_qualification.ts +1 -1
- package/src/scripts/trigger_eval_grandfather.json +3 -49
- package/src/scripts/trigger_eval_rotation.ts +31 -3
- package/src/scripts/ui_conformance_probe.ts +405 -1
- package/src/scripts/update_counts.ts +230 -11
- package/src/scripts/update_invite_hook.ts +245 -0
- package/src/scripts/update_notice_hook.ts +298 -0
- package/src/scripts/validate_frontmatter.ts +85 -0
- package/src/scripts/worker_reuse_shadow_report.ts +121 -0
- package/src/scripts/worktree_cleanup_check.ts +915 -121
- package/src/server/io/yamlIO.ts +2 -2
- package/src/server/schemas/settings.ts +37 -23
- package/src/shared/brandTokenDocument.ts +46 -0
- package/src/shared/brandTokenPaths.ts +43 -0
- package/src/shared/settingsCarveOut.ts +0 -8
- package/src/shared/skillRanking.ts +106 -5
- package/src/shared/userMd/formAdapter.ts +15 -1
- package/src/shared/userMd/schema.ts +22 -0
- package/src/templates/agent-user.md +4 -0
- package/src/templates/agent-user.yml +4 -0
- package/dist/cli-delegate/chunk-4DBG5K7M.js +0 -1123
- package/dist/cli-delegate/chunk-523HCFYO.js +0 -90
- package/dist/cli-delegate/chunk-AL3RZ22D.js +0 -74
- package/dist/cli-delegate/chunk-KB5FZ655.js +0 -208
- package/dist/cli-delegate/chunk-MDPPKQCQ.js +0 -875
- package/dist/cli-delegate/chunk-OAFSJBHH.js +0 -272
- package/dist/ui/assets/index-C3djEJah.js +0 -23
- package/src/scripts/_lib/continuation_ladder.ts +0 -335
- package/src/scripts/hooks/run_continuation_hook.ts +0 -1524
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* PreToolUse guard: refuse reading a credential-class file, and refuse a
|
|
4
|
+
* command that prints the process environment — road-to-one-detector-and-the-
|
|
5
|
+
* senders-we-own 1.1.
|
|
6
|
+
*
|
|
7
|
+
* Prevention ahead of the egress stage: a value that is never read cannot reach
|
|
8
|
+
* a model provider through any later bug, and everything the session reads goes
|
|
9
|
+
* into the conversation, so a `.env` read is a `.env` sent. It is a best-effort
|
|
10
|
+
* guard over the shapes it recognises, not a boundary: it allows what it cannot
|
|
11
|
+
* decide (`fail_closed: false`), and the residue below is not caught.
|
|
12
|
+
*
|
|
13
|
+
* What it refuses, with the class list in `_lib/credential_files.ts` (shared
|
|
14
|
+
* with the installer's native deny tier):
|
|
15
|
+
*
|
|
16
|
+
* - a file tool (Read, Edit, Grep, …) whose target path is an environment
|
|
17
|
+
* file (`.env`, `.env.*`, `.envrc` — `.env.example` and the other template
|
|
18
|
+
* names pass), a private key, a cloud or CLI credential file, or a
|
|
19
|
+
* package-registry credential file;
|
|
20
|
+
* - a shell command that hands such a path — as an argument, a redirect or an
|
|
21
|
+
* option value (`--config=.env`) — to anything but a short list of commands
|
|
22
|
+
* that neither print nor run it (`ls`, `rm`, `chmod`, …), looking through
|
|
23
|
+
* `sudo`/`command`/`nice`-style wrappers, `sh -c`, `eval` and command
|
|
24
|
+
* substitutions;
|
|
25
|
+
* - a shell command that prints the environment (`env`, `printenv`, a bare
|
|
26
|
+
* `export`, a bare `set`, `declare -x`).
|
|
27
|
+
*
|
|
28
|
+
* What it allows: a write-only tool (the value is the model's own), a tool that
|
|
29
|
+
* returns names rather than content (Glob, LS), and a guard it cannot decide —
|
|
30
|
+
* a malformed envelope or any crash allows (`fail_closed: false`), so this
|
|
31
|
+
* guard is never the reason an unrelated call fails. Not caught, and recorded
|
|
32
|
+
* as the residue `tests/fixtures/egress-prevention-gaps/` names: a program that
|
|
33
|
+
* reads the file itself (`node -e "…readFileSync('.env')"`), a value printed by
|
|
34
|
+
* a running process, a secret typed by the user — and a search or glob that
|
|
35
|
+
* never names the file (`Grep path=.`, `grep -r KEY .`, `rg KEY`, `cat .e*`).
|
|
36
|
+
* The last returns the file's lines as tool output, which is the
|
|
37
|
+
* `program-output` fixture's channel: the stage sees it, this guard does not.
|
|
38
|
+
*
|
|
39
|
+
* Kill switch: `AGENT_CONFIG_ALLOW_CREDENTIAL_READS=1`.
|
|
40
|
+
*
|
|
41
|
+
* Only a host that binds `pre_tool_use` AND honours a deny refuses; elsewhere
|
|
42
|
+
* the dispatcher lowers the block to a warning (`host_semantics.ts`), and
|
|
43
|
+
* `agent-config hooks:status` answers which applies on the host in use.
|
|
44
|
+
*
|
|
45
|
+
* Exit codes (docs/contracts/hook-architecture-v1.md): 0 allow · 1 block.
|
|
46
|
+
*/
|
|
47
|
+
|
|
48
|
+
import * as fs from 'node:fs';
|
|
49
|
+
import * as path from 'node:path';
|
|
50
|
+
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
51
|
+
|
|
52
|
+
import {
|
|
53
|
+
CREDENTIAL_CLASS_LABEL,
|
|
54
|
+
credentialBasename,
|
|
55
|
+
credentialFileClass,
|
|
56
|
+
HOST,
|
|
57
|
+
segmentVerdict,
|
|
58
|
+
type CredentialFileClass,
|
|
59
|
+
type PathHost,
|
|
60
|
+
} from '../_lib/credential_files.js';
|
|
61
|
+
import { isEnvKillSwitchActive } from '../_lib/env_kill_switch.js';
|
|
62
|
+
import { invokedSegments } from './git_command_classifier.js';
|
|
63
|
+
import { readHookStdin } from './hook_stdin.js';
|
|
64
|
+
|
|
65
|
+
type JsonValue = string | number | boolean | null | JsonValue[] | { [k: string]: JsonValue };
|
|
66
|
+
type JsonObject = { [k: string]: JsonValue };
|
|
67
|
+
|
|
68
|
+
export const KILL_SWITCH = 'AGENT_CONFIG_ALLOW_CREDENTIAL_READS';
|
|
69
|
+
|
|
70
|
+
const PATH_KEYS: ReadonlySet<string> = new Set([
|
|
71
|
+
'file_path', 'path', 'target_file', 'filename', 'filePath', 'notebook_path', 'paths', 'files', 'file_paths',
|
|
72
|
+
]);
|
|
73
|
+
|
|
74
|
+
/** Every string held under a path key, at any depth and inside arrays. */
|
|
75
|
+
function pathValues(v: JsonValue | undefined, underPathKey: boolean, out: string[]): string[] {
|
|
76
|
+
if (typeof v === 'string') {
|
|
77
|
+
if (underPathKey && v !== '') out.push(v);
|
|
78
|
+
} else if (Array.isArray(v)) {
|
|
79
|
+
for (const x of v) pathValues(x, underPathKey, out);
|
|
80
|
+
} else if (isObject(v)) {
|
|
81
|
+
for (const [k, x] of Object.entries(v)) pathValues(x, underPathKey || PATH_KEYS.has(k), out);
|
|
82
|
+
}
|
|
83
|
+
return out;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/** Tools that write a value the model already has, or list names without content. */
|
|
87
|
+
const NON_READING_TOOLS: ReadonlySet<string> = new Set(['write', 'create_file', 'glob', 'ls', 'list_dir', 'file_search']);
|
|
88
|
+
|
|
89
|
+
function isObject(v: JsonValue | undefined): v is JsonObject {
|
|
90
|
+
return v !== null && v !== undefined && typeof v === 'object' && !Array.isArray(v);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
export interface Refusal {
|
|
94
|
+
readonly class: CredentialFileClass;
|
|
95
|
+
readonly what: string;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/** The refusal for one tool call, or null. Pure: the host whose paths are judged is an argument. */
|
|
99
|
+
export function verdictFor(toolName: string, input: JsonObject, host: PathHost = HOST): Refusal | null {
|
|
100
|
+
const tool = toolName.trim().toLowerCase();
|
|
101
|
+
if (!NON_READING_TOOLS.has(tool)) {
|
|
102
|
+
for (const v of pathValues(input, false, [])) {
|
|
103
|
+
const cls = credentialFileClass(v, host);
|
|
104
|
+
if (cls !== null) return { class: cls, what: `\`${credentialBasename(v)}\`` };
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
const cmd = input['command'];
|
|
108
|
+
if (typeof cmd === 'string' && cmd !== '') {
|
|
109
|
+
for (const segment of invokedSegments(cmd)) {
|
|
110
|
+
const r = segmentVerdict(segment, host);
|
|
111
|
+
if (r !== null) return r;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return null;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
export function denyMessage(r: Refusal): string {
|
|
118
|
+
const alternative =
|
|
119
|
+
r.class === 'process-environment'
|
|
120
|
+
? 'Print one variable you need by name, and only one that holds no secret.'
|
|
121
|
+
: 'Reference the variable by name (`$NAME`, `process.env.NAME`) instead of reading its value; `.env.example` lists the keys.';
|
|
122
|
+
return (
|
|
123
|
+
`Blocked: ${r.what} is ${CREDENTIAL_CLASS_LABEL[r.class]}. What a session reads is sent to the model ` +
|
|
124
|
+
`provider, so a credential read is a credential sent. ${alternative} ` +
|
|
125
|
+
`(block-credential-reads; maintainer override: ${KILL_SWITCH}=1)\n`
|
|
126
|
+
);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
export function main(): number {
|
|
130
|
+
if (isEnvKillSwitchActive(KILL_SWITCH)) return 0;
|
|
131
|
+
let envelope: JsonObject;
|
|
132
|
+
try {
|
|
133
|
+
const raw = readHookStdin();
|
|
134
|
+
if (!raw) return 0;
|
|
135
|
+
envelope = JSON.parse(raw) as JsonObject;
|
|
136
|
+
} catch {
|
|
137
|
+
return 0;
|
|
138
|
+
}
|
|
139
|
+
try {
|
|
140
|
+
const payload = isObject(envelope['payload']) ? envelope['payload'] : envelope;
|
|
141
|
+
const input = isObject(payload['tool_input']) ? payload['tool_input'] : isObject(envelope['tool_input']) ? envelope['tool_input'] : null;
|
|
142
|
+
if (input === null) return 0;
|
|
143
|
+
const rawTool = payload['tool_name'] ?? envelope['tool_name'];
|
|
144
|
+
const r = verdictFor(typeof rawTool === 'string' ? rawTool : '', input);
|
|
145
|
+
if (r === null) return 0;
|
|
146
|
+
process.stderr.write(denyMessage(r));
|
|
147
|
+
return 1;
|
|
148
|
+
} catch {
|
|
149
|
+
return 0;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
function isCliEntry(): boolean {
|
|
154
|
+
if (process.argv[1] === undefined) return false;
|
|
155
|
+
if (import.meta.url === pathToFileURL(path.resolve(process.argv[1])).href) return true;
|
|
156
|
+
try {
|
|
157
|
+
return fs.realpathSync(fileURLToPath(import.meta.url)) === fs.realpathSync(path.resolve(process.argv[1]));
|
|
158
|
+
} catch {
|
|
159
|
+
return false;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
if (isCliEntry()) {
|
|
164
|
+
process.exit(main());
|
|
165
|
+
}
|
|
@@ -62,6 +62,19 @@ const _GIT_GLOBAL_OPTS_WITH_VALUE: ReadonlySet<string> = new Set([
|
|
|
62
62
|
'--exec-path',
|
|
63
63
|
'--super-prefix',
|
|
64
64
|
]);
|
|
65
|
+
/** Refusal fragments shared by the three hook-bypass branches, stored once. */
|
|
66
|
+
const _BYPASSES = ' bypasses git hooks (git-history-discipline).';
|
|
67
|
+
const _REMEDY =
|
|
68
|
+
' Let the hooks run and fix what they report; that is the only path this guard leaves open.';
|
|
69
|
+
/**
|
|
70
|
+
* Builtins where `git <sub> -h` verified short `-n` cannot bypass a hook.
|
|
71
|
+
* An ALLOWLIST, not a denylist of `commit`/`am`: with `ci = commit` aliased,
|
|
72
|
+
* `git ci -n` resolves to `ci`, which a denylist would miss. Git never lets
|
|
73
|
+
* an alias shadow a builtin, so aliases stay blocked. `am` is absent on
|
|
74
|
+
* purpose — unverified is not safe, and it carries `--no-verify`.
|
|
75
|
+
*/
|
|
76
|
+
const _SHORT_N_UNRELATED =
|
|
77
|
+
/^(add|branch|cherry-pick|clean|fetch|grep|log|merge|mv|pull|push|rebase|revert|rev-list|rm|shortlog|show|tag)$/;
|
|
65
78
|
const _CONFIG_READ_OR_RESTORE: ReadonlySet<string> = new Set([
|
|
66
79
|
'--get',
|
|
67
80
|
'--get-all',
|
|
@@ -258,6 +271,24 @@ function _git_base(tokens: string[]): string[] | null {
|
|
|
258
271
|
return null;
|
|
259
272
|
}
|
|
260
273
|
|
|
274
|
+
/**
|
|
275
|
+
* Index of the subcommand inside `git`'s arguments: the first token that is
|
|
276
|
+
* neither a global option nor the VALUE of one, so `git -C /repo config …`
|
|
277
|
+
* resolves to `config` and not to `/repo`. -1 when there is none.
|
|
278
|
+
*/
|
|
279
|
+
function _git_subcommand_index(rest: string[]): number {
|
|
280
|
+
for (let k = 0; k < rest.length; k += 1) {
|
|
281
|
+
const tok = rest[k] as string;
|
|
282
|
+
if (!tok.startsWith('-')) {
|
|
283
|
+
return k;
|
|
284
|
+
}
|
|
285
|
+
if (_GIT_GLOBAL_OPTS_WITH_VALUE.has(tok)) {
|
|
286
|
+
k += 1; // consume its value
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
return -1;
|
|
290
|
+
}
|
|
291
|
+
|
|
261
292
|
/**
|
|
262
293
|
* `git config … core.hooksPath <value>` — the subcommand form of the hooksPath
|
|
263
294
|
* override, distinct from the `-c` / `--config` global-option form handled in
|
|
@@ -281,20 +312,7 @@ function _git_base(tokens: string[]): string[] | null {
|
|
|
281
312
|
*/
|
|
282
313
|
function _is_config_hookspath_write(git_tokens: string[]): [boolean, string] {
|
|
283
314
|
const rest = git_tokens.slice(1);
|
|
284
|
-
|
|
285
|
-
// the VALUE of one — `git -C /repo config …` must still resolve to
|
|
286
|
-
// `config`, not to `/repo`.
|
|
287
|
-
let subIdx = -1;
|
|
288
|
-
for (let k = 0; k < rest.length; k += 1) {
|
|
289
|
-
const tok = rest[k] as string;
|
|
290
|
-
if (!tok.startsWith('-')) {
|
|
291
|
-
subIdx = k;
|
|
292
|
-
break;
|
|
293
|
-
}
|
|
294
|
-
if (_GIT_GLOBAL_OPTS_WITH_VALUE.has(tok)) {
|
|
295
|
-
k += 1; // consume its value
|
|
296
|
-
}
|
|
297
|
-
}
|
|
315
|
+
const subIdx = _git_subcommand_index(rest);
|
|
298
316
|
if (subIdx === -1 || rest[subIdx] !== 'config') {
|
|
299
317
|
return [false, ''];
|
|
300
318
|
}
|
|
@@ -332,26 +350,32 @@ function _is_blocked(git_tokens: string[]): [boolean, string] {
|
|
|
332
350
|
if (cfgBlocked) {
|
|
333
351
|
return [cfgBlocked, cfgReason];
|
|
334
352
|
}
|
|
353
|
+
// The long `--no-verify` stays unscoped below; only the SHORT forms are
|
|
354
|
+
// read against the subcommand, because only there does `-n` mean
|
|
355
|
+
// something else. An unresolved subcommand (`git -n`) is not in the set,
|
|
356
|
+
// so it stays blocked: unresolved is not safe.
|
|
357
|
+
const rest = git_tokens.slice(1);
|
|
358
|
+
const subIdx = _git_subcommand_index(rest);
|
|
359
|
+
const shortNIsUnrelated = subIdx !== -1 && _SHORT_N_UNRELATED.test(rest[subIdx] as string);
|
|
335
360
|
let i = 1; // skip 'git'
|
|
336
361
|
while (i < git_tokens.length) {
|
|
337
362
|
const tok = git_tokens[i] as string;
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
363
|
+
// git resolves any unambiguous prefix of a long option, so `--no-verif`
|
|
364
|
+
// is `--no-verify`; an ambiguous one git refuses itself.
|
|
365
|
+
if (_NO_VERIFY_FLAGS.has(tok) || (tok.length > 5 && '--no-verify'.startsWith(tok))) {
|
|
366
|
+
return [true, `'${tok}'` + _BYPASSES + _REMEDY];
|
|
341
367
|
}
|
|
342
|
-
if (_NO_VERIFY_SHORT.has(tok)) {
|
|
368
|
+
if (!shortNIsUnrelated && _NO_VERIFY_SHORT.has(tok)) {
|
|
343
369
|
return [
|
|
344
370
|
true,
|
|
345
|
-
`'${tok}' is short for --no-verify and
|
|
346
|
-
+ ' Let the hooks run and fix what they report; that is the only path this guard leaves open.',
|
|
371
|
+
`'${tok}' is short for --no-verify and` + _BYPASSES + _REMEDY,
|
|
347
372
|
];
|
|
348
373
|
}
|
|
349
374
|
// Short flag bundles containing 'n': -nm, -mn, etc.
|
|
350
|
-
if (/^-[a-zA-Z]*n[a-zA-Z]*$/.test(tok) && !tok.startsWith('--')) {
|
|
375
|
+
if (!shortNIsUnrelated && /^-[a-zA-Z]*n[a-zA-Z]*$/.test(tok) && !tok.startsWith('--')) {
|
|
351
376
|
return [
|
|
352
377
|
true,
|
|
353
|
-
`'${tok}' contains -n (--no-verify) and
|
|
354
|
-
+ ' Let the hooks run and fix what they report; that is the only path this guard leaves open.',
|
|
378
|
+
`'${tok}' contains -n (--no-verify) and` + _BYPASSES + _REMEDY,
|
|
355
379
|
];
|
|
356
380
|
}
|
|
357
381
|
if (tok === '-c') {
|
|
@@ -37,8 +37,9 @@
|
|
|
37
37
|
* 2. **A directory that already exists.** Blocking every later write into an
|
|
38
38
|
* already-created speaking directory would wedge a session mid-round without
|
|
39
39
|
* removing the name — the fix there is a rename, which the deny message of
|
|
40
|
-
* the creating call already asked for.
|
|
41
|
-
*
|
|
40
|
+
* the creating call already asked for. A path-keyed tool's relative path
|
|
41
|
+
* is probed against the tool's own `cwd` and nothing else; a shell
|
|
42
|
+
* command's token is probed only when absolute.
|
|
42
43
|
* 3. **An opaque round identifier** — `isOpaqueRoundId` in
|
|
43
44
|
* `_lib/source_shape.ts` is the single authority, shared with the gate, so
|
|
44
45
|
* the guard and the CI check can never disagree about what "opaque" means.
|
|
@@ -363,9 +364,14 @@ export function denyMessage(dir: string): string {
|
|
|
363
364
|
' round-a91f3c content-free hex (also set-, src-set-, source-set-)\n' +
|
|
364
365
|
' S17 a set number\n' +
|
|
365
366
|
'\n' +
|
|
366
|
-
'Record the true source ONCE, encrypted, in the round\'s intake note
|
|
367
|
+
'Record the true source ONCE, encrypted, in the round\'s intake note — the source\n' +
|
|
368
|
+
'itself (its URL or name), never an agents/tmp path, which this guard judges:\n' +
|
|
367
369
|
" printf '%s' '<the real source>' | ./scripts-run src/scripts/_lib/link_crypto encrypt\n" +
|
|
368
370
|
'\n' +
|
|
371
|
+
'Already created? Rename it. Until then, this guard recognizes it in shell commands\n' +
|
|
372
|
+
'only when referenced by absolute path; relative arguments may resolve elsewhere\n' +
|
|
373
|
+
'and are judged as new.\n' +
|
|
374
|
+
'\n' +
|
|
369
375
|
'Naming rule: /analyze:inbox Phase 1. Rule: src/rules/source-confidentiality.md.\n' +
|
|
370
376
|
`Maintainer kill switch: ${KILL_SWITCH}=1.\n`
|
|
371
377
|
);
|
|
@@ -395,7 +401,16 @@ export function main(): number {
|
|
|
395
401
|
if (ti === null) {
|
|
396
402
|
return 0;
|
|
397
403
|
}
|
|
398
|
-
|
|
404
|
+
// The base a relative path resolves against is the tool's own working
|
|
405
|
+
// directory: the native payload's `cwd`, where a path-keyed tool's
|
|
406
|
+
// relative path lands. `project_dir` (no producer sets it)
|
|
407
|
+
// and the dispatcher's `workspace_root` (the hook's cwd, the parent
|
|
408
|
+
// checkout in a worktree session) name other trees, and a field that
|
|
409
|
+
// can outrank the real base lets `mkdir` create in one tree what the
|
|
410
|
+
// probe found in another — so neither is read. No `cwd` → '' → the
|
|
411
|
+
// hook process cwd, the behaviour before this field was read.
|
|
412
|
+
const rawCwd = payload['cwd'];
|
|
413
|
+
const cwd = typeof rawCwd === 'string' && path.isAbsolute(rawCwd) ? rawCwd : '';
|
|
399
414
|
const rawTool = payload['tool_name'] ?? envelope['tool_name'];
|
|
400
415
|
const toolName = typeof rawTool === 'string' ? rawTool.trim().toLowerCase() : '';
|
|
401
416
|
const candidates: string[] = [];
|
|
@@ -417,13 +432,29 @@ export function main(): number {
|
|
|
417
432
|
// decision logic is shared rather than duplicated — see
|
|
418
433
|
// `creatableTokens` for why "every whitespace token" was too many.
|
|
419
434
|
const cmd = ti['command'] ?? (_isObject(envelope['payload']) ? (envelope['payload'] as JsonObject)['command'] : undefined);
|
|
435
|
+
// A shell command's relative token gets no exists-probe: whatever it
|
|
436
|
+
// invokes may change directory first (a script, a function, an alias),
|
|
437
|
+
// so its existence under `cwd` says nothing about where it lands. An
|
|
438
|
+
// absolute token names its own base and is probed.
|
|
439
|
+
const shellTokens: string[] = [];
|
|
420
440
|
if (typeof cmd === 'string' && cmd) {
|
|
421
|
-
|
|
441
|
+
shellTokens.push(...creatableTokens(cmd));
|
|
422
442
|
}
|
|
423
|
-
|
|
424
|
-
const verdict = verdictFor(v,
|
|
443
|
+
const judge = (v: string, exists: (p: string) => boolean): boolean => {
|
|
444
|
+
const verdict = verdictFor(v, exists, cwd);
|
|
425
445
|
if (verdict.block && verdict.dir !== null) {
|
|
426
446
|
process.stderr.write(denyMessage(verdict.dir));
|
|
447
|
+
return true;
|
|
448
|
+
}
|
|
449
|
+
return false;
|
|
450
|
+
};
|
|
451
|
+
for (const v of shellTokens) {
|
|
452
|
+
if (judge(v, (p) => path.isAbsolute(v) && fs.existsSync(p))) {
|
|
453
|
+
return 1;
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
for (const v of candidates) {
|
|
457
|
+
if (judge(v, (p) => fs.existsSync(p))) {
|
|
427
458
|
return 1;
|
|
428
459
|
}
|
|
429
460
|
}
|
|
@@ -23,6 +23,7 @@
|
|
|
23
23
|
* grant — the host's own strings record `permissionDecision=allow ignored: a
|
|
24
24
|
* confined session takes grants only from its command line`.
|
|
25
25
|
*/
|
|
26
|
+
import * as fs from "node:fs";
|
|
26
27
|
import * as path from "node:path";
|
|
27
28
|
|
|
28
29
|
/** A JSON-ish tool input as it arrives in the dispatcher envelope. */
|
|
@@ -145,7 +146,46 @@ export function isInsideWorkingTree(candidate: string, root: string): boolean {
|
|
|
145
146
|
const abs = path.resolve(root, candidate);
|
|
146
147
|
const rel = path.relative(path.resolve(root), abs);
|
|
147
148
|
if (rel === "") return true;
|
|
148
|
-
|
|
149
|
+
// `..` as a whole first segment escapes; `...` or `..cache` is a name.
|
|
150
|
+
const escapes = rel === ".." || rel.startsWith(`..${path.sep}`);
|
|
151
|
+
return !escapes && !path.isAbsolute(rel);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/** `p` with every symlink in its longest existing prefix resolved. */
|
|
155
|
+
function _real(p: string): string {
|
|
156
|
+
try {
|
|
157
|
+
return fs.realpathSync(p);
|
|
158
|
+
} catch (e) {
|
|
159
|
+
const code = (e as NodeJS.ErrnoException).code;
|
|
160
|
+
if (code !== "ENOENT" && code !== "ENOTDIR") return "";
|
|
161
|
+
// A dangling link is not a missing suffix: its target is unknowable.
|
|
162
|
+
try {
|
|
163
|
+
if (code === "ENOENT" && fs.lstatSync(p, { throwIfNoEntry: false })?.isSymbolicLink()) return "";
|
|
164
|
+
} catch {
|
|
165
|
+
return "";
|
|
166
|
+
}
|
|
167
|
+
const parent = path.dirname(p);
|
|
168
|
+
if (parent === p) return p;
|
|
169
|
+
const up = _real(parent);
|
|
170
|
+
return up && path.join(up, path.basename(p));
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* {@link isInsideWorkingTree}, and still inside once symlinks are followed.
|
|
176
|
+
*
|
|
177
|
+
* The one place the classifier reads the filesystem, and it can only withhold:
|
|
178
|
+
* an in-tree symlink to `~/.ssh` is lexically inside and really outside. A
|
|
179
|
+
* missing suffix keeps its lexical answer; a dangling link and any other
|
|
180
|
+
* resolution failure (`EACCES`, `ELOOP`) resolve to `""`, which is never inside. The check runs
|
|
181
|
+
* before the command does, so a link swapped in between is not seen — the
|
|
182
|
+
* OS sandbox is the boundary, this is a guardrail.
|
|
183
|
+
*/
|
|
184
|
+
function _reallyInside(candidate: string, root: string): boolean {
|
|
185
|
+
if (!isInsideWorkingTree(candidate, root)) return false;
|
|
186
|
+
const real = _real(path.resolve(root, candidate));
|
|
187
|
+
const realRoot = _real(path.resolve(root));
|
|
188
|
+
return real !== "" && realRoot !== "" && isInsideWorkingTree(real, realRoot);
|
|
149
189
|
}
|
|
150
190
|
|
|
151
191
|
/** Split a command on whitespace; the caller has already refused metacharacters. */
|
|
@@ -182,7 +222,7 @@ const GIT_VALUE_FLAGS: ReadonlySet<string> = new Set([
|
|
|
182
222
|
]);
|
|
183
223
|
|
|
184
224
|
/**
|
|
185
|
-
* The `git` subcommand, with global options skipped.
|
|
225
|
+
* The `git` subcommand and its argv index, with global options skipped.
|
|
186
226
|
*
|
|
187
227
|
* Returns `""` when a global option's VALUE escapes the working tree — an
|
|
188
228
|
* absolute path or a `..` traversal. The check is textual rather than resolved
|
|
@@ -190,21 +230,127 @@ const GIT_VALUE_FLAGS: ReadonlySet<string> = new Set([
|
|
|
190
230
|
* can decide is exactly the property that matters, and a relative path with no
|
|
191
231
|
* `..` cannot escape.
|
|
192
232
|
*/
|
|
193
|
-
function
|
|
233
|
+
function _gitSubcommandAt(argv: readonly string[]): { sub: string; index: number } {
|
|
194
234
|
for (let i = 1; i < argv.length; i++) {
|
|
195
235
|
const token = argv[i] as string;
|
|
196
|
-
if (!_isFlag(token)) return token;
|
|
236
|
+
if (!_isFlag(token)) return { sub: token, index: i };
|
|
197
237
|
const [flag, inlineValue] = token.includes("=")
|
|
198
238
|
? [token.slice(0, token.indexOf("=")), token.slice(token.indexOf("=") + 1)]
|
|
199
239
|
: [token, null];
|
|
200
240
|
const value = inlineValue ?? (GIT_VALUE_FLAGS.has(flag) ? argv[++i] : undefined);
|
|
201
241
|
if (value !== undefined && (path.isAbsolute(value) || value.split("/").includes(".."))) {
|
|
202
|
-
return "";
|
|
242
|
+
return { sub: "", index: -1 };
|
|
203
243
|
}
|
|
204
244
|
}
|
|
205
|
-
return "";
|
|
245
|
+
return { sub: "", index: -1 };
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
/**
|
|
249
|
+
* `git branch` is category A only in its observational forms — an allowlist,
|
|
250
|
+
* like the rest of this file. Every other form writes a ref: `-d`/`-D` and
|
|
251
|
+
* `-f`/`-m`/`-M`/`-C` can lose one, and a bare `git branch <name>`, `-c`,
|
|
252
|
+
* `-u` or `--edit-description` create or rewrite one. A positional operand is
|
|
253
|
+
* admitted only under `-l`/`--list`, where it is a pattern, or as the value of
|
|
254
|
+
* a filter flag.
|
|
255
|
+
*/
|
|
256
|
+
const GIT_BRANCH_OBSERVES =
|
|
257
|
+
/^(-[arlvi]+|--(all|remotes|list|verbose|show-current|(no-)?color)(=.*)?)$/;
|
|
258
|
+
const GIT_BRANCH_FILTER = /^--((no-)?(contains|merged)|points-at|sort|format|abbrev)(=|$)/;
|
|
259
|
+
|
|
260
|
+
function _gitBranchOnlyObserves(argv: readonly string[], index: number): boolean {
|
|
261
|
+
const rest = argv.slice(index + 1);
|
|
262
|
+
const listing = rest.some((t) => /^(-[arvi]*l[arlvi]*|--list)$/.test(t));
|
|
263
|
+
for (let i = 0; i < rest.length; i++) {
|
|
264
|
+
const token = rest[i] as string;
|
|
265
|
+
if (!_isFlag(token)) {
|
|
266
|
+
if (!listing) return false;
|
|
267
|
+
} else if (GIT_BRANCH_FILTER.test(token)) {
|
|
268
|
+
if (!token.includes("=") && !_isFlag(rest[i + 1] ?? "-")) i++;
|
|
269
|
+
} else if (!GIT_BRANCH_OBSERVES.test(token)) {
|
|
270
|
+
return false;
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
return true;
|
|
206
274
|
}
|
|
207
275
|
|
|
276
|
+
/**
|
|
277
|
+
* Heads that never open their arguments, so a path-shaped argument is a string
|
|
278
|
+
* and confining it would only put a prompt on `echo /tmp`. Not `date`: its
|
|
279
|
+
* `-f`/`--file` and `-r`/`--reference` open a path.
|
|
280
|
+
*/
|
|
281
|
+
const NON_OPENING_HEADS = /^(pwd|echo|basename|dirname|which)$/;
|
|
282
|
+
|
|
283
|
+
/**
|
|
284
|
+
* Output-writing flags (0.3). Their target is a path like any other, and the
|
|
285
|
+
* walk below confines every spelling: a separate value token (`--output x`,
|
|
286
|
+
* `-fprint x`, `--outDir x`) is a positional, `--output=x` is an inline value,
|
|
287
|
+
* a glued short value (`sort -o/path`) is the tail of a single-dash token, and
|
|
288
|
+
* the value-less writers (`--write`/`-w`, `--fix`) write their positionals. So
|
|
289
|
+
* no per-head table is needed; one was measured inert and removed.
|
|
290
|
+
*
|
|
291
|
+
* For `grep`/`rg` the first positional, or an `-e`/`--regexp` value, is a
|
|
292
|
+
* pattern and therefore data; an `-f`/`--file` value is a path.
|
|
293
|
+
*/
|
|
294
|
+
const PATTERN_GIVEN = /^(-e|--regexp|-f|--file)(=|$)/;
|
|
295
|
+
|
|
296
|
+
/**
|
|
297
|
+
* Every argument of a Bash command that may name a filesystem location.
|
|
298
|
+
*
|
|
299
|
+
* Positionals, flag inline values and the tail of a single-dash token
|
|
300
|
+
* (`-o/path`, `-f/path`) are all candidates: one that stays inside is harmless
|
|
301
|
+
* to check, and missing one is not. After `--` every token is a positional.
|
|
302
|
+
* Shell quote removal is applied; every other expansion is refused upstream by
|
|
303
|
+
* the metacharacter rule.
|
|
304
|
+
*/
|
|
305
|
+
function _pathArguments(argv: readonly string[], head: string): string[] {
|
|
306
|
+
const out: string[] = [];
|
|
307
|
+
const grep = head === "grep" || head === "rg";
|
|
308
|
+
let patternPending = grep && !argv.some((t) => PATTERN_GIVEN.test(t));
|
|
309
|
+
let endOfOptions = false;
|
|
310
|
+
for (let i = 1; i < argv.length; i++) {
|
|
311
|
+
const raw = argv[i] as string;
|
|
312
|
+
// An unquoted glob is expanded after this check, so what it selects
|
|
313
|
+
// (`.*` to `..`, `le*` to an outward symlink) is never seen. "*" is a
|
|
314
|
+
// candidate nothing confines.
|
|
315
|
+
if (/[*?[]/.test(raw.replace(/'[^']*'|"[^"]*"/g, ""))) out.push("*");
|
|
316
|
+
const token = raw.replace(/["']/g, "");
|
|
317
|
+
if (!endOfOptions && token === "--") {
|
|
318
|
+
endOfOptions = true;
|
|
319
|
+
} else if (endOfOptions || !_isFlag(token)) {
|
|
320
|
+
if (patternPending) patternPending = false;
|
|
321
|
+
else out.push(token);
|
|
322
|
+
} else if (grep && /^(-e|--regexp)$/.test(token)) {
|
|
323
|
+
i++;
|
|
324
|
+
} else if (grep && /^(-f|--file)$/.test(token)) {
|
|
325
|
+
out.push((argv[++i] ?? "").replace(/["']/g, ""));
|
|
326
|
+
} else {
|
|
327
|
+
// A dash-led token may itself be the value of the option before it
|
|
328
|
+
// (`sort -o --/../x`), so one that contains `/` is a path too.
|
|
329
|
+
if (token.includes("/")) out.push(token);
|
|
330
|
+
const eq = token.indexOf("=");
|
|
331
|
+
if (eq >= 0) out.push(token.slice(eq + 1));
|
|
332
|
+
else if (!token.startsWith("--") && token.length > 2) out.push(token.slice(2));
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
return out;
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
/** Stands in for the tree when the caller has none: absolute and `..` still escape it. */
|
|
339
|
+
const UNROOTED = path.resolve("/agent-config-unrooted");
|
|
340
|
+
|
|
341
|
+
function _confined(candidate: string, workingTree: string): boolean {
|
|
342
|
+
if (candidate.startsWith("~") || candidate === "*") return false;
|
|
343
|
+
return _reallyInside(candidate, workingTree.trim() ? workingTree : UNROOTED);
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
/** What the classifier decided, and whether a path confinement actually ran. */
|
|
347
|
+
export interface CategoryAVerdict {
|
|
348
|
+
categoryA: boolean;
|
|
349
|
+
confined: boolean;
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
const NOT_A: CategoryAVerdict = { categoryA: false, confined: false };
|
|
353
|
+
|
|
208
354
|
/** Non-flag token after the subcommand, or `""`. */
|
|
209
355
|
function _secondSubcommand(argv: readonly string[]): string {
|
|
210
356
|
const nonFlags = argv.slice(1).filter((t) => !_isFlag(t));
|
|
@@ -231,20 +377,14 @@ export function namesConsequenceOperation(command: string): boolean {
|
|
|
231
377
|
return false;
|
|
232
378
|
}
|
|
233
379
|
|
|
234
|
-
/**
|
|
235
|
-
|
|
236
|
-
if (typeof command !== "string" || !command.trim()) return false;
|
|
237
|
-
if (SHELL_METACHARACTERS.test(command)) return false;
|
|
238
|
-
if (namesConsequenceOperation(command)) return false;
|
|
239
|
-
|
|
240
|
-
const argv = _argv(command);
|
|
241
|
-
const head = (argv[0] ?? "").toLowerCase();
|
|
242
|
-
if (!head) return false;
|
|
243
|
-
|
|
380
|
+
/** Does the head and its subcommand name a read, build, test or lint? */
|
|
381
|
+
function _namesASafeOperation(argv: readonly string[], head: string): boolean {
|
|
244
382
|
if (SAFE_HEADS.has(head)) return true;
|
|
245
383
|
|
|
246
384
|
if (head === "git") {
|
|
247
|
-
|
|
385
|
+
const { sub, index } = _gitSubcommandAt(argv);
|
|
386
|
+
if (!GIT_READ_SUBCOMMANDS.has(sub)) return false;
|
|
387
|
+
return sub !== "branch" || _gitBranchOnlyObserves(argv, index);
|
|
248
388
|
}
|
|
249
389
|
|
|
250
390
|
const allowed = RUNNER_SUBCOMMANDS[head];
|
|
@@ -258,6 +398,36 @@ export function isCategoryABashCommand(command: string): boolean {
|
|
|
258
398
|
return true;
|
|
259
399
|
}
|
|
260
400
|
|
|
401
|
+
/**
|
|
402
|
+
* Classify a Bash command string.
|
|
403
|
+
*
|
|
404
|
+
* `workingTree` is the root every path argument must resolve inside. Without
|
|
405
|
+
* one, the command is judged against a stand-in root, so an absolute, `~` or
|
|
406
|
+
* `..`-escaping argument still disqualifies it.
|
|
407
|
+
*/
|
|
408
|
+
export function bashCategoryAVerdict(command: string, workingTree = ""): CategoryAVerdict {
|
|
409
|
+
if (typeof command !== "string" || !command.trim()) return NOT_A;
|
|
410
|
+
if (SHELL_METACHARACTERS.test(command)) return NOT_A;
|
|
411
|
+
if (namesConsequenceOperation(command)) return NOT_A;
|
|
412
|
+
|
|
413
|
+
const argv = _argv(command);
|
|
414
|
+
const head = (argv[0] ?? "").toLowerCase();
|
|
415
|
+
if (!head) return NOT_A;
|
|
416
|
+
if (!_namesASafeOperation(argv, head)) return NOT_A;
|
|
417
|
+
|
|
418
|
+
if (NON_OPENING_HEADS.test(head)) return { categoryA: true, confined: false };
|
|
419
|
+
const candidates = _pathArguments(argv, head);
|
|
420
|
+
for (const candidate of candidates) {
|
|
421
|
+
if (!_confined(candidate, workingTree)) return NOT_A;
|
|
422
|
+
}
|
|
423
|
+
return { categoryA: true, confined: candidates.length > 0 };
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
/** Is this Bash command string category A? */
|
|
427
|
+
export function isCategoryABashCommand(command: string, workingTree = ""): boolean {
|
|
428
|
+
return bashCategoryAVerdict(command, workingTree).categoryA;
|
|
429
|
+
}
|
|
430
|
+
|
|
261
431
|
/**
|
|
262
432
|
* Is this tool call category A?
|
|
263
433
|
*
|
|
@@ -265,27 +435,34 @@ export function isCategoryABashCommand(command: string): boolean {
|
|
|
265
435
|
* root means the dispatcher could not establish one, and an unestablished
|
|
266
436
|
* boundary is not a boundary — the call is not category A.
|
|
267
437
|
*/
|
|
268
|
-
export function
|
|
438
|
+
export function categoryAVerdict(
|
|
269
439
|
toolName: string,
|
|
270
440
|
toolInput: ToolInput,
|
|
271
441
|
workingTree: string,
|
|
272
|
-
):
|
|
273
|
-
if (!workingTree.trim()) return
|
|
274
|
-
if (typeof toolName !== "string" || !toolName) return
|
|
442
|
+
): CategoryAVerdict {
|
|
443
|
+
if (!workingTree.trim()) return NOT_A;
|
|
444
|
+
if (typeof toolName !== "string" || !toolName) return NOT_A;
|
|
275
445
|
|
|
276
446
|
if (READ_ONLY_TOOLS.has(toolName)) {
|
|
447
|
+
let checked = false;
|
|
277
448
|
for (const key of PATH_KEYS) {
|
|
278
449
|
const value = toolInput?.[key];
|
|
279
450
|
if (typeof value !== "string") continue;
|
|
280
|
-
if (!
|
|
451
|
+
if (!_reallyInside(value, workingTree)) return NOT_A;
|
|
452
|
+
checked = true;
|
|
281
453
|
}
|
|
282
|
-
return true;
|
|
454
|
+
return { categoryA: true, confined: checked };
|
|
283
455
|
}
|
|
284
456
|
|
|
285
457
|
if (toolName === "Bash") {
|
|
286
458
|
const command = toolInput?.["command"];
|
|
287
|
-
return typeof command === "string"
|
|
459
|
+
return typeof command === "string" ? bashCategoryAVerdict(command, workingTree) : NOT_A;
|
|
288
460
|
}
|
|
289
461
|
|
|
290
|
-
return
|
|
462
|
+
return NOT_A;
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
/** Is this tool call category A? */
|
|
466
|
+
export function isCategoryA(toolName: string, toolInput: ToolInput, workingTree: string): boolean {
|
|
467
|
+
return categoryAVerdict(toolName, toolInput, workingTree).categoryA;
|
|
291
468
|
}
|