@event4u/agent-config 9.9.0 → 9.11.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/.claude-plugin/marketplace.json +1 -1
- package/CHANGELOG.md +212 -194
- package/README.md +13 -16
- package/agents/templates/.ai-council.yml.example +481 -0
- package/agents/templates/.ai-video.xml.example +247 -0
- package/dist/agent-src/commands/agent-status.md +12 -11
- package/dist/agent-src/commands/agents/user/accept.md +115 -30
- package/dist/agent-src/commands/agents/user/delete.md +147 -0
- package/dist/agent-src/commands/agents/user/review.md +65 -28
- package/dist/agent-src/commands/agents/user/show.md +82 -29
- package/dist/agent-src/commands/agents/user/update.md +2 -2
- package/dist/agent-src/commands/agents/user.md +16 -3
- package/dist/agent-src/commands/check-current-md.md +0 -10
- package/dist/agent-src/commands/condense.md +28 -97
- package/dist/agent-src/commands/cost/report.md +7 -0
- package/dist/agent-src/commands/fix/portability.md +0 -8
- package/dist/agent-src/commands/fix/refs.md +0 -8
- package/dist/agent-src/commands/humanize.md +2 -2
- package/dist/agent-src/commands/jira-ticket.md +1 -1
- package/dist/agent-src/commands/memory/load.md +11 -0
- package/dist/agent-src/commands/optimize/skills.md +1 -1
- package/dist/agent-src/commands/pr/create.md +4 -4
- package/dist/agent-src/commands/profile/show.md +3 -3
- package/dist/agent-src/commands/rule-compliance-audit.md +5 -4
- package/dist/agent-src/commands/security-audit-config.md +1 -1
- package/dist/agent-src/commands/sync/gitignore/fix.md +1 -1
- package/dist/agent-src/commands/tdd.md +21 -0
- package/dist/agent-src/commands/team/delegate.md +2 -2
- package/dist/agent-src/commands/team-knowledge/bootstrap.md +9 -8
- package/dist/agent-src/commands/team-knowledge/consolidate.md +8 -7
- package/dist/agent-src/commands/team.md +4 -1
- package/dist/agent-src/commands/upstream-contribute.md +0 -1
- package/dist/agent-src/contexts/authority/commit-mechanics.md +7 -0
- package/dist/agent-src/contexts/authority/destructive-mechanics.md +16 -0
- package/dist/agent-src/contexts/authority/scope-mechanics.md +61 -0
- package/dist/agent-src/contexts/communication/rules-auto/reply-close-mechanics.md +20 -18
- package/dist/agent-src/contexts/communication/rules-auto/skill-quality-mechanics.md +1 -1
- package/dist/agent-src/contexts/communication/rules-auto/slash-command-routing-policy-mechanics.md +1 -1
- package/dist/agent-src/contexts/communication/rules-auto/source-of-truth-mechanics.md +9 -10
- package/dist/agent-src/contexts/communication/rules-auto/think-before-action-mechanics.md +1 -1
- package/dist/agent-src/contexts/communication/rules-auto/user-interaction-mechanics.md +11 -0
- package/dist/agent-src/contexts/contracts/artifact-engagement-flow.md +26 -15
- package/dist/agent-src/contexts/contracts/command-suggestion-flow.md +3 -0
- package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +67 -37
- package/dist/agent-src/contexts/execution/auto-orchestration-activation.md +1 -1
- package/dist/agent-src/contexts/execution/autonomy-examples.md +1 -1
- package/dist/agent-src/contexts/execution/autonomy-mechanics.md +7 -6
- package/dist/agent-src/contexts/execution/evidence-discipline.md +92 -77
- package/dist/agent-src/contexts/execution/orchestration-benchmark-gate.md +22 -21
- package/dist/agent-src/contexts/execution/orchestration-telemetry.md +24 -0
- package/dist/agent-src/contexts/execution/project-intelligence.md +122 -103
- package/dist/agent-src/contexts/execution/roadmap-execution-contract.md +23 -21
- package/dist/agent-src/contexts/execution/subagent-response-contract.md +5 -5
- package/dist/agent-src/contexts/execution/subagent-routing.md +11 -0
- package/dist/agent-src/contexts/execution/subagent-spawn-contract.md +13 -13
- package/dist/agent-src/contexts/execution/subagent-steering.md +36 -34
- package/dist/agent-src/contexts/execution/toolchain-resolver.md +1 -1
- package/dist/agent-src/contexts/execution/user-memory-channels.md +189 -0
- package/dist/agent-src/contexts/execution/verification-mechanics.md +9 -0
- package/dist/agent-src/contexts/model-recommendations.md +3 -2
- package/dist/agent-src/contexts/subagent-configuration.md +3 -3
- package/dist/agent-src/ghostwriter/README.md +2 -2
- package/dist/agent-src/packs/README.md +1 -1
- package/dist/agent-src/personas/README.md +5 -5
- package/dist/agent-src/personas/_template-specialist/persona.md +3 -3
- package/dist/agent-src/personas/backend-architect.md +24 -23
- package/dist/agent-src/personas/eloquent-tamer.md +30 -30
- package/dist/agent-src/personas/frontend-engineer.md +30 -30
- package/dist/agent-src/personas/product-owner.md +41 -38
- package/dist/agent-src/personas/qa.md +13 -13
- package/dist/agent-src/personas/security-engineer.md +22 -22
- package/dist/agent-src/presets/README.md +3 -3
- package/dist/agent-src/profiles/README.md +3 -3
- package/dist/agent-src/rules/active-remediation.md +2 -2
- package/dist/agent-src/rules/artifact-engagement-recording.md +4 -4
- package/dist/agent-src/rules/ask-when-uncertain.md +0 -4
- package/dist/agent-src/rules/augment-edit-discipline.md +1 -1
- package/dist/agent-src/rules/broken-access-control.md +4 -4
- package/dist/agent-src/rules/code-comment-discipline.md +1 -1
- package/dist/agent-src/rules/code-provenance.md +2 -2
- package/dist/agent-src/rules/commit-policy.md +4 -9
- package/dist/agent-src/rules/communication-through-line.md +5 -5
- package/dist/agent-src/rules/decision-revisit-gate.md +1 -1
- package/dist/agent-src/rules/design-fidelity.md +1 -1
- package/dist/agent-src/rules/doc-screenshot-hygiene.md +1 -1
- package/dist/agent-src/rules/domain-adoption-policy.md +1 -1
- package/dist/agent-src/rules/domain-safety-pii.md +1 -1
- package/dist/agent-src/rules/external-code-graph-interop.md +1 -1
- package/dist/agent-src/rules/fast-path-marker-visibility.md +43 -7
- package/dist/agent-src/rules/finance-safety-floor.md +1 -1
- package/dist/agent-src/rules/framework-neutrality-in-generic-skills.md +3 -3
- package/dist/agent-src/rules/history-discipline.md +1 -1
- package/dist/agent-src/rules/legal-safety-floor.md +1 -1
- package/dist/agent-src/rules/lethal-trifecta-guard.md +5 -5
- package/dist/agent-src/rules/low-impact-corpus-privacy-floor.md +10 -8
- package/dist/agent-src/rules/media-governance-routing.md +13 -13
- package/dist/agent-src/rules/media-sync-ground-truth.md +29 -11
- package/dist/agent-src/rules/no-cheap-questions.md +7 -7
- package/dist/agent-src/rules/no-decorative-emojis-in-git-surfaces.md +29 -18
- package/dist/agent-src/rules/non-destructive-by-default.md +5 -23
- package/dist/agent-src/rules/onboarding-gate.md +14 -4
- package/dist/agent-src/rules/persona-governance.md +2 -2
- package/dist/agent-src/rules/prefer-enums-over-literals.md +9 -9
- package/dist/agent-src/rules/preservation-guard.md +10 -2
- package/dist/agent-src/rules/question-not-instruction.md +1 -1
- package/dist/agent-src/rules/roadmap-progress-sync.md +6 -6
- package/dist/agent-src/rules/rule-type-governance.md +1 -1
- package/dist/agent-src/rules/scale-discipline.md +1 -1
- package/dist/agent-src/rules/scope-control.md +1 -1
- package/dist/agent-src/rules/secret-vcs-guard.md +1 -1
- package/dist/agent-src/rules/security-sensitive-stop.md +17 -11
- package/dist/agent-src/rules/senior-engineering-discipline.md +17 -17
- package/dist/agent-src/rules/session-canary.md +1 -1
- package/dist/agent-src/rules/skill-quality.md +1 -1
- package/dist/agent-src/rules/source-confidentiality.md +21 -19
- package/dist/agent-src/rules/source-of-truth.md +6 -5
- package/dist/agent-src/rules/spreadsheet-source-quality.md +2 -2
- package/dist/agent-src/rules/strategy-safety-floor.md +1 -1
- package/dist/agent-src/rules/think-before-action.md +5 -5
- package/dist/agent-src/rules/token-budget-discipline.md +5 -3
- package/dist/agent-src/rules/token-efficiency.md +2 -2
- package/dist/agent-src/rules/untrusted-input-defense.md +4 -4
- package/dist/agent-src/rules/user-interaction.md +12 -0
- package/dist/agent-src/rules/verify-before-complete.md +4 -24
- package/dist/agent-src/skills/adversarial-review/SKILL.md +2 -2
- package/dist/agent-src/skills/agent-security-review/SKILL.md +52 -45
- package/dist/agent-src/skills/agents-md-thin-root/SKILL.md +2 -2
- package/dist/agent-src/skills/ai-code-blindspots/SKILL.md +20 -20
- package/dist/agent-src/skills/ai-council/SKILL.md +185 -128
- package/dist/agent-src/skills/analysis-skill-router/SKILL.md +3 -3
- package/dist/agent-src/skills/api-endpoint/SKILL.md +2 -2
- package/dist/agent-src/skills/artisan-commands/SKILL.md +2 -2
- package/dist/agent-src/skills/async-python-patterns/SKILL.md +8 -7
- package/dist/agent-src/skills/authz-review/SKILL.md +16 -15
- package/dist/agent-src/skills/aws-infrastructure/SKILL.md +5 -5
- package/dist/agent-src/skills/blade-ui/SKILL.md +1 -1
- package/dist/agent-src/skills/bug-analyzer/SKILL.md +30 -12
- package/dist/agent-src/skills/code-intelligence/SKILL.md +0 -1
- package/dist/agent-src/skills/code-intelligence/evals/triggers.json +52 -0
- package/dist/agent-src/skills/code-review/SKILL.md +6 -6
- package/dist/agent-src/skills/command-routing/SKILL.md +5 -4
- package/dist/agent-src/skills/composer-packages/SKILL.md +2 -2
- package/dist/agent-src/skills/condense-memory/SKILL.md +43 -41
- package/dist/agent-src/skills/context-document/SKILL.md +23 -21
- package/dist/agent-src/skills/copilot-config/SKILL.md +6 -1
- package/dist/agent-src/skills/decision-record/SKILL.md +20 -18
- package/dist/agent-src/skills/design-intelligence/SKILL.md +4 -4
- package/dist/agent-src/skills/design-review/SKILL.md +15 -14
- package/dist/agent-src/skills/design-system-capture/reference/design-system-json.md +28 -25
- package/dist/agent-src/skills/devcontainer/SKILL.md +2 -2
- package/dist/agent-src/skills/docker/SKILL.md +1 -1
- package/dist/agent-src/skills/docx-authoring/evals/triggers.json +52 -0
- package/dist/agent-src/skills/emit-tickets/SKILL.md +2 -2
- package/dist/agent-src/skills/error-handling-patterns/SKILL.md +1 -1
- package/dist/agent-src/skills/estimate-ticket/SKILL.md +2 -2
- package/dist/agent-src/skills/evaluate-llm-feature/SKILL.md +0 -1
- package/dist/agent-src/skills/evaluate-llm-feature/evals/triggers.json +52 -0
- package/dist/agent-src/skills/existing-ui-audit/SKILL.md +21 -7
- package/dist/agent-src/skills/fe-design/SKILL.md +10 -0
- package/dist/agent-src/skills/feature-planning/SKILL.md +2 -2
- package/dist/agent-src/skills/finishing-a-development-branch/SKILL.md +3 -3
- package/dist/agent-src/skills/flux/SKILL.md +1 -1
- package/dist/agent-src/skills/frontend-render-security/SKILL.md +13 -13
- package/dist/agent-src/skills/git-workflow/SKILL.md +33 -33
- package/dist/agent-src/skills/grafana/SKILL.md +5 -0
- package/dist/agent-src/skills/humanizer/SKILL.md +83 -66
- package/dist/agent-src/skills/humanizer/data/patterns.md +14 -14
- package/dist/agent-src/skills/humanizer/references/anti-aiisms.md +4 -4
- package/dist/agent-src/skills/judge-artifact-completeness/SKILL.md +82 -37
- package/dist/agent-src/skills/judge-bug-hunter/SKILL.md +17 -5
- package/dist/agent-src/skills/judge-injection-defense/SKILL.md +63 -25
- package/dist/agent-src/skills/judge-security-auditor/SKILL.md +2 -0
- package/dist/agent-src/skills/judge-synthesis/SKILL.md +72 -28
- package/dist/agent-src/skills/laravel-horizon/SKILL.md +5 -0
- package/dist/agent-src/skills/laravel-mail/SKILL.md +5 -4
- package/dist/agent-src/skills/laravel-middleware/SKILL.md +5 -4
- package/dist/agent-src/skills/laravel-notifications/SKILL.md +10 -9
- package/dist/agent-src/skills/laravel-pennant/SKILL.md +1 -1
- package/dist/agent-src/skills/laravel-pulse/SKILL.md +9 -8
- package/dist/agent-src/skills/laravel-reverb/SKILL.md +6 -5
- package/dist/agent-src/skills/laravel-scheduling/SKILL.md +6 -1
- package/dist/agent-src/skills/laravel-validation/SKILL.md +12 -0
- package/dist/agent-src/skills/launch-readiness/SKILL.md +1 -1
- package/dist/agent-src/skills/learning-to-rule-or-skill/SKILL.md +7 -7
- package/dist/agent-src/skills/learning-tutor/SKILL.md +44 -43
- package/dist/agent-src/skills/learning-tutor/evals/triggers.json +52 -0
- package/dist/agent-src/skills/license-compliance-audit/SKILL.md +7 -7
- package/dist/agent-src/skills/license-compliance-borrow-check/SKILL.md +3 -3
- package/dist/agent-src/skills/license-compliance-credits/SKILL.md +4 -4
- package/dist/agent-src/skills/llm-provider-knowledge/SKILL.md +0 -1
- package/dist/agent-src/skills/memory-consolidation/SKILL.md +69 -64
- package/dist/agent-src/skills/motion-choreographer/SKILL.md +6 -6
- package/dist/agent-src/skills/pdf-tools/evals/triggers.json +52 -0
- package/dist/agent-src/skills/performance-analysis/SKILL.md +7 -3
- package/dist/agent-src/skills/persona-improvement/SKILL.md +0 -2
- package/dist/agent-src/skills/persona-improvement/evals/triggers.json +52 -0
- package/dist/agent-src/skills/php-coder/SKILL.md +10 -0
- package/dist/agent-src/skills/prediction-pool-optimizer/SKILL.md +129 -120
- package/dist/agent-src/skills/prediction-pool-optimizer/reference/ev-fixtures.md +36 -35
- package/dist/agent-src/skills/prediction-pool-optimizer/reference/odds-and-bonus.md +45 -41
- package/dist/agent-src/skills/project-analysis-core/SKILL.md +4 -4
- package/dist/agent-src/skills/project-analysis-hypothesis-driven/SKILL.md +3 -3
- package/dist/agent-src/skills/project-analysis-react/SKILL.md +1 -1
- package/dist/agent-src/skills/project-analysis-symfony/SKILL.md +1 -1
- package/dist/agent-src/skills/project-analysis-zend-laminas/SKILL.md +2 -2
- package/dist/agent-src/skills/prompt-engineering-patterns/SKILL.md +1 -1
- package/dist/agent-src/skills/prompt-validator/SKILL.md +39 -39
- package/dist/agent-src/skills/quality-tools/SKILL.md +15 -15
- package/dist/agent-src/skills/react-shadcn-ui/SKILL.md +55 -19
- package/dist/agent-src/skills/react-shadcn-ui/reference/registry.md +29 -27
- package/dist/agent-src/skills/readme-writing-package/SKILL.md +2 -2
- package/dist/agent-src/skills/reasoning-orchestrator/SKILL.md +25 -25
- package/dist/agent-src/skills/recursive-verification/SKILL.md +6 -5
- package/dist/agent-src/skills/refine-prompt/SKILL.md +1 -1
- package/dist/agent-src/skills/refine-ticket/SKILL.md +20 -2
- package/dist/agent-src/skills/repomix-packer/SKILL.md +1 -1
- package/dist/agent-src/skills/requesting-code-review/SKILL.md +2 -2
- package/dist/agent-src/skills/roadmap-management/SKILL.md +80 -66
- package/dist/agent-src/skills/roadmap-writing/SKILL.md +84 -77
- package/dist/agent-src/skills/rule-refactor/SKILL.md +1 -1
- package/dist/agent-src/skills/screenshot-hygiene/evals/triggers.json +52 -0
- package/dist/agent-src/skills/security-audit/SKILL.md +26 -9
- package/dist/agent-src/skills/security-maturity-assessment/SKILL.md +38 -16
- package/dist/agent-src/skills/skill-improvement-pipeline/SKILL.md +14 -11
- package/dist/agent-src/skills/skill-writing/SKILL.md +9 -8
- package/dist/agent-src/skills/song-to-script/SKILL.md +93 -85
- package/dist/agent-src/skills/sql-writing/SKILL.md +2 -2
- package/dist/agent-src/skills/stakeholder-tradeoff/SKILL.md +4 -3
- package/dist/agent-src/skills/standards-from-config/SKILL.md +61 -43
- package/dist/agent-src/skills/subagent-orchestration/SKILL.md +22 -8
- package/dist/agent-src/skills/subagent-orchestration/prompts/README.md +28 -2
- package/dist/agent-src/skills/supply-chain-intake/SKILL.md +13 -13
- package/dist/agent-src/skills/systematic-debugging/SKILL.md +22 -21
- package/dist/agent-src/skills/tailwind-engineer/SKILL.md +1 -1
- package/dist/agent-src/skills/technical-specification/SKILL.md +5 -0
- package/dist/agent-src/skills/terraform/SKILL.md +2 -2
- package/dist/agent-src/skills/terragrunt/SKILL.md +8 -8
- package/dist/agent-src/skills/testing-anti-patterns/process-anti-patterns.md +1 -1
- package/dist/agent-src/skills/threat-modeling/SKILL.md +19 -13
- package/dist/agent-src/skills/universal-project-analysis/SKILL.md +1 -1
- package/dist/agent-src/skills/upstream-contribute/SKILL.md +0 -1
- package/dist/agent-src/skills/using-git-worktrees/SKILL.md +9 -9
- package/dist/agent-src/skills/validate-feature-fit/SKILL.md +3 -1
- package/dist/agent-src/skills/verify-completion-evidence/SKILL.md +4 -6
- package/dist/agent-src/skills/verify-repair-loop/SKILL.md +67 -61
- package/dist/agent-src/skills/video-director/SKILL.md +7 -7
- package/dist/agent-src/skills/worktree-lifecycle/SKILL.md +3 -3
- package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
- package/dist/agent-src/templates/contexts/knowledge-pages.md +47 -45
- package/dist/agent-src/templates/contexts/lesson-card.md +2 -2
- package/dist/agent-src/templates/contexts/tenant-boundaries.md +2 -2
- package/dist/agent-src/templates/contexts.md +1 -1
- package/dist/agent-src/templates/features.md +1 -1
- package/dist/agent-src/templates/roadmaps.md +125 -116
- package/dist/agent-src/templates/rule.md +2 -1
- package/dist/agent-src/templates/scripts/pr_risk_review.ts +0 -0
- package/dist/agent-src/templates/scripts/telemetry/aggregator.ts +0 -0
- package/dist/agent-src/templates/scripts/tier_usage_report.ts +2 -2
- package/dist/agent-src/templates/scripts/work_engine/directives/ui/apply.ts +30 -30
- package/dist/agent-src/templates/scripts/work_engine/directives/ui/design.ts +88 -33
- package/dist/agent-src/templates/scripts/work_engine/directives/ui/polish.ts +22 -2
- package/dist/agent-src/templates/scripts/work_engine/directives/ui/review.ts +21 -2
- package/dist/agent-src/templates/scripts/work_engine/directives/ui/stack_bundles.ts +179 -0
- package/dist/agent-src/templates/scripts/work_engine/stack/detect.ts +155 -4
- package/dist/agent-src/templates/scripts/work_engine/state.ts +21 -4
- package/dist/agent-src/user-types/README.md +8 -8
- package/dist/agent-src/user-types/galabau-field-crew.md +34 -33
- package/dist/agent-src/user-types/metalworking-shop.md +35 -34
- package/dist/agent-src/user-types/truck-driver.md +22 -20
- package/dist/cli/initRouting.js +74 -11
- package/dist/cli/initRouting.js.map +1 -1
- package/dist/cli/main.js +14 -3
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/python/workspace_roles.js +2 -2
- package/dist/cli/python/workspace_roles.js.map +1 -1
- package/dist/cli-delegate/chunk-4SV3XGFA.js +6910 -0
- package/dist/cli-delegate/chunk-736JCWLM.js +1104 -0
- package/dist/cli-delegate/chunk-7DSAMZFU.js +356 -0
- package/dist/cli-delegate/chunk-7HQ52DHU.js +74 -0
- package/dist/cli-delegate/chunk-BJGXZNPM.js +266 -0
- package/dist/cli-delegate/chunk-FTAISGDQ.js +117 -0
- package/dist/cli-delegate/chunk-GME3Q44L.js +82 -0
- package/dist/cli-delegate/chunk-GRRPEPRN.js +336 -0
- package/dist/cli-delegate/chunk-HJ6DAJHR.js +502 -0
- package/dist/cli-delegate/chunk-IR7P7JWA.js +872 -0
- package/dist/cli-delegate/chunk-J55WI3RR.js +47 -0
- package/dist/cli-delegate/chunk-MCJYCQPF.js +35 -0
- package/dist/cli-delegate/chunk-NDJLNC6Q.js +169 -0
- package/dist/cli-delegate/chunk-OMIVVCG2.js +26 -0
- package/dist/cli-delegate/chunk-OY53J6II.js +7336 -0
- package/dist/cli-delegate/chunk-RDGRHAAB.js +259 -0
- package/dist/cli-delegate/chunk-TFG57JJM.js +1969 -0
- package/dist/cli-delegate/chunk-XX6TOPD7.js +715 -0
- package/dist/cli-delegate/chunk-YMFO6FDN.js +10603 -0
- package/dist/cli-delegate/cmd_analyze_session.js +294 -0
- package/dist/cli-delegate/cmd_conformance.js +646 -0
- package/dist/cli-delegate/cmd_converge.js +326 -0
- package/dist/cli-delegate/cmd_doctor.js +144 -0
- package/dist/cli-delegate/cmd_explain.js +2508 -0
- package/dist/cli-delegate/cmd_export.js +296 -0
- package/dist/cli-delegate/cmd_fleet.js +332 -0
- package/dist/cli-delegate/cmd_memory_get.js +3878 -0
- package/dist/cli-delegate/cmd_migrate.js +11 -0
- package/dist/cli-delegate/cmd_preflight.js +270 -0
- package/dist/cli-delegate/cmd_prune.js +444 -0
- package/dist/cli-delegate/cmd_refresh.js +28 -0
- package/dist/cli-delegate/cmd_settings_check.js +574 -0
- package/dist/cli-delegate/cmd_settings_migrate.js +223 -0
- package/dist/cli-delegate/cmd_sync.js +264 -0
- package/dist/cli-delegate/cmd_uninstall.js +656 -0
- package/dist/cli-delegate/cmd_update.js +425 -0
- package/dist/cli-delegate/cmd_upgrade.js +444 -0
- package/dist/cli-delegate/cmd_validate.js +305 -0
- package/dist/cli-delegate/cmd_versions.js +370 -0
- package/dist/discovery/deprecation-report.md +1 -1
- package/dist/discovery/discovery-manifest.json +100 -67
- package/dist/discovery/discovery-manifest.json.sha256 +1 -1
- package/dist/discovery/discovery-manifest.summary.md +4 -4
- package/dist/discovery/orphan-report.md +1 -1
- package/dist/discovery/packs.json +16 -10
- package/dist/discovery/trust-report.md +2 -2
- package/dist/discovery/workspaces.json +7 -5
- package/dist/hooks/dispatch.js +186 -12
- package/dist/install/emit_host_rules_cli.js +2 -1
- package/dist/install/emit_host_rules_cli.js.map +1 -1
- package/dist/install/install.mjs +418 -378
- package/dist/install/rule_scope.js +5 -1
- package/dist/install/rule_scope.js.map +1 -1
- package/dist/install/toolDetection.js +40 -12
- package/dist/install/toolDetection.js.map +1 -1
- package/dist/install/wizard-plan.js +2 -2
- package/dist/install/wizard-plan.js.map +1 -1
- package/dist/mcp/registry-manifest.json +3 -3
- package/dist/mcp/server.json +2 -2
- package/dist/mcp/server.mjs +2194 -1003
- package/dist/router.json +1 -1
- package/dist/scripts/_lib/compile_time_toggles.js +48 -0
- package/dist/scripts/_lib/compile_time_toggles.js.map +1 -0
- package/dist/scripts/condense.js +234 -217
- package/dist/scripts/condense.js.map +1 -1
- package/dist/server/schemas/settings.js +4 -0
- package/dist/server/schemas/settings.js.map +1 -1
- package/dist/shared/userMd/utils.js +30 -0
- package/dist/shared/userMd/utils.js.map +1 -1
- package/dist/ui/assets/index-BpSQt5vm.js.map +1 -1
- package/docs/guidelines/agent-infra/api-cost-levers.md +56 -5
- package/docs/guidelines/agent-infra/simplicity-and-goal-demos.md +93 -33
- package/package.json +4 -2
- package/src/agent-src/templates/scripts/pr_risk_review.ts +0 -0
- package/src/agent-src/templates/scripts/telemetry/aggregator.ts +0 -0
- package/src/agent-src/templates/scripts/tier_usage_report.ts +2 -2
- package/src/agent-src/templates/scripts/work_engine/directives/ui/apply.ts +30 -30
- package/src/agent-src/templates/scripts/work_engine/directives/ui/design.ts +88 -33
- package/src/agent-src/templates/scripts/work_engine/directives/ui/polish.ts +22 -2
- package/src/agent-src/templates/scripts/work_engine/directives/ui/review.ts +21 -2
- package/src/agent-src/templates/scripts/work_engine/directives/ui/stack_bundles.ts +179 -0
- package/src/agent-src/templates/scripts/work_engine/stack/detect.ts +155 -4
- package/src/agent-src/templates/scripts/work_engine/state.ts +21 -4
- package/src/config/agent-settings.template.yml +32 -2
- package/src/config/ci-local-parity.yml +142 -0
- package/src/config/discovery/packs.yml +7 -0
- package/src/config/evaluator-budgets.json +1 -1
- package/src/config/gate-coverage.yml +127 -0
- package/src/config/pack-size-budget.json +27 -0
- package/src/config/preamble-payload-budget.json +44 -0
- package/src/install/emit_host_rules_cli.ts +2 -1
- package/src/install/rule_scope.ts +5 -1
- package/src/install/toolDetection.ts +39 -8
- package/src/install/wizard-plan.ts +2 -2
- package/src/scripts/_cli/cmd_conformance.ts +2 -1
- package/src/scripts/_cli/cmd_converge.ts +2 -1
- package/src/scripts/_cli/cmd_doctor.ts +292 -15
- package/src/scripts/_cli/cmd_export.ts +2 -1
- package/src/scripts/_cli/cmd_fleet.ts +2 -1
- package/src/scripts/_cli/cmd_migrate.ts +2 -1
- package/src/scripts/_cli/cmd_preflight.ts +2 -1
- package/src/scripts/_cli/cmd_refresh.ts +2 -1
- package/src/scripts/_cli/cmd_update.ts +2 -1
- package/src/scripts/_cli/cmd_upgrade.ts +2 -1
- package/src/scripts/_cli/cmd_versions.ts +2 -1
- package/src/scripts/_cli/detection_report.ts +480 -0
- package/src/scripts/_dispatch.bash +52 -14
- package/src/scripts/_lib/agent_user_profile.ts +381 -0
- package/src/scripts/_lib/agents_overlay.ts +9 -0
- package/src/scripts/_lib/anchor_eval.ts +311 -0
- package/src/scripts/_lib/cc_transcript.ts +316 -0
- package/src/scripts/_lib/changelog_eras.ts +103 -9
- package/src/scripts/_lib/compile_time_toggles.ts +79 -0
- package/src/scripts/_lib/confusables.ts +101 -0
- package/src/scripts/_lib/duplicate_scope_census.ts +77 -0
- package/src/scripts/_lib/environment_detector.ts +441 -0
- package/src/scripts/_lib/managed_agents_folder.ts +181 -0
- package/src/scripts/_lib/package_root.ts +72 -0
- package/src/scripts/_lib/payload_hash_drift.ts +126 -0
- package/src/scripts/_lib/preservation_migration.ts +291 -0
- package/src/scripts/_lib/retrieval_sanitize.ts +166 -2
- package/src/scripts/_lib/scan_scope.ts +115 -0
- package/src/scripts/_lib/user_global_memory_audit.ts +187 -0
- package/src/scripts/_lib/user_global_observations.ts +830 -0
- package/src/scripts/_lib/user_global_revocations.ts +110 -0
- package/src/scripts/_lib/user_memory_gate_counters.ts +291 -0
- package/src/scripts/ai_council/blind_review.ts +0 -0
- package/src/scripts/ai_council/budget_guard.ts +90 -11
- package/src/scripts/ai_council/bundler.ts +2 -2
- package/src/scripts/ai_council/clients.ts +59 -3
- package/src/scripts/ai_council/config.ts +53 -7
- package/src/scripts/ai_council/modes.ts +68 -2
- package/src/scripts/ai_council/orchestrator.ts +54 -9
- package/src/scripts/ai_council/transport_resolver.ts +331 -0
- package/src/scripts/ai_team/team_dispatch.ts +17 -6
- package/src/scripts/anchor_eval_falsify.ts +198 -0
- package/src/scripts/anchor_scoring_run.ts +239 -0
- package/src/scripts/annotate_discovery.ts +1 -65
- package/src/scripts/bench_quality_run.ts +168 -4
- package/src/scripts/cache_realization_report.ts +782 -0
- package/src/scripts/check_artefact_count_messaging.ts +5 -1
- package/src/scripts/check_augment_description_cap.ts +15 -4
- package/src/scripts/check_bundle_path_leakage.ts +10 -4
- package/src/scripts/check_ci_local_parity.ts +317 -0
- package/src/scripts/check_condensation.ts +96 -191
- package/src/scripts/check_context_paths.ts +38 -9
- package/src/scripts/check_dependency_floors.ts +153 -0
- package/src/scripts/check_gate_coverage.ts +299 -0
- package/src/scripts/check_iron_law_prominence.ts +22 -1
- package/src/scripts/check_kernel_prefix_stability.ts +0 -0
- package/src/scripts/check_no_new_legacy_path.ts +16 -6
- package/src/scripts/check_no_roadmap_refs.ts +22 -9
- package/src/scripts/check_originality_freshness.ts +167 -0
- package/src/scripts/check_pack_size.ts +188 -0
- package/src/scripts/check_preamble_payload_budget.ts +130 -0
- package/src/scripts/check_proposal.ts +0 -0
- package/src/scripts/check_references.ts +0 -1
- package/src/scripts/check_safety_floor_untouched.ts +171 -24
- package/src/scripts/check_site_links.ts +62 -3
- package/src/scripts/ci_status.ts +0 -0
- package/src/scripts/cluster_near_miss_patterns.ts +0 -0
- package/src/scripts/code_graph/build.ts +0 -0
- package/src/scripts/command_suggester/types.ts +0 -0
- package/src/scripts/compile_router.ts +10 -14
- package/src/scripts/condense.sh +3 -4
- package/src/scripts/condense.ts +247 -228
- package/src/scripts/cost/track.mjs +168 -33
- package/src/scripts/cost_summary.ts +33 -1
- package/src/scripts/council_cli.ts +51 -5
- package/src/scripts/discovery_graph.ts +0 -0
- package/src/scripts/encoding_corpus.ts +500 -0
- package/src/scripts/encoding_corpus_report.ts +216 -0
- package/src/scripts/evaluator_umbrella.sh +34 -1
- package/src/scripts/generate_index.ts +19 -2
- package/src/scripts/install-hooks.sh +2 -2
- package/src/scripts/learning_sidecar.ts +0 -0
- package/src/scripts/lint_confusables.ts +10 -72
- package/src/scripts/lint_eval_fixture_citations.ts +113 -0
- package/src/scripts/lint_featured_skills.ts +0 -0
- package/src/scripts/lint_hidden_unicode.ts +208 -0
- package/src/scripts/lint_load_context.ts +17 -5
- package/src/scripts/lint_new_skill_gate.ts +9 -3
- package/src/scripts/lint_no_python_twin_rationale.ts +17 -2
- package/src/scripts/lint_originality.ts +1 -1
- package/src/scripts/lint_skill_originality.ts +1 -1
- package/src/scripts/lint_ticket_buildable.ts +1 -1
- package/src/scripts/lint_ui_stack_bundles.ts +170 -0
- package/src/scripts/mcp_server/tools.ts +4 -4
- package/src/scripts/measure_scope_dedup.ts +224 -0
- package/src/scripts/memory_lookup.ts +0 -0
- package/src/scripts/mine_session.ts +98 -0
- package/src/scripts/orchestration_payload_hash_drift.ts +145 -0
- package/src/scripts/preamble_byte_census.ts +574 -0
- package/src/scripts/probe_skill_registration.ts +2 -2
- package/src/scripts/redact_hook_capture.ts +13 -0
- package/src/scripts/release.ts +65 -10
- package/src/scripts/router_telemetry.ts +1 -1
- package/src/scripts/second_brain_retrieval.ts +14 -4
- package/src/scripts/skill_linter.ts +5 -0
- package/src/scripts/surface-tiers.yml +2 -0
- package/src/scripts/validate_pack_yaml.ts +0 -0
- package/src/server/schemas/settings.ts +8 -0
- package/src/shared/userMd/utils.ts +31 -0
- package/dist/agent-src/rules/telegraph-speak.md +0 -87
|
@@ -30,6 +30,7 @@
|
|
|
30
30
|
|
|
31
31
|
import * as fs from 'node:fs';
|
|
32
32
|
import * as path from 'node:path';
|
|
33
|
+
import { spawnSync } from 'node:child_process';
|
|
33
34
|
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
34
35
|
|
|
35
36
|
import * as sl from './_lib/security_lint.js';
|
|
@@ -261,6 +262,191 @@ export function _scan(sf: sl.ScannedFile): sl.Finding[] {
|
|
|
261
262
|
return out;
|
|
262
263
|
}
|
|
263
264
|
|
|
265
|
+
// ---------------------------------------------------------------------------
|
|
266
|
+
// Source-file pass — raw C0 control bytes make a text file INVISIBLE to tools
|
|
267
|
+
// ---------------------------------------------------------------------------
|
|
268
|
+
//
|
|
269
|
+
// The `.md` corpus pass above defends the model's eyes. This pass defends the
|
|
270
|
+
// *reviewer's* and the *gate's* eyes, which is a different failure.
|
|
271
|
+
//
|
|
272
|
+
// A raw control byte (NUL above all) in a text-intended source file makes
|
|
273
|
+
// `file(1)`, `grep`, and every tool that sniffs for binary content classify the
|
|
274
|
+
// file as binary and SKIP IT SILENTLY. A linter grepping such a file reads
|
|
275
|
+
// nothing and reports clean; an agent gathering evidence concludes the code
|
|
276
|
+
// does not exist. That is indistinguishable from a pass, which is the point.
|
|
277
|
+
//
|
|
278
|
+
// Discovered the hard way: `road-to-runtime-encoding-hardening` was authored on
|
|
279
|
+
// the premise that `memory_lookup.ts` had "zero imports" and that the sanitize
|
|
280
|
+
// floor therefore ran nowhere. The file simply carried a raw NUL as a composite
|
|
281
|
+
// map-key separator, so `grep` never read it. The premise was a measurement
|
|
282
|
+
// artifact. See `agents/evidence/reports/nul-byte-source-census.md`.
|
|
283
|
+
//
|
|
284
|
+
// Precision by construction — this pass flags ONLY raw C0 controls, never the
|
|
285
|
+
// invisible/confusable classes `_scan` owns. In a `.ts` file a real bidi or
|
|
286
|
+
// zero-width codepoint is usually a deliberate test fixture or a regex
|
|
287
|
+
// character class (this repo has several, legitimately), so flagging those here
|
|
288
|
+
// would demand an allowlist that grows until the gate is worthless. A raw
|
|
289
|
+
// control byte has NO legitimate use in text-intended source: the language
|
|
290
|
+
// escape (`\0`, `\x01`) compiles to the identical runtime string and keeps the
|
|
291
|
+
// file readable by tools. The fix is always available, so the false-positive
|
|
292
|
+
// rate is structurally zero rather than merely low.
|
|
293
|
+
|
|
294
|
+
/** Extensions whose content is legitimately binary — never flagged. */
|
|
295
|
+
const _BINARY_EXT: ReadonlySet<string> = new Set([
|
|
296
|
+
'png', 'jpg', 'jpeg', 'gif', 'ico', 'webp', 'avif', 'bmp', 'tiff',
|
|
297
|
+
'pdf', 'woff', 'woff2', 'ttf', 'otf', 'eot',
|
|
298
|
+
'zip', 'gz', 'tgz', 'bz2', 'xz', 'zst', '7z', 'rar',
|
|
299
|
+
'wasm', 'mp3', 'mp4', 'wav', 'ogg', 'webm', 'mov', 'avi',
|
|
300
|
+
'so', 'dylib', 'dll', 'node', 'a', 'o', 'exe',
|
|
301
|
+
'jar', 'class', 'pyc', 'pyo',
|
|
302
|
+
'db', 'sqlite', 'sqlite3', 'bin', 'dat',
|
|
303
|
+
'docx', 'xlsx', 'pptx', 'doc', 'xls', 'ppt', 'odt', 'ods', 'odp',
|
|
304
|
+
]);
|
|
305
|
+
|
|
306
|
+
/**
|
|
307
|
+
* Generated trees — skipped, because this is an AUTHORING rule.
|
|
308
|
+
*
|
|
309
|
+
* `dist/` and the per-tool projections are outputs of `src/` (see the
|
|
310
|
+
* `source-of-truth` rule: a projection is never edited by hand). Flagging a
|
|
311
|
+
* control byte there would point the author at a file they must not touch, and
|
|
312
|
+
* `dist/install/*.mjs` is a bundler artifact whose bytes are not even
|
|
313
|
+
* hand-authorable. Fix the source; the projection follows on `task sync`.
|
|
314
|
+
*/
|
|
315
|
+
const _GENERATED_PREFIXES: readonly string[] = [
|
|
316
|
+
'dist/',
|
|
317
|
+
'.augment/',
|
|
318
|
+
'.claude/',
|
|
319
|
+
'.cursor/',
|
|
320
|
+
'.clinerules/',
|
|
321
|
+
// Verbatim captured tool output, not authored text. These are RECORDINGS:
|
|
322
|
+
// escaping a control byte inside one would falsify the record it exists to
|
|
323
|
+
// preserve. If a capture needs to stay grep-readable, the fix is to escape
|
|
324
|
+
// at capture time — never to edit the artifact afterwards.
|
|
325
|
+
'agents/evidence/analysis/',
|
|
326
|
+
// The frozen hostile-encoding corpus. Its positives ARE raw control
|
|
327
|
+
// characters — that is the thing under test, so flagging them would demand
|
|
328
|
+
// escaping the fixtures and thereby delete the test. The corpus has its own,
|
|
329
|
+
// stronger integrity controls: a sha256 freeze plus a scope-guard test that
|
|
330
|
+
// is itself falsified by an out-of-scope fixture. Excluded here because it
|
|
331
|
+
// is DATA, on the same principle as the captures above.
|
|
332
|
+
'internal/bench/corpora/encoding-channels/',
|
|
333
|
+
];
|
|
334
|
+
|
|
335
|
+
function _isGenerated(rel: string): boolean {
|
|
336
|
+
return _GENERATED_PREFIXES.some((p) => rel.startsWith(p));
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
/**
|
|
340
|
+
* True for a raw control CODEPOINT that is not benign whitespace.
|
|
341
|
+
*
|
|
342
|
+
* Codepoints, not bytes, and that distinction is the whole point. A first cut
|
|
343
|
+
* of this pass tested bytes ≤ 0x1F and let two classes through: DEL (U+007F,
|
|
344
|
+
* a single byte above the range) and the C1 controls (U+0080–009F, which encode
|
|
345
|
+
* to a two-byte UTF-8 sequence containing no byte ≤ 0x1F). Both make `file(1)`
|
|
346
|
+
* and git classify a file as binary — `tests/scripts/retrieval_sanitize.test.ts`
|
|
347
|
+
* carried U+007F and U+009F, rendered as `Bin` in `git diff`, unreviewable on a
|
|
348
|
+
* PR, and passed the byte-level check. A gate that misses the thing it exists to
|
|
349
|
+
* catch is the failure this whole roadmap is about, so the range now matches
|
|
350
|
+
* `_classify`'s: C0 + DEL + C1, minus tab / LF / CR.
|
|
351
|
+
*/
|
|
352
|
+
function _isRawControlCodepoint(cp: number): boolean {
|
|
353
|
+
if (cp === 0x09 || cp === 0x0a || cp === 0x0d) return false;
|
|
354
|
+
return cp <= 0x1f || (cp >= 0x7f && cp <= 0x9f);
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
function _extensionOf(rel: string): string {
|
|
358
|
+
const base = rel.slice(rel.lastIndexOf('/') + 1);
|
|
359
|
+
const dot = base.lastIndexOf('.');
|
|
360
|
+
return dot <= 0 ? '' : base.slice(dot + 1).toLowerCase();
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
/** Tracked files, or `null` when git is unavailable (then the pass no-ops). */
|
|
364
|
+
function _trackedFiles(): string[] | null {
|
|
365
|
+
const res = spawnSync('git', ['ls-files', '-z'], {
|
|
366
|
+
cwd: sl.ROOT,
|
|
367
|
+
maxBuffer: 64 * 1024 * 1024,
|
|
368
|
+
});
|
|
369
|
+
if (res.status !== 0 || res.stdout === null) return null;
|
|
370
|
+
return res.stdout
|
|
371
|
+
.toString('utf-8')
|
|
372
|
+
.split('\0')
|
|
373
|
+
.filter((p) => p !== '');
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
/**
|
|
377
|
+
* Tracked files this pass is responsible for — text-intended, non-generated.
|
|
378
|
+
*
|
|
379
|
+
* Exported so a green run can state HOW MANY files it actually read. A check
|
|
380
|
+
* that reports "clean" without naming its scope is indistinguishable from a
|
|
381
|
+
* check whose scope matched nothing, which is the failure class this repo has
|
|
382
|
+
* already been bitten by.
|
|
383
|
+
*/
|
|
384
|
+
export function _eligibleSourceFiles(): string[] | null {
|
|
385
|
+
const tracked = _trackedFiles();
|
|
386
|
+
if (tracked === null) return null;
|
|
387
|
+
return tracked.filter((rel) => !_isGenerated(rel) && !_BINARY_EXT.has(_extensionOf(rel)));
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
/**
|
|
391
|
+
* Flag raw C0 control bytes in every tracked, text-intended file.
|
|
392
|
+
*
|
|
393
|
+
* `files` is injectable so the regression test can assert a synthetic NUL is
|
|
394
|
+
* caught — without that assertion there is no way to know this pass can still
|
|
395
|
+
* fail, which is the failure mode the whole check exists to prevent.
|
|
396
|
+
*/
|
|
397
|
+
export function _scanSourceControlBytes(files: readonly string[] | null = null): sl.Finding[] {
|
|
398
|
+
const tracked = files ?? _eligibleSourceFiles();
|
|
399
|
+
if (tracked === null) return [];
|
|
400
|
+
const out: sl.Finding[] = [];
|
|
401
|
+
for (const rel of tracked) {
|
|
402
|
+
// Re-applied here, not only in `_eligibleSourceFiles`: the exclusions
|
|
403
|
+
// are a property of the CHECK, so an explicit `files` list (a caller, a
|
|
404
|
+
// test) can never widen the scan past what the check is willing to
|
|
405
|
+
// claim. `_eligibleSourceFiles` exists to count, not to be the gate.
|
|
406
|
+
if (_isGenerated(rel)) continue;
|
|
407
|
+
if (_BINARY_EXT.has(_extensionOf(rel))) continue;
|
|
408
|
+
let data: Buffer;
|
|
409
|
+
try {
|
|
410
|
+
data = fs.readFileSync(path.join(sl.ROOT, rel));
|
|
411
|
+
} catch {
|
|
412
|
+
continue; // deleted, unreadable, or a submodule pointer
|
|
413
|
+
}
|
|
414
|
+
// A file that is not valid UTF-8 is binary regardless of its extension
|
|
415
|
+
// (an extensionless fixture, say) — not this check's business.
|
|
416
|
+
try {
|
|
417
|
+
new TextDecoder('utf-8', { fatal: true }).decode(data);
|
|
418
|
+
} catch {
|
|
419
|
+
continue;
|
|
420
|
+
}
|
|
421
|
+
// Iterate CODEPOINTS (the string is already known-valid UTF-8 here), so
|
|
422
|
+
// DEL and the C1 range are visible — see `_isRawControlCodepoint`.
|
|
423
|
+
let line = 1;
|
|
424
|
+
for (const ch of data.toString('utf-8')) {
|
|
425
|
+
const cp = ch.codePointAt(0);
|
|
426
|
+
if (cp === undefined) continue;
|
|
427
|
+
if (cp === 0x0a) {
|
|
428
|
+
line += 1;
|
|
429
|
+
continue;
|
|
430
|
+
}
|
|
431
|
+
if (!_isRawControlCodepoint(cp)) continue;
|
|
432
|
+
const hex = cp.toString(16).toUpperCase().padStart(2, '0');
|
|
433
|
+
out.push(
|
|
434
|
+
new sl.Finding(
|
|
435
|
+
rel,
|
|
436
|
+
line,
|
|
437
|
+
CHECK,
|
|
438
|
+
'HIGH',
|
|
439
|
+
`raw control character U+${hex} in a text source — makes ` +
|
|
440
|
+
'grep/file(1)/git treat this file as binary and skip it ' +
|
|
441
|
+
'silently; use the language escape (e.g. \\0, \\x7F) instead',
|
|
442
|
+
1.0,
|
|
443
|
+
),
|
|
444
|
+
);
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
return out;
|
|
448
|
+
}
|
|
449
|
+
|
|
264
450
|
export function _sanitize(filePath: string): string {
|
|
265
451
|
const raw = fs.readFileSync(filePath, 'utf-8');
|
|
266
452
|
let cleaned = '';
|
|
@@ -323,6 +509,28 @@ export function main(argv: readonly string[] | null = null): number {
|
|
|
323
509
|
}
|
|
324
510
|
}
|
|
325
511
|
|
|
512
|
+
// Second pass — raw control bytes in text-intended SOURCE files, which the
|
|
513
|
+
// `.md` corpus above does not cover. Deliberately not folded into
|
|
514
|
+
// `iter_corpus`: different scope (all tracked text files, not the `.md`
|
|
515
|
+
// corpus) and a narrower codepoint set (C0 only). `--fix` does not touch
|
|
516
|
+
// these — rewriting a source file's bytes is the author's call, and the
|
|
517
|
+
// finding names the escape to use.
|
|
518
|
+
const sourceFiles = _eligibleSourceFiles();
|
|
519
|
+
for (const h of _scanSourceControlBytes(sourceFiles)) {
|
|
520
|
+
findings.push(h);
|
|
521
|
+
}
|
|
522
|
+
if (!args.json) {
|
|
523
|
+
// State the scope on every run. A bare "clean" cannot be told apart
|
|
524
|
+
// from a pass whose file list was empty.
|
|
525
|
+
const n = sourceFiles === null ? 0 : sourceFiles.length;
|
|
526
|
+
process.stdout.write(
|
|
527
|
+
sourceFiles === null
|
|
528
|
+
? ' source pass: SKIPPED — `git ls-files` unavailable, 0 files read for raw control bytes\n'
|
|
529
|
+
: ` source pass: ${n} tracked text file(s) read for raw C0 control bytes ` +
|
|
530
|
+
'(generated trees + verbatim captures excluded)\n',
|
|
531
|
+
);
|
|
532
|
+
}
|
|
533
|
+
|
|
326
534
|
if (args.fix) {
|
|
327
535
|
// sorted(flagged) — by path string.
|
|
328
536
|
for (const p of [...flagged].sort()) {
|
|
@@ -36,9 +36,15 @@ const QUIET = process.argv.slice(2).includes('--quiet');
|
|
|
36
36
|
// src/scripts/lint_load_context.ts → three dirs up is the repo root.
|
|
37
37
|
const ROOT = path.resolve(path.dirname(_HERE), '..', '..');
|
|
38
38
|
|
|
39
|
+
// Retargeted 2026-07-29: the first two pointed at the ADR-051-emptied tree, so
|
|
40
|
+
// this gate reported "clean (0 declarer(s))" in CI — the count was in its own
|
|
41
|
+
// output the whole time. `agents/contexts` does not exist either (project-local
|
|
42
|
+
// contexts live under agents/settings/contexts) and is kept only as a no-op for
|
|
43
|
+
// consumer layouts that do have it.
|
|
39
44
|
const SCAN_DIRS = [
|
|
40
|
-
path.join(ROOT, '
|
|
41
|
-
path.join(ROOT, '
|
|
45
|
+
path.join(ROOT, 'src', 'rules'),
|
|
46
|
+
path.join(ROOT, 'src', 'agent-src', 'contexts'),
|
|
47
|
+
path.join(ROOT, 'agents', 'settings', 'contexts'),
|
|
42
48
|
path.join(ROOT, 'agents', 'contexts'),
|
|
43
49
|
];
|
|
44
50
|
|
|
@@ -50,9 +56,10 @@ const ALLOWED_PREFIXES = [
|
|
|
50
56
|
|
|
51
57
|
const LEGACY_PREFIX = '.agent-src.uncondensed/contexts/';
|
|
52
58
|
|
|
53
|
-
|
|
59
|
+
// Base for resolving a logical `contexts/...` entry to a real file.
|
|
60
|
+
const SOURCE_ROOT = path.join(ROOT, 'src', 'agent-src');
|
|
54
61
|
|
|
55
|
-
const PUBLIC_RULE_PREFIX = '
|
|
62
|
+
const PUBLIC_RULE_PREFIX = 'src/rules/';
|
|
56
63
|
const PROJECT_LOCAL_PREFIX = 'agents/settings/contexts/';
|
|
57
64
|
|
|
58
65
|
const HARD_FLOOR_RULES: ReadonlySet<string> = new Set([
|
|
@@ -217,7 +224,12 @@ function main(): number {
|
|
|
217
224
|
const warnings: string[] = [];
|
|
218
225
|
const graph: Record<string, string[]> = {};
|
|
219
226
|
|
|
220
|
-
|
|
227
|
+
const _files = collect_files();
|
|
228
|
+
// Gate-coverage contract (src/config/gate-coverage.yml): count FILES INSPECTED,
|
|
229
|
+
// not declarers — "0 declarers" over 400 files is a legitimate result, "0 files"
|
|
230
|
+
// is blindness. Reporting declarers here would have hidden the dead root.
|
|
231
|
+
process.stdout.write(`scanned: ${String(_files.length)}\n`);
|
|
232
|
+
for (const f of _files) {
|
|
221
233
|
const fm = parse_frontmatter(f);
|
|
222
234
|
const lazyRaw = fm['load_context'];
|
|
223
235
|
const eagerRaw = fm['load_context_eager'];
|
|
@@ -105,9 +105,15 @@ function _skill_roots(): string[] {
|
|
|
105
105
|
}
|
|
106
106
|
}
|
|
107
107
|
}
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
108
|
+
// ADR-051 moved skill authoring to `src/skills`; a later commit deleted
|
|
109
|
+
// `packages/` entirely. Until 2026-07-29 the only fallback was the retired
|
|
110
|
+
// container, so this resolved to [] and the overlap gate silently passed
|
|
111
|
+
// every new skill.
|
|
112
|
+
if (roots.length === 0) {
|
|
113
|
+
const cand = path.join(ROOT, 'src', 'skills');
|
|
114
|
+
if (_isDir(cand)) {
|
|
115
|
+
roots = [cand];
|
|
116
|
+
}
|
|
111
117
|
}
|
|
112
118
|
return roots;
|
|
113
119
|
}
|
|
@@ -26,9 +26,24 @@ const _HERE = fileURLToPath(import.meta.url);
|
|
|
26
26
|
export const ROOT = path.resolve(path.dirname(_HERE), '..', '..');
|
|
27
27
|
const SCOPE = path.join(ROOT, 'src', 'scripts');
|
|
28
28
|
|
|
29
|
-
/**
|
|
29
|
+
/**
|
|
30
|
+
* Banned rationale shapes (case-insensitive).
|
|
31
|
+
*
|
|
32
|
+
* `twin-of` is qualified with a Python signal on purpose. The bare `/\btwin of\b/`
|
|
33
|
+
* it replaced banned an English word rather than a claim shape, and produced 6 false
|
|
34
|
+
* positives out of 7 findings: a CLI twin of an MCP tool, a sync twin of an async
|
|
35
|
+
* probe in the same file, a debate twin of a sibling function, a SQLite twin of a
|
|
36
|
+
* JSON cache. None of those rationalise anything by fidelity to a deleted Python
|
|
37
|
+
* original — which is the only thing this gate exists to stop — and rewording correct
|
|
38
|
+
* comments to dodge a word would have been the tail wagging the dog.
|
|
39
|
+
*
|
|
40
|
+
* The narrowing does not weaken the gate: every shape it targets names Python by
|
|
41
|
+
* construction ("TypeScript twin of the Python original", "twin of the retired
|
|
42
|
+
* .py"), so the qualifier is satisfied precisely when the claim is the banned one.
|
|
43
|
+
* The other three patterns already carry their own Python signal.
|
|
44
|
+
*/
|
|
30
45
|
export const BANNED: ReadonlyArray<[string, RegExp]> = [
|
|
31
|
-
['twin-of', /\btwin of\b/i],
|
|
46
|
+
['twin-of', /\btwin of\b[^\n]*\b(?:python|py2ts|\.py)\b|\b(?:python|py2ts|\.py)\b[^\n]*\btwin of\b/i],
|
|
32
47
|
['latent-quirks', /latent (?:python )?(?:quirks|bugs) replicated/i],
|
|
33
48
|
['byte-identical-python', /byte-identical to the python/i],
|
|
34
49
|
['python-original', /\bthe python original\b/i],
|
|
@@ -373,7 +373,7 @@ function _changed(files: string[]): { pairs: Pair[]; fails: number } {
|
|
|
373
373
|
const seen = new Set<string>();
|
|
374
374
|
const record = (a: Artifact, b: Artifact): void => {
|
|
375
375
|
if (a.relpath === b.relpath) return;
|
|
376
|
-
const key = [a.relpath, b.relpath].sort().join('
|
|
376
|
+
const key = [a.relpath, b.relpath].sort().join('\0');
|
|
377
377
|
if (seen.has(key)) return;
|
|
378
378
|
const o = overlap(a, b);
|
|
379
379
|
if (o >= WARN) {
|
|
@@ -351,7 +351,7 @@ function _sortedSkillMds(root: string): string[] {
|
|
|
351
351
|
|
|
352
352
|
/** frozenset((a, b)) — order-independent membership key. */
|
|
353
353
|
function _frozenKey(a: string, b: string): string {
|
|
354
|
-
return a <= b ? `${a}
|
|
354
|
+
return a <= b ? `${a}\0${b}` : `${b}\0${a}`;
|
|
355
355
|
}
|
|
356
356
|
|
|
357
357
|
/** sorted(a & b) — codepoint-sorted intersection. */
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
/**
|
|
3
|
+
* Lint the UI-track verb → skill-bundle map.
|
|
4
|
+
*
|
|
5
|
+
* The stack-dispatched UI steps halt with a directive verb
|
|
6
|
+
* (`ui-apply-<stack>` and friends). Those verbs are agent-interpreted, not
|
|
7
|
+
* skill paths — only 2 of the engine's 11 literal verbs name a real skill — so
|
|
8
|
+
* the mapping from verb to the skills that implement it is a separate fact.
|
|
9
|
+
* It used to live only in a prose table in `docs/contracts/ui-track-flow.md`,
|
|
10
|
+
* unverified, and two of its four rows were wrong: `vue` named the verb itself
|
|
11
|
+
* (no skill at all) and `plain` — the fallback for every unrecognised project —
|
|
12
|
+
* named `blade-ui`, a `packs: [laravel]` skill that a non-Laravel consumer does
|
|
13
|
+
* not have installed.
|
|
14
|
+
*
|
|
15
|
+
* Two assertions, both decidable in this repo:
|
|
16
|
+
*
|
|
17
|
+
* 1. RESOLUTION — every bundle member is a real skill (`src/skills/<n>/SKILL.md`).
|
|
18
|
+
* 2. PACK REACH — a lane declared `pack_agnostic` names only skills that ship
|
|
19
|
+
* in a stack-neutral pack. This is the assertion that actually matters: CI
|
|
20
|
+
* here cannot see a consumer's installed pack combination, so "the skill
|
|
21
|
+
* exists in our tree" would have passed the `plain → blade-ui` defect
|
|
22
|
+
* unchanged.
|
|
23
|
+
*
|
|
24
|
+
* Exit codes: 0 clean, 1 one or more findings.
|
|
25
|
+
*/
|
|
26
|
+
|
|
27
|
+
import * as fs from 'node:fs';
|
|
28
|
+
import * as path from 'node:path';
|
|
29
|
+
import { fileURLToPath } from 'node:url';
|
|
30
|
+
|
|
31
|
+
import {
|
|
32
|
+
STACK_BUNDLES,
|
|
33
|
+
type StackBundle,
|
|
34
|
+
} from '../agent-src/templates/scripts/work_engine/directives/ui/stack_bundles.js';
|
|
35
|
+
|
|
36
|
+
const QUIET = process.argv.includes('--quiet');
|
|
37
|
+
|
|
38
|
+
const _HERE = fileURLToPath(import.meta.url);
|
|
39
|
+
const REPO = path.resolve(path.dirname(_HERE), '..', '..');
|
|
40
|
+
const SKILLS_DIR = path.join(REPO, 'src', 'skills');
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Packs that ship regardless of the project's framework. A `pack_agnostic`
|
|
44
|
+
* lane may only draw on these — anything else is unavailable to some consumer.
|
|
45
|
+
*/
|
|
46
|
+
const STACK_NEUTRAL_PACKS: ReadonlySet<string> = new Set(['engineering-base', 'core', 'meta']);
|
|
47
|
+
|
|
48
|
+
const findings: string[] = [];
|
|
49
|
+
|
|
50
|
+
function skill_path(name: string): string {
|
|
51
|
+
return path.join(SKILLS_DIR, name, 'SKILL.md');
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/** Return the `packs:` list from a skill's frontmatter, or `null` if absent. */
|
|
55
|
+
function packs_of(name: string): string[] | null {
|
|
56
|
+
let text: string;
|
|
57
|
+
try {
|
|
58
|
+
text = fs.readFileSync(skill_path(name), { encoding: 'utf-8' });
|
|
59
|
+
} catch {
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
// Frontmatter only — a `packs:` mention in the body is not a declaration.
|
|
63
|
+
const end = text.indexOf('\n---', 4);
|
|
64
|
+
const front = end === -1 ? text : text.slice(0, end);
|
|
65
|
+
// `[ \t]*`, not `\s*`: `\s` matches a newline, so the greedy form swallowed
|
|
66
|
+
// the line break and captured the first block-list item as if it were an
|
|
67
|
+
// inline value — which made every block-list skill parse as "no packs".
|
|
68
|
+
const match = /^packs:[ \t]*(.*)$/m.exec(front);
|
|
69
|
+
if (match === null) return null;
|
|
70
|
+
const inline = (match[1] ?? '').trim();
|
|
71
|
+
if (inline.startsWith('[')) {
|
|
72
|
+
return inline
|
|
73
|
+
.replace(/^\[|\]$/g, '')
|
|
74
|
+
.split(',')
|
|
75
|
+
.map((s) => s.trim().replace(/^['"]|['"]$/g, ''))
|
|
76
|
+
.filter((s) => s !== '');
|
|
77
|
+
}
|
|
78
|
+
// Block list: consume the ` - name` lines that follow. `match[0]` stops
|
|
79
|
+
// before the newline, so the first split element is the empty tail of the
|
|
80
|
+
// matched line itself — dropping it is required, not cosmetic: treating it
|
|
81
|
+
// as a non-item ended the loop immediately and made every block-list skill
|
|
82
|
+
// parse as "no packs", which is how this linter first shipped green against
|
|
83
|
+
// the very defect it exists to catch.
|
|
84
|
+
const rest = front.slice(match.index + match[0].length).split('\n').slice(1);
|
|
85
|
+
const out: string[] = [];
|
|
86
|
+
for (const line of rest) {
|
|
87
|
+
const item = /^\s*-\s*(.+?)\s*$/.exec(line);
|
|
88
|
+
if (item === null) break;
|
|
89
|
+
out.push((item[1] ?? '').replace(/^['"]|['"]$/g, ''));
|
|
90
|
+
}
|
|
91
|
+
return out;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
function check_lane(lane: string, bundle: StackBundle): void {
|
|
95
|
+
const members = [...bundle.build, ...bundle.review];
|
|
96
|
+
if (members.length === 0) {
|
|
97
|
+
findings.push(`${lane}: bundle is empty — a lane must name at least one skill.`);
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
for (const name of new Set(members)) {
|
|
101
|
+
// 1. RESOLUTION
|
|
102
|
+
if (!fs.existsSync(skill_path(name))) {
|
|
103
|
+
findings.push(
|
|
104
|
+
`${lane}: bundle member \`${name}\` has no ` +
|
|
105
|
+
`\`src/skills/${name}/SKILL.md\` — the verb would resolve to nothing.`,
|
|
106
|
+
);
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
// 2. PACK REACH
|
|
110
|
+
if (!bundle.pack_agnostic) continue;
|
|
111
|
+
const packs = packs_of(name);
|
|
112
|
+
if (packs === null) {
|
|
113
|
+
findings.push(
|
|
114
|
+
`${lane}: bundle member \`${name}\` declares no \`packs:\` — ` +
|
|
115
|
+
'a pack-agnostic lane cannot verify it ships everywhere.',
|
|
116
|
+
);
|
|
117
|
+
continue;
|
|
118
|
+
}
|
|
119
|
+
const offenders = packs.filter((p) => !STACK_NEUTRAL_PACKS.has(p));
|
|
120
|
+
if (offenders.length > 0) {
|
|
121
|
+
findings.push(
|
|
122
|
+
`${lane}: lane is \`pack_agnostic\` but member \`${name}\` ships only in ` +
|
|
123
|
+
`[${offenders.join(', ')}] — a consumer without that pack gets nothing. ` +
|
|
124
|
+
'This is the `plain → blade-ui` defect class.',
|
|
125
|
+
);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
function main(): number {
|
|
131
|
+
const lanes = Object.keys(STACK_BUNDLES).sort();
|
|
132
|
+
if (lanes.length === 0) {
|
|
133
|
+
process.stderr.write('lint-ui-stack-bundles: STACK_BUNDLES is empty — nothing to check.\n');
|
|
134
|
+
return 1;
|
|
135
|
+
}
|
|
136
|
+
for (const lane of lanes) {
|
|
137
|
+
check_lane(lane, STACK_BUNDLES[lane] as StackBundle);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// A lane usable as a fallback must be pack-agnostic, else the fallback
|
|
141
|
+
// itself is the thing that fails for an unpredictable consumer.
|
|
142
|
+
const plain = STACK_BUNDLES['plain'];
|
|
143
|
+
if (plain === undefined) {
|
|
144
|
+
findings.push('plain: missing — it is the documented DEFAULT_DIRECTIVE lane.');
|
|
145
|
+
} else if (!plain.pack_agnostic) {
|
|
146
|
+
findings.push(
|
|
147
|
+
'plain: the fallback lane must be `pack_agnostic` — every unrecognised ' +
|
|
148
|
+
'project lands here and its packs are unknown.',
|
|
149
|
+
);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
if (findings.length > 0) {
|
|
153
|
+
for (const f of findings) {
|
|
154
|
+
process.stdout.write(`lint-ui-stack-bundles: ${f}\n`);
|
|
155
|
+
}
|
|
156
|
+
process.stderr.write(
|
|
157
|
+
`lint-ui-stack-bundles: ${findings.length} finding(s) across ${lanes.length} lane(s).\n`,
|
|
158
|
+
);
|
|
159
|
+
return 1;
|
|
160
|
+
}
|
|
161
|
+
if (!QUIET) {
|
|
162
|
+
process.stdout.write(
|
|
163
|
+
`lint-ui-stack-bundles: ${lanes.length} lane(s) clean — every bundle member ` +
|
|
164
|
+
'resolves, and every pack-agnostic lane stays stack-neutral.\n',
|
|
165
|
+
);
|
|
166
|
+
}
|
|
167
|
+
return 0;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
process.exit(main());
|
|
@@ -97,10 +97,10 @@ export type ToolSideEffect = 'ro' | 'fs-write' | 'shell';
|
|
|
97
97
|
* each `tools/call`. `handler` is an async function that receives the
|
|
98
98
|
* validated arguments + the resolved `consumer_root` path.
|
|
99
99
|
*
|
|
100
|
-
*
|
|
101
|
-
*
|
|
102
|
-
*
|
|
103
|
-
*
|
|
100
|
+
* Shape is pinned by `consumer_tool_catalog.json`: `build_mcp_catalog` derives
|
|
101
|
+
* the catalog from `ALLOWLIST` here, and `build_mcp_catalog --strict` fails CI
|
|
102
|
+
* on any drift (`.github/workflows/tests.yml`). `side_effect` is consumed by that
|
|
103
|
+
* generator, so adding or reordering a field means regenerating the catalog.
|
|
104
104
|
*/
|
|
105
105
|
export interface BuiltinTool {
|
|
106
106
|
readonly name: string;
|