@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,441 @@
1
+ #!/usr/bin/env python3
2
+ """File-based retrieval for the `absent` path.
3
+
4
+ Implements the shared `retrieve(types, keys, limit)` abstraction used
5
+ by skills. Reads YAML under `agents/memory/<type>/` (curated, hand-
6
+ reviewed) and JSONL under `agents/memory/intake/*.jsonl` (agent-written,
7
+ append-only, supersede-chain aware).
8
+
9
+ The returned shape is identical to the `present`-path adapter over the
10
+ `@event4u/agent-memory` API, so skills stay backend-agnostic.
11
+
12
+ Usage:
13
+ python3 scripts/memory_lookup.py --types domain-invariants,ownership \\
14
+ --key "app/Http/Controllers/Foo" --limit 5
15
+ python3 scripts/memory_lookup.py --types incident-learnings --format json
16
+
17
+ from scripts.memory_lookup import retrieve
18
+ hits = retrieve(types=["ownership"], keys=["app/Http"], limit=3)
19
+ """
20
+
21
+ from __future__ import annotations
22
+
23
+ import argparse
24
+ import fnmatch
25
+ import json
26
+ import sys
27
+ from dataclasses import dataclass, asdict, field
28
+ from pathlib import Path
29
+ from typing import Any, Callable, Iterable, Optional, Union
30
+
31
+ MEMORY_ROOT = Path("agents/memory")
32
+ INTAKE_ROOT = MEMORY_ROOT / "intake"
33
+
34
+ CURATED_TYPES = {
35
+ "ownership",
36
+ "historical-patterns",
37
+ "domain-invariants",
38
+ "architecture-decisions",
39
+ "incident-learnings",
40
+ "product-rules",
41
+ }
42
+
43
+
44
+ @dataclass
45
+ class Hit:
46
+ id: str
47
+ type: str
48
+ source: str # "curated" | "intake" | "operational"
49
+ path: str # file (or logical locator) that produced the hit
50
+ score: float # naive, content-match based [0..1]
51
+ entry: dict = field(default_factory=dict)
52
+
53
+ def as_dict(self) -> dict:
54
+ return asdict(self)
55
+
56
+
57
+ @dataclass
58
+ class Shadow:
59
+ """An operational entry suppressed by the conflict rule."""
60
+ id: str
61
+ type: str
62
+ reason: str # "same-id" | "repo-deprecated"
63
+ operational_path: str # where the suppressed entry came from
64
+ repo_path: str # repo entry that shadowed it
65
+
66
+ def as_dict(self) -> dict:
67
+ return asdict(self)
68
+
69
+
70
+ @dataclass
71
+ class RetrievalResult:
72
+ """Full retrieval payload with conflict-rule observability."""
73
+ hits: list
74
+ shadows: list = field(default_factory=list)
75
+
76
+ def as_dict(self) -> dict:
77
+ return {
78
+ "hits": [h.as_dict() for h in self.hits],
79
+ "shadows": [s.as_dict() for s in self.shadows],
80
+ }
81
+
82
+
83
+ # An operational provider returns repo-shaped Hit objects with
84
+ # source="operational". Backend adapters (e.g. @event4u/agent-memory)
85
+ # are expected to translate their native payload into this shape.
86
+ OperationalProvider = Callable[[list[str], list[str]], Iterable[Hit]]
87
+
88
+
89
+ def _load_yaml(path: Path):
90
+ try:
91
+ import yaml
92
+ except ImportError:
93
+ print("error: PyYAML not installed. `pip install pyyaml`.",
94
+ file=sys.stderr)
95
+ sys.exit(2)
96
+ with path.open(encoding="utf-8") as fh:
97
+ return yaml.safe_load(fh) or {}
98
+
99
+
100
+ def _iter_curated_entries(mtype: str) -> Iterable[tuple[Path, dict]]:
101
+ """Yield (file, entry) pairs for curated files of `mtype`.
102
+
103
+ Supports both the content-addressed layout (`agents/memory/<type>/
104
+ <hash>.yml` — one entry per file) and the single-file layout
105
+ (`agents/memory/<type>.yml` or `<type>/entries.yml` with an
106
+ ``entries:`` list), so consumers can adopt either.
107
+ """
108
+ type_dir = MEMORY_ROOT / mtype
109
+ single_file = MEMORY_ROOT / f"{mtype}.yml"
110
+ if single_file.is_file():
111
+ data = _load_yaml(single_file)
112
+ for e in data.get("entries") or []:
113
+ if isinstance(e, dict):
114
+ yield single_file, e
115
+ if type_dir.is_dir():
116
+ for yml in sorted(type_dir.rglob("*.yml")):
117
+ data = _load_yaml(yml) or {}
118
+ entries = data.get("entries")
119
+ if isinstance(entries, list):
120
+ for e in entries:
121
+ if isinstance(e, dict):
122
+ yield yml, e
123
+ elif isinstance(data, dict) and data.get("id"):
124
+ # Flat, one-entry-per-file layout (content-addressed).
125
+ yield yml, data
126
+
127
+
128
+ def _iter_intake_entries(mtype: str) -> Iterable[tuple[Path, dict]]:
129
+ """Yield (file, entry) from intake JSONL, applying supersede chains."""
130
+ if not INTAKE_ROOT.is_dir():
131
+ return
132
+ # Resolve supersede chains globally per file: later lines win.
133
+ for jsonl in sorted(INTAKE_ROOT.glob("*.jsonl")):
134
+ by_id: dict[str, dict] = {}
135
+ superseded: set[str] = set()
136
+ with jsonl.open(encoding="utf-8") as fh:
137
+ for line in fh:
138
+ line = line.strip()
139
+ if not line:
140
+ continue
141
+ try:
142
+ obj = json.loads(line)
143
+ except ValueError:
144
+ continue
145
+ if obj.get("type") == "supersede":
146
+ target = obj.get("supersedes")
147
+ if isinstance(target, str):
148
+ superseded.add(target)
149
+ continue
150
+ eid = obj.get("id")
151
+ if isinstance(eid, str):
152
+ by_id[eid] = obj
153
+ for eid, obj in by_id.items():
154
+ if eid in superseded:
155
+ continue
156
+ if mtype and obj.get("entry_type") and obj["entry_type"] != mtype:
157
+ continue
158
+ yield jsonl, obj
159
+
160
+
161
+ def _score(entry: dict, keys: list[str]) -> float:
162
+ """Naive relevance score: max over keys of (glob-match | substring).
163
+
164
+ Good enough for the `absent` path where retrieval is best-effort.
165
+ The `present` path returns a real score from agent-memory.
166
+ """
167
+ if not keys:
168
+ return 0.1 # any hit beats no hit when there is no key
169
+ hay_parts: list[str] = []
170
+ for field_name in ("path", "key", "symptom", "feature", "rule", "body"):
171
+ v = entry.get(field_name)
172
+ if isinstance(v, str):
173
+ hay_parts.append(v)
174
+ elif isinstance(v, list):
175
+ hay_parts.extend(str(x) for x in v)
176
+ hay = " | ".join(hay_parts).lower()
177
+ best = 0.0
178
+ for k in keys:
179
+ kl = k.lower()
180
+ if fnmatch.fnmatch(hay, f"*{kl}*"):
181
+ best = max(best, 0.8)
182
+ elif kl in hay:
183
+ best = max(best, 0.6)
184
+ return best
185
+
186
+
187
+ def _apply_conflict_rule(
188
+ repo_hits: list[Hit],
189
+ operational_hits: list[Hit],
190
+ ) -> tuple[list[Hit], list[Shadow]]:
191
+ """Enforce REPO WINS / OPERATIONAL AUGMENTS / NEVER CONTRADICTS SILENTLY.
192
+
193
+ Reference: `agents/roadmaps/road-to-memory-self-consumption.md` §
194
+ "Conflict rule: repo vs. operational". The four cases mapped below
195
+ are covered by `tests/test_conflict_rule.py`.
196
+ """
197
+ # Repo entries index — curated AND intake both count as "repo" for
198
+ # the conflict rule. The operational store is the only non-repo side.
199
+ repo_by_id: dict[str, Hit] = {h.id: h for h in repo_hits if h.id}
200
+
201
+ merged: list[Hit] = list(repo_hits)
202
+ shadows: list[Shadow] = []
203
+
204
+ for op in operational_hits:
205
+ if op.id and op.id in repo_by_id:
206
+ # Case 1+2: same id → repo wins (including when repo is
207
+ # status:deprecated — operational cannot revive a retired
208
+ # entry). Suppress the operational entry and record shadow.
209
+ repo = repo_by_id[op.id]
210
+ reason = (
211
+ "repo-deprecated"
212
+ if repo.entry.get("status") == "deprecated"
213
+ else "same-id"
214
+ )
215
+ shadows.append(Shadow(
216
+ id=op.id,
217
+ type=op.type,
218
+ reason=reason,
219
+ operational_path=op.path,
220
+ repo_path=repo.path,
221
+ ))
222
+ continue
223
+ # Case 3 (different ids on same logical key) and Case 4 (repo
224
+ # has no entry) — both simply include the operational hit.
225
+ # Repo entries naturally rank higher because their score is not
226
+ # discounted (see _score / operational scoring in retrieve()).
227
+ merged.append(op)
228
+
229
+ return merged, shadows
230
+
231
+
232
+ def retrieve(
233
+ types: list[str],
234
+ keys: list[str],
235
+ limit: int = 5,
236
+ operational_provider: Optional[OperationalProvider] = None,
237
+ with_shadows: bool = False,
238
+ ) -> Union[list[Hit], RetrievalResult]:
239
+ """Return up to `limit` hits across the requested types, highest score first.
240
+
241
+ Repo entries (curated + intake) are preferred on ties — they are
242
+ hand-reviewed or session-captured against the repo itself. When an
243
+ `operational_provider` is supplied (the `present` path of the
244
+ backend-detection contract), its results are merged under the
245
+ REPO WINS conflict rule; suppressed operational entries surface as
246
+ `shadows` when `with_shadows=True`.
247
+
248
+ The return type stays `list[Hit]` by default for backward
249
+ compatibility with existing skill call sites.
250
+ """
251
+ repo_hits: list[Hit] = []
252
+ for mtype in types:
253
+ if mtype not in CURATED_TYPES:
254
+ continue
255
+ for path, entry in _iter_curated_entries(mtype):
256
+ repo_hits.append(Hit(
257
+ id=str(entry.get("id", "")),
258
+ type=mtype,
259
+ source="curated",
260
+ path=str(path),
261
+ score=_score(entry, keys),
262
+ entry=entry,
263
+ ))
264
+ for path, entry in _iter_intake_entries(mtype):
265
+ repo_hits.append(Hit(
266
+ id=str(entry.get("id", "")),
267
+ type=mtype,
268
+ source="intake",
269
+ path=str(path),
270
+ score=_score(entry, keys) * 0.9, # slight discount vs curated
271
+ entry=entry,
272
+ ))
273
+
274
+ operational_hits: list[Hit] = []
275
+ if operational_provider is not None:
276
+ try:
277
+ for oh in operational_provider(list(types), list(keys)) or []:
278
+ # Discount operational vs curated/intake so repo ranks
279
+ # higher on equal relevance. Providers may already return
280
+ # trust-adjusted scores; we only apply a floor discount.
281
+ oh.score = min(oh.score, 0.85)
282
+ operational_hits.append(oh)
283
+ except Exception as exc: # noqa: BLE001 — providers are external
284
+ print(f"warning: operational_provider raised "
285
+ f"{exc.__class__.__name__}: {exc}", file=sys.stderr)
286
+
287
+ merged, shadows = _apply_conflict_rule(repo_hits, operational_hits)
288
+ merged.sort(key=lambda h: (h.score, h.source == "curated"), reverse=True)
289
+ positives = [h for h in merged if h.score > 0]
290
+ final_hits = (positives or merged)[:limit]
291
+
292
+ if with_shadows:
293
+ return RetrievalResult(hits=final_hits, shadows=shadows)
294
+ return final_hits
295
+
296
+
297
+ CONTRACT_VERSION = 1
298
+
299
+ # Memory types this file-backed backend can answer. Types outside this
300
+ # set map to `unknown_type` per the retrieval contract.
301
+ _KNOWN_TYPES = CURATED_TYPES
302
+
303
+
304
+ def retrieve_v1(
305
+ types: list[str],
306
+ keys: list[str],
307
+ limit: int = 20,
308
+ operational_provider: Optional[OperationalProvider] = None,
309
+ ) -> dict:
310
+ """Return a v1 retrieval-contract envelope.
311
+
312
+ Wraps :func:`retrieve` and projects the internal ``Hit`` shape into
313
+ the shape defined by
314
+ ``schemas/retrieval-v1.schema.json``. Unknown types are reported as
315
+ ``status: unknown_type`` for that slice only, rather than failing
316
+ the whole call.
317
+ """
318
+ known = [t for t in types if t in _KNOWN_TYPES]
319
+ unknown = [t for t in types if t not in _KNOWN_TYPES]
320
+
321
+ result = retrieve(known, keys, limit=limit,
322
+ operational_provider=operational_provider,
323
+ with_shadows=True)
324
+ assert isinstance(result, RetrievalResult)
325
+ hits, shadows = result.hits, result.shadows
326
+ shadow_by_id = {s.id: s for s in shadows if s.id}
327
+
328
+ slice_counts: dict[str, int] = {t: 0 for t in known}
329
+ entries: list[dict] = []
330
+ for h in hits:
331
+ source = "operational" if h.source == "operational" else "repo"
332
+ envelope_entry: dict = {
333
+ "id": h.id,
334
+ "type": h.type,
335
+ "source": source,
336
+ "confidence": round(float(h.score), 4),
337
+ "body": dict(h.entry) if isinstance(h.entry, dict) else {},
338
+ "shadowed_by": None,
339
+ }
340
+ if h.type in slice_counts:
341
+ slice_counts[h.type] += 1
342
+ entries.append(envelope_entry)
343
+
344
+ # Surface shadowed operational entries as additional entries carrying
345
+ # `shadowed_by`. The conformance harness checks that only
346
+ # source="operational" entries ever set this field.
347
+ for sid, s in shadow_by_id.items():
348
+ entries.append({
349
+ "id": sid,
350
+ "type": s.type,
351
+ "source": "operational",
352
+ "confidence": 0.0,
353
+ "body": {},
354
+ "shadowed_by": f"repo:{sid}",
355
+ })
356
+ if s.type in slice_counts:
357
+ slice_counts[s.type] += 1
358
+
359
+ slices: dict[str, dict] = {
360
+ t: {"status": "ok", "count": slice_counts.get(t, 0)}
361
+ for t in known
362
+ }
363
+ errors: list[dict] = []
364
+ for t in unknown:
365
+ slices[t] = {"status": "unknown_type", "count": 0}
366
+ errors.append({
367
+ "type": t,
368
+ "code": "unknown_type",
369
+ "message": f"file-backed backend does not know type {t!r}",
370
+ })
371
+
372
+ oks = [s for s in slices.values() if s["status"] == "ok"]
373
+ fails = [s for s in slices.values() if s["status"] != "ok"]
374
+ envelope_status = (
375
+ "ok" if not fails
376
+ else "error" if not oks
377
+ else "partial"
378
+ )
379
+
380
+ envelope: dict = {
381
+ "contract_version": CONTRACT_VERSION,
382
+ "status": envelope_status,
383
+ "entries": entries,
384
+ "slices": slices,
385
+ }
386
+ if errors:
387
+ envelope["errors"] = errors
388
+ return envelope
389
+
390
+
391
+ def main() -> int:
392
+ ap = argparse.ArgumentParser(description=__doc__)
393
+ ap.add_argument("--types", default="",
394
+ help="Comma-separated memory types (e.g., ownership,domain-invariants)")
395
+ ap.add_argument("--key", action="append", default=[],
396
+ help="Retrieval key (repeatable)")
397
+ ap.add_argument("--limit", type=int, default=5)
398
+ ap.add_argument("--format", choices=["text", "json"], default="text")
399
+ ap.add_argument("--envelope", choices=["legacy", "v1"], default="legacy",
400
+ help="Output shape: `legacy` (Hit list) or `v1` "
401
+ "(retrieval contract v1 envelope). `v1` implies JSON output.")
402
+ ap.add_argument("--with-shadows", action="store_true",
403
+ help="Include shadowed-operational entries in the output "
404
+ "(no-op until an operational backend is wired)")
405
+ args = ap.parse_args()
406
+ types = [t.strip() for t in args.types.split(",") if t.strip()]
407
+ if not types:
408
+ print("error: --types is required", file=sys.stderr)
409
+ return 2
410
+ if args.envelope == "v1":
411
+ envelope = retrieve_v1(types, args.key, args.limit)
412
+ print(json.dumps(envelope, indent=2, default=str))
413
+ return 0
414
+ result = retrieve(types, args.key, args.limit, with_shadows=args.with_shadows)
415
+ if args.with_shadows:
416
+ assert isinstance(result, RetrievalResult)
417
+ hits, shadows = result.hits, result.shadows
418
+ else:
419
+ hits, shadows = result, [] # type: ignore[assignment]
420
+ if args.format == "json":
421
+ payload = {"hits": [h.as_dict() for h in hits],
422
+ "shadows": [s.as_dict() for s in shadows]}
423
+ print(json.dumps(payload, indent=2, default=str))
424
+ else:
425
+ if not hits:
426
+ print(" (no hits)")
427
+ for h in hits:
428
+ print(f" [{h.source}] {h.type} score={h.score:.2f} "
429
+ f"id={h.id or '-'} path={h.path}")
430
+ if shadows:
431
+ print(f"\n shadows: {len(shadows)} operational entr"
432
+ f"{'y' if len(shadows) == 1 else 'ies'} suppressed by "
433
+ f"the conflict rule")
434
+ for s in shadows:
435
+ print(f" [{s.reason}] {s.type} id={s.id} "
436
+ f"op={s.operational_path} repo={s.repo_path}")
437
+ return 0
438
+
439
+
440
+ if __name__ == "__main__":
441
+ sys.exit(main())