@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
|
@@ -15,6 +15,11 @@ import {
|
|
|
15
15
|
StepResult,
|
|
16
16
|
agent_directive,
|
|
17
17
|
} from '../../delivery_state.js';
|
|
18
|
+
import {
|
|
19
|
+
UNSUPPORTED_LANE,
|
|
20
|
+
bundle_line,
|
|
21
|
+
unsupported_stack_questions,
|
|
22
|
+
} from './stack_bundles.js';
|
|
18
23
|
|
|
19
24
|
/** Maximum number of polish rounds per `/work` run. */
|
|
20
25
|
export const POLISH_CEILING = 2;
|
|
@@ -31,9 +36,15 @@ export const TOKEN_REPEAT_THRESHOLD = 2;
|
|
|
31
36
|
/** Map `state.stack.frontend` → agent-directive skill name. */
|
|
32
37
|
export const STACK_DIRECTIVES: Record<string, string> = {
|
|
33
38
|
'blade-livewire-flux': 'ui-polish-blade-livewire-flux',
|
|
39
|
+
'blade-livewire': 'ui-polish-blade-livewire',
|
|
40
|
+
filament: 'ui-polish-filament',
|
|
34
41
|
'react-shadcn': 'ui-polish-react-shadcn',
|
|
42
|
+
react: 'ui-polish-react',
|
|
35
43
|
vue: 'ui-polish-vue',
|
|
36
44
|
plain: 'ui-polish-plain',
|
|
45
|
+
// Present so the `keys == KNOWN_STACKS` invariant holds. Never emitted —
|
|
46
|
+
// the step intercepts this lane and refuses instead of dispatching.
|
|
47
|
+
unknown: 'ui-polish-unsupported',
|
|
37
48
|
};
|
|
38
49
|
|
|
39
50
|
/** Fallback directive when `state.stack` is missing or malformed. */
|
|
@@ -184,6 +195,14 @@ function _delegate_to_polish_skill(
|
|
|
184
195
|
ceiling: number,
|
|
185
196
|
): StepResult {
|
|
186
197
|
const directive = _resolve_directive(state);
|
|
198
|
+
const unsupported_label = _stack_label(state);
|
|
199
|
+
if (unsupported_label === UNSUPPORTED_LANE) {
|
|
200
|
+
return new StepResult({
|
|
201
|
+
outcome: Outcome.BLOCKED,
|
|
202
|
+
questions: unsupported_stack_questions('polish'),
|
|
203
|
+
message: 'UI polish refused: frontend framework not modelled by any lane.',
|
|
204
|
+
});
|
|
205
|
+
}
|
|
187
206
|
const stack_label = _stack_label(state);
|
|
188
207
|
const next_round = rounds + 1;
|
|
189
208
|
let findings_line =
|
|
@@ -203,6 +222,7 @@ function _delegate_to_polish_skill(
|
|
|
203
222
|
questions: [
|
|
204
223
|
agent_directive(directive),
|
|
205
224
|
`> Stack: \`${stack_label}\`. Polish round ${next_round} of ${ceiling}.`,
|
|
225
|
+
bundle_line(stack_label, 'build'),
|
|
206
226
|
findings_line,
|
|
207
227
|
'> Fix chart-type / contrast findings against the adopted ' +
|
|
208
228
|
"corpus rows (design-intelligence § 'Grounding the " +
|
|
@@ -336,7 +356,7 @@ function _classify_token_violations(
|
|
|
336
356
|
tokens: Record<string, Any>,
|
|
337
357
|
): [Record<string, Any>[], Record<string, Any>[]] {
|
|
338
358
|
const matched: Record<string, Any>[] = [];
|
|
339
|
-
// Insertion-ordered map keyed by `${category}
|
|
359
|
+
// Insertion-ordered map keyed by `${category}\0${value}` to mirror the
|
|
340
360
|
// Python `dict[tuple[str, str], int]` insertion order.
|
|
341
361
|
const unmatched_counts = new Map<string, { category: string; value: string; count: number }>();
|
|
342
362
|
for (const finding of findings) {
|
|
@@ -356,7 +376,7 @@ function _classify_token_violations(
|
|
|
356
376
|
matched.push(finding);
|
|
357
377
|
continue;
|
|
358
378
|
}
|
|
359
|
-
const key = `${category}
|
|
379
|
+
const key = `${category}\0${value}`;
|
|
360
380
|
const existing = unmatched_counts.get(key);
|
|
361
381
|
if (existing) {
|
|
362
382
|
existing.count += 1;
|
|
@@ -16,13 +16,24 @@ import {
|
|
|
16
16
|
StepResult,
|
|
17
17
|
agent_directive,
|
|
18
18
|
} from '../../delivery_state.js';
|
|
19
|
+
import {
|
|
20
|
+
UNSUPPORTED_LANE,
|
|
21
|
+
bundle_line,
|
|
22
|
+
unsupported_stack_questions,
|
|
23
|
+
} from './stack_bundles.js';
|
|
19
24
|
|
|
20
|
-
/** Map `state.stack.frontend` → agent-directive
|
|
25
|
+
/** Map `state.stack.frontend` → agent-directive verb. */
|
|
21
26
|
export const STACK_DIRECTIVES: Record<string, string> = {
|
|
22
27
|
'blade-livewire-flux': 'ui-design-review-blade-livewire-flux',
|
|
28
|
+
'blade-livewire': 'ui-design-review-blade-livewire',
|
|
29
|
+
filament: 'ui-design-review-filament',
|
|
23
30
|
'react-shadcn': 'ui-design-review-react-shadcn',
|
|
31
|
+
react: 'ui-design-review-react',
|
|
24
32
|
vue: 'ui-design-review-vue',
|
|
25
33
|
plain: 'ui-design-review-plain',
|
|
34
|
+
// Present so the `keys == KNOWN_STACKS` invariant holds. Never emitted —
|
|
35
|
+
// the step intercepts this lane and refuses instead of dispatching.
|
|
36
|
+
unknown: 'ui-design-review-unsupported',
|
|
26
37
|
};
|
|
27
38
|
|
|
28
39
|
/** Fallback directive when `state.stack` is missing or malformed. */
|
|
@@ -181,12 +192,20 @@ function _stack_label(state: DeliveryState): string {
|
|
|
181
192
|
function _delegate_to_review_skill(state: DeliveryState): StepResult {
|
|
182
193
|
const directive = _resolve_directive(state);
|
|
183
194
|
const stack_label = _stack_label(state);
|
|
195
|
+
if (stack_label === UNSUPPORTED_LANE) {
|
|
196
|
+
return new StepResult({
|
|
197
|
+
outcome: Outcome.BLOCKED,
|
|
198
|
+
questions: unsupported_stack_questions('review'),
|
|
199
|
+
message: 'UI review refused: frontend framework not modelled by any lane.',
|
|
200
|
+
});
|
|
201
|
+
}
|
|
184
202
|
return new StepResult({
|
|
185
203
|
outcome: Outcome.BLOCKED,
|
|
186
204
|
questions: [
|
|
187
205
|
agent_directive(directive),
|
|
188
206
|
`> Stack: \`${stack_label}\`. Reviewing rendered components ` +
|
|
189
207
|
'against the locked design brief.',
|
|
208
|
+
bundle_line(stack_label, 'review'),
|
|
190
209
|
'> The review pass compares `state.ticket.ui_apply.rendered` ' +
|
|
191
210
|
'against `state.ui_design` (microcopy, states, a11y, layout) ' +
|
|
192
211
|
'and produces a structured `findings` list.',
|
|
@@ -294,7 +313,7 @@ function _filter_known(violations: Any[], known: Any[]): Any[] {
|
|
|
294
313
|
* scalars, mirroring Python tuple-equality in a JS `Set`.
|
|
295
314
|
*/
|
|
296
315
|
function _keyOf(rule: Any, selector: Any): string {
|
|
297
|
-
return `${_tag(rule)}
|
|
316
|
+
return `${_tag(rule)}\0${_tag(selector)}`;
|
|
298
317
|
}
|
|
299
318
|
|
|
300
319
|
function _tag(v: Any): string {
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Verb → skill-bundle map for the stack-dispatched UI steps.
|
|
3
|
+
*
|
|
4
|
+
* The UI steps halt with `@agent-directive: ui-apply-<stack>` (and the
|
|
5
|
+
* `ui-design-review-` / `ui-polish-` equivalents). Those names are **directive
|
|
6
|
+
* verbs, not skill paths** — the same shape as `run-tests`, `create-plan`, and
|
|
7
|
+
* `apply-plan`, which likewise resolve to no skill file. Only 2 of the engine's
|
|
8
|
+
* 11 literal verbs name a real skill, so a verb is something the agent
|
|
9
|
+
* interprets, and the mapping from verb to the skills that implement it is a
|
|
10
|
+
* separate fact that has to be written down somewhere.
|
|
11
|
+
*
|
|
12
|
+
* Before this module that mapping lived only in a prose table in
|
|
13
|
+
* `docs/contracts/ui-track-flow.md`. Nothing verified it, and two of its four
|
|
14
|
+
* rows were wrong: `vue` pointed at the directive verb itself (naming no skill
|
|
15
|
+
* at all) and `plain` — which is also the fallback for every unrecognised
|
|
16
|
+
* project — pointed at `blade-ui`, a skill whose frontmatter is
|
|
17
|
+
* `packs: [laravel]` and which a non-Laravel consumer therefore does not have
|
|
18
|
+
* installed.
|
|
19
|
+
*
|
|
20
|
+
* Keeping the map here makes it checkable: `lint_ui_stack_bundles` asserts every
|
|
21
|
+
* member resolves to a real skill, and that no lane reachable without the
|
|
22
|
+
* `laravel` pack names a `laravel`-only skill. A CI check in this repo cannot
|
|
23
|
+
* see a consumer's installed pack combination, so the second assertion is the
|
|
24
|
+
* part that actually prevents the `plain → blade-ui` class of defect.
|
|
25
|
+
*/
|
|
26
|
+
|
|
27
|
+
/** Skills that implement a lane, in the order the agent should load them. */
|
|
28
|
+
export interface StackBundle {
|
|
29
|
+
/** Skills that build / fix UI for this lane (`apply`, `polish`). */
|
|
30
|
+
readonly build: ReadonlyArray<string>;
|
|
31
|
+
/** Skills that review UI for this lane (`review`). */
|
|
32
|
+
readonly review: ReadonlyArray<string>;
|
|
33
|
+
/**
|
|
34
|
+
* True when every skill above ships outside the framework packs, i.e. the
|
|
35
|
+
* lane is safe as a fallback for a consumer whose packs we cannot predict.
|
|
36
|
+
* Only lanes marked `pack_agnostic` may be used as `DEFAULT_*`.
|
|
37
|
+
*/
|
|
38
|
+
readonly pack_agnostic: boolean;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* The pack-agnostic pair. Both live in `engineering-base`, so they are present
|
|
43
|
+
* in every install; both self-describe as stack-neutral
|
|
44
|
+
* (`ui-component-architect`: "the same lens applies to Blade, Livewire, React,
|
|
45
|
+
* or Vue trees"; `tailwind-engineer`: "the **how** for any Tailwind-stack
|
|
46
|
+
* screen"). This is the honest floor for a lane with no framework-specific
|
|
47
|
+
* executor — not a claim that the lane is fully served.
|
|
48
|
+
*/
|
|
49
|
+
const GENERIC_BUILD: ReadonlyArray<string> = ['ui-component-architect', 'tailwind-engineer'];
|
|
50
|
+
|
|
51
|
+
/** `design-review` is stack-neutral and ships in `engineering-base`. */
|
|
52
|
+
const GENERIC_REVIEW: ReadonlyArray<string> = ['design-review'];
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Lane → bundle. Keys mirror `KNOWN_STACKS`; the dispatch tables in
|
|
56
|
+
* `apply` / `review` / `polish` keep their own verb strings (a tested public
|
|
57
|
+
* contract) and consume this map only to name the skills in the halt body.
|
|
58
|
+
*/
|
|
59
|
+
export const STACK_BUNDLES: Readonly<Record<string, StackBundle>> = {
|
|
60
|
+
'blade-livewire-flux': {
|
|
61
|
+
build: ['flux', 'livewire', 'blade-ui'],
|
|
62
|
+
review: GENERIC_REVIEW,
|
|
63
|
+
pack_agnostic: false,
|
|
64
|
+
},
|
|
65
|
+
// Livewire without Flux — the common Laravel frontend. Previously fell
|
|
66
|
+
// into `plain` because detection required Livewire AND Flux.
|
|
67
|
+
'blade-livewire': {
|
|
68
|
+
build: ['livewire', 'blade-ui'],
|
|
69
|
+
review: GENERIC_REVIEW,
|
|
70
|
+
pack_agnostic: false,
|
|
71
|
+
},
|
|
72
|
+
// Filament is Livewire + Blade + Tailwind under the hood; the same
|
|
73
|
+
// executors apply. A Filament-specific skill is gated on evidence that
|
|
74
|
+
// these produce unusable output for it, not assumed.
|
|
75
|
+
filament: {
|
|
76
|
+
build: ['livewire', 'blade-ui'],
|
|
77
|
+
review: GENERIC_REVIEW,
|
|
78
|
+
pack_agnostic: false,
|
|
79
|
+
},
|
|
80
|
+
'react-shadcn': {
|
|
81
|
+
build: ['react-shadcn-ui'],
|
|
82
|
+
review: GENERIC_REVIEW,
|
|
83
|
+
pack_agnostic: false,
|
|
84
|
+
},
|
|
85
|
+
// React without Radix/shadcn. `react-shadcn-ui` still carries the React
|
|
86
|
+
// component idiom; the shadcn-specific parts simply do not apply.
|
|
87
|
+
react: {
|
|
88
|
+
build: ['react-shadcn-ui'],
|
|
89
|
+
review: GENERIC_REVIEW,
|
|
90
|
+
pack_agnostic: false,
|
|
91
|
+
},
|
|
92
|
+
// No Vue executor exists. The previous prose row pointed at the directive
|
|
93
|
+
// verb itself, which named nothing; the generic pair is a smaller lie and a
|
|
94
|
+
// stated one — the halt body says the lane has no Vue-specific skill.
|
|
95
|
+
vue: {
|
|
96
|
+
build: GENERIC_BUILD,
|
|
97
|
+
review: GENERIC_REVIEW,
|
|
98
|
+
pack_agnostic: true,
|
|
99
|
+
},
|
|
100
|
+
plain: {
|
|
101
|
+
build: GENERIC_BUILD,
|
|
102
|
+
review: GENERIC_REVIEW,
|
|
103
|
+
pack_agnostic: true,
|
|
104
|
+
},
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Lanes served by the stack-neutral pair rather than a framework executor.
|
|
109
|
+
*
|
|
110
|
+
* `plain` and `vue` share the bundle but not the meaning, and the halt body has
|
|
111
|
+
* to say which it is. For `plain` the pair IS the right answer — there is no
|
|
112
|
+
* framework to be idiomatic about. For `vue` it is a gap: a Vue project has a
|
|
113
|
+
* definite idiom and the package has no executor for it, so the result must not
|
|
114
|
+
* read as Vue support.
|
|
115
|
+
*/
|
|
116
|
+
export const GENERIC_LANES: ReadonlySet<string> = new Set(['vue', 'plain']);
|
|
117
|
+
|
|
118
|
+
/** Lanes where the stack-neutral pair is the correct answer, not a shortfall. */
|
|
119
|
+
const NATIVELY_GENERIC_LANES: ReadonlySet<string> = new Set(['plain']);
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* The label detection returns for a framework it recognises but does not
|
|
123
|
+
* model. Mirrors `stack/detect.ts::UNSUPPORTED_STACK`; duplicated as a literal
|
|
124
|
+
* because this module is import-free by design (the detector is a leaf module
|
|
125
|
+
* the directives must not depend on).
|
|
126
|
+
*/
|
|
127
|
+
export const UNSUPPORTED_LANE = 'unknown';
|
|
128
|
+
|
|
129
|
+
/** Return the bundle for `stack`, or the `plain` bundle when unmapped. */
|
|
130
|
+
export function bundle_for(stack: string): StackBundle {
|
|
131
|
+
return STACK_BUNDLES[stack] ?? (STACK_BUNDLES['plain'] as StackBundle);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Questions for the refusal halt on an unmodelled framework.
|
|
136
|
+
*
|
|
137
|
+
* Not a directive — there is nothing honest to dispatch to. The agent names
|
|
138
|
+
* the actual markers from the manifest (it has filesystem access; the engine
|
|
139
|
+
* deliberately does not carry them on `StackResult`), and the user chooses
|
|
140
|
+
* between the stack-neutral floor and stopping.
|
|
141
|
+
*/
|
|
142
|
+
export function unsupported_stack_questions(step: string): string[] {
|
|
143
|
+
return [
|
|
144
|
+
'> Detection found a frontend framework this package does not model, ' +
|
|
145
|
+
`so there is no \`${step}\` lane for it.`,
|
|
146
|
+
'> Name the markers you see in `composer.json` / `package.json` so the ' +
|
|
147
|
+
'choice below is made on the real stack, not on a guess.',
|
|
148
|
+
'> 1. Continue on the stack-neutral floor — `ui-component-architect` + ' +
|
|
149
|
+
'`tailwind-engineer`. Output will not be idiomatic for this ' +
|
|
150
|
+
'framework; say so in the result.',
|
|
151
|
+
'> 2. Abort — drop this UI request and add a lane first ' +
|
|
152
|
+
'(`docs/contracts/ui-stack-extension.md`).',
|
|
153
|
+
];
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* Render the "load these skills" line for a dispatch halt.
|
|
158
|
+
*
|
|
159
|
+
* The engine cannot load a skill itself; naming the bundle is what stops the
|
|
160
|
+
* agent from resolving an unresolvable verb by guessing. A lane with no
|
|
161
|
+
* framework-specific executor says that outright rather than presenting the
|
|
162
|
+
* generic pair as if it were stack support.
|
|
163
|
+
*/
|
|
164
|
+
export function bundle_line(stack: string, role: 'build' | 'review'): string {
|
|
165
|
+
const bundle = bundle_for(stack);
|
|
166
|
+
const skills = role === 'review' ? bundle.review : bundle.build;
|
|
167
|
+
const rendered = skills.map((name) => `\`${name}\``).join(' + ');
|
|
168
|
+
if (NATIVELY_GENERIC_LANES.has(stack)) {
|
|
169
|
+
return `> Skills: ${rendered} — stack-neutral, which is what \`${stack}\` means.`;
|
|
170
|
+
}
|
|
171
|
+
if (GENERIC_LANES.has(stack)) {
|
|
172
|
+
return (
|
|
173
|
+
`> Skills: ${rendered} — there is no \`${stack}\`-specific executor, ` +
|
|
174
|
+
'so this is the stack-neutral floor, not idiomatic ' +
|
|
175
|
+
`\`${stack}\`. Say so in the result.`
|
|
176
|
+
);
|
|
177
|
+
}
|
|
178
|
+
return `> Skills: ${rendered}.`;
|
|
179
|
+
}
|
|
@@ -17,17 +17,35 @@
|
|
|
17
17
|
*
|
|
18
18
|
* 1. `composer.json` lists `livewire/livewire` AND `livewire/flux` →
|
|
19
19
|
* `blade-livewire-flux`
|
|
20
|
-
* 2. `
|
|
20
|
+
* 2. `composer.json` lists `filament/filament` → `filament` (before bare
|
|
21
|
+
* Livewire: Filament pulls Livewire in transitively)
|
|
22
|
+
* 3. `composer.json` lists `livewire/livewire` → `blade-livewire`
|
|
23
|
+
* 4. `package.json` lists `react` AND any of `@radix-ui/*`,
|
|
21
24
|
* `shadcn-ui` or has a `components.json` (the shadcn marker file)
|
|
22
25
|
* → `react-shadcn`
|
|
23
|
-
*
|
|
24
|
-
*
|
|
26
|
+
* 5. `package.json` lists `react` → `react`
|
|
27
|
+
* 6. `package.json` lists `vue` (any major) → `vue`
|
|
28
|
+
* 7. Either manifest names a recognised-but-unmodelled framework
|
|
29
|
+
* (Svelte, Angular, Nuxt, Astro, Solid, Qwik, Inertia) → `unknown`
|
|
30
|
+
* 8. Otherwise → `plain`
|
|
31
|
+
*
|
|
32
|
+
* Rules 3, 5 and 7 exist because the earlier table sent three common
|
|
33
|
+
* shapes into `plain`: Laravel+Livewire without Flux failed rule 1's `&&`,
|
|
34
|
+
* React without Radix failed rule 4, and every unmodelled framework was
|
|
35
|
+
* indistinguishable from a genuinely plain project. `plain` now means "no
|
|
36
|
+
* frontend markers"; `unknown` means "a framework we do not model", and
|
|
37
|
+
* dispatch refuses on it rather than handing over generic tooling silently.
|
|
25
38
|
*
|
|
26
39
|
* Detection is filesystem-cheap: at most three small JSON reads per
|
|
27
40
|
* project root. Errors (missing file, malformed JSON, missing `require`
|
|
28
41
|
* section) downgrade to `plain` rather than raising — a wrong stack
|
|
29
42
|
* label is recoverable (audit catches it, user can override), but a
|
|
30
43
|
* crash mid-dispatch is not.
|
|
44
|
+
*
|
|
45
|
+
* Root manifests only, by design: a monorepo caller passes the workspace
|
|
46
|
+
* root that carries the manifest it cares about. Note the consequence —
|
|
47
|
+
* a caller that always passes the repository root gets `plain` for a
|
|
48
|
+
* monorepo, so the caller owns scope selection, not the detector.
|
|
31
49
|
*/
|
|
32
50
|
import * as fs from 'node:fs';
|
|
33
51
|
import * as path from 'node:path';
|
|
@@ -43,18 +61,59 @@ import * as path from 'node:path';
|
|
|
43
61
|
*/
|
|
44
62
|
export const KNOWN_STACKS: ReadonlySet<string> = new Set([
|
|
45
63
|
'blade-livewire-flux',
|
|
64
|
+
'blade-livewire',
|
|
65
|
+
'filament',
|
|
46
66
|
'react-shadcn',
|
|
67
|
+
'react',
|
|
47
68
|
'vue',
|
|
48
69
|
'plain',
|
|
70
|
+
'unknown',
|
|
49
71
|
]);
|
|
50
72
|
|
|
51
|
-
/**
|
|
73
|
+
/**
|
|
74
|
+
* Label for a project with no frontend markers at all.
|
|
75
|
+
*
|
|
76
|
+
* `plain` used to carry two meanings — "genuinely a plain HTML/Tailwind
|
|
77
|
+
* project" and "detection failed, here is generic tooling anyway" — which made
|
|
78
|
+
* a loud failure impossible without punishing real plain projects. The second
|
|
79
|
+
* meaning is now {@link UNSUPPORTED_STACK}.
|
|
80
|
+
*/
|
|
52
81
|
export const DEFAULT_STACK = 'plain';
|
|
53
82
|
|
|
83
|
+
/**
|
|
84
|
+
* Label for a project whose frontend IS recognisable but is not modelled.
|
|
85
|
+
*
|
|
86
|
+
* Dispatch refuses on this label instead of degrading to generic tooling: a
|
|
87
|
+
* Filament or Svelte project silently routed to a Tailwind-only bundle is
|
|
88
|
+
* user-hostile precisely because the output looks like it worked.
|
|
89
|
+
*/
|
|
90
|
+
export const UNSUPPORTED_STACK = 'unknown';
|
|
91
|
+
|
|
54
92
|
const _SHADCN_RADIX_PREFIX = '@radix-ui/';
|
|
55
93
|
const _SHADCN_PACKAGE_NAMES: ReadonlySet<string> = new Set(['shadcn-ui', 'shadcn']);
|
|
56
94
|
const _FLUX_PACKAGE = 'livewire/flux';
|
|
57
95
|
const _LIVEWIRE_PACKAGE = 'livewire/livewire';
|
|
96
|
+
const _FILAMENT_PACKAGE = 'filament/filament';
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Frontend markers this package recognises but does not model.
|
|
100
|
+
*
|
|
101
|
+
* One of these present means detection **succeeded** at recognising a
|
|
102
|
+
* framework and the package simply has no lane for it — the `unknown` case,
|
|
103
|
+
* not the `plain` case. Keep the list short and factual; a marker leaves it
|
|
104
|
+
* only when a real lane exists.
|
|
105
|
+
*/
|
|
106
|
+
const _UNMODELLED_MARKERS: ReadonlyArray<string> = [
|
|
107
|
+
'svelte',
|
|
108
|
+
'@angular/core',
|
|
109
|
+
'nuxt',
|
|
110
|
+
'astro',
|
|
111
|
+
'solid-js',
|
|
112
|
+
'@builder.io/qwik',
|
|
113
|
+
'@inertiajs/vue3',
|
|
114
|
+
'@inertiajs/react',
|
|
115
|
+
'inertiajs/inertia-laravel',
|
|
116
|
+
];
|
|
58
117
|
|
|
59
118
|
/**
|
|
60
119
|
* A heterogeneous JSON object, mirroring a Python `dict[str, object]`.
|
|
@@ -109,14 +168,51 @@ export function detect_stack(project_root: string): StackResult {
|
|
|
109
168
|
return new StackResult({ frontend: 'blade-livewire-flux', mtime });
|
|
110
169
|
}
|
|
111
170
|
|
|
171
|
+
// Filament before bare Livewire: it pulls Livewire in transitively, so a
|
|
172
|
+
// Filament project would otherwise be labelled by its dependency rather
|
|
173
|
+
// than by the framework the developer actually works in.
|
|
174
|
+
if (_has_package(composer, ['require', 'require-dev'], _FILAMENT_PACKAGE)) {
|
|
175
|
+
return new StackResult({ frontend: 'filament', mtime });
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
// Livewire WITHOUT Flux is the common Laravel frontend, not an unknown
|
|
179
|
+
// one. It used to fail the `&&` above and land in `plain`.
|
|
180
|
+
if (_has_package(composer, ['require', 'require-dev'], _LIVEWIRE_PACKAGE)) {
|
|
181
|
+
return new StackResult({ frontend: 'blade-livewire', mtime });
|
|
182
|
+
}
|
|
183
|
+
|
|
112
184
|
if (_is_react_shadcn(pkg, components_json)) {
|
|
113
185
|
return new StackResult({ frontend: 'react-shadcn', mtime });
|
|
114
186
|
}
|
|
115
187
|
|
|
188
|
+
// React without Radix/shadcn is a served stack, not an unknown one.
|
|
189
|
+
if (_has_package(pkg, _PKG_DEP_KEYS, 'react')) {
|
|
190
|
+
return new StackResult({ frontend: 'react', mtime });
|
|
191
|
+
}
|
|
192
|
+
|
|
116
193
|
if (_has_vue(pkg)) {
|
|
117
194
|
return new StackResult({ frontend: 'vue', mtime });
|
|
118
195
|
}
|
|
119
196
|
|
|
197
|
+
// A recognised-but-unmodelled framework is NOT `plain`. Refusing here is
|
|
198
|
+
// the point: `plain` means "no frontend markers", and conflating the two
|
|
199
|
+
// is what let a Svelte or Inertia project receive Tailwind-only tooling
|
|
200
|
+
// and no warning.
|
|
201
|
+
if (_has_unmodelled_marker(composer, pkg)) {
|
|
202
|
+
return new StackResult({ frontend: UNSUPPORTED_STACK, mtime });
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
// Monorepo: no manifest at the root, but one sits in a workspace directory.
|
|
206
|
+
// That is a wrong-scope call, not a plain project — the caller owns scope
|
|
207
|
+
// selection, so say so instead of labelling the whole repo `plain` and
|
|
208
|
+
// dispatching generic tooling at it.
|
|
209
|
+
//
|
|
210
|
+
// A repo with no manifest ANYWHERE stays `plain`: that is greenfield, and
|
|
211
|
+
// the scaffold path depends on it.
|
|
212
|
+
if (mtime === 0.0 && _has_nested_manifest(project_root)) {
|
|
213
|
+
return new StackResult({ frontend: UNSUPPORTED_STACK, mtime });
|
|
214
|
+
}
|
|
215
|
+
|
|
120
216
|
return new StackResult({ frontend: DEFAULT_STACK, mtime });
|
|
121
217
|
}
|
|
122
218
|
|
|
@@ -185,6 +281,61 @@ function _all_dependencies(manifest: Manifest, ...keys: string[]): Manifest {
|
|
|
185
281
|
return merged;
|
|
186
282
|
}
|
|
187
283
|
|
|
284
|
+
/** Dependency sections a `package.json` can carry. */
|
|
285
|
+
const _PKG_DEP_KEYS: ReadonlyArray<string> = [
|
|
286
|
+
'dependencies',
|
|
287
|
+
'devDependencies',
|
|
288
|
+
'peerDependencies',
|
|
289
|
+
'optionalDependencies',
|
|
290
|
+
];
|
|
291
|
+
|
|
292
|
+
/** True when `name` appears in any of `manifest`'s named dependency sections. */
|
|
293
|
+
function _has_package(
|
|
294
|
+
manifest: Manifest,
|
|
295
|
+
sections: ReadonlyArray<string>,
|
|
296
|
+
name: string,
|
|
297
|
+
): boolean {
|
|
298
|
+
return name in _all_dependencies(manifest, ...sections);
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
/** Workspace directories a monorepo conventionally puts its packages in. */
|
|
302
|
+
const _WORKSPACE_DIRS: ReadonlyArray<string> = ['packages', 'apps', 'services', 'libs'];
|
|
303
|
+
|
|
304
|
+
/**
|
|
305
|
+
* True when no root manifest exists but a workspace directory holds one.
|
|
306
|
+
*
|
|
307
|
+
* Deliberately shallow — one `readdir` per conventional workspace directory,
|
|
308
|
+
* one `stat` per child. It answers "was this called at the wrong scope?", not
|
|
309
|
+
* "where is the real project", which stays the caller's job.
|
|
310
|
+
*/
|
|
311
|
+
function _has_nested_manifest(project_root: string): boolean {
|
|
312
|
+
for (const dir of _WORKSPACE_DIRS) {
|
|
313
|
+
const base = path.join(project_root, dir);
|
|
314
|
+
let entries: string[];
|
|
315
|
+
try {
|
|
316
|
+
entries = fs.readdirSync(base);
|
|
317
|
+
} catch {
|
|
318
|
+
continue;
|
|
319
|
+
}
|
|
320
|
+
for (const entry of entries) {
|
|
321
|
+
if (
|
|
322
|
+
_is_file(path.join(base, entry, 'composer.json')) ||
|
|
323
|
+
_is_file(path.join(base, entry, 'package.json'))
|
|
324
|
+
) {
|
|
325
|
+
return true;
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
return false;
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
/** True when either manifest names a framework we recognise but do not model. */
|
|
333
|
+
function _has_unmodelled_marker(composer: Manifest, pkg: Manifest): boolean {
|
|
334
|
+
const composer_deps = _all_dependencies(composer, 'require', 'require-dev');
|
|
335
|
+
const pkg_deps = _all_dependencies(pkg, ..._PKG_DEP_KEYS);
|
|
336
|
+
return _UNMODELLED_MARKERS.some((marker) => marker in composer_deps || marker in pkg_deps);
|
|
337
|
+
}
|
|
338
|
+
|
|
188
339
|
function _is_blade_livewire_flux(composer: Manifest): boolean {
|
|
189
340
|
const deps = _all_dependencies(composer, 'require', 'require-dev');
|
|
190
341
|
return _LIVEWIRE_PACKAGE in deps && _FLUX_PACKAGE in deps;
|
|
@@ -629,10 +629,12 @@ function _validate_app_spec(app_spec: JsonValue): void {
|
|
|
629
629
|
* agent-directive that populates it. An empty dict is the in-progress
|
|
630
630
|
* shape after the skill returns but before the brief lands; the gate
|
|
631
631
|
* treats it the same as `null`. Once populated, `design_confirmed`
|
|
632
|
-
* (when present) must be a bool
|
|
633
|
-
* `
|
|
634
|
-
*
|
|
635
|
-
*
|
|
632
|
+
* (when present) must be a bool, and `states` (when present and not
|
|
633
|
+
* `null`) must be an object — the design gate's per-state loop is
|
|
634
|
+
* object-guarded, so a string or list would bypass all five checks.
|
|
635
|
+
* The remaining keys (`layout`, `components`, `microcopy`, `a11y`,
|
|
636
|
+
* `reused_from_audit`) are validated by the design handler against the
|
|
637
|
+
* skill contract — the schema only enforces shape, not content.
|
|
636
638
|
*/
|
|
637
639
|
function _validate_ui_design(ui_design: JsonValue): void {
|
|
638
640
|
if (ui_design === null) {
|
|
@@ -652,6 +654,21 @@ function _validate_ui_design(ui_design: JsonValue): void {
|
|
|
652
654
|
'state.ui_design.design_confirmed must be a boolean when present',
|
|
653
655
|
);
|
|
654
656
|
}
|
|
657
|
+
// `states` is shape-checked here, not left to the handler. The design
|
|
658
|
+
// gate's per-state loop was guarded on "is this an object", so a string or
|
|
659
|
+
// list silently skipped all five required-state checks — the gate passed
|
|
660
|
+
// while covering no state at all. Rejecting the wrong shape at the schema
|
|
661
|
+
// boundary means the loop can no longer be bypassed by type.
|
|
662
|
+
if (
|
|
663
|
+
'states' in ui_design &&
|
|
664
|
+
ui_design['states'] !== null &&
|
|
665
|
+
!_isDict(ui_design['states'])
|
|
666
|
+
) {
|
|
667
|
+
throw new SchemaError(
|
|
668
|
+
'state.ui_design.states must be a JSON object (one key per ' +
|
|
669
|
+
`required state) or null; got ${pyTypeName(ui_design['states'])}`,
|
|
670
|
+
);
|
|
671
|
+
}
|
|
655
672
|
}
|
|
656
673
|
|
|
657
674
|
/**
|
|
@@ -145,6 +145,36 @@ rule_loading_tier: __RULE_LOADING_TIER__
|
|
|
145
145
|
lean_projection:
|
|
146
146
|
mode: eager-all
|
|
147
147
|
|
|
148
|
+
# --- Telegraph condensation (output-side) ---
|
|
149
|
+
#
|
|
150
|
+
# speak_scope: off | prose_only | aggressive (QUOTE the value — bare `off` is a
|
|
151
|
+
# YAML 1.1 boolean, not the string)
|
|
152
|
+
#
|
|
153
|
+
# `off` is the shipped default per docs/adrs/telegraph/0001-default-off-until-bench.md
|
|
154
|
+
# (Status: accepted) and docs/contracts/condensation-default-kill-criterion.md.
|
|
155
|
+
# Reason it is off: the only output-side bench (telegraph-v1, n=10, 2026-05-16)
|
|
156
|
+
# measured median vs_terse -9.27% (API counts) / -5.47% (exact cl100k_base
|
|
157
|
+
# re-analysis) — telegraph emits MORE tokens than a plain "be terse" instruction.
|
|
158
|
+
# The kill-criterion table therefore lands on "criterion not met — defer" and the
|
|
159
|
+
# telemetry multiplier stays suspended (0.9155 < 1.0).
|
|
160
|
+
#
|
|
161
|
+
# NOTE: `speak_scope: off` disables the BEHAVIOUR but not the COST — the projector
|
|
162
|
+
# gates this rule on `telegraph.speak`, never on speak_scope, so under
|
|
163
|
+
# `lean_projection.mode: eager-all` the ~982-token body still ships every session.
|
|
164
|
+
# Set `speak: false` for zero-cost dormancy.
|
|
165
|
+
#
|
|
166
|
+
# Stated explicitly here because until 2026-07-29 this default existed only in
|
|
167
|
+
# prose — and two prose sources disagreed (the rule said prose_only, the accepted
|
|
168
|
+
# ADR said off). Do not flip without a passing output-side bench.
|
|
169
|
+
telegraph:
|
|
170
|
+
# speak: false = DORMANT (the shipped default per docs/adrs/telegraph/0002).
|
|
171
|
+
# The rule is omitted from dist/router.json entirely, so its ~982-token body
|
|
172
|
+
# never ships. This — not speak_scope — is the lever that stops the cost:
|
|
173
|
+
# compile_router gates on `speak` and never reads speak_scope.
|
|
174
|
+
# Set true only after an output-side bench clears the kill-criterion bar.
|
|
175
|
+
speak: false
|
|
176
|
+
speak_scope: "off"
|
|
177
|
+
|
|
148
178
|
# --- Token-rich skills governance ---
|
|
149
179
|
#
|
|
150
180
|
# Skills marked `token_budget_class: rich` in their frontmatter are exempt
|
|
@@ -642,7 +672,7 @@ subagents:
|
|
|
642
672
|
# delegate frontier-priced or speculative work. `resolveShippedDefault()`
|
|
643
673
|
# remains the telemetry-driven DEMOTION gate: a measured regression demotes
|
|
644
674
|
# back to `ask`.
|
|
645
|
-
auto: on
|
|
675
|
+
auto: "on"
|
|
646
676
|
|
|
647
677
|
# Route delegable sub-tasks to the lowest-capable model tier (cost + speed
|
|
648
678
|
# via model downshift). true (default) = downshift per declared model_tier;
|
|
@@ -1114,7 +1144,7 @@ decision_engine:
|
|
|
1114
1144
|
# low = refuse to advance when band is below low
|
|
1115
1145
|
# medium = refuse when below medium
|
|
1116
1146
|
# high = refuse when below high
|
|
1117
|
-
min_confidence: off
|
|
1147
|
+
min_confidence: "off"
|
|
1118
1148
|
|
|
1119
1149
|
# Risk-class ceiling for Phase=Implement.
|
|
1120
1150
|
# off = no ceiling (default)
|