@event4u/agent-config 5.3.0 → 5.4.1
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/agent-handoff.md +1 -0
- package/.agent-src/commands/agent-status.md +1 -0
- package/.agent-src/commands/agents/audit.md +1 -0
- package/.agent-src/commands/agents/init.md +1 -0
- package/.agent-src/commands/agents/optimize.md +1 -0
- package/.agent-src/commands/agents/user/accept.md +1 -0
- package/.agent-src/commands/agents/user/init.md +1 -0
- package/.agent-src/commands/agents/user/review.md +1 -0
- package/.agent-src/commands/agents/user/show.md +1 -0
- package/.agent-src/commands/agents/user/update.md +1 -0
- package/.agent-src/commands/agents/user.md +1 -0
- package/.agent-src/commands/agents.md +1 -0
- package/.agent-src/commands/analytics/prune.md +1 -0
- package/.agent-src/commands/analytics/show.md +1 -0
- package/.agent-src/commands/analytics.md +1 -0
- package/.agent-src/commands/analyze-reference-repo.md +1 -0
- package/.agent-src/commands/bug-fix.md +1 -0
- package/.agent-src/commands/bug-investigate.md +1 -0
- package/.agent-src/commands/challenge-me/vision.md +1 -0
- package/.agent-src/commands/challenge-me/with-docs.md +1 -0
- package/.agent-src/commands/challenge-me.md +1 -0
- package/.agent-src/commands/chat-history/import.md +1 -0
- package/.agent-src/commands/chat-history/learn.md +1 -0
- package/.agent-src/commands/chat-history/show.md +1 -0
- package/.agent-src/commands/chat-history.md +1 -0
- package/.agent-src/commands/check-current-md.md +1 -0
- package/.agent-src/commands/commit/in-chunks.md +1 -0
- package/.agent-src/commands/commit.md +1 -0
- package/.agent-src/commands/condense.md +1 -0
- package/.agent-src/commands/context/create.md +1 -0
- package/.agent-src/commands/context/refactor.md +1 -0
- package/.agent-src/commands/context.md +1 -0
- package/.agent-src/commands/cost-report.md +1 -0
- package/.agent-src/commands/council/analysis.md +1 -0
- package/.agent-src/commands/council/debate.md +1 -0
- package/.agent-src/commands/council/default.md +1 -0
- package/.agent-src/commands/council/design.md +1 -0
- package/.agent-src/commands/council/optimize.md +1 -0
- package/.agent-src/commands/council/pr.md +1 -0
- package/.agent-src/commands/council.md +1 -0
- package/.agent-src/commands/create-pr/description-only.md +1 -0
- package/.agent-src/commands/create-pr.md +1 -0
- package/.agent-src/commands/e2e-heal.md +1 -0
- package/.agent-src/commands/e2e-plan.md +1 -0
- package/.agent-src/commands/estimate-ticket.md +1 -0
- package/.agent-src/commands/feature/dev.md +1 -0
- package/.agent-src/commands/feature/explore.md +1 -0
- package/.agent-src/commands/feature/plan.md +1 -0
- package/.agent-src/commands/feature/refactor.md +1 -0
- package/.agent-src/commands/feature/roadmap.md +1 -0
- package/.agent-src/commands/feature.md +1 -0
- package/.agent-src/commands/fix/ci.md +1 -0
- package/.agent-src/commands/fix/portability.md +1 -0
- package/.agent-src/commands/fix/pr-bot-comments.md +1 -0
- package/.agent-src/commands/fix/pr-comments.md +1 -0
- package/.agent-src/commands/fix/pr-developer-comments.md +1 -0
- package/.agent-src/commands/fix/refs.md +1 -0
- package/.agent-src/commands/fix/seeder.md +1 -0
- package/.agent-src/commands/fix.md +1 -0
- package/.agent-src/commands/ghostwriter/delete.md +1 -0
- package/.agent-src/commands/ghostwriter/fetch.md +1 -0
- package/.agent-src/commands/ghostwriter/list.md +1 -0
- package/.agent-src/commands/ghostwriter/show.md +1 -0
- package/.agent-src/commands/ghostwriter/write.md +1 -0
- package/.agent-src/commands/ghostwriter.md +1 -0
- package/.agent-src/commands/grill-me.md +1 -0
- package/.agent-src/commands/implement-ticket.md +1 -0
- package/.agent-src/commands/jira-ticket.md +1 -0
- package/.agent-src/commands/judge/on-diff.md +1 -0
- package/.agent-src/commands/judge/solo.md +1 -0
- package/.agent-src/commands/judge/steps.md +1 -0
- package/.agent-src/commands/judge.md +1 -0
- package/.agent-src/commands/knowledge/forget.md +1 -0
- package/.agent-src/commands/knowledge/ingest.md +1 -0
- package/.agent-src/commands/knowledge/list.md +1 -0
- package/.agent-src/commands/knowledge.md +1 -0
- package/.agent-src/commands/memory/add.md +1 -0
- package/.agent-src/commands/memory/learn-low-impact.md +1 -0
- package/.agent-src/commands/memory/load.md +1 -0
- package/.agent-src/commands/memory/mine-session.md +1 -0
- package/.agent-src/commands/memory/promote.md +1 -0
- package/.agent-src/commands/memory/propose.md +1 -0
- package/.agent-src/commands/memory.md +1 -0
- package/.agent-src/commands/mode.md +1 -0
- package/.agent-src/commands/module/create.md +1 -0
- package/.agent-src/commands/module/explore.md +1 -0
- package/.agent-src/commands/module.md +1 -0
- package/.agent-src/commands/optimize/agents-dir.md +1 -0
- package/.agent-src/commands/optimize/augmentignore.md +1 -0
- package/.agent-src/commands/optimize/rtk.md +1 -0
- package/.agent-src/commands/optimize/skills.md +1 -0
- package/.agent-src/commands/optimize-prompt.md +1 -0
- package/.agent-src/commands/optimize.md +1 -0
- package/.agent-src/commands/orchestrate.md +1 -0
- package/.agent-src/commands/override/create.md +1 -0
- package/.agent-src/commands/override/manage.md +1 -0
- package/.agent-src/commands/override.md +1 -0
- package/.agent-src/commands/package-reset.md +1 -0
- package/.agent-src/commands/package-test.md +1 -0
- package/.agent-src/commands/post-as/ghostwriter.md +1 -0
- package/.agent-src/commands/post-as/me.md +1 -0
- package/.agent-src/commands/post-as.md +1 -0
- package/.agent-src/commands/prepare-for-review.md +1 -0
- package/.agent-src/commands/project-analyze.md +1 -0
- package/.agent-src/commands/project-health.md +1 -0
- package/.agent-src/commands/quality-fix.md +1 -0
- package/.agent-src/commands/refine-ticket.md +1 -0
- package/.agent-src/commands/research/deep.md +1 -0
- package/.agent-src/commands/research/report.md +1 -0
- package/.agent-src/commands/research.md +1 -0
- package/.agent-src/commands/review-changes.md +1 -0
- package/.agent-src/commands/review-routing.md +1 -0
- package/.agent-src/commands/roadmap/ai-council.md +1 -0
- package/.agent-src/commands/roadmap/create.md +1 -0
- package/.agent-src/commands/roadmap/process-full.md +1 -0
- package/.agent-src/commands/roadmap/process-phase.md +1 -0
- package/.agent-src/commands/roadmap/process-step.md +1 -0
- package/.agent-src/commands/roadmap.md +1 -0
- package/.agent-src/commands/rule-compliance-audit.md +1 -0
- package/.agent-src/commands/set-cost-profile.md +1 -0
- package/.agent-src/commands/sync-agent-settings.md +1 -0
- package/.agent-src/commands/sync-gitignore/fix.md +1 -0
- package/.agent-src/commands/sync-gitignore.md +1 -0
- package/.agent-src/commands/tests/create.md +1 -0
- package/.agent-src/commands/tests/execute.md +1 -0
- package/.agent-src/commands/tests.md +1 -0
- package/.agent-src/commands/threat-model.md +1 -0
- package/.agent-src/commands/update-form-request-messages.md +1 -0
- package/.agent-src/commands/upstream-contribute.md +1 -0
- package/.agent-src/commands/video/from-script.md +1 -0
- package/.agent-src/commands/video/scene.md +1 -0
- package/.agent-src/commands/video/stitch.md +1 -0
- package/.agent-src/commands/video/storyboard.md +1 -0
- package/.agent-src/commands/video.md +1 -0
- package/.agent-src/commands/work.md +1 -0
- package/.agent-src/contexts/model-recommendations.md +82 -82
- package/.agent-src/rules/model-recommendation.md +69 -6
- package/.agent-src/skills/accessibility-auditor/SKILL.md +1 -0
- package/.agent-src/skills/activation-design/SKILL.md +1 -0
- package/.agent-src/skills/adr-create/SKILL.md +1 -0
- package/.agent-src/skills/adversarial-review/SKILL.md +1 -0
- package/.agent-src/skills/agent-docs-writing/SKILL.md +1 -0
- package/.agent-src/skills/agents-md-thin-root/SKILL.md +1 -0
- package/.agent-src/skills/ai-council/SKILL.md +1 -0
- package/.agent-src/skills/analysis-autonomous-mode/SKILL.md +1 -0
- package/.agent-src/skills/analysis-skill-router/SKILL.md +1 -0
- package/.agent-src/skills/api-design/SKILL.md +1 -0
- package/.agent-src/skills/api-endpoint/SKILL.md +1 -0
- package/.agent-src/skills/api-testing/SKILL.md +1 -0
- package/.agent-src/skills/architecture-review-lens/SKILL.md +1 -0
- package/.agent-src/skills/artisan-commands/SKILL.md +1 -0
- package/.agent-src/skills/async-python-patterns/SKILL.md +1 -0
- package/.agent-src/skills/authz-review/SKILL.md +1 -0
- package/.agent-src/skills/aws-infrastructure/SKILL.md +1 -0
- package/.agent-src/skills/blade-ui/SKILL.md +1 -0
- package/.agent-src/skills/blast-radius-analyzer/SKILL.md +1 -0
- package/.agent-src/skills/bug-analyzer/SKILL.md +1 -0
- package/.agent-src/skills/build-buy-partner/SKILL.md +1 -0
- package/.agent-src/skills/canvas-design/SKILL.md +1 -0
- package/.agent-src/skills/character-consistency/SKILL.md +1 -0
- package/.agent-src/skills/check-refs/SKILL.md +1 -0
- package/.agent-src/skills/churn-prevention/SKILL.md +1 -0
- package/.agent-src/skills/code-refactoring/SKILL.md +1 -0
- package/.agent-src/skills/code-review/SKILL.md +1 -0
- package/.agent-src/skills/command-routing/SKILL.md +1 -0
- package/.agent-src/skills/command-writing/SKILL.md +1 -0
- package/.agent-src/skills/comp-banding/SKILL.md +1 -0
- package/.agent-src/skills/competitive-moat-analysis/SKILL.md +1 -0
- package/.agent-src/skills/competitive-positioning/SKILL.md +1 -0
- package/.agent-src/skills/composer-packages/SKILL.md +1 -0
- package/.agent-src/skills/condense-memory/SKILL.md +1 -0
- package/.agent-src/skills/content-funnel-design/SKILL.md +1 -0
- package/.agent-src/skills/context-authoring/SKILL.md +1 -0
- package/.agent-src/skills/context-document/SKILL.md +1 -0
- package/.agent-src/skills/contracts-cognition/SKILL.md +1 -0
- package/.agent-src/skills/conventional-commits-writing/SKILL.md +1 -0
- package/.agent-src/skills/copilot-agents-optimization/SKILL.md +1 -0
- package/.agent-src/skills/copilot-config/SKILL.md +1 -0
- package/.agent-src/skills/customer-research/SKILL.md +1 -0
- package/.agent-src/skills/dashboard-design/SKILL.md +1 -0
- package/.agent-src/skills/data-flow-mapper/SKILL.md +1 -0
- package/.agent-src/skills/data-handling-judgment/SKILL.md +1 -0
- package/.agent-src/skills/database/SKILL.md +1 -0
- package/.agent-src/skills/dcf-modeling/SKILL.md +1 -0
- package/.agent-src/skills/deal-qualification-meddic/SKILL.md +1 -0
- package/.agent-src/skills/decision-record/SKILL.md +1 -0
- package/.agent-src/skills/deep-reading-analyst/SKILL.md +2 -0
- package/.agent-src/skills/defense-in-depth/SKILL.md +1 -0
- package/.agent-src/skills/dependency-upgrade/SKILL.md +1 -0
- package/.agent-src/skills/description-assist/SKILL.md +1 -0
- package/.agent-src/skills/design-review/SKILL.md +1 -0
- package/.agent-src/skills/devcontainer/SKILL.md +1 -0
- package/.agent-src/skills/developer-like-execution/SKILL.md +1 -0
- package/.agent-src/skills/discovery-interview/SKILL.md +1 -0
- package/.agent-src/skills/doc-coauthoring/SKILL.md +1 -0
- package/.agent-src/skills/docker/SKILL.md +1 -0
- package/.agent-src/skills/editorial-calendar/SKILL.md +1 -0
- package/.agent-src/skills/eloquent/SKILL.md +1 -0
- package/.agent-src/skills/error-handling-patterns/SKILL.md +1 -0
- package/.agent-src/skills/estimate-ticket/SKILL.md +1 -0
- package/.agent-src/skills/existing-ui-audit/SKILL.md +1 -0
- package/.agent-src/skills/expansion-playbook/SKILL.md +1 -0
- package/.agent-src/skills/fe-design/SKILL.md +1 -0
- package/.agent-src/skills/feature-planning/SKILL.md +1 -0
- package/.agent-src/skills/file-editor/SKILL.md +1 -0
- package/.agent-src/skills/finishing-a-development-branch/SKILL.md +1 -0
- package/.agent-src/skills/flux/SKILL.md +1 -0
- package/.agent-src/skills/forecast-accuracy/SKILL.md +1 -0
- package/.agent-src/skills/forecasting/SKILL.md +1 -0
- package/.agent-src/skills/form-handler/SKILL.md +1 -0
- package/.agent-src/skills/fundraising-narrative/SKILL.md +1 -0
- package/.agent-src/skills/funnel-analysis/SKILL.md +1 -0
- package/.agent-src/skills/git-workflow/SKILL.md +1 -0
- package/.agent-src/skills/github-ci/SKILL.md +1 -0
- package/.agent-src/skills/grafana/SKILL.md +1 -0
- package/.agent-src/skills/gtm-launch/SKILL.md +1 -0
- package/.agent-src/skills/guideline-writing/SKILL.md +1 -0
- package/.agent-src/skills/hiring-loop-design/SKILL.md +1 -0
- package/.agent-src/skills/incident-commander/SKILL.md +1 -0
- package/.agent-src/skills/jira-integration/SKILL.md +1 -0
- package/.agent-src/skills/jobs-events/SKILL.md +1 -0
- package/.agent-src/skills/judge-bug-hunter/SKILL.md +1 -0
- package/.agent-src/skills/judge-code-quality/SKILL.md +1 -0
- package/.agent-src/skills/judge-security-auditor/SKILL.md +1 -0
- package/.agent-src/skills/judge-test-coverage/SKILL.md +1 -0
- package/.agent-src/skills/laravel/SKILL.md +1 -0
- package/.agent-src/skills/laravel-api-endpoint/SKILL.md +1 -0
- package/.agent-src/skills/laravel-dto/SKILL.md +1 -0
- package/.agent-src/skills/laravel-horizon/SKILL.md +1 -0
- package/.agent-src/skills/laravel-mail/SKILL.md +1 -0
- package/.agent-src/skills/laravel-middleware/SKILL.md +1 -0
- package/.agent-src/skills/laravel-migration/SKILL.md +1 -0
- package/.agent-src/skills/laravel-notifications/SKILL.md +1 -0
- package/.agent-src/skills/laravel-pennant/SKILL.md +1 -0
- package/.agent-src/skills/laravel-pulse/SKILL.md +1 -0
- package/.agent-src/skills/laravel-reverb/SKILL.md +1 -0
- package/.agent-src/skills/laravel-scheduling/SKILL.md +1 -0
- package/.agent-src/skills/laravel-validation/SKILL.md +1 -0
- package/.agent-src/skills/laravel-websocket/SKILL.md +1 -0
- package/.agent-src/skills/launch-readiness/SKILL.md +1 -0
- package/.agent-src/skills/learning-to-rule-or-skill/SKILL.md +1 -0
- package/.agent-src/skills/lint-skills/SKILL.md +1 -0
- package/.agent-src/skills/livewire/SKILL.md +1 -0
- package/.agent-src/skills/livewire-architect/SKILL.md +1 -0
- package/.agent-src/skills/logging-monitoring/SKILL.md +1 -0
- package/.agent-src/skills/market-entry-analysis/SKILL.md +1 -0
- package/.agent-src/skills/markitdown/SKILL.md +1 -0
- package/.agent-src/skills/mcp/SKILL.md +1 -0
- package/.agent-src/skills/mcp-builder/SKILL.md +1 -0
- package/.agent-src/skills/md-language-check/SKILL.md +1 -0
- package/.agent-src/skills/memory-consolidation/SKILL.md +1 -0
- package/.agent-src/skills/merge-conflicts/SKILL.md +1 -0
- package/.agent-src/skills/messaging-architecture/SKILL.md +1 -0
- package/.agent-src/skills/migration-architect/SKILL.md +1 -0
- package/.agent-src/skills/mobile-e2e-strategy/SKILL.md +1 -0
- package/.agent-src/skills/module-detect-on-the-fly/SKILL.md +1 -0
- package/.agent-src/skills/module-management/SKILL.md +1 -0
- package/.agent-src/skills/motion-choreographer/SKILL.md +1 -0
- package/.agent-src/skills/multi-tenancy/SKILL.md +1 -0
- package/.agent-src/skills/nextjs-patterns/SKILL.md +1 -0
- package/.agent-src/skills/okr-tree-modeling/SKILL.md +1 -0
- package/.agent-src/skills/onboarding-design/SKILL.md +1 -0
- package/.agent-src/skills/onboarding-program/SKILL.md +1 -0
- package/.agent-src/skills/one-on-one-cadence/SKILL.md +1 -0
- package/.agent-src/skills/openapi/SKILL.md +1 -0
- package/.agent-src/skills/org-design/SKILL.md +1 -0
- package/.agent-src/skills/override-management/SKILL.md +1 -0
- package/.agent-src/skills/perf-feedback-craft/SKILL.md +1 -0
- package/.agent-src/skills/performance/SKILL.md +1 -0
- package/.agent-src/skills/performance-analysis/SKILL.md +1 -0
- package/.agent-src/skills/persona-writing/SKILL.md +1 -0
- package/.agent-src/skills/pest-testing/SKILL.md +1 -0
- package/.agent-src/skills/php-coder/SKILL.md +1 -0
- package/.agent-src/skills/php-debugging/SKILL.md +1 -0
- package/.agent-src/skills/php-service/SKILL.md +1 -0
- package/.agent-src/skills/pipeline-strategy/SKILL.md +1 -0
- package/.agent-src/skills/pixar-storyteller/SKILL.md +1 -0
- package/.agent-src/skills/playwright-architect/SKILL.md +1 -0
- package/.agent-src/skills/playwright-testing/SKILL.md +1 -0
- package/.agent-src/skills/po-discovery/SKILL.md +1 -0
- package/.agent-src/skills/positioning-strategy/SKILL.md +1 -0
- package/.agent-src/skills/privacy-review/SKILL.md +1 -0
- package/.agent-src/skills/project-analysis-core/SKILL.md +2 -0
- package/.agent-src/skills/project-analysis-hypothesis-driven/SKILL.md +2 -0
- package/.agent-src/skills/project-analysis-laravel/SKILL.md +1 -0
- package/.agent-src/skills/project-analysis-nextjs/SKILL.md +1 -0
- package/.agent-src/skills/project-analysis-node-express/SKILL.md +1 -0
- package/.agent-src/skills/project-analysis-react/SKILL.md +1 -0
- package/.agent-src/skills/project-analysis-symfony/SKILL.md +1 -0
- package/.agent-src/skills/project-analysis-zend-laminas/SKILL.md +1 -0
- package/.agent-src/skills/project-analyzer/SKILL.md +2 -0
- package/.agent-src/skills/project-docs/SKILL.md +1 -0
- package/.agent-src/skills/prompt-engineering-patterns/SKILL.md +1 -0
- package/.agent-src/skills/prompt-optimizer/SKILL.md +1 -0
- package/.agent-src/skills/quality-tools/SKILL.md +1 -0
- package/.agent-src/skills/react-native-setup/SKILL.md +1 -0
- package/.agent-src/skills/react-shadcn-ui/SKILL.md +1 -0
- package/.agent-src/skills/readme-reviewer/SKILL.md +1 -0
- package/.agent-src/skills/readme-writing/SKILL.md +1 -0
- package/.agent-src/skills/readme-writing-package/SKILL.md +1 -0
- package/.agent-src/skills/receiving-code-review/SKILL.md +1 -0
- package/.agent-src/skills/refine-prompt/SKILL.md +1 -0
- package/.agent-src/skills/refine-ticket/SKILL.md +1 -0
- package/.agent-src/skills/release-comms/SKILL.md +1 -0
- package/.agent-src/skills/repomix-packer/SKILL.md +2 -0
- package/.agent-src/skills/requesting-code-review/SKILL.md +1 -0
- package/.agent-src/skills/retention-loops/SKILL.md +1 -0
- package/.agent-src/skills/review-routing/SKILL.md +1 -0
- package/.agent-src/skills/rice-prioritization/SKILL.md +1 -0
- package/.agent-src/skills/risk-officer/SKILL.md +1 -0
- package/.agent-src/skills/roadmap-management/SKILL.md +1 -0
- package/.agent-src/skills/roadmap-writing/SKILL.md +1 -0
- package/.agent-src/skills/rtk-output-filtering/SKILL.md +1 -0
- package/.agent-src/skills/rule-refactor/SKILL.md +1 -0
- package/.agent-src/skills/rule-writing/SKILL.md +1 -0
- package/.agent-src/skills/runway-cognition/SKILL.md +1 -0
- package/.agent-src/skills/scenario-modeling/SKILL.md +1 -0
- package/.agent-src/skills/scene-expander/SKILL.md +1 -0
- package/.agent-src/skills/script-writing/SKILL.md +1 -0
- package/.agent-src/skills/secrets-management/SKILL.md +1 -0
- package/.agent-src/skills/security/SKILL.md +1 -0
- package/.agent-src/skills/security-audit/SKILL.md +1 -0
- package/.agent-src/skills/sentry-integration/SKILL.md +1 -0
- package/.agent-src/skills/sequential-thinking/SKILL.md +1 -0
- package/.agent-src/skills/skill-improvement-pipeline/SKILL.md +1 -0
- package/.agent-src/skills/skill-management/SKILL.md +1 -0
- package/.agent-src/skills/skill-reviewer/SKILL.md +1 -0
- package/.agent-src/skills/skill-writing/SKILL.md +1 -0
- package/.agent-src/skills/sql-writing/SKILL.md +1 -0
- package/.agent-src/skills/stakeholder-tradeoff/SKILL.md +1 -0
- package/.agent-src/skills/subagent-orchestration/SKILL.md +1 -0
- package/.agent-src/skills/symfony-workflow/SKILL.md +1 -0
- package/.agent-src/skills/systematic-debugging/SKILL.md +1 -0
- package/.agent-src/skills/tailwind-engineer/SKILL.md +1 -0
- package/.agent-src/skills/tech-debt-tracker/SKILL.md +1 -0
- package/.agent-src/skills/technical-specification/SKILL.md +1 -0
- package/.agent-src/skills/terraform/SKILL.md +1 -0
- package/.agent-src/skills/terragrunt/SKILL.md +1 -0
- package/.agent-src/skills/test-driven-development/SKILL.md +1 -0
- package/.agent-src/skills/test-performance/SKILL.md +1 -0
- package/.agent-src/skills/testing-anti-patterns/SKILL.md +1 -0
- package/.agent-src/skills/threat-modeling/SKILL.md +1 -0
- package/.agent-src/skills/throughput-vs-morale-tradeoff/SKILL.md +1 -0
- package/.agent-src/skills/token-optimizer/SKILL.md +1 -0
- package/.agent-src/skills/traefik/SKILL.md +1 -0
- package/.agent-src/skills/ui-component-architect/SKILL.md +1 -0
- package/.agent-src/skills/unit-economics-modeling/SKILL.md +1 -0
- package/.agent-src/skills/universal-project-analysis/SKILL.md +2 -0
- package/.agent-src/skills/upstream-contribute/SKILL.md +1 -0
- package/.agent-src/skills/using-git-worktrees/SKILL.md +1 -0
- package/.agent-src/skills/validate-feature-fit/SKILL.md +1 -0
- package/.agent-src/skills/verify-completion-evidence/SKILL.md +1 -0
- package/.agent-src/skills/video-director/SKILL.md +1 -0
- package/.agent-src/skills/vision-articulation/SKILL.md +1 -0
- package/.agent-src/skills/voc-extract/SKILL.md +1 -0
- package/.agent-src/skills/voice-and-tone-design/SKILL.md +1 -0
- package/.claude-plugin/marketplace.json +1 -1
- package/CHANGELOG.md +31 -230
- package/README.md +5 -0
- package/config/agent-settings.template.yml +13 -0
- package/dist/cli/registry.js +2 -0
- package/dist/cli/registry.js.map +1 -1
- package/dist/discovery/deprecation-report.md +1 -1
- package/dist/discovery/discovery-manifest.json +357 -357
- package/dist/discovery/discovery-manifest.json.sha256 +1 -1
- package/dist/discovery/discovery-manifest.summary.md +1 -1
- package/dist/discovery/orphan-report.md +1 -1
- package/dist/discovery/packs.json +2 -2
- package/dist/discovery/trust-report.md +1 -1
- package/dist/discovery/workspaces.json +2 -2
- package/dist/mcp/registry-manifest.json +1 -1
- package/dist/server/schemas/settings.js +4 -0
- package/dist/server/schemas/settings.js.map +1 -1
- package/dist/ui/assets/{index-Tk7lkVH8.js → index-DVsyUMZe.js} +2 -2
- package/dist/ui/assets/index-DVsyUMZe.js.map +1 -0
- package/dist/ui/index.html +1 -1
- package/docs/archive/CHANGELOG-pre-5.4.0.md +260 -0
- package/docs/contracts/consumer-bridge.md +2 -0
- package/docs/contracts/multi-tool-projection-fidelity.md +19 -0
- package/docs/contracts/release-pr-gating.md +6 -1
- package/docs/decisions/ADR-020-global-only-consumer-scope.md +24 -0
- package/docs/decisions/ADR-034-per-skill-model-recommendation-transport.md +63 -0
- package/docs/decisions/ADR-035-model-capability-tiers.md +104 -0
- package/docs/decisions/INDEX.md +2 -0
- package/docs/getting-started.md +23 -0
- package/package.json +1 -1
- package/scripts/__pycache__/validate_frontmatter.cpython-312.pyc +0 -0
- package/scripts/_cli/cmd_doctor.py +44 -1
- package/scripts/_cli/cmd_refresh.py +173 -0
- package/scripts/_cli/cmd_upgrade.py +142 -0
- package/scripts/_dispatch.bash +20 -0
- package/scripts/_lib/__pycache__/__init__.cpython-312.pyc +0 -0
- package/scripts/_lib/__pycache__/agent_src.cpython-312.pyc +0 -0
- package/scripts/backfill_model_tier.py +182 -0
- package/scripts/check_release_pr_shape.py +7 -0
- package/scripts/condense.py +142 -17
- package/scripts/hooks/dispatch_hook.py +39 -0
- package/scripts/install +14 -0
- package/scripts/lint_framework_leakage_allowlist.json +46 -46
- package/scripts/lint_model_tier_coverage.py +73 -0
- package/scripts/roadmap_progress_hook.py +28 -2
- package/scripts/schemas/command.schema.json +10 -0
- package/scripts/schemas/skill.schema.json +10 -0
- package/dist/ui/assets/index-Tk7lkVH8.js.map +0 -1
package/scripts/condense.py
CHANGED
|
@@ -876,8 +876,72 @@ def _iter_commands():
|
|
|
876
876
|
yield source_file, _command_slug(source_file)
|
|
877
877
|
|
|
878
878
|
|
|
879
|
+
# --- Per-skill model auto-switch (ADR-035 / road-to-model-capability-tiers) ---
|
|
880
|
+
|
|
881
|
+
# The SINGLE generator-owned tier→Claude-model mapping (ADR-035 § 3). Claude
|
|
882
|
+
# Code is the only surface that consumes a native `model:`, so this is the only
|
|
883
|
+
# place a capability tier resolves to a concrete model. `inherit`/absent emit
|
|
884
|
+
# nothing and stay pure symlinks. Non-Claude agents never get a per-vendor
|
|
885
|
+
# table — the rule surfaces the tier name as a suggestion.
|
|
886
|
+
_TIER_TO_CLAUDE_MODEL = {"high": "opus", "medium": "sonnet", "lite": "haiku"}
|
|
887
|
+
_MODEL_TIER_RE = re.compile(r'^model_tier:\s*"?([a-z]+)"?\s*$', re.MULTILINE)
|
|
888
|
+
|
|
889
|
+
|
|
890
|
+
def _read_model_auto_switch() -> str:
|
|
891
|
+
"""Read `model.auto_switch` from .agent-settings.yml.
|
|
892
|
+
|
|
893
|
+
Returns `auto` | `suggest` | `off`; default `suggest`. Only `auto` makes
|
|
894
|
+
the generator emit a native Claude `model:` key (ADR-034 § 4) — `suggest`
|
|
895
|
+
and `off` keep skills/commands as pure symlinks so the package never
|
|
896
|
+
silently overrides a user's explicit `/model` choice.
|
|
897
|
+
"""
|
|
898
|
+
try:
|
|
899
|
+
from scripts._lib.agent_settings import load_agent_settings
|
|
900
|
+
except ImportError: # pragma: no cover — script-style invocation
|
|
901
|
+
import sys as _sys
|
|
902
|
+
from pathlib import Path as _Path
|
|
903
|
+
_sys.path.insert(0, str(_Path(__file__).resolve().parent))
|
|
904
|
+
from _lib.agent_settings import load_agent_settings # type: ignore[import-not-found]
|
|
905
|
+
data = load_agent_settings(project_path=SETTINGS_FILE)
|
|
906
|
+
model = data.get("model")
|
|
907
|
+
value = model.get("auto_switch") if isinstance(model, dict) else None
|
|
908
|
+
if isinstance(value, str) and value.strip().lower() in ("auto", "suggest", "off"):
|
|
909
|
+
return value.strip().lower()
|
|
910
|
+
return "suggest"
|
|
911
|
+
|
|
912
|
+
|
|
913
|
+
def _model_tier(skill_md: Path) -> str | None:
|
|
914
|
+
"""Return the `model_tier` frontmatter value, or None if absent."""
|
|
915
|
+
if not skill_md.exists():
|
|
916
|
+
return None
|
|
917
|
+
text = skill_md.read_text(encoding="utf-8", errors="replace")
|
|
918
|
+
if not text.startswith("---\n"):
|
|
919
|
+
return None
|
|
920
|
+
end = text.find("\n---\n", 4)
|
|
921
|
+
if end == -1:
|
|
922
|
+
return None
|
|
923
|
+
m = _MODEL_TIER_RE.search(text[4:end])
|
|
924
|
+
return m.group(1) if m else None
|
|
925
|
+
|
|
926
|
+
|
|
927
|
+
def _render_native_model_md(src_md: Path, tier: str) -> str:
|
|
928
|
+
"""Rewrite the source `model_tier: <tier>` line to a native Claude
|
|
929
|
+
`model: <mapped>` key via the generator-owned mapping (ADR-035 § 3). The
|
|
930
|
+
rest of the SKILL.md is byte-identical."""
|
|
931
|
+
text = src_md.read_text(encoding="utf-8")
|
|
932
|
+
model = _TIER_TO_CLAUDE_MODEL[tier]
|
|
933
|
+
return _MODEL_TIER_RE.sub(f"model: {model}", text, count=1)
|
|
934
|
+
|
|
935
|
+
|
|
879
936
|
def generate_claude_skills() -> int:
|
|
880
|
-
"""Create .claude/skills/
|
|
937
|
+
"""Create .claude/skills/ entries for ALL skills in .agent-src/skills/.
|
|
938
|
+
|
|
939
|
+
Default: a directory symlink → .agent-src/skills/<name> (verbatim).
|
|
940
|
+
When `model.auto_switch: auto` AND a skill declares
|
|
941
|
+
`model_tier: lite|medium|high`, the entry becomes a real directory whose
|
|
942
|
+
sub-files are symlinked but whose SKILL.md is a rendered copy carrying a
|
|
943
|
+
native Claude `model:` key (ADR-034 Option (b) — only model-bearing skills
|
|
944
|
+
break the symlink). Idempotent: each entry is rebuilt from scratch.
|
|
881
945
|
"""
|
|
882
946
|
if not SKILLS_SOURCE.exists():
|
|
883
947
|
print(" ⚠️ .agent-src/skills/ not found — skipping skills", file=sys.stderr)
|
|
@@ -885,26 +949,58 @@ def generate_claude_skills() -> int:
|
|
|
885
949
|
|
|
886
950
|
# All skill directories in .agent-src/skills/
|
|
887
951
|
skills = sorted([d.name for d in SKILLS_SOURCE.iterdir() if d.is_dir()])
|
|
952
|
+
skill_set = set(skills)
|
|
888
953
|
# All command slugs (to protect from stale cleanup)
|
|
889
954
|
command_slugs = {slug for _, slug in _iter_commands()}
|
|
890
955
|
|
|
891
956
|
CLAUDE_SKILLS_DIR.mkdir(parents=True, exist_ok=True)
|
|
957
|
+
auto = _read_model_auto_switch() == "auto"
|
|
892
958
|
|
|
893
|
-
# Clean stale
|
|
959
|
+
# Clean stale entries (symlinks AND rendered skill dirs) — but never touch
|
|
960
|
+
# command dirs (real dir whose SKILL.md is a symlink) or the README.
|
|
894
961
|
for item in CLAUDE_SKILLS_DIR.iterdir():
|
|
895
|
-
if item.
|
|
962
|
+
if item.name in skill_set or item.name in command_slugs or item.name == "README.md":
|
|
963
|
+
continue
|
|
964
|
+
if item.is_symlink():
|
|
896
965
|
item.unlink()
|
|
966
|
+
elif item.is_dir():
|
|
967
|
+
skill_md = item / "SKILL.md"
|
|
968
|
+
# A rendered skill dir has a *real* SKILL.md copy; a command dir has
|
|
969
|
+
# a SKILL.md *symlink* (left for generate_claude_commands to manage).
|
|
970
|
+
if skill_md.is_file() and not skill_md.is_symlink():
|
|
971
|
+
shutil.rmtree(item)
|
|
897
972
|
|
|
898
973
|
count = 0
|
|
974
|
+
rendered = 0
|
|
899
975
|
for skill in skills:
|
|
900
976
|
link = CLAUDE_SKILLS_DIR / skill
|
|
901
|
-
|
|
977
|
+
src_dir = SKILLS_SOURCE / skill
|
|
978
|
+
value = _model_tier(src_dir / "SKILL.md") if auto else None
|
|
979
|
+
# Rebuild from scratch for idempotency (symlink ↔ rendered-dir flips).
|
|
980
|
+
if link.is_symlink():
|
|
902
981
|
link.unlink()
|
|
903
|
-
|
|
904
|
-
|
|
982
|
+
elif link.is_dir():
|
|
983
|
+
shutil.rmtree(link)
|
|
984
|
+
elif link.exists():
|
|
985
|
+
link.unlink()
|
|
986
|
+
if value in _TIER_TO_CLAUDE_MODEL:
|
|
987
|
+
link.mkdir(parents=True)
|
|
988
|
+
for entry in sorted(src_dir.iterdir()):
|
|
989
|
+
if entry.name == "SKILL.md":
|
|
990
|
+
(link / "SKILL.md").write_text(
|
|
991
|
+
_render_native_model_md(entry, value), encoding="utf-8"
|
|
992
|
+
)
|
|
993
|
+
else:
|
|
994
|
+
(link / entry.name).symlink_to(
|
|
995
|
+
Path("../../../.agent-src/skills") / skill / entry.name
|
|
996
|
+
)
|
|
997
|
+
rendered += 1
|
|
998
|
+
else:
|
|
999
|
+
link.symlink_to(Path("../../.agent-src/skills") / skill)
|
|
905
1000
|
count += 1
|
|
906
1001
|
|
|
907
|
-
|
|
1002
|
+
suffix = f" ({rendered} rendered with native model:)" if rendered else ""
|
|
1003
|
+
info(f" ✅ Created {count} skill entries in .claude/skills/{suffix}")
|
|
908
1004
|
return count
|
|
909
1005
|
|
|
910
1006
|
|
|
@@ -945,6 +1041,8 @@ def generate_claude_commands() -> int:
|
|
|
945
1041
|
current_slugs: set[str] = set()
|
|
946
1042
|
count = 0
|
|
947
1043
|
skipped = 0
|
|
1044
|
+
rendered = 0
|
|
1045
|
+
auto = _read_model_auto_switch() == "auto"
|
|
948
1046
|
for source_file, slug in _iter_commands():
|
|
949
1047
|
# Skip if a real skill with the same name exists — skill takes priority
|
|
950
1048
|
if slug in skill_names:
|
|
@@ -953,7 +1051,7 @@ def generate_claude_commands() -> int:
|
|
|
953
1051
|
|
|
954
1052
|
current_slugs.add(slug)
|
|
955
1053
|
|
|
956
|
-
# Create skill directory (real dir,
|
|
1054
|
+
# Create skill directory (real dir, SKILL.md symlinked or rendered)
|
|
957
1055
|
skill_dir = CLAUDE_SKILLS_DIR / slug
|
|
958
1056
|
skill_dir.mkdir(parents=True, exist_ok=True)
|
|
959
1057
|
|
|
@@ -961,10 +1059,18 @@ def generate_claude_commands() -> int:
|
|
|
961
1059
|
if skill_file.exists() or skill_file.is_symlink():
|
|
962
1060
|
skill_file.unlink()
|
|
963
1061
|
|
|
964
|
-
# Symlink: .claude/skills/{slug}/SKILL.md → ../../../.agent-src/commands/<rel-path>
|
|
965
1062
|
rel_path = source_file.relative_to(COMMANDS_SOURCE)
|
|
966
|
-
|
|
967
|
-
|
|
1063
|
+
value = _model_tier(source_file) if auto else None
|
|
1064
|
+
if value in _TIER_TO_CLAUDE_MODEL:
|
|
1065
|
+
# Render a copy carrying the native Claude model: key (ADR-034).
|
|
1066
|
+
skill_file.write_text(
|
|
1067
|
+
_render_native_model_md(source_file, value), encoding="utf-8"
|
|
1068
|
+
)
|
|
1069
|
+
rendered += 1
|
|
1070
|
+
else:
|
|
1071
|
+
# Symlink: .claude/skills/{slug}/SKILL.md → ../../../.agent-src/commands/<rel-path>
|
|
1072
|
+
rel_target = Path("../../../.agent-src/commands") / rel_path
|
|
1073
|
+
skill_file.symlink_to(rel_target)
|
|
968
1074
|
count += 1
|
|
969
1075
|
|
|
970
1076
|
# Clean stale command skill directories — real dirs from removed commands.
|
|
@@ -976,14 +1082,20 @@ def generate_claude_commands() -> int:
|
|
|
976
1082
|
if item.name in skill_names or item.name in current_slugs:
|
|
977
1083
|
continue
|
|
978
1084
|
skill_md = item / "SKILL.md"
|
|
979
|
-
|
|
1085
|
+
# Stale command dir = exactly one SKILL.md, either symlinked (default)
|
|
1086
|
+
# or a rendered copy (native-model command, ADR-034). Skill-render dirs
|
|
1087
|
+
# are protected above (item.name in skill_names) and via the skills
|
|
1088
|
+
# generator, so this only reaps removed commands.
|
|
1089
|
+
if skill_md.is_symlink() or skill_md.is_file():
|
|
980
1090
|
entries = list(item.iterdir())
|
|
981
1091
|
if len(entries) == 1 and entries[0].name == "SKILL.md":
|
|
982
1092
|
skill_md.unlink()
|
|
983
1093
|
item.rmdir()
|
|
984
1094
|
removed_dirs += 1
|
|
985
1095
|
|
|
986
|
-
msg = f" ✅ Created {count} command
|
|
1096
|
+
msg = f" ✅ Created {count} command entries in .claude/skills/"
|
|
1097
|
+
if rendered:
|
|
1098
|
+
msg += f" ({rendered} rendered with native model:)"
|
|
987
1099
|
if skipped:
|
|
988
1100
|
msg += f" ({skipped} skipped — same-name skill exists)"
|
|
989
1101
|
if removed_dirs:
|
|
@@ -1080,8 +1192,12 @@ def generate_plugin_hooks() -> int:
|
|
|
1080
1192
|
``settings.local.json``. Claude Code merges plugin-scope and
|
|
1081
1193
|
settings-scope hooks and dedups by command string.
|
|
1082
1194
|
|
|
1083
|
-
The command
|
|
1084
|
-
|
|
1195
|
+
The command resolves the binary project-local-first
|
|
1196
|
+
(``$CLAUDE_PROJECT_DIR/agent-config`` when executable — maintainer dev-loop)
|
|
1197
|
+
and falls back to ``agent-config`` on PATH (global-only consumer per
|
|
1198
|
+
ADR-020, where the repo carries no wrapper). It always passes
|
|
1199
|
+
``--project-dir "$CLAUDE_PROJECT_DIR"`` so a globally resolved binary still
|
|
1200
|
+
scans the project the event fired in. The universal dispatcher then reads
|
|
1085
1201
|
``scripts/hook_manifest.yaml`` at runtime to fan out to the active
|
|
1086
1202
|
concerns (each a no-op when its feature is disabled).
|
|
1087
1203
|
"""
|
|
@@ -1092,6 +1208,7 @@ def generate_plugin_hooks() -> int:
|
|
|
1092
1208
|
return 0
|
|
1093
1209
|
|
|
1094
1210
|
manifest = yaml.safe_load(manifest_path.read_text(encoding="utf-8")) or {}
|
|
1211
|
+
hook_spec = manifest.get("schema_version", 1)
|
|
1095
1212
|
claude_events = manifest.get("platforms", {}).get("claude", {}) or {}
|
|
1096
1213
|
aliases = manifest.get("native_event_aliases", {}).get("claude", {}) or {}
|
|
1097
1214
|
# Reverse the native→agent-config map so we can emit native event names.
|
|
@@ -1104,9 +1221,17 @@ def generate_plugin_hooks() -> int:
|
|
|
1104
1221
|
native = ac_to_native.get(ac_event)
|
|
1105
1222
|
if native is None:
|
|
1106
1223
|
continue
|
|
1224
|
+
# Resolve the binary project-local-first, PATH-fallback: a maintainer
|
|
1225
|
+
# dev-loop (or any repo carrying a project-local wrapper) uses its own
|
|
1226
|
+
# ./agent-config; a global-only consumer (ADR-020 — nothing in the
|
|
1227
|
+
# repo) falls back to the globally-installed `agent-config` on PATH.
|
|
1228
|
+
# Either way pass --project-dir "$CLAUDE_PROJECT_DIR" so a globally
|
|
1229
|
+
# resolved binary still scans the project the event fired in.
|
|
1107
1230
|
command = (
|
|
1108
|
-
'"$CLAUDE_PROJECT_DIR
|
|
1109
|
-
f"--platform claude --event {ac_event}
|
|
1231
|
+
'BIN="$CLAUDE_PROJECT_DIR/agent-config"; [ -x "$BIN" ] || BIN=agent-config; '
|
|
1232
|
+
f'"$BIN" dispatch:hook --platform claude --event {ac_event} '
|
|
1233
|
+
f'--native-event {native} --project-dir "$CLAUDE_PROJECT_DIR" '
|
|
1234
|
+
f'--min-version {hook_spec}'
|
|
1110
1235
|
)
|
|
1111
1236
|
hooks[native] = [{"hooks": [{"type": "command", "command": command}]}]
|
|
1112
1237
|
|
|
@@ -349,8 +349,36 @@ def main(argv: list[str] | None = None) -> int:
|
|
|
349
349
|
parser.add_argument("--manifest", default=str(MANIFEST_PATH))
|
|
350
350
|
parser.add_argument("--dry-run", action="store_true",
|
|
351
351
|
help="Resolve concerns and print plan; do not invoke them.")
|
|
352
|
+
parser.add_argument("--project-dir", default="",
|
|
353
|
+
help="Project root the event fired in (the Claude "
|
|
354
|
+
"plugin passes $CLAUDE_PROJECT_DIR). A globally "
|
|
355
|
+
"resolved binary (ADR-020 global-only) has no "
|
|
356
|
+
"implicit project context, so concerns are "
|
|
357
|
+
"resolved relative to this directory.")
|
|
358
|
+
parser.add_argument("--min-version", type=int, default=0,
|
|
359
|
+
help="Minimum hook-spec (manifest schema_version) the "
|
|
360
|
+
"caller — typically the Claude marketplace plugin "
|
|
361
|
+
"— was generated against. Plugin and binary update "
|
|
362
|
+
"on independent cadences; when the binary's "
|
|
363
|
+
"manifest is older than the plugin expects, warn "
|
|
364
|
+
"(never block).")
|
|
352
365
|
args = parser.parse_args(argv)
|
|
353
366
|
|
|
367
|
+
# Honour --project-dir: chdir so workspace_root (envelope) and every
|
|
368
|
+
# concern's cwd resolve consumer-local paths (agents/roadmaps/,
|
|
369
|
+
# agents/runtime/state/) against the project the event fired in, not the
|
|
370
|
+
# cwd a globally-installed binary happened to inherit. Fail loud (never
|
|
371
|
+
# block) when the path is bad — a wrong project root is a silent-no-op
|
|
372
|
+
# trap otherwise.
|
|
373
|
+
if args.project_dir:
|
|
374
|
+
project_dir = Path(args.project_dir).expanduser()
|
|
375
|
+
if project_dir.is_dir():
|
|
376
|
+
os.chdir(project_dir)
|
|
377
|
+
else:
|
|
378
|
+
sys.stderr.write(
|
|
379
|
+
f"dispatch_hook: --project-dir is not a directory: "
|
|
380
|
+
f"{project_dir} — resolving against cwd {Path.cwd()}\n")
|
|
381
|
+
|
|
354
382
|
if args.event not in EVENT_VOCABULARY:
|
|
355
383
|
sys.stderr.write(f"dispatch_hook: unknown event '{args.event}'; allowed: "
|
|
356
384
|
f"{sorted(EVENT_VOCABULARY)}\n")
|
|
@@ -362,6 +390,17 @@ def main(argv: list[str] | None = None) -> int:
|
|
|
362
390
|
return EXIT_ALLOW
|
|
363
391
|
manifest = _load_yaml(manifest_path)
|
|
364
392
|
|
|
393
|
+
# Plugin↔binary drift guard (never blocks). The Claude marketplace plugin
|
|
394
|
+
# embeds the hook-spec it was generated against; if this globally-installed
|
|
395
|
+
# binary carries an older manifest, surface a one-line upgrade hint.
|
|
396
|
+
if args.min_version:
|
|
397
|
+
local_spec = manifest.get("schema_version") or 0
|
|
398
|
+
if isinstance(local_spec, int) and local_spec < args.min_version:
|
|
399
|
+
sys.stderr.write(
|
|
400
|
+
f"dispatch_hook: plugin expects hook-spec >= {args.min_version} "
|
|
401
|
+
f"but this agent-config provides {local_spec}; "
|
|
402
|
+
f"run `agent-config upgrade`.\n")
|
|
403
|
+
|
|
365
404
|
payload_text = "" if sys.stdin.isatty() else sys.stdin.read()
|
|
366
405
|
_maybe_capture_payload(args, payload_text)
|
|
367
406
|
concerns = _resolve_concerns(manifest, args.platform, args.event)
|
package/scripts/install
CHANGED
|
@@ -394,4 +394,18 @@ if ! $SKIP_BRIDGES; then
|
|
|
394
394
|
run_bridges || RC=$?
|
|
395
395
|
fi
|
|
396
396
|
|
|
397
|
+
# Post-install PATH advisory. The Claude plugin hook resolves `agent-config`
|
|
398
|
+
# from PATH on a global-only consumer (ADR-020); if it is unreachable every
|
|
399
|
+
# PostToolUse hook silently no-ops — the documented "dashboard never updates"
|
|
400
|
+
# failure. Advisory only: a bad PATH must not fail an otherwise-clean install.
|
|
401
|
+
if [[ $RC -eq 0 ]] && ! command -v agent-config >/dev/null 2>&1; then
|
|
402
|
+
$QUIET || {
|
|
403
|
+
echo " ⚠️ \`agent-config\` is not on your PATH." >&2
|
|
404
|
+
echo " Claude plugin hooks resolve it from PATH; without it the" >&2
|
|
405
|
+
echo " roadmap-progress dashboard (and other hooks) will not fire." >&2
|
|
406
|
+
echo " Add your npm global bin dir (\`npm prefix -g\`/bin) to PATH," >&2
|
|
407
|
+
echo " then verify with \`agent-config doctor\`." >&2
|
|
408
|
+
}
|
|
409
|
+
fi
|
|
410
|
+
|
|
397
411
|
exit $RC
|
|
@@ -5,37 +5,37 @@
|
|
|
5
5
|
{
|
|
6
6
|
"file": ".agent-src.uncondensed/skills/module-detect-on-the-fly/SKILL.md",
|
|
7
7
|
"lines": [
|
|
8
|
-
|
|
9
|
-
|
|
8
|
+
34,
|
|
9
|
+
96
|
|
10
10
|
],
|
|
11
11
|
"reason": "Cross-stack noise-segment enumeration (vendor + node_modules + dist/Modules) documenting the module-detection path filter"
|
|
12
12
|
},
|
|
13
13
|
{
|
|
14
14
|
"file": ".agent-src.uncondensed/skills/using-git-worktrees/SKILL.md",
|
|
15
15
|
"lines": [
|
|
16
|
-
133,
|
|
17
16
|
134,
|
|
18
17
|
135,
|
|
19
|
-
|
|
18
|
+
136,
|
|
19
|
+
156
|
|
20
20
|
],
|
|
21
21
|
"reason": "Multi-stack package-manager comparison table"
|
|
22
22
|
},
|
|
23
23
|
{
|
|
24
24
|
"file": ".agent-src.uncondensed/skills/refine-prompt/SKILL.md",
|
|
25
25
|
"lines": [
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
26
|
+
92,
|
|
27
|
+
94,
|
|
28
|
+
96,
|
|
29
|
+
141,
|
|
30
|
+
184,
|
|
31
|
+
273
|
|
32
32
|
],
|
|
33
33
|
"reason": "Project-detection enumeration listing all supported stacks"
|
|
34
34
|
},
|
|
35
35
|
{
|
|
36
36
|
"file": ".agent-src.uncondensed/commands/analyze-reference-repo.md",
|
|
37
37
|
"lines": [
|
|
38
|
-
|
|
38
|
+
54
|
|
39
39
|
],
|
|
40
40
|
"reason": "Manifest-file enumeration across ecosystems"
|
|
41
41
|
},
|
|
@@ -77,51 +77,51 @@
|
|
|
77
77
|
{
|
|
78
78
|
"file": ".agent-src.uncondensed/skills/api-endpoint/SKILL.md",
|
|
79
79
|
"lines": [
|
|
80
|
-
|
|
81
|
-
|
|
80
|
+
45,
|
|
81
|
+
62
|
|
82
82
|
],
|
|
83
83
|
"reason": "Cross-stack validation primitive enumeration and pointer to laravel-api-endpoint carve-out"
|
|
84
84
|
},
|
|
85
85
|
{
|
|
86
86
|
"file": ".agent-src.uncondensed/skills/code-review/SKILL.md",
|
|
87
87
|
"lines": [
|
|
88
|
-
43,
|
|
89
88
|
44,
|
|
90
89
|
45,
|
|
91
|
-
|
|
92
|
-
|
|
90
|
+
46,
|
|
91
|
+
53,
|
|
93
92
|
66,
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
93
|
+
67,
|
|
94
|
+
78,
|
|
95
|
+
87,
|
|
96
|
+
89,
|
|
97
|
+
91,
|
|
98
|
+
223
|
|
99
99
|
],
|
|
100
100
|
"reason": "Cross-stack code-review checklist enumerates handler shape, validation, authz, ORM, escaping per framework"
|
|
101
101
|
},
|
|
102
102
|
{
|
|
103
103
|
"file": ".agent-src.uncondensed/skills/security/SKILL.md",
|
|
104
104
|
"lines": [
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
30,
|
|
105
|
+
20,
|
|
106
|
+
27,
|
|
108
107
|
31,
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
108
|
+
32,
|
|
109
|
+
41,
|
|
110
|
+
45,
|
|
111
|
+
52,
|
|
112
|
+
62,
|
|
113
|
+
80
|
|
114
114
|
],
|
|
115
115
|
"reason": "Cross-stack security review enumerates auth primitives (Policies, voters, guards, middleware) and config paths"
|
|
116
116
|
},
|
|
117
117
|
{
|
|
118
118
|
"file": ".agent-src.uncondensed/skills/verify-completion-evidence/SKILL.md",
|
|
119
119
|
"lines": [
|
|
120
|
-
56,
|
|
121
120
|
57,
|
|
122
121
|
58,
|
|
123
|
-
|
|
124
|
-
|
|
122
|
+
59,
|
|
123
|
+
104,
|
|
124
|
+
181
|
|
125
125
|
],
|
|
126
126
|
"reason": "Evidence-mapping table enumerates the type-checker / linter / refactor tool per stack including PHPStan, Rector, ECS"
|
|
127
127
|
},
|
|
@@ -473,7 +473,7 @@
|
|
|
473
473
|
{
|
|
474
474
|
"file": ".agent-src.uncondensed/skills/code-review/SKILL.md",
|
|
475
475
|
"lines": [
|
|
476
|
-
|
|
476
|
+
227
|
|
477
477
|
],
|
|
478
478
|
"reason": "Multi-stack formatter enumeration (ECS, Prettier, Ruff, gofmt) \u2014 comparative example, no project mandate"
|
|
479
479
|
},
|
|
@@ -492,16 +492,16 @@
|
|
|
492
492
|
{
|
|
493
493
|
"file": ".agent-src.uncondensed/skills/context-document/SKILL.md",
|
|
494
494
|
"lines": [
|
|
495
|
-
54,
|
|
496
495
|
55,
|
|
497
|
-
|
|
496
|
+
56,
|
|
497
|
+
79
|
|
498
498
|
],
|
|
499
499
|
"reason": "Cross-stack target-directory examples (Laravel / Symfony) for module-scoped context docs \u2014 comparative example, no mandate"
|
|
500
500
|
},
|
|
501
501
|
{
|
|
502
502
|
"file": ".agent-src.uncondensed/skills/roadmap-writing/SKILL.md",
|
|
503
503
|
"lines": [
|
|
504
|
-
|
|
504
|
+
20
|
|
505
505
|
],
|
|
506
506
|
"reason": "Single Laravel-shape example showing how `{module_root}/{agent_folder}/roadmaps/` resolves on a Laravel HMVC project"
|
|
507
507
|
},
|
|
@@ -522,52 +522,52 @@
|
|
|
522
522
|
{
|
|
523
523
|
"file": ".agent-src.uncondensed/commands/context/create.md",
|
|
524
524
|
"lines": [
|
|
525
|
-
|
|
525
|
+
53
|
|
526
526
|
],
|
|
527
527
|
"reason": "Single Laravel-shape example for module-context target directory (road-to-configurable-modules Phase D)"
|
|
528
528
|
},
|
|
529
529
|
{
|
|
530
530
|
"file": ".agent-src.uncondensed/commands/context/refactor.md",
|
|
531
531
|
"lines": [
|
|
532
|
-
|
|
532
|
+
27
|
|
533
533
|
],
|
|
534
534
|
"reason": "Single Laravel-shape example for module-context discovery path (road-to-configurable-modules Phase D)"
|
|
535
535
|
},
|
|
536
536
|
{
|
|
537
537
|
"file": ".agent-src.uncondensed/commands/feature/explore.md",
|
|
538
538
|
"lines": [
|
|
539
|
-
|
|
539
|
+
123
|
|
540
540
|
],
|
|
541
541
|
"reason": "Single Laravel-shape example showing how `enumerate_modules()` resolves on a Laravel HMVC project (road-to-configurable-modules Phase D)"
|
|
542
542
|
},
|
|
543
543
|
{
|
|
544
544
|
"file": ".agent-src.uncondensed/commands/feature/plan.md",
|
|
545
545
|
"lines": [
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
546
|
+
142,
|
|
547
|
+
171,
|
|
548
|
+
255
|
|
549
549
|
],
|
|
550
550
|
"reason": "Laravel-shape examples for module-scoped contexts and feature target paths (road-to-configurable-modules Phase D)"
|
|
551
551
|
},
|
|
552
552
|
{
|
|
553
553
|
"file": ".agent-src.uncondensed/commands/feature/refactor.md",
|
|
554
554
|
"lines": [
|
|
555
|
-
|
|
555
|
+
27
|
|
556
556
|
],
|
|
557
557
|
"reason": "Single Laravel-shape example for module-feature discovery path (road-to-configurable-modules Phase D)"
|
|
558
558
|
},
|
|
559
559
|
{
|
|
560
560
|
"file": ".agent-src.uncondensed/commands/feature/roadmap.md",
|
|
561
561
|
"lines": [
|
|
562
|
-
|
|
563
|
-
|
|
562
|
+
27,
|
|
563
|
+
127
|
|
564
564
|
],
|
|
565
565
|
"reason": "Laravel-shape examples for module-feature/roadmap discovery and target paths (road-to-configurable-modules Phase D)"
|
|
566
566
|
},
|
|
567
567
|
{
|
|
568
568
|
"file": ".agent-src.uncondensed/commands/optimize/agents-dir.md",
|
|
569
569
|
"lines": [
|
|
570
|
-
|
|
570
|
+
24
|
|
571
571
|
],
|
|
572
572
|
"reason": "Single Laravel-shape example for per-module agents directory (road-to-configurable-modules Phase D)"
|
|
573
573
|
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Fail when a skill or command lacks a `model_tier` value.
|
|
3
|
+
|
|
4
|
+
Phase 5 coverage gate of `road-to-model-capability-tiers.md` (ADR-035):
|
|
5
|
+
every skill and command MUST declare an explicit `model_tier`
|
|
6
|
+
(`opus | sonnet | gpt`) or `inherit`. An untagged artefact is an error — it
|
|
7
|
+
leaves the per-skill model-switch surface with a silent gap. Run
|
|
8
|
+
`python3 scripts/backfill_model_tier.py` to seed missing tags.
|
|
9
|
+
|
|
10
|
+
The enum itself is validated by `scripts/validate_frontmatter.py`; this gate
|
|
11
|
+
only enforces *presence* (an explicit decision was made for every artefact).
|
|
12
|
+
|
|
13
|
+
CLI: python3 scripts/lint_model_tier_coverage.py [--quiet]
|
|
14
|
+
Exit: 0 clean · 1 at least one untagged skill/command.
|
|
15
|
+
"""
|
|
16
|
+
from __future__ import annotations
|
|
17
|
+
|
|
18
|
+
import argparse
|
|
19
|
+
import sys
|
|
20
|
+
from pathlib import Path
|
|
21
|
+
|
|
22
|
+
sys.path.insert(0, str(Path(__file__).resolve().parent))
|
|
23
|
+
from validate_frontmatter import parse_frontmatter # noqa: E402
|
|
24
|
+
from _lib.agent_src import artefact_roots # noqa: E402
|
|
25
|
+
|
|
26
|
+
ROOT = Path(__file__).resolve().parents[1]
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def _targets():
|
|
30
|
+
for root in artefact_roots():
|
|
31
|
+
sdir = root / "skills"
|
|
32
|
+
if sdir.exists():
|
|
33
|
+
for p in sorted(sdir.rglob("SKILL.md")):
|
|
34
|
+
yield "skill", p
|
|
35
|
+
cdir = root / "commands"
|
|
36
|
+
if cdir.exists():
|
|
37
|
+
for p in sorted(cdir.rglob("*.md")):
|
|
38
|
+
if p.name != "AGENTS.md":
|
|
39
|
+
yield "command", p
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def main(argv=None) -> int:
|
|
43
|
+
ap = argparse.ArgumentParser(description=__doc__.splitlines()[0])
|
|
44
|
+
ap.add_argument("--quiet", action="store_true")
|
|
45
|
+
args = ap.parse_args(argv)
|
|
46
|
+
|
|
47
|
+
total = 0
|
|
48
|
+
missing = []
|
|
49
|
+
for kind, path in _targets():
|
|
50
|
+
total += 1
|
|
51
|
+
fm, _ = parse_frontmatter(path.read_text(encoding="utf-8"))
|
|
52
|
+
if not isinstance(fm, dict) or not fm.get("model_tier"):
|
|
53
|
+
missing.append((kind, path.relative_to(ROOT).as_posix()))
|
|
54
|
+
|
|
55
|
+
if missing:
|
|
56
|
+
for kind, rel in missing[:40]:
|
|
57
|
+
print(f"❌ [{kind}] {rel}: missing `model_tier` "
|
|
58
|
+
f"(set lite/medium/high or inherit)")
|
|
59
|
+
if len(missing) > 40:
|
|
60
|
+
print(f" ... and {len(missing) - 40} more")
|
|
61
|
+
print(
|
|
62
|
+
f"\n== model_tier coverage: {len(missing)}/{total} artefact(s) "
|
|
63
|
+
"untagged. Run `python3 scripts/backfill_model_tier.py`. ==",
|
|
64
|
+
file=sys.stderr,
|
|
65
|
+
)
|
|
66
|
+
return 1
|
|
67
|
+
if not args.quiet:
|
|
68
|
+
print(f"✅ lint-model-tier-coverage: {total} artefact(s) tagged.")
|
|
69
|
+
return 0
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
if __name__ == "__main__":
|
|
73
|
+
sys.exit(main())
|
|
@@ -75,6 +75,26 @@ def _candidate_paths(payload: dict) -> list[str]:
|
|
|
75
75
|
return out
|
|
76
76
|
|
|
77
77
|
|
|
78
|
+
def _relativize(path: str, root: Path) -> str:
|
|
79
|
+
"""Make an absolute path project-relative so the `agents/roadmaps/` prefix
|
|
80
|
+
check fires.
|
|
81
|
+
|
|
82
|
+
Claude Code passes an absolute `tool_input.file_path`
|
|
83
|
+
(`/Users/.../<repo>/agents/roadmaps/x.md`); Augment passes a repo-relative
|
|
84
|
+
one. Without this, an absolute path never matches the relative prefix and
|
|
85
|
+
the hook silently no-ops. Already-relative paths and out-of-tree paths are
|
|
86
|
+
returned unchanged — an out-of-tree roadmap correctly fails the prefix
|
|
87
|
+
check downstream.
|
|
88
|
+
"""
|
|
89
|
+
p = Path(path)
|
|
90
|
+
if not p.is_absolute():
|
|
91
|
+
return path
|
|
92
|
+
try:
|
|
93
|
+
return str(p.resolve().relative_to(root.resolve()))
|
|
94
|
+
except (ValueError, OSError):
|
|
95
|
+
return path
|
|
96
|
+
|
|
97
|
+
|
|
78
98
|
def _is_roadmap_touch(path: str) -> bool:
|
|
79
99
|
"""Return True if `path` is a roadmap file we should react to."""
|
|
80
100
|
norm = path.lstrip("./").replace("\\", "/")
|
|
@@ -126,7 +146,7 @@ def run(stdin_text: str, *, consumer_root: Path, verbose: bool = False) -> int:
|
|
|
126
146
|
if not isinstance(tool, str) or tool not in WRITE_TOOLS:
|
|
127
147
|
return 0
|
|
128
148
|
|
|
129
|
-
paths = _candidate_paths(payload)
|
|
149
|
+
paths = [_relativize(p, consumer_root) for p in _candidate_paths(payload)]
|
|
130
150
|
if not any(_is_roadmap_touch(p) for p in paths):
|
|
131
151
|
return 0
|
|
132
152
|
|
|
@@ -188,10 +208,16 @@ def main(argv: list[str] | None = None) -> int:
|
|
|
188
208
|
parser = argparse.ArgumentParser(description=__doc__)
|
|
189
209
|
parser.add_argument("--platform", default="generic",
|
|
190
210
|
help="informational platform tag (augment/claude/...)")
|
|
211
|
+
parser.add_argument("--project-dir", default="",
|
|
212
|
+
help="project root override; falls back to cwd. The "
|
|
213
|
+
"Claude plugin passes $CLAUDE_PROJECT_DIR so a "
|
|
214
|
+
"globally-resolved binary (ADR-020) scans the "
|
|
215
|
+
"right project's agents/roadmaps/.")
|
|
191
216
|
parser.add_argument("--verbose", action="store_true",
|
|
192
217
|
help="emit one stderr line per invocation")
|
|
193
218
|
args = parser.parse_args(argv)
|
|
194
|
-
|
|
219
|
+
root = Path(args.project_dir).expanduser() if args.project_dir else Path.cwd()
|
|
220
|
+
return run(sys.stdin.read(), consumer_root=root, verbose=args.verbose)
|
|
195
221
|
|
|
196
222
|
|
|
197
223
|
if __name__ == "__main__": # pragma: no cover
|