@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,400 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Cross-reference checker for agent-config repositories.
|
|
4
|
+
|
|
5
|
+
Scans .md files in .agent-src/ and agents/ for internal references
|
|
6
|
+
(file paths, skill names, rule names) and reports broken ones.
|
|
7
|
+
|
|
8
|
+
Exit codes: 0 = clean, 1 = broken refs found, 3 = internal error
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from __future__ import annotations
|
|
12
|
+
|
|
13
|
+
import argparse
|
|
14
|
+
import json
|
|
15
|
+
import re
|
|
16
|
+
import sys
|
|
17
|
+
from dataclasses import dataclass, asdict
|
|
18
|
+
from pathlib import Path
|
|
19
|
+
from typing import List, Literal
|
|
20
|
+
|
|
21
|
+
Severity = Literal["error", "warning"]
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
@dataclass
|
|
25
|
+
class BrokenRef:
|
|
26
|
+
file: str
|
|
27
|
+
line: int
|
|
28
|
+
ref: str
|
|
29
|
+
ref_type: str
|
|
30
|
+
severity: Severity
|
|
31
|
+
suggestion: str = ""
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
SCAN_DIRS = [".agent-src", "agents"]
|
|
35
|
+
SKIP_DIRS = ["agents/roadmaps/archive"] # archived roadmaps have historical refs
|
|
36
|
+
ROOT = Path(".")
|
|
37
|
+
|
|
38
|
+
# YAML memory files (engineering-memory layer) live under `agents/memory/`.
|
|
39
|
+
# Each entry may reference skills, ADR paths, or local files via
|
|
40
|
+
# `source:` / `enforcement:` / `skill:`. We validate those paths so a
|
|
41
|
+
# memory entry cannot rot silently when a file is moved or deleted.
|
|
42
|
+
MEMORY_YAML_ROOT = "agents/memory"
|
|
43
|
+
MEMORY_FILE_EXTS = (".php", ".py", ".md", ".yml", ".yaml", ".json", ".sh",
|
|
44
|
+
".js", ".ts", ".tsx", ".jsx")
|
|
45
|
+
MEMORY_SKIP_URI_PREFIXES = ("http://", "https://", "adr://", "ticket://",
|
|
46
|
+
"incident://", "pr://")
|
|
47
|
+
|
|
48
|
+
# File path references like `guidelines/agent-infra/size-and-scope.md`
|
|
49
|
+
PATH_PATTERN = re.compile(
|
|
50
|
+
r'[`"\s]'
|
|
51
|
+
r'(\.?(?:augment|agents|guidelines|rules|skills|commands|contexts|templates|patterns|personas)'
|
|
52
|
+
r'(?:/[\w._-]+)+\.(?:md|php|py|yml|yaml|json|sh))'
|
|
53
|
+
r'[`"\s,;)\]]'
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
# Frontmatter `personas:` entries (skills/commands cite personas). Either
|
|
57
|
+
# inline list `[a, b]` or YAML block list on subsequent lines.
|
|
58
|
+
_FM_PERSONAS_INLINE = re.compile(r"^personas:\s*\[([^\]]*)\]\s*$")
|
|
59
|
+
_FM_PERSONAS_KEY = re.compile(r"^personas:\s*$")
|
|
60
|
+
_FM_LIST_ITEM = re.compile(r"^\s*-\s*([\w-]+)\s*$")
|
|
61
|
+
|
|
62
|
+
SKILL_REF_PATTERN = re.compile(r'`([\w-]+)`\s+skill')
|
|
63
|
+
RULE_REF_PATTERN = re.compile(r'`([\w-]+)`\s+rule')
|
|
64
|
+
|
|
65
|
+
# Unchecked TODO items (roadmap checkboxes) legitimately reference files
|
|
66
|
+
# and artifacts that do not exist yet. Skip these lines.
|
|
67
|
+
UNCHECKED_TODO_PATTERN = re.compile(r'^\s*[-*+]\s+\[ \]\s')
|
|
68
|
+
_SKIP_NAMES = {"the", "a", "an", "this", "that", "your", "my", "no", "any", "each", "one",
|
|
69
|
+
"always", "auto", "fail", "vue", "guidelines", "naming",
|
|
70
|
+
"orderBy", "no-commit", "skill-linter", "skill-validator",
|
|
71
|
+
"skill-refactor", "skill-caveman-compression", "skill-decompression",
|
|
72
|
+
"broad_scope", "composer"}
|
|
73
|
+
|
|
74
|
+
# Paths that are clearly example/template placeholders (not real references)
|
|
75
|
+
EXAMPLE_PATH_PATTERNS = [
|
|
76
|
+
re.compile(r"agents/analysis/"), # project-analyze output template
|
|
77
|
+
re.compile(r"agents/roadmaps/template"), # template reference
|
|
78
|
+
re.compile(r"agents/overrides/"), # override examples
|
|
79
|
+
re.compile(r"commands/old-cmd"), # example placeholder
|
|
80
|
+
re.compile(r"agents/README"), # README reference (may not exist in package)
|
|
81
|
+
re.compile(r"agents/docs/"), # project-specific docs (not in package)
|
|
82
|
+
re.compile(r"agents/contexts/"), # project-specific contexts (not in package)
|
|
83
|
+
re.compile(r"agents/gates"), # project-specific policy docs
|
|
84
|
+
re.compile(r"agents/features/"), # project-specific feature docs
|
|
85
|
+
re.compile(r"agents/authentication"), # project-specific auth docs
|
|
86
|
+
re.compile(r"agents/roadmaps/agents-"), # dynamically created roadmaps
|
|
87
|
+
re.compile(r"agents/roadmaps/test-"), # project-specific roadmaps
|
|
88
|
+
re.compile(r"agents/ownership-map\.yml"), # consumer-project routing data
|
|
89
|
+
re.compile(r"agents/historical-bug-patterns\.yml"), # consumer-project routing data
|
|
90
|
+
re.compile(r"agents/memory/"), # consumer-project memory data
|
|
91
|
+
re.compile(r"agents/learnings/"), # consumer-project learning notes
|
|
92
|
+
re.compile(r"agents/proposals/"), # consumer-project self-improvement proposals
|
|
93
|
+
re.compile(r"agents/drafts/"), # consumer-project artefact drafts
|
|
94
|
+
re.compile(r"guidelines/php-"), # flattened override naming convention
|
|
95
|
+
re.compile(r"rules/no-commit"), # example rule in commands
|
|
96
|
+
re.compile(r"skills/[\w-]+\.md"), # short skill refs in examples (not SKILL.md path)
|
|
97
|
+
re.compile(r"skills/[\w-]+/SKILL\.md"), # example skill paths in commands
|
|
98
|
+
re.compile(r"\{"), # template placeholders like {module}
|
|
99
|
+
re.compile(r"\.compression-hashes\.json"), # JSON file, not .md
|
|
100
|
+
]
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
def collect_artifacts(root: Path) -> dict[str, set[str]]:
|
|
104
|
+
"""Build lookup sets for skills, rules, commands, guidelines, personas."""
|
|
105
|
+
arts: dict[str, set[str]] = {
|
|
106
|
+
"skills": set(), "rules": set(), "commands": set(),
|
|
107
|
+
"guidelines": set(), "personas": set(),
|
|
108
|
+
}
|
|
109
|
+
augment = root / ".agent-src"
|
|
110
|
+
if not augment.exists():
|
|
111
|
+
return arts
|
|
112
|
+
for d in (augment / "skills").iterdir() if (augment / "skills").exists() else []:
|
|
113
|
+
if d.is_dir() and (d / "SKILL.md").exists():
|
|
114
|
+
arts["skills"].add(d.name)
|
|
115
|
+
for f in (augment / "rules").glob("*.md") if (augment / "rules").exists() else []:
|
|
116
|
+
arts["rules"].add(f.stem)
|
|
117
|
+
for f in (augment / "commands").glob("*.md") if (augment / "commands").exists() else []:
|
|
118
|
+
arts["commands"].add(f.stem)
|
|
119
|
+
gdir = augment / "guidelines"
|
|
120
|
+
if gdir.exists():
|
|
121
|
+
for f in gdir.rglob("*.md"):
|
|
122
|
+
arts["guidelines"].add(str(f.relative_to(augment)))
|
|
123
|
+
pdir = augment / "personas"
|
|
124
|
+
if pdir.exists():
|
|
125
|
+
for f in pdir.glob("*.md"):
|
|
126
|
+
if f.stem != "README":
|
|
127
|
+
arts["personas"].add(f.stem)
|
|
128
|
+
return arts
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
def _extract_personas_frontmatter(text: str) -> list[tuple[int, str]]:
|
|
132
|
+
"""Parse frontmatter for `personas:` list entries. Returns (line_no, id)."""
|
|
133
|
+
if not text.startswith("---"):
|
|
134
|
+
return []
|
|
135
|
+
end = text.find("\n---", 3)
|
|
136
|
+
if end < 0:
|
|
137
|
+
return []
|
|
138
|
+
fm_lines = text[3:end].splitlines()
|
|
139
|
+
results: list[tuple[int, str]] = []
|
|
140
|
+
i = 0
|
|
141
|
+
# Frontmatter starts at file line 2 (after opening `---` on line 1).
|
|
142
|
+
while i < len(fm_lines):
|
|
143
|
+
line = fm_lines[i]
|
|
144
|
+
line_no = i + 2
|
|
145
|
+
m_inline = _FM_PERSONAS_INLINE.match(line)
|
|
146
|
+
if m_inline:
|
|
147
|
+
inner = m_inline.group(1)
|
|
148
|
+
for raw in inner.split(","):
|
|
149
|
+
v = raw.strip().strip('"').strip("'")
|
|
150
|
+
if v:
|
|
151
|
+
results.append((line_no, v))
|
|
152
|
+
i += 1
|
|
153
|
+
continue
|
|
154
|
+
if _FM_PERSONAS_KEY.match(line):
|
|
155
|
+
j = i + 1
|
|
156
|
+
while j < len(fm_lines):
|
|
157
|
+
item_m = _FM_LIST_ITEM.match(fm_lines[j])
|
|
158
|
+
if not item_m:
|
|
159
|
+
break
|
|
160
|
+
results.append((j + 2, item_m.group(1)))
|
|
161
|
+
j += 1
|
|
162
|
+
i = j
|
|
163
|
+
continue
|
|
164
|
+
i += 1
|
|
165
|
+
return results
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
def _find_suggestion(path: str, root: Path) -> str:
|
|
169
|
+
name = Path(path).name
|
|
170
|
+
for d in [root / ".agent-src", root / ".agent-src.uncompressed", root / "agents"]:
|
|
171
|
+
if d.exists():
|
|
172
|
+
for f in d.rglob(name):
|
|
173
|
+
return str(f.relative_to(root))
|
|
174
|
+
return ""
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
def _closest_match(name: str, candidates: set[str]) -> str:
|
|
178
|
+
for c in sorted(candidates):
|
|
179
|
+
if name in c or c in name:
|
|
180
|
+
return c
|
|
181
|
+
return ""
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
def check_file(filepath: Path, artifacts: dict[str, set[str]], root: Path) -> List[BrokenRef]:
|
|
186
|
+
"""Check a single .md file for broken references."""
|
|
187
|
+
broken: List[BrokenRef] = []
|
|
188
|
+
try:
|
|
189
|
+
text = filepath.read_text(encoding="utf-8")
|
|
190
|
+
except Exception:
|
|
191
|
+
return broken
|
|
192
|
+
|
|
193
|
+
# Validate `personas:` frontmatter entries against known persona ids.
|
|
194
|
+
for line_no, pid in _extract_personas_frontmatter(text):
|
|
195
|
+
if pid not in artifacts["personas"]:
|
|
196
|
+
broken.append(BrokenRef(
|
|
197
|
+
file=str(filepath), line=line_no, ref=pid,
|
|
198
|
+
ref_type="persona", severity="error",
|
|
199
|
+
suggestion=_closest_match(pid, artifacts["personas"]),
|
|
200
|
+
))
|
|
201
|
+
|
|
202
|
+
in_code_block = False
|
|
203
|
+
for i, line in enumerate(text.splitlines(), 1):
|
|
204
|
+
stripped = line.strip()
|
|
205
|
+
if stripped.startswith("```"):
|
|
206
|
+
in_code_block = not in_code_block
|
|
207
|
+
continue
|
|
208
|
+
if in_code_block:
|
|
209
|
+
continue
|
|
210
|
+
|
|
211
|
+
# Unchecked TODO checkboxes document future work — their refs are
|
|
212
|
+
# forward-looking and will not resolve yet.
|
|
213
|
+
if UNCHECKED_TODO_PATTERN.match(line):
|
|
214
|
+
continue
|
|
215
|
+
|
|
216
|
+
# File path references
|
|
217
|
+
for m in PATH_PATTERN.finditer(line):
|
|
218
|
+
raw_ref = m.group(1)
|
|
219
|
+
|
|
220
|
+
# Skip known example/template paths
|
|
221
|
+
if any(p.search(raw_ref) for p in EXAMPLE_PATH_PATTERNS):
|
|
222
|
+
continue
|
|
223
|
+
|
|
224
|
+
resolved = False
|
|
225
|
+
# Try raw ref as-is from root (covers .agent-src/..., agents/..., etc.)
|
|
226
|
+
if (root / raw_ref).exists():
|
|
227
|
+
resolved = True
|
|
228
|
+
else:
|
|
229
|
+
# Strip leading ./ and try with prefixes
|
|
230
|
+
ref = raw_ref.lstrip("./")
|
|
231
|
+
for prefix in [root, root / ".agent-src", root / ".agent-src.uncompressed"]:
|
|
232
|
+
if (prefix / ref).exists():
|
|
233
|
+
resolved = True
|
|
234
|
+
break
|
|
235
|
+
# `.augment/` is a local projection of `.agent-src/` (gitignored).
|
|
236
|
+
# In CI the projection doesn't exist, so resolve `.augment/X`
|
|
237
|
+
# against the canonical source at `.agent-src/X` (and the
|
|
238
|
+
# uncompressed authoring tree as a fallback). Note: `raw_ref`
|
|
239
|
+
# keeps the leading dot; `ref` above was stripped via lstrip.
|
|
240
|
+
if not resolved and raw_ref.startswith(".augment/"):
|
|
241
|
+
rel = raw_ref[len(".augment/") :]
|
|
242
|
+
for prefix in [root / ".agent-src", root / ".agent-src.uncompressed"]:
|
|
243
|
+
if (prefix / rel).exists():
|
|
244
|
+
resolved = True
|
|
245
|
+
break
|
|
246
|
+
if not resolved:
|
|
247
|
+
broken.append(BrokenRef(
|
|
248
|
+
file=str(filepath), line=i, ref=m.group(1),
|
|
249
|
+
ref_type="path", severity="error",
|
|
250
|
+
suggestion=_find_suggestion(raw_ref, root),
|
|
251
|
+
))
|
|
252
|
+
|
|
253
|
+
# Skill name references
|
|
254
|
+
for m in SKILL_REF_PATTERN.finditer(line):
|
|
255
|
+
name = m.group(1)
|
|
256
|
+
if name not in artifacts["skills"] and name not in _SKIP_NAMES:
|
|
257
|
+
broken.append(BrokenRef(
|
|
258
|
+
file=str(filepath), line=i, ref=name,
|
|
259
|
+
ref_type="skill", severity="warning",
|
|
260
|
+
suggestion=_closest_match(name, artifacts["skills"]),
|
|
261
|
+
))
|
|
262
|
+
|
|
263
|
+
# Rule name references
|
|
264
|
+
for m in RULE_REF_PATTERN.finditer(line):
|
|
265
|
+
name = m.group(1)
|
|
266
|
+
if name not in artifacts["rules"] and name not in _SKIP_NAMES:
|
|
267
|
+
broken.append(BrokenRef(
|
|
268
|
+
file=str(filepath), line=i, ref=name,
|
|
269
|
+
ref_type="rule", severity="warning",
|
|
270
|
+
suggestion=_closest_match(name, artifacts["rules"]),
|
|
271
|
+
))
|
|
272
|
+
|
|
273
|
+
return broken
|
|
274
|
+
|
|
275
|
+
|
|
276
|
+
def _looks_like_local_path(value: str) -> bool:
|
|
277
|
+
"""Heuristic: treat as a path if it has a known extension and no URI scheme."""
|
|
278
|
+
if not isinstance(value, str) or not value.strip():
|
|
279
|
+
return False
|
|
280
|
+
v = value.strip()
|
|
281
|
+
if any(v.startswith(p) for p in MEMORY_SKIP_URI_PREFIXES):
|
|
282
|
+
return False
|
|
283
|
+
# Globs and wildcard patterns can't be resolved as files
|
|
284
|
+
if any(ch in v for ch in ("*", "?", "[")):
|
|
285
|
+
return False
|
|
286
|
+
# Must contain a directory separator AND end with a known extension
|
|
287
|
+
if "/" not in v:
|
|
288
|
+
return False
|
|
289
|
+
return v.lower().endswith(MEMORY_FILE_EXTS)
|
|
290
|
+
|
|
291
|
+
|
|
292
|
+
def _walk_yaml(data, paths: list[str], skills: list[str]) -> None:
|
|
293
|
+
"""Recursively collect path-like strings and `skill:` values."""
|
|
294
|
+
if isinstance(data, dict):
|
|
295
|
+
for k, v in data.items():
|
|
296
|
+
if k in ("skill", "skills") and isinstance(v, str):
|
|
297
|
+
skills.append(v)
|
|
298
|
+
elif k in ("skill", "skills") and isinstance(v, list):
|
|
299
|
+
skills.extend(x for x in v if isinstance(x, str))
|
|
300
|
+
else:
|
|
301
|
+
_walk_yaml(v, paths, skills)
|
|
302
|
+
elif isinstance(data, list):
|
|
303
|
+
for item in data:
|
|
304
|
+
_walk_yaml(item, paths, skills)
|
|
305
|
+
elif isinstance(data, str):
|
|
306
|
+
if _looks_like_local_path(data):
|
|
307
|
+
paths.append(data)
|
|
308
|
+
|
|
309
|
+
|
|
310
|
+
def check_memory_yaml(filepath: Path, artifacts: dict[str, set[str]],
|
|
311
|
+
root: Path) -> List[BrokenRef]:
|
|
312
|
+
"""Validate path/skill refs inside an engineering-memory YAML file."""
|
|
313
|
+
broken: List[BrokenRef] = []
|
|
314
|
+
try:
|
|
315
|
+
import yaml # type: ignore
|
|
316
|
+
except ImportError:
|
|
317
|
+
return broken # PyYAML optional; text-ref checker still runs
|
|
318
|
+
try:
|
|
319
|
+
text = filepath.read_text(encoding="utf-8")
|
|
320
|
+
data = yaml.safe_load(text)
|
|
321
|
+
except Exception:
|
|
322
|
+
return broken
|
|
323
|
+
if not data:
|
|
324
|
+
return broken
|
|
325
|
+
paths: list[str] = []
|
|
326
|
+
skills: list[str] = []
|
|
327
|
+
_walk_yaml(data, paths, skills)
|
|
328
|
+
for p in paths:
|
|
329
|
+
if not (root / p.lstrip("./")).exists():
|
|
330
|
+
broken.append(BrokenRef(
|
|
331
|
+
file=str(filepath), line=0, ref=p,
|
|
332
|
+
ref_type="memory-path", severity="error",
|
|
333
|
+
suggestion=_find_suggestion(p, root),
|
|
334
|
+
))
|
|
335
|
+
for s in skills:
|
|
336
|
+
if s not in artifacts["skills"] and s not in _SKIP_NAMES:
|
|
337
|
+
broken.append(BrokenRef(
|
|
338
|
+
file=str(filepath), line=0, ref=s,
|
|
339
|
+
ref_type="memory-skill", severity="warning",
|
|
340
|
+
suggestion=_closest_match(s, artifacts["skills"]),
|
|
341
|
+
))
|
|
342
|
+
return broken
|
|
343
|
+
|
|
344
|
+
|
|
345
|
+
def scan_all(root: Path) -> List[BrokenRef]:
|
|
346
|
+
artifacts = collect_artifacts(root)
|
|
347
|
+
broken: List[BrokenRef] = []
|
|
348
|
+
for scan_dir in SCAN_DIRS:
|
|
349
|
+
d = root / scan_dir
|
|
350
|
+
if not d.exists():
|
|
351
|
+
continue
|
|
352
|
+
for f in sorted(d.rglob("*.md")):
|
|
353
|
+
# Skip archived directories
|
|
354
|
+
if any(str(f).startswith(str(root / skip)) for skip in SKIP_DIRS):
|
|
355
|
+
continue
|
|
356
|
+
broken.extend(check_file(f, artifacts, root))
|
|
357
|
+
memory_dir = root / MEMORY_YAML_ROOT
|
|
358
|
+
if memory_dir.is_dir():
|
|
359
|
+
for f in sorted(memory_dir.rglob("*.yml")):
|
|
360
|
+
broken.extend(check_memory_yaml(f, artifacts, root))
|
|
361
|
+
for f in sorted(memory_dir.rglob("*.yaml")):
|
|
362
|
+
broken.extend(check_memory_yaml(f, artifacts, root))
|
|
363
|
+
return broken
|
|
364
|
+
|
|
365
|
+
|
|
366
|
+
def format_text(broken: List[BrokenRef]) -> str:
|
|
367
|
+
if not broken:
|
|
368
|
+
return "✅ No broken references found."
|
|
369
|
+
lines = [f"❌ Found {len(broken)} broken reference(s):\n"]
|
|
370
|
+
for b in broken:
|
|
371
|
+
icon = "🔴" if b.severity == "error" else "🟡"
|
|
372
|
+
line = f" {icon} {b.file}:{b.line} — {b.ref_type} `{b.ref}`"
|
|
373
|
+
if b.suggestion:
|
|
374
|
+
line += f" → did you mean `{b.suggestion}`?"
|
|
375
|
+
lines.append(line)
|
|
376
|
+
return "\n".join(lines)
|
|
377
|
+
|
|
378
|
+
|
|
379
|
+
def main() -> int:
|
|
380
|
+
parser = argparse.ArgumentParser(description="Check for broken cross-references in agent config")
|
|
381
|
+
parser.add_argument("--format", choices=["text", "json"], default="text")
|
|
382
|
+
parser.add_argument("--root", type=Path, default=Path("."), help="Repository root")
|
|
383
|
+
args = parser.parse_args()
|
|
384
|
+
|
|
385
|
+
try:
|
|
386
|
+
broken = scan_all(args.root)
|
|
387
|
+
except Exception as e:
|
|
388
|
+
print(f"Internal error: {e}", file=sys.stderr)
|
|
389
|
+
return 3
|
|
390
|
+
|
|
391
|
+
if args.format == "json":
|
|
392
|
+
print(json.dumps([asdict(b) for b in broken], indent=2))
|
|
393
|
+
else:
|
|
394
|
+
print(format_text(broken))
|
|
395
|
+
|
|
396
|
+
return 1 if broken else 0
|
|
397
|
+
|
|
398
|
+
|
|
399
|
+
if __name__ == "__main__":
|
|
400
|
+
sys.exit(main())
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
CI Summary — render a GitHub Step Summary from dispatcher run results.
|
|
4
|
+
|
|
5
|
+
Consumes JSON files produced by `scripts/runtime_dispatcher.py run
|
|
6
|
+
--output FILE`. Each file is an ExecutionResult dump (see runtime_handler).
|
|
7
|
+
|
|
8
|
+
Usage:
|
|
9
|
+
python3 scripts/ci_summary.py --runs agents/reports/runs [--title TITLE]
|
|
10
|
+
|
|
11
|
+
Writes to $GITHUB_STEP_SUMMARY if the environment variable is set,
|
|
12
|
+
otherwise prints the markdown to stdout. Missing or empty run
|
|
13
|
+
directories render a short "no runs" note and exit 0.
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
from __future__ import annotations
|
|
17
|
+
|
|
18
|
+
import argparse
|
|
19
|
+
import json
|
|
20
|
+
import os
|
|
21
|
+
from pathlib import Path
|
|
22
|
+
from typing import List, Dict
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def load_runs(runs_dir: Path) -> List[Dict]:
|
|
26
|
+
"""Load every *.json in runs_dir as an ExecutionResult dict. Sorted by filename."""
|
|
27
|
+
if not runs_dir.is_dir():
|
|
28
|
+
return []
|
|
29
|
+
runs: List[Dict] = []
|
|
30
|
+
for path in sorted(runs_dir.glob("*.json")):
|
|
31
|
+
try:
|
|
32
|
+
runs.append(json.loads(path.read_text(encoding="utf-8")))
|
|
33
|
+
except (OSError, json.JSONDecodeError):
|
|
34
|
+
# Skip unreadable/malformed files — CI still reports the rest.
|
|
35
|
+
continue
|
|
36
|
+
return runs
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
_STATUS_ICON = {
|
|
40
|
+
"success": "✅",
|
|
41
|
+
"failure": "❌",
|
|
42
|
+
"timeout": "⏱️",
|
|
43
|
+
"error": "⚠️",
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def render_summary(runs: List[Dict], title: str) -> str:
|
|
48
|
+
"""Render a markdown summary for the given runs."""
|
|
49
|
+
lines: List[str] = [f"## {title}", ""]
|
|
50
|
+
|
|
51
|
+
if not runs:
|
|
52
|
+
lines.append("*No dispatcher runs recorded in this job.*")
|
|
53
|
+
lines.append("")
|
|
54
|
+
return "\n".join(lines)
|
|
55
|
+
|
|
56
|
+
total = len(runs)
|
|
57
|
+
passed = sum(1 for r in runs if r.get("status") == "success")
|
|
58
|
+
failed = total - passed
|
|
59
|
+
|
|
60
|
+
lines.append(f"- Runs: **{total}** · Passed: **{passed}** · Failed: **{failed}**")
|
|
61
|
+
lines.append("")
|
|
62
|
+
lines.append("| Skill | Status | Exit | Duration |")
|
|
63
|
+
lines.append("|---|---|---:|---:|")
|
|
64
|
+
for r in runs:
|
|
65
|
+
status = str(r.get("status", "?"))
|
|
66
|
+
icon = _STATUS_ICON.get(status, "•")
|
|
67
|
+
duration_ms = r.get("duration_ms", 0) or 0
|
|
68
|
+
lines.append(
|
|
69
|
+
f"| `{r.get('skill_name', '?')}` "
|
|
70
|
+
f"| {icon} {status} "
|
|
71
|
+
f"| {r.get('exit_code', '?')} "
|
|
72
|
+
f"| {duration_ms} ms |"
|
|
73
|
+
)
|
|
74
|
+
|
|
75
|
+
failures = [r for r in runs if r.get("status") != "success"]
|
|
76
|
+
if failures:
|
|
77
|
+
lines.append("")
|
|
78
|
+
lines.append("### Failure details")
|
|
79
|
+
for r in failures:
|
|
80
|
+
name = r.get("skill_name", "?")
|
|
81
|
+
lines.append(f"<details><summary><code>{name}</code></summary>")
|
|
82
|
+
err = r.get("error")
|
|
83
|
+
if err:
|
|
84
|
+
lines.append("")
|
|
85
|
+
lines.append(f"**Error:** {err}")
|
|
86
|
+
stderr = (r.get("stderr") or "").rstrip()
|
|
87
|
+
if stderr:
|
|
88
|
+
lines.append("")
|
|
89
|
+
lines.append("```")
|
|
90
|
+
lines.append(stderr[-1500:])
|
|
91
|
+
lines.append("```")
|
|
92
|
+
lines.append("</details>")
|
|
93
|
+
|
|
94
|
+
lines.append("")
|
|
95
|
+
return "\n".join(lines)
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
def write_output(summary: str) -> bool:
|
|
99
|
+
"""Append to $GITHUB_STEP_SUMMARY if set; return True when the env path was used."""
|
|
100
|
+
path = os.environ.get("GITHUB_STEP_SUMMARY")
|
|
101
|
+
if not path:
|
|
102
|
+
return False
|
|
103
|
+
with open(path, "a", encoding="utf-8") as fh:
|
|
104
|
+
fh.write(summary)
|
|
105
|
+
if not summary.endswith("\n"):
|
|
106
|
+
fh.write("\n")
|
|
107
|
+
return True
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
def main() -> int:
|
|
111
|
+
parser = argparse.ArgumentParser(description="Render CI summary from dispatcher runs")
|
|
112
|
+
parser.add_argument(
|
|
113
|
+
"--runs", type=Path, default=Path("agents/reports/runs"),
|
|
114
|
+
help="Directory containing ExecutionResult JSON files",
|
|
115
|
+
)
|
|
116
|
+
parser.add_argument(
|
|
117
|
+
"--title", default="🤖 Dispatcher runs",
|
|
118
|
+
help="Section title for the summary",
|
|
119
|
+
)
|
|
120
|
+
args = parser.parse_args()
|
|
121
|
+
|
|
122
|
+
runs = load_runs(args.runs)
|
|
123
|
+
summary = render_summary(runs, args.title)
|
|
124
|
+
|
|
125
|
+
if not write_output(summary):
|
|
126
|
+
print(summary)
|
|
127
|
+
return 0
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
if __name__ == "__main__":
|
|
131
|
+
raise SystemExit(main())
|