@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.
Files changed (446) hide show
  1. package/.agent-src/README.md +64 -0
  2. package/.agent-src/commands/agent-handoff.md +64 -0
  3. package/.agent-src/commands/agent-status.md +83 -0
  4. package/.agent-src/commands/agents-audit.md +243 -0
  5. package/.agent-src/commands/agents-cleanup.md +169 -0
  6. package/.agent-src/commands/agents-prepare.md +137 -0
  7. package/.agent-src/commands/analyze-reference-repo.md +191 -0
  8. package/.agent-src/commands/bug-fix.md +181 -0
  9. package/.agent-src/commands/bug-investigate.md +175 -0
  10. package/.agent-src/commands/commit.md +121 -0
  11. package/.agent-src/commands/compress.md +177 -0
  12. package/.agent-src/commands/config-agent-settings.md +126 -0
  13. package/.agent-src/commands/context-create.md +167 -0
  14. package/.agent-src/commands/context-refactor.md +170 -0
  15. package/.agent-src/commands/copilot-agents-init.md +150 -0
  16. package/.agent-src/commands/copilot-agents-optimize.md +251 -0
  17. package/.agent-src/commands/create-pr-description.md +112 -0
  18. package/.agent-src/commands/create-pr.md +76 -0
  19. package/.agent-src/commands/do-and-judge.md +114 -0
  20. package/.agent-src/commands/do-in-steps.md +84 -0
  21. package/.agent-src/commands/e2e-heal.md +98 -0
  22. package/.agent-src/commands/e2e-plan.md +85 -0
  23. package/.agent-src/commands/estimate-ticket.md +80 -0
  24. package/.agent-src/commands/feature-dev.md +111 -0
  25. package/.agent-src/commands/feature-explore.md +180 -0
  26. package/.agent-src/commands/feature-plan.md +288 -0
  27. package/.agent-src/commands/feature-refactor.md +181 -0
  28. package/.agent-src/commands/feature-roadmap.md +184 -0
  29. package/.agent-src/commands/fix-ci.md +48 -0
  30. package/.agent-src/commands/fix-portability.md +97 -0
  31. package/.agent-src/commands/fix-pr-bot-comments.md +146 -0
  32. package/.agent-src/commands/fix-pr-comments.md +58 -0
  33. package/.agent-src/commands/fix-pr-developer-comments.md +152 -0
  34. package/.agent-src/commands/fix-references.md +94 -0
  35. package/.agent-src/commands/fix-seeder.md +146 -0
  36. package/.agent-src/commands/implement-ticket.md +133 -0
  37. package/.agent-src/commands/jira-ticket.md +71 -0
  38. package/.agent-src/commands/judge.md +86 -0
  39. package/.agent-src/commands/memory-add.md +130 -0
  40. package/.agent-src/commands/memory-full.md +97 -0
  41. package/.agent-src/commands/memory-promote.md +144 -0
  42. package/.agent-src/commands/mode.md +121 -0
  43. package/.agent-src/commands/module-create.md +132 -0
  44. package/.agent-src/commands/module-explore.md +157 -0
  45. package/.agent-src/commands/optimize-agents.md +139 -0
  46. package/.agent-src/commands/optimize-augmentignore.md +262 -0
  47. package/.agent-src/commands/optimize-rtk-filters.md +120 -0
  48. package/.agent-src/commands/optimize-skills.md +121 -0
  49. package/.agent-src/commands/override-create.md +97 -0
  50. package/.agent-src/commands/override-manage.md +96 -0
  51. package/.agent-src/commands/package-reset.md +154 -0
  52. package/.agent-src/commands/package-test.md +154 -0
  53. package/.agent-src/commands/prepare-for-review.md +91 -0
  54. package/.agent-src/commands/project-analyze.md +300 -0
  55. package/.agent-src/commands/project-health.md +95 -0
  56. package/.agent-src/commands/propose-memory.md +108 -0
  57. package/.agent-src/commands/quality-fix.md +106 -0
  58. package/.agent-src/commands/refine-ticket.md +81 -0
  59. package/.agent-src/commands/review-changes.md +130 -0
  60. package/.agent-src/commands/review-routing.md +111 -0
  61. package/.agent-src/commands/roadmap-create.md +110 -0
  62. package/.agent-src/commands/roadmap-execute.md +68 -0
  63. package/.agent-src/commands/rule-compliance-audit.md +139 -0
  64. package/.agent-src/commands/tests-create.md +73 -0
  65. package/.agent-src/commands/tests-execute.md +58 -0
  66. package/.agent-src/commands/threat-model.md +115 -0
  67. package/.agent-src/commands/update-form-request-messages.md +189 -0
  68. package/.agent-src/commands/upstream-contribute.md +171 -0
  69. package/.agent-src/contexts/augment-infrastructure.md +181 -0
  70. package/.agent-src/contexts/documentation-hierarchy.md +142 -0
  71. package/.agent-src/contexts/model-recommendations.md +142 -0
  72. package/.agent-src/contexts/override-system.md +187 -0
  73. package/.agent-src/contexts/skills-and-commands.md +154 -0
  74. package/.agent-src/contexts/subagent-configuration.md +62 -0
  75. package/.agent-src/guidelines/agent-infra/agent-interaction-and-decision-quality.md +110 -0
  76. package/.agent-src/guidelines/agent-infra/break-glass-usage.md +113 -0
  77. package/.agent-src/guidelines/agent-infra/developer-judgment.md +82 -0
  78. package/.agent-src/guidelines/agent-infra/engineering-memory-data-format.md +117 -0
  79. package/.agent-src/guidelines/agent-infra/layered-settings.md +158 -0
  80. package/.agent-src/guidelines/agent-infra/memory-access.md +121 -0
  81. package/.agent-src/guidelines/agent-infra/naming.md +69 -0
  82. package/.agent-src/guidelines/agent-infra/output-patterns.md +117 -0
  83. package/.agent-src/guidelines/agent-infra/review-routing-data-format.md +144 -0
  84. package/.agent-src/guidelines/agent-infra/role-contracts.md +211 -0
  85. package/.agent-src/guidelines/agent-infra/role-mode-router.md +89 -0
  86. package/.agent-src/guidelines/agent-infra/runtime-layer.md +89 -0
  87. package/.agent-src/guidelines/agent-infra/self-improvement-pipeline.md +135 -0
  88. package/.agent-src/guidelines/agent-infra/size-and-scope.md +189 -0
  89. package/.agent-src/guidelines/agent-infra/tool-integration.md +73 -0
  90. package/.agent-src/guidelines/docs/readme-size-and-splitting.md +153 -0
  91. package/.agent-src/guidelines/e2e/playwright.md +363 -0
  92. package/.agent-src/guidelines/php/api-design.md +115 -0
  93. package/.agent-src/guidelines/php/artisan-commands.md +81 -0
  94. package/.agent-src/guidelines/php/blade-ui.md +78 -0
  95. package/.agent-src/guidelines/php/controllers.md +90 -0
  96. package/.agent-src/guidelines/php/database.md +111 -0
  97. package/.agent-src/guidelines/php/eloquent.md +208 -0
  98. package/.agent-src/guidelines/php/flux.md +80 -0
  99. package/.agent-src/guidelines/php/general.md +191 -0
  100. package/.agent-src/guidelines/php/git.md +96 -0
  101. package/.agent-src/guidelines/php/jobs.md +111 -0
  102. package/.agent-src/guidelines/php/livewire.md +71 -0
  103. package/.agent-src/guidelines/php/logging.md +79 -0
  104. package/.agent-src/guidelines/php/naming.md +89 -0
  105. package/.agent-src/guidelines/php/patterns/dependency-injection.md +57 -0
  106. package/.agent-src/guidelines/php/patterns/dtos.md +199 -0
  107. package/.agent-src/guidelines/php/patterns/events.md +67 -0
  108. package/.agent-src/guidelines/php/patterns/factory.md +53 -0
  109. package/.agent-src/guidelines/php/patterns/pipelines.md +66 -0
  110. package/.agent-src/guidelines/php/patterns/policies.md +66 -0
  111. package/.agent-src/guidelines/php/patterns/repositories.md +122 -0
  112. package/.agent-src/guidelines/php/patterns/service-layer.md +64 -0
  113. package/.agent-src/guidelines/php/patterns/strategy.md +69 -0
  114. package/.agent-src/guidelines/php/patterns.md +28 -0
  115. package/.agent-src/guidelines/php/performance.md +92 -0
  116. package/.agent-src/guidelines/php/resources.md +100 -0
  117. package/.agent-src/guidelines/php/security.md +110 -0
  118. package/.agent-src/guidelines/php/sql.md +97 -0
  119. package/.agent-src/guidelines/php/validations.md +119 -0
  120. package/.agent-src/guidelines/php/websocket.md +100 -0
  121. package/.agent-src/personas/README.md +104 -0
  122. package/.agent-src/personas/ai-agent.md +77 -0
  123. package/.agent-src/personas/critical-challenger.md +73 -0
  124. package/.agent-src/personas/developer.md +73 -0
  125. package/.agent-src/personas/product-owner.md +78 -0
  126. package/.agent-src/personas/qa.md +67 -0
  127. package/.agent-src/personas/senior-engineer.md +77 -0
  128. package/.agent-src/personas/stakeholder.md +78 -0
  129. package/.agent-src/rules/agent-docs.md +61 -0
  130. package/.agent-src/rules/analysis-skill-routing.md +48 -0
  131. package/.agent-src/rules/architecture.md +62 -0
  132. package/.agent-src/rules/artifact-drafting-protocol.md +73 -0
  133. package/.agent-src/rules/ask-when-uncertain.md +52 -0
  134. package/.agent-src/rules/augment-portability.md +38 -0
  135. package/.agent-src/rules/augment-source-of-truth.md +128 -0
  136. package/.agent-src/rules/capture-learnings.md +89 -0
  137. package/.agent-src/rules/cli-output-handling.md +94 -0
  138. package/.agent-src/rules/commit-conventions.md +64 -0
  139. package/.agent-src/rules/context-hygiene.md +90 -0
  140. package/.agent-src/rules/docker-commands.md +55 -0
  141. package/.agent-src/rules/docs-sync.md +79 -0
  142. package/.agent-src/rules/downstream-changes.md +70 -0
  143. package/.agent-src/rules/e2e-testing.md +53 -0
  144. package/.agent-src/rules/guidelines.md +90 -0
  145. package/.agent-src/rules/improve-before-implement.md +94 -0
  146. package/.agent-src/rules/language-and-tone.md +104 -0
  147. package/.agent-src/rules/laravel-translations.md +48 -0
  148. package/.agent-src/rules/markdown-safe-codeblocks.md +18 -0
  149. package/.agent-src/rules/minimal-safe-diff.md +87 -0
  150. package/.agent-src/rules/missing-tool-handling.md +62 -0
  151. package/.agent-src/rules/model-recommendation.md +70 -0
  152. package/.agent-src/rules/package-ci-checks.md +80 -0
  153. package/.agent-src/rules/php-coding.md +63 -0
  154. package/.agent-src/rules/preservation-guard.md +29 -0
  155. package/.agent-src/rules/review-routing-awareness.md +125 -0
  156. package/.agent-src/rules/reviewer-awareness.md +92 -0
  157. package/.agent-src/rules/roadmap-progress-sync.md +56 -0
  158. package/.agent-src/rules/role-mode-adherence.md +54 -0
  159. package/.agent-src/rules/rule-type-governance.md +46 -0
  160. package/.agent-src/rules/runtime-safety.md +42 -0
  161. package/.agent-src/rules/scope-control.md +40 -0
  162. package/.agent-src/rules/security-sensitive-stop.md +77 -0
  163. package/.agent-src/rules/size-enforcement.md +29 -0
  164. package/.agent-src/rules/skill-improvement-trigger.md +58 -0
  165. package/.agent-src/rules/skill-quality.md +110 -0
  166. package/.agent-src/rules/slash-commands.md +30 -0
  167. package/.agent-src/rules/think-before-action.md +91 -0
  168. package/.agent-src/rules/token-efficiency.md +99 -0
  169. package/.agent-src/rules/tool-safety.md +36 -0
  170. package/.agent-src/rules/upstream-proposal.md +76 -0
  171. package/.agent-src/rules/user-interaction.md +79 -0
  172. package/.agent-src/rules/verify-before-complete.md +120 -0
  173. package/.agent-src/scripts/scan-seeder-violations.php +145 -0
  174. package/.agent-src/scripts/update_roadmap_progress.py +244 -0
  175. package/.agent-src/skills/adversarial-review/SKILL.md +149 -0
  176. package/.agent-src/skills/agent-docs-writing/SKILL.md +234 -0
  177. package/.agent-src/skills/analysis-autonomous-mode/SKILL.md +197 -0
  178. package/.agent-src/skills/analysis-skill-router/SKILL.md +134 -0
  179. package/.agent-src/skills/api-design/SKILL.md +104 -0
  180. package/.agent-src/skills/api-endpoint/SKILL.md +185 -0
  181. package/.agent-src/skills/api-testing/SKILL.md +206 -0
  182. package/.agent-src/skills/artisan-commands/SKILL.md +78 -0
  183. package/.agent-src/skills/authz-review/SKILL.md +171 -0
  184. package/.agent-src/skills/aws-infrastructure/SKILL.md +152 -0
  185. package/.agent-src/skills/blade-ui/SKILL.md +75 -0
  186. package/.agent-src/skills/blast-radius-analyzer/SKILL.md +185 -0
  187. package/.agent-src/skills/bug-analyzer/SKILL.md +256 -0
  188. package/.agent-src/skills/check-refs/SKILL.md +72 -0
  189. package/.agent-src/skills/code-refactoring/SKILL.md +200 -0
  190. package/.agent-src/skills/code-review/SKILL.md +214 -0
  191. package/.agent-src/skills/command-routing/SKILL.md +96 -0
  192. package/.agent-src/skills/command-writing/SKILL.md +143 -0
  193. package/.agent-src/skills/composer-packages/SKILL.md +172 -0
  194. package/.agent-src/skills/context-authoring/SKILL.md +157 -0
  195. package/.agent-src/skills/context-document/SKILL.md +153 -0
  196. package/.agent-src/skills/conventional-commits-writing/SKILL.md +70 -0
  197. package/.agent-src/skills/copilot-agents-optimization/SKILL.md +220 -0
  198. package/.agent-src/skills/copilot-config/SKILL.md +203 -0
  199. package/.agent-src/skills/dashboard-design/SKILL.md +116 -0
  200. package/.agent-src/skills/data-flow-mapper/SKILL.md +160 -0
  201. package/.agent-src/skills/database/SKILL.md +91 -0
  202. package/.agent-src/skills/dependency-upgrade/SKILL.md +204 -0
  203. package/.agent-src/skills/description-assist/SKILL.md +169 -0
  204. package/.agent-src/skills/design-review/SKILL.md +228 -0
  205. package/.agent-src/skills/devcontainer/SKILL.md +121 -0
  206. package/.agent-src/skills/developer-like-execution/SKILL.md +276 -0
  207. package/.agent-src/skills/docker/SKILL.md +245 -0
  208. package/.agent-src/skills/dto-creator/SKILL.md +117 -0
  209. package/.agent-src/skills/eloquent/SKILL.md +92 -0
  210. package/.agent-src/skills/eloquent/evals/last-run.json +99 -0
  211. package/.agent-src/skills/eloquent/evals/triggers.json +16 -0
  212. package/.agent-src/skills/estimate-ticket/SKILL.md +186 -0
  213. package/.agent-src/skills/estimate-ticket/evals/output-schema.yml +20 -0
  214. package/.agent-src/skills/estimate-ticket/evals/triggers.json +18 -0
  215. package/.agent-src/skills/fe-design/SKILL.md +223 -0
  216. package/.agent-src/skills/feature-planning/SKILL.md +226 -0
  217. package/.agent-src/skills/file-editor/SKILL.md +129 -0
  218. package/.agent-src/skills/finishing-a-development-branch/SKILL.md +200 -0
  219. package/.agent-src/skills/flux/SKILL.md +64 -0
  220. package/.agent-src/skills/git-workflow/SKILL.md +102 -0
  221. package/.agent-src/skills/github-ci/SKILL.md +122 -0
  222. package/.agent-src/skills/grafana/SKILL.md +168 -0
  223. package/.agent-src/skills/guideline-writing/SKILL.md +147 -0
  224. package/.agent-src/skills/jira-integration/SKILL.md +182 -0
  225. package/.agent-src/skills/jobs-events/SKILL.md +87 -0
  226. package/.agent-src/skills/judge-bug-hunter/SKILL.md +157 -0
  227. package/.agent-src/skills/judge-code-quality/SKILL.md +158 -0
  228. package/.agent-src/skills/judge-security-auditor/SKILL.md +167 -0
  229. package/.agent-src/skills/judge-test-coverage/SKILL.md +154 -0
  230. package/.agent-src/skills/laravel/SKILL.md +195 -0
  231. package/.agent-src/skills/laravel-horizon/SKILL.md +169 -0
  232. package/.agent-src/skills/laravel-mail/SKILL.md +193 -0
  233. package/.agent-src/skills/laravel-middleware/SKILL.md +185 -0
  234. package/.agent-src/skills/laravel-notifications/SKILL.md +168 -0
  235. package/.agent-src/skills/laravel-pennant/SKILL.md +188 -0
  236. package/.agent-src/skills/laravel-pulse/SKILL.md +160 -0
  237. package/.agent-src/skills/laravel-reverb/SKILL.md +205 -0
  238. package/.agent-src/skills/laravel-scheduling/SKILL.md +167 -0
  239. package/.agent-src/skills/laravel-validation/SKILL.md +71 -0
  240. package/.agent-src/skills/learning-to-rule-or-skill/SKILL.md +249 -0
  241. package/.agent-src/skills/lint-skills/SKILL.md +72 -0
  242. package/.agent-src/skills/livewire/SKILL.md +79 -0
  243. package/.agent-src/skills/logging-monitoring/SKILL.md +100 -0
  244. package/.agent-src/skills/mcp/SKILL.md +193 -0
  245. package/.agent-src/skills/merge-conflicts/SKILL.md +158 -0
  246. package/.agent-src/skills/migration-creator/SKILL.md +160 -0
  247. package/.agent-src/skills/module-management/SKILL.md +154 -0
  248. package/.agent-src/skills/multi-tenancy/SKILL.md +129 -0
  249. package/.agent-src/skills/openapi/SKILL.md +154 -0
  250. package/.agent-src/skills/override-management/SKILL.md +186 -0
  251. package/.agent-src/skills/performance/SKILL.md +69 -0
  252. package/.agent-src/skills/performance-analysis/SKILL.md +118 -0
  253. package/.agent-src/skills/pest-testing/SKILL.md +321 -0
  254. package/.agent-src/skills/php-coder/SKILL.md +78 -0
  255. package/.agent-src/skills/php-coder/evals/triggers.json +16 -0
  256. package/.agent-src/skills/php-debugging/SKILL.md +184 -0
  257. package/.agent-src/skills/php-service/SKILL.md +96 -0
  258. package/.agent-src/skills/playwright-testing/SKILL.md +244 -0
  259. package/.agent-src/skills/project-analysis-core/SKILL.md +138 -0
  260. package/.agent-src/skills/project-analysis-hypothesis-driven/SKILL.md +130 -0
  261. package/.agent-src/skills/project-analysis-laravel/SKILL.md +119 -0
  262. package/.agent-src/skills/project-analysis-nextjs/SKILL.md +123 -0
  263. package/.agent-src/skills/project-analysis-node-express/SKILL.md +111 -0
  264. package/.agent-src/skills/project-analysis-react/SKILL.md +119 -0
  265. package/.agent-src/skills/project-analysis-symfony/SKILL.md +111 -0
  266. package/.agent-src/skills/project-analysis-zend-laminas/SKILL.md +108 -0
  267. package/.agent-src/skills/project-analyzer/SKILL.md +341 -0
  268. package/.agent-src/skills/project-docs/SKILL.md +137 -0
  269. package/.agent-src/skills/quality-tools/SKILL.md +411 -0
  270. package/.agent-src/skills/readme-reviewer/SKILL.md +187 -0
  271. package/.agent-src/skills/readme-writing/SKILL.md +142 -0
  272. package/.agent-src/skills/readme-writing-package/SKILL.md +185 -0
  273. package/.agent-src/skills/receiving-code-review/SKILL.md +190 -0
  274. package/.agent-src/skills/refine-ticket/SKILL.md +310 -0
  275. package/.agent-src/skills/refine-ticket/detection-map.yml +124 -0
  276. package/.agent-src/skills/refine-ticket/evals/output-schema.yml +16 -0
  277. package/.agent-src/skills/refine-ticket/evals/triggers.json +16 -0
  278. package/.agent-src/skills/requesting-code-review/SKILL.md +199 -0
  279. package/.agent-src/skills/review-routing/SKILL.md +195 -0
  280. package/.agent-src/skills/roadmap-management/SKILL.md +303 -0
  281. package/.agent-src/skills/rtk-output-filtering/SKILL.md +184 -0
  282. package/.agent-src/skills/rule-writing/SKILL.md +148 -0
  283. package/.agent-src/skills/security/SKILL.md +79 -0
  284. package/.agent-src/skills/security-audit/SKILL.md +123 -0
  285. package/.agent-src/skills/sentry-integration/SKILL.md +170 -0
  286. package/.agent-src/skills/sequential-thinking/SKILL.md +158 -0
  287. package/.agent-src/skills/skill-improvement-pipeline/SKILL.md +155 -0
  288. package/.agent-src/skills/skill-management/SKILL.md +121 -0
  289. package/.agent-src/skills/skill-reviewer/SKILL.md +218 -0
  290. package/.agent-src/skills/skill-writing/SKILL.md +291 -0
  291. package/.agent-src/skills/skill-writing/evals/triggers.json +16 -0
  292. package/.agent-src/skills/sql-writing/SKILL.md +74 -0
  293. package/.agent-src/skills/subagent-orchestration/SKILL.md +190 -0
  294. package/.agent-src/skills/systematic-debugging/SKILL.md +244 -0
  295. package/.agent-src/skills/technical-specification/SKILL.md +185 -0
  296. package/.agent-src/skills/terraform/SKILL.md +137 -0
  297. package/.agent-src/skills/terragrunt/SKILL.md +217 -0
  298. package/.agent-src/skills/test-driven-development/SKILL.md +252 -0
  299. package/.agent-src/skills/test-performance/SKILL.md +172 -0
  300. package/.agent-src/skills/threat-modeling/SKILL.md +189 -0
  301. package/.agent-src/skills/traefik/SKILL.md +319 -0
  302. package/.agent-src/skills/universal-project-analysis/SKILL.md +179 -0
  303. package/.agent-src/skills/upstream-contribute/SKILL.md +255 -0
  304. package/.agent-src/skills/using-git-worktrees/SKILL.md +148 -0
  305. package/.agent-src/skills/validate-feature-fit/SKILL.md +113 -0
  306. package/.agent-src/skills/verify-before-complete/SKILL.md +188 -0
  307. package/.agent-src/skills/websocket/SKILL.md +75 -0
  308. package/.agent-src/templates/AGENTS.md +146 -0
  309. package/.agent-src/templates/agent-settings.md +256 -0
  310. package/.agent-src/templates/agents/.gitattributes.fragment +16 -0
  311. package/.agent-src/templates/agents/agent-project-settings.example.yml +138 -0
  312. package/.agent-src/templates/agents/memory/architecture-decisions.example.yml +95 -0
  313. package/.agent-src/templates/agents/memory/domain-invariants.example.yml +80 -0
  314. package/.agent-src/templates/agents/memory/historical-patterns.example.yml +82 -0
  315. package/.agent-src/templates/agents/memory/incident-learnings.example.yml +113 -0
  316. package/.agent-src/templates/agents/memory/ownership.example.yml +75 -0
  317. package/.agent-src/templates/agents/memory/product-rules.example.yml +87 -0
  318. package/.agent-src/templates/agents/proposal.example.md +143 -0
  319. package/.agent-src/templates/command.md +84 -0
  320. package/.agent-src/templates/contexts/auth-model.md +59 -0
  321. package/.agent-src/templates/contexts/data-sensitivity.md +60 -0
  322. package/.agent-src/templates/contexts/deployment-order.md +72 -0
  323. package/.agent-src/templates/contexts/observability.md +64 -0
  324. package/.agent-src/templates/contexts/tenant-boundaries.md +68 -0
  325. package/.agent-src/templates/contexts.md +116 -0
  326. package/.agent-src/templates/copilot-instructions.md +115 -0
  327. package/.agent-src/templates/features.md +125 -0
  328. package/.agent-src/templates/github-workflows/memory-hygiene.yml +133 -0
  329. package/.agent-src/templates/github-workflows/pr-risk-review.yml +123 -0
  330. package/.agent-src/templates/github-workflows/proposal-drift.yml +118 -0
  331. package/.agent-src/templates/overrides/command.md +24 -0
  332. package/.agent-src/templates/overrides/guideline.md +21 -0
  333. package/.agent-src/templates/overrides/rule.md +19 -0
  334. package/.agent-src/templates/overrides/skill.md +24 -0
  335. package/.agent-src/templates/overrides/template.md +21 -0
  336. package/.agent-src/templates/persona.md +99 -0
  337. package/.agent-src/templates/roadmaps.md +109 -0
  338. package/.agent-src/templates/scripts/README.md +195 -0
  339. package/.agent-src/templates/scripts/check_memory.py +283 -0
  340. package/.agent-src/templates/scripts/check_memory_proposal.py +180 -0
  341. package/.agent-src/templates/scripts/historical-bug-patterns.example.yml +84 -0
  342. package/.agent-src/templates/scripts/implement_ticket/__init__.py +57 -0
  343. package/.agent-src/templates/scripts/implement_ticket/__main__.py +9 -0
  344. package/.agent-src/templates/scripts/implement_ticket/cli.py +171 -0
  345. package/.agent-src/templates/scripts/implement_ticket/delivery_state.py +130 -0
  346. package/.agent-src/templates/scripts/implement_ticket/dispatcher.py +134 -0
  347. package/.agent-src/templates/scripts/implement_ticket/persona_policy.py +85 -0
  348. package/.agent-src/templates/scripts/implement_ticket/steps/__init__.py +49 -0
  349. package/.agent-src/templates/scripts/implement_ticket/steps/analyze.py +98 -0
  350. package/.agent-src/templates/scripts/implement_ticket/steps/implement.py +145 -0
  351. package/.agent-src/templates/scripts/implement_ticket/steps/memory.py +136 -0
  352. package/.agent-src/templates/scripts/implement_ticket/steps/plan.py +175 -0
  353. package/.agent-src/templates/scripts/implement_ticket/steps/refine.py +140 -0
  354. package/.agent-src/templates/scripts/implement_ticket/steps/report.py +195 -0
  355. package/.agent-src/templates/scripts/implement_ticket/steps/test.py +180 -0
  356. package/.agent-src/templates/scripts/implement_ticket/steps/verify.py +170 -0
  357. package/.agent-src/templates/scripts/memory_hash.py +75 -0
  358. package/.agent-src/templates/scripts/memory_lookup.py +216 -0
  359. package/.agent-src/templates/scripts/memory_report.py +184 -0
  360. package/.agent-src/templates/scripts/memory_signal.py +167 -0
  361. package/.agent-src/templates/scripts/memory_status.py +156 -0
  362. package/.agent-src/templates/scripts/ownership-map.example.yml +87 -0
  363. package/.agent-src/templates/scripts/pr-risk-config.example.yml +76 -0
  364. package/.agent-src/templates/scripts/pr_review_routing.py +340 -0
  365. package/.agent-src/templates/scripts/pr_risk_review.py +211 -0
  366. package/.agent-src/templates/skill.md +136 -0
  367. package/.augment-plugin/marketplace.json +32 -0
  368. package/.augment-plugin/plugin.json +21 -0
  369. package/.claude-plugin/marketplace.json +119 -0
  370. package/AGENTS.md +121 -0
  371. package/CHANGELOG.md +279 -0
  372. package/CONTRIBUTING.md +176 -0
  373. package/LICENSE +21 -0
  374. package/README.md +357 -0
  375. package/bin/install.php +38 -0
  376. package/composer.json +29 -0
  377. package/config/agent-settings.template.yml +96 -0
  378. package/config/profiles/balanced.ini +10 -0
  379. package/config/profiles/full.ini +10 -0
  380. package/config/profiles/minimal.ini +10 -0
  381. package/docs/architecture.md +144 -0
  382. package/docs/customization.md +88 -0
  383. package/docs/development.md +171 -0
  384. package/docs/getting-started.md +130 -0
  385. package/docs/github-topics.md +84 -0
  386. package/docs/installation.md +376 -0
  387. package/docs/mcp.md +133 -0
  388. package/docs/quality.md +98 -0
  389. package/docs/skills-catalog.md +136 -0
  390. package/docs/troubleshooting.md +167 -0
  391. package/llms.txt +130 -0
  392. package/package.json +31 -0
  393. package/scripts/audit_skill_descriptions.py +168 -0
  394. package/scripts/check_compression.py +221 -0
  395. package/scripts/check_memory.py +341 -0
  396. package/scripts/check_memory_proposal.py +180 -0
  397. package/scripts/check_portability.py +320 -0
  398. package/scripts/check_proposal.py +269 -0
  399. package/scripts/check_references.py +400 -0
  400. package/scripts/ci_summary.py +131 -0
  401. package/scripts/compress.py +671 -0
  402. package/scripts/compress.sh +18 -0
  403. package/scripts/first-run.sh +109 -0
  404. package/scripts/generate_catalog.py +116 -0
  405. package/scripts/install +151 -0
  406. package/scripts/install-hooks.sh +29 -0
  407. package/scripts/install.py +487 -0
  408. package/scripts/install.sh +637 -0
  409. package/scripts/install_anthropic_key.sh +101 -0
  410. package/scripts/inventory_frontmatter.py +164 -0
  411. package/scripts/lint_marketplace.py +142 -0
  412. package/scripts/lint_regression.py +232 -0
  413. package/scripts/mcp_render.py +159 -0
  414. package/scripts/measure_patterns.py +376 -0
  415. package/scripts/memory_hash.py +75 -0
  416. package/scripts/memory_lookup.py +441 -0
  417. package/scripts/memory_report.py +336 -0
  418. package/scripts/memory_signal.py +210 -0
  419. package/scripts/memory_status.py +195 -0
  420. package/scripts/postinstall.sh +60 -0
  421. package/scripts/readme_linter.py +580 -0
  422. package/scripts/refine_ticket_detect.py +623 -0
  423. package/scripts/requirements-evals.txt +7 -0
  424. package/scripts/runtime_dispatcher.py +265 -0
  425. package/scripts/runtime_handler.py +148 -0
  426. package/scripts/runtime_registry.py +166 -0
  427. package/scripts/schemas/command.schema.json +32 -0
  428. package/scripts/schemas/persona.schema.json +42 -0
  429. package/scripts/schemas/rule.schema.json +28 -0
  430. package/scripts/schemas/skill.schema.json +73 -0
  431. package/scripts/setup.sh +230 -0
  432. package/scripts/setup_eval_venv.sh +58 -0
  433. package/scripts/skill_linter.py +2175 -0
  434. package/scripts/skill_trigger_eval.py +651 -0
  435. package/scripts/tool_registry.py +146 -0
  436. package/scripts/tools/__init__.py +1 -0
  437. package/scripts/tools/adapter_errors.py +63 -0
  438. package/scripts/tools/base_adapter.py +91 -0
  439. package/scripts/tools/github_adapter.py +128 -0
  440. package/scripts/tools/jira_adapter.py +115 -0
  441. package/scripts/update_counts.py +147 -0
  442. package/scripts/validate_frontmatter.py +424 -0
  443. package/templates/consumer-settings/README.md +46 -0
  444. package/templates/consumer-settings/augment-settings.json +12 -0
  445. package/templates/consumer-settings/claude-settings.json +9 -0
  446. 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}"