@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,460 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The resident skill set for the second host (codex), and the one file this
|
|
3
|
+
* package writes to keep the rest out of that host's listing budget.
|
|
4
|
+
*
|
|
5
|
+
* WHY THIS EXISTS. `road-to-skills-that-arrive-when-called` 0.3 observed what
|
|
6
|
+
* this host does when the listing does not fit: it prints
|
|
7
|
+
* `warning: Exceeded skills context budget. All skill descriptions were removed
|
|
8
|
+
* and N additional skills were not included in the model-visible skills list.`,
|
|
9
|
+
* drops every description as a block, and then drops whole entries from the
|
|
10
|
+
* ALPHABETICAL TAIL of the user scope. That is the worst possible failure shape
|
|
11
|
+
* for a package with ~300 skills: which skills survive is decided by their
|
|
12
|
+
* name, nothing says so in the session, and the surviving ones arrive bare.
|
|
13
|
+
*
|
|
14
|
+
* THE LEVER, AND IT IS AN OBSERVATION NOT A GUESS. The same probe measured a
|
|
15
|
+
* skill carrying `agents/openai.yaml` with `policy.allow_implicit_invocation:
|
|
16
|
+
* false`: it leaves the model-visible list entirely AND stops occupying the
|
|
17
|
+
* budget (omitted fell 554 → 481 when 60 of 120 were disabled). So a resident
|
|
18
|
+
* set is enforceable from the package side alone, with no host setting and no
|
|
19
|
+
* consumer configuration: keep the resident skills as they are, and write that
|
|
20
|
+
* one file into every other OWNED skill directory.
|
|
21
|
+
*
|
|
22
|
+
* WHAT A NON-RESIDENT SKILL LOSES, MEASURED. Its listing entry; the directory,
|
|
23
|
+
* the body and the name are untouched, so it stays installed. It is NOT still
|
|
24
|
+
* reachable as a skill: probe row `unlisted-skill-not-in-model-list`,
|
|
25
|
+
* two-armed, has the model answering `NONRESIDENT=NO` for a policy-disabled
|
|
26
|
+
* skill against `RESIDENT=YES` for a resident one, and answering `UNAVAILABLE`
|
|
27
|
+
* with no tool call when asked to invoke it. Its body stays readable by a
|
|
28
|
+
* caller that already knows the path, which is a filesystem read.
|
|
29
|
+
*
|
|
30
|
+
* That is a real cost, and the remedy ships with the set: `codex_skill_finder`
|
|
31
|
+
* writes one listed entry that indexes every non-resident name and routes to it
|
|
32
|
+
* by exact name or through the shell ranker (`second-host-unlisted-reachability`,
|
|
33
|
+
* remedy (a), AI council 2026-10-20). Its listing entry is paid for out of the
|
|
34
|
+
* same budget before the split.
|
|
35
|
+
*
|
|
36
|
+
* What the trade is NOT is a reduction in reach. Without this, the host drops
|
|
37
|
+
* 406 entries and strips every description, by alphabet, behind a warning
|
|
38
|
+
* (5.2's control) — so those entries are already unreached and nobody can say
|
|
39
|
+
* which. This replaces an arbitrary cut with a deterministic, recorded one.
|
|
40
|
+
*
|
|
41
|
+
* WHY NOT THE HOST'S DOCUMENTED ROOT. The host's page names
|
|
42
|
+
* `$HOME/.agents/skills`; `GLOBAL_DEPLOY_SOURCES` writes `~/.codex/skills`. The
|
|
43
|
+
* probe found the host reads BOTH, and lists a skill present under both TWICE —
|
|
44
|
+
* so moving the deploy would be a frozen-install-ABI change that also risks
|
|
45
|
+
* doubling the very budget this file is protecting. This writes where the
|
|
46
|
+
* package already deploys.
|
|
47
|
+
*
|
|
48
|
+
* OWNERSHIP AND ROLLBACK. Every path written is recorded in a sidecar beside
|
|
49
|
+
* the deploy inventory, and `removeCodexResidentSet` deletes exactly those
|
|
50
|
+
* paths. A skill directory this package did not deploy is never touched,
|
|
51
|
+
* because the owned set comes from the deploy inventory.
|
|
52
|
+
*/
|
|
53
|
+
|
|
54
|
+
import { createHash } from 'node:crypto';
|
|
55
|
+
import * as fs from 'node:fs';
|
|
56
|
+
import * as path from 'node:path';
|
|
57
|
+
|
|
58
|
+
import { atomicWriteFile } from '../../install/atomic.js';
|
|
59
|
+
import { ensureCodexFinder, FINDER_NAME, finderDescription, removeCodexFinder } from './codex_skill_finder.js';
|
|
60
|
+
import type { FinderOutcome } from './codex_skill_finder.js';
|
|
61
|
+
import * as user_global_paths from './user_global_paths.js';
|
|
62
|
+
|
|
63
|
+
/** Sidecar directory, beside `skill-overrides.json`: one record per host root. */
|
|
64
|
+
export const RECORD_DIRNAME = 'codex-resident-set';
|
|
65
|
+
|
|
66
|
+
/** Relative path, inside a skill directory, of the host's per-skill policy file. */
|
|
67
|
+
export const POLICY_REL = path.join('agents', 'openai.yaml');
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* The skills-context budget assumed for this host, in characters. Not a
|
|
71
|
+
* documented figure: it is the census's fallback for a context window it cannot
|
|
72
|
+
* read, so a host with a larger window fits more and this unlists more than it
|
|
73
|
+
* has to — the safe direction, never the exact one.
|
|
74
|
+
*
|
|
75
|
+
* Mirrors `CODEX_UNKNOWN_WINDOW_BUDGET_CHARS` in `report_skill_host_census.ts`
|
|
76
|
+
* rather than importing it, because that module is a CLI whose main-guard fires
|
|
77
|
+
* inside the install bundle — the same reason `skill_listing_overrides` does not
|
|
78
|
+
* import `compute_skill_tiers`.
|
|
79
|
+
*/
|
|
80
|
+
export const CODEX_BUDGET_CHARS = 8_000;
|
|
81
|
+
|
|
82
|
+
/** The file body. Two keys, because the probe set exactly these two. */
|
|
83
|
+
export const POLICY_BODY = 'policy:\n allow_implicit_invocation: false\n';
|
|
84
|
+
|
|
85
|
+
/** One catalogue entry as this host is offered it. */
|
|
86
|
+
export interface CodexCatalogueEntry {
|
|
87
|
+
name: string;
|
|
88
|
+
descriptionChars: number;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/** A behaviour this model had to pin down that the host states as prose. */
|
|
92
|
+
export interface CodexResidentAssumption {
|
|
93
|
+
id: 'entry-cost-is-name-plus-description' | 'per-entry-overhead' | 'fill-order-alphabetical';
|
|
94
|
+
/** `estimate`: a number this package chose because nothing states one. */
|
|
95
|
+
provenance: 'upstream-prose' | 'first-party-observation' | 'estimate';
|
|
96
|
+
why: string;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
export interface CodexResidentResult {
|
|
100
|
+
budgetChars: number;
|
|
101
|
+
/** Names whose listing entry survives, in fill order. */
|
|
102
|
+
resident: string[];
|
|
103
|
+
/** Names whose implicit invocation is disabled so they leave the listing. */
|
|
104
|
+
nonResident: string[];
|
|
105
|
+
/** Characters the resident listing is modelled to consume. */
|
|
106
|
+
listingChars: number;
|
|
107
|
+
assumptions: readonly CodexResidentAssumption[];
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
const ASSUMPTIONS: readonly CodexResidentAssumption[] = [
|
|
111
|
+
{
|
|
112
|
+
id: 'entry-cost-is-name-plus-description',
|
|
113
|
+
provenance: 'upstream-prose',
|
|
114
|
+
why:
|
|
115
|
+
'The host reports a "skills context budget" in characters and does not publish the ' +
|
|
116
|
+
'serialisation it bills. This model bills a name plus its description, which is what ' +
|
|
117
|
+
'the injected list visibly carries.',
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
id: 'per-entry-overhead',
|
|
121
|
+
provenance: 'estimate',
|
|
122
|
+
why:
|
|
123
|
+
'Each entry also costs separators and a newline. The host quantifies none of it, so ' +
|
|
124
|
+
'the default here is 5 characters per entry and the resulting resident set is therefore ' +
|
|
125
|
+
'an estimate of what fits, never a guarantee — too small, never too large.',
|
|
126
|
+
},
|
|
127
|
+
{
|
|
128
|
+
id: 'fill-order-alphabetical',
|
|
129
|
+
provenance: 'first-party-observation',
|
|
130
|
+
why:
|
|
131
|
+
'The 0.3 probe observed the host itself dropping from the alphabetical tail of the user ' +
|
|
132
|
+
'scope. With no usage ledger to order by, filling alphabetically makes the package pick ' +
|
|
133
|
+
'the SAME set the host would have picked, so the resident set is the host\'s own survivors ' +
|
|
134
|
+
'made explicit rather than a second, conflicting order.',
|
|
135
|
+
},
|
|
136
|
+
];
|
|
137
|
+
|
|
138
|
+
export const DEFAULT_PER_ENTRY_OVERHEAD_CHARS = 5;
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Split an owned catalogue into the entries whose listing fits the budget and
|
|
142
|
+
* the entries whose implicit invocation must be disabled so it does.
|
|
143
|
+
*
|
|
144
|
+
* Pure — no I/O, no clock, no process state.
|
|
145
|
+
*/
|
|
146
|
+
export function computeCodexResidentSet(
|
|
147
|
+
catalogue: readonly CodexCatalogueEntry[],
|
|
148
|
+
opts?: { budgetChars?: number; perEntryOverheadChars?: number },
|
|
149
|
+
): CodexResidentResult {
|
|
150
|
+
const budgetChars = opts?.budgetChars ?? CODEX_BUDGET_CHARS;
|
|
151
|
+
const overhead = opts?.perEntryOverheadChars ?? DEFAULT_PER_ENTRY_OVERHEAD_CHARS;
|
|
152
|
+
|
|
153
|
+
const ordered = catalogue
|
|
154
|
+
.slice()
|
|
155
|
+
.sort((a, b) => (a.name < b.name ? -1 : a.name > b.name ? 1 : 0));
|
|
156
|
+
|
|
157
|
+
const resident: string[] = [];
|
|
158
|
+
const nonResident: string[] = [];
|
|
159
|
+
let listingChars = 0;
|
|
160
|
+
let overflowed = false;
|
|
161
|
+
for (const e of ordered) {
|
|
162
|
+
const cost = e.name.length + e.descriptionChars + overhead;
|
|
163
|
+
// `stop-at-first-overflow`, same shape as `host_listing_model`: the host
|
|
164
|
+
// describes filling a budget, not packing one, so a shorter later entry
|
|
165
|
+
// does not get to slip in behind a longer one that did not fit.
|
|
166
|
+
if (overflowed || listingChars + cost > budgetChars) {
|
|
167
|
+
overflowed = true;
|
|
168
|
+
nonResident.push(e.name);
|
|
169
|
+
continue;
|
|
170
|
+
}
|
|
171
|
+
resident.push(e.name);
|
|
172
|
+
listingChars += cost;
|
|
173
|
+
}
|
|
174
|
+
return { budgetChars, resident, nonResident, listingChars, assumptions: ASSUMPTIONS };
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
export interface CodexResidentRecord {
|
|
178
|
+
schema_version: 1;
|
|
179
|
+
anchor: string;
|
|
180
|
+
/** Skill-directory-relative policy paths this package wrote, anchor-relative. */
|
|
181
|
+
written: string[];
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
export interface EnsureResidentSetResult {
|
|
185
|
+
changed: boolean;
|
|
186
|
+
disabled: string[];
|
|
187
|
+
reenabled: string[];
|
|
188
|
+
/** Skills left alone because a policy file was already there and is not ours. */
|
|
189
|
+
skipped_foreign: string[];
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* The record for ONE host root.
|
|
194
|
+
*
|
|
195
|
+
* One file per root, named by a digest of the resolved root, because the host
|
|
196
|
+
* reads more than one: `~/.codex/skills`, where this package deploys for it,
|
|
197
|
+
* and `$HOME/.agents/skills`, its own documented root, which this package also
|
|
198
|
+
* writes — for a different host. Measured 2026-10-20 on the maintainer machine:
|
|
199
|
+
* 309 entries in the first and 459 in the second, and 0.3 observed the host
|
|
200
|
+
* listing a name present in both TWICE. A resident set that covered one root
|
|
201
|
+
* left the warning firing at 153 omitted where the control read 406, which is
|
|
202
|
+
* the mechanism working on the root it was given and nothing more.
|
|
203
|
+
*/
|
|
204
|
+
export function recordPath(anchor: string, env?: user_global_paths.EnvMap | null): string {
|
|
205
|
+
const key = createHash('sha256').update(path.resolve(anchor)).digest('hex').slice(0, 16);
|
|
206
|
+
return path.join(user_global_paths.write_target(RECORD_DIRNAME, { env: env ?? null }), `${key}.json`);
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/** The finder's ownership record for one host root, beside the policy record. */
|
|
210
|
+
export function finderRecordPath(anchor: string, env?: user_global_paths.EnvMap | null): string {
|
|
211
|
+
return recordPath(anchor, env).replace(/\.json$/, '.finder.json');
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
/**
|
|
215
|
+
* Every user skills root this host reads that this package writes, in listing
|
|
216
|
+
* precedence order — the first that holds a name is where its description is
|
|
217
|
+
* kept, and a copy in any later root is disabled so the budget is not spent
|
|
218
|
+
* twice on the same skill.
|
|
219
|
+
*
|
|
220
|
+
* Both rows come from `GLOBAL_DEPLOY_SOURCES`: `~/.codex/skills` is the codex
|
|
221
|
+
* row, `~/.agents/skills` is the antigravity row. The second is in this list
|
|
222
|
+
* because the HOST reads it, not because it belongs to this host — and the
|
|
223
|
+
* policy file written there is `agents/openai.yaml`, which only this host
|
|
224
|
+
* reads, so another host's deploy is not affected by being listed here.
|
|
225
|
+
*/
|
|
226
|
+
export function codexSkillRoots(home: string): string[] {
|
|
227
|
+
return [path.join(home, '.codex'), path.join(home, '.agents')].filter((a) =>
|
|
228
|
+
fs.existsSync(path.join(a, 'skills')),
|
|
229
|
+
);
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/** The owned catalogue as deployed, read from disk. */
|
|
233
|
+
export function ownedCatalogue(skillsDir: string, owned: readonly string[]): CodexCatalogueEntry[] {
|
|
234
|
+
const out: CodexCatalogueEntry[] = [];
|
|
235
|
+
for (const name of owned) {
|
|
236
|
+
let raw: string;
|
|
237
|
+
try {
|
|
238
|
+
raw = fs.readFileSync(path.join(skillsDir, name, 'SKILL.md'), 'utf8');
|
|
239
|
+
} catch {
|
|
240
|
+
continue;
|
|
241
|
+
}
|
|
242
|
+
const fm = /^---\r?\n([\s\S]*?)\r?\n---/.exec(raw);
|
|
243
|
+
const line = fm ? /^description:[ \t]*(.*)$/m.exec(fm[1]!) : null;
|
|
244
|
+
out.push({ name, descriptionChars: line ? line[1]!.replace(/^["']|["']$/g, '').length : 0 });
|
|
245
|
+
}
|
|
246
|
+
return out;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
function loadRecord(file: string, anchor: string): CodexResidentRecord {
|
|
250
|
+
const empty: CodexResidentRecord = { schema_version: 1, anchor, written: [] };
|
|
251
|
+
let data: unknown;
|
|
252
|
+
try {
|
|
253
|
+
data = JSON.parse(fs.readFileSync(file, 'utf-8'));
|
|
254
|
+
} catch {
|
|
255
|
+
return empty;
|
|
256
|
+
}
|
|
257
|
+
const r = data as Partial<CodexResidentRecord> | null;
|
|
258
|
+
if (!r || typeof r !== 'object' || !Array.isArray(r.written)) return empty;
|
|
259
|
+
if (path.resolve(String(r.anchor)) !== path.resolve(anchor)) return empty;
|
|
260
|
+
return { schema_version: 1, anchor, written: r.written.filter((x): x is string => typeof x === 'string') };
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
function saveRecord(file: string, rec: CodexResidentRecord): void {
|
|
264
|
+
if (rec.written.length === 0) {
|
|
265
|
+
fs.rmSync(file, { force: true });
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
fs.mkdirSync(path.dirname(file), { recursive: true });
|
|
269
|
+
const sorted = { ...rec, written: [...rec.written].sort() };
|
|
270
|
+
atomicWriteFile(file, `${JSON.stringify(sorted, null, 2)}\n`);
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
/** Remove the policy file and any `agents/` directory it alone occupied. */
|
|
274
|
+
function dropPolicy(abs: string): void {
|
|
275
|
+
fs.rmSync(abs, { force: true });
|
|
276
|
+
const dir = path.dirname(abs);
|
|
277
|
+
try {
|
|
278
|
+
if (fs.readdirSync(dir).length === 0) fs.rmdirSync(dir);
|
|
279
|
+
} catch {
|
|
280
|
+
/* a non-empty or vanished directory is not ours to prune */
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
/**
|
|
285
|
+
* Idempotently bring the deployed tree to `nonResident`.
|
|
286
|
+
*
|
|
287
|
+
* Writes the policy file for every non-resident owned skill, removes the ones it
|
|
288
|
+
* wrote for skills that rejoined the resident set or left the deploy, and never
|
|
289
|
+
* touches a policy file it did not write.
|
|
290
|
+
*/
|
|
291
|
+
export function ensureCodexResidentSet(
|
|
292
|
+
anchor: string,
|
|
293
|
+
recordFile: string,
|
|
294
|
+
nonResident: readonly string[],
|
|
295
|
+
): EnsureResidentSetResult {
|
|
296
|
+
const skillsDir = path.join(anchor, 'skills');
|
|
297
|
+
const rec = loadRecord(recordFile, anchor);
|
|
298
|
+
const result: EnsureResidentSetResult = { changed: false, disabled: [], reenabled: [], skipped_foreign: [] };
|
|
299
|
+
|
|
300
|
+
const want = new Set(nonResident);
|
|
301
|
+
const ours = new Set(rec.written);
|
|
302
|
+
const next: string[] = [];
|
|
303
|
+
|
|
304
|
+
for (const rel of rec.written) {
|
|
305
|
+
const abs = path.join(anchor, rel);
|
|
306
|
+
const name = rel.split(path.sep)[1] ?? '';
|
|
307
|
+
if (!fs.existsSync(abs)) continue; // gone with its skill; nothing to keep recorded
|
|
308
|
+
if (fs.readFileSync(abs, 'utf-8') !== POLICY_BODY) continue; // edited: theirs now
|
|
309
|
+
if (want.has(name)) {
|
|
310
|
+
next.push(rel);
|
|
311
|
+
continue;
|
|
312
|
+
}
|
|
313
|
+
dropPolicy(abs);
|
|
314
|
+
result.reenabled.push(name);
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
for (const name of [...want].sort()) {
|
|
318
|
+
const rel = path.join('skills', name, POLICY_REL);
|
|
319
|
+
if (ours.has(rel) && next.includes(rel)) continue;
|
|
320
|
+
const dir = path.join(skillsDir, name);
|
|
321
|
+
if (!fs.existsSync(dir)) continue;
|
|
322
|
+
const abs = path.join(anchor, rel);
|
|
323
|
+
if (fs.existsSync(abs) && fs.readFileSync(abs, 'utf-8') !== POLICY_BODY) {
|
|
324
|
+
result.skipped_foreign.push(name);
|
|
325
|
+
continue;
|
|
326
|
+
}
|
|
327
|
+
fs.mkdirSync(path.dirname(abs), { recursive: true });
|
|
328
|
+
atomicWriteFile(abs, POLICY_BODY);
|
|
329
|
+
next.push(rel);
|
|
330
|
+
result.disabled.push(name);
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
result.changed = result.disabled.length > 0 || result.reenabled.length > 0;
|
|
334
|
+
saveRecord(recordFile, { schema_version: 1, anchor, written: next });
|
|
335
|
+
result.disabled.sort();
|
|
336
|
+
result.reenabled.sort();
|
|
337
|
+
result.skipped_foreign.sort();
|
|
338
|
+
return result;
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
export interface RemoveResidentSetResult {
|
|
342
|
+
changed: boolean;
|
|
343
|
+
removed: string[];
|
|
344
|
+
kept_user: string[];
|
|
345
|
+
/** What happened to the finder entry in this root, when there was one. */
|
|
346
|
+
finder: FinderOutcome;
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
/** Remove exactly the recorded policy files whose body is still ours. */
|
|
350
|
+
export function removeCodexResidentSet(anchor: string, recordFile: string): RemoveResidentSetResult {
|
|
351
|
+
const finder = removeCodexFinder(anchor, recordFile.replace(/\.json$/, '.finder.json'));
|
|
352
|
+
const result: RemoveResidentSetResult = { changed: finder === 'removed', removed: [], kept_user: [], finder };
|
|
353
|
+
if (!fs.existsSync(recordFile)) return result;
|
|
354
|
+
const rec = loadRecord(recordFile, anchor);
|
|
355
|
+
for (const rel of rec.written) {
|
|
356
|
+
const abs = path.join(anchor, rel);
|
|
357
|
+
if (!fs.existsSync(abs)) continue;
|
|
358
|
+
if (fs.readFileSync(abs, 'utf-8') !== POLICY_BODY) {
|
|
359
|
+
result.kept_user.push(rel);
|
|
360
|
+
continue;
|
|
361
|
+
}
|
|
362
|
+
dropPolicy(abs);
|
|
363
|
+
result.removed.push(rel);
|
|
364
|
+
}
|
|
365
|
+
fs.rmSync(recordFile, { force: true });
|
|
366
|
+
result.changed = result.changed || result.removed.length > 0;
|
|
367
|
+
result.removed.sort();
|
|
368
|
+
result.kept_user.sort();
|
|
369
|
+
return result;
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
/**
|
|
373
|
+
* The installer's one call: compute one resident set across every root the host
|
|
374
|
+
* reads, write it, report. Never throws — a failure here must not sink the
|
|
375
|
+
* content deploy, same as the listing override.
|
|
376
|
+
*
|
|
377
|
+
* ONE set across ALL roots, not one per root, because the host sums them: it
|
|
378
|
+
* lists every root and 0.3 observed it listing a name present in two of them
|
|
379
|
+
* twice, without merging. So a resident name keeps its description in the FIRST
|
|
380
|
+
* root that holds it and is disabled in every later one — which removes the
|
|
381
|
+
* double entry as well as the overflow.
|
|
382
|
+
*
|
|
383
|
+
* Ownership is the deploy inventory for the root that has one; a root this
|
|
384
|
+
* package writes under another host's row (`~/.agents/skills`) is owned through
|
|
385
|
+
* that row. Either way this must run AFTER every prune: a skill a prune removed
|
|
386
|
+
* is no longer owned and must not keep a policy file behind.
|
|
387
|
+
*/
|
|
388
|
+
export function applyCodexResidentSet(home: string, report: (msg: string) => void): void {
|
|
389
|
+
try {
|
|
390
|
+
const roots = codexSkillRoots(home);
|
|
391
|
+
if (roots.length === 0) return;
|
|
392
|
+
|
|
393
|
+
// The union, in root precedence order: the first root that carries a
|
|
394
|
+
// name is the one that may describe it.
|
|
395
|
+
const firstRootOf = new Map<string, string>();
|
|
396
|
+
const catalogue: CodexCatalogueEntry[] = [];
|
|
397
|
+
for (const anchor of roots) {
|
|
398
|
+
const skillsDir = path.join(anchor, 'skills');
|
|
399
|
+
const owned = fs
|
|
400
|
+
.readdirSync(skillsDir, { withFileTypes: true })
|
|
401
|
+
.filter((d) => d.isDirectory() && d.name !== FINDER_NAME && fs.existsSync(path.join(skillsDir, d.name, 'SKILL.md')))
|
|
402
|
+
.map((d) => d.name);
|
|
403
|
+
for (const e of ownedCatalogue(skillsDir, owned)) {
|
|
404
|
+
if (firstRootOf.has(e.name)) continue;
|
|
405
|
+
firstRootOf.set(e.name, anchor);
|
|
406
|
+
catalogue.push(e);
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
// The finder is listed too, so its entry is paid for before the split
|
|
410
|
+
// rather than squeezed in after it. Its description is sized for the
|
|
411
|
+
// whole catalogue being unlisted, an upper bound on the real count.
|
|
412
|
+
const finderCost = FINDER_NAME.length + finderDescription(catalogue.length).length + DEFAULT_PER_ENTRY_OVERHEAD_CHARS;
|
|
413
|
+
let split = computeCodexResidentSet(catalogue);
|
|
414
|
+
if (split.nonResident.length > 0) {
|
|
415
|
+
split = computeCodexResidentSet(catalogue, { budgetChars: CODEX_BUDGET_CHARS - finderCost });
|
|
416
|
+
}
|
|
417
|
+
const resident = new Set(split.resident);
|
|
418
|
+
|
|
419
|
+
// 5.2's S3: an unlisted skill is not reached unless something listed
|
|
420
|
+
// routes to it. The finder lives in the first root and indexes every
|
|
421
|
+
// non-resident name at the root whose copy the host would have used.
|
|
422
|
+
// Written FIRST: when it cannot be (a foreign entry holds its path),
|
|
423
|
+
// nothing is unlisted, because an unlisted skill with no finder is
|
|
424
|
+
// unreachable — an over-budget listing is the lesser failure.
|
|
425
|
+
const finder = ensureCodexFinder(
|
|
426
|
+
roots[0]!,
|
|
427
|
+
finderRecordPath(roots[0]!),
|
|
428
|
+
split.nonResident.map((name) => ({ name, skillsDir: path.join(firstRootOf.get(name)!, 'skills') })),
|
|
429
|
+
);
|
|
430
|
+
const unlistAllowed = finder !== 'foreign';
|
|
431
|
+
|
|
432
|
+
let disabled = 0;
|
|
433
|
+
let reenabled = 0;
|
|
434
|
+
let foreign = 0;
|
|
435
|
+
for (const anchor of roots) {
|
|
436
|
+
const skillsDir = path.join(anchor, 'skills');
|
|
437
|
+
const here = fs
|
|
438
|
+
.readdirSync(skillsDir, { withFileTypes: true })
|
|
439
|
+
.filter((d) => d.isDirectory() && d.name !== FINDER_NAME && fs.existsSync(path.join(skillsDir, d.name, 'SKILL.md')))
|
|
440
|
+
.map((d) => d.name);
|
|
441
|
+
// Disabled here when it is not resident at all, OR when it is
|
|
442
|
+
// resident but some earlier root already carries its description.
|
|
443
|
+
const nonResident = unlistAllowed ? here.filter((n) => !resident.has(n) || firstRootOf.get(n) !== anchor) : [];
|
|
444
|
+
const res = ensureCodexResidentSet(anchor, recordPath(anchor), nonResident);
|
|
445
|
+
disabled += res.disabled.length;
|
|
446
|
+
reenabled += res.reenabled.length;
|
|
447
|
+
foreign += res.skipped_foreign.length;
|
|
448
|
+
}
|
|
449
|
+
report(
|
|
450
|
+
`codex: resident set across ${roots.length} root(s) — ${split.resident.length} listed ` +
|
|
451
|
+
`(${split.listingChars} of ${split.budgetChars} chars), ` +
|
|
452
|
+
`${disabled} newly unlisted, ${reenabled} relisted` +
|
|
453
|
+
(foreign > 0 ? `, ${foreign} existing policy file(s) untouched` : '') +
|
|
454
|
+
`, finder ${finder}` +
|
|
455
|
+
(unlistAllowed ? '' : ' — nothing unlisted, because no finder could route to it'),
|
|
456
|
+
);
|
|
457
|
+
} catch (e) {
|
|
458
|
+
report(`codex: resident set skipped — ${String(e)}`);
|
|
459
|
+
}
|
|
460
|
+
}
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The one listed entry that routes the second host (codex) to the skills its
|
|
3
|
+
* resident set keeps out of the listing.
|
|
4
|
+
*
|
|
5
|
+
* WHY IT EXISTS. 4.1 keeps the host's listing inside its budget by writing a
|
|
6
|
+
* policy file into every non-resident skill, and 5.2's arm S3 measured the
|
|
7
|
+
* price: a policy-disabled skill is not in the model-visible list and the model
|
|
8
|
+
* answers `UNAVAILABLE` when asked to invoke it (probe row
|
|
9
|
+
* `unlisted-skill-not-in-model-list`). ADR-289 (b) promises every skill
|
|
10
|
+
* reachable in one deterministic step, so that price is a broken promise, not a
|
|
11
|
+
* trade. The blocker `second-host-unlisted-reachability` was decided by an AI
|
|
12
|
+
* council on 2026-10-20 (both seats, remedy (a)): give the host a retrieval path.
|
|
13
|
+
*
|
|
14
|
+
* WHY AN INSTALLER-WRITTEN ENTRY AND NOT AN AUTHORED SKILL. This host receives
|
|
15
|
+
* the package's skills but no rules, so a rule saying "search the catalogue"
|
|
16
|
+
* never reaches it; and an authored skill would bill the per-spawn catalogue on
|
|
17
|
+
* every host for a problem one host has. The entry is generated at install,
|
|
18
|
+
* lives only in this host's root, and is recorded like the policy files: written
|
|
19
|
+
* only where nothing else stands, removed on uninstall only while its bytes are
|
|
20
|
+
* still the ones this package wrote.
|
|
21
|
+
*
|
|
22
|
+
* TWO DETERMINISTIC MODES, because the council asked for both and they are
|
|
23
|
+
* different triggers: an exact name is checked against the index the entry
|
|
24
|
+
* carries and read from a path the entry prints; a task goes through the shell
|
|
25
|
+
* ranker `route:explain --skills`, with the index as the fallback when the CLI
|
|
26
|
+
* is not on the path. One model-visible invocation of the entry, then a read —
|
|
27
|
+
* the reading of "one deterministic step" the council recorded.
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
import { createHash } from 'node:crypto';
|
|
31
|
+
import * as fs from 'node:fs';
|
|
32
|
+
import * as path from 'node:path';
|
|
33
|
+
|
|
34
|
+
import { atomicWriteFile } from '../../install/atomic.js';
|
|
35
|
+
|
|
36
|
+
/** The entry's directory and `name:`. Prefixed so it cannot meet an authored skill. */
|
|
37
|
+
export const FINDER_NAME = 'agent-config-skill-finder';
|
|
38
|
+
|
|
39
|
+
/** The description the host lists. `count` is the number of unlisted skills. */
|
|
40
|
+
export function finderDescription(count: number): string {
|
|
41
|
+
return (
|
|
42
|
+
`Use when no listed skill fits the task, or the user names a skill not in this list — ` +
|
|
43
|
+
`${count} more agent-config skills are installed here but unlisted; this finds and loads one.`
|
|
44
|
+
);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/** The one name shape the index carries, on both the writing and the reading side. */
|
|
48
|
+
const SKILL_NAME_RE = /^[a-z0-9][a-z0-9-]*$/;
|
|
49
|
+
|
|
50
|
+
/** One unlisted skill and the root whose copy the entry points at. */
|
|
51
|
+
export interface FinderTarget {
|
|
52
|
+
name: string;
|
|
53
|
+
/** The skills directory holding `<name>/SKILL.md`. */
|
|
54
|
+
skillsDir: string;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/** The SKILL.md the host lists. Pure; sorted, so two installs write identical bytes. */
|
|
58
|
+
export function renderFinder(targets: readonly FinderTarget[]): string {
|
|
59
|
+
// Names and headings come from readdir and become text the model follows:
|
|
60
|
+
// only the shape `readFinderIndex` accepts is written, never a newline.
|
|
61
|
+
const safe = targets.filter((t) => SKILL_NAME_RE.test(t.name) && !/[\r\n]/.test(t.skillsDir));
|
|
62
|
+
const sorted = [...safe].sort((a, b) => (a.name < b.name ? -1 : a.name > b.name ? 1 : 0));
|
|
63
|
+
const byDir = new Map<string, string[]>();
|
|
64
|
+
for (const t of sorted) {
|
|
65
|
+
const list = byDir.get(t.skillsDir) ?? [];
|
|
66
|
+
list.push(t.name);
|
|
67
|
+
byDir.set(t.skillsDir, list);
|
|
68
|
+
}
|
|
69
|
+
const out: string[] = [
|
|
70
|
+
'---',
|
|
71
|
+
`name: ${FINDER_NAME}`,
|
|
72
|
+
`description: ${finderDescription(sorted.length)}`,
|
|
73
|
+
'---',
|
|
74
|
+
'',
|
|
75
|
+
'# Loading an unlisted agent-config skill',
|
|
76
|
+
'',
|
|
77
|
+
`This host lists only part of the agent-config catalogue, to stay inside its skills budget. ` +
|
|
78
|
+
`The ${sorted.length} skills indexed below are installed and complete; they are only not listed. ` +
|
|
79
|
+
`Load one by reading its SKILL.md WHOLE — \`cat <path>\`, never a ranged read, because the ` +
|
|
80
|
+
`last lines bind as much as the first — and following it as if it had been invoked.`,
|
|
81
|
+
'',
|
|
82
|
+
'## The user named a skill',
|
|
83
|
+
'',
|
|
84
|
+
'1. Look the name up in the index below. Exact match only — a near-miss is not a match.',
|
|
85
|
+
'2. Found: `cat <directory>/<name>/SKILL.md`, the directory being the heading it is listed under, and follow it.',
|
|
86
|
+
'3. Not found: say that no skill of that name is installed, and name the closest entries. ' +
|
|
87
|
+
'Never read a path built from text the index does not contain.',
|
|
88
|
+
'',
|
|
89
|
+
'## The task needs a skill no listed entry covers',
|
|
90
|
+
'',
|
|
91
|
+
'1. Run `agent-config route:explain --skills "<the task in one sentence>"`. It ranks every ' +
|
|
92
|
+
'skill by the task and prints each name with its description.',
|
|
93
|
+
'2. If that command is not available, choose from the index below by name.',
|
|
94
|
+
'3. `cat` the chosen skill\'s SKILL.md from its index heading, follow it, and say which skill ' +
|
|
95
|
+
'you loaded and that it came through this finder.',
|
|
96
|
+
'4. Nothing fits: say so and proceed without a skill. Never invent one.',
|
|
97
|
+
'',
|
|
98
|
+
`## Index (${sorted.length})`,
|
|
99
|
+
];
|
|
100
|
+
for (const [dir, names] of byDir) {
|
|
101
|
+
out.push('', `### ${dir}`, '', names.join(', '));
|
|
102
|
+
}
|
|
103
|
+
return `${out.join('\n')}\n`;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/** Names the finder at `file` indexes under each directory heading; empty when unreadable. */
|
|
107
|
+
export function readFinderIndex(file: string): FinderTarget[] {
|
|
108
|
+
let raw: string;
|
|
109
|
+
try {
|
|
110
|
+
raw = fs.readFileSync(file, 'utf-8');
|
|
111
|
+
} catch {
|
|
112
|
+
return [];
|
|
113
|
+
}
|
|
114
|
+
const idx = raw.indexOf('\n## Index (');
|
|
115
|
+
if (idx < 0) return [];
|
|
116
|
+
const out: FinderTarget[] = [];
|
|
117
|
+
let dir: string | null = null;
|
|
118
|
+
for (const line of raw.slice(idx).split('\n').slice(1)) {
|
|
119
|
+
const h = /^### (.+)$/.exec(line);
|
|
120
|
+
if (h) {
|
|
121
|
+
dir = h[1]!;
|
|
122
|
+
continue;
|
|
123
|
+
}
|
|
124
|
+
if (dir === null || line.trim() === '') continue;
|
|
125
|
+
for (const n of line.split(',')) {
|
|
126
|
+
const name = n.trim();
|
|
127
|
+
if (SKILL_NAME_RE.test(name)) out.push({ name, skillsDir: dir });
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
return out;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Whether the finder at `file` routes `name`: indexed exactly once, under a
|
|
135
|
+
* directory that is one of `skillsDirs`, and the SKILL.md it points at exists.
|
|
136
|
+
*
|
|
137
|
+
* The exhaustive static check the council asked for, per skill: a unique name,
|
|
138
|
+
* an exact lookup resolving to exactly one path, that path confined to a root
|
|
139
|
+
* this package writes, and the file readable.
|
|
140
|
+
*/
|
|
141
|
+
export function finderRoutes(index: readonly FinderTarget[], name: string, skillsDirs: readonly string[]): boolean {
|
|
142
|
+
const hits = index.filter((t) => t.name === name);
|
|
143
|
+
if (hits.length !== 1) return false;
|
|
144
|
+
const dir = path.resolve(hits[0]!.skillsDir);
|
|
145
|
+
if (!skillsDirs.some((d) => path.resolve(d) === dir)) return false;
|
|
146
|
+
return fs.existsSync(path.join(dir, name, 'SKILL.md'));
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
interface FinderRecord {
|
|
150
|
+
schema_version: 1;
|
|
151
|
+
anchor: string;
|
|
152
|
+
sha256: string;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
function sha256(text: string): string {
|
|
156
|
+
return createHash('sha256').update(text).digest('hex');
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
function readRecord(file: string, anchor: string): FinderRecord | null {
|
|
160
|
+
try {
|
|
161
|
+
const r = JSON.parse(fs.readFileSync(file, 'utf-8')) as Partial<FinderRecord>;
|
|
162
|
+
if (typeof r.sha256 !== 'string' || path.resolve(String(r.anchor)) !== path.resolve(anchor)) return null;
|
|
163
|
+
return { schema_version: 1, anchor, sha256: r.sha256 };
|
|
164
|
+
} catch {
|
|
165
|
+
return null;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
export type FinderOutcome = 'written' | 'unchanged' | 'removed' | 'absent' | 'foreign';
|
|
170
|
+
|
|
171
|
+
function finderFile(anchor: string): string {
|
|
172
|
+
return path.join(anchor, 'skills', FINDER_NAME, 'SKILL.md');
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/** Is whatever stands at the finder path ours — absent, or still the bytes we recorded? */
|
|
176
|
+
function ours(anchor: string, recordFile: string): boolean {
|
|
177
|
+
const file = finderFile(anchor);
|
|
178
|
+
if (!fs.existsSync(path.dirname(file))) return true;
|
|
179
|
+
const rec = readRecord(recordFile, anchor);
|
|
180
|
+
if (rec === null) return false;
|
|
181
|
+
// Our record and no file: ours was deleted, and writing it again is the repair.
|
|
182
|
+
if (!fs.existsSync(file)) return true;
|
|
183
|
+
return sha256(fs.readFileSync(file, 'utf-8')) === rec.sha256;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* Write the finder for `targets` into `anchor`, or remove it when there is
|
|
188
|
+
* nothing unlisted. Never overwrites an entry this package did not write.
|
|
189
|
+
*/
|
|
190
|
+
export function ensureCodexFinder(
|
|
191
|
+
anchor: string,
|
|
192
|
+
recordFile: string,
|
|
193
|
+
targets: readonly FinderTarget[],
|
|
194
|
+
): FinderOutcome {
|
|
195
|
+
if (targets.length === 0) return removeCodexFinder(anchor, recordFile);
|
|
196
|
+
if (!ours(anchor, recordFile)) return 'foreign';
|
|
197
|
+
const body = renderFinder(targets);
|
|
198
|
+
const file = finderFile(anchor);
|
|
199
|
+
if (fs.existsSync(file) && fs.readFileSync(file, 'utf-8') === body) return 'unchanged';
|
|
200
|
+
atomicWriteFile(file, body);
|
|
201
|
+
fs.mkdirSync(path.dirname(recordFile), { recursive: true });
|
|
202
|
+
atomicWriteFile(
|
|
203
|
+
recordFile,
|
|
204
|
+
`${JSON.stringify({ schema_version: 1, anchor, sha256: sha256(body) }, null, 2)}\n`,
|
|
205
|
+
);
|
|
206
|
+
return 'written';
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/** Remove the finder only while it is still the bytes this package recorded. */
|
|
210
|
+
export function removeCodexFinder(anchor: string, recordFile: string): FinderOutcome {
|
|
211
|
+
const file = finderFile(anchor);
|
|
212
|
+
if (!fs.existsSync(path.dirname(file))) {
|
|
213
|
+
fs.rmSync(recordFile, { force: true });
|
|
214
|
+
return 'absent';
|
|
215
|
+
}
|
|
216
|
+
if (!ours(anchor, recordFile)) return 'foreign';
|
|
217
|
+
fs.rmSync(file, { force: true });
|
|
218
|
+
try {
|
|
219
|
+
if (fs.readdirSync(path.dirname(file)).length === 0) fs.rmdirSync(path.dirname(file));
|
|
220
|
+
} catch {
|
|
221
|
+
/* a non-empty directory is not ours to prune */
|
|
222
|
+
}
|
|
223
|
+
fs.rmSync(recordFile, { force: true });
|
|
224
|
+
return 'removed';
|
|
225
|
+
}
|