@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,487 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Agent Config — Project Bridge Installer (Python)
|
|
4
|
+
|
|
5
|
+
Generates project bridge files (.agent-settings.yml, .vscode/settings.json,
|
|
6
|
+
etc.) so that supported AI tools can discover agent-config from the project.
|
|
7
|
+
|
|
8
|
+
On first run in a project that still has the legacy flat-file
|
|
9
|
+
`.agent-settings` (key=value), the installer migrates it to the new YAML
|
|
10
|
+
format in `.agent-settings.yml`, leaves a one-shot backup as
|
|
11
|
+
`.agent-settings.backup.key-value`, and deletes the legacy file. This runs
|
|
12
|
+
exactly once; subsequent runs are idempotent.
|
|
13
|
+
|
|
14
|
+
Usage:
|
|
15
|
+
python3 scripts/install.py # defaults: cost_profile=minimal
|
|
16
|
+
python3 scripts/install.py --profile=balanced # set cost_profile=balanced
|
|
17
|
+
python3 scripts/install.py --force # overwrite existing files
|
|
18
|
+
python3 scripts/install.py --skip-bridges # only create .agent-settings.yml
|
|
19
|
+
python3 scripts/install.py --project <dir> # override project root
|
|
20
|
+
|
|
21
|
+
Idempotent — safe to run multiple times. Never overwrites files without --force.
|
|
22
|
+
Zero dependencies — standard library only.
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
from __future__ import annotations
|
|
26
|
+
|
|
27
|
+
import argparse
|
|
28
|
+
import copy
|
|
29
|
+
import json
|
|
30
|
+
import os
|
|
31
|
+
import re
|
|
32
|
+
import sys
|
|
33
|
+
from pathlib import Path
|
|
34
|
+
|
|
35
|
+
DEFAULT_PROFILE = "minimal"
|
|
36
|
+
SUPPORTED_PROFILES = ("minimal", "balanced", "full")
|
|
37
|
+
COST_PROFILE_PLACEHOLDER = "__COST_PROFILE__"
|
|
38
|
+
|
|
39
|
+
SETTINGS_FILE = ".agent-settings.yml"
|
|
40
|
+
LEGACY_SETTINGS_FILE = ".agent-settings"
|
|
41
|
+
LEGACY_BACKUP_FILE = ".agent-settings.backup.key-value"
|
|
42
|
+
|
|
43
|
+
# Maps legacy flat keys (.agent-settings, key=value) to the new dotted YAML
|
|
44
|
+
# paths in .agent-settings.yml. Applied once during auto-migration.
|
|
45
|
+
LEGACY_RENAME_MAP = {
|
|
46
|
+
"cost_profile": "cost_profile",
|
|
47
|
+
"ide": "personal.ide",
|
|
48
|
+
"open_edited_files": "personal.open_edited_files",
|
|
49
|
+
"user_name": "personal.user_name",
|
|
50
|
+
"rtk_installed": "personal.rtk_installed",
|
|
51
|
+
"minimal_output": "personal.minimal_output",
|
|
52
|
+
"play_by_play": "personal.play_by_play",
|
|
53
|
+
"pr_comment_bot_icon": "project.pr_comment_bot_icon",
|
|
54
|
+
"pr_template": "project.pr_template",
|
|
55
|
+
"upstream_repo": "project.upstream_repo",
|
|
56
|
+
"improvement_pr_branch_prefix": "project.improvement_pr_branch_prefix",
|
|
57
|
+
"github_pr_reply_method": "github.pr_reply_method",
|
|
58
|
+
"eloquent_access_style": "eloquent.access_style",
|
|
59
|
+
"skill_improvement_pipeline": "pipelines.skill_improvement",
|
|
60
|
+
"subagent_implementer_model": "subagents.implementer_model",
|
|
61
|
+
"subagent_judge_model": "subagents.judge_model",
|
|
62
|
+
"subagent_max_parallel": "subagents.max_parallel",
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
# --- Output helpers ---
|
|
67
|
+
|
|
68
|
+
QUIET = False
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def info(msg: str) -> None:
|
|
72
|
+
if not QUIET:
|
|
73
|
+
print(f" {msg}")
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def success(msg: str) -> None:
|
|
77
|
+
if not QUIET:
|
|
78
|
+
print(f" ✅ {msg}")
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
def skip(msg: str) -> None:
|
|
82
|
+
if not QUIET:
|
|
83
|
+
print(f" ⏭️ {msg}")
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
def warn(msg: str) -> None:
|
|
87
|
+
print(f" ⚠️ {msg}", file=sys.stderr)
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
def fail(msg: str) -> "None":
|
|
91
|
+
print(f" ❌ {msg}", file=sys.stderr)
|
|
92
|
+
sys.exit(1)
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
# --- Package detection ---
|
|
96
|
+
|
|
97
|
+
def detect_package_root(project_root: Path) -> Path:
|
|
98
|
+
candidates = [
|
|
99
|
+
project_root / "vendor" / "event4u" / "agent-config",
|
|
100
|
+
project_root / "node_modules" / "@event4u" / "agent-config",
|
|
101
|
+
]
|
|
102
|
+
for path in candidates:
|
|
103
|
+
if path.is_dir():
|
|
104
|
+
return path.resolve()
|
|
105
|
+
|
|
106
|
+
# Running from within the package itself (development mode)
|
|
107
|
+
if (project_root / "config" / "profiles" / "minimal.ini").exists():
|
|
108
|
+
return project_root
|
|
109
|
+
|
|
110
|
+
fail("Could not find agent-config package. Run from a project with composer/npm install.")
|
|
111
|
+
return project_root # unreachable
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
def detect_package_type(package_root: Path) -> str:
|
|
115
|
+
parts = package_root.parts
|
|
116
|
+
if "vendor" in parts:
|
|
117
|
+
return "composer"
|
|
118
|
+
if "node_modules" in parts:
|
|
119
|
+
return "npm"
|
|
120
|
+
return "local"
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
def detect_package_type_for_project(project_root: Path, package_root: Path) -> str:
|
|
124
|
+
"""Determine package type based on where the package lives relative to the project."""
|
|
125
|
+
composer_path = (project_root / "vendor" / "event4u" / "agent-config").resolve()
|
|
126
|
+
npm_path = (project_root / "node_modules" / "@event4u" / "agent-config").resolve()
|
|
127
|
+
package_resolved = package_root.resolve()
|
|
128
|
+
|
|
129
|
+
if package_resolved == composer_path or composer_path.exists():
|
|
130
|
+
if package_resolved == composer_path:
|
|
131
|
+
return "composer"
|
|
132
|
+
if package_resolved == npm_path or npm_path.exists():
|
|
133
|
+
if package_resolved == npm_path:
|
|
134
|
+
return "npm"
|
|
135
|
+
return detect_package_type(package_root)
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
# --- File utilities ---
|
|
139
|
+
|
|
140
|
+
def ensure_directory(path: Path) -> None:
|
|
141
|
+
path.mkdir(parents=True, exist_ok=True)
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
def write_file(path: Path, content: str) -> None:
|
|
145
|
+
ensure_directory(path.parent)
|
|
146
|
+
path.write_text(content, encoding="utf-8")
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
def read_json_file(path: Path) -> dict:
|
|
150
|
+
try:
|
|
151
|
+
data = json.loads(path.read_text(encoding="utf-8"))
|
|
152
|
+
except json.JSONDecodeError:
|
|
153
|
+
warn(f"Invalid JSON in {path}, treating as empty")
|
|
154
|
+
return {}
|
|
155
|
+
if not isinstance(data, dict):
|
|
156
|
+
warn(f"Unexpected JSON shape in {path}, treating as empty")
|
|
157
|
+
return {}
|
|
158
|
+
return data
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
def write_json_file(path: Path, data: dict) -> None:
|
|
162
|
+
content = json.dumps(data, indent=4, ensure_ascii=False) + "\n"
|
|
163
|
+
write_file(path, content)
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
def deep_merge(base: dict, overlay: dict) -> dict:
|
|
167
|
+
"""Recursive dict merge — overlay wins, nested dicts are merged, lists are replaced."""
|
|
168
|
+
result = copy.deepcopy(base)
|
|
169
|
+
for key, value in overlay.items():
|
|
170
|
+
if key in result and isinstance(result[key], dict) and isinstance(value, dict):
|
|
171
|
+
result[key] = deep_merge(result[key], value)
|
|
172
|
+
else:
|
|
173
|
+
result[key] = copy.deepcopy(value)
|
|
174
|
+
return result
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
def merge_json_file(path: Path, new_data: dict, force: bool, label: str) -> None:
|
|
178
|
+
if not path.exists():
|
|
179
|
+
write_json_file(path, new_data)
|
|
180
|
+
success(f"{label} created")
|
|
181
|
+
return
|
|
182
|
+
|
|
183
|
+
existing = read_json_file(path)
|
|
184
|
+
merged = deep_merge(existing, new_data)
|
|
185
|
+
|
|
186
|
+
if merged == existing:
|
|
187
|
+
skip(f"{label} already configured")
|
|
188
|
+
return
|
|
189
|
+
|
|
190
|
+
if not force:
|
|
191
|
+
skip(f"{label} exists, needs update (use --force)")
|
|
192
|
+
return
|
|
193
|
+
|
|
194
|
+
write_json_file(path, merged)
|
|
195
|
+
success(f"{label} updated")
|
|
196
|
+
|
|
197
|
+
|
|
198
|
+
# --- Legacy settings migration ---
|
|
199
|
+
|
|
200
|
+
def _parse_legacy_settings(text: str) -> "tuple[dict, list]":
|
|
201
|
+
"""Parse a legacy .agent-settings (key=value) file.
|
|
202
|
+
|
|
203
|
+
Returns (values, unknown) where values is a dict mapping legacy flat
|
|
204
|
+
keys to string values, and unknown is a list of keys NOT in
|
|
205
|
+
LEGACY_RENAME_MAP (preserved under `_legacy:` after migration).
|
|
206
|
+
"""
|
|
207
|
+
values: dict = {}
|
|
208
|
+
unknown: list = []
|
|
209
|
+
for raw in text.splitlines():
|
|
210
|
+
line = raw.strip()
|
|
211
|
+
if not line or line.startswith("#"):
|
|
212
|
+
continue
|
|
213
|
+
if "=" not in line:
|
|
214
|
+
continue
|
|
215
|
+
key, _, value = line.partition("=")
|
|
216
|
+
key = key.strip()
|
|
217
|
+
value = value.strip()
|
|
218
|
+
if not key:
|
|
219
|
+
continue
|
|
220
|
+
values[key] = value
|
|
221
|
+
if key not in LEGACY_RENAME_MAP:
|
|
222
|
+
unknown.append(key)
|
|
223
|
+
return values, unknown
|
|
224
|
+
|
|
225
|
+
|
|
226
|
+
def _yaml_scalar(value: str) -> str:
|
|
227
|
+
"""Format a string value as a YAML scalar with minimal quoting.
|
|
228
|
+
|
|
229
|
+
Booleans and non-negative integers are emitted unquoted; everything
|
|
230
|
+
else is double-quoted so the migrated file is unambiguous.
|
|
231
|
+
"""
|
|
232
|
+
if value == "":
|
|
233
|
+
return '""'
|
|
234
|
+
if value in ("true", "false"):
|
|
235
|
+
return value
|
|
236
|
+
if value.isdigit():
|
|
237
|
+
return value
|
|
238
|
+
# Escape backslashes and double-quotes, then wrap
|
|
239
|
+
escaped = value.replace("\\", "\\\\").replace('"', '\\"')
|
|
240
|
+
return f'"{escaped}"'
|
|
241
|
+
|
|
242
|
+
|
|
243
|
+
def _replace_template_value(template: str, dotted_path: str, value: str) -> str:
|
|
244
|
+
"""Replace the default value for a dotted-path key in the YAML template.
|
|
245
|
+
|
|
246
|
+
Strategy: walk the template lines, track the current top-level
|
|
247
|
+
section, and replace the first matching line. Comments and indentation
|
|
248
|
+
are preserved.
|
|
249
|
+
"""
|
|
250
|
+
parts = dotted_path.split(".")
|
|
251
|
+
if len(parts) == 1:
|
|
252
|
+
section, key = None, parts[0]
|
|
253
|
+
elif len(parts) == 2:
|
|
254
|
+
section, key = parts[0], parts[1]
|
|
255
|
+
else:
|
|
256
|
+
return template # deeper nesting not supported in current schema
|
|
257
|
+
|
|
258
|
+
lines = template.splitlines()
|
|
259
|
+
current_section: "str | None" = None
|
|
260
|
+
section_re = re.compile(r"^([A-Za-z_][A-Za-z0-9_]*):\s*$")
|
|
261
|
+
scalar_top_re = re.compile(r"^([A-Za-z_][A-Za-z0-9_]*):\s*.*$")
|
|
262
|
+
scalar_sub_re = re.compile(r"^(\s+)([A-Za-z_][A-Za-z0-9_]*):\s*.*$")
|
|
263
|
+
|
|
264
|
+
replacement = _yaml_scalar(value)
|
|
265
|
+
for idx, line in enumerate(lines):
|
|
266
|
+
# Top-level section header
|
|
267
|
+
m_section = section_re.match(line)
|
|
268
|
+
if m_section:
|
|
269
|
+
current_section = m_section.group(1)
|
|
270
|
+
continue
|
|
271
|
+
if section is None:
|
|
272
|
+
# Top-level scalar target
|
|
273
|
+
m_top = scalar_top_re.match(line)
|
|
274
|
+
if m_top and m_top.group(1) == key and not line.startswith((" ", "\t")):
|
|
275
|
+
lines[idx] = f"{key}: {replacement}"
|
|
276
|
+
return "\n".join(lines) + ("\n" if template.endswith("\n") else "")
|
|
277
|
+
else:
|
|
278
|
+
if current_section != section:
|
|
279
|
+
continue
|
|
280
|
+
m_sub = scalar_sub_re.match(line)
|
|
281
|
+
if m_sub and m_sub.group(2) == key:
|
|
282
|
+
indent = m_sub.group(1)
|
|
283
|
+
lines[idx] = f"{indent}{key}: {replacement}"
|
|
284
|
+
return "\n".join(lines) + ("\n" if template.endswith("\n") else "")
|
|
285
|
+
return template
|
|
286
|
+
|
|
287
|
+
|
|
288
|
+
def _append_unknown_legacy(rendered: str, legacy_values: dict, unknown_keys: list) -> str:
|
|
289
|
+
if not unknown_keys:
|
|
290
|
+
return rendered
|
|
291
|
+
block = [
|
|
292
|
+
"",
|
|
293
|
+
"# Unknown keys from the legacy .agent-settings — review and drop.",
|
|
294
|
+
"_legacy:",
|
|
295
|
+
]
|
|
296
|
+
for key in sorted(unknown_keys):
|
|
297
|
+
block.append(f" {key}: {_yaml_scalar(legacy_values[key])}")
|
|
298
|
+
suffix = "\n".join(block) + "\n"
|
|
299
|
+
if rendered.endswith("\n"):
|
|
300
|
+
return rendered + suffix
|
|
301
|
+
return rendered + "\n" + suffix
|
|
302
|
+
|
|
303
|
+
|
|
304
|
+
def _migrate_legacy_if_present(project_root: Path, template_body: str) -> "str | None":
|
|
305
|
+
"""If a legacy .agent-settings exists, migrate it and return the new
|
|
306
|
+
YAML body. Returns None if no legacy file exists."""
|
|
307
|
+
legacy_target = project_root / LEGACY_SETTINGS_FILE
|
|
308
|
+
if not legacy_target.is_file():
|
|
309
|
+
return None
|
|
310
|
+
|
|
311
|
+
legacy_text = legacy_target.read_text(encoding="utf-8")
|
|
312
|
+
values, unknown = _parse_legacy_settings(legacy_text)
|
|
313
|
+
|
|
314
|
+
rendered = template_body
|
|
315
|
+
for flat_key, value in values.items():
|
|
316
|
+
if flat_key in LEGACY_RENAME_MAP:
|
|
317
|
+
rendered = _replace_template_value(rendered, LEGACY_RENAME_MAP[flat_key], value)
|
|
318
|
+
rendered = _append_unknown_legacy(rendered, values, unknown)
|
|
319
|
+
|
|
320
|
+
backup_target = project_root / LEGACY_BACKUP_FILE
|
|
321
|
+
backup_target.write_text(legacy_text, encoding="utf-8")
|
|
322
|
+
legacy_target.unlink()
|
|
323
|
+
|
|
324
|
+
info(f"Migrated legacy {LEGACY_SETTINGS_FILE} → {SETTINGS_FILE}")
|
|
325
|
+
info(f"Backup saved to {LEGACY_BACKUP_FILE}")
|
|
326
|
+
if unknown:
|
|
327
|
+
warn(f"Legacy keys not in rename map preserved under _legacy: {', '.join(sorted(unknown))}")
|
|
328
|
+
return rendered
|
|
329
|
+
|
|
330
|
+
|
|
331
|
+
# --- Bridge generators ---
|
|
332
|
+
|
|
333
|
+
def ensure_agent_settings(project_root: Path, package_root: Path, profile: str, force: bool) -> None:
|
|
334
|
+
target = project_root / SETTINGS_FILE
|
|
335
|
+
profile_source = package_root / "config" / "profiles" / f"{profile}.ini"
|
|
336
|
+
template_source = package_root / "config" / "agent-settings.template.yml"
|
|
337
|
+
|
|
338
|
+
if not profile_source.exists():
|
|
339
|
+
fail(f"Missing profile preset: {profile_source}")
|
|
340
|
+
if not template_source.exists():
|
|
341
|
+
fail(f"Missing settings template: {template_source}")
|
|
342
|
+
|
|
343
|
+
template = template_source.read_text(encoding="utf-8")
|
|
344
|
+
if COST_PROFILE_PLACEHOLDER not in template:
|
|
345
|
+
fail(f"Template is missing placeholder {COST_PROFILE_PLACEHOLDER}")
|
|
346
|
+
template_body = template.replace(COST_PROFILE_PLACEHOLDER, profile)
|
|
347
|
+
|
|
348
|
+
legacy_target = project_root / LEGACY_SETTINGS_FILE
|
|
349
|
+
if legacy_target.is_file() and target.exists():
|
|
350
|
+
warn(
|
|
351
|
+
f"Both {SETTINGS_FILE} and legacy {LEGACY_SETTINGS_FILE} exist. "
|
|
352
|
+
f"Skipping migration to avoid overwriting {SETTINGS_FILE}. "
|
|
353
|
+
f"Delete one of them manually and re-run."
|
|
354
|
+
)
|
|
355
|
+
return
|
|
356
|
+
|
|
357
|
+
migrated = _migrate_legacy_if_present(project_root, template_body)
|
|
358
|
+
if migrated is not None:
|
|
359
|
+
write_file(target, migrated)
|
|
360
|
+
success(f"{SETTINGS_FILE} migrated from legacy key=value")
|
|
361
|
+
return
|
|
362
|
+
|
|
363
|
+
if target.exists() and not force:
|
|
364
|
+
skip(f"{SETTINGS_FILE} already exists")
|
|
365
|
+
return
|
|
366
|
+
|
|
367
|
+
write_file(target, template_body)
|
|
368
|
+
success(f"{SETTINGS_FILE} created (cost_profile={profile})")
|
|
369
|
+
|
|
370
|
+
|
|
371
|
+
def ensure_vscode_bridge(project_root: Path, package_type: str, force: bool) -> None:
|
|
372
|
+
plugin_paths = {
|
|
373
|
+
"composer": "./vendor/event4u/agent-config/plugin/agent-config",
|
|
374
|
+
"npm": "./node_modules/@event4u/agent-config/plugin/agent-config",
|
|
375
|
+
}
|
|
376
|
+
plugin_path = plugin_paths.get(package_type, "./plugin/agent-config")
|
|
377
|
+
|
|
378
|
+
bridge = {"chat.pluginLocations": {plugin_path: True}}
|
|
379
|
+
merge_json_file(project_root / ".vscode" / "settings.json", bridge, force, ".vscode/settings.json")
|
|
380
|
+
|
|
381
|
+
|
|
382
|
+
def ensure_augment_bridge(project_root: Path, force: bool) -> None:
|
|
383
|
+
bridge = {"enabledPlugins": {"agent-config@event4u": True}}
|
|
384
|
+
merge_json_file(project_root / ".augment" / "settings.json", bridge, force, ".augment/settings.json")
|
|
385
|
+
|
|
386
|
+
|
|
387
|
+
def ensure_copilot_bridge(project_root: Path, force: bool) -> None:
|
|
388
|
+
target = project_root / ".github" / "plugin" / "marketplace.json"
|
|
389
|
+
|
|
390
|
+
bridge = {
|
|
391
|
+
"marketplace": {
|
|
392
|
+
"name": "event4u-agent-marketplace",
|
|
393
|
+
"plugins": [
|
|
394
|
+
{
|
|
395
|
+
"id": "agent-config@event4u",
|
|
396
|
+
"repository": "https://github.com/event4u-app/agent-config",
|
|
397
|
+
},
|
|
398
|
+
],
|
|
399
|
+
},
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
if target.exists() and not force:
|
|
403
|
+
skip(".github/plugin/marketplace.json already exists")
|
|
404
|
+
return
|
|
405
|
+
|
|
406
|
+
write_json_file(target, bridge)
|
|
407
|
+
success(".github/plugin/marketplace.json created")
|
|
408
|
+
|
|
409
|
+
|
|
410
|
+
# --- Argument parsing ---
|
|
411
|
+
|
|
412
|
+
def parse_options(argv: list[str]) -> argparse.Namespace:
|
|
413
|
+
parser = argparse.ArgumentParser(
|
|
414
|
+
prog="install.py",
|
|
415
|
+
description="Agent Config — Project Bridge Installer",
|
|
416
|
+
add_help=True,
|
|
417
|
+
)
|
|
418
|
+
parser.add_argument(
|
|
419
|
+
"--profile",
|
|
420
|
+
default=DEFAULT_PROFILE,
|
|
421
|
+
help=f"cost_profile value ({'|'.join(SUPPORTED_PROFILES)}, default: {DEFAULT_PROFILE})",
|
|
422
|
+
)
|
|
423
|
+
parser.add_argument("--force", action="store_true", help="overwrite existing files")
|
|
424
|
+
parser.add_argument("--skip-bridges", action="store_true", help="only create .agent-settings.yml")
|
|
425
|
+
parser.add_argument("--project", default=None, help="project root (default: cwd or PROJECT_ROOT env)")
|
|
426
|
+
parser.add_argument("--package", default=None, help="package root (default: auto-detect under project)")
|
|
427
|
+
parser.add_argument("--quiet", action="store_true", help="suppress info/success output (warnings/errors still shown)")
|
|
428
|
+
return parser.parse_args(argv)
|
|
429
|
+
|
|
430
|
+
|
|
431
|
+
# --- Main ---
|
|
432
|
+
|
|
433
|
+
def main(argv: list[str]) -> int:
|
|
434
|
+
global QUIET
|
|
435
|
+
|
|
436
|
+
opts = parse_options(argv)
|
|
437
|
+
QUIET = opts.quiet
|
|
438
|
+
|
|
439
|
+
if opts.profile not in SUPPORTED_PROFILES:
|
|
440
|
+
fail(f"Unsupported profile: {opts.profile}. Supported: {', '.join(SUPPORTED_PROFILES)}")
|
|
441
|
+
|
|
442
|
+
project_root = Path(opts.project or os.environ.get("PROJECT_ROOT") or os.getcwd()).resolve()
|
|
443
|
+
|
|
444
|
+
if opts.package:
|
|
445
|
+
package_root = Path(opts.package).resolve()
|
|
446
|
+
if not (package_root / "config" / "profiles" / "minimal.ini").exists():
|
|
447
|
+
fail(f"Invalid --package path (missing config/profiles/minimal.ini): {package_root}")
|
|
448
|
+
package_type = detect_package_type_for_project(project_root, package_root)
|
|
449
|
+
else:
|
|
450
|
+
package_root = detect_package_root(project_root)
|
|
451
|
+
package_type = detect_package_type(package_root)
|
|
452
|
+
|
|
453
|
+
if not QUIET:
|
|
454
|
+
print()
|
|
455
|
+
info("Agent Config — Project Bridge Installer")
|
|
456
|
+
info(f"Project: {project_root}")
|
|
457
|
+
info(f"Package: {package_root}")
|
|
458
|
+
info(f"Type: {package_type}")
|
|
459
|
+
info(f"Profile: {opts.profile}")
|
|
460
|
+
print()
|
|
461
|
+
|
|
462
|
+
ensure_agent_settings(project_root, package_root, opts.profile, opts.force)
|
|
463
|
+
|
|
464
|
+
if not opts.skip_bridges:
|
|
465
|
+
ensure_vscode_bridge(project_root, package_type, opts.force)
|
|
466
|
+
ensure_augment_bridge(project_root, opts.force)
|
|
467
|
+
ensure_copilot_bridge(project_root, opts.force)
|
|
468
|
+
|
|
469
|
+
if not QUIET:
|
|
470
|
+
print()
|
|
471
|
+
success("Done.")
|
|
472
|
+
print()
|
|
473
|
+
print(" Try these 3 prompts with your agent:")
|
|
474
|
+
print(' 1. "Refactor this function" → agent analyzes first')
|
|
475
|
+
print(' 2. "Add caching to this" → agent asks instead of guessing')
|
|
476
|
+
print(' 3. "Implement this feature" → agent respects your codebase')
|
|
477
|
+
print()
|
|
478
|
+
print(" Next steps:")
|
|
479
|
+
print(" • Commit .agent-settings.yml and bridge files to your repo")
|
|
480
|
+
print(" • New team members just run composer install / npm install — done")
|
|
481
|
+
print(" • Full walkthrough: https://github.com/event4u-app/agent-config/blob/main/docs/getting-started.md")
|
|
482
|
+
print()
|
|
483
|
+
return 0
|
|
484
|
+
|
|
485
|
+
|
|
486
|
+
if __name__ == "__main__":
|
|
487
|
+
sys.exit(main(sys.argv[1:]))
|