@heyai-rules/pilo-masterkit 1.2.2 → 3.1.0

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 (594) hide show
  1. package/.agent/agents/architect.md +211 -211
  2. package/.agent/agents/build-error-resolver.md +114 -114
  3. package/.agent/agents/chief-of-staff.md +151 -151
  4. package/.agent/agents/code-reviewer.md +237 -237
  5. package/.agent/agents/cpp-build-resolver.md +90 -90
  6. package/.agent/agents/cpp-reviewer.md +72 -72
  7. package/.agent/agents/csharp-reviewer.md +101 -0
  8. package/.agent/agents/dart-build-resolver.md +201 -0
  9. package/.agent/agents/database-reviewer.md +91 -91
  10. package/.agent/agents/doc-updater.md +107 -107
  11. package/.agent/agents/docs-lookup.md +68 -68
  12. package/.agent/agents/e2e-runner.md +107 -107
  13. package/.agent/agents/flutter-reviewer.md +243 -243
  14. package/.agent/agents/gan-evaluator.md +209 -0
  15. package/.agent/agents/gan-generator.md +131 -0
  16. package/.agent/agents/gan-planner.md +99 -0
  17. package/.agent/agents/go-build-resolver.md +94 -94
  18. package/.agent/agents/go-reviewer.md +76 -76
  19. package/.agent/agents/harness-optimizer.md +35 -35
  20. package/.agent/agents/healthcare-reviewer.md +83 -0
  21. package/.agent/agents/java-build-resolver.md +153 -153
  22. package/.agent/agents/java-reviewer.md +92 -92
  23. package/.agent/agents/kotlin-build-resolver.md +118 -118
  24. package/.agent/agents/kotlin-reviewer.md +159 -159
  25. package/.agent/agents/loop-operator.md +36 -36
  26. package/.agent/agents/opensource-forker.md +198 -0
  27. package/.agent/agents/opensource-packager.md +249 -0
  28. package/.agent/agents/opensource-sanitizer.md +188 -0
  29. package/.agent/agents/performance-optimizer.md +392 -133
  30. package/.agent/agents/personas/athena-agent/agent.json +10 -0
  31. package/.agent/agents/personas/athena-agent/athena-backend-logic-architecture-profile.md +189 -0
  32. package/.agent/agents/personas/athena-agent/context-files/agents.md +55 -0
  33. package/.agent/agents/personas/athena-agent/context-files/identity.md +23 -0
  34. package/.agent/agents/personas/athena-agent/context-files/soul.md +51 -0
  35. package/.agent/agents/personas/athena-agent/context-files/user-predefined.md +15 -0
  36. package/.agent/agents/personas/athena-agent/user-context-files/system/bootstrap.md +37 -0
  37. package/.agent/agents/personas/athena-agent/user-context-files/system/user.md +45 -0
  38. package/.agent/agents/personas/da-vinci-agent/agent.json +10 -0
  39. package/.agent/agents/personas/da-vinci-agent/context-files/agents.md +55 -0
  40. package/.agent/agents/personas/da-vinci-agent/context-files/identity.md +23 -0
  41. package/.agent/agents/personas/da-vinci-agent/context-files/soul.md +51 -0
  42. package/.agent/agents/personas/da-vinci-agent/context-files/user-predefined.md +15 -0
  43. package/.agent/agents/personas/da-vinci-agent/da-vinci-frontend-ui-ux-design-profile.md +189 -0
  44. package/.agent/agents/personas/da-vinci-agent/user-context-files/system/bootstrap.md +37 -0
  45. package/.agent/agents/personas/da-vinci-agent/user-context-files/system/user.md +45 -0
  46. package/.agent/agents/personas/duong-tang-agent/agent.json +10 -0
  47. package/.agent/agents/personas/duong-tang-agent/context-files/agents.md +55 -0
  48. package/.agent/agents/personas/duong-tang-agent/context-files/identity.md +23 -0
  49. package/.agent/agents/personas/duong-tang-agent/context-files/soul.md +51 -0
  50. package/.agent/agents/personas/duong-tang-agent/context-files/user-predefined.md +15 -0
  51. package/.agent/agents/personas/duong-tang-agent/tang-monk-quality-testing-documentation-profile.md +189 -0
  52. package/.agent/agents/personas/duong-tang-agent/user-context-files/system/bootstrap.md +37 -0
  53. package/.agent/agents/personas/duong-tang-agent/user-context-files/system/user.md +45 -0
  54. package/.agent/agents/personas/gia-cat-luong-agent/agent.json +10 -0
  55. package/.agent/agents/personas/gia-cat-luong-agent/context-files/agents.md +55 -0
  56. package/.agent/agents/personas/gia-cat-luong-agent/context-files/identity.md +23 -0
  57. package/.agent/agents/personas/gia-cat-luong-agent/context-files/soul.md +51 -0
  58. package/.agent/agents/personas/gia-cat-luong-agent/context-files/user-predefined.md +15 -0
  59. package/.agent/agents/personas/gia-cat-luong-agent/kongming-research-strategy-analysis-profile.md +189 -0
  60. package/.agent/agents/personas/gia-cat-luong-agent/user-context-files/system/bootstrap.md +37 -0
  61. package/.agent/agents/personas/gia-cat-luong-agent/user-context-files/system/user.md +45 -0
  62. package/.agent/agents/personas/mihata-agent/agent.json +10 -0
  63. package/.agent/agents/personas/mihata-agent/context-files/agents.md +55 -0
  64. package/.agent/agents/personas/mihata-agent/context-files/identity.md +23 -0
  65. package/.agent/agents/personas/mihata-agent/context-files/soul.md +51 -0
  66. package/.agent/agents/personas/mihata-agent/context-files/user-predefined.md +15 -0
  67. package/.agent/agents/personas/mihata-agent/mihata-multi-agent-orchestration-profile.md +189 -0
  68. package/.agent/agents/personas/mihata-agent/user-context-files/system/bootstrap.md +37 -0
  69. package/.agent/agents/personas/mihata-agent/user-context-files/system/user.md +45 -0
  70. package/.agent/agents/personas/tesla-agent/agent.json +10 -0
  71. package/.agent/agents/personas/tesla-agent/context-files/agents.md +55 -0
  72. package/.agent/agents/personas/tesla-agent/context-files/identity.md +23 -0
  73. package/.agent/agents/personas/tesla-agent/context-files/soul.md +51 -0
  74. package/.agent/agents/personas/tesla-agent/context-files/user-predefined.md +15 -0
  75. package/.agent/agents/personas/tesla-agent/tesla-fullstack-system-optimization-profile.md +189 -0
  76. package/.agent/agents/personas/tesla-agent/user-context-files/system/bootstrap.md +37 -0
  77. package/.agent/agents/personas/tesla-agent/user-context-files/system/user.md +45 -0
  78. package/.agent/agents/personas/tu-ma-y-agent/agent.json +10 -0
  79. package/.agent/agents/personas/tu-ma-y-agent/context-files/agents.md +55 -0
  80. package/.agent/agents/personas/tu-ma-y-agent/context-files/identity.md +23 -0
  81. package/.agent/agents/personas/tu-ma-y-agent/context-files/soul.md +51 -0
  82. package/.agent/agents/personas/tu-ma-y-agent/context-files/user-predefined.md +15 -0
  83. package/.agent/agents/personas/tu-ma-y-agent/simayi-feasibility-risk-control-profile.md +189 -0
  84. package/.agent/agents/personas/tu-ma-y-agent/user-context-files/system/bootstrap.md +37 -0
  85. package/.agent/agents/personas/tu-ma-y-agent/user-context-files/system/user.md +45 -0
  86. package/.agent/agents/personas/venti-agent/agent.json +10 -0
  87. package/.agent/agents/personas/venti-agent/context-files/agents.md +55 -0
  88. package/.agent/agents/personas/venti-agent/context-files/identity.md +23 -0
  89. package/.agent/agents/personas/venti-agent/context-files/soul.md +51 -0
  90. package/.agent/agents/personas/venti-agent/context-files/user-predefined.md +15 -0
  91. package/.agent/agents/personas/venti-agent/user-context-files/system/bootstrap.md +37 -0
  92. package/.agent/agents/personas/venti-agent/user-context-files/system/user.md +45 -0
  93. package/.agent/agents/personas/venti-agent/venti-learning-communication-mentoring-profile.md +189 -0
  94. package/.agent/agents/planner.md +212 -212
  95. package/.agent/agents/python-reviewer.md +98 -98
  96. package/.agent/agents/pytorch-build-resolver.md +120 -120
  97. package/.agent/agents/refactor-cleaner.md +85 -85
  98. package/.agent/agents/rust-build-resolver.md +148 -148
  99. package/.agent/agents/rust-reviewer.md +94 -94
  100. package/.agent/agents/security-reviewer.md +108 -108
  101. package/.agent/agents/tdd-guide.md +91 -91
  102. package/.agent/agents/typescript-reviewer.md +112 -112
  103. package/.agent/contexts/dev.md +20 -0
  104. package/.agent/contexts/research.md +26 -0
  105. package/.agent/contexts/review.md +22 -0
  106. package/.agent/hooks/hooks.json +395 -0
  107. package/.agent/hooks/readme.md +222 -0
  108. package/.agent/mcp-configs/mcp-servers.json +181 -0
  109. package/.agent/rules/common/agents.md +50 -0
  110. package/.agent/rules/common/code-review.md +124 -0
  111. package/.agent/rules/common/coding-style.md +48 -0
  112. package/.agent/rules/common/development-workflow.md +44 -0
  113. package/.agent/rules/common/git-workflow.md +24 -0
  114. package/.agent/rules/common/hooks.md +30 -0
  115. package/.agent/rules/common/patterns.md +31 -0
  116. package/.agent/rules/common/performance.md +55 -0
  117. package/.agent/rules/common/security.md +29 -0
  118. package/.agent/rules/common/testing.md +29 -0
  119. package/.agent/rules/cpp/coding-style.md +44 -0
  120. package/.agent/rules/cpp/hooks.md +39 -0
  121. package/.agent/rules/cpp/patterns.md +51 -0
  122. package/.agent/rules/cpp/security.md +51 -0
  123. package/.agent/rules/cpp/testing.md +44 -0
  124. package/.agent/rules/csharp/coding-style.md +72 -0
  125. package/.agent/rules/csharp/hooks.md +25 -0
  126. package/.agent/rules/csharp/patterns.md +50 -0
  127. package/.agent/rules/csharp/security.md +58 -0
  128. package/.agent/rules/csharp/testing.md +46 -0
  129. package/.agent/rules/dart/coding-style.md +159 -0
  130. package/.agent/rules/dart/hooks.md +66 -0
  131. package/.agent/rules/dart/patterns.md +261 -0
  132. package/.agent/rules/dart/security.md +135 -0
  133. package/.agent/rules/dart/testing.md +215 -0
  134. package/.agent/rules/golang/coding-style.md +32 -0
  135. package/.agent/rules/golang/hooks.md +17 -0
  136. package/.agent/rules/golang/patterns.md +45 -0
  137. package/.agent/rules/golang/security.md +34 -0
  138. package/.agent/rules/golang/testing.md +31 -0
  139. package/.agent/rules/java/coding-style.md +114 -0
  140. package/.agent/rules/java/hooks.md +18 -0
  141. package/.agent/rules/java/patterns.md +146 -0
  142. package/.agent/rules/java/security.md +100 -0
  143. package/.agent/rules/java/testing.md +131 -0
  144. package/.agent/rules/kotlin/coding-style.md +86 -0
  145. package/.agent/rules/kotlin/hooks.md +17 -0
  146. package/.agent/rules/kotlin/patterns.md +146 -0
  147. package/.agent/rules/kotlin/security.md +82 -0
  148. package/.agent/rules/kotlin/testing.md +128 -0
  149. package/.agent/rules/perl/coding-style.md +46 -0
  150. package/.agent/rules/perl/hooks.md +22 -0
  151. package/.agent/rules/perl/patterns.md +76 -0
  152. package/.agent/rules/perl/security.md +69 -0
  153. package/.agent/rules/perl/testing.md +54 -0
  154. package/.agent/rules/php/coding-style.md +40 -0
  155. package/.agent/rules/php/hooks.md +24 -0
  156. package/.agent/rules/php/patterns.md +33 -0
  157. package/.agent/rules/php/security.md +37 -0
  158. package/.agent/rules/php/testing.md +39 -0
  159. package/.agent/rules/python/coding-style.md +42 -0
  160. package/.agent/rules/python/hooks.md +19 -0
  161. package/.agent/rules/python/patterns.md +39 -0
  162. package/.agent/rules/python/security.md +30 -0
  163. package/.agent/rules/python/testing.md +38 -0
  164. package/.agent/rules/readme.md +111 -0
  165. package/.agent/rules/rust/coding-style.md +151 -0
  166. package/.agent/rules/rust/hooks.md +16 -0
  167. package/.agent/rules/rust/patterns.md +168 -0
  168. package/.agent/rules/rust/security.md +141 -0
  169. package/.agent/rules/rust/testing.md +154 -0
  170. package/.agent/rules/swift/coding-style.md +47 -0
  171. package/.agent/rules/swift/hooks.md +20 -0
  172. package/.agent/rules/swift/patterns.md +66 -0
  173. package/.agent/rules/swift/security.md +33 -0
  174. package/.agent/rules/swift/testing.md +45 -0
  175. package/.agent/rules/typescript/coding-style.md +199 -0
  176. package/.agent/rules/typescript/hooks.md +22 -0
  177. package/.agent/rules/typescript/patterns.md +52 -0
  178. package/.agent/rules/typescript/security.md +28 -0
  179. package/.agent/rules/typescript/testing.md +18 -0
  180. package/.agent/rules/web/coding-style.md +96 -0
  181. package/.agent/rules/web/design-quality.md +63 -0
  182. package/.agent/rules/web/hooks.md +120 -0
  183. package/.agent/rules/web/patterns.md +79 -0
  184. package/.agent/rules/web/performance.md +64 -0
  185. package/.agent/rules/web/security.md +57 -0
  186. package/.agent/rules/web/testing.md +55 -0
  187. package/.agent/rules/zh/agents.md +50 -0
  188. package/.agent/rules/zh/code-review.md +124 -0
  189. package/.agent/rules/zh/coding-style.md +48 -0
  190. package/.agent/rules/zh/development-workflow.md +44 -0
  191. package/.agent/rules/zh/git-workflow.md +24 -0
  192. package/.agent/rules/zh/hooks.md +30 -0
  193. package/.agent/rules/zh/patterns.md +31 -0
  194. package/.agent/rules/zh/performance.md +55 -0
  195. package/.agent/rules/zh/readme.md +108 -0
  196. package/.agent/rules/zh/security.md +29 -0
  197. package/.agent/rules/zh/testing.md +29 -0
  198. package/.agent/skills/agent-eval/SKILL.md +145 -0
  199. package/.agent/skills/agent-harness-construction/SKILL.md +73 -0
  200. package/.agent/skills/agent-payment-x402/SKILL.md +178 -0
  201. package/.agent/skills/agentic-engineering/SKILL.md +63 -0
  202. package/.agent/skills/ai-first-engineering/SKILL.md +51 -0
  203. package/.agent/skills/ai-regression-testing/SKILL.md +385 -0
  204. package/.agent/skills/android-clean-architecture/SKILL.md +339 -0
  205. package/.agent/skills/api-design/SKILL.md +523 -0
  206. package/.agent/skills/architecture-decision-records/SKILL.md +179 -0
  207. package/.agent/skills/article-writing/SKILL.md +79 -0
  208. package/.agent/skills/autonomous-agent-harness/SKILL.md +267 -0
  209. package/.agent/skills/autonomous-loops/SKILL.md +610 -0
  210. package/.agent/skills/backend-patterns/SKILL.md +598 -0
  211. package/.agent/skills/benchmark/SKILL.md +93 -0
  212. package/.agent/skills/blueprint/SKILL.md +105 -0
  213. package/.agent/skills/brand-voice/SKILL.md +97 -0
  214. package/.agent/skills/brand-voice/references/voice-profile-schema.md +55 -0
  215. package/.agent/skills/browser-qa/SKILL.md +87 -0
  216. package/.agent/skills/bun-runtime/SKILL.md +84 -0
  217. package/.agent/skills/canary-watch/SKILL.md +99 -0
  218. package/.agent/skills/carrier-relationship-management/SKILL.md +212 -0
  219. package/.agent/skills/ck/SKILL.md +147 -0
  220. package/.agent/skills/ck/commands/forget.mjs +44 -0
  221. package/.agent/skills/ck/commands/info.mjs +24 -0
  222. package/.agent/skills/ck/commands/init.mjs +143 -0
  223. package/.agent/skills/ck/commands/list.mjs +40 -0
  224. package/.agent/skills/ck/commands/migrate.mjs +202 -0
  225. package/.agent/skills/ck/commands/resume.mjs +36 -0
  226. package/.agent/skills/ck/commands/save.mjs +210 -0
  227. package/.agent/skills/ck/commands/shared.mjs +387 -0
  228. package/.agent/skills/ck/hooks/session-start.mjs +224 -0
  229. package/.agent/skills/claude-api/SKILL.md +337 -0
  230. package/.agent/skills/claude-devfleet/SKILL.md +103 -0
  231. package/.agent/skills/click-path-audit/SKILL.md +244 -0
  232. package/.agent/skills/clickhouse-io/SKILL.md +439 -0
  233. package/.agent/skills/codebase-onboarding/SKILL.md +233 -0
  234. package/.agent/skills/coding-standards/SKILL.md +530 -0
  235. package/.agent/skills/compose-multiplatform-patterns/SKILL.md +299 -0
  236. package/.agent/skills/configure-ecc/SKILL.md +367 -0
  237. package/.agent/skills/connections-optimizer/SKILL.md +189 -0
  238. package/.agent/skills/content-engine/SKILL.md +131 -0
  239. package/.agent/skills/content-hash-cache-pattern/SKILL.md +161 -0
  240. package/.agent/skills/context-budget/SKILL.md +135 -0
  241. package/.agent/skills/continuous-agent-loop/SKILL.md +45 -0
  242. package/.agent/skills/continuous-learning/SKILL.md +119 -0
  243. package/.agent/skills/continuous-learning/config.json +18 -0
  244. package/.agent/skills/continuous-learning/evaluate-session.sh +69 -0
  245. package/.agent/skills/continuous-learning-v2/SKILL.md +365 -0
  246. package/.agent/skills/continuous-learning-v2/agents/observer-loop.sh +271 -0
  247. package/.agent/skills/continuous-learning-v2/agents/observer.md +198 -0
  248. package/.agent/skills/continuous-learning-v2/agents/session-guardian.sh +150 -0
  249. package/.agent/skills/continuous-learning-v2/agents/start-observer.sh +244 -0
  250. package/.agent/skills/continuous-learning-v2/config.json +8 -0
  251. package/.agent/skills/continuous-learning-v2/hooks/observe.sh +428 -0
  252. package/.agent/skills/continuous-learning-v2/scripts/detect-project.sh +228 -0
  253. package/.agent/skills/continuous-learning-v2/scripts/instinct-cli.py +1426 -0
  254. package/.agent/skills/continuous-learning-v2/scripts/test-parse-instinct.py +984 -0
  255. package/.agent/skills/cost-aware-llm-pipeline/SKILL.md +183 -0
  256. package/.agent/skills/cpp-coding-standards/SKILL.md +723 -0
  257. package/.agent/skills/cpp-testing/SKILL.md +324 -0
  258. package/.agent/skills/crosspost/SKILL.md +111 -0
  259. package/.agent/skills/csharp-testing/SKILL.md +321 -0
  260. package/.agent/skills/customer-billing-ops/SKILL.md +140 -0
  261. package/.agent/skills/customs-trade-compliance/SKILL.md +263 -0
  262. package/.agent/skills/dart-flutter-patterns/SKILL.md +563 -0
  263. package/.agent/skills/data-scraper-agent/SKILL.md +764 -0
  264. package/.agent/skills/database-migrations/SKILL.md +429 -0
  265. package/.agent/skills/deep-research/SKILL.md +155 -0
  266. package/.agent/skills/deployment-patterns/SKILL.md +427 -0
  267. package/.agent/skills/design-system/SKILL.md +82 -0
  268. package/.agent/skills/django-patterns/SKILL.md +734 -0
  269. package/.agent/skills/django-security/SKILL.md +593 -0
  270. package/.agent/skills/django-tdd/SKILL.md +729 -0
  271. package/.agent/skills/django-verification/SKILL.md +469 -0
  272. package/.agent/skills/dmux-workflows/SKILL.md +191 -0
  273. package/.agent/skills/docker-patterns/SKILL.md +364 -0
  274. package/.agent/skills/documentation-lookup/SKILL.md +90 -0
  275. package/.agent/skills/dotnet-patterns/SKILL.md +321 -0
  276. package/.agent/skills/e2e-testing/SKILL.md +326 -0
  277. package/.agent/skills/energy-procurement/SKILL.md +228 -0
  278. package/.agent/skills/enterprise-agent-ops/SKILL.md +50 -0
  279. package/.agent/skills/eval-harness/SKILL.md +270 -0
  280. package/.agent/skills/exa-search/SKILL.md +103 -0
  281. package/.agent/skills/fal-ai-media/SKILL.md +284 -0
  282. package/.agent/skills/flutter-dart-code-review/SKILL.md +435 -0
  283. package/.agent/skills/foundation-models-on-device/SKILL.md +243 -0
  284. package/.agent/skills/frontend-patterns/SKILL.md +642 -0
  285. package/.agent/skills/frontend-slides/SKILL.md +184 -0
  286. package/.agent/skills/frontend-slides/style-presets.md +330 -0
  287. package/.agent/skills/gan-style-harness/SKILL.md +278 -0
  288. package/.agent/skills/git-workflow/SKILL.md +715 -0
  289. package/.agent/skills/golang-patterns/SKILL.md +674 -0
  290. package/.agent/skills/golang-testing/SKILL.md +720 -0
  291. package/.agent/skills/google-workspace-ops/SKILL.md +95 -0
  292. package/.agent/skills/healthcare-cdss-patterns/SKILL.md +245 -0
  293. package/.agent/skills/healthcare-emr-patterns/SKILL.md +159 -0
  294. package/.agent/skills/healthcare-eval-harness/SKILL.md +207 -0
  295. package/.agent/skills/healthcare-phi-compliance/SKILL.md +145 -0
  296. package/.agent/skills/hexagonal-architecture/SKILL.md +276 -0
  297. package/.agent/skills/inventory-demand-planning/SKILL.md +247 -0
  298. package/.agent/skills/investor-materials/SKILL.md +96 -0
  299. package/.agent/skills/investor-outreach/SKILL.md +91 -0
  300. package/.agent/skills/iterative-retrieval/SKILL.md +211 -0
  301. package/.agent/skills/java-coding-standards/SKILL.md +147 -0
  302. package/.agent/skills/jira-integration/SKILL.md +293 -0
  303. package/.agent/skills/jpa-patterns/SKILL.md +151 -0
  304. package/.agent/skills/kotlin-coroutines-flows/SKILL.md +284 -0
  305. package/.agent/skills/kotlin-exposed-patterns/SKILL.md +719 -0
  306. package/.agent/skills/kotlin-ktor-patterns/SKILL.md +689 -0
  307. package/.agent/skills/kotlin-patterns/SKILL.md +711 -0
  308. package/.agent/skills/kotlin-testing/SKILL.md +824 -0
  309. package/.agent/skills/laravel-patterns/SKILL.md +415 -0
  310. package/.agent/skills/laravel-plugin-discovery/SKILL.md +229 -0
  311. package/.agent/skills/laravel-security/SKILL.md +285 -0
  312. package/.agent/skills/laravel-tdd/SKILL.md +283 -0
  313. package/.agent/skills/laravel-verification/SKILL.md +179 -0
  314. package/.agent/skills/lead-intelligence/SKILL.md +321 -0
  315. package/.agent/skills/lead-intelligence/agents/enrichment-agent.md +85 -0
  316. package/.agent/skills/lead-intelligence/agents/mutual-mapper.md +75 -0
  317. package/.agent/skills/lead-intelligence/agents/outreach-drafter.md +98 -0
  318. package/.agent/skills/lead-intelligence/agents/signal-scorer.md +60 -0
  319. package/.agent/skills/liquid-glass-design/SKILL.md +279 -0
  320. package/.agent/skills/logistics-exception-management/SKILL.md +222 -0
  321. package/.agent/skills/manim-video/SKILL.md +89 -0
  322. package/.agent/skills/manim-video/assets/network-graph-scene.py +52 -0
  323. package/.agent/skills/market-research/SKILL.md +75 -0
  324. package/.agent/skills/mcp-builder/SKILL.md +173 -113
  325. package/.agent/skills/mcp-builder/license.txt +202 -0
  326. package/.agent/skills/mcp-builder/reference/evaluation.md +602 -0
  327. package/.agent/skills/mcp-builder/reference/mcp-best-practices.md +249 -0
  328. package/.agent/skills/mcp-builder/reference/node-mcp-server.md +970 -0
  329. package/.agent/skills/mcp-builder/reference/python-mcp-server.md +719 -0
  330. package/.agent/skills/mcp-builder/scripts/connections.py +151 -0
  331. package/.agent/skills/mcp-builder/scripts/evaluation.py +373 -0
  332. package/.agent/skills/mcp-builder/scripts/example-evaluation.xml +22 -0
  333. package/.agent/skills/mcp-builder/scripts/requirements.txt +2 -0
  334. package/.agent/skills/mcp-server-patterns/SKILL.md +67 -0
  335. package/.agent/skills/nanoclaw-repl/SKILL.md +33 -0
  336. package/.agent/skills/nestjs-patterns/SKILL.md +230 -0
  337. package/.agent/skills/nextjs-turbopack/SKILL.md +44 -0
  338. package/.agent/skills/nutrient-document-processing/SKILL.md +167 -0
  339. package/.agent/skills/nuxt4-patterns/SKILL.md +100 -0
  340. package/.agent/skills/openclaw-persona-forge/SKILL.md +296 -0
  341. package/.agent/skills/openclaw-persona-forge/gacha.py +224 -0
  342. package/.agent/skills/openclaw-persona-forge/gacha.sh +5 -0
  343. package/.agent/skills/openclaw-persona-forge/references/avatar-style.md +124 -0
  344. package/.agent/skills/openclaw-persona-forge/references/boundary-rules.md +53 -0
  345. package/.agent/skills/openclaw-persona-forge/references/error-handling.md +53 -0
  346. package/.agent/skills/openclaw-persona-forge/references/identity-tension.md +48 -0
  347. package/.agent/skills/openclaw-persona-forge/references/naming-system.md +39 -0
  348. package/.agent/skills/openclaw-persona-forge/references/output-template.md +166 -0
  349. package/.agent/skills/opensource-pipeline/SKILL.md +255 -0
  350. package/.agent/skills/perl-patterns/SKILL.md +504 -0
  351. package/.agent/skills/perl-security/SKILL.md +503 -0
  352. package/.agent/skills/perl-testing/SKILL.md +475 -0
  353. package/.agent/skills/plankton-code-quality/SKILL.md +236 -0
  354. package/.agent/skills/postgres-patterns/SKILL.md +147 -0
  355. package/.agent/skills/product-lens/SKILL.md +85 -0
  356. package/.agent/skills/production-scheduling/SKILL.md +238 -0
  357. package/.agent/skills/project-flow-ops/SKILL.md +111 -0
  358. package/.agent/skills/project-guidelines-example/SKILL.md +349 -0
  359. package/.agent/skills/prompt-optimizer/SKILL.md +397 -0
  360. package/.agent/skills/python-patterns/SKILL.md +622 -313
  361. package/.agent/skills/python-testing/SKILL.md +816 -0
  362. package/.agent/skills/pytorch-patterns/SKILL.md +396 -0
  363. package/.agent/skills/quality-nonconformance/SKILL.md +260 -0
  364. package/.agent/skills/ralphinho-rfc-pipeline/SKILL.md +67 -0
  365. package/.agent/skills/regex-vs-llm-structured-text/SKILL.md +220 -0
  366. package/.agent/skills/remotion-video-creation/SKILL.md +43 -0
  367. package/.agent/skills/remotion-video-creation/rules/3d.md +86 -0
  368. package/.agent/skills/remotion-video-creation/rules/animations.md +29 -0
  369. package/.agent/skills/remotion-video-creation/rules/assets/charts-bar-chart.tsx +173 -0
  370. package/.agent/skills/remotion-video-creation/rules/assets/text-animations-typewriter.tsx +100 -0
  371. package/.agent/skills/remotion-video-creation/rules/assets/text-animations-word-highlight.tsx +108 -0
  372. package/.agent/skills/remotion-video-creation/rules/assets.md +78 -0
  373. package/.agent/skills/remotion-video-creation/rules/audio.md +172 -0
  374. package/.agent/skills/remotion-video-creation/rules/calculate-metadata.md +104 -0
  375. package/.agent/skills/remotion-video-creation/rules/can-decode.md +75 -0
  376. package/.agent/skills/remotion-video-creation/rules/charts.md +58 -0
  377. package/.agent/skills/remotion-video-creation/rules/compositions.md +146 -0
  378. package/.agent/skills/remotion-video-creation/rules/display-captions.md +126 -0
  379. package/.agent/skills/remotion-video-creation/rules/extract-frames.md +229 -0
  380. package/.agent/skills/remotion-video-creation/rules/fonts.md +152 -0
  381. package/.agent/skills/remotion-video-creation/rules/get-audio-duration.md +58 -0
  382. package/.agent/skills/remotion-video-creation/rules/get-video-dimensions.md +68 -0
  383. package/.agent/skills/remotion-video-creation/rules/get-video-duration.md +58 -0
  384. package/.agent/skills/remotion-video-creation/rules/gifs.md +138 -0
  385. package/.agent/skills/remotion-video-creation/rules/images.md +130 -0
  386. package/.agent/skills/remotion-video-creation/rules/import-srt-captions.md +67 -0
  387. package/.agent/skills/remotion-video-creation/rules/lottie.md +67 -0
  388. package/.agent/skills/remotion-video-creation/rules/measuring-dom-nodes.md +34 -0
  389. package/.agent/skills/remotion-video-creation/rules/measuring-text.md +143 -0
  390. package/.agent/skills/remotion-video-creation/rules/sequencing.md +106 -0
  391. package/.agent/skills/remotion-video-creation/rules/tailwind.md +11 -0
  392. package/.agent/skills/remotion-video-creation/rules/text-animations.md +20 -0
  393. package/.agent/skills/remotion-video-creation/rules/timing.md +179 -0
  394. package/.agent/skills/remotion-video-creation/rules/transcribe-captions.md +19 -0
  395. package/.agent/skills/remotion-video-creation/rules/transitions.md +122 -0
  396. package/.agent/skills/remotion-video-creation/rules/trimming.md +52 -0
  397. package/.agent/skills/remotion-video-creation/rules/videos.md +171 -0
  398. package/.agent/skills/repo-scan/SKILL.md +78 -0
  399. package/.agent/skills/returns-reverse-logistics/SKILL.md +240 -0
  400. package/.agent/skills/rules-distill/SKILL.md +264 -0
  401. package/.agent/skills/rules-distill/scripts/scan-rules.sh +58 -0
  402. package/.agent/skills/rules-distill/scripts/scan-skills.sh +129 -0
  403. package/.agent/skills/rust-patterns/SKILL.md +499 -0
  404. package/.agent/skills/rust-testing/SKILL.md +500 -0
  405. package/.agent/skills/safety-guard/SKILL.md +75 -0
  406. package/.agent/skills/santa-method/SKILL.md +306 -0
  407. package/.agent/skills/search-first/SKILL.md +161 -0
  408. package/.agent/skills/security-review/SKILL.md +495 -0
  409. package/.agent/skills/security-review/cloud-infrastructure-security.md +361 -0
  410. package/.agent/skills/security-scan/SKILL.md +165 -0
  411. package/.agent/skills/skill-comply/SKILL.md +58 -0
  412. package/.agent/skills/skill-comply/fixtures/compliant-trace.jsonl +5 -0
  413. package/.agent/skills/skill-comply/fixtures/noncompliant-trace.jsonl +3 -0
  414. package/.agent/skills/skill-comply/fixtures/tdd-spec.yaml +44 -0
  415. package/.agent/skills/skill-comply/prompts/classifier.md +24 -0
  416. package/.agent/skills/skill-comply/prompts/scenario-generator.md +62 -0
  417. package/.agent/skills/skill-comply/prompts/spec-generator.md +42 -0
  418. package/.agent/skills/skill-comply/pyproject.toml +15 -0
  419. package/.agent/skills/skill-comply/scripts/classifier.py +85 -0
  420. package/.agent/skills/skill-comply/scripts/grader.py +122 -0
  421. package/.agent/skills/skill-comply/scripts/init.py +0 -0
  422. package/.agent/skills/skill-comply/scripts/parser.py +107 -0
  423. package/.agent/skills/skill-comply/scripts/report.py +170 -0
  424. package/.agent/skills/skill-comply/scripts/run.py +127 -0
  425. package/.agent/skills/skill-comply/scripts/runner.py +161 -0
  426. package/.agent/skills/skill-comply/scripts/scenario-generator.py +70 -0
  427. package/.agent/skills/skill-comply/scripts/spec-generator.py +72 -0
  428. package/.agent/skills/skill-comply/scripts/utils.py +13 -0
  429. package/.agent/skills/skill-comply/tests/test-grader.py +137 -0
  430. package/.agent/skills/skill-comply/tests/test-parser.py +90 -0
  431. package/.agent/skills/skill-creator/SKILL.md +485 -0
  432. package/.agent/skills/skill-creator/agents/analyzer.md +274 -0
  433. package/.agent/skills/skill-creator/agents/comparator.md +202 -0
  434. package/.agent/skills/skill-creator/agents/grader.md +223 -0
  435. package/.agent/skills/skill-creator/assets/eval-review.html +146 -0
  436. package/.agent/skills/skill-creator/eval-viewer/generate-review.py +471 -0
  437. package/.agent/skills/skill-creator/eval-viewer/viewer.html +1325 -0
  438. package/.agent/skills/skill-creator/license.txt +202 -0
  439. package/.agent/skills/skill-creator/references/schemas.md +430 -0
  440. package/.agent/skills/skill-creator/scripts/aggregate-benchmark.py +401 -0
  441. package/.agent/skills/skill-creator/scripts/generate-report.py +326 -0
  442. package/.agent/skills/skill-creator/scripts/improve-description.py +247 -0
  443. package/.agent/skills/skill-creator/scripts/init.py +0 -0
  444. package/.agent/skills/skill-creator/scripts/package-skill.py +136 -0
  445. package/.agent/skills/skill-creator/scripts/quick-validate.py +103 -0
  446. package/.agent/skills/skill-creator/scripts/run-eval.py +310 -0
  447. package/.agent/skills/skill-creator/scripts/run-loop.py +328 -0
  448. package/.agent/skills/skill-creator/scripts/utils.py +47 -0
  449. package/.agent/skills/skill-stocktake/SKILL.md +193 -0
  450. package/.agent/skills/skill-stocktake/scripts/quick-diff.sh +87 -0
  451. package/.agent/skills/skill-stocktake/scripts/save-results.sh +56 -0
  452. package/.agent/skills/skill-stocktake/scripts/scan.sh +170 -0
  453. package/.agent/skills/social-graph-ranker/SKILL.md +154 -0
  454. package/.agent/skills/springboot-patterns/SKILL.md +314 -0
  455. package/.agent/skills/springboot-security/SKILL.md +272 -0
  456. package/.agent/skills/springboot-tdd/SKILL.md +158 -0
  457. package/.agent/skills/springboot-verification/SKILL.md +231 -0
  458. package/.agent/skills/strategic-compact/SKILL.md +131 -0
  459. package/.agent/skills/strategic-compact/suggest-compact.sh +54 -0
  460. package/.agent/skills/swift-actor-persistence/SKILL.md +143 -0
  461. package/.agent/skills/swift-concurrency-6-2/SKILL.md +216 -0
  462. package/.agent/skills/swift-protocol-di-testing/SKILL.md +190 -0
  463. package/.agent/skills/swiftui-patterns/SKILL.md +259 -0
  464. package/.agent/skills/tdd-workflow/SKILL.md +412 -98
  465. package/.agent/skills/team-builder/SKILL.md +168 -0
  466. package/.agent/skills/token-budget-advisor/SKILL.md +133 -0
  467. package/.agent/skills/ui-demo/SKILL.md +465 -0
  468. package/.agent/skills/ui-ux-pro-max/data/charts.csv +26 -26
  469. package/.agent/skills/ui-ux-pro-max/data/colors.csv +97 -97
  470. package/.agent/skills/ui-ux-pro-max/data/landing.csv +28 -28
  471. package/.agent/skills/ui-ux-pro-max/data/products.csv +96 -96
  472. package/.agent/skills/ui-ux-pro-max/data/stacks/flutter.csv +53 -53
  473. package/.agent/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -56
  474. package/.agent/skills/ui-ux-pro-max/data/stacks/nextjs.csv +53 -53
  475. package/.agent/skills/ui-ux-pro-max/data/stacks/react-native.csv +52 -52
  476. package/.agent/skills/ui-ux-pro-max/data/stacks/react.csv +54 -54
  477. package/.agent/skills/ui-ux-pro-max/data/stacks/svelte.csv +54 -54
  478. package/.agent/skills/ui-ux-pro-max/data/stacks/swiftui.csv +51 -51
  479. package/.agent/skills/ui-ux-pro-max/data/stacks/vue.csv +50 -50
  480. package/.agent/skills/ui-ux-pro-max/data/styles.csv +68 -68
  481. package/.agent/skills/ui-ux-pro-max/data/ux-guidelines.csv +99 -99
  482. package/.agent/skills/ui-ux-pro-max/scripts/search.py +114 -114
  483. package/.agent/skills/verification-loop/SKILL.md +126 -0
  484. package/.agent/skills/video-editing/SKILL.md +310 -0
  485. package/.agent/skills/videodb/SKILL.md +374 -0
  486. package/.agent/skills/videodb/reference/api-reference.md +550 -0
  487. package/.agent/skills/videodb/reference/capture-reference.md +407 -0
  488. package/.agent/skills/videodb/reference/capture.md +101 -0
  489. package/.agent/skills/videodb/reference/editor.md +443 -0
  490. package/.agent/skills/videodb/reference/generative.md +331 -0
  491. package/.agent/skills/videodb/reference/rtstream-reference.md +564 -0
  492. package/.agent/skills/videodb/reference/rtstream.md +65 -0
  493. package/.agent/skills/videodb/reference/search.md +230 -0
  494. package/.agent/skills/videodb/reference/streaming.md +406 -0
  495. package/.agent/skills/videodb/reference/use-cases.md +118 -0
  496. package/.agent/skills/videodb/scripts/ws-listener.py +282 -0
  497. package/.agent/skills/visa-doc-translate/SKILL.md +117 -0
  498. package/.agent/skills/visa-doc-translate/readme.md +86 -0
  499. package/.agent/skills/workspace-surface-audit/SKILL.md +125 -0
  500. package/.agent/skills/x-api/SKILL.md +230 -0
  501. package/.agent/tasks/two-track-merge-contract.md +29 -0
  502. package/.agent/workflows/aside.md +164 -164
  503. package/.agent/workflows/build-fix.md +62 -62
  504. package/.agent/workflows/checkpoint.md +74 -74
  505. package/.agent/workflows/claw.md +23 -51
  506. package/.agent/workflows/clean-memory.md +34 -0
  507. package/.agent/workflows/code-review.md +289 -40
  508. package/.agent/workflows/context-budget.md +23 -29
  509. package/.agent/workflows/cpp-build.md +173 -173
  510. package/.agent/workflows/cpp-review.md +132 -132
  511. package/.agent/workflows/cpp-test.md +251 -251
  512. package/.agent/workflows/devfleet.md +23 -92
  513. package/.agent/workflows/docs.md +23 -31
  514. package/.agent/workflows/e2e.md +268 -365
  515. package/.agent/workflows/eval.md +23 -120
  516. package/.agent/workflows/evolve.md +178 -178
  517. package/.agent/workflows/flutter-build.md +164 -0
  518. package/.agent/workflows/flutter-review.md +116 -0
  519. package/.agent/workflows/flutter-test.md +144 -0
  520. package/.agent/workflows/gan-build.md +99 -0
  521. package/.agent/workflows/gan-design.md +35 -0
  522. package/.agent/workflows/go-build.md +183 -183
  523. package/.agent/workflows/go-review.md +148 -148
  524. package/.agent/workflows/go-test.md +268 -268
  525. package/.agent/workflows/gradle-build.md +70 -70
  526. package/.agent/workflows/harness-audit.md +73 -71
  527. package/.agent/workflows/instinct-export.md +66 -66
  528. package/.agent/workflows/instinct-import.md +114 -114
  529. package/.agent/workflows/instinct-status.md +59 -59
  530. package/.agent/workflows/jira.md +106 -0
  531. package/.agent/workflows/kotlin-build.md +174 -174
  532. package/.agent/workflows/kotlin-review.md +140 -140
  533. package/.agent/workflows/kotlin-test.md +312 -312
  534. package/.agent/workflows/learn-eval.md +116 -116
  535. package/.agent/workflows/learn.md +70 -70
  536. package/.agent/workflows/loop-start.md +32 -32
  537. package/.agent/workflows/loop-status.md +24 -24
  538. package/.agent/workflows/model-route.md +26 -26
  539. package/.agent/workflows/multi-backend.md +158 -158
  540. package/.agent/workflows/multi-execute.md +315 -315
  541. package/.agent/workflows/multi-frontend.md +158 -158
  542. package/.agent/workflows/multi-plan.md +268 -268
  543. package/.agent/workflows/multi-workflow.md +191 -191
  544. package/.agent/workflows/orchestrate.md +135 -231
  545. package/.agent/workflows/plan.md +117 -115
  546. package/.agent/workflows/pm2.md +272 -272
  547. package/.agent/workflows/projects.md +39 -39
  548. package/.agent/workflows/promote.md +41 -41
  549. package/.agent/workflows/prompt-optimize.md +23 -38
  550. package/.agent/workflows/prp-commit.md +112 -0
  551. package/.agent/workflows/prp-implement.md +385 -0
  552. package/.agent/workflows/prp-plan.md +502 -0
  553. package/.agent/workflows/prp-pr.md +184 -0
  554. package/.agent/workflows/prp-prd.md +447 -0
  555. package/.agent/workflows/prune.md +31 -31
  556. package/.agent/workflows/python-review.md +297 -297
  557. package/.agent/workflows/quality-gate.md +29 -29
  558. package/.agent/workflows/refactor-clean.md +80 -80
  559. package/.agent/workflows/resume-session.md +156 -156
  560. package/.agent/workflows/rules-distill.md +20 -11
  561. package/.agent/workflows/rust-build.md +187 -187
  562. package/.agent/workflows/rust-review.md +142 -142
  563. package/.agent/workflows/rust-test.md +308 -308
  564. package/.agent/workflows/santa-loop.md +175 -0
  565. package/.agent/workflows/save-session.md +275 -275
  566. package/.agent/workflows/sessions.md +333 -333
  567. package/.agent/workflows/setup-pm.md +80 -80
  568. package/.agent/workflows/skill-create.md +174 -174
  569. package/.agent/workflows/skill-health.md +54 -54
  570. package/.agent/workflows/tdd.md +231 -328
  571. package/.agent/workflows/test-coverage.md +69 -69
  572. package/.agent/workflows/update-codemaps.md +72 -72
  573. package/.agent/workflows/update-docs.md +84 -84
  574. package/.agent/workflows/verify.md +23 -59
  575. package/LICENSE +176 -176
  576. package/README.md +28 -20
  577. package/RELEASE.md +32 -36
  578. package/package.json +87 -79
  579. package/scripts/release-check.js +55 -55
  580. package/src/bin/cli.js +399 -53
  581. package/src/lib/installer.js +360 -114
  582. package/src/lib/manifests/stacks.js +122 -0
  583. package/src/lib/slash-commands.js +28 -0
  584. package/src/templates/claude/CLAUDE.en.md +42 -0
  585. package/src/templates/claude/CLAUDE.md +42 -0
  586. package/src/templates/claude/CLAUDE.vi.md +42 -0
  587. package/src/templates/codex/AGENTS.en.md +40 -0
  588. package/src/templates/codex/AGENTS.md +40 -0
  589. package/src/templates/codex/AGENTS.vi.md +40 -0
  590. package/src/templates/cursor/pilo-masterkit.mdc +20 -0
  591. package/src/templates/gemini/GEMINI.en.md +56 -0
  592. package/src/templates/gemini/GEMINI.md +56 -0
  593. package/src/templates/gemini/GEMINI.vi.md +56 -0
  594. package/src/templates/github/copilot-instructions.md +16 -0
@@ -0,0 +1,321 @@
1
+ ---
2
+ name: dotnet-patterns
3
+ description: Idiomatic C# and .NET patterns, conventions, dependency injection, async/await, and best practices for building robust, maintainable .NET applications.
4
+ origin: ECC
5
+ ---
6
+
7
+ # .NET Development Patterns
8
+
9
+ Idiomatic C# and .NET patterns for building robust, performant, and maintainable applications.
10
+
11
+ ## When to Activate
12
+
13
+ - Writing new C# code
14
+ - Reviewing C# code
15
+ - Refactoring existing .NET applications
16
+ - Designing service architectures with ASP.NET Core
17
+
18
+ ## Core Principles
19
+
20
+ ### 1. Prefer Immutability
21
+
22
+ Use records and init-only properties for data models. Mutability should be an explicit, justified choice.
23
+
24
+ ```csharp
25
+ // Good: Immutable value object
26
+ public sealed record Money(decimal Amount, string Currency);
27
+
28
+ // Good: Immutable DTO with init setters
29
+ public sealed class CreateOrderRequest
30
+ {
31
+ public required string CustomerId { get; init; }
32
+ public required IReadOnlyList<OrderItem> Items { get; init; }
33
+ }
34
+
35
+ // Bad: Mutable model with public setters
36
+ public class Order
37
+ {
38
+ public string CustomerId { get; set; }
39
+ public List<OrderItem> Items { get; set; }
40
+ }
41
+ ```
42
+
43
+ ### 2. Explicit Over Implicit
44
+
45
+ Be clear about nullability, access modifiers, and intent.
46
+
47
+ ```csharp
48
+ // Good: Explicit access modifiers and nullability
49
+ public sealed class UserService
50
+ {
51
+ private readonly IUserRepository _repository;
52
+ private readonly ILogger<UserService> _logger;
53
+
54
+ public UserService(IUserRepository repository, ILogger<UserService> logger)
55
+ {
56
+ _repository = repository ?? throw new ArgumentNullException(nameof(repository));
57
+ _logger = logger ?? throw new ArgumentNullException(nameof(logger));
58
+ }
59
+
60
+ public async Task<User?> FindByIdAsync(Guid id, CancellationToken cancellationToken)
61
+ {
62
+ return await _repository.FindByIdAsync(id, cancellationToken);
63
+ }
64
+ }
65
+ ```
66
+
67
+ ### 3. Depend on Abstractions
68
+
69
+ Use interfaces for service boundaries. Register via DI container.
70
+
71
+ ```csharp
72
+ // Good: Interface-based dependency
73
+ public interface IOrderRepository
74
+ {
75
+ Task<Order?> FindByIdAsync(Guid id, CancellationToken cancellationToken);
76
+ Task<IReadOnlyList<Order>> FindByCustomerAsync(string customerId, CancellationToken cancellationToken);
77
+ Task AddAsync(Order order, CancellationToken cancellationToken);
78
+ }
79
+
80
+ // Registration
81
+ builder.Services.AddScoped<IOrderRepository, SqlOrderRepository>();
82
+ ```
83
+
84
+ ## Async/Await Patterns
85
+
86
+ ### Proper Async Usage
87
+
88
+ ```csharp
89
+ // Good: Async all the way, with CancellationToken
90
+ public async Task<OrderSummary> GetOrderSummaryAsync(
91
+ Guid orderId,
92
+ CancellationToken cancellationToken)
93
+ {
94
+ var order = await _repository.FindByIdAsync(orderId, cancellationToken)
95
+ ?? throw new NotFoundException($"Order {orderId} not found");
96
+
97
+ var customer = await _customerService.GetAsync(order.CustomerId, cancellationToken);
98
+
99
+ return new OrderSummary(order, customer);
100
+ }
101
+
102
+ // Bad: Blocking on async
103
+ public OrderSummary GetOrderSummary(Guid orderId)
104
+ {
105
+ var order = _repository.FindByIdAsync(orderId, CancellationToken.None).Result; // Deadlock risk
106
+ return new OrderSummary(order);
107
+ }
108
+ ```
109
+
110
+ ### Parallel Async Operations
111
+
112
+ ```csharp
113
+ // Good: Concurrent independent operations
114
+ public async Task<DashboardData> LoadDashboardAsync(CancellationToken cancellationToken)
115
+ {
116
+ var ordersTask = _orderService.GetRecentAsync(cancellationToken);
117
+ var metricsTask = _metricsService.GetCurrentAsync(cancellationToken);
118
+ var alertsTask = _alertService.GetActiveAsync(cancellationToken);
119
+
120
+ await Task.WhenAll(ordersTask, metricsTask, alertsTask);
121
+
122
+ return new DashboardData(
123
+ Orders: await ordersTask,
124
+ Metrics: await metricsTask,
125
+ Alerts: await alertsTask);
126
+ }
127
+ ```
128
+
129
+ ## Options Pattern
130
+
131
+ Bind configuration sections to strongly-typed objects.
132
+
133
+ ```csharp
134
+ public sealed class SmtpOptions
135
+ {
136
+ public const string SectionName = "Smtp";
137
+
138
+ public required string Host { get; init; }
139
+ public required int Port { get; init; }
140
+ public required string Username { get; init; }
141
+ public bool UseSsl { get; init; } = true;
142
+ }
143
+
144
+ // Registration
145
+ builder.Services.Configure<SmtpOptions>(
146
+ builder.Configuration.GetSection(SmtpOptions.SectionName));
147
+
148
+ // Usage via injection
149
+ public class EmailService(IOptions<SmtpOptions> options)
150
+ {
151
+ private readonly SmtpOptions _smtp = options.Value;
152
+ }
153
+ ```
154
+
155
+ ## Result Pattern
156
+
157
+ Return explicit success/failure instead of throwing for expected failures.
158
+
159
+ ```csharp
160
+ public sealed record Result<T>
161
+ {
162
+ public bool IsSuccess { get; }
163
+ public T? Value { get; }
164
+ public string? Error { get; }
165
+
166
+ private Result(T value) { IsSuccess = true; Value = value; }
167
+ private Result(string error) { IsSuccess = false; Error = error; }
168
+
169
+ public static Result<T> Success(T value) => new(value);
170
+ public static Result<T> Failure(string error) => new(error);
171
+ }
172
+
173
+ // Usage
174
+ public async Task<Result<Order>> PlaceOrderAsync(CreateOrderRequest request)
175
+ {
176
+ if (request.Items.Count == 0)
177
+ return Result<Order>.Failure("Order must contain at least one item");
178
+
179
+ var order = Order.Create(request);
180
+ await _repository.AddAsync(order, CancellationToken.None);
181
+ return Result<Order>.Success(order);
182
+ }
183
+ ```
184
+
185
+ ## Repository Pattern with EF Core
186
+
187
+ ```csharp
188
+ public sealed class SqlOrderRepository : IOrderRepository
189
+ {
190
+ private readonly AppDbContext _db;
191
+
192
+ public SqlOrderRepository(AppDbContext db) => _db = db;
193
+
194
+ public async Task<Order?> FindByIdAsync(Guid id, CancellationToken cancellationToken)
195
+ {
196
+ return await _db.Orders
197
+ .Include(o => o.Items)
198
+ .AsNoTracking()
199
+ .FirstOrDefaultAsync(o => o.Id == id, cancellationToken);
200
+ }
201
+
202
+ public async Task<IReadOnlyList<Order>> FindByCustomerAsync(
203
+ string customerId,
204
+ CancellationToken cancellationToken)
205
+ {
206
+ return await _db.Orders
207
+ .Where(o => o.CustomerId == customerId)
208
+ .OrderByDescending(o => o.CreatedAt)
209
+ .AsNoTracking()
210
+ .ToListAsync(cancellationToken);
211
+ }
212
+
213
+ public async Task AddAsync(Order order, CancellationToken cancellationToken)
214
+ {
215
+ _db.Orders.Add(order);
216
+ await _db.SaveChangesAsync(cancellationToken);
217
+ }
218
+ }
219
+ ```
220
+
221
+ ## Middleware and Pipeline
222
+
223
+ ```csharp
224
+ // Custom middleware
225
+ public sealed class RequestTimingMiddleware
226
+ {
227
+ private readonly RequestDelegate _next;
228
+ private readonly ILogger<RequestTimingMiddleware> _logger;
229
+
230
+ public RequestTimingMiddleware(RequestDelegate next, ILogger<RequestTimingMiddleware> logger)
231
+ {
232
+ _next = next;
233
+ _logger = logger;
234
+ }
235
+
236
+ public async Task InvokeAsync(HttpContext context)
237
+ {
238
+ var stopwatch = Stopwatch.StartNew();
239
+ try
240
+ {
241
+ await _next(context);
242
+ }
243
+ finally
244
+ {
245
+ stopwatch.Stop();
246
+ _logger.LogInformation(
247
+ "Request {Method} {Path} completed in {ElapsedMs}ms with status {StatusCode}",
248
+ context.Request.Method,
249
+ context.Request.Path,
250
+ stopwatch.ElapsedMilliseconds,
251
+ context.Response.StatusCode);
252
+ }
253
+ }
254
+ }
255
+ ```
256
+
257
+ ## Minimal API Patterns
258
+
259
+ ```csharp
260
+ // Organized with route groups
261
+ var orders = app.MapGroup("/api/orders")
262
+ .RequireAuthorization()
263
+ .WithTags("Orders");
264
+
265
+ orders.MapGet("/{id:guid}", async (
266
+ Guid id,
267
+ IOrderRepository repository,
268
+ CancellationToken cancellationToken) =>
269
+ {
270
+ var order = await repository.FindByIdAsync(id, cancellationToken);
271
+ return order is not null
272
+ ? TypedResults.Ok(order)
273
+ : TypedResults.NotFound();
274
+ });
275
+
276
+ orders.MapPost("/", async (
277
+ CreateOrderRequest request,
278
+ IOrderService service,
279
+ CancellationToken cancellationToken) =>
280
+ {
281
+ var result = await service.PlaceOrderAsync(request, cancellationToken);
282
+ return result.IsSuccess
283
+ ? TypedResults.Created($"/api/orders/{result.Value!.Id}", result.Value)
284
+ : TypedResults.BadRequest(result.Error);
285
+ });
286
+ ```
287
+
288
+ ## Guard Clauses
289
+
290
+ ```csharp
291
+ // Good: Early returns with clear validation
292
+ public async Task<ProcessResult> ProcessPaymentAsync(
293
+ PaymentRequest request,
294
+ CancellationToken cancellationToken)
295
+ {
296
+ ArgumentNullException.ThrowIfNull(request);
297
+
298
+ if (request.Amount <= 0)
299
+ throw new ArgumentOutOfRangeException(nameof(request.Amount), "Amount must be positive");
300
+
301
+ if (string.IsNullOrWhiteSpace(request.Currency))
302
+ throw new ArgumentException("Currency is required", nameof(request.Currency));
303
+
304
+ // Happy path continues here without nesting
305
+ var gateway = _gatewayFactory.Create(request.Currency);
306
+ return await gateway.ChargeAsync(request, cancellationToken);
307
+ }
308
+ ```
309
+
310
+ ## Anti-Patterns to Avoid
311
+
312
+ | Anti-Pattern | Fix |
313
+ |---|---|
314
+ | `async void` methods | Return `Task` (except event handlers) |
315
+ | `.Result` or `.Wait()` | Use `await` |
316
+ | `catch (Exception) { }` | Handle or rethrow with context |
317
+ | `new Service()` in constructors | Use constructor injection |
318
+ | `public` fields | Use properties with appropriate accessors |
319
+ | `dynamic` in business logic | Use generics or explicit types |
320
+ | Mutable `static` state | Use DI scoping or `ConcurrentDictionary` |
321
+ | `string.Format` in loops | Use `StringBuilder` or interpolated string handlers |
@@ -0,0 +1,326 @@
1
+ ---
2
+ name: e2e-testing
3
+ description: Playwright E2E testing patterns, Page Object Model, configuration, CI/CD integration, artifact management, and flaky test strategies.
4
+ origin: ECC
5
+ ---
6
+
7
+ # E2E Testing Patterns
8
+
9
+ Comprehensive Playwright patterns for building stable, fast, and maintainable E2E test suites.
10
+
11
+ ## Test File Organization
12
+
13
+ ```
14
+ tests/
15
+ ├── e2e/
16
+ │ ├── auth/
17
+ │ │ ├── login.spec.ts
18
+ │ │ ├── logout.spec.ts
19
+ │ │ └── register.spec.ts
20
+ │ ├── features/
21
+ │ │ ├── browse.spec.ts
22
+ │ │ ├── search.spec.ts
23
+ │ │ └── create.spec.ts
24
+ │ └── api/
25
+ │ └── endpoints.spec.ts
26
+ ├── fixtures/
27
+ │ ├── auth.ts
28
+ │ └── data.ts
29
+ └── playwright.config.ts
30
+ ```
31
+
32
+ ## Page Object Model (POM)
33
+
34
+ ```typescript
35
+ import { Page, Locator } from '@playwright/test'
36
+
37
+ export class ItemsPage {
38
+ readonly page: Page
39
+ readonly searchInput: Locator
40
+ readonly itemCards: Locator
41
+ readonly createButton: Locator
42
+
43
+ constructor(page: Page) {
44
+ this.page = page
45
+ this.searchInput = page.locator('[data-testid="search-input"]')
46
+ this.itemCards = page.locator('[data-testid="item-card"]')
47
+ this.createButton = page.locator('[data-testid="create-btn"]')
48
+ }
49
+
50
+ async goto() {
51
+ await this.page.goto('/items')
52
+ await this.page.waitForLoadState('networkidle')
53
+ }
54
+
55
+ async search(query: string) {
56
+ await this.searchInput.fill(query)
57
+ await this.page.waitForResponse(resp => resp.url().includes('/api/search'))
58
+ await this.page.waitForLoadState('networkidle')
59
+ }
60
+
61
+ async getItemCount() {
62
+ return await this.itemCards.count()
63
+ }
64
+ }
65
+ ```
66
+
67
+ ## Test Structure
68
+
69
+ ```typescript
70
+ import { test, expect } from '@playwright/test'
71
+ import { ItemsPage } from '../../pages/ItemsPage'
72
+
73
+ test.describe('Item Search', () => {
74
+ let itemsPage: ItemsPage
75
+
76
+ test.beforeEach(async ({ page }) => {
77
+ itemsPage = new ItemsPage(page)
78
+ await itemsPage.goto()
79
+ })
80
+
81
+ test('should search by keyword', async ({ page }) => {
82
+ await itemsPage.search('test')
83
+
84
+ const count = await itemsPage.getItemCount()
85
+ expect(count).toBeGreaterThan(0)
86
+
87
+ await expect(itemsPage.itemCards.first()).toContainText(/test/i)
88
+ await page.screenshot({ path: 'artifacts/search-results.png' })
89
+ })
90
+
91
+ test('should handle no results', async ({ page }) => {
92
+ await itemsPage.search('xyznonexistent123')
93
+
94
+ await expect(page.locator('[data-testid="no-results"]')).toBeVisible()
95
+ expect(await itemsPage.getItemCount()).toBe(0)
96
+ })
97
+ })
98
+ ```
99
+
100
+ ## Playwright Configuration
101
+
102
+ ```typescript
103
+ import { defineConfig, devices } from '@playwright/test'
104
+
105
+ export default defineConfig({
106
+ testDir: './tests/e2e',
107
+ fullyParallel: true,
108
+ forbidOnly: !!process.env.CI,
109
+ retries: process.env.CI ? 2 : 0,
110
+ workers: process.env.CI ? 1 : undefined,
111
+ reporter: [
112
+ ['html', { outputFolder: 'playwright-report' }],
113
+ ['junit', { outputFile: 'playwright-results.xml' }],
114
+ ['json', { outputFile: 'playwright-results.json' }]
115
+ ],
116
+ use: {
117
+ baseURL: process.env.BASE_URL || 'http://localhost:3000',
118
+ trace: 'on-first-retry',
119
+ screenshot: 'only-on-failure',
120
+ video: 'retain-on-failure',
121
+ actionTimeout: 10000,
122
+ navigationTimeout: 30000,
123
+ },
124
+ projects: [
125
+ { name: 'chromium', use: { ...devices['Desktop Chrome'] } },
126
+ { name: 'firefox', use: { ...devices['Desktop Firefox'] } },
127
+ { name: 'webkit', use: { ...devices['Desktop Safari'] } },
128
+ { name: 'mobile-chrome', use: { ...devices['Pixel 5'] } },
129
+ ],
130
+ webServer: {
131
+ command: 'npm run dev',
132
+ url: 'http://localhost:3000',
133
+ reuseExistingServer: !process.env.CI,
134
+ timeout: 120000,
135
+ },
136
+ })
137
+ ```
138
+
139
+ ## Flaky Test Patterns
140
+
141
+ ### Quarantine
142
+
143
+ ```typescript
144
+ test('flaky: complex search', async ({ page }) => {
145
+ test.fixme(true, 'Flaky - Issue #123')
146
+ // test code...
147
+ })
148
+
149
+ test('conditional skip', async ({ page }) => {
150
+ test.skip(process.env.CI, 'Flaky in CI - Issue #123')
151
+ // test code...
152
+ })
153
+ ```
154
+
155
+ ### Identify Flakiness
156
+
157
+ ```bash
158
+ npx playwright test tests/search.spec.ts --repeat-each=10
159
+ npx playwright test tests/search.spec.ts --retries=3
160
+ ```
161
+
162
+ ### Common Causes & Fixes
163
+
164
+ **Race conditions:**
165
+ ```typescript
166
+ // Bad: assumes element is ready
167
+ await page.click('[data-testid="button"]')
168
+
169
+ // Good: auto-wait locator
170
+ await page.locator('[data-testid="button"]').click()
171
+ ```
172
+
173
+ **Network timing:**
174
+ ```typescript
175
+ // Bad: arbitrary timeout
176
+ await page.waitForTimeout(5000)
177
+
178
+ // Good: wait for specific condition
179
+ await page.waitForResponse(resp => resp.url().includes('/api/data'))
180
+ ```
181
+
182
+ **Animation timing:**
183
+ ```typescript
184
+ // Bad: click during animation
185
+ await page.click('[data-testid="menu-item"]')
186
+
187
+ // Good: wait for stability
188
+ await page.locator('[data-testid="menu-item"]').waitFor({ state: 'visible' })
189
+ await page.waitForLoadState('networkidle')
190
+ await page.locator('[data-testid="menu-item"]').click()
191
+ ```
192
+
193
+ ## Artifact Management
194
+
195
+ ### Screenshots
196
+
197
+ ```typescript
198
+ await page.screenshot({ path: 'artifacts/after-login.png' })
199
+ await page.screenshot({ path: 'artifacts/full-page.png', fullPage: true })
200
+ await page.locator('[data-testid="chart"]').screenshot({ path: 'artifacts/chart.png' })
201
+ ```
202
+
203
+ ### Traces
204
+
205
+ ```typescript
206
+ await browser.startTracing(page, {
207
+ path: 'artifacts/trace.json',
208
+ screenshots: true,
209
+ snapshots: true,
210
+ })
211
+ // ... test actions ...
212
+ await browser.stopTracing()
213
+ ```
214
+
215
+ ### Video
216
+
217
+ ```typescript
218
+ // In playwright.config.ts
219
+ use: {
220
+ video: 'retain-on-failure',
221
+ videosPath: 'artifacts/videos/'
222
+ }
223
+ ```
224
+
225
+ ## CI/CD Integration
226
+
227
+ ```yaml
228
+ # .github/workflows/e2e.yml
229
+ name: E2E Tests
230
+ on: [push, pull_request]
231
+
232
+ jobs:
233
+ test:
234
+ runs-on: ubuntu-latest
235
+ steps:
236
+ - uses: actions/checkout@v4
237
+ - uses: actions/setup-node@v4
238
+ with:
239
+ node-version: 20
240
+ - run: npm ci
241
+ - run: npx playwright install --with-deps
242
+ - run: npx playwright test
243
+ env:
244
+ BASE_URL: ${{ vars.STAGING_URL }}
245
+ - uses: actions/upload-artifact@v4
246
+ if: always()
247
+ with:
248
+ name: playwright-report
249
+ path: playwright-report/
250
+ retention-days: 30
251
+ ```
252
+
253
+ ## Test Report Template
254
+
255
+ ```markdown
256
+ # E2E Test Report
257
+
258
+ **Date:** YYYY-MM-DD HH:MM
259
+ **Duration:** Xm Ys
260
+ **Status:** PASSING / FAILING
261
+
262
+ ## Summary
263
+ - Total: X | Passed: Y (Z%) | Failed: A | Flaky: B | Skipped: C
264
+
265
+ ## Failed Tests
266
+
267
+ ### test-name
268
+ **File:** `tests/e2e/feature.spec.ts:45`
269
+ **Error:** Expected element to be visible
270
+ **Screenshot:** artifacts/failed.png
271
+ **Recommended Fix:** [description]
272
+
273
+ ## Artifacts
274
+ - HTML Report: playwright-report/index.html
275
+ - Screenshots: artifacts/*.png
276
+ - Videos: artifacts/videos/*.webm
277
+ - Traces: artifacts/*.zip
278
+ ```
279
+
280
+ ## Wallet / Web3 Testing
281
+
282
+ ```typescript
283
+ test('wallet connection', async ({ page, context }) => {
284
+ // Mock wallet provider
285
+ await context.addInitScript(() => {
286
+ window.ethereum = {
287
+ isMetaMask: true,
288
+ request: async ({ method }) => {
289
+ if (method === 'eth_requestAccounts')
290
+ return ['0x1234567890123456789012345678901234567890']
291
+ if (method === 'eth_chainId') return '0x1'
292
+ }
293
+ }
294
+ })
295
+
296
+ await page.goto('/')
297
+ await page.locator('[data-testid="connect-wallet"]').click()
298
+ await expect(page.locator('[data-testid="wallet-address"]')).toContainText('0x1234')
299
+ })
300
+ ```
301
+
302
+ ## Financial / Critical Flow Testing
303
+
304
+ ```typescript
305
+ test('trade execution', async ({ page }) => {
306
+ // Skip on production — real money
307
+ test.skip(process.env.NODE_ENV === 'production', 'Skip on production')
308
+
309
+ await page.goto('/markets/test-market')
310
+ await page.locator('[data-testid="position-yes"]').click()
311
+ await page.locator('[data-testid="trade-amount"]').fill('1.0')
312
+
313
+ // Verify preview
314
+ const preview = page.locator('[data-testid="trade-preview"]')
315
+ await expect(preview).toContainText('1.0')
316
+
317
+ // Confirm and wait for blockchain
318
+ await page.locator('[data-testid="confirm-trade"]').click()
319
+ await page.waitForResponse(
320
+ resp => resp.url().includes('/api/trade') && resp.status() === 200,
321
+ { timeout: 30000 }
322
+ )
323
+
324
+ await expect(page.locator('[data-testid="trade-success"]')).toBeVisible()
325
+ })
326
+ ```