@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
|
@@ -409,13 +409,97 @@ function _rstrip(text: string): string {
|
|
|
409
409
|
return text.replace(/\s+$/u, '');
|
|
410
410
|
}
|
|
411
411
|
|
|
412
|
+
/**
|
|
413
|
+
* Split a current-era body into (carry-over, archived) at `boundary`.
|
|
414
|
+
*
|
|
415
|
+
* The archive is named `pre-<boundary>`, so by its own contract it may only
|
|
416
|
+
* hold entries STRICTLY OLDER than the boundary. Sections at or above it —
|
|
417
|
+
* i.e. the incoming release's own entry, when it is already prepended — stay
|
|
418
|
+
* in the new era.
|
|
419
|
+
*
|
|
420
|
+
* On a fresh release run the body never contains the incoming entry (the split
|
|
421
|
+
* runs before the prepend), so the carry-over is empty and this is a no-op.
|
|
422
|
+
* On a `--resume` run the entry IS already committed and the bump step is
|
|
423
|
+
* correctly skipped, so without this partition the split archived the release
|
|
424
|
+
* it was named after and nothing ever put it back: the current era ended up
|
|
425
|
+
* empty and the `changelog-entry` CI gate went red. That is the 9.10.0
|
|
426
|
+
* failure. The partition makes the two orderings converge.
|
|
427
|
+
*
|
|
428
|
+
* Changelog bodies are newest-first, so the carry-over is a prefix — but the
|
|
429
|
+
* scan is per-heading rather than "stop at the first older one" so a
|
|
430
|
+
* hand-edited out-of-order body cannot silently archive a newer entry.
|
|
431
|
+
*/
|
|
432
|
+
export function _partition_era_body(
|
|
433
|
+
body: readonly string[],
|
|
434
|
+
boundary: string,
|
|
435
|
+
): { carry: string[]; archived: string[] } {
|
|
436
|
+
const b = _RELEASE_VERSION_RE.exec(boundary.trim());
|
|
437
|
+
if (!b) {
|
|
438
|
+
throw new Error(`not a bare semver (X.Y.Z): '${boundary}'`);
|
|
439
|
+
}
|
|
440
|
+
const bound: [number, number, number] = [
|
|
441
|
+
Number.parseInt(b[1]!, 10),
|
|
442
|
+
Number.parseInt(b[2]!, 10),
|
|
443
|
+
Number.parseInt(b[3]!, 10),
|
|
444
|
+
];
|
|
445
|
+
|
|
446
|
+
// Section boundaries: every `## [X.Y.Z]` heading starts a new section.
|
|
447
|
+
// Content before the first heading (there should be none) rides along with
|
|
448
|
+
// the archive, matching the pre-fix behaviour for that shape.
|
|
449
|
+
const starts: number[] = [];
|
|
450
|
+
for (let i = 0; i < body.length; i++) {
|
|
451
|
+
if (VERSION_HEADING_RE.test(body[i]!)) {
|
|
452
|
+
starts.push(i);
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
if (starts.length === 0) {
|
|
456
|
+
return { carry: [], archived: [...body] };
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
const carry: string[] = [];
|
|
460
|
+
const archived: string[] = [...body.slice(0, starts[0]!)];
|
|
461
|
+
for (let s = 0; s < starts.length; s++) {
|
|
462
|
+
const from = starts[s]!;
|
|
463
|
+
const to = s + 1 < starts.length ? starts[s + 1]! : body.length;
|
|
464
|
+
const section = body.slice(from, to);
|
|
465
|
+
const m = VERSION_HEADING_RE.exec(body[from]!);
|
|
466
|
+
const v = m?.groups?.['version'];
|
|
467
|
+
const parsed = v ? _RELEASE_VERSION_RE.exec(v) : null;
|
|
468
|
+
if (parsed === null || parsed === undefined) {
|
|
469
|
+
archived.push(...section);
|
|
470
|
+
continue;
|
|
471
|
+
}
|
|
472
|
+
const cur: [number, number, number] = [
|
|
473
|
+
Number.parseInt(parsed[1]!, 10),
|
|
474
|
+
Number.parseInt(parsed[2]!, 10),
|
|
475
|
+
Number.parseInt(parsed[3]!, 10),
|
|
476
|
+
];
|
|
477
|
+
const isOlder =
|
|
478
|
+
cur[0] < bound[0] ||
|
|
479
|
+
(cur[0] === bound[0] && cur[1] < bound[1]) ||
|
|
480
|
+
(cur[0] === bound[0] && cur[1] === bound[1] && cur[2] < bound[2]);
|
|
481
|
+
(isOlder ? archived : carry).push(...section);
|
|
482
|
+
}
|
|
483
|
+
return { carry, archived };
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
/** Drop trailing blank lines (in place semantics, returns the same array). */
|
|
487
|
+
function _trim_trailing_blanks(xs: string[]): string[] {
|
|
488
|
+
while (xs.length > 0 && xs[xs.length - 1]!.trim() === '') {
|
|
489
|
+
xs.pop();
|
|
490
|
+
}
|
|
491
|
+
return xs;
|
|
492
|
+
}
|
|
493
|
+
|
|
412
494
|
/**
|
|
413
495
|
* Execute `plan` against the on-disk CHANGELOG.md.
|
|
414
496
|
*
|
|
415
497
|
* - Refuses to overwrite an existing archive file.
|
|
416
|
-
* - Moves every entry
|
|
498
|
+
* - Moves every entry OLDER than the boundary into the new archive; an
|
|
499
|
+
* already-prepended entry for the incoming release stays in the new era
|
|
500
|
+
* (see `_partition_era_body`).
|
|
417
501
|
* - Replaces the current era block with the collapsed pointer + the
|
|
418
|
-
* freshly-labelled new current era header
|
|
502
|
+
* freshly-labelled new current era header.
|
|
419
503
|
*/
|
|
420
504
|
export function perform_split(plan: SplitPlan): void {
|
|
421
505
|
if (fs.existsSync(plan.archive_path)) {
|
|
@@ -433,21 +517,31 @@ export function perform_split(plan: SplitPlan): void {
|
|
|
433
517
|
}
|
|
434
518
|
|
|
435
519
|
const [body_start, , next_era_line] = _era_body_bounds(lines, current_idx);
|
|
436
|
-
const
|
|
437
|
-
//
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
520
|
+
const body = lines.slice(body_start, next_era_line);
|
|
521
|
+
// Entries at/above the boundary (a resume run's already-prepended release
|
|
522
|
+
// entry) stay in the new era; only older ones are archived.
|
|
523
|
+
const { carry, archived } = _partition_era_body(body, plan.boundary);
|
|
524
|
+
// Trim trailing blank lines so neither side accumulates them.
|
|
525
|
+
_trim_trailing_blanks(archived);
|
|
526
|
+
_trim_trailing_blanks(carry);
|
|
441
527
|
|
|
442
528
|
const collapsed = _splitlines(_rstrip_newlines(collapsed_era_block(plan.boundary)));
|
|
443
529
|
const new_era = _splitlines(_rstrip_newlines(new_era_intro_block(plan.new_era_label, plan.boundary)));
|
|
444
530
|
|
|
445
531
|
const head = lines.slice(0, current_idx);
|
|
446
532
|
const tail = lines.slice(next_era_line);
|
|
447
|
-
const new_lines = [
|
|
533
|
+
const new_lines = [
|
|
534
|
+
...head,
|
|
535
|
+
...collapsed,
|
|
536
|
+
'',
|
|
537
|
+
...new_era,
|
|
538
|
+
'',
|
|
539
|
+
...(carry.length > 0 ? [...carry, ''] : []),
|
|
540
|
+
...tail,
|
|
541
|
+
];
|
|
448
542
|
const new_text = _rstrip(new_lines.join('\n')) + '\n';
|
|
449
543
|
|
|
450
|
-
const archive_body =
|
|
544
|
+
const archive_body = archived.length > 0 ? _rstrip(archived.join('\n')) + '\n' : '';
|
|
451
545
|
const archive_text = archive_file_header(plan.boundary) + archive_body;
|
|
452
546
|
|
|
453
547
|
fs.mkdirSync(path.dirname(plan.archive_path), { recursive: true });
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Compile-time rule toggles — the single definition, shared by the router compiler
|
|
3
|
+
* and the projector.
|
|
4
|
+
*
|
|
5
|
+
* WHY THIS FILE EXISTS
|
|
6
|
+
* --------------------
|
|
7
|
+
* The map used to live only in `compile_router.ts`, which meant a disabled rule was
|
|
8
|
+
* dropped from `dist/router.json` while its **body still shipped** as a file in
|
|
9
|
+
* `dist/agent-src/rules/` (and through the `.claude/rules/` symlink). ADR
|
|
10
|
+
* `telegraph/0002` originally claimed that flipping the toggle gave "zero-cost
|
|
11
|
+
* dormancy". That was measured and found half wrong on 2026-07-29: the router entry
|
|
12
|
+
* governs *trigger-routing*; **file existence governs always-loaded injection**, and
|
|
13
|
+
* the host reads the file — a maintainer session's context listed the body verbatim
|
|
14
|
+
* as "project instructions", never having consulted the router.
|
|
15
|
+
*
|
|
16
|
+
* Two surfaces, one switch. Sharing the definition is what lets the projector honour
|
|
17
|
+
* it, so `speak: false` means what the ADR assumed instead of the ADR being weakened
|
|
18
|
+
* to match a partial implementation.
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* HOW A RULE GETS HERE — the dormancy routing (road-to-cache-economy Phase 3)
|
|
23
|
+
* --------------------------------------------------------------------------
|
|
24
|
+
* A rule body is re-written on EVERY subagent spawn, so an always-loaded rule
|
|
25
|
+
* that is not earning its keep is paid per spawn, not once. That makes "should
|
|
26
|
+
* this rule be dormant?" a real question — and this map is the ONLY place the
|
|
27
|
+
* answer may land. The route, in order:
|
|
28
|
+
*
|
|
29
|
+
* 1. **Candidate** — `preamble_byte_census` ranks always-loaded rules by
|
|
30
|
+
* per-spawn token cost (`--top`). A candidate is a number, never an
|
|
31
|
+
* impression: telegraph-speak was ~982 tokens.
|
|
32
|
+
* 2. **Evidence** — the same bar telegraph-speak had to clear: an output-side
|
|
33
|
+
* bench showing the rule does not pay for itself, judged against the
|
|
34
|
+
* kill-criterion, BEFORE dormancy. A preference is not evidence, and
|
|
35
|
+
* "it looks verbose" is not a measurement.
|
|
36
|
+
* 3. **Landing** — a new entry in the map below, keyed on a real setting the
|
|
37
|
+
* consumer can flip back. Never a fifth toggle axis: this predicate already
|
|
38
|
+
* has four consumers (the router compiler, the dist writer, `check_sync`,
|
|
39
|
+
* and the per-tool symlink generator), and a rule wired into three of four
|
|
40
|
+
* is how the last attempt blocked its own push.
|
|
41
|
+
*
|
|
42
|
+
* What is explicitly NOT this route: dropping a rule from the router while its
|
|
43
|
+
* body still ships (that was the measured half-truth this file exists to fix),
|
|
44
|
+
* and gating bodies behind triggers wholesale — that is thin projection, which
|
|
45
|
+
* failed a 48% quality floor at 36.2% and stays disabled.
|
|
46
|
+
*/
|
|
47
|
+
|
|
48
|
+
/** Loose settings shape — the toggles only ever read nested plain objects. */
|
|
49
|
+
export type ToggleSettings = Record<string, unknown>;
|
|
50
|
+
|
|
51
|
+
/** rule-id → predicate. A rule is emitted (router AND projection) only when its
|
|
52
|
+
* predicate returns true. A rule absent from this map is always emitted. */
|
|
53
|
+
export const COMPILE_TIME_TOGGLES: Record<string, (s: ToggleSettings) => boolean> = {
|
|
54
|
+
// `speak` defaults FALSE (dormant) per docs/adrs/telegraph/0002 — the absent-key
|
|
55
|
+
// fallback used to be `true`, which silently contradicted ADR 0001 (accepted,
|
|
56
|
+
// "default off until bench"). Measured basis: median vs_terse −9.27% (API) /
|
|
57
|
+
// −5.47% (exact cl100k_base) — telegraph emits MORE than a plain "be terse".
|
|
58
|
+
// Opt back in with an explicit `telegraph.speak: true` once an output-side bench
|
|
59
|
+
// clears the kill-criterion bar. `enabled` keeps its true default: it is the
|
|
60
|
+
// family master switch, and flipping it would silence sibling telegraph settings
|
|
61
|
+
// that were never measured negative.
|
|
62
|
+
//
|
|
63
|
+
// This predicate deliberately does NOT read `speak_scope`. That key disables the
|
|
64
|
+
// rule's *behaviour* and never removed its token cost — the trap the measurement
|
|
65
|
+
// exposed.
|
|
66
|
+
'telegraph-speak': (s: ToggleSettings): boolean => {
|
|
67
|
+
const tg = (s['telegraph'] as ToggleSettings | undefined) ?? {};
|
|
68
|
+
const enabled = tg['enabled'] === undefined ? true : tg['enabled'];
|
|
69
|
+
const speak = tg['speak'] === undefined ? false : tg['speak'];
|
|
70
|
+
return Boolean(enabled) && Boolean(speak);
|
|
71
|
+
},
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
/** True when the rule may be emitted. Unknown ids are always emitted — the map is an
|
|
75
|
+
* opt-in list of gated rules, never an allowlist of permitted ones. */
|
|
76
|
+
export function rule_is_compile_enabled(rule_id: string, settings: ToggleSettings): boolean {
|
|
77
|
+
const predicate = COMPILE_TIME_TOGGLES[rule_id];
|
|
78
|
+
return predicate === undefined ? true : predicate(settings);
|
|
79
|
+
}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Visible mixed-script confusable signature — the ONE definition in the tree.
|
|
3
|
+
*
|
|
4
|
+
* Extracted from `lint_confusables.ts` so the authoring-time linter and the
|
|
5
|
+
* runtime encoding scanner share one table and one decision rule
|
|
6
|
+
* (road-to-runtime-encoding-hardening Phase 3). Two copies of a confusable set
|
|
7
|
+
* is exactly the drift this extraction prevents: a codepoint added to one and
|
|
8
|
+
* not the other means the two surfaces disagree about what a homoglyph is.
|
|
9
|
+
*
|
|
10
|
+
* The dependency direction matters. This module imports NOTHING — no `fs`, no
|
|
11
|
+
* lint framework — so the runtime retrieval path can use it without pulling the
|
|
12
|
+
* authoring-time lint infrastructure into a request.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
/** A token needs this many letters before the signature can fire. */
|
|
16
|
+
export const MIN_LETTERS = 3;
|
|
17
|
+
|
|
18
|
+
// Unicode-script classifiers via property escapes (requires the `u` flag).
|
|
19
|
+
const _LATIN = /\p{Script=Latin}/u;
|
|
20
|
+
const _CYRILLIC = /\p{Script=Cyrillic}/u;
|
|
21
|
+
const _GREEK = /\p{Script=Greek}/u;
|
|
22
|
+
const _LETTER = /\p{L}/u;
|
|
23
|
+
|
|
24
|
+
/** A "token" is a maximal run of letters / combining marks / decimal digits. */
|
|
25
|
+
export const TOKEN_RE = /[\p{L}\p{M}\p{Nd}]+/gu;
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Cyrillic + Greek codepoints that have a basic-Latin lookalike (Unicode TR39
|
|
29
|
+
* confusables, common subset). A foreign letter only counts toward the
|
|
30
|
+
* confusable signal when it is in this set — Greek math operators with no Latin
|
|
31
|
+
* twin (Δ Σ Π Ω Φ Θ Λ Ξ Ψ Γ δ π ω …) are deliberately excluded so legit
|
|
32
|
+
* notation does not false-positive.
|
|
33
|
+
*/
|
|
34
|
+
export const CONFUSABLE_FOREIGN: ReadonlySet<number> = new Set([
|
|
35
|
+
// Cyrillic lowercase ↔ Latin
|
|
36
|
+
0x0430 /*а→a*/, 0x0435 /*е→e*/, 0x043e /*о→o*/, 0x0440 /*р→p*/, 0x0441 /*с→c*/,
|
|
37
|
+
0x0443 /*у→y*/, 0x0445 /*х→x*/, 0x0455 /*ѕ→s*/, 0x0456 /*і→i*/, 0x0458 /*ј→j*/,
|
|
38
|
+
0x04bb /*һ→h*/, 0x0501 /*ԁ→d*/, 0x051b /*ԛ→q*/, 0x0577 /*no*/,
|
|
39
|
+
// Cyrillic uppercase ↔ Latin
|
|
40
|
+
0x0410 /*А→A*/, 0x0412 /*В→B*/, 0x0415 /*Е→E*/, 0x041a /*К→K*/, 0x041c /*М→M*/,
|
|
41
|
+
0x041d /*Н→H*/, 0x041e /*О→O*/, 0x0420 /*Р→P*/, 0x0421 /*С→C*/, 0x0422 /*Т→T*/,
|
|
42
|
+
0x0423 /*У→Y*/, 0x0425 /*Х→X*/, 0x0405 /*Ѕ→S*/, 0x0406 /*І→I*/, 0x0408 /*Ј→J*/,
|
|
43
|
+
// Greek lowercase ↔ Latin
|
|
44
|
+
0x03b1 /*α→a*/, 0x03b5 /*ε→e*/, 0x03bf /*ο→o*/, 0x03bd /*ν→v*/, 0x03c1 /*ρ→p*/,
|
|
45
|
+
0x03c5 /*υ→u*/, 0x03c7 /*χ→x*/, 0x03ba /*κ→k*/,
|
|
46
|
+
// Greek uppercase ↔ Latin (only those with a real Latin twin)
|
|
47
|
+
0x0391 /*Α→A*/, 0x0392 /*Β→B*/, 0x0395 /*Ε→E*/, 0x0396 /*Ζ→Z*/, 0x0397 /*Η→H*/,
|
|
48
|
+
0x0399 /*Ι→I*/, 0x039a /*Κ→K*/, 0x039c /*Μ→M*/, 0x039d /*Ν→N*/, 0x039f /*Ο→O*/,
|
|
49
|
+
0x03a1 /*Ρ→P*/, 0x03a4 /*Τ→T*/, 0x03a5 /*Υ→Y*/, 0x03a7 /*Χ→X*/, 0x0392 /*Β→B*/,
|
|
50
|
+
]);
|
|
51
|
+
|
|
52
|
+
type ScriptName = 'latin' | 'cyrillic' | 'greek' | 'other';
|
|
53
|
+
|
|
54
|
+
function _script_of(ch: string): ScriptName {
|
|
55
|
+
if (_LATIN.test(ch)) return 'latin';
|
|
56
|
+
if (_CYRILLIC.test(ch)) return 'cyrillic';
|
|
57
|
+
if (_GREEK.test(ch)) return 'greek';
|
|
58
|
+
return 'other';
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Classify a single token. Returns the offending mixed-script descriptor when
|
|
63
|
+
* the token matches the homoglyph signature, else null.
|
|
64
|
+
*
|
|
65
|
+
* The containment rules are the load-bearing part, and they are why this is one
|
|
66
|
+
* shared function rather than two similar ones: a Latin-majority token with at
|
|
67
|
+
* least one TR39-confusable foreign letter is the signal; a single-script token
|
|
68
|
+
* (a genuine Cyrillic or Greek word) is not; and a token whose foreign letters
|
|
69
|
+
* outnumber its Latin ones is a foreign word, not an attack.
|
|
70
|
+
*/
|
|
71
|
+
export function classifyToken(token: string): string | null {
|
|
72
|
+
let latin = 0;
|
|
73
|
+
let cyrillic = 0;
|
|
74
|
+
let greek = 0;
|
|
75
|
+
let letters = 0;
|
|
76
|
+
for (const ch of token) {
|
|
77
|
+
if (!_LETTER.test(ch)) continue; // skip combining marks / digits for script vote
|
|
78
|
+
letters += 1;
|
|
79
|
+
const script = _script_of(ch);
|
|
80
|
+
if (script === 'latin') {
|
|
81
|
+
latin += 1;
|
|
82
|
+
} else if (script === 'cyrillic' || script === 'greek') {
|
|
83
|
+
// Only confusable foreign letters (TR39) count — math operators with
|
|
84
|
+
// no Latin twin are ignored, so legit notation never trips.
|
|
85
|
+
if (CONFUSABLE_FOREIGN.has(ch.codePointAt(0) as number)) {
|
|
86
|
+
if (script === 'cyrillic') cyrillic += 1;
|
|
87
|
+
else greek += 1;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
if (letters < MIN_LETTERS) return null;
|
|
92
|
+
const foreign = cyrillic + greek;
|
|
93
|
+
if (latin === 0 || foreign === 0) return null; // single-script (or no Latin) → legit
|
|
94
|
+
if (latin <= foreign) return null; // majority must be Latin (foreign word ≠ attack)
|
|
95
|
+
const which = cyrillic > 0 && greek > 0
|
|
96
|
+
? 'cyrillic+greek'
|
|
97
|
+
: cyrillic > 0
|
|
98
|
+
? 'cyrillic'
|
|
99
|
+
: 'greek';
|
|
100
|
+
return `latin+${which} (${latin} latin / ${foreign} foreign-confusable)`;
|
|
101
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Duplicate-scope rule census — the shared byte-comparison primitive behind
|
|
3
|
+
* both C-2 (`cache_realization_report.ts`'s `computeDuplicateScope`, which
|
|
4
|
+
* turns this into a share of subagent write volume) and the `doctor`
|
|
5
|
+
* `duplicate-scope-rules` health check (`_cli/cmd_doctor.ts`), so the two
|
|
6
|
+
* surfaces can never drift on what counts as "shared" or how a redundant
|
|
7
|
+
* copy's size is estimated.
|
|
8
|
+
*
|
|
9
|
+
* `road-to-cache-economy.md` Phase 3: the same 110 rule
|
|
10
|
+
* filenames observed at both `~/.claude/rules` (user scope) and
|
|
11
|
+
* `dist/agent-src/rules` (project scope) on this maintainer's own checkout —
|
|
12
|
+
* C-2 confirmed at 38.5% of subagent write volume. This module answers only
|
|
13
|
+
* "which filenames are shared, and how many redundant bytes do they cost" —
|
|
14
|
+
* the write-volume share and the doctor warning are each computed by their
|
|
15
|
+
* own caller from this raw census.
|
|
16
|
+
*
|
|
17
|
+
* Detection only. Never deletes, never rewrites a user's file — see
|
|
18
|
+
* `non-destructive-by-default`.
|
|
19
|
+
*/
|
|
20
|
+
import * as fs from 'node:fs';
|
|
21
|
+
import * as path from 'node:path';
|
|
22
|
+
|
|
23
|
+
export interface DuplicateScopeCensus {
|
|
24
|
+
evaluable: boolean;
|
|
25
|
+
reason?: string | undefined;
|
|
26
|
+
/** `.md` basenames present in BOTH directories, sorted. */
|
|
27
|
+
shared_filenames: string[];
|
|
28
|
+
/** Σ min(userBytes, projectBytes) over shared filenames — the conservative
|
|
29
|
+
* estimate of the redundant copy (the roadmap's byte census found the two
|
|
30
|
+
* scopes near-identical in size, so the min/max choice rarely matters). */
|
|
31
|
+
duplicate_chars: number;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* For every `.md` filename present in BOTH `userRulesDir` and
|
|
36
|
+
* `projectRulesDir`, the redundant copy is estimated as the SMALLER of the
|
|
37
|
+
* two files' byte sizes, summed across all shared filenames.
|
|
38
|
+
*/
|
|
39
|
+
export function censusDuplicateScope(userRulesDir: string, projectRulesDir: string): DuplicateScopeCensus {
|
|
40
|
+
if (!fs.existsSync(userRulesDir) || !fs.existsSync(projectRulesDir)) {
|
|
41
|
+
return {
|
|
42
|
+
evaluable: false,
|
|
43
|
+
reason: `one or both rule directories are missing (user: ${userRulesDir}, project: ${projectRulesDir})`,
|
|
44
|
+
shared_filenames: [],
|
|
45
|
+
duplicate_chars: 0,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
const userFiles = new Set(fs.readdirSync(userRulesDir).filter((f) => f.endsWith('.md')));
|
|
50
|
+
const projectFiles = fs.readdirSync(projectRulesDir).filter((f) => f.endsWith('.md'));
|
|
51
|
+
|
|
52
|
+
const shared: string[] = [];
|
|
53
|
+
let duplicateChars = 0;
|
|
54
|
+
for (const f of projectFiles) {
|
|
55
|
+
if (!userFiles.has(f)) continue;
|
|
56
|
+
shared.push(f);
|
|
57
|
+
const a = fs.statSync(path.join(userRulesDir, f)).size;
|
|
58
|
+
const b = fs.statSync(path.join(projectRulesDir, f)).size;
|
|
59
|
+
duplicateChars += Math.min(a, b);
|
|
60
|
+
}
|
|
61
|
+
shared.sort();
|
|
62
|
+
|
|
63
|
+
if (shared.length === 0) {
|
|
64
|
+
return {
|
|
65
|
+
evaluable: false,
|
|
66
|
+
reason: 'no shared .md filenames between the two rule scopes — this checkout has no duplicate-scope install',
|
|
67
|
+
shared_filenames: [],
|
|
68
|
+
duplicate_chars: 0,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
return {
|
|
73
|
+
evaluable: true,
|
|
74
|
+
shared_filenames: shared,
|
|
75
|
+
duplicate_chars: duplicateChars,
|
|
76
|
+
};
|
|
77
|
+
}
|