@event4u/agent-config 1.9.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/README.md +64 -0
- package/.agent-src/commands/agent-handoff.md +64 -0
- package/.agent-src/commands/agent-status.md +83 -0
- package/.agent-src/commands/agents-audit.md +243 -0
- package/.agent-src/commands/agents-cleanup.md +169 -0
- package/.agent-src/commands/agents-prepare.md +137 -0
- package/.agent-src/commands/analyze-reference-repo.md +191 -0
- package/.agent-src/commands/bug-fix.md +181 -0
- package/.agent-src/commands/bug-investigate.md +175 -0
- package/.agent-src/commands/commit.md +121 -0
- package/.agent-src/commands/compress.md +177 -0
- package/.agent-src/commands/config-agent-settings.md +126 -0
- package/.agent-src/commands/context-create.md +167 -0
- package/.agent-src/commands/context-refactor.md +170 -0
- package/.agent-src/commands/copilot-agents-init.md +150 -0
- package/.agent-src/commands/copilot-agents-optimize.md +251 -0
- package/.agent-src/commands/create-pr-description.md +112 -0
- package/.agent-src/commands/create-pr.md +76 -0
- package/.agent-src/commands/do-and-judge.md +114 -0
- package/.agent-src/commands/do-in-steps.md +84 -0
- package/.agent-src/commands/e2e-heal.md +98 -0
- package/.agent-src/commands/e2e-plan.md +85 -0
- package/.agent-src/commands/estimate-ticket.md +80 -0
- package/.agent-src/commands/feature-dev.md +111 -0
- package/.agent-src/commands/feature-explore.md +180 -0
- package/.agent-src/commands/feature-plan.md +288 -0
- package/.agent-src/commands/feature-refactor.md +181 -0
- package/.agent-src/commands/feature-roadmap.md +184 -0
- package/.agent-src/commands/fix-ci.md +48 -0
- package/.agent-src/commands/fix-portability.md +97 -0
- package/.agent-src/commands/fix-pr-bot-comments.md +146 -0
- package/.agent-src/commands/fix-pr-comments.md +58 -0
- package/.agent-src/commands/fix-pr-developer-comments.md +152 -0
- package/.agent-src/commands/fix-references.md +94 -0
- package/.agent-src/commands/fix-seeder.md +146 -0
- package/.agent-src/commands/implement-ticket.md +133 -0
- package/.agent-src/commands/jira-ticket.md +71 -0
- package/.agent-src/commands/judge.md +86 -0
- package/.agent-src/commands/memory-add.md +130 -0
- package/.agent-src/commands/memory-full.md +97 -0
- package/.agent-src/commands/memory-promote.md +144 -0
- package/.agent-src/commands/mode.md +121 -0
- package/.agent-src/commands/module-create.md +132 -0
- package/.agent-src/commands/module-explore.md +157 -0
- package/.agent-src/commands/optimize-agents.md +139 -0
- package/.agent-src/commands/optimize-augmentignore.md +262 -0
- package/.agent-src/commands/optimize-rtk-filters.md +120 -0
- package/.agent-src/commands/optimize-skills.md +121 -0
- package/.agent-src/commands/override-create.md +97 -0
- package/.agent-src/commands/override-manage.md +96 -0
- package/.agent-src/commands/package-reset.md +154 -0
- package/.agent-src/commands/package-test.md +154 -0
- package/.agent-src/commands/prepare-for-review.md +91 -0
- package/.agent-src/commands/project-analyze.md +300 -0
- package/.agent-src/commands/project-health.md +95 -0
- package/.agent-src/commands/propose-memory.md +108 -0
- package/.agent-src/commands/quality-fix.md +106 -0
- package/.agent-src/commands/refine-ticket.md +81 -0
- package/.agent-src/commands/review-changes.md +130 -0
- package/.agent-src/commands/review-routing.md +111 -0
- package/.agent-src/commands/roadmap-create.md +110 -0
- package/.agent-src/commands/roadmap-execute.md +68 -0
- package/.agent-src/commands/rule-compliance-audit.md +139 -0
- package/.agent-src/commands/tests-create.md +73 -0
- package/.agent-src/commands/tests-execute.md +58 -0
- package/.agent-src/commands/threat-model.md +115 -0
- package/.agent-src/commands/update-form-request-messages.md +189 -0
- package/.agent-src/commands/upstream-contribute.md +171 -0
- package/.agent-src/contexts/augment-infrastructure.md +181 -0
- package/.agent-src/contexts/documentation-hierarchy.md +142 -0
- package/.agent-src/contexts/model-recommendations.md +142 -0
- package/.agent-src/contexts/override-system.md +187 -0
- package/.agent-src/contexts/skills-and-commands.md +154 -0
- package/.agent-src/contexts/subagent-configuration.md +62 -0
- package/.agent-src/guidelines/agent-infra/agent-interaction-and-decision-quality.md +110 -0
- package/.agent-src/guidelines/agent-infra/break-glass-usage.md +113 -0
- package/.agent-src/guidelines/agent-infra/developer-judgment.md +82 -0
- package/.agent-src/guidelines/agent-infra/engineering-memory-data-format.md +117 -0
- package/.agent-src/guidelines/agent-infra/layered-settings.md +158 -0
- package/.agent-src/guidelines/agent-infra/memory-access.md +121 -0
- package/.agent-src/guidelines/agent-infra/naming.md +69 -0
- package/.agent-src/guidelines/agent-infra/output-patterns.md +117 -0
- package/.agent-src/guidelines/agent-infra/review-routing-data-format.md +144 -0
- package/.agent-src/guidelines/agent-infra/role-contracts.md +211 -0
- package/.agent-src/guidelines/agent-infra/role-mode-router.md +89 -0
- package/.agent-src/guidelines/agent-infra/runtime-layer.md +89 -0
- package/.agent-src/guidelines/agent-infra/self-improvement-pipeline.md +135 -0
- package/.agent-src/guidelines/agent-infra/size-and-scope.md +189 -0
- package/.agent-src/guidelines/agent-infra/tool-integration.md +73 -0
- package/.agent-src/guidelines/docs/readme-size-and-splitting.md +153 -0
- package/.agent-src/guidelines/e2e/playwright.md +363 -0
- package/.agent-src/guidelines/php/api-design.md +115 -0
- package/.agent-src/guidelines/php/artisan-commands.md +81 -0
- package/.agent-src/guidelines/php/blade-ui.md +78 -0
- package/.agent-src/guidelines/php/controllers.md +90 -0
- package/.agent-src/guidelines/php/database.md +111 -0
- package/.agent-src/guidelines/php/eloquent.md +208 -0
- package/.agent-src/guidelines/php/flux.md +80 -0
- package/.agent-src/guidelines/php/general.md +191 -0
- package/.agent-src/guidelines/php/git.md +96 -0
- package/.agent-src/guidelines/php/jobs.md +111 -0
- package/.agent-src/guidelines/php/livewire.md +71 -0
- package/.agent-src/guidelines/php/logging.md +79 -0
- package/.agent-src/guidelines/php/naming.md +89 -0
- package/.agent-src/guidelines/php/patterns/dependency-injection.md +57 -0
- package/.agent-src/guidelines/php/patterns/dtos.md +199 -0
- package/.agent-src/guidelines/php/patterns/events.md +67 -0
- package/.agent-src/guidelines/php/patterns/factory.md +53 -0
- package/.agent-src/guidelines/php/patterns/pipelines.md +66 -0
- package/.agent-src/guidelines/php/patterns/policies.md +66 -0
- package/.agent-src/guidelines/php/patterns/repositories.md +122 -0
- package/.agent-src/guidelines/php/patterns/service-layer.md +64 -0
- package/.agent-src/guidelines/php/patterns/strategy.md +69 -0
- package/.agent-src/guidelines/php/patterns.md +28 -0
- package/.agent-src/guidelines/php/performance.md +92 -0
- package/.agent-src/guidelines/php/resources.md +100 -0
- package/.agent-src/guidelines/php/security.md +110 -0
- package/.agent-src/guidelines/php/sql.md +97 -0
- package/.agent-src/guidelines/php/validations.md +119 -0
- package/.agent-src/guidelines/php/websocket.md +100 -0
- package/.agent-src/personas/README.md +104 -0
- package/.agent-src/personas/ai-agent.md +77 -0
- package/.agent-src/personas/critical-challenger.md +73 -0
- package/.agent-src/personas/developer.md +73 -0
- package/.agent-src/personas/product-owner.md +78 -0
- package/.agent-src/personas/qa.md +67 -0
- package/.agent-src/personas/senior-engineer.md +77 -0
- package/.agent-src/personas/stakeholder.md +78 -0
- package/.agent-src/rules/agent-docs.md +61 -0
- package/.agent-src/rules/analysis-skill-routing.md +48 -0
- package/.agent-src/rules/architecture.md +62 -0
- package/.agent-src/rules/artifact-drafting-protocol.md +73 -0
- package/.agent-src/rules/ask-when-uncertain.md +52 -0
- package/.agent-src/rules/augment-portability.md +38 -0
- package/.agent-src/rules/augment-source-of-truth.md +128 -0
- package/.agent-src/rules/capture-learnings.md +89 -0
- package/.agent-src/rules/cli-output-handling.md +94 -0
- package/.agent-src/rules/commit-conventions.md +64 -0
- package/.agent-src/rules/context-hygiene.md +90 -0
- package/.agent-src/rules/docker-commands.md +55 -0
- package/.agent-src/rules/docs-sync.md +79 -0
- package/.agent-src/rules/downstream-changes.md +70 -0
- package/.agent-src/rules/e2e-testing.md +53 -0
- package/.agent-src/rules/guidelines.md +90 -0
- package/.agent-src/rules/improve-before-implement.md +94 -0
- package/.agent-src/rules/language-and-tone.md +104 -0
- package/.agent-src/rules/laravel-translations.md +48 -0
- package/.agent-src/rules/markdown-safe-codeblocks.md +18 -0
- package/.agent-src/rules/minimal-safe-diff.md +87 -0
- package/.agent-src/rules/missing-tool-handling.md +62 -0
- package/.agent-src/rules/model-recommendation.md +70 -0
- package/.agent-src/rules/package-ci-checks.md +80 -0
- package/.agent-src/rules/php-coding.md +63 -0
- package/.agent-src/rules/preservation-guard.md +29 -0
- package/.agent-src/rules/review-routing-awareness.md +125 -0
- package/.agent-src/rules/reviewer-awareness.md +92 -0
- package/.agent-src/rules/roadmap-progress-sync.md +56 -0
- package/.agent-src/rules/role-mode-adherence.md +54 -0
- package/.agent-src/rules/rule-type-governance.md +46 -0
- package/.agent-src/rules/runtime-safety.md +42 -0
- package/.agent-src/rules/scope-control.md +40 -0
- package/.agent-src/rules/security-sensitive-stop.md +77 -0
- package/.agent-src/rules/size-enforcement.md +29 -0
- package/.agent-src/rules/skill-improvement-trigger.md +58 -0
- package/.agent-src/rules/skill-quality.md +110 -0
- package/.agent-src/rules/slash-commands.md +30 -0
- package/.agent-src/rules/think-before-action.md +91 -0
- package/.agent-src/rules/token-efficiency.md +99 -0
- package/.agent-src/rules/tool-safety.md +36 -0
- package/.agent-src/rules/upstream-proposal.md +76 -0
- package/.agent-src/rules/user-interaction.md +79 -0
- package/.agent-src/rules/verify-before-complete.md +120 -0
- package/.agent-src/scripts/scan-seeder-violations.php +145 -0
- package/.agent-src/scripts/update_roadmap_progress.py +244 -0
- package/.agent-src/skills/adversarial-review/SKILL.md +149 -0
- package/.agent-src/skills/agent-docs-writing/SKILL.md +234 -0
- package/.agent-src/skills/analysis-autonomous-mode/SKILL.md +197 -0
- package/.agent-src/skills/analysis-skill-router/SKILL.md +134 -0
- package/.agent-src/skills/api-design/SKILL.md +104 -0
- package/.agent-src/skills/api-endpoint/SKILL.md +185 -0
- package/.agent-src/skills/api-testing/SKILL.md +206 -0
- package/.agent-src/skills/artisan-commands/SKILL.md +78 -0
- package/.agent-src/skills/authz-review/SKILL.md +171 -0
- package/.agent-src/skills/aws-infrastructure/SKILL.md +152 -0
- package/.agent-src/skills/blade-ui/SKILL.md +75 -0
- package/.agent-src/skills/blast-radius-analyzer/SKILL.md +185 -0
- package/.agent-src/skills/bug-analyzer/SKILL.md +256 -0
- package/.agent-src/skills/check-refs/SKILL.md +72 -0
- package/.agent-src/skills/code-refactoring/SKILL.md +200 -0
- package/.agent-src/skills/code-review/SKILL.md +214 -0
- package/.agent-src/skills/command-routing/SKILL.md +96 -0
- package/.agent-src/skills/command-writing/SKILL.md +143 -0
- package/.agent-src/skills/composer-packages/SKILL.md +172 -0
- package/.agent-src/skills/context-authoring/SKILL.md +157 -0
- package/.agent-src/skills/context-document/SKILL.md +153 -0
- package/.agent-src/skills/conventional-commits-writing/SKILL.md +70 -0
- package/.agent-src/skills/copilot-agents-optimization/SKILL.md +220 -0
- package/.agent-src/skills/copilot-config/SKILL.md +203 -0
- package/.agent-src/skills/dashboard-design/SKILL.md +116 -0
- package/.agent-src/skills/data-flow-mapper/SKILL.md +160 -0
- package/.agent-src/skills/database/SKILL.md +91 -0
- package/.agent-src/skills/dependency-upgrade/SKILL.md +204 -0
- package/.agent-src/skills/description-assist/SKILL.md +169 -0
- package/.agent-src/skills/design-review/SKILL.md +228 -0
- package/.agent-src/skills/devcontainer/SKILL.md +121 -0
- package/.agent-src/skills/developer-like-execution/SKILL.md +276 -0
- package/.agent-src/skills/docker/SKILL.md +245 -0
- package/.agent-src/skills/dto-creator/SKILL.md +117 -0
- package/.agent-src/skills/eloquent/SKILL.md +92 -0
- package/.agent-src/skills/eloquent/evals/last-run.json +99 -0
- package/.agent-src/skills/eloquent/evals/triggers.json +16 -0
- package/.agent-src/skills/estimate-ticket/SKILL.md +186 -0
- package/.agent-src/skills/estimate-ticket/evals/output-schema.yml +20 -0
- package/.agent-src/skills/estimate-ticket/evals/triggers.json +18 -0
- package/.agent-src/skills/fe-design/SKILL.md +223 -0
- package/.agent-src/skills/feature-planning/SKILL.md +226 -0
- package/.agent-src/skills/file-editor/SKILL.md +129 -0
- package/.agent-src/skills/finishing-a-development-branch/SKILL.md +200 -0
- package/.agent-src/skills/flux/SKILL.md +64 -0
- package/.agent-src/skills/git-workflow/SKILL.md +102 -0
- package/.agent-src/skills/github-ci/SKILL.md +122 -0
- package/.agent-src/skills/grafana/SKILL.md +168 -0
- package/.agent-src/skills/guideline-writing/SKILL.md +147 -0
- package/.agent-src/skills/jira-integration/SKILL.md +182 -0
- package/.agent-src/skills/jobs-events/SKILL.md +87 -0
- package/.agent-src/skills/judge-bug-hunter/SKILL.md +157 -0
- package/.agent-src/skills/judge-code-quality/SKILL.md +158 -0
- package/.agent-src/skills/judge-security-auditor/SKILL.md +167 -0
- package/.agent-src/skills/judge-test-coverage/SKILL.md +154 -0
- package/.agent-src/skills/laravel/SKILL.md +195 -0
- package/.agent-src/skills/laravel-horizon/SKILL.md +169 -0
- package/.agent-src/skills/laravel-mail/SKILL.md +193 -0
- package/.agent-src/skills/laravel-middleware/SKILL.md +185 -0
- package/.agent-src/skills/laravel-notifications/SKILL.md +168 -0
- package/.agent-src/skills/laravel-pennant/SKILL.md +188 -0
- package/.agent-src/skills/laravel-pulse/SKILL.md +160 -0
- package/.agent-src/skills/laravel-reverb/SKILL.md +205 -0
- package/.agent-src/skills/laravel-scheduling/SKILL.md +167 -0
- package/.agent-src/skills/laravel-validation/SKILL.md +71 -0
- package/.agent-src/skills/learning-to-rule-or-skill/SKILL.md +249 -0
- package/.agent-src/skills/lint-skills/SKILL.md +72 -0
- package/.agent-src/skills/livewire/SKILL.md +79 -0
- package/.agent-src/skills/logging-monitoring/SKILL.md +100 -0
- package/.agent-src/skills/mcp/SKILL.md +193 -0
- package/.agent-src/skills/merge-conflicts/SKILL.md +158 -0
- package/.agent-src/skills/migration-creator/SKILL.md +160 -0
- package/.agent-src/skills/module-management/SKILL.md +154 -0
- package/.agent-src/skills/multi-tenancy/SKILL.md +129 -0
- package/.agent-src/skills/openapi/SKILL.md +154 -0
- package/.agent-src/skills/override-management/SKILL.md +186 -0
- package/.agent-src/skills/performance/SKILL.md +69 -0
- package/.agent-src/skills/performance-analysis/SKILL.md +118 -0
- package/.agent-src/skills/pest-testing/SKILL.md +321 -0
- package/.agent-src/skills/php-coder/SKILL.md +78 -0
- package/.agent-src/skills/php-coder/evals/triggers.json +16 -0
- package/.agent-src/skills/php-debugging/SKILL.md +184 -0
- package/.agent-src/skills/php-service/SKILL.md +96 -0
- package/.agent-src/skills/playwright-testing/SKILL.md +244 -0
- package/.agent-src/skills/project-analysis-core/SKILL.md +138 -0
- package/.agent-src/skills/project-analysis-hypothesis-driven/SKILL.md +130 -0
- package/.agent-src/skills/project-analysis-laravel/SKILL.md +119 -0
- package/.agent-src/skills/project-analysis-nextjs/SKILL.md +123 -0
- package/.agent-src/skills/project-analysis-node-express/SKILL.md +111 -0
- package/.agent-src/skills/project-analysis-react/SKILL.md +119 -0
- package/.agent-src/skills/project-analysis-symfony/SKILL.md +111 -0
- package/.agent-src/skills/project-analysis-zend-laminas/SKILL.md +108 -0
- package/.agent-src/skills/project-analyzer/SKILL.md +341 -0
- package/.agent-src/skills/project-docs/SKILL.md +137 -0
- package/.agent-src/skills/quality-tools/SKILL.md +411 -0
- package/.agent-src/skills/readme-reviewer/SKILL.md +187 -0
- package/.agent-src/skills/readme-writing/SKILL.md +142 -0
- package/.agent-src/skills/readme-writing-package/SKILL.md +185 -0
- package/.agent-src/skills/receiving-code-review/SKILL.md +190 -0
- package/.agent-src/skills/refine-ticket/SKILL.md +310 -0
- package/.agent-src/skills/refine-ticket/detection-map.yml +124 -0
- package/.agent-src/skills/refine-ticket/evals/output-schema.yml +16 -0
- package/.agent-src/skills/refine-ticket/evals/triggers.json +16 -0
- package/.agent-src/skills/requesting-code-review/SKILL.md +199 -0
- package/.agent-src/skills/review-routing/SKILL.md +195 -0
- package/.agent-src/skills/roadmap-management/SKILL.md +303 -0
- package/.agent-src/skills/rtk-output-filtering/SKILL.md +184 -0
- package/.agent-src/skills/rule-writing/SKILL.md +148 -0
- package/.agent-src/skills/security/SKILL.md +79 -0
- package/.agent-src/skills/security-audit/SKILL.md +123 -0
- package/.agent-src/skills/sentry-integration/SKILL.md +170 -0
- package/.agent-src/skills/sequential-thinking/SKILL.md +158 -0
- package/.agent-src/skills/skill-improvement-pipeline/SKILL.md +155 -0
- package/.agent-src/skills/skill-management/SKILL.md +121 -0
- package/.agent-src/skills/skill-reviewer/SKILL.md +218 -0
- package/.agent-src/skills/skill-writing/SKILL.md +291 -0
- package/.agent-src/skills/skill-writing/evals/triggers.json +16 -0
- package/.agent-src/skills/sql-writing/SKILL.md +74 -0
- package/.agent-src/skills/subagent-orchestration/SKILL.md +190 -0
- package/.agent-src/skills/systematic-debugging/SKILL.md +244 -0
- package/.agent-src/skills/technical-specification/SKILL.md +185 -0
- package/.agent-src/skills/terraform/SKILL.md +137 -0
- package/.agent-src/skills/terragrunt/SKILL.md +217 -0
- package/.agent-src/skills/test-driven-development/SKILL.md +252 -0
- package/.agent-src/skills/test-performance/SKILL.md +172 -0
- package/.agent-src/skills/threat-modeling/SKILL.md +189 -0
- package/.agent-src/skills/traefik/SKILL.md +319 -0
- package/.agent-src/skills/universal-project-analysis/SKILL.md +179 -0
- package/.agent-src/skills/upstream-contribute/SKILL.md +255 -0
- package/.agent-src/skills/using-git-worktrees/SKILL.md +148 -0
- package/.agent-src/skills/validate-feature-fit/SKILL.md +113 -0
- package/.agent-src/skills/verify-before-complete/SKILL.md +188 -0
- package/.agent-src/skills/websocket/SKILL.md +75 -0
- package/.agent-src/templates/AGENTS.md +146 -0
- package/.agent-src/templates/agent-settings.md +256 -0
- package/.agent-src/templates/agents/.gitattributes.fragment +16 -0
- package/.agent-src/templates/agents/agent-project-settings.example.yml +138 -0
- package/.agent-src/templates/agents/memory/architecture-decisions.example.yml +95 -0
- package/.agent-src/templates/agents/memory/domain-invariants.example.yml +80 -0
- package/.agent-src/templates/agents/memory/historical-patterns.example.yml +82 -0
- package/.agent-src/templates/agents/memory/incident-learnings.example.yml +113 -0
- package/.agent-src/templates/agents/memory/ownership.example.yml +75 -0
- package/.agent-src/templates/agents/memory/product-rules.example.yml +87 -0
- package/.agent-src/templates/agents/proposal.example.md +143 -0
- package/.agent-src/templates/command.md +84 -0
- package/.agent-src/templates/contexts/auth-model.md +59 -0
- package/.agent-src/templates/contexts/data-sensitivity.md +60 -0
- package/.agent-src/templates/contexts/deployment-order.md +72 -0
- package/.agent-src/templates/contexts/observability.md +64 -0
- package/.agent-src/templates/contexts/tenant-boundaries.md +68 -0
- package/.agent-src/templates/contexts.md +116 -0
- package/.agent-src/templates/copilot-instructions.md +115 -0
- package/.agent-src/templates/features.md +125 -0
- package/.agent-src/templates/github-workflows/memory-hygiene.yml +133 -0
- package/.agent-src/templates/github-workflows/pr-risk-review.yml +123 -0
- package/.agent-src/templates/github-workflows/proposal-drift.yml +118 -0
- package/.agent-src/templates/overrides/command.md +24 -0
- package/.agent-src/templates/overrides/guideline.md +21 -0
- package/.agent-src/templates/overrides/rule.md +19 -0
- package/.agent-src/templates/overrides/skill.md +24 -0
- package/.agent-src/templates/overrides/template.md +21 -0
- package/.agent-src/templates/persona.md +99 -0
- package/.agent-src/templates/roadmaps.md +109 -0
- package/.agent-src/templates/scripts/README.md +195 -0
- package/.agent-src/templates/scripts/check_memory.py +283 -0
- package/.agent-src/templates/scripts/check_memory_proposal.py +180 -0
- package/.agent-src/templates/scripts/historical-bug-patterns.example.yml +84 -0
- package/.agent-src/templates/scripts/implement_ticket/__init__.py +57 -0
- package/.agent-src/templates/scripts/implement_ticket/__main__.py +9 -0
- package/.agent-src/templates/scripts/implement_ticket/cli.py +171 -0
- package/.agent-src/templates/scripts/implement_ticket/delivery_state.py +130 -0
- package/.agent-src/templates/scripts/implement_ticket/dispatcher.py +134 -0
- package/.agent-src/templates/scripts/implement_ticket/persona_policy.py +85 -0
- package/.agent-src/templates/scripts/implement_ticket/steps/__init__.py +49 -0
- package/.agent-src/templates/scripts/implement_ticket/steps/analyze.py +98 -0
- package/.agent-src/templates/scripts/implement_ticket/steps/implement.py +145 -0
- package/.agent-src/templates/scripts/implement_ticket/steps/memory.py +136 -0
- package/.agent-src/templates/scripts/implement_ticket/steps/plan.py +175 -0
- package/.agent-src/templates/scripts/implement_ticket/steps/refine.py +140 -0
- package/.agent-src/templates/scripts/implement_ticket/steps/report.py +195 -0
- package/.agent-src/templates/scripts/implement_ticket/steps/test.py +180 -0
- package/.agent-src/templates/scripts/implement_ticket/steps/verify.py +170 -0
- package/.agent-src/templates/scripts/memory_hash.py +75 -0
- package/.agent-src/templates/scripts/memory_lookup.py +216 -0
- package/.agent-src/templates/scripts/memory_report.py +184 -0
- package/.agent-src/templates/scripts/memory_signal.py +167 -0
- package/.agent-src/templates/scripts/memory_status.py +156 -0
- package/.agent-src/templates/scripts/ownership-map.example.yml +87 -0
- package/.agent-src/templates/scripts/pr-risk-config.example.yml +76 -0
- package/.agent-src/templates/scripts/pr_review_routing.py +340 -0
- package/.agent-src/templates/scripts/pr_risk_review.py +211 -0
- package/.agent-src/templates/skill.md +136 -0
- package/.augment-plugin/marketplace.json +32 -0
- package/.augment-plugin/plugin.json +21 -0
- package/.claude-plugin/marketplace.json +119 -0
- package/AGENTS.md +121 -0
- package/CHANGELOG.md +279 -0
- package/CONTRIBUTING.md +176 -0
- package/LICENSE +21 -0
- package/README.md +357 -0
- package/bin/install.php +38 -0
- package/composer.json +29 -0
- package/config/agent-settings.template.yml +96 -0
- package/config/profiles/balanced.ini +10 -0
- package/config/profiles/full.ini +10 -0
- package/config/profiles/minimal.ini +10 -0
- package/docs/architecture.md +144 -0
- package/docs/customization.md +88 -0
- package/docs/development.md +171 -0
- package/docs/getting-started.md +130 -0
- package/docs/github-topics.md +84 -0
- package/docs/installation.md +376 -0
- package/docs/mcp.md +133 -0
- package/docs/quality.md +98 -0
- package/docs/skills-catalog.md +136 -0
- package/docs/troubleshooting.md +167 -0
- package/llms.txt +130 -0
- package/package.json +31 -0
- package/scripts/audit_skill_descriptions.py +168 -0
- package/scripts/check_compression.py +221 -0
- package/scripts/check_memory.py +341 -0
- package/scripts/check_memory_proposal.py +180 -0
- package/scripts/check_portability.py +320 -0
- package/scripts/check_proposal.py +269 -0
- package/scripts/check_references.py +400 -0
- package/scripts/ci_summary.py +131 -0
- package/scripts/compress.py +671 -0
- package/scripts/compress.sh +18 -0
- package/scripts/first-run.sh +109 -0
- package/scripts/generate_catalog.py +116 -0
- package/scripts/install +151 -0
- package/scripts/install-hooks.sh +29 -0
- package/scripts/install.py +487 -0
- package/scripts/install.sh +637 -0
- package/scripts/install_anthropic_key.sh +101 -0
- package/scripts/inventory_frontmatter.py +164 -0
- package/scripts/lint_marketplace.py +142 -0
- package/scripts/lint_regression.py +232 -0
- package/scripts/mcp_render.py +159 -0
- package/scripts/measure_patterns.py +376 -0
- package/scripts/memory_hash.py +75 -0
- package/scripts/memory_lookup.py +441 -0
- package/scripts/memory_report.py +336 -0
- package/scripts/memory_signal.py +210 -0
- package/scripts/memory_status.py +195 -0
- package/scripts/postinstall.sh +60 -0
- package/scripts/readme_linter.py +580 -0
- package/scripts/refine_ticket_detect.py +623 -0
- package/scripts/requirements-evals.txt +7 -0
- package/scripts/runtime_dispatcher.py +265 -0
- package/scripts/runtime_handler.py +148 -0
- package/scripts/runtime_registry.py +166 -0
- package/scripts/schemas/command.schema.json +32 -0
- package/scripts/schemas/persona.schema.json +42 -0
- package/scripts/schemas/rule.schema.json +28 -0
- package/scripts/schemas/skill.schema.json +73 -0
- package/scripts/setup.sh +230 -0
- package/scripts/setup_eval_venv.sh +58 -0
- package/scripts/skill_linter.py +2175 -0
- package/scripts/skill_trigger_eval.py +651 -0
- package/scripts/tool_registry.py +146 -0
- package/scripts/tools/__init__.py +1 -0
- package/scripts/tools/adapter_errors.py +63 -0
- package/scripts/tools/base_adapter.py +91 -0
- package/scripts/tools/github_adapter.py +128 -0
- package/scripts/tools/jira_adapter.py +115 -0
- package/scripts/update_counts.py +147 -0
- package/scripts/validate_frontmatter.py +424 -0
- package/templates/consumer-settings/README.md +46 -0
- package/templates/consumer-settings/augment-settings.json +12 -0
- package/templates/consumer-settings/claude-settings.json +9 -0
- package/templates/consumer-settings/copilot-settings.json +14 -0
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Runtime Dispatcher — resolves execution type and drives real handler execution.
|
|
4
|
+
|
|
5
|
+
Two modes:
|
|
6
|
+
|
|
7
|
+
- resolve (default): produce a structured execution request, enforce safety,
|
|
8
|
+
return dispatch metadata. No side effects.
|
|
9
|
+
- run: dispatch the skill, then hand it to the matching runtime handler to
|
|
10
|
+
actually execute. Returns a typed ExecutionResult.
|
|
11
|
+
|
|
12
|
+
Usage:
|
|
13
|
+
python3 scripts/runtime_dispatcher.py --skill NAME [--format text|json]
|
|
14
|
+
python3 scripts/runtime_dispatcher.py resolve --skill NAME
|
|
15
|
+
python3 scripts/runtime_dispatcher.py run --skill NAME [--cwd PATH] [--output FILE]
|
|
16
|
+
|
|
17
|
+
`run --output FILE` persists the ExecutionResult as JSON to FILE. CI uses
|
|
18
|
+
this to feed `scripts/ci_summary.py`.
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
from __future__ import annotations
|
|
22
|
+
|
|
23
|
+
import argparse
|
|
24
|
+
import json
|
|
25
|
+
import sys
|
|
26
|
+
from dataclasses import dataclass, asdict
|
|
27
|
+
from pathlib import Path
|
|
28
|
+
from typing import List, Optional
|
|
29
|
+
|
|
30
|
+
sys.path.insert(0, str(Path(__file__).resolve().parent))
|
|
31
|
+
from runtime_registry import SkillRuntime, build_registry
|
|
32
|
+
from runtime_handler import ExecutionResult, HandlerError, execute_shell
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
@dataclass
|
|
36
|
+
class ExecutionRequest:
|
|
37
|
+
"""Structured execution request produced by the dispatcher."""
|
|
38
|
+
skill_name: str
|
|
39
|
+
execution_type: str
|
|
40
|
+
handler: str
|
|
41
|
+
timeout_seconds: int
|
|
42
|
+
safety_mode: Optional[str]
|
|
43
|
+
allowed_tools: List[str]
|
|
44
|
+
status: str # "ready", "blocked", "not_found"
|
|
45
|
+
reason: Optional[str]
|
|
46
|
+
|
|
47
|
+
@property
|
|
48
|
+
def is_ready(self) -> bool:
|
|
49
|
+
return self.status == "ready"
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
@dataclass
|
|
53
|
+
class DispatchResult:
|
|
54
|
+
"""Result of dispatching a skill for execution."""
|
|
55
|
+
request: ExecutionRequest
|
|
56
|
+
warnings: List[str]
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def dispatch(skill_name: str, registry: List[SkillRuntime]) -> DispatchResult:
|
|
60
|
+
"""Resolve and validate a skill for execution."""
|
|
61
|
+
warnings: List[str] = []
|
|
62
|
+
|
|
63
|
+
# Find skill in registry
|
|
64
|
+
matches = [s for s in registry if s.name == skill_name]
|
|
65
|
+
if not matches:
|
|
66
|
+
return DispatchResult(
|
|
67
|
+
request=ExecutionRequest(
|
|
68
|
+
skill_name=skill_name,
|
|
69
|
+
execution_type="unknown",
|
|
70
|
+
handler="none",
|
|
71
|
+
timeout_seconds=0,
|
|
72
|
+
safety_mode=None,
|
|
73
|
+
allowed_tools=[],
|
|
74
|
+
status="not_found",
|
|
75
|
+
reason=f"Skill '{skill_name}' not found in runtime registry",
|
|
76
|
+
),
|
|
77
|
+
warnings=[],
|
|
78
|
+
)
|
|
79
|
+
|
|
80
|
+
skill = matches[0]
|
|
81
|
+
|
|
82
|
+
# Manual skills cannot be dispatched
|
|
83
|
+
if skill.execution_type == "manual":
|
|
84
|
+
return DispatchResult(
|
|
85
|
+
request=ExecutionRequest(
|
|
86
|
+
skill_name=skill.name,
|
|
87
|
+
execution_type=skill.execution_type,
|
|
88
|
+
handler=skill.handler,
|
|
89
|
+
timeout_seconds=skill.timeout_seconds,
|
|
90
|
+
safety_mode=skill.safety_mode,
|
|
91
|
+
allowed_tools=skill.allowed_tools,
|
|
92
|
+
status="blocked",
|
|
93
|
+
reason="Manual skills cannot be dispatched for execution",
|
|
94
|
+
),
|
|
95
|
+
warnings=[],
|
|
96
|
+
)
|
|
97
|
+
|
|
98
|
+
# Automated skills must pass safety checks
|
|
99
|
+
if skill.is_automated:
|
|
100
|
+
if skill.handler == "none":
|
|
101
|
+
return DispatchResult(
|
|
102
|
+
request=ExecutionRequest(
|
|
103
|
+
skill_name=skill.name,
|
|
104
|
+
execution_type=skill.execution_type,
|
|
105
|
+
handler=skill.handler,
|
|
106
|
+
timeout_seconds=skill.timeout_seconds,
|
|
107
|
+
safety_mode=skill.safety_mode,
|
|
108
|
+
allowed_tools=skill.allowed_tools,
|
|
109
|
+
status="blocked",
|
|
110
|
+
reason="Automated skill has no handler",
|
|
111
|
+
),
|
|
112
|
+
warnings=[],
|
|
113
|
+
)
|
|
114
|
+
if skill.safety_mode != "strict":
|
|
115
|
+
return DispatchResult(
|
|
116
|
+
request=ExecutionRequest(
|
|
117
|
+
skill_name=skill.name,
|
|
118
|
+
execution_type=skill.execution_type,
|
|
119
|
+
handler=skill.handler,
|
|
120
|
+
timeout_seconds=skill.timeout_seconds,
|
|
121
|
+
safety_mode=skill.safety_mode,
|
|
122
|
+
allowed_tools=skill.allowed_tools,
|
|
123
|
+
status="blocked",
|
|
124
|
+
reason="Automated skill requires safety_mode: strict",
|
|
125
|
+
),
|
|
126
|
+
warnings=[],
|
|
127
|
+
)
|
|
128
|
+
|
|
129
|
+
# Assisted/automated skill is ready
|
|
130
|
+
if skill.execution_type == "assisted":
|
|
131
|
+
warnings.append("Assisted execution requires human confirmation before action")
|
|
132
|
+
|
|
133
|
+
return DispatchResult(
|
|
134
|
+
request=ExecutionRequest(
|
|
135
|
+
skill_name=skill.name,
|
|
136
|
+
execution_type=skill.execution_type,
|
|
137
|
+
handler=skill.handler,
|
|
138
|
+
timeout_seconds=skill.timeout_seconds,
|
|
139
|
+
safety_mode=skill.safety_mode,
|
|
140
|
+
allowed_tools=skill.allowed_tools,
|
|
141
|
+
status="ready",
|
|
142
|
+
reason=None,
|
|
143
|
+
),
|
|
144
|
+
warnings=warnings,
|
|
145
|
+
)
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
def run(skill_name: str, registry: List[SkillRuntime], cwd: Path) -> ExecutionResult:
|
|
149
|
+
"""Dispatch and execute a skill. Raises HandlerError on structural issues."""
|
|
150
|
+
dispatch_result = dispatch(skill_name, registry)
|
|
151
|
+
req = dispatch_result.request
|
|
152
|
+
if not req.is_ready:
|
|
153
|
+
raise HandlerError(
|
|
154
|
+
f"Skill '{skill_name}' is not ready to run: "
|
|
155
|
+
f"{req.status} — {req.reason or 'no reason given'}"
|
|
156
|
+
)
|
|
157
|
+
|
|
158
|
+
skill = next(s for s in registry if s.name == skill_name)
|
|
159
|
+
if skill.handler in {"shell", "php", "node"}:
|
|
160
|
+
return execute_shell(skill, cwd)
|
|
161
|
+
raise HandlerError(
|
|
162
|
+
f"Handler '{skill.handler}' has no executor yet — "
|
|
163
|
+
f"only 'shell' is implemented in this phase"
|
|
164
|
+
)
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
def _print_dispatch(result: DispatchResult, fmt: str) -> None:
|
|
168
|
+
if fmt == "json":
|
|
169
|
+
print(json.dumps(asdict(result), indent=2))
|
|
170
|
+
return
|
|
171
|
+
req = result.request
|
|
172
|
+
print(f"Skill: {req.skill_name}")
|
|
173
|
+
print(f"Status: {req.status}")
|
|
174
|
+
if req.reason:
|
|
175
|
+
print(f"Reason: {req.reason}")
|
|
176
|
+
if req.is_ready:
|
|
177
|
+
print(f"Type: {req.execution_type}")
|
|
178
|
+
print(f"Handler: {req.handler}")
|
|
179
|
+
print(f"Timeout: {req.timeout_seconds}s")
|
|
180
|
+
tools = ", ".join(req.allowed_tools) if req.allowed_tools else "none"
|
|
181
|
+
print(f"Tools: {tools}")
|
|
182
|
+
for w in result.warnings:
|
|
183
|
+
print(f"WARNING: {w}")
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
def _print_execution(result: ExecutionResult, fmt: str) -> None:
|
|
187
|
+
if fmt == "json":
|
|
188
|
+
print(json.dumps(asdict(result), indent=2))
|
|
189
|
+
return
|
|
190
|
+
print(f"Skill: {result.skill_name}")
|
|
191
|
+
print(f"Handler: {result.handler}")
|
|
192
|
+
print(f"Command: {' '.join(result.command)}")
|
|
193
|
+
print(f"Cwd: {result.cwd}")
|
|
194
|
+
print(f"Status: {result.status}")
|
|
195
|
+
print(f"Exit code: {result.exit_code}")
|
|
196
|
+
print(f"Duration: {result.duration_ms}ms")
|
|
197
|
+
if result.error:
|
|
198
|
+
print(f"Error: {result.error}")
|
|
199
|
+
if result.stdout:
|
|
200
|
+
print("--- stdout ---")
|
|
201
|
+
print(result.stdout.rstrip())
|
|
202
|
+
if result.stderr:
|
|
203
|
+
print("--- stderr ---")
|
|
204
|
+
print(result.stderr.rstrip())
|
|
205
|
+
|
|
206
|
+
|
|
207
|
+
def _build_parser() -> argparse.ArgumentParser:
|
|
208
|
+
parser = argparse.ArgumentParser(description="Runtime Dispatcher — resolve or run skill execution")
|
|
209
|
+
sub = parser.add_subparsers(dest="action")
|
|
210
|
+
|
|
211
|
+
# Legacy flat flags retained for backward compatibility.
|
|
212
|
+
parser.add_argument("--skill", help="Skill name to dispatch")
|
|
213
|
+
parser.add_argument("--root", type=Path, default=Path("."), help="Repository root")
|
|
214
|
+
parser.add_argument("--format", choices=["text", "json"], default="text")
|
|
215
|
+
|
|
216
|
+
resolve_p = sub.add_parser("resolve", help="Resolve skill and return dispatch metadata (no execution)")
|
|
217
|
+
resolve_p.add_argument("--skill", required=True)
|
|
218
|
+
resolve_p.add_argument("--root", type=Path, default=Path("."))
|
|
219
|
+
resolve_p.add_argument("--format", choices=["text", "json"], default="text")
|
|
220
|
+
|
|
221
|
+
run_p = sub.add_parser("run", help="Dispatch and execute the skill via its handler")
|
|
222
|
+
run_p.add_argument("--skill", required=True)
|
|
223
|
+
run_p.add_argument("--root", type=Path, default=Path("."))
|
|
224
|
+
run_p.add_argument("--cwd", type=Path, default=None, help="Working directory (default: --root)")
|
|
225
|
+
run_p.add_argument("--format", choices=["text", "json"], default="text")
|
|
226
|
+
run_p.add_argument(
|
|
227
|
+
"--output",
|
|
228
|
+
type=Path,
|
|
229
|
+
default=None,
|
|
230
|
+
help="Persist ExecutionResult as JSON to this path (parents created)",
|
|
231
|
+
)
|
|
232
|
+
return parser
|
|
233
|
+
|
|
234
|
+
|
|
235
|
+
def main() -> int:
|
|
236
|
+
parser = _build_parser()
|
|
237
|
+
args = parser.parse_args()
|
|
238
|
+
|
|
239
|
+
action = args.action or "resolve"
|
|
240
|
+
if action == "resolve" and not args.skill:
|
|
241
|
+
parser.error("--skill is required for resolve")
|
|
242
|
+
|
|
243
|
+
registry = build_registry(args.root)
|
|
244
|
+
|
|
245
|
+
if action == "run":
|
|
246
|
+
cwd = args.cwd if args.cwd is not None else args.root
|
|
247
|
+
try:
|
|
248
|
+
result = run(args.skill, registry, cwd)
|
|
249
|
+
except HandlerError as exc:
|
|
250
|
+
print(f"HandlerError: {exc}", file=sys.stderr)
|
|
251
|
+
return 2
|
|
252
|
+
_print_execution(result, args.format)
|
|
253
|
+
output = getattr(args, "output", None)
|
|
254
|
+
if output is not None:
|
|
255
|
+
output.parent.mkdir(parents=True, exist_ok=True)
|
|
256
|
+
output.write_text(json.dumps(asdict(result), indent=2) + "\n", encoding="utf-8")
|
|
257
|
+
return 0 if result.is_success else 1
|
|
258
|
+
|
|
259
|
+
result = dispatch(args.skill, registry)
|
|
260
|
+
_print_dispatch(result, args.format)
|
|
261
|
+
return 0 if result.request.is_ready or result.request.status == "blocked" else 1
|
|
262
|
+
|
|
263
|
+
|
|
264
|
+
if __name__ == "__main__":
|
|
265
|
+
sys.exit(main())
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Runtime Handler — executes a skill's declared command and captures the result.
|
|
4
|
+
|
|
5
|
+
This is the first real execution path in the runtime layer. It consumes a
|
|
6
|
+
SkillRuntime (from the registry), runs its `command` argv through the
|
|
7
|
+
appropriate handler, and returns a typed ExecutionResult.
|
|
8
|
+
|
|
9
|
+
Responsibilities:
|
|
10
|
+
- Shell-out safely: no shell=True, argv form only
|
|
11
|
+
- Enforce timeout (SkillRuntime.timeout_seconds)
|
|
12
|
+
- Capture stdout, stderr, exit code, wall-clock duration
|
|
13
|
+
- Scrub environment to an allowlist
|
|
14
|
+
- Resolve working directory relative to repository root
|
|
15
|
+
|
|
16
|
+
Out of scope (remain in scaffold layers for now):
|
|
17
|
+
- php/node handlers beyond running their binaries
|
|
18
|
+
- tool registry integration
|
|
19
|
+
- streaming output
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
from __future__ import annotations
|
|
23
|
+
|
|
24
|
+
import os
|
|
25
|
+
import subprocess
|
|
26
|
+
import sys
|
|
27
|
+
import time
|
|
28
|
+
from dataclasses import dataclass, field
|
|
29
|
+
from pathlib import Path
|
|
30
|
+
from typing import Dict, List, Optional
|
|
31
|
+
|
|
32
|
+
sys.path.insert(0, str(Path(__file__).resolve().parent))
|
|
33
|
+
from runtime_registry import SkillRuntime
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
# Environment variables that are always forwarded to the child process.
|
|
37
|
+
# Kept deliberately narrow — no credentials, no shell config, no auth tokens.
|
|
38
|
+
DEFAULT_ENV_ALLOWLIST: tuple[str, ...] = (
|
|
39
|
+
"PATH",
|
|
40
|
+
"HOME",
|
|
41
|
+
"LANG",
|
|
42
|
+
"LC_ALL",
|
|
43
|
+
"LC_CTYPE",
|
|
44
|
+
"TZ",
|
|
45
|
+
"TMPDIR",
|
|
46
|
+
"PYTHONPATH",
|
|
47
|
+
"PYTHONDONTWRITEBYTECODE",
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
@dataclass
|
|
52
|
+
class ExecutionResult:
|
|
53
|
+
"""Typed result of a real command execution."""
|
|
54
|
+
skill_name: str
|
|
55
|
+
handler: str
|
|
56
|
+
command: List[str]
|
|
57
|
+
cwd: str
|
|
58
|
+
exit_code: int
|
|
59
|
+
stdout: str
|
|
60
|
+
stderr: str
|
|
61
|
+
duration_ms: int
|
|
62
|
+
status: str # "success" | "failure" | "timeout" | "error"
|
|
63
|
+
timed_out: bool = False
|
|
64
|
+
error: Optional[str] = None
|
|
65
|
+
artifacts: List[str] = field(default_factory=list)
|
|
66
|
+
|
|
67
|
+
@property
|
|
68
|
+
def is_success(self) -> bool:
|
|
69
|
+
return self.status == "success"
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
class HandlerError(Exception):
|
|
73
|
+
"""Raised when a handler cannot execute for structural reasons."""
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def _build_env(allowlist: tuple[str, ...]) -> Dict[str, str]:
|
|
77
|
+
"""Build a scrubbed environment dict from the allowlist."""
|
|
78
|
+
env: Dict[str, str] = {}
|
|
79
|
+
for key in allowlist:
|
|
80
|
+
value = os.environ.get(key)
|
|
81
|
+
if value is not None:
|
|
82
|
+
env[key] = value
|
|
83
|
+
# Guarantee a minimum PATH so subprocess can find binaries.
|
|
84
|
+
env.setdefault("PATH", "/usr/local/bin:/usr/bin:/bin")
|
|
85
|
+
return env
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
def execute_shell(
|
|
89
|
+
skill: SkillRuntime,
|
|
90
|
+
cwd: Path,
|
|
91
|
+
env_allowlist: tuple[str, ...] = DEFAULT_ENV_ALLOWLIST,
|
|
92
|
+
) -> ExecutionResult:
|
|
93
|
+
"""Run a skill's command as a subprocess and capture the result."""
|
|
94
|
+
if not skill.command:
|
|
95
|
+
raise HandlerError(
|
|
96
|
+
f"Skill '{skill.name}' has no 'command' declared — cannot execute"
|
|
97
|
+
)
|
|
98
|
+
if skill.handler not in {"shell", "php", "node"}:
|
|
99
|
+
raise HandlerError(
|
|
100
|
+
f"Skill '{skill.name}' handler '{skill.handler}' is not a real-execution handler"
|
|
101
|
+
)
|
|
102
|
+
|
|
103
|
+
env = _build_env(env_allowlist)
|
|
104
|
+
cwd_str = str(cwd.resolve())
|
|
105
|
+
start = time.monotonic()
|
|
106
|
+
|
|
107
|
+
try:
|
|
108
|
+
completed = subprocess.run(
|
|
109
|
+
skill.command,
|
|
110
|
+
cwd=cwd_str,
|
|
111
|
+
env=env,
|
|
112
|
+
capture_output=True,
|
|
113
|
+
text=True,
|
|
114
|
+
timeout=skill.timeout_seconds,
|
|
115
|
+
shell=False,
|
|
116
|
+
check=False,
|
|
117
|
+
)
|
|
118
|
+
except subprocess.TimeoutExpired as exc:
|
|
119
|
+
duration_ms = int((time.monotonic() - start) * 1000)
|
|
120
|
+
return ExecutionResult(
|
|
121
|
+
skill_name=skill.name, handler=skill.handler,
|
|
122
|
+
command=list(skill.command), cwd=cwd_str,
|
|
123
|
+
exit_code=-1,
|
|
124
|
+
stdout=(exc.stdout or "") if isinstance(exc.stdout, str) else "",
|
|
125
|
+
stderr=(exc.stderr or "") if isinstance(exc.stderr, str) else "",
|
|
126
|
+
duration_ms=duration_ms, status="timeout", timed_out=True,
|
|
127
|
+
error=f"Timed out after {skill.timeout_seconds}s",
|
|
128
|
+
)
|
|
129
|
+
except FileNotFoundError as exc:
|
|
130
|
+
duration_ms = int((time.monotonic() - start) * 1000)
|
|
131
|
+
return ExecutionResult(
|
|
132
|
+
skill_name=skill.name, handler=skill.handler,
|
|
133
|
+
command=list(skill.command), cwd=cwd_str,
|
|
134
|
+
exit_code=-1, stdout="", stderr="",
|
|
135
|
+
duration_ms=duration_ms, status="error",
|
|
136
|
+
error=f"Command not found: {exc.filename or skill.command[0]}",
|
|
137
|
+
)
|
|
138
|
+
|
|
139
|
+
duration_ms = int((time.monotonic() - start) * 1000)
|
|
140
|
+
status = "success" if completed.returncode == 0 else "failure"
|
|
141
|
+
return ExecutionResult(
|
|
142
|
+
skill_name=skill.name, handler=skill.handler,
|
|
143
|
+
command=list(skill.command), cwd=cwd_str,
|
|
144
|
+
exit_code=completed.returncode,
|
|
145
|
+
stdout=completed.stdout or "",
|
|
146
|
+
stderr=completed.stderr or "",
|
|
147
|
+
duration_ms=duration_ms, status=status,
|
|
148
|
+
)
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Runtime Registry — discovers skills with execution metadata.
|
|
4
|
+
|
|
5
|
+
Responsibilities:
|
|
6
|
+
- Discover skills with execution blocks in frontmatter
|
|
7
|
+
- Validate handler support
|
|
8
|
+
- Expose list of runtime-capable skills
|
|
9
|
+
- Provide skill metadata lookup
|
|
10
|
+
|
|
11
|
+
Usage:
|
|
12
|
+
python3 scripts/runtime_registry.py [--root ROOT] [--format text|json]
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
17
|
+
import argparse
|
|
18
|
+
import json
|
|
19
|
+
import re
|
|
20
|
+
import sys
|
|
21
|
+
from dataclasses import dataclass, asdict, field
|
|
22
|
+
from pathlib import Path
|
|
23
|
+
from typing import List, Optional
|
|
24
|
+
|
|
25
|
+
# Import shared parsing from skill_linter
|
|
26
|
+
sys.path.insert(0, str(Path(__file__).resolve().parent))
|
|
27
|
+
from skill_linter import (
|
|
28
|
+
FRONTMATTER_PATTERN,
|
|
29
|
+
DESCRIPTION_PATTERN,
|
|
30
|
+
NAME_PATTERN,
|
|
31
|
+
VALID_EXECUTION_TYPES,
|
|
32
|
+
VALID_EXECUTION_HANDLERS,
|
|
33
|
+
parse_execution_block,
|
|
34
|
+
extract_frontmatter,
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
@dataclass
|
|
39
|
+
class SkillRuntime:
|
|
40
|
+
"""Runtime metadata for a single skill."""
|
|
41
|
+
name: str
|
|
42
|
+
path: str
|
|
43
|
+
description: str
|
|
44
|
+
execution_type: str
|
|
45
|
+
handler: str
|
|
46
|
+
timeout_seconds: int
|
|
47
|
+
safety_mode: Optional[str]
|
|
48
|
+
allowed_tools: List[str]
|
|
49
|
+
command: List[str] = field(default_factory=list)
|
|
50
|
+
|
|
51
|
+
@property
|
|
52
|
+
def is_executable(self) -> bool:
|
|
53
|
+
return self.execution_type in ("assisted", "automated")
|
|
54
|
+
|
|
55
|
+
@property
|
|
56
|
+
def is_automated(self) -> bool:
|
|
57
|
+
return self.execution_type == "automated"
|
|
58
|
+
|
|
59
|
+
@property
|
|
60
|
+
def is_runnable(self) -> bool:
|
|
61
|
+
"""True when the skill declares an executable command for a real handler."""
|
|
62
|
+
return bool(self.command) and self.handler in {"shell", "php", "node"}
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def discover_skills(root: Path) -> List[Path]:
|
|
66
|
+
"""Find all SKILL.md files, preferring .agent-src.uncompressed/."""
|
|
67
|
+
uncompressed = root / ".agent-src.uncompressed" / "skills"
|
|
68
|
+
compressed = root / ".agent-src" / "skills"
|
|
69
|
+
base = uncompressed if uncompressed.exists() else compressed
|
|
70
|
+
if not base.exists():
|
|
71
|
+
return []
|
|
72
|
+
return sorted(f for f in base.rglob("SKILL.md") if not f.is_symlink())
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
def parse_skill_runtime(path: Path) -> Optional[SkillRuntime]:
|
|
76
|
+
"""Parse a skill file and return its runtime metadata, or None if no execution block."""
|
|
77
|
+
text = path.read_text(encoding="utf-8")
|
|
78
|
+
frontmatter = extract_frontmatter(text)
|
|
79
|
+
if frontmatter is None:
|
|
80
|
+
return None
|
|
81
|
+
|
|
82
|
+
execution = parse_execution_block(frontmatter)
|
|
83
|
+
if execution is None:
|
|
84
|
+
return None
|
|
85
|
+
|
|
86
|
+
# Extract name and description
|
|
87
|
+
name_match = NAME_PATTERN.search(frontmatter)
|
|
88
|
+
name = name_match.group(1).strip() if name_match else path.parent.name
|
|
89
|
+
desc_match = DESCRIPTION_PATTERN.search(frontmatter)
|
|
90
|
+
description = desc_match.group(1).strip() if desc_match else ""
|
|
91
|
+
|
|
92
|
+
return SkillRuntime(
|
|
93
|
+
name=name,
|
|
94
|
+
path=str(path),
|
|
95
|
+
description=description,
|
|
96
|
+
execution_type=execution.get("type", "manual"),
|
|
97
|
+
handler=execution.get("handler", "none"),
|
|
98
|
+
timeout_seconds=execution.get("timeout_seconds", 30),
|
|
99
|
+
safety_mode=execution.get("safety_mode"),
|
|
100
|
+
allowed_tools=execution.get("allowed_tools", []),
|
|
101
|
+
command=execution.get("command", []),
|
|
102
|
+
)
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
def build_registry(root: Path) -> List[SkillRuntime]:
|
|
106
|
+
"""Build the full runtime registry from all skills."""
|
|
107
|
+
skills = discover_skills(root)
|
|
108
|
+
registry: List[SkillRuntime] = []
|
|
109
|
+
for skill_path in skills:
|
|
110
|
+
runtime = parse_skill_runtime(skill_path)
|
|
111
|
+
if runtime is not None:
|
|
112
|
+
registry.append(runtime)
|
|
113
|
+
return registry
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
def validate_registry(registry: List[SkillRuntime]) -> List[str]:
|
|
117
|
+
"""Validate the registry for consistency issues."""
|
|
118
|
+
errors: List[str] = []
|
|
119
|
+
for skill in registry:
|
|
120
|
+
if skill.execution_type not in VALID_EXECUTION_TYPES:
|
|
121
|
+
errors.append(f"{skill.name}: invalid execution type '{skill.execution_type}'")
|
|
122
|
+
if skill.handler not in VALID_EXECUTION_HANDLERS:
|
|
123
|
+
errors.append(f"{skill.name}: invalid handler '{skill.handler}'")
|
|
124
|
+
if skill.is_automated:
|
|
125
|
+
if skill.handler == "none":
|
|
126
|
+
errors.append(f"{skill.name}: automated skill has handler 'none'")
|
|
127
|
+
if skill.safety_mode != "strict":
|
|
128
|
+
errors.append(f"{skill.name}: automated skill missing safety_mode 'strict'")
|
|
129
|
+
return errors
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
def main() -> int:
|
|
133
|
+
parser = argparse.ArgumentParser(description="Runtime Registry — list runtime-capable skills")
|
|
134
|
+
parser.add_argument("--root", type=Path, default=Path("."), help="Repository root")
|
|
135
|
+
parser.add_argument("--format", choices=["text", "json"], default="text", help="Output format")
|
|
136
|
+
parser.add_argument("--validate", action="store_true", help="Validate registry consistency")
|
|
137
|
+
args = parser.parse_args()
|
|
138
|
+
|
|
139
|
+
registry = build_registry(args.root)
|
|
140
|
+
|
|
141
|
+
if args.validate:
|
|
142
|
+
errors = validate_registry(registry)
|
|
143
|
+
if errors:
|
|
144
|
+
for e in errors:
|
|
145
|
+
print(f"ERROR: {e}", file=sys.stderr)
|
|
146
|
+
return 1
|
|
147
|
+
print(f"Registry valid: {len(registry)} runtime-capable skills")
|
|
148
|
+
return 0
|
|
149
|
+
|
|
150
|
+
if args.format == "json":
|
|
151
|
+
print(json.dumps([asdict(s) for s in registry], indent=2))
|
|
152
|
+
else:
|
|
153
|
+
if not registry:
|
|
154
|
+
print("No runtime-capable skills found.")
|
|
155
|
+
else:
|
|
156
|
+
print(f"Runtime-capable skills: {len(registry)}\n")
|
|
157
|
+
for s in registry:
|
|
158
|
+
tools = ", ".join(s.allowed_tools) if s.allowed_tools else "none"
|
|
159
|
+
print(f" {s.name}")
|
|
160
|
+
print(f" type: {s.execution_type} | handler: {s.handler} | "
|
|
161
|
+
f"timeout: {s.timeout_seconds}s | tools: {tools}")
|
|
162
|
+
return 0
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
if __name__ == "__main__":
|
|
166
|
+
sys.exit(main())
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"$id": "https://github.com/event4u-app/agent-config/scripts/schemas/command.schema.json",
|
|
4
|
+
"title": "Command frontmatter",
|
|
5
|
+
"$comment": "Source: agents/docs/frontmatter-contract.md#commands. `description` is required at schema level because 66/67 commands declare it — the one exception is a known gap, not a supported shape.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"additionalProperties": false,
|
|
8
|
+
"required": ["name", "description", "disable-model-invocation"],
|
|
9
|
+
"properties": {
|
|
10
|
+
"name": {
|
|
11
|
+
"type": "string",
|
|
12
|
+
"pattern": "^[a-z][a-z0-9-]*$"
|
|
13
|
+
},
|
|
14
|
+
"description": {
|
|
15
|
+
"type": "string",
|
|
16
|
+
"minLength": 1,
|
|
17
|
+
"maxLength": 500
|
|
18
|
+
},
|
|
19
|
+
"disable-model-invocation": {
|
|
20
|
+
"type": "boolean",
|
|
21
|
+
"enum": [true],
|
|
22
|
+
"description": "Commands are always user-invoked; model-invocation is disabled."
|
|
23
|
+
},
|
|
24
|
+
"skills": {
|
|
25
|
+
"type": "array",
|
|
26
|
+
"items": {
|
|
27
|
+
"type": "string",
|
|
28
|
+
"pattern": "^[a-z][a-z0-9-]*$"
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"$id": "https://github.com/event4u-app/agent-config/scripts/schemas/persona.schema.json",
|
|
4
|
+
"title": "Persona frontmatter",
|
|
5
|
+
"$comment": "Source: agents/docs/frontmatter-contract.md#personas. `mode` enum mirrors the values declared in personas/*.md plus the additional `incident` value from templates/persona.md.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"additionalProperties": false,
|
|
8
|
+
"required": ["id", "role", "description", "tier", "mode", "version", "source"],
|
|
9
|
+
"properties": {
|
|
10
|
+
"id": {
|
|
11
|
+
"type": "string",
|
|
12
|
+
"pattern": "^[a-z][a-z0-9-]*$",
|
|
13
|
+
"description": "Must match the persona filename stem."
|
|
14
|
+
},
|
|
15
|
+
"role": {
|
|
16
|
+
"type": "string",
|
|
17
|
+
"minLength": 1,
|
|
18
|
+
"maxLength": 80
|
|
19
|
+
},
|
|
20
|
+
"description": {
|
|
21
|
+
"type": "string",
|
|
22
|
+
"minLength": 1,
|
|
23
|
+
"maxLength": 240
|
|
24
|
+
},
|
|
25
|
+
"tier": {
|
|
26
|
+
"type": "string",
|
|
27
|
+
"enum": ["core", "specialist"]
|
|
28
|
+
},
|
|
29
|
+
"mode": {
|
|
30
|
+
"type": "string",
|
|
31
|
+
"enum": ["developer", "reviewer", "tester", "product-owner", "incident", "planner"]
|
|
32
|
+
},
|
|
33
|
+
"version": {
|
|
34
|
+
"type": "string",
|
|
35
|
+
"pattern": "^[0-9]+(\\.[0-9]+){0,2}$"
|
|
36
|
+
},
|
|
37
|
+
"source": {
|
|
38
|
+
"type": "string",
|
|
39
|
+
"enum": ["package", "project"]
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"$id": "https://github.com/event4u-app/agent-config/scripts/schemas/rule.schema.json",
|
|
4
|
+
"title": "Rule frontmatter",
|
|
5
|
+
"$comment": "Source: agents/docs/frontmatter-contract.md#rules. `type` is authoritative; `alwaysApply` is a Cursor/Cline sidecar and accepted but not enforced.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"additionalProperties": false,
|
|
8
|
+
"required": ["type", "source", "description"],
|
|
9
|
+
"properties": {
|
|
10
|
+
"type": {
|
|
11
|
+
"type": "string",
|
|
12
|
+
"enum": ["always", "auto"]
|
|
13
|
+
},
|
|
14
|
+
"source": {
|
|
15
|
+
"type": "string",
|
|
16
|
+
"enum": ["package", "project"]
|
|
17
|
+
},
|
|
18
|
+
"description": {
|
|
19
|
+
"type": "string",
|
|
20
|
+
"minLength": 1,
|
|
21
|
+
"maxLength": 500
|
|
22
|
+
},
|
|
23
|
+
"alwaysApply": {
|
|
24
|
+
"type": "boolean",
|
|
25
|
+
"description": "Optional sidecar for Cursor/Cline; by convention true when type=always, false when type=auto."
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|