@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,671 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Agent-config sync ā compress .agent-src.uncompressed/ ā .agent-src/
|
|
4
|
+
and project .agent-src/ ā .augment/ (copies for rules, symlinks for the rest).
|
|
5
|
+
|
|
6
|
+
Copies non-.md files as-is. Lists .md files that need compression (done by the
|
|
7
|
+
Augment agent interactively). Tracks SHA-256 hashes of source files to detect
|
|
8
|
+
changes since last compression.
|
|
9
|
+
|
|
10
|
+
Usage:
|
|
11
|
+
python scripts/compress.py # sync all non-.md files + cleanup + project
|
|
12
|
+
python scripts/compress.py --list # list .md files needing compression
|
|
13
|
+
python scripts/compress.py --changed # list only .md files changed since last compression
|
|
14
|
+
python scripts/compress.py --check # check if directories are in sync
|
|
15
|
+
python scripts/compress.py --mark-done <relative-path> # mark file as compressed (update hash)
|
|
16
|
+
python scripts/compress.py --mark-all-done # mark ALL .md files as compressed
|
|
17
|
+
python scripts/compress.py --project-augment # rebuild .augment/ projection
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
import hashlib
|
|
21
|
+
import json
|
|
22
|
+
import shutil
|
|
23
|
+
import sys
|
|
24
|
+
from pathlib import Path
|
|
25
|
+
|
|
26
|
+
PROJECT_ROOT = Path(__file__).resolve().parent.parent
|
|
27
|
+
SOURCE_DIR = PROJECT_ROOT / ".agent-src.uncompressed"
|
|
28
|
+
TARGET_DIR = PROJECT_ROOT / ".agent-src"
|
|
29
|
+
AUGMENT_DIR = PROJECT_ROOT / ".augment"
|
|
30
|
+
HASH_FILE = PROJECT_ROOT / ".compression-hashes.json"
|
|
31
|
+
|
|
32
|
+
# Files to copy as-is even if .md (not compressed by agent)
|
|
33
|
+
COPY_AS_IS = {"README.md"}
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def file_hash(filepath: Path) -> str:
|
|
39
|
+
"""Return SHA-256 hex digest of a file."""
|
|
40
|
+
h = hashlib.sha256()
|
|
41
|
+
h.update(filepath.read_bytes())
|
|
42
|
+
return h.hexdigest()
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def load_hashes() -> dict:
|
|
46
|
+
"""Load stored compression hashes from JSON file."""
|
|
47
|
+
if HASH_FILE.exists():
|
|
48
|
+
try:
|
|
49
|
+
return json.loads(HASH_FILE.read_text())
|
|
50
|
+
except (json.JSONDecodeError, OSError):
|
|
51
|
+
return {}
|
|
52
|
+
return {}
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def save_hashes(hashes: dict) -> None:
|
|
56
|
+
"""Save compression hashes to JSON file."""
|
|
57
|
+
HASH_FILE.parent.mkdir(parents=True, exist_ok=True)
|
|
58
|
+
HASH_FILE.write_text(json.dumps(hashes, indent=2, sort_keys=True) + "\n")
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def mark_done(relative_path: str) -> None:
|
|
62
|
+
"""Mark a single file as compressed by storing its current source hash."""
|
|
63
|
+
source_file = SOURCE_DIR / relative_path
|
|
64
|
+
if not source_file.exists():
|
|
65
|
+
print(f"ā Source file not found: {relative_path}")
|
|
66
|
+
sys.exit(1)
|
|
67
|
+
hashes = load_hashes()
|
|
68
|
+
hashes[relative_path] = file_hash(source_file)
|
|
69
|
+
save_hashes(hashes)
|
|
70
|
+
print(f"ā
Marked as compressed: {relative_path}")
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def mark_all_done() -> None:
|
|
74
|
+
"""Mark ALL .md files as compressed (e.g. after initial full compression)."""
|
|
75
|
+
hashes = load_hashes()
|
|
76
|
+
count = 0
|
|
77
|
+
for source_file in sorted(SOURCE_DIR.rglob("*")):
|
|
78
|
+
if source_file.is_dir():
|
|
79
|
+
continue
|
|
80
|
+
if not should_compress(source_file):
|
|
81
|
+
continue
|
|
82
|
+
relative = str(source_file.relative_to(SOURCE_DIR))
|
|
83
|
+
hashes[relative] = file_hash(source_file)
|
|
84
|
+
count += 1
|
|
85
|
+
save_hashes(hashes)
|
|
86
|
+
print(f"ā
Marked {count} files as compressed")
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
def list_changed_md(source_dir: Path) -> list:
|
|
90
|
+
"""List .md files whose source hash differs from stored hash (= need recompression)."""
|
|
91
|
+
hashes = load_hashes()
|
|
92
|
+
changed = []
|
|
93
|
+
for source_file in sorted(source_dir.rglob("*")):
|
|
94
|
+
if source_file.is_dir():
|
|
95
|
+
continue
|
|
96
|
+
if not should_compress(source_file):
|
|
97
|
+
continue
|
|
98
|
+
relative = str(source_file.relative_to(source_dir))
|
|
99
|
+
current_hash = file_hash(source_file)
|
|
100
|
+
stored_hash = hashes.get(relative)
|
|
101
|
+
if stored_hash != current_hash:
|
|
102
|
+
changed.append(relative)
|
|
103
|
+
return changed
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
def find_stale_hashes(source_dir: Path) -> list:
|
|
107
|
+
"""Find hashes stored for source files that no longer exist."""
|
|
108
|
+
hashes = load_hashes()
|
|
109
|
+
stale = []
|
|
110
|
+
for relative in sorted(hashes.keys()):
|
|
111
|
+
source_file = source_dir / relative
|
|
112
|
+
if not source_file.exists():
|
|
113
|
+
stale.append(relative)
|
|
114
|
+
return stale
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
def clean_stale_hashes(source_dir: Path) -> int:
|
|
118
|
+
"""Remove hashes for source files that no longer exist. Returns count removed."""
|
|
119
|
+
stale = find_stale_hashes(source_dir)
|
|
120
|
+
if not stale:
|
|
121
|
+
return 0
|
|
122
|
+
hashes = load_hashes()
|
|
123
|
+
for relative in stale:
|
|
124
|
+
del hashes[relative]
|
|
125
|
+
save_hashes(hashes)
|
|
126
|
+
return len(stale)
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
def should_compress(filepath: Path) -> bool:
|
|
131
|
+
"""Check if file should be compressed (is .md and not in copy-as-is list)."""
|
|
132
|
+
if filepath.suffix != ".md":
|
|
133
|
+
return False
|
|
134
|
+
if filepath.name in COPY_AS_IS:
|
|
135
|
+
return False
|
|
136
|
+
return True
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
def copy_file(source: Path, target: Path) -> None:
|
|
140
|
+
"""Copy a non-.md file as-is."""
|
|
141
|
+
target.parent.mkdir(parents=True, exist_ok=True)
|
|
142
|
+
shutil.copy2(source, target)
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
def cleanup_stale(source_dir: Path, target_dir: Path) -> int:
|
|
146
|
+
"""Delete files in target that don't exist in source. Returns count."""
|
|
147
|
+
deleted = 0
|
|
148
|
+
if not target_dir.exists():
|
|
149
|
+
return 0
|
|
150
|
+
|
|
151
|
+
for target_file in sorted(target_dir.rglob("*")):
|
|
152
|
+
if target_file.is_dir():
|
|
153
|
+
continue
|
|
154
|
+
relative = target_file.relative_to(target_dir)
|
|
155
|
+
source_file = source_dir / relative
|
|
156
|
+
if not source_file.exists():
|
|
157
|
+
print(f" Deleting stale: {relative}")
|
|
158
|
+
target_file.unlink()
|
|
159
|
+
deleted += 1
|
|
160
|
+
|
|
161
|
+
# Remove empty directories
|
|
162
|
+
for dirpath in sorted(target_dir.rglob("*"), reverse=True):
|
|
163
|
+
if dirpath.is_dir() and not any(dirpath.iterdir()):
|
|
164
|
+
dirpath.rmdir()
|
|
165
|
+
print(f" Removing empty dir: {dirpath.relative_to(target_dir)}")
|
|
166
|
+
|
|
167
|
+
return deleted
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
def sync_non_md(source_dir: Path, target_dir: Path) -> int:
|
|
171
|
+
"""Copy all non-.md files (and COPY_AS_IS .md files) from source to target. Returns count."""
|
|
172
|
+
copied = 0
|
|
173
|
+
for source_file in sorted(source_dir.rglob("*")):
|
|
174
|
+
if source_file.is_dir():
|
|
175
|
+
continue
|
|
176
|
+
if should_compress(source_file):
|
|
177
|
+
continue # .md files are compressed by the agent, not copied here
|
|
178
|
+
relative = source_file.relative_to(source_dir)
|
|
179
|
+
target_file = target_dir / relative
|
|
180
|
+
copy_file(source_file, target_file)
|
|
181
|
+
print(f" Copied: {relative}")
|
|
182
|
+
copied += 1
|
|
183
|
+
return copied
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
def list_md_files(source_dir: Path) -> list:
|
|
187
|
+
"""List all .md files that need compression by the agent."""
|
|
188
|
+
files = []
|
|
189
|
+
for source_file in sorted(source_dir.rglob("*")):
|
|
190
|
+
if source_file.is_dir():
|
|
191
|
+
continue
|
|
192
|
+
if should_compress(source_file):
|
|
193
|
+
files.append(str(source_file.relative_to(source_dir)))
|
|
194
|
+
return files
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
def check_sync(source_dir: Path, target_dir: Path) -> tuple:
|
|
198
|
+
"""Check if target is in sync with source. Returns (missing, stale) lists."""
|
|
199
|
+
missing = []
|
|
200
|
+
stale = []
|
|
201
|
+
|
|
202
|
+
# Files in source but not in target
|
|
203
|
+
for source_file in sorted(source_dir.rglob("*")):
|
|
204
|
+
if source_file.is_dir():
|
|
205
|
+
continue
|
|
206
|
+
relative = str(source_file.relative_to(source_dir))
|
|
207
|
+
if not (target_dir / relative).exists():
|
|
208
|
+
missing.append(relative)
|
|
209
|
+
|
|
210
|
+
# Files in target but not in source (stale)
|
|
211
|
+
if target_dir.exists():
|
|
212
|
+
for target_file in sorted(target_dir.rglob("*")):
|
|
213
|
+
if target_file.is_dir():
|
|
214
|
+
continue
|
|
215
|
+
relative = str(target_file.relative_to(target_dir))
|
|
216
|
+
|
|
217
|
+
if not (source_dir / relative).exists():
|
|
218
|
+
stale.append(relative)
|
|
219
|
+
|
|
220
|
+
return missing, stale
|
|
221
|
+
|
|
222
|
+
|
|
223
|
+
# āā Multi-agent tool generation āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
|
|
224
|
+
|
|
225
|
+
RULES_SOURCE = PROJECT_ROOT / ".agent-src" / "rules"
|
|
226
|
+
|
|
227
|
+
TOOL_DIRS = {
|
|
228
|
+
".claude/rules": "../../.agent-src/rules",
|
|
229
|
+
".cursor/rules": "../../.agent-src/rules",
|
|
230
|
+
".clinerules": "../.agent-src/rules",
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
SKILLS_SOURCE = PROJECT_ROOT / ".agent-src" / "skills"
|
|
234
|
+
COMMANDS_SOURCE = PROJECT_ROOT / ".agent-src" / "commands"
|
|
235
|
+
PERSONAS_SOURCE = PROJECT_ROOT / ".agent-src" / "personas"
|
|
236
|
+
CLAUDE_SKILLS_DIR = PROJECT_ROOT / ".claude" / "skills"
|
|
237
|
+
|
|
238
|
+
PERSONA_TOOL_DIRS = {
|
|
239
|
+
".claude/personas": "../../.agent-src/personas",
|
|
240
|
+
".cursor/personas": "../../.agent-src/personas",
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
|
|
244
|
+
def strip_frontmatter(content: str) -> str:
|
|
245
|
+
"""Remove YAML frontmatter (between --- markers) from content."""
|
|
246
|
+
if content.startswith("---"):
|
|
247
|
+
end = content.find("---", 3)
|
|
248
|
+
if end != -1:
|
|
249
|
+
content = content[end + 3:].lstrip("\n")
|
|
250
|
+
return content
|
|
251
|
+
|
|
252
|
+
|
|
253
|
+
def generate_rule_symlinks() -> int:
|
|
254
|
+
"""Create symlink directories for rules (.claude/rules/, .cursor/rules/, .clinerules/).
|
|
255
|
+
|
|
256
|
+
Symlinks ALL .md files from .agent-src/rules/ into tool-specific directories.
|
|
257
|
+
"""
|
|
258
|
+
# All .md files in .agent-src/rules/ ā not just universal ones
|
|
259
|
+
rules = sorted([f.name for f in RULES_SOURCE.glob("*.md")])
|
|
260
|
+
total = 0
|
|
261
|
+
for tool_dir, rel_prefix in TOOL_DIRS.items():
|
|
262
|
+
target_dir = PROJECT_ROOT / tool_dir
|
|
263
|
+
target_dir.mkdir(parents=True, exist_ok=True)
|
|
264
|
+
|
|
265
|
+
# Clean stale symlinks
|
|
266
|
+
for item in target_dir.iterdir():
|
|
267
|
+
if item.is_symlink() and item.name not in rules and item.name != "README.md":
|
|
268
|
+
item.unlink()
|
|
269
|
+
|
|
270
|
+
for rule in rules:
|
|
271
|
+
link = target_dir / rule
|
|
272
|
+
target = Path(rel_prefix) / rule
|
|
273
|
+
if link.exists() or link.is_symlink():
|
|
274
|
+
link.unlink()
|
|
275
|
+
link.symlink_to(target)
|
|
276
|
+
total += 1
|
|
277
|
+
|
|
278
|
+
# Verify counts match across all tool directories
|
|
279
|
+
source_count = len(rules)
|
|
280
|
+
for tool_dir in TOOL_DIRS:
|
|
281
|
+
target_dir = PROJECT_ROOT / tool_dir
|
|
282
|
+
tool_count = len([f for f in target_dir.iterdir() if f.is_symlink() and f.suffix == ".md"])
|
|
283
|
+
if tool_count != source_count:
|
|
284
|
+
print(f" ā ļø {tool_dir}: {tool_count} rules (expected {source_count})")
|
|
285
|
+
|
|
286
|
+
print(f" ā
Created {total} rule symlinks across {len(TOOL_DIRS)} tool directories ({source_count} rules each)")
|
|
287
|
+
return total
|
|
288
|
+
|
|
289
|
+
|
|
290
|
+
def generate_windsurfrules() -> None:
|
|
291
|
+
"""Generate .windsurfrules by concatenating all rules (no frontmatter).
|
|
292
|
+
"""
|
|
293
|
+
rules = sorted([f.name for f in RULES_SOURCE.glob("*.md")])
|
|
294
|
+
parts = ["# Auto-generated from .agent-src/rules/ ā do not edit directly\n"]
|
|
295
|
+
|
|
296
|
+
for rule in rules:
|
|
297
|
+
path = RULES_SOURCE / rule
|
|
298
|
+
content = strip_frontmatter(path.read_text())
|
|
299
|
+
parts.append(f"---\n\n{content.strip()}\n")
|
|
300
|
+
|
|
301
|
+
output = PROJECT_ROOT / ".windsurfrules"
|
|
302
|
+
output.write_text("\n".join(parts) + "\n")
|
|
303
|
+
print(f" ā
Generated .windsurfrules ({len(rules)} rules)")
|
|
304
|
+
|
|
305
|
+
|
|
306
|
+
def generate_gemini_md() -> None:
|
|
307
|
+
"""Create GEMINI.md symlink to AGENTS.md."""
|
|
308
|
+
link = PROJECT_ROOT / "GEMINI.md"
|
|
309
|
+
if link.exists() or link.is_symlink():
|
|
310
|
+
link.unlink()
|
|
311
|
+
link.symlink_to("AGENTS.md")
|
|
312
|
+
print(" ā
Created GEMINI.md ā AGENTS.md symlink")
|
|
313
|
+
|
|
314
|
+
|
|
315
|
+
def generate_claude_skills() -> None:
|
|
316
|
+
"""Create .claude/skills/ symlinks for ALL skills in .agent-src/skills/.
|
|
317
|
+
"""
|
|
318
|
+
if not SKILLS_SOURCE.exists():
|
|
319
|
+
print(" ā ļø .agent-src/skills/ not found ā skipping skills")
|
|
320
|
+
return
|
|
321
|
+
|
|
322
|
+
# All skill directories in .agent-src/skills/
|
|
323
|
+
skills = sorted([d.name for d in SKILLS_SOURCE.iterdir() if d.is_dir()])
|
|
324
|
+
# All command names (to protect from stale cleanup)
|
|
325
|
+
command_names = set()
|
|
326
|
+
if COMMANDS_SOURCE.exists():
|
|
327
|
+
command_names = {f.stem for f in COMMANDS_SOURCE.glob("*.md")}
|
|
328
|
+
|
|
329
|
+
CLAUDE_SKILLS_DIR.mkdir(parents=True, exist_ok=True)
|
|
330
|
+
|
|
331
|
+
# Clean stale symlinks (but not converted commands or README)
|
|
332
|
+
for item in CLAUDE_SKILLS_DIR.iterdir():
|
|
333
|
+
if item.is_symlink() and item.name not in skills and item.name not in command_names and item.name != "README.md":
|
|
334
|
+
item.unlink()
|
|
335
|
+
|
|
336
|
+
count = 0
|
|
337
|
+
for skill in skills:
|
|
338
|
+
link = CLAUDE_SKILLS_DIR / skill
|
|
339
|
+
if link.exists() or link.is_symlink():
|
|
340
|
+
link.unlink()
|
|
341
|
+
rel_target = Path("../../.agent-src/skills") / skill
|
|
342
|
+
link.symlink_to(rel_target)
|
|
343
|
+
count += 1
|
|
344
|
+
|
|
345
|
+
print(f" ā
Created {count} skill symlinks in .claude/skills/")
|
|
346
|
+
|
|
347
|
+
|
|
348
|
+
def extract_description_from_md(content: str) -> str:
|
|
349
|
+
"""Extract description from first # heading or first non-empty line."""
|
|
350
|
+
for line in content.strip().split("\n"):
|
|
351
|
+
line = line.strip()
|
|
352
|
+
if line.startswith("# "):
|
|
353
|
+
return line[2:].strip()
|
|
354
|
+
if line and not line.startswith("#"):
|
|
355
|
+
return line[:120]
|
|
356
|
+
return ""
|
|
357
|
+
|
|
358
|
+
|
|
359
|
+
def generate_claude_commands() -> None:
|
|
360
|
+
"""Create .claude/skills/{name}/SKILL.md symlinks for ALL Augment commands.
|
|
361
|
+
|
|
362
|
+
Commands in .agent-src/commands/ are the single source of truth.
|
|
363
|
+
They must include name: and disable-model-invocation: true in frontmatter
|
|
364
|
+
(added once, then maintained as part of the command file).
|
|
365
|
+
"""
|
|
366
|
+
if not COMMANDS_SOURCE.exists():
|
|
367
|
+
print(" ā ļø .agent-src/commands/ not found ā skipping commands")
|
|
368
|
+
return
|
|
369
|
+
|
|
370
|
+
CLAUDE_SKILLS_DIR.mkdir(parents=True, exist_ok=True)
|
|
371
|
+
|
|
372
|
+
# Collect skill names to avoid overwriting real skills with same-name commands
|
|
373
|
+
skill_names = set()
|
|
374
|
+
if SKILLS_SOURCE.exists():
|
|
375
|
+
skill_names = {d.name for d in SKILLS_SOURCE.iterdir() if d.is_dir()}
|
|
376
|
+
|
|
377
|
+
count = 0
|
|
378
|
+
skipped = 0
|
|
379
|
+
for source_file in sorted(COMMANDS_SOURCE.glob("*.md")):
|
|
380
|
+
name = source_file.stem
|
|
381
|
+
|
|
382
|
+
# Skip if a real skill with the same name exists ā skill takes priority
|
|
383
|
+
if name in skill_names:
|
|
384
|
+
skipped += 1
|
|
385
|
+
continue
|
|
386
|
+
|
|
387
|
+
# Create skill directory (real dir, symlinked SKILL.md inside)
|
|
388
|
+
skill_dir = CLAUDE_SKILLS_DIR / name
|
|
389
|
+
skill_dir.mkdir(parents=True, exist_ok=True)
|
|
390
|
+
|
|
391
|
+
skill_file = skill_dir / "SKILL.md"
|
|
392
|
+
if skill_file.exists() or skill_file.is_symlink():
|
|
393
|
+
skill_file.unlink()
|
|
394
|
+
|
|
395
|
+
# Symlink: .claude/skills/{name}/SKILL.md ā ../../../.agent-src/commands/{name}.md
|
|
396
|
+
rel_target = Path("../../../.agent-src/commands") / source_file.name
|
|
397
|
+
skill_file.symlink_to(rel_target)
|
|
398
|
+
count += 1
|
|
399
|
+
|
|
400
|
+
msg = f" ā
Created {count} command symlinks in .claude/skills/"
|
|
401
|
+
if skipped:
|
|
402
|
+
msg += f" ({skipped} skipped ā same-name skill exists)"
|
|
403
|
+
print(msg)
|
|
404
|
+
|
|
405
|
+
|
|
406
|
+
def generate_persona_symlinks() -> int:
|
|
407
|
+
"""Create symlink directories for personas (.claude/personas/, .cursor/personas/).
|
|
408
|
+
|
|
409
|
+
Symlinks each persona .md file from .agent-src/personas/ into tool-specific
|
|
410
|
+
directories. Excludes README.md ā that's authoring documentation, not a persona.
|
|
411
|
+
"""
|
|
412
|
+
if not PERSONAS_SOURCE.exists():
|
|
413
|
+
print(" ā ļø .agent-src/personas/ not found ā skipping personas")
|
|
414
|
+
return 0
|
|
415
|
+
|
|
416
|
+
personas = sorted([
|
|
417
|
+
f.name for f in PERSONAS_SOURCE.glob("*.md") if f.stem != "README"
|
|
418
|
+
])
|
|
419
|
+
total = 0
|
|
420
|
+
for tool_dir, rel_prefix in PERSONA_TOOL_DIRS.items():
|
|
421
|
+
target_dir = PROJECT_ROOT / tool_dir
|
|
422
|
+
target_dir.mkdir(parents=True, exist_ok=True)
|
|
423
|
+
|
|
424
|
+
# Clean stale symlinks
|
|
425
|
+
for item in target_dir.iterdir():
|
|
426
|
+
if item.is_symlink() and item.name not in personas and item.name != "README.md":
|
|
427
|
+
item.unlink()
|
|
428
|
+
|
|
429
|
+
for persona in personas:
|
|
430
|
+
link = target_dir / persona
|
|
431
|
+
target = Path(rel_prefix) / persona
|
|
432
|
+
if link.exists() or link.is_symlink():
|
|
433
|
+
link.unlink()
|
|
434
|
+
link.symlink_to(target)
|
|
435
|
+
total += 1
|
|
436
|
+
|
|
437
|
+
print(f" ā
Created {total} persona symlinks across {len(PERSONA_TOOL_DIRS)} tool directories ({len(personas)} personas each)")
|
|
438
|
+
return total
|
|
439
|
+
|
|
440
|
+
|
|
441
|
+
def generate_tools() -> None:
|
|
442
|
+
"""Generate all tool-specific directories and files."""
|
|
443
|
+
print("š§ Generating multi-agent tool directories...\n")
|
|
444
|
+
generate_rule_symlinks()
|
|
445
|
+
generate_windsurfrules()
|
|
446
|
+
generate_gemini_md()
|
|
447
|
+
generate_claude_skills()
|
|
448
|
+
generate_claude_commands()
|
|
449
|
+
generate_persona_symlinks()
|
|
450
|
+
print("\nā
All tool directories generated")
|
|
451
|
+
|
|
452
|
+
|
|
453
|
+
# āā .augment/ projection āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
|
|
454
|
+
# The package uses .agent-src/ as the tool-agnostic compressed source of truth.
|
|
455
|
+
# .augment/ is a generated projection so that Augment Code (which reads from
|
|
456
|
+
# .augment/ and cannot follow symlinked rule files) works on the package repo
|
|
457
|
+
# itself. Rules are copied (real files); everything else is symlinked.
|
|
458
|
+
|
|
459
|
+
# Subdirectories of .agent-src/ that map into .augment/ as symlinks.
|
|
460
|
+
AUGMENT_SYMLINK_DIRS = ("skills", "commands", "guidelines", "personas", "templates", "contexts", "scripts")
|
|
461
|
+
# Top-level files to symlink into .augment/ (README, etc.)
|
|
462
|
+
AUGMENT_SYMLINK_FILES = ("README.md",)
|
|
463
|
+
|
|
464
|
+
|
|
465
|
+
def project_to_augment() -> None:
|
|
466
|
+
"""Mirror .agent-src/ into .augment/. Copy rules, symlink everything else."""
|
|
467
|
+
if not TARGET_DIR.exists():
|
|
468
|
+
print(f" ā ļø {TARGET_DIR.name}/ not found ā nothing to project")
|
|
469
|
+
return
|
|
470
|
+
|
|
471
|
+
AUGMENT_DIR.mkdir(parents=True, exist_ok=True)
|
|
472
|
+
|
|
473
|
+
# Rules: copy each .md file (Augment Code cannot load symlinked rules)
|
|
474
|
+
src_rules = TARGET_DIR / "rules"
|
|
475
|
+
dst_rules = AUGMENT_DIR / "rules"
|
|
476
|
+
dst_rules.mkdir(parents=True, exist_ok=True)
|
|
477
|
+
existing = {f.name for f in dst_rules.iterdir() if f.is_file() or f.is_symlink()}
|
|
478
|
+
current = set()
|
|
479
|
+
copied = 0
|
|
480
|
+
if src_rules.exists():
|
|
481
|
+
for rule in sorted(src_rules.glob("*.md")):
|
|
482
|
+
target = dst_rules / rule.name
|
|
483
|
+
if target.is_symlink():
|
|
484
|
+
target.unlink()
|
|
485
|
+
shutil.copy2(rule, target)
|
|
486
|
+
current.add(rule.name)
|
|
487
|
+
copied += 1
|
|
488
|
+
# Remove stale rule files
|
|
489
|
+
removed_rules = 0
|
|
490
|
+
for name in existing - current:
|
|
491
|
+
(dst_rules / name).unlink()
|
|
492
|
+
removed_rules += 1
|
|
493
|
+
print(f" ā
Copied {copied} rules to .augment/rules/" + (f" ({removed_rules} stale removed)" if removed_rules else ""))
|
|
494
|
+
|
|
495
|
+
# Subdirectories: replace each with a symlink ā ../.agent-src/<subdir>
|
|
496
|
+
for sub in AUGMENT_SYMLINK_DIRS:
|
|
497
|
+
dst = AUGMENT_DIR / sub
|
|
498
|
+
if dst.is_symlink() or dst.exists():
|
|
499
|
+
if dst.is_dir() and not dst.is_symlink():
|
|
500
|
+
shutil.rmtree(dst)
|
|
501
|
+
else:
|
|
502
|
+
dst.unlink()
|
|
503
|
+
src = TARGET_DIR / sub
|
|
504
|
+
if src.exists():
|
|
505
|
+
dst.symlink_to(Path("..") / ".agent-src" / sub, target_is_directory=True)
|
|
506
|
+
print(f" ā
Symlinked .augment/{sub} ā ../.agent-src/{sub}")
|
|
507
|
+
|
|
508
|
+
# Top-level files: symlink
|
|
509
|
+
for name in AUGMENT_SYMLINK_FILES:
|
|
510
|
+
dst = AUGMENT_DIR / name
|
|
511
|
+
src = TARGET_DIR / name
|
|
512
|
+
if dst.is_symlink() or dst.exists():
|
|
513
|
+
dst.unlink()
|
|
514
|
+
if src.exists():
|
|
515
|
+
dst.symlink_to(Path("..") / ".agent-src" / name)
|
|
516
|
+
print(f" ā
Symlinked .augment/{name} ā ../.agent-src/{name}")
|
|
517
|
+
|
|
518
|
+
# Cleanup: remove any stray top-level entries in .augment/ that are no longer projected
|
|
519
|
+
known = set(AUGMENT_SYMLINK_DIRS) | set(AUGMENT_SYMLINK_FILES) | {"rules"}
|
|
520
|
+
for item in AUGMENT_DIR.iterdir():
|
|
521
|
+
if item.name in known:
|
|
522
|
+
continue
|
|
523
|
+
if item.is_symlink() or item.is_file():
|
|
524
|
+
item.unlink()
|
|
525
|
+
print(f" šļø Removed stale .augment/{item.name}")
|
|
526
|
+
elif item.is_dir():
|
|
527
|
+
shutil.rmtree(item)
|
|
528
|
+
print(f" šļø Removed stale .augment/{item.name}/")
|
|
529
|
+
|
|
530
|
+
|
|
531
|
+
def clean_tools() -> None:
|
|
532
|
+
"""Remove all generated tool directories and files."""
|
|
533
|
+
import shutil as _shutil
|
|
534
|
+
targets = [
|
|
535
|
+
PROJECT_ROOT / ".claude",
|
|
536
|
+
PROJECT_ROOT / ".cursor",
|
|
537
|
+
PROJECT_ROOT / ".clinerules",
|
|
538
|
+
PROJECT_ROOT / ".windsurfrules",
|
|
539
|
+
PROJECT_ROOT / "GEMINI.md",
|
|
540
|
+
]
|
|
541
|
+
for t in targets:
|
|
542
|
+
if t.is_dir():
|
|
543
|
+
_shutil.rmtree(t)
|
|
544
|
+
print(f" šļø Removed {t.relative_to(PROJECT_ROOT)}")
|
|
545
|
+
elif t.exists() or t.is_symlink():
|
|
546
|
+
t.unlink()
|
|
547
|
+
print(f" šļø Removed {t.relative_to(PROJECT_ROOT)}")
|
|
548
|
+
print("ā
All generated tool files cleaned")
|
|
549
|
+
|
|
550
|
+
|
|
551
|
+
|
|
552
|
+
def main() -> None:
|
|
553
|
+
if not SOURCE_DIR.exists():
|
|
554
|
+
print(f"ā Source directory not found: {SOURCE_DIR}")
|
|
555
|
+
sys.exit(1)
|
|
556
|
+
|
|
557
|
+
arg = sys.argv[1] if len(sys.argv) > 1 else "--sync"
|
|
558
|
+
|
|
559
|
+
if arg == "--list":
|
|
560
|
+
files = list_md_files(SOURCE_DIR)
|
|
561
|
+
print(f"š {len(files)} .md files total:\n")
|
|
562
|
+
for f in files:
|
|
563
|
+
print(f" {f}")
|
|
564
|
+
|
|
565
|
+
elif arg == "--changed":
|
|
566
|
+
changed = list_changed_md(SOURCE_DIR)
|
|
567
|
+
if not changed:
|
|
568
|
+
print("ā
No .md files changed since last compression")
|
|
569
|
+
sys.exit(0)
|
|
570
|
+
print(f"š {len(changed)} .md files changed since last compression:\n")
|
|
571
|
+
for f in changed:
|
|
572
|
+
print(f" {f}")
|
|
573
|
+
|
|
574
|
+
elif arg == "--mark-done":
|
|
575
|
+
if len(sys.argv) < 3:
|
|
576
|
+
print("Usage: python scripts/compress.py --mark-done <relative-path>")
|
|
577
|
+
sys.exit(1)
|
|
578
|
+
mark_done(sys.argv[2])
|
|
579
|
+
|
|
580
|
+
elif arg == "--mark-all-done":
|
|
581
|
+
mark_all_done()
|
|
582
|
+
|
|
583
|
+
elif arg == "--check":
|
|
584
|
+
missing, stale = check_sync(SOURCE_DIR, TARGET_DIR)
|
|
585
|
+
if not missing and not stale:
|
|
586
|
+
print("ā
.agent-src/ is in sync with .agent-src.uncompressed/")
|
|
587
|
+
sys.exit(0)
|
|
588
|
+
if missing:
|
|
589
|
+
print(f"ā Missing in .agent-src/ ({len(missing)}):")
|
|
590
|
+
for f in missing:
|
|
591
|
+
print(f" {f}")
|
|
592
|
+
if stale:
|
|
593
|
+
print(f"ā Stale in .agent-src/ ({len(stale)}):")
|
|
594
|
+
for f in stale:
|
|
595
|
+
print(f" {f}")
|
|
596
|
+
print(f"\nRun 'task sync' to fix non-.md files, then ask the agent to compress .md files.")
|
|
597
|
+
sys.exit(1)
|
|
598
|
+
|
|
599
|
+
elif arg == "--sync":
|
|
600
|
+
print(f"Source: {SOURCE_DIR}")
|
|
601
|
+
print(f"Target: {TARGET_DIR}\n")
|
|
602
|
+
print("--- Syncing non-.md files ---")
|
|
603
|
+
copied = sync_non_md(SOURCE_DIR, TARGET_DIR)
|
|
604
|
+
print(f"\n--- Cleanup stale files ---")
|
|
605
|
+
deleted = cleanup_stale(SOURCE_DIR, TARGET_DIR)
|
|
606
|
+
# Also cleanup stale hashes
|
|
607
|
+
hashes = load_hashes()
|
|
608
|
+
stale_keys = [k for k in hashes if not (SOURCE_DIR / k).exists()]
|
|
609
|
+
for k in stale_keys:
|
|
610
|
+
del hashes[k]
|
|
611
|
+
if stale_keys:
|
|
612
|
+
save_hashes(hashes)
|
|
613
|
+
print(f" Cleaned {len(stale_keys)} stale hash entries")
|
|
614
|
+
changed = list_changed_md(SOURCE_DIR)
|
|
615
|
+
print(f"\nā
Done: {copied} copied, {deleted} stale deleted")
|
|
616
|
+
if changed:
|
|
617
|
+
print(f"š {len(changed)} .md files need compression (run --changed to see them)")
|
|
618
|
+
else:
|
|
619
|
+
print(f"ā
All .md files are up to date")
|
|
620
|
+
print(f"\n--- Projecting .agent-src/ ā .augment/ ---")
|
|
621
|
+
project_to_augment()
|
|
622
|
+
|
|
623
|
+
elif arg == "--check-hashes":
|
|
624
|
+
has_issues = False
|
|
625
|
+
changed = list_changed_md(SOURCE_DIR)
|
|
626
|
+
stale = find_stale_hashes(SOURCE_DIR)
|
|
627
|
+
|
|
628
|
+
if stale:
|
|
629
|
+
has_issues = True
|
|
630
|
+
print(f"ā ļø {len(stale)} stale hash(es) for deleted source files:\n")
|
|
631
|
+
for f in stale:
|
|
632
|
+
print(f" {f}")
|
|
633
|
+
print(f"\nRun 'task sync-clean-hashes' to remove them.\n")
|
|
634
|
+
|
|
635
|
+
if changed:
|
|
636
|
+
has_issues = True
|
|
637
|
+
print(f"ā {len(changed)} .md file(s) need recompression:\n")
|
|
638
|
+
for f in changed:
|
|
639
|
+
stored = load_hashes().get(f)
|
|
640
|
+
reason = "no hash stored" if stored is None else "hash mismatch"
|
|
641
|
+
print(f" {f} ({reason})")
|
|
642
|
+
print(f"\nRun '/compress' command to recompress these files.")
|
|
643
|
+
|
|
644
|
+
if not has_issues:
|
|
645
|
+
print("ā
All compression hashes are clean (no stale, no mismatches)")
|
|
646
|
+
sys.exit(0)
|
|
647
|
+
sys.exit(1)
|
|
648
|
+
|
|
649
|
+
elif arg == "--clean-hashes":
|
|
650
|
+
count = clean_stale_hashes(SOURCE_DIR)
|
|
651
|
+
if count:
|
|
652
|
+
print(f"ā
Removed {count} stale hash(es)")
|
|
653
|
+
else:
|
|
654
|
+
print("ā
No stale hashes found")
|
|
655
|
+
|
|
656
|
+
elif arg == "--generate-tools":
|
|
657
|
+
generate_tools()
|
|
658
|
+
|
|
659
|
+
elif arg == "--clean-tools":
|
|
660
|
+
clean_tools()
|
|
661
|
+
|
|
662
|
+
elif arg == "--project-augment":
|
|
663
|
+
project_to_augment()
|
|
664
|
+
|
|
665
|
+
else:
|
|
666
|
+
print("Usage: python scripts/compress.py [--sync|--list|--changed|--check|--check-hashes|--clean-hashes|--mark-done <path>|--mark-all-done|--generate-tools|--clean-tools|--project-augment]")
|
|
667
|
+
sys.exit(1)
|
|
668
|
+
|
|
669
|
+
|
|
670
|
+
if __name__ == "__main__":
|
|
671
|
+
main()
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Augment Sync ā sync non-.md files and cleanup stale files
|
|
3
|
+
#
|
|
4
|
+
# Usage:
|
|
5
|
+
# ./scripts/compress.sh # sync non-.md files + cleanup
|
|
6
|
+
# ./scripts/compress.sh --list # list ALL .md files
|
|
7
|
+
# ./scripts/compress.sh --changed # list .md files changed since last compression
|
|
8
|
+
# ./scripts/compress.sh --check # check if dirs are in sync
|
|
9
|
+
# ./scripts/compress.sh --mark-done <path> # mark file as compressed
|
|
10
|
+
# ./scripts/compress.sh --mark-all-done # mark all files as compressed
|
|
11
|
+
#
|
|
12
|
+
# .md compression is done by the Augment agent interactively.
|
|
13
|
+
|
|
14
|
+
set -euo pipefail
|
|
15
|
+
|
|
16
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
17
|
+
|
|
18
|
+
python3 "$SCRIPT_DIR/compress.py" "${@:---sync}"
|