@event4u/agent-config 1.15.0 → 1.17.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/.agent-src/commands/{agents-audit.md → agents/audit.md} +4 -3
- package/.agent-src/commands/{agents-cleanup.md → agents/cleanup.md} +12 -6
- package/.agent-src/commands/{agents-prepare.md → agents/prepare.md} +4 -3
- package/.agent-src/commands/agents.md +46 -0
- package/.agent-src/commands/bug-fix.md +1 -1
- package/.agent-src/commands/bug-investigate.md +2 -2
- package/.agent-src/commands/{chat-history-checkpoint.md → chat-history/checkpoint.md} +5 -5
- package/.agent-src/commands/{chat-history-clear.md → chat-history/clear.md} +5 -5
- package/.agent-src/commands/{chat-history-resume.md → chat-history/resume.md} +4 -4
- package/.agent-src/commands/chat-history/show.md +107 -0
- package/.agent-src/commands/chat-history.md +33 -89
- package/.agent-src/commands/check-current-md.md +1 -1
- package/.agent-src/commands/{commit-in-chunks.md → commit/in-chunks.md} +15 -13
- package/.agent-src/commands/commit.md +22 -2
- package/.agent-src/commands/{context-create.md → context/create.md} +4 -3
- package/.agent-src/commands/{context-refactor.md → context/refactor.md} +4 -3
- package/.agent-src/commands/context.md +44 -0
- package/.agent-src/commands/{copilot-agents-init.md → copilot-agents/init.md} +4 -3
- package/.agent-src/commands/{copilot-agents-optimize.md → copilot-agents/optimize.md} +4 -3
- package/.agent-src/commands/copilot-agents.md +44 -0
- package/.agent-src/commands/council/default.md +221 -0
- package/.agent-src/commands/council/design.md +97 -0
- package/.agent-src/commands/council/optimize.md +116 -0
- package/.agent-src/commands/council/pr.md +124 -0
- package/.agent-src/commands/council.md +54 -0
- package/.agent-src/commands/{create-pr-description.md → create-pr/description-only.md} +4 -2
- package/.agent-src/commands/create-pr.md +49 -5
- package/.agent-src/commands/e2e-heal.md +1 -1
- package/.agent-src/commands/e2e-plan.md +1 -1
- package/.agent-src/commands/{feature-dev.md → feature/dev.md} +6 -3
- package/.agent-src/commands/{feature-explore.md → feature/explore.md} +5 -4
- package/.agent-src/commands/{feature-plan.md → feature/plan.md} +32 -5
- package/.agent-src/commands/{feature-refactor.md → feature/refactor.md} +4 -3
- package/.agent-src/commands/{feature-roadmap.md → feature/roadmap.md} +7 -6
- package/.agent-src/commands/feature.md +52 -0
- package/.agent-src/commands/{fix-ci.md → fix/ci.md} +4 -3
- package/.agent-src/commands/{fix-portability.md → fix/portability.md} +4 -3
- package/.agent-src/commands/{fix-pr-bot-comments.md → fix/pr-bots.md} +4 -3
- package/.agent-src/commands/{fix-pr-developer-comments.md → fix/pr-developers.md} +4 -3
- package/.agent-src/commands/{fix-pr-comments.md → fix/pr.md} +7 -6
- package/.agent-src/commands/{fix-references.md → fix/refs.md} +4 -3
- package/.agent-src/commands/{fix-seeder.md → fix/seeder.md} +4 -3
- package/.agent-src/commands/fix.md +54 -0
- package/.agent-src/commands/jira-ticket.md +1 -1
- package/.agent-src/commands/{do-and-judge.md → judge/on-diff.md} +7 -6
- package/.agent-src/commands/judge/solo.md +90 -0
- package/.agent-src/commands/{do-in-steps.md → judge/steps.md} +8 -7
- package/.agent-src/commands/judge.md +35 -70
- package/.agent-src/commands/{memory-add.md → memory/add.md} +7 -6
- package/.agent-src/commands/{memory-full.md → memory/load.md} +6 -5
- package/.agent-src/commands/{memory-promote.md → memory/promote.md} +6 -5
- package/.agent-src/commands/{propose-memory.md → memory/propose.md} +6 -5
- package/.agent-src/commands/memory.md +48 -0
- package/.agent-src/commands/mode.md +5 -5
- package/.agent-src/commands/{module-create.md → module/create.md} +4 -3
- package/.agent-src/commands/{module-explore.md → module/explore.md} +4 -3
- package/.agent-src/commands/module.md +44 -0
- package/.agent-src/commands/onboard.md +3 -3
- package/.agent-src/commands/{optimize-agents.md → optimize/agents.md} +5 -4
- package/.agent-src/commands/{optimize-augmentignore.md → optimize/augmentignore.md} +4 -4
- package/.agent-src/commands/{optimize-rtk-filters.md → optimize/rtk.md} +4 -3
- package/.agent-src/commands/{optimize-skills.md → optimize/skills.md} +5 -4
- package/.agent-src/commands/optimize.md +48 -0
- package/.agent-src/commands/{override-create.md → override/create.md} +4 -3
- package/.agent-src/commands/{override-manage.md → override/manage.md} +4 -3
- package/.agent-src/commands/override.md +44 -0
- package/.agent-src/commands/review-changes.md +26 -1
- package/.agent-src/commands/review-routing.md +1 -1
- package/.agent-src/commands/{roadmap-create.md → roadmap/create.md} +33 -5
- package/.agent-src/commands/{roadmap-execute.md → roadmap/execute.md} +4 -3
- package/.agent-src/commands/roadmap.md +44 -0
- package/.agent-src/commands/set-cost-profile.md +3 -3
- package/.agent-src/commands/sync-agent-settings.md +2 -2
- package/.agent-src/commands/{tests-create.md → tests/create.md} +5 -4
- package/.agent-src/commands/{tests-execute.md → tests/execute.md} +4 -3
- package/.agent-src/commands/tests.md +44 -0
- package/.agent-src/commands/upstream-contribute.md +1 -1
- package/.agent-src/contexts/authority/commit-mechanics.md +57 -0
- package/.agent-src/contexts/authority/destructive-mechanics.md +66 -0
- package/.agent-src/contexts/authority/scope-mechanics.md +87 -0
- package/.agent-src/contexts/communication/rules-auto/artifact-engagement-recording-mechanics.md +72 -0
- package/.agent-src/contexts/communication/rules-auto/augment-portability-mechanics.md +79 -0
- package/.agent-src/contexts/communication/rules-auto/augment-source-of-truth-mechanics.md +98 -0
- package/.agent-src/contexts/communication/rules-auto/cli-output-handling-mechanics.md +87 -0
- package/.agent-src/contexts/communication/rules-auto/command-suggestion-policy-mechanics.md +62 -0
- package/.agent-src/contexts/communication/rules-auto/docs-sync-mechanics.md +78 -0
- package/.agent-src/contexts/communication/rules-auto/package-ci-checks-mechanics.md +85 -0
- package/.agent-src/contexts/communication/rules-auto/review-routing-awareness-mechanics.md +65 -0
- package/.agent-src/contexts/communication/rules-auto/roadmap-progress-sync-mechanics.md +78 -0
- package/.agent-src/contexts/communication/rules-auto/skill-quality-mechanics.md +62 -0
- package/.agent-src/contexts/communication/rules-auto/slash-command-routing-policy-mechanics.md +55 -0
- package/.agent-src/contexts/communication/rules-auto/ui-audit-gate-mechanics.md +53 -0
- package/.agent-src/contexts/communication/rules-auto/user-interaction-mechanics.md +77 -0
- package/.agent-src/contexts/execution/autonomy-detection.md +54 -0
- package/.agent-src/contexts/execution/autonomy-examples.md +90 -0
- package/.agent-src/contexts/execution/autonomy-mechanics.md +29 -0
- package/.agent-src/contexts/execution/verification-mechanics.md +80 -0
- package/.agent-src/contexts/judges/no-consolidate-rationale.md +102 -0
- package/.agent-src/contexts/judges/persona-voice-rubric.md +140 -0
- package/.agent-src/personas/README.md +1 -1
- package/.agent-src/rules/agent-authority.md +24 -0
- package/.agent-src/rules/architecture.md +1 -1
- package/.agent-src/rules/artifact-drafting-protocol.md +1 -1
- package/.agent-src/rules/artifact-engagement-recording.md +14 -70
- package/.agent-src/rules/ask-when-uncertain.md +28 -43
- package/.agent-src/rules/augment-portability.md +15 -61
- package/.agent-src/rules/augment-source-of-truth.md +27 -93
- package/.agent-src/rules/autonomous-execution.md +78 -114
- package/.agent-src/rules/capture-learnings.md +1 -1
- package/.agent-src/rules/chat-history-cadence.md +3 -3
- package/.agent-src/rules/chat-history-ownership.md +3 -3
- package/.agent-src/rules/chat-history-visibility.md +3 -3
- package/.agent-src/rules/cli-output-handling.md +10 -76
- package/.agent-src/rules/command-suggestion-policy.md +93 -0
- package/.agent-src/rules/commit-conventions.md +17 -14
- package/.agent-src/rules/commit-policy.md +14 -42
- package/.agent-src/rules/context-hygiene.md +3 -3
- package/.agent-src/rules/direct-answers.md +34 -49
- package/.agent-src/rules/docker-commands.md +5 -5
- package/.agent-src/rules/docs-sync.md +16 -70
- package/.agent-src/rules/e2e-testing.md +1 -1
- package/.agent-src/rules/guidelines.md +4 -4
- package/.agent-src/rules/improve-before-implement.md +2 -2
- package/.agent-src/rules/language-and-tone.md +50 -133
- package/.agent-src/rules/minimal-safe-diff.md +3 -3
- package/.agent-src/rules/missing-tool-handling.md +28 -22
- package/.agent-src/rules/model-recommendation.md +4 -4
- package/.agent-src/rules/no-cheap-questions.md +82 -0
- package/.agent-src/rules/no-roadmap-references.md +73 -0
- package/.agent-src/rules/non-destructive-by-default.md +15 -49
- package/.agent-src/rules/onboarding-gate.md +5 -5
- package/.agent-src/rules/package-ci-checks.md +21 -61
- package/.agent-src/rules/preservation-guard.md +64 -29
- package/.agent-src/rules/review-routing-awareness.md +26 -45
- package/.agent-src/rules/roadmap-progress-sync.md +28 -96
- package/.agent-src/rules/role-mode-adherence.md +2 -2
- package/.agent-src/rules/scope-control.md +65 -46
- package/.agent-src/rules/security-sensitive-stop.md +9 -9
- package/.agent-src/rules/size-enforcement.md +1 -1
- package/.agent-src/rules/skill-quality.md +16 -48
- package/.agent-src/rules/{slash-commands.md → slash-command-routing-policy.md} +7 -4
- package/.agent-src/rules/think-before-action.md +55 -45
- package/.agent-src/rules/token-efficiency.md +4 -4
- package/.agent-src/rules/tool-safety.md +19 -16
- package/.agent-src/rules/{ui-audit-before-build.md → ui-audit-gate.md} +27 -41
- package/.agent-src/rules/user-interaction.md +16 -71
- package/.agent-src/rules/verify-before-complete.md +12 -67
- package/.agent-src/scripts/update_roadmap_progress.py +9 -4
- package/.agent-src/skills/ai-council/SKILL.md +335 -0
- package/.agent-src/skills/api-endpoint/SKILL.md +2 -2
- package/.agent-src/skills/api-testing/SKILL.md +1 -1
- package/.agent-src/skills/blade-ui/SKILL.md +1 -1
- package/.agent-src/skills/blast-radius-analyzer/SKILL.md +1 -1
- package/.agent-src/skills/bug-analyzer/SKILL.md +1 -1
- package/.agent-src/skills/check-refs/SKILL.md +59 -40
- package/.agent-src/skills/command-routing/SKILL.md +1 -1
- package/.agent-src/skills/command-writing/SKILL.md +1 -1
- package/.agent-src/skills/conventional-commits-writing/SKILL.md +86 -28
- package/.agent-src/skills/copilot-agents-optimization/SKILL.md +7 -7
- package/.agent-src/skills/developer-like-execution/SKILL.md +6 -6
- package/.agent-src/skills/finishing-a-development-branch/SKILL.md +101 -65
- package/.agent-src/skills/flux/SKILL.md +31 -11
- package/.agent-src/skills/git-workflow/SKILL.md +1 -1
- package/.agent-src/skills/github-ci/SKILL.md +2 -2
- package/.agent-src/skills/guideline-writing/SKILL.md +11 -11
- package/.agent-src/skills/judge-code-quality/SKILL.md +7 -8
- package/.agent-src/skills/judge-security-auditor/SKILL.md +4 -5
- package/.agent-src/skills/judge-test-coverage/SKILL.md +3 -4
- package/.agent-src/skills/learning-to-rule-or-skill/SKILL.md +4 -4
- package/.agent-src/skills/lint-skills/SKILL.md +57 -39
- package/.agent-src/skills/livewire/SKILL.md +1 -1
- package/.agent-src/skills/md-language-check/SKILL.md +61 -39
- package/.agent-src/skills/override-management/SKILL.md +7 -7
- package/.agent-src/skills/php-coder/SKILL.md +1 -1
- package/.agent-src/skills/playwright-testing/SKILL.md +2 -2
- package/.agent-src/skills/quality-tools/SKILL.md +2 -2
- package/.agent-src/skills/react-shadcn-ui/SKILL.md +116 -43
- package/.agent-src/skills/readme-reviewer/SKILL.md +31 -30
- package/.agent-src/skills/readme-writing/SKILL.md +79 -54
- package/.agent-src/skills/readme-writing-package/SKILL.md +51 -48
- package/.agent-src/skills/receiving-code-review/SKILL.md +53 -48
- package/.agent-src/skills/refine-prompt/SKILL.md +0 -1
- package/.agent-src/skills/requesting-code-review/SKILL.md +35 -30
- package/.agent-src/skills/review-routing/SKILL.md +2 -2
- package/.agent-src/skills/rule-writing/SKILL.md +1 -1
- package/.agent-src/skills/security/SKILL.md +7 -2
- package/.agent-src/skills/security-audit/SKILL.md +7 -3
- package/.agent-src/skills/skill-reviewer/SKILL.md +1 -1
- package/.agent-src/skills/skill-writing/SKILL.md +3 -3
- package/.agent-src/skills/subagent-orchestration/SKILL.md +1 -0
- package/.agent-src/skills/systematic-debugging/SKILL.md +69 -61
- package/.agent-src/skills/test-driven-development/SKILL.md +59 -57
- package/.agent-src/skills/test-performance/SKILL.md +0 -1
- package/.agent-src/skills/traefik/SKILL.md +4 -4
- package/.agent-src/skills/upstream-contribute/SKILL.md +1 -1
- package/.agent-src/skills/validate-feature-fit/SKILL.md +2 -2
- package/.agent-src/skills/{verify-before-complete → verify-completion-evidence}/SKILL.md +30 -28
- package/.agent-src/templates/agent-settings.md +8 -8
- package/.agent-src/templates/contexts/auth-model.md +1 -1
- package/.agent-src/templates/scripts/README.md +2 -2
- package/.agent-src/templates/scripts/telemetry/aggregator.py +16 -1
- package/.agent-src/templates/scripts/telemetry/engagement.py +59 -0
- package/.agent-src/templates/scripts/telemetry/report_renderer.py +28 -1
- package/.agent-src/templates/scripts/telemetry_record.py +14 -1
- package/.claude-plugin/marketplace.json +31 -12
- package/AGENTS.md +11 -9
- package/CHANGELOG.md +213 -2
- package/README.md +43 -44
- package/config/agent-settings.template.yml +58 -1
- package/config/gitignore-block.txt +3 -0
- package/docs/architecture.md +5 -7
- package/docs/catalog.md +359 -0
- package/docs/contracts/STABILITY.md +46 -1
- package/docs/contracts/adr-chat-history-split.md +1 -3
- package/docs/contracts/adr-command-suggestion.md +3 -5
- package/docs/contracts/adr-implement-ticket-runtime.md +1 -2
- package/docs/contracts/adr-product-ui-track.md +5 -8
- package/docs/contracts/adr-prompt-driven-execution.md +3 -4
- package/docs/contracts/agent-memory-contract.md +8 -13
- package/docs/contracts/artifact-engagement-flow.md +7 -10
- package/docs/contracts/command-clusters.md +56 -46
- package/docs/contracts/command-suggestion-flow.md +4 -6
- package/docs/contracts/context-paths.md +99 -0
- package/docs/contracts/file-ownership-matrix.json +6722 -0
- package/docs/contracts/file-ownership-matrix.md +134 -0
- package/docs/contracts/implement-ticket-flow.md +8 -11
- package/docs/contracts/linear-ai-rules-inclusion.md +1 -2
- package/docs/contracts/linear-ai-three-layers.md +0 -2
- package/docs/contracts/load-context-budget-model.md +178 -0
- package/docs/contracts/load-context-schema.md +184 -0
- package/docs/contracts/rule-interactions.md +0 -1
- package/docs/contracts/rule-interactions.yml +96 -0
- package/docs/contracts/rule-priority-hierarchy.md +87 -0
- package/docs/contracts/ui-track-flow.md +8 -18
- package/docs/customization.md +16 -0
- package/docs/end-to-end-walkthroughs.md +165 -0
- package/docs/getting-started.md +29 -10
- package/docs/github-topics.md +12 -3
- package/docs/guidelines/agent-infra/asking-and-brevity-examples.md +100 -0
- package/docs/guidelines/agent-infra/language-and-tone-examples.md +79 -0
- package/{.agent-src → docs}/guidelines/docs/readme-size-and-splitting.md +26 -25
- package/docs/guidelines/php/git.md +164 -0
- package/docs/migrations/commands-1.15.0.md +1 -1
- package/docs/showcase.md +9 -4
- package/docs/skills-catalog.md +14 -8
- package/docs/ui-track-mental-model.md +2 -2
- package/llms.txt +13 -7
- package/package.json +1 -1
- package/scripts/_one_off_phase4_dispatch_latency.py +108 -0
- package/scripts/_one_off_phase6_trigger_jaccard.py +92 -0
- package/scripts/_phase2_shim_helper.py +109 -0
- package/scripts/agent-config +33 -0
- package/scripts/ai_council/__init__.py +39 -0
- package/scripts/ai_council/_default_prices.py +41 -0
- package/scripts/ai_council/_one_off_2a4_acceptance.py +208 -0
- package/scripts/ai_council/_one_off_context_layer_v1_estimate.py +67 -0
- package/scripts/ai_council/_one_off_context_layer_v1_review.py +292 -0
- package/scripts/ai_council/_one_off_followups_review.py +259 -0
- package/scripts/ai_council/_one_off_nondestructive_inline_audit.py +209 -0
- package/scripts/ai_council/_one_off_phase_2a_budget_rebalance.py +257 -0
- package/scripts/ai_council/_one_off_phase_2a_post_revert.py +197 -0
- package/scripts/ai_council/_one_off_rebalancing_audit.py +149 -0
- package/scripts/ai_council/_one_off_roundtrip.py +106 -0
- package/scripts/ai_council/_one_off_rule_hardening_v1.py +251 -0
- package/scripts/ai_council/_one_off_structural_open_questions.py +232 -0
- package/scripts/ai_council/_one_off_structural_optimization.py +144 -0
- package/scripts/ai_council/_one_off_structural_v3_gaps.py +252 -0
- package/scripts/ai_council/_one_off_structural_v3_review.py +240 -0
- package/scripts/ai_council/budget_guard.py +172 -0
- package/scripts/ai_council/bundler.py +261 -0
- package/scripts/ai_council/clients.py +381 -0
- package/scripts/ai_council/modes.py +127 -0
- package/scripts/ai_council/orchestrator.py +350 -0
- package/scripts/ai_council/pricing.py +213 -0
- package/scripts/ai_council/project_context.py +159 -0
- package/scripts/ai_council/prompts.py +232 -0
- package/scripts/ai_council/session.py +144 -0
- package/scripts/check_always_budget.py +444 -0
- package/scripts/check_augmentignore.py +69 -0
- package/scripts/check_cluster_patterns.py +159 -0
- package/scripts/check_command_count_messaging.py +127 -0
- package/scripts/check_context_paths.py +201 -0
- package/scripts/check_no_roadmap_refs.py +155 -0
- package/scripts/check_phase_coupling.py +148 -0
- package/scripts/check_portability.py +57 -0
- package/scripts/check_public_catalog_links.py +122 -0
- package/scripts/check_references.py +33 -3
- package/scripts/check_roadmap_trackable.py +111 -0
- package/scripts/check_safety_floor_untouched.py +125 -0
- package/scripts/command_suggester/cooldown.py +1 -1
- package/scripts/command_suggester/loader.py +4 -1
- package/scripts/compress.py +59 -13
- package/scripts/generate_index.py +270 -0
- package/scripts/generate_ownership_matrix.py +323 -0
- package/scripts/hooks/augment-roadmap-progress.sh +57 -0
- package/scripts/install.py +49 -28
- package/scripts/install_anthropic_key.sh +5 -0
- package/scripts/install_openai_key.sh +106 -0
- package/scripts/lint_load_context.py +163 -0
- package/scripts/lint_no_new_atomic_commands.py +12 -11
- package/scripts/requirements-evals.txt +1 -0
- package/scripts/roadmap_progress_hook.py +159 -0
- package/scripts/schemas/command.schema.json +22 -1
- package/scripts/schemas/rule.schema.json +10 -0
- package/scripts/skill_linter.py +13 -4
- package/scripts/sync_agent_settings.py +26 -3
- package/scripts/update_counts.py +16 -4
- package/scripts/update_prices.py +124 -0
- package/.agent-src/guidelines/php/git.md +0 -96
- package/.agent-src/rules/command-suggestion.md +0 -134
- /package/{.agent-src → docs}/guidelines/agent-infra/agent-interaction-and-decision-quality.md +0 -0
- /package/{.agent-src → docs}/guidelines/agent-infra/break-glass-usage.md +0 -0
- /package/{.agent-src → docs}/guidelines/agent-infra/developer-judgment.md +0 -0
- /package/{.agent-src → docs}/guidelines/agent-infra/engineering-memory-data-format.md +0 -0
- /package/{.agent-src → docs}/guidelines/agent-infra/layered-settings.md +0 -0
- /package/{.agent-src → docs}/guidelines/agent-infra/memory-access.md +0 -0
- /package/{.agent-src → docs}/guidelines/agent-infra/naming.md +0 -0
- /package/{.agent-src → docs}/guidelines/agent-infra/output-patterns.md +0 -0
- /package/{.agent-src → docs}/guidelines/agent-infra/review-routing-data-format.md +0 -0
- /package/{.agent-src → docs}/guidelines/agent-infra/role-contracts.md +0 -0
- /package/{.agent-src → docs}/guidelines/agent-infra/role-mode-router.md +0 -0
- /package/{.agent-src → docs}/guidelines/agent-infra/runtime-layer.md +0 -0
- /package/{.agent-src → docs}/guidelines/agent-infra/self-improvement-pipeline.md +0 -0
- /package/{.agent-src → docs}/guidelines/agent-infra/size-and-scope.md +0 -0
- /package/{.agent-src → docs}/guidelines/agent-infra/tool-integration.md +0 -0
- /package/{.agent-src → docs}/guidelines/e2e/playwright.md +0 -0
- /package/{.agent-src → docs}/guidelines/php/api-design.md +0 -0
- /package/{.agent-src → docs}/guidelines/php/artisan-commands.md +0 -0
- /package/{.agent-src → docs}/guidelines/php/blade-ui.md +0 -0
- /package/{.agent-src → docs}/guidelines/php/controllers.md +0 -0
- /package/{.agent-src → docs}/guidelines/php/database.md +0 -0
- /package/{.agent-src → docs}/guidelines/php/eloquent.md +0 -0
- /package/{.agent-src → docs}/guidelines/php/flux.md +0 -0
- /package/{.agent-src → docs}/guidelines/php/general.md +0 -0
- /package/{.agent-src → docs}/guidelines/php/jobs.md +0 -0
- /package/{.agent-src → docs}/guidelines/php/livewire.md +0 -0
- /package/{.agent-src → docs}/guidelines/php/logging.md +0 -0
- /package/{.agent-src → docs}/guidelines/php/naming.md +0 -0
- /package/{.agent-src → docs}/guidelines/php/patterns/dependency-injection.md +0 -0
- /package/{.agent-src → docs}/guidelines/php/patterns/dtos.md +0 -0
- /package/{.agent-src → docs}/guidelines/php/patterns/events.md +0 -0
- /package/{.agent-src → docs}/guidelines/php/patterns/factory.md +0 -0
- /package/{.agent-src → docs}/guidelines/php/patterns/pipelines.md +0 -0
- /package/{.agent-src → docs}/guidelines/php/patterns/policies.md +0 -0
- /package/{.agent-src → docs}/guidelines/php/patterns/repositories.md +0 -0
- /package/{.agent-src → docs}/guidelines/php/patterns/service-layer.md +0 -0
- /package/{.agent-src → docs}/guidelines/php/patterns/strategy.md +0 -0
- /package/{.agent-src → docs}/guidelines/php/patterns.md +0 -0
- /package/{.agent-src → docs}/guidelines/php/performance.md +0 -0
- /package/{.agent-src → docs}/guidelines/php/resources.md +0 -0
- /package/{.agent-src → docs}/guidelines/php/security.md +0 -0
- /package/{.agent-src → docs}/guidelines/php/sql.md +0 -0
- /package/{.agent-src → docs}/guidelines/php/validations.md +0 -0
- /package/{.agent-src → docs}/guidelines/php/websocket.md +0 -0
package/scripts/skill_linter.py
CHANGED
|
@@ -136,9 +136,7 @@ def read_text(path: Path) -> str:
|
|
|
136
136
|
# --- Role-contract anchor cache (see road-to-role-modes Phase 1) ---
|
|
137
137
|
# Populated lazily so the linter stays fast when the guideline is absent.
|
|
138
138
|
_ROLE_CONTRACT_CANDIDATES = (
|
|
139
|
-
Path("
|
|
140
|
-
Path(".agent-src/guidelines/agent-infra/role-contracts.md"),
|
|
141
|
-
Path(".augment/guidelines/agent-infra/role-contracts.md"),
|
|
139
|
+
Path("docs/guidelines/agent-infra/role-contracts.md"),
|
|
142
140
|
)
|
|
143
141
|
_ROLE_CONTRACT_SLUGS_CACHE: Optional[set[str]] = None
|
|
144
142
|
|
|
@@ -373,7 +371,8 @@ def lint_skill(path: Path, text: str) -> LintResult:
|
|
|
373
371
|
|
|
374
372
|
if description:
|
|
375
373
|
if len(description) > 200:
|
|
376
|
-
issues.append(Issue("
|
|
374
|
+
issues.append(Issue("error", "description_too_long",
|
|
375
|
+
f"Description is {len(description)} chars (hard cap: 200) — see road-to-governance-cleanup F6"))
|
|
377
376
|
for pattern in TRIGGER_WARNING_PATTERNS:
|
|
378
377
|
if re.search(pattern, description, re.IGNORECASE):
|
|
379
378
|
issues.append(Issue("warning", "weak_trigger", f"Description looks too generic: {description}"))
|
|
@@ -716,6 +715,12 @@ def lint_rule(path: Path, text: str) -> LintResult:
|
|
|
716
715
|
if not description:
|
|
717
716
|
issues.append(Issue("error", "auto_missing_description", "Auto rules require a 'description' field for matching"))
|
|
718
717
|
|
|
718
|
+
# description length cap (F6 — 200-char hard cap, see road-to-governance-cleanup)
|
|
719
|
+
rule_description = extract_description(text)
|
|
720
|
+
if rule_description and len(rule_description) > 200:
|
|
721
|
+
issues.append(Issue("error", "description_too_long",
|
|
722
|
+
f"Description is {len(rule_description)} chars (hard cap: 200) — see road-to-governance-cleanup F6"))
|
|
723
|
+
|
|
719
724
|
# always-rules that look like auto candidates (rule-type-governance check)
|
|
720
725
|
if rule_type == "always":
|
|
721
726
|
description = extract_description(text) or ""
|
|
@@ -863,6 +868,9 @@ def lint_command(path: Path, text: str) -> LintResult:
|
|
|
863
868
|
description = extract_description(text)
|
|
864
869
|
if not description:
|
|
865
870
|
issues.append(Issue("warning", "missing_description", "Frontmatter description is missing"))
|
|
871
|
+
elif len(description) > 200:
|
|
872
|
+
issues.append(Issue("error", "description_too_long",
|
|
873
|
+
f"Description is {len(description)} chars (hard cap: 200) — see road-to-governance-cleanup F6"))
|
|
866
874
|
|
|
867
875
|
# suggestion block (road-to-context-aware-command-suggestion Phase 2)
|
|
868
876
|
issues.extend(_lint_command_suggestion_block(text))
|
|
@@ -878,6 +886,7 @@ def lint_command(path: Path, text: str) -> LintResult:
|
|
|
878
886
|
"error", "shim_missing_warning",
|
|
879
887
|
"Deprecation shim must contain a one-line warning matching "
|
|
880
888
|
"'⚠️ /<old-name> is deprecated; use /<cluster> <sub> instead.'"
|
|
889
|
+
" (or '/<cluster> --<flag>' for flag-clusters)"
|
|
881
890
|
" (see docs/contracts/command-clusters.md § Deprecation shim contract)"
|
|
882
891
|
))
|
|
883
892
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"""Sync `.agent-settings.yml` against the template + profile.
|
|
3
3
|
|
|
4
4
|
Applies the section-aware merge rules documented in
|
|
5
|
-
|
|
5
|
+
`docs/guidelines/agent-infra/layered-settings.md`:
|
|
6
6
|
|
|
7
7
|
- Template section order always wins — reorder keys to match.
|
|
8
8
|
- Existing user scalar values are preserved verbatim (as parsed).
|
|
@@ -136,8 +136,31 @@ def _append_unknown(body: str, user_flat: dict[str, object], known: set[str]) ->
|
|
|
136
136
|
|
|
137
137
|
|
|
138
138
|
def render_target(template_body: str, user_data: dict) -> str:
|
|
139
|
-
"""Return the desired `.agent-settings.yml` body for the given user data.
|
|
140
|
-
|
|
139
|
+
"""Return the desired `.agent-settings.yml` body for the given user data.
|
|
140
|
+
|
|
141
|
+
The trailing ``_user:`` block (emitted by :func:`_append_unknown`) is
|
|
142
|
+
already in dotted-key form on every read after the first sync. Re-
|
|
143
|
+
flattening it would prepend another ``_user.`` segment on every run
|
|
144
|
+
and accumulate forever, so we strip the wrapper and merge its
|
|
145
|
+
contents straight into the flat dict.
|
|
146
|
+
"""
|
|
147
|
+
if user_data:
|
|
148
|
+
user_only = user_data.pop("_user", None) if isinstance(user_data, dict) else None
|
|
149
|
+
user_flat = _flatten(user_data)
|
|
150
|
+
if isinstance(user_only, dict):
|
|
151
|
+
for key, value in user_only.items():
|
|
152
|
+
# Dotted keys round-trip verbatim — never re-flatten them.
|
|
153
|
+
if isinstance(key, str):
|
|
154
|
+
# Heal legacy corruption: pre-fix syncs prepended a
|
|
155
|
+
# `_user.` segment per run, so a key may carry an
|
|
156
|
+
# arbitrary number of them. Strip them all back to
|
|
157
|
+
# the original leaf path.
|
|
158
|
+
healed = key
|
|
159
|
+
while healed.startswith("_user."):
|
|
160
|
+
healed = healed[len("_user."):]
|
|
161
|
+
user_flat[healed] = value
|
|
162
|
+
else:
|
|
163
|
+
user_flat = {}
|
|
141
164
|
known = _template_keys(template_body)
|
|
142
165
|
body = _apply_user_values(template_body, user_flat)
|
|
143
166
|
return _append_unknown(body, user_flat, known)
|
package/scripts/update_counts.py
CHANGED
|
@@ -28,14 +28,22 @@ def count(kind: str) -> int:
|
|
|
28
28
|
if kind == "skills":
|
|
29
29
|
return sum(1 for _ in (SRC / "skills").rglob("SKILL.md"))
|
|
30
30
|
if kind == "guidelines":
|
|
31
|
-
# guidelines
|
|
32
|
-
|
|
31
|
+
# Guidelines live under docs/guidelines/{topic}/ — they are reference
|
|
32
|
+
# material, not packaged artefacts. Recursive walk to count every .md.
|
|
33
|
+
return sum(1 for _ in (REPO_ROOT / "docs" / "guidelines").rglob("*.md"))
|
|
33
34
|
if kind == "personas":
|
|
34
35
|
# personas live as flat .md files, README excluded
|
|
35
36
|
pdir = SRC / "personas"
|
|
36
37
|
if not pdir.exists():
|
|
37
38
|
return 0
|
|
38
39
|
return sum(1 for f in pdir.glob("*.md") if f.name != "README.md")
|
|
40
|
+
if kind == "commands":
|
|
41
|
+
# Commands may be flat (`commands/<name>.md`) or nested under a
|
|
42
|
+
# cluster directory (`commands/<cluster>/<sub>.md`). Walk the tree
|
|
43
|
+
# and skip the AGENTS.md reference orchestrator.
|
|
44
|
+
return sum(
|
|
45
|
+
1 for f in (SRC / kind).rglob("*.md") if f.name != "AGENTS.md"
|
|
46
|
+
)
|
|
39
47
|
return sum(1 for _ in (SRC / kind).glob("*.md"))
|
|
40
48
|
|
|
41
49
|
|
|
@@ -47,12 +55,16 @@ TARGETS: list[tuple[str, list[tuple[str, str]]]] = [
|
|
|
47
55
|
[
|
|
48
56
|
(r"(Browse all )(\d+)( commands\])", "commands"),
|
|
49
57
|
(r"(package \(rules \+ )(\d+)( skills)", "skills"),
|
|
50
|
-
(r"(skills \+ )(\d+)( native commands)", "commands"),
|
|
51
58
|
# Hero line: **NNN Skills** · **NNN Rules** · **NNN Commands** · **NNN Guidelines**
|
|
52
59
|
(r"(<strong>)(\d+)( Skills</strong>)", "skills"),
|
|
53
60
|
(r"(<strong>)(\d+)( Rules</strong>)", "rules"),
|
|
54
|
-
(r"(<strong>)(\d+)( Commands</strong>)", "commands"),
|
|
55
61
|
(r"(<strong>)(\d+)( Guidelines</strong>)", "guidelines"),
|
|
62
|
+
# NOTE: hero `<strong>N Commands</strong>` and tools-blurb
|
|
63
|
+
# `skills + N native commands` are owned by
|
|
64
|
+
# `check_command_count_messaging.py` (Phase-1.2 of
|
|
65
|
+
# road-to-pr-34-followups). Those surfaces advertise the
|
|
66
|
+
# **active** command count (total − deprecation shims), not
|
|
67
|
+
# the raw file count this script computes.
|
|
56
68
|
],
|
|
57
69
|
),
|
|
58
70
|
(
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Refresh `.agent-prices.md` from the LiteLLM model-prices feed.
|
|
3
|
+
|
|
4
|
+
Source: https://raw.githubusercontent.com/BerriAI/litellm/main/
|
|
5
|
+
model_prices_and_context_window.json
|
|
6
|
+
|
|
7
|
+
Network failure or invalid response → fall back to
|
|
8
|
+
`scripts.ai_council._default_prices.DEFAULT_PRICES` so the file is
|
|
9
|
+
always written. Stdlib only; no extra dependency.
|
|
10
|
+
|
|
11
|
+
Usage:
|
|
12
|
+
python3 scripts/update_prices.py # writes .agent-prices.md
|
|
13
|
+
python3 scripts/update_prices.py --check # exit 1 if file is stale
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
from __future__ import annotations
|
|
17
|
+
|
|
18
|
+
import argparse
|
|
19
|
+
import datetime as _dt
|
|
20
|
+
import json
|
|
21
|
+
import sys
|
|
22
|
+
import urllib.error
|
|
23
|
+
import urllib.request
|
|
24
|
+
from pathlib import Path
|
|
25
|
+
|
|
26
|
+
REPO_ROOT = Path(__file__).resolve().parents[1]
|
|
27
|
+
sys.path.insert(0, str(REPO_ROOT))
|
|
28
|
+
|
|
29
|
+
from scripts.ai_council._default_prices import DEFAULT_PRICES, as_rows # noqa: E402
|
|
30
|
+
from scripts.ai_council.pricing import ( # noqa: E402
|
|
31
|
+
PRICES_FILE,
|
|
32
|
+
_render_markdown,
|
|
33
|
+
is_stale,
|
|
34
|
+
load_prices,
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
LITELLM_URL = (
|
|
38
|
+
"https://raw.githubusercontent.com/BerriAI/litellm/main/"
|
|
39
|
+
"model_prices_and_context_window.json"
|
|
40
|
+
)
|
|
41
|
+
HTTP_TIMEOUT_SECONDS = 10
|
|
42
|
+
|
|
43
|
+
# Models we surface in the table. Anything not in this allow-list is
|
|
44
|
+
# dropped from the LiteLLM payload; users can add more by editing the
|
|
45
|
+
# Markdown file directly.
|
|
46
|
+
ALLOW_LIST: set[tuple[str, str]] = set(DEFAULT_PRICES.keys())
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def _fetch_litellm() -> dict[str, dict[str, object]] | None:
|
|
50
|
+
try:
|
|
51
|
+
req = urllib.request.Request(LITELLM_URL, headers={"User-Agent": "agent-config"})
|
|
52
|
+
with urllib.request.urlopen(req, timeout=HTTP_TIMEOUT_SECONDS) as resp:
|
|
53
|
+
data = json.loads(resp.read().decode("utf-8"))
|
|
54
|
+
if not isinstance(data, dict):
|
|
55
|
+
return None
|
|
56
|
+
return data
|
|
57
|
+
except (urllib.error.URLError, TimeoutError, json.JSONDecodeError, OSError) as exc:
|
|
58
|
+
print(f"[update_prices] upstream unreachable: {exc}", file=sys.stderr)
|
|
59
|
+
return None
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def _to_rows_from_litellm(payload: dict[str, dict[str, object]]) -> list[tuple[str, str, float, float]]:
|
|
63
|
+
"""Translate LiteLLM keys into our (provider, model, input_per_1m, output_per_1m) tuples."""
|
|
64
|
+
rows: list[tuple[str, str, float, float]] = []
|
|
65
|
+
for key, entry in payload.items():
|
|
66
|
+
if not isinstance(entry, dict):
|
|
67
|
+
continue
|
|
68
|
+
provider = str(entry.get("litellm_provider", "")).lower()
|
|
69
|
+
# LiteLLM keys are sometimes "provider/model"; strip the prefix.
|
|
70
|
+
model = key.split("/", 1)[1] if "/" in key else key
|
|
71
|
+
if (provider, model) not in ALLOW_LIST:
|
|
72
|
+
continue
|
|
73
|
+
in_cost = entry.get("input_cost_per_token")
|
|
74
|
+
out_cost = entry.get("output_cost_per_token")
|
|
75
|
+
if not isinstance(in_cost, (int, float)) or not isinstance(out_cost, (int, float)):
|
|
76
|
+
continue
|
|
77
|
+
# LiteLLM ships per-token USD; convert to per-1M.
|
|
78
|
+
rows.append((provider, model, float(in_cost) * 1_000_000, float(out_cost) * 1_000_000))
|
|
79
|
+
rows.sort()
|
|
80
|
+
return rows
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def refresh(path: Path = PRICES_FILE) -> str:
|
|
84
|
+
"""Write a fresh `.agent-prices.md`. Returns the source label used."""
|
|
85
|
+
payload = _fetch_litellm()
|
|
86
|
+
if payload is not None:
|
|
87
|
+
rows = _to_rows_from_litellm(payload)
|
|
88
|
+
if rows:
|
|
89
|
+
today = _dt.datetime.now(_dt.timezone.utc).date().isoformat()
|
|
90
|
+
path.write_text(_render_markdown(today, "litellm-github", rows), encoding="utf-8")
|
|
91
|
+
return "litellm-github"
|
|
92
|
+
# Network or filter failed → shipped defaults.
|
|
93
|
+
today = _dt.datetime.now(_dt.timezone.utc).date().isoformat()
|
|
94
|
+
path.write_text(_render_markdown(today, "shipped-default", as_rows()), encoding="utf-8")
|
|
95
|
+
return "shipped-default"
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
def _cmd_check(path: Path) -> int:
|
|
99
|
+
if not path.exists():
|
|
100
|
+
print(f"[update_prices] {path} missing — run `python3 scripts/update_prices.py`")
|
|
101
|
+
return 1
|
|
102
|
+
table = load_prices(path)
|
|
103
|
+
if is_stale(table):
|
|
104
|
+
print(f"[update_prices] {path} stale (last_updated={table.last_updated})")
|
|
105
|
+
return 1
|
|
106
|
+
print(f"[update_prices] {path} fresh (last_updated={table.last_updated})")
|
|
107
|
+
return 0
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
def main() -> int:
|
|
111
|
+
parser = argparse.ArgumentParser(description=__doc__)
|
|
112
|
+
parser.add_argument("--check", action="store_true", help="exit 1 if stale")
|
|
113
|
+
parser.add_argument("--path", default=str(PRICES_FILE), help="override target path")
|
|
114
|
+
args = parser.parse_args()
|
|
115
|
+
target = Path(args.path)
|
|
116
|
+
if args.check:
|
|
117
|
+
return _cmd_check(target)
|
|
118
|
+
src = refresh(target)
|
|
119
|
+
print(f"[update_prices] wrote {target} (source={src})")
|
|
120
|
+
return 0
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
if __name__ == "__main__":
|
|
124
|
+
sys.exit(main())
|
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
# Git & Version Control Guidelines
|
|
2
|
-
|
|
3
|
-
> Project-specific Git conventions. Branch naming, commit messages, PR workflow.
|
|
4
|
-
|
|
5
|
-
**Related Skills:** `git-workflow`, `conventional-commits-writing`
|
|
6
|
-
**Related Rules:** `commit-conventions.md`
|
|
7
|
-
|
|
8
|
-
## Branch Naming
|
|
9
|
-
|
|
10
|
-
```
|
|
11
|
-
{type}/{ticket-id}/{short-description}
|
|
12
|
-
```
|
|
13
|
-
|
|
14
|
-
Types: `feat/`, `fix/`, `hotfix/`, `chore/`, `docs/`, `test/`
|
|
15
|
-
|
|
16
|
-
```
|
|
17
|
-
feat/DEV-1234/user-notification-preferences
|
|
18
|
-
fix/DEV-5678/null-pointer-in-import
|
|
19
|
-
chore/refactor-agent-setup
|
|
20
|
-
hotfix/DEV-999/critical-payment-bug
|
|
21
|
-
```
|
|
22
|
-
|
|
23
|
-
## Commit Messages
|
|
24
|
-
|
|
25
|
-
See `commit-conventions` rule for base format. Key type selection:
|
|
26
|
-
|
|
27
|
-
- `feat` — new capability. `fix` — bug/regression. `refactor` — structure only, NO behavior change.
|
|
28
|
-
- `docs` — docs only. `test` — tests only. `ci` — CI/workflows. `chore` — maintenance/cleanup.
|
|
29
|
-
- `perf` — performance. `build` — build tooling. `style` — formatting only.
|
|
30
|
-
|
|
31
|
-
**Scope:** Jira ID or area name (`api`, `auth`, `skills`). Only add when it improves clarity.
|
|
32
|
-
|
|
33
|
-
**Description:** Intent, not implementation. Imperative mood. Max 72 chars. No generic filler.
|
|
34
|
-
|
|
35
|
-
**Breaking:** `!` after type/scope or `BREAKING CHANGE:` footer.
|
|
36
|
-
|
|
37
|
-
```
|
|
38
|
-
feat(api)!: rename invoice status values
|
|
39
|
-
refactor(auth)!: remove legacy session flow
|
|
40
|
-
```
|
|
41
|
-
|
|
42
|
-
**Splitting:** Mixed concerns → split commits. Don't hide unrelated changes in one.
|
|
43
|
-
|
|
44
|
-
```
|
|
45
|
-
refactor(skills): remove duplicate routing helpers
|
|
46
|
-
ci(lint): add skill-lint workflow
|
|
47
|
-
docs(readme): document new lint tasks
|
|
48
|
-
```
|
|
49
|
-
|
|
50
|
-
**Squash merge titles:** Conventional Commit format, describe net effect, not every internal commit.
|
|
51
|
-
|
|
52
|
-
### Anti-patterns
|
|
53
|
-
|
|
54
|
-
- `update stuff` / `fix bug` / `changes`
|
|
55
|
-
- `refactor` for bug fixes, `chore` for behavior changes
|
|
56
|
-
- Multiple unrelated concerns in one commit
|
|
57
|
-
|
|
58
|
-
### Decision checklist
|
|
59
|
-
|
|
60
|
-
1. Behavior changed? → `feat` or `fix`
|
|
61
|
-
2. Structure only? → `refactor`
|
|
62
|
-
3. Only docs/tests/CI? → `docs`/`test`/`ci`
|
|
63
|
-
4. Scope useful or noise?
|
|
64
|
-
5. Multiple commits hiding in one?
|
|
65
|
-
|
|
66
|
-
### Examples by area
|
|
67
|
-
|
|
68
|
-
```bash
|
|
69
|
-
# Features
|
|
70
|
-
feat(DEV-2133): send email to customer when product is shipped
|
|
71
|
-
|
|
72
|
-
# Bug fixes
|
|
73
|
-
fix(import): handle null values in equipment JSON
|
|
74
|
-
|
|
75
|
-
# Refactoring
|
|
76
|
-
refactor: extract user sync logic into dedicated service
|
|
77
|
-
|
|
78
|
-
# Skills / Rules / Agent config
|
|
79
|
-
refactor(skills): merge duplicate analysis skills
|
|
80
|
-
feat(rules): add analysis routing quality gate
|
|
81
|
-
fix(skills): restore concrete validation in skill reviewer
|
|
82
|
-
|
|
83
|
-
# CI / Tooling
|
|
84
|
-
ci(lint): add skill linter workflow
|
|
85
|
-
feat(linter): detect pointer-only skills
|
|
86
|
-
|
|
87
|
-
# Docs
|
|
88
|
-
docs(roadmap): add phase 3 implementation plan
|
|
89
|
-
docs(readme): clarify source-of-truth workflow
|
|
90
|
-
```
|
|
91
|
-
|
|
92
|
-
## Pull Requests
|
|
93
|
-
|
|
94
|
-
- PR title: Conventional Commit format — `feat(DEV-1234): short description`
|
|
95
|
-
- Fill PR template, link Jira ticket, ensure quality gates pass
|
|
96
|
-
|
|
@@ -1,134 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
type: "always"
|
|
3
|
-
description: "Surface matching slash commands as numbered options when user intent matches a command's purpose — never auto-executes; user always picks (read-only suggestion layer)."
|
|
4
|
-
alwaysApply: true
|
|
5
|
-
source: package
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# Command Suggestion
|
|
9
|
-
|
|
10
|
-
When the user's prompt matches an eligible slash command, surface it
|
|
11
|
-
as a **numbered option** alongside an "as-is" escape hatch. The user
|
|
12
|
-
always picks. **Nothing auto-executes.** The suggestion layer is a
|
|
13
|
-
read-only shortcut *finder*, not an invocation path.
|
|
14
|
-
|
|
15
|
-
The deterministic engine lives in `scripts/command_suggester/`. The
|
|
16
|
-
locked eligibility table lives in
|
|
17
|
-
[`agents/contexts/command-suggestion-eligibility.md`](../../agents/contexts/command-suggestion-eligibility.md).
|
|
18
|
-
The full design lives in
|
|
19
|
-
[`road-to-context-aware-command-suggestion`](../../agents/roadmaps/road-to-context-aware-command-suggestion.md).
|
|
20
|
-
|
|
21
|
-
## Iron Law — never auto-execute
|
|
22
|
-
|
|
23
|
-
```
|
|
24
|
-
SUGGEST. NEVER INVOKE. THE USER PICKS, ALWAYS.
|
|
25
|
-
```
|
|
26
|
-
|
|
27
|
-
A suggestion block emits options. It does **not** start a command
|
|
28
|
-
flow. The user picking option N triggers `slash-commands` on the
|
|
29
|
-
**next** turn — with all the command's own halts intact.
|
|
30
|
-
|
|
31
|
-
## When to fire
|
|
32
|
-
|
|
33
|
-
On a user turn that matches **all** of the following:
|
|
34
|
-
|
|
35
|
-
1. The message does **not** start with an explicit `/command` (those
|
|
36
|
-
bypass suggestion entirely — see `slash-commands`).
|
|
37
|
-
2. `commands.suggestion.enabled` is `true` (default).
|
|
38
|
-
3. The user has not issued `/command-suggestion-off` in this conversation.
|
|
39
|
-
4. No clarification is owed for the same turn (per
|
|
40
|
-
`ask-when-uncertain` — clarification wins; suggestion can fire next turn).
|
|
41
|
-
5. No active engine flow is mid-halt (e.g. an `/implement-ticket`
|
|
42
|
-
step waiting on the user — the active flow has the floor).
|
|
43
|
-
6. The matcher returns at least one match above the effective
|
|
44
|
-
`confidence_floor` after rank + cooldown + anti-noise.
|
|
45
|
-
|
|
46
|
-
When all six hold, the suggestion block is the **first and only**
|
|
47
|
-
thing the agent emits that turn. No tools, no edits, no other prose.
|
|
48
|
-
|
|
49
|
-
## What to emit
|
|
50
|
-
|
|
51
|
-
Render exactly one numbered-options block conforming to
|
|
52
|
-
`user-interaction`:
|
|
53
|
-
|
|
54
|
-
```
|
|
55
|
-
> 💡 Your request matches a command. Pick one or run the prompt as-is:
|
|
56
|
-
>
|
|
57
|
-
> 1. /implement-ticket — drive ticket end-to-end through refine → plan → implement → test
|
|
58
|
-
> 2. /refine-ticket — tighten the AC and risks on a ticket before planning
|
|
59
|
-
> 3. Just run the prompt as-is, no command
|
|
60
|
-
|
|
61
|
-
**Recommendation: 1 — /implement-ticket** — the request matches its trigger description (`setze ticket abc-123 um`). Pick the last option to skip the command and run the prompt as written.
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
Rules — non-negotiable:
|
|
65
|
-
|
|
66
|
-
- The "run as-is" option is **always present**, **always last**, never removed.
|
|
67
|
-
- At most `commands.suggestion.max_options` command suggestions
|
|
68
|
-
precede the as-is option (default 4 → 5 total).
|
|
69
|
-
- Exactly **one** `Recommendation:` line follows the block, naming
|
|
70
|
-
the highest-scoring command — or no recommendation when the top
|
|
71
|
-
two scores are within 0.05 of each other (single-source-of-truth
|
|
72
|
-
Iron Law from `user-interaction`).
|
|
73
|
-
- Free-text replies count as the as-is option unless they
|
|
74
|
-
unambiguously name one of the listed commands.
|
|
75
|
-
|
|
76
|
-
## Subordination — when to stay silent
|
|
77
|
-
|
|
78
|
-
The suggestion rule is **junior** to:
|
|
79
|
-
|
|
80
|
-
- `scope-control` — never surfaces a git-op command behind a
|
|
81
|
-
permission gate the user already declined this turn.
|
|
82
|
-
- `ask-when-uncertain` — if a clarification is owed, the
|
|
83
|
-
clarification is the only question; suggestion suppresses for
|
|
84
|
-
that turn.
|
|
85
|
-
- `verify-before-complete` — suggestion does not interrupt an
|
|
86
|
-
evidence-gate verification that's already running.
|
|
87
|
-
- Any active role-mode contract (`role-mode-adherence`).
|
|
88
|
-
- Any active engine halt (`/implement-ticket`, `/work`, etc.).
|
|
89
|
-
|
|
90
|
-
On any conflict → suggestion stays silent. Zero output. The user's
|
|
91
|
-
prompt is processed as it would be without this rule.
|
|
92
|
-
|
|
93
|
-
## Anti-noise — silent when uncertain
|
|
94
|
-
|
|
95
|
-
The engine's `rank.py` already drops:
|
|
96
|
-
|
|
97
|
-
- Matches below the `confidence_floor` (default 0.6, per-command
|
|
98
|
-
override in frontmatter).
|
|
99
|
-
- Single matches scoring `< floor + 0.1` with no structural bonus
|
|
100
|
-
(high uncertainty isn't worth interrupting for).
|
|
101
|
-
- Short prompts (< 6 words) hitting > 2 commands with no structural
|
|
102
|
-
bonus (ticket key, file path) — too vague to disambiguate.
|
|
103
|
-
- Pure-continuation messages (`ok`, `weiter`, `mach weiter`, `go on`,
|
|
104
|
-
…) — no new intent signal, no structural bonus → silent.
|
|
105
|
-
- Suggestions that fired for the same `(command, evidence)` pair
|
|
106
|
-
within the cooldown window (default 10m, per-command override).
|
|
107
|
-
|
|
108
|
-
If the engine returns an empty list → emit nothing. The user's
|
|
109
|
-
prompt runs exactly as it would without this rule.
|
|
110
|
-
|
|
111
|
-
## What this rule does NOT do
|
|
112
|
-
|
|
113
|
-
- Invoke any command. Picking option N is what triggers `slash-commands`.
|
|
114
|
-
- Stack with other questions. One numbered-options block per turn.
|
|
115
|
-
- Re-trigger on its own output. Command names emitted in the
|
|
116
|
-
suggestion block are excluded from the next-turn matcher input.
|
|
117
|
-
- Override `enabled: false`, blocklist entries, or per-conversation opt-out.
|
|
118
|
-
- Suggest commands that are not in the locked eligibility table.
|
|
119
|
-
|
|
120
|
-
## Cloud Behavior
|
|
121
|
-
|
|
122
|
-
On cloud surfaces (Claude.ai Web, Skills API) the rule is **inert**
|
|
123
|
-
unless the suggester package is shipped in the bundle. Treat
|
|
124
|
-
`commands.suggestion.enabled` as `false` when the engine is not
|
|
125
|
-
available — degrade silently, never crash the turn.
|
|
126
|
-
|
|
127
|
-
## Interactions
|
|
128
|
-
|
|
129
|
-
- [`slash-commands`](slash-commands.md) — explicit `/command` skips suggestion entirely.
|
|
130
|
-
- [`user-interaction`](user-interaction.md) — numbered-options Iron Law and single-source recommendation.
|
|
131
|
-
- [`ask-when-uncertain`](ask-when-uncertain.md) — clarification wins on conflict.
|
|
132
|
-
- [`scope-control`](scope-control.md) — git-op gates outrank suggestion.
|
|
133
|
-
- [`role-mode-adherence`](role-mode-adherence.md) — active mode contract outranks suggestion.
|
|
134
|
-
- [`agents/contexts/command-suggestion-eligibility.md`](../../agents/contexts/command-suggestion-eligibility.md) — locked eligibility table.
|
/package/{.agent-src → docs}/guidelines/agent-infra/agent-interaction-and-decision-quality.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|