@heytherevibin/skillforge 0.2.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 (402) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/CODE_OF_CONDUCT.md +34 -0
  3. package/CONTRIBUTING.md +38 -0
  4. package/LICENSE +21 -0
  5. package/README.md +337 -0
  6. package/RELEASING.md +93 -0
  7. package/SECURITY.md +31 -0
  8. package/STRATEGY.md +26 -0
  9. package/bin/cli.js +547 -0
  10. package/lib/packs.js +184 -0
  11. package/package.json +38 -0
  12. package/python/app/__init__.py +0 -0
  13. package/python/app/__pycache__/__init__.cpython-312.pyc +0 -0
  14. package/python/app/__pycache__/auth.cpython-312.pyc +0 -0
  15. package/python/app/__pycache__/main.cpython-312.pyc +0 -0
  16. package/python/app/auth.py +63 -0
  17. package/python/app/cli.py +78 -0
  18. package/python/app/db_paths.py +26 -0
  19. package/python/app/events_cli.py +175 -0
  20. package/python/app/main.py +647 -0
  21. package/python/app/materialize.py +138 -0
  22. package/python/app/mcp_server.py +610 -0
  23. package/python/app/route_cli.py +117 -0
  24. package/python/requirements-dev.txt +1 -0
  25. package/python/requirements.txt +7 -0
  26. package/python/tests/test_db_paths.py +41 -0
  27. package/skills/accessibility/SKILL.md +145 -0
  28. package/skills/agent-architecture-audit/SKILL.md +256 -0
  29. package/skills/agent-eval/SKILL.md +144 -0
  30. package/skills/agent-harness-construction/SKILL.md +72 -0
  31. package/skills/agent-introspection-debugging/SKILL.md +152 -0
  32. package/skills/agent-payment-x402/SKILL.md +224 -0
  33. package/skills/agent-sort/SKILL.md +214 -0
  34. package/skills/agentic-engineering/SKILL.md +62 -0
  35. package/skills/agentic-os/SKILL.md +386 -0
  36. package/skills/ai-first-engineering/SKILL.md +50 -0
  37. package/skills/ai-regression-testing/SKILL.md +384 -0
  38. package/skills/android-clean-architecture/SKILL.md +338 -0
  39. package/skills/angular-developer/SKILL.md +153 -0
  40. package/skills/angular-developer/references/angular-animations.md +160 -0
  41. package/skills/angular-developer/references/angular-aria.md +410 -0
  42. package/skills/angular-developer/references/cli.md +86 -0
  43. package/skills/angular-developer/references/component-harnesses.md +59 -0
  44. package/skills/angular-developer/references/component-styling.md +91 -0
  45. package/skills/angular-developer/references/components.md +117 -0
  46. package/skills/angular-developer/references/creating-services.md +97 -0
  47. package/skills/angular-developer/references/data-resolvers.md +69 -0
  48. package/skills/angular-developer/references/define-routes.md +67 -0
  49. package/skills/angular-developer/references/defining-providers.md +72 -0
  50. package/skills/angular-developer/references/di-fundamentals.md +120 -0
  51. package/skills/angular-developer/references/e2e-testing.md +56 -0
  52. package/skills/angular-developer/references/effects.md +83 -0
  53. package/skills/angular-developer/references/hierarchical-injectors.md +43 -0
  54. package/skills/angular-developer/references/host-elements.md +80 -0
  55. package/skills/angular-developer/references/injection-context.md +63 -0
  56. package/skills/angular-developer/references/inputs.md +101 -0
  57. package/skills/angular-developer/references/linked-signal.md +59 -0
  58. package/skills/angular-developer/references/loading-strategies.md +61 -0
  59. package/skills/angular-developer/references/mcp.md +108 -0
  60. package/skills/angular-developer/references/navigate-to-routes.md +69 -0
  61. package/skills/angular-developer/references/outputs.md +86 -0
  62. package/skills/angular-developer/references/reactive-forms.md +122 -0
  63. package/skills/angular-developer/references/rendering-strategies.md +44 -0
  64. package/skills/angular-developer/references/resource.md +77 -0
  65. package/skills/angular-developer/references/route-animations.md +56 -0
  66. package/skills/angular-developer/references/route-guards.md +52 -0
  67. package/skills/angular-developer/references/router-lifecycle.md +45 -0
  68. package/skills/angular-developer/references/router-testing.md +87 -0
  69. package/skills/angular-developer/references/show-routes-with-outlets.md +68 -0
  70. package/skills/angular-developer/references/signal-forms.md +795 -0
  71. package/skills/angular-developer/references/signals-overview.md +94 -0
  72. package/skills/angular-developer/references/tailwind-css.md +69 -0
  73. package/skills/angular-developer/references/template-driven-forms.md +114 -0
  74. package/skills/angular-developer/references/testing-fundamentals.md +65 -0
  75. package/skills/api-connector-builder/SKILL.md +120 -0
  76. package/skills/api-design/SKILL.md +522 -0
  77. package/skills/architecture-decision-records/SKILL.md +178 -0
  78. package/skills/article-writing/SKILL.md +78 -0
  79. package/skills/automation-audit-ops/SKILL.md +141 -0
  80. package/skills/autonomous-agent-harness/SKILL.md +272 -0
  81. package/skills/autonomous-loops/SKILL.md +609 -0
  82. package/skills/backend-patterns/SKILL.md +560 -0
  83. package/skills/benchmark/SKILL.md +92 -0
  84. package/skills/blueprint/SKILL.md +104 -0
  85. package/skills/browser-qa/SKILL.md +86 -0
  86. package/skills/bun-runtime/SKILL.md +83 -0
  87. package/skills/canary-watch/SKILL.md +98 -0
  88. package/skills/carrier-relationship-management/SKILL.md +211 -0
  89. package/skills/cisco-ios-patterns/SKILL.md +163 -0
  90. package/skills/ck/SKILL.md +147 -0
  91. package/skills/ck/commands/forget.mjs +44 -0
  92. package/skills/ck/commands/info.mjs +24 -0
  93. package/skills/ck/commands/init.mjs +143 -0
  94. package/skills/ck/commands/list.mjs +40 -0
  95. package/skills/ck/commands/migrate.mjs +202 -0
  96. package/skills/ck/commands/resume.mjs +36 -0
  97. package/skills/ck/commands/save.mjs +210 -0
  98. package/skills/ck/commands/shared.mjs +387 -0
  99. package/skills/ck/hooks/session-start.mjs +224 -0
  100. package/skills/claude-devfleet/SKILL.md +103 -0
  101. package/skills/click-path-audit/SKILL.md +244 -0
  102. package/skills/clickhouse-io/SKILL.md +438 -0
  103. package/skills/code-tour/SKILL.md +235 -0
  104. package/skills/codebase-onboarding/SKILL.md +232 -0
  105. package/skills/coding-standards/SKILL.md +548 -0
  106. package/skills/compose-multiplatform-patterns/SKILL.md +298 -0
  107. package/skills/connections-optimizer/SKILL.md +188 -0
  108. package/skills/content-engine/SKILL.md +126 -0
  109. package/skills/content-hash-cache-pattern/SKILL.md +160 -0
  110. package/skills/context-budget/SKILL.md +134 -0
  111. package/skills/continuous-agent-loop/SKILL.md +44 -0
  112. package/skills/continuous-learning/SKILL.md +129 -0
  113. package/skills/continuous-learning/config.json +18 -0
  114. package/skills/continuous-learning/evaluate-session.sh +69 -0
  115. package/skills/continuous-learning-v2/SKILL.md +358 -0
  116. package/skills/continuous-learning-v2/agents/observer-loop.sh +322 -0
  117. package/skills/continuous-learning-v2/agents/observer.md +198 -0
  118. package/skills/continuous-learning-v2/agents/session-guardian.sh +150 -0
  119. package/skills/continuous-learning-v2/agents/start-observer.sh +248 -0
  120. package/skills/continuous-learning-v2/config.json +8 -0
  121. package/skills/continuous-learning-v2/hooks/observe.sh +476 -0
  122. package/skills/continuous-learning-v2/scripts/detect-project.sh +288 -0
  123. package/skills/continuous-learning-v2/scripts/instinct-cli.py +1519 -0
  124. package/skills/continuous-learning-v2/scripts/lib/homunculus-dir.sh +31 -0
  125. package/skills/continuous-learning-v2/scripts/migrate-homunculus.sh +62 -0
  126. package/skills/continuous-learning-v2/scripts/test_parse_instinct.py +1018 -0
  127. package/skills/cost-aware-llm-pipeline/SKILL.md +182 -0
  128. package/skills/cost-tracking/SKILL.md +147 -0
  129. package/skills/council/SKILL.md +202 -0
  130. package/skills/cpp-coding-standards/SKILL.md +722 -0
  131. package/skills/cpp-testing/SKILL.md +323 -0
  132. package/skills/crosspost/SKILL.md +110 -0
  133. package/skills/csharp-testing/SKILL.md +320 -0
  134. package/skills/customer-billing-ops/SKILL.md +139 -0
  135. package/skills/customs-trade-compliance/SKILL.md +262 -0
  136. package/skills/dart-flutter-patterns/SKILL.md +562 -0
  137. package/skills/dashboard-builder/SKILL.md +108 -0
  138. package/skills/data-scraper-agent/SKILL.md +764 -0
  139. package/skills/database-migrations/SKILL.md +428 -0
  140. package/skills/deep-research/SKILL.md +158 -0
  141. package/skills/defi-amm-security/SKILL.md +166 -0
  142. package/skills/deployment-patterns/SKILL.md +426 -0
  143. package/skills/design-system/SKILL.md +81 -0
  144. package/skills/django-celery/SKILL.md +456 -0
  145. package/skills/django-patterns/SKILL.md +733 -0
  146. package/skills/django-security/SKILL.md +592 -0
  147. package/skills/django-tdd/SKILL.md +728 -0
  148. package/skills/django-verification/SKILL.md +468 -0
  149. package/skills/dmux-workflows/SKILL.md +190 -0
  150. package/skills/docker-patterns/SKILL.md +363 -0
  151. package/skills/documentation-lookup/SKILL.md +89 -0
  152. package/skills/dotnet-patterns/SKILL.md +320 -0
  153. package/skills/e2e-testing/SKILL.md +325 -0
  154. package/skills/email-ops/SKILL.md +120 -0
  155. package/skills/energy-procurement/SKILL.md +227 -0
  156. package/skills/enterprise-agent-ops/SKILL.md +49 -0
  157. package/skills/error-handling/SKILL.md +375 -0
  158. package/skills/eval-harness/SKILL.md +269 -0
  159. package/skills/evm-token-decimals/SKILL.md +130 -0
  160. package/skills/exa-search/SKILL.md +106 -0
  161. package/skills/fal-ai-media/SKILL.md +287 -0
  162. package/skills/fastapi-patterns/SKILL.md +327 -0
  163. package/skills/finance-billing-ops/SKILL.md +126 -0
  164. package/skills/flox-environments/SKILL.md +496 -0
  165. package/skills/flutter-dart-code-review/SKILL.md +434 -0
  166. package/skills/foundation-models-on-device/SKILL.md +243 -0
  167. package/skills/frontend-design-direction/SKILL.md +92 -0
  168. package/skills/frontend-patterns/SKILL.md +641 -0
  169. package/skills/frontend-slides/SKILL.md +183 -0
  170. package/skills/frontend-slides/STYLE_PRESETS.md +330 -0
  171. package/skills/frontend-slides/animation-patterns.md +122 -0
  172. package/skills/frontend-slides/html-template.md +419 -0
  173. package/skills/frontend-slides/scripts/export-pdf.sh +418 -0
  174. package/skills/frontend-slides/scripts/extract-pptx.py +96 -0
  175. package/skills/frontend-slides/viewport-base.css +153 -0
  176. package/skills/fsharp-testing/SKILL.md +279 -0
  177. package/skills/gan-style-harness/SKILL.md +278 -0
  178. package/skills/gateguard/SKILL.md +125 -0
  179. package/skills/git-workflow/SKILL.md +714 -0
  180. package/skills/github-ops/SKILL.md +143 -0
  181. package/skills/golang-patterns/SKILL.md +673 -0
  182. package/skills/golang-testing/SKILL.md +719 -0
  183. package/skills/google-workspace-ops/SKILL.md +94 -0
  184. package/skills/healthcare-cdss-patterns/SKILL.md +245 -0
  185. package/skills/healthcare-emr-patterns/SKILL.md +159 -0
  186. package/skills/healthcare-eval-harness/SKILL.md +207 -0
  187. package/skills/healthcare-phi-compliance/SKILL.md +145 -0
  188. package/skills/hermes-imports/SKILL.md +87 -0
  189. package/skills/hexagonal-architecture/SKILL.md +275 -0
  190. package/skills/hipaa-compliance/SKILL.md +78 -0
  191. package/skills/homelab-network-readiness/SKILL.md +169 -0
  192. package/skills/homelab-network-setup/SKILL.md +129 -0
  193. package/skills/homelab-pihole-dns/SKILL.md +274 -0
  194. package/skills/homelab-vlan-segmentation/SKILL.md +311 -0
  195. package/skills/homelab-wireguard-vpn/SKILL.md +305 -0
  196. package/skills/hookify-rules/SKILL.md +128 -0
  197. package/skills/inventory-demand-planning/SKILL.md +246 -0
  198. package/skills/investor-materials/SKILL.md +95 -0
  199. package/skills/investor-outreach/SKILL.md +90 -0
  200. package/skills/ios-icon-gen/SKILL.md +157 -0
  201. package/skills/ios-icon-gen/scripts/generate_icons.swift +258 -0
  202. package/skills/ios-icon-gen/scripts/iconify_gen.sh +235 -0
  203. package/skills/iterative-retrieval/SKILL.md +209 -0
  204. package/skills/java-coding-standards/SKILL.md +382 -0
  205. package/skills/jira-integration/SKILL.md +292 -0
  206. package/skills/jpa-patterns/SKILL.md +150 -0
  207. package/skills/knowledge-ops/SKILL.md +153 -0
  208. package/skills/kotlin-coroutines-flows/SKILL.md +283 -0
  209. package/skills/kotlin-exposed-patterns/SKILL.md +718 -0
  210. package/skills/kotlin-ktor-patterns/SKILL.md +688 -0
  211. package/skills/kotlin-patterns/SKILL.md +710 -0
  212. package/skills/kotlin-testing/SKILL.md +823 -0
  213. package/skills/laravel-patterns/SKILL.md +414 -0
  214. package/skills/laravel-plugin-discovery/SKILL.md +228 -0
  215. package/skills/laravel-security/SKILL.md +284 -0
  216. package/skills/laravel-tdd/SKILL.md +282 -0
  217. package/skills/laravel-verification/SKILL.md +178 -0
  218. package/skills/lead-intelligence/SKILL.md +320 -0
  219. package/skills/lead-intelligence/agents/enrichment-agent.md +85 -0
  220. package/skills/lead-intelligence/agents/mutual-mapper.md +75 -0
  221. package/skills/lead-intelligence/agents/outreach-drafter.md +98 -0
  222. package/skills/lead-intelligence/agents/signal-scorer.md +60 -0
  223. package/skills/liquid-glass-design/SKILL.md +279 -0
  224. package/skills/llm-trading-agent-security/SKILL.md +146 -0
  225. package/skills/logistics-exception-management/SKILL.md +221 -0
  226. package/skills/make-interfaces-feel-better/SKILL.md +151 -0
  227. package/skills/manim-video/SKILL.md +88 -0
  228. package/skills/manim-video/assets/network_graph_scene.py +52 -0
  229. package/skills/market-research/SKILL.md +74 -0
  230. package/skills/mcp-server-patterns/SKILL.md +68 -0
  231. package/skills/messages-ops/SKILL.md +103 -0
  232. package/skills/mle-workflow/SKILL.md +345 -0
  233. package/skills/motion-advanced/SKILL.md +596 -0
  234. package/skills/motion-foundations/SKILL.md +299 -0
  235. package/skills/motion-patterns/SKILL.md +435 -0
  236. package/skills/motion-ui/SKILL.md +574 -0
  237. package/skills/mysql-patterns/SKILL.md +411 -0
  238. package/skills/nanoclaw-repl/SKILL.md +32 -0
  239. package/skills/nestjs-patterns/SKILL.md +229 -0
  240. package/skills/netmiko-ssh-automation/SKILL.md +173 -0
  241. package/skills/network-bgp-diagnostics/SKILL.md +167 -0
  242. package/skills/network-config-validation/SKILL.md +210 -0
  243. package/skills/network-interface-health/SKILL.md +152 -0
  244. package/skills/nextjs-turbopack/SKILL.md +43 -0
  245. package/skills/nodejs-keccak256/SKILL.md +102 -0
  246. package/skills/nutrient-document-processing/SKILL.md +166 -0
  247. package/skills/nuxt4-patterns/SKILL.md +99 -0
  248. package/skills/openclaw-persona-forge/SKILL.md +288 -0
  249. package/skills/openclaw-persona-forge/gacha.py +224 -0
  250. package/skills/openclaw-persona-forge/gacha.sh +5 -0
  251. package/skills/openclaw-persona-forge/references/avatar-style.md +124 -0
  252. package/skills/openclaw-persona-forge/references/boundary-rules.md +53 -0
  253. package/skills/openclaw-persona-forge/references/error-handling.md +53 -0
  254. package/skills/openclaw-persona-forge/references/identity-tension.md +48 -0
  255. package/skills/openclaw-persona-forge/references/naming-system.md +39 -0
  256. package/skills/openclaw-persona-forge/references/output-template.md +166 -0
  257. package/skills/opensource-pipeline/SKILL.md +254 -0
  258. package/skills/perl-patterns/SKILL.md +503 -0
  259. package/skills/perl-security/SKILL.md +502 -0
  260. package/skills/perl-testing/SKILL.md +474 -0
  261. package/skills/plan-orchestrate/SKILL.md +253 -0
  262. package/skills/plankton-code-quality/SKILL.md +236 -0
  263. package/skills/postgres-patterns/SKILL.md +146 -0
  264. package/skills/product-capability/SKILL.md +140 -0
  265. package/skills/product-lens/SKILL.md +91 -0
  266. package/skills/production-audit/SKILL.md +206 -0
  267. package/skills/production-scheduling/SKILL.md +237 -0
  268. package/skills/project-flow-ops/SKILL.md +110 -0
  269. package/skills/prompt-optimizer/SKILL.md +398 -0
  270. package/skills/python-patterns/SKILL.md +749 -0
  271. package/skills/python-testing/SKILL.md +815 -0
  272. package/skills/pytorch-patterns/SKILL.md +395 -0
  273. package/skills/quality-nonconformance/SKILL.md +259 -0
  274. package/skills/quarkus-patterns/SKILL.md +721 -0
  275. package/skills/quarkus-security/SKILL.md +466 -0
  276. package/skills/quarkus-tdd/SKILL.md +810 -0
  277. package/skills/quarkus-verification/SKILL.md +478 -0
  278. package/skills/ralphinho-rfc-pipeline/SKILL.md +66 -0
  279. package/skills/redis-patterns/SKILL.md +402 -0
  280. package/skills/regex-vs-llm-structured-text/SKILL.md +219 -0
  281. package/skills/remotion-video-creation/SKILL.md +43 -0
  282. package/skills/remotion-video-creation/rules/3d.md +86 -0
  283. package/skills/remotion-video-creation/rules/animations.md +29 -0
  284. package/skills/remotion-video-creation/rules/assets/charts-bar-chart.tsx +173 -0
  285. package/skills/remotion-video-creation/rules/assets/text-animations-typewriter.tsx +100 -0
  286. package/skills/remotion-video-creation/rules/assets/text-animations-word-highlight.tsx +108 -0
  287. package/skills/remotion-video-creation/rules/assets.md +78 -0
  288. package/skills/remotion-video-creation/rules/audio.md +172 -0
  289. package/skills/remotion-video-creation/rules/calculate-metadata.md +104 -0
  290. package/skills/remotion-video-creation/rules/can-decode.md +75 -0
  291. package/skills/remotion-video-creation/rules/charts.md +58 -0
  292. package/skills/remotion-video-creation/rules/compositions.md +146 -0
  293. package/skills/remotion-video-creation/rules/display-captions.md +126 -0
  294. package/skills/remotion-video-creation/rules/extract-frames.md +229 -0
  295. package/skills/remotion-video-creation/rules/fonts.md +152 -0
  296. package/skills/remotion-video-creation/rules/get-audio-duration.md +58 -0
  297. package/skills/remotion-video-creation/rules/get-video-dimensions.md +68 -0
  298. package/skills/remotion-video-creation/rules/get-video-duration.md +58 -0
  299. package/skills/remotion-video-creation/rules/gifs.md +138 -0
  300. package/skills/remotion-video-creation/rules/images.md +130 -0
  301. package/skills/remotion-video-creation/rules/import-srt-captions.md +67 -0
  302. package/skills/remotion-video-creation/rules/lottie.md +67 -0
  303. package/skills/remotion-video-creation/rules/measuring-dom-nodes.md +34 -0
  304. package/skills/remotion-video-creation/rules/measuring-text.md +143 -0
  305. package/skills/remotion-video-creation/rules/sequencing.md +106 -0
  306. package/skills/remotion-video-creation/rules/tailwind.md +11 -0
  307. package/skills/remotion-video-creation/rules/text-animations.md +20 -0
  308. package/skills/remotion-video-creation/rules/timing.md +179 -0
  309. package/skills/remotion-video-creation/rules/transcribe-captions.md +19 -0
  310. package/skills/remotion-video-creation/rules/transitions.md +122 -0
  311. package/skills/remotion-video-creation/rules/trimming.md +52 -0
  312. package/skills/remotion-video-creation/rules/videos.md +171 -0
  313. package/skills/repo-scan/SKILL.md +78 -0
  314. package/skills/research-ops/SKILL.md +111 -0
  315. package/skills/returns-reverse-logistics/SKILL.md +239 -0
  316. package/skills/rules-distill/SKILL.md +263 -0
  317. package/skills/rules-distill/scripts/scan-rules.sh +58 -0
  318. package/skills/rules-distill/scripts/scan-skills.sh +129 -0
  319. package/skills/rust-patterns/SKILL.md +498 -0
  320. package/skills/rust-testing/SKILL.md +499 -0
  321. package/skills/safety-guard/SKILL.md +74 -0
  322. package/skills/santa-method/SKILL.md +306 -0
  323. package/skills/scientific-db-pubmed-database/SKILL.md +175 -0
  324. package/skills/scientific-db-uspto-database/SKILL.md +177 -0
  325. package/skills/scientific-pkg-gget/SKILL.md +166 -0
  326. package/skills/scientific-thinking-literature-review/SKILL.md +192 -0
  327. package/skills/scientific-thinking-scholar-evaluation/SKILL.md +160 -0
  328. package/skills/search-first/SKILL.md +181 -0
  329. package/skills/security-bounty-hunter/SKILL.md +99 -0
  330. package/skills/security-review/SKILL.md +502 -0
  331. package/skills/security-review/cloud-infrastructure-security.md +361 -0
  332. package/skills/seo/SKILL.md +153 -0
  333. package/skills/skill-comply/SKILL.md +57 -0
  334. package/skills/skill-comply/fixtures/compliant_trace.jsonl +5 -0
  335. package/skills/skill-comply/fixtures/noncompliant_trace.jsonl +3 -0
  336. package/skills/skill-comply/fixtures/tdd_spec.yaml +44 -0
  337. package/skills/skill-comply/prompts/classifier.md +24 -0
  338. package/skills/skill-comply/prompts/scenario_generator.md +62 -0
  339. package/skills/skill-comply/prompts/spec_generator.md +42 -0
  340. package/skills/skill-comply/pyproject.toml +15 -0
  341. package/skills/skill-comply/scripts/__init__.py +0 -0
  342. package/skills/skill-comply/scripts/classifier.py +85 -0
  343. package/skills/skill-comply/scripts/grader.py +124 -0
  344. package/skills/skill-comply/scripts/parser.py +107 -0
  345. package/skills/skill-comply/scripts/report.py +170 -0
  346. package/skills/skill-comply/scripts/run.py +127 -0
  347. package/skills/skill-comply/scripts/runner.py +186 -0
  348. package/skills/skill-comply/scripts/scenario_generator.py +70 -0
  349. package/skills/skill-comply/scripts/spec_generator.py +72 -0
  350. package/skills/skill-comply/scripts/utils.py +13 -0
  351. package/skills/skill-comply/tests/test_grader.py +197 -0
  352. package/skills/skill-comply/tests/test_parser.py +90 -0
  353. package/skills/skill-comply/tests/test_runner.py +172 -0
  354. package/skills/skill-scout/SKILL.md +139 -0
  355. package/skills/skill-stocktake/SKILL.md +193 -0
  356. package/skills/skill-stocktake/scripts/quick-diff.sh +87 -0
  357. package/skills/skill-stocktake/scripts/save-results.sh +56 -0
  358. package/skills/skill-stocktake/scripts/scan.sh +170 -0
  359. package/skills/social-graph-ranker/SKILL.md +153 -0
  360. package/skills/springboot-patterns/SKILL.md +313 -0
  361. package/skills/springboot-security/SKILL.md +271 -0
  362. package/skills/springboot-tdd/SKILL.md +157 -0
  363. package/skills/springboot-verification/SKILL.md +230 -0
  364. package/skills/strategic-compact/SKILL.md +129 -0
  365. package/skills/strategic-compact/suggest-compact.sh +54 -0
  366. package/skills/swift-actor-persistence/SKILL.md +142 -0
  367. package/skills/swift-concurrency-6-2/SKILL.md +216 -0
  368. package/skills/swift-protocol-di-testing/SKILL.md +189 -0
  369. package/skills/swiftui-patterns/SKILL.md +259 -0
  370. package/skills/tdd-workflow/SKILL.md +462 -0
  371. package/skills/team-builder/SKILL.md +166 -0
  372. package/skills/terminal-ops/SKILL.md +108 -0
  373. package/skills/tinystruct-patterns/SKILL.md +130 -0
  374. package/skills/tinystruct-patterns/references/architecture.md +77 -0
  375. package/skills/tinystruct-patterns/references/data-handling.md +35 -0
  376. package/skills/tinystruct-patterns/references/routing.md +57 -0
  377. package/skills/tinystruct-patterns/references/system-usage.md +74 -0
  378. package/skills/tinystruct-patterns/references/testing.md +59 -0
  379. package/skills/token-budget-advisor/SKILL.md +133 -0
  380. package/skills/ui-demo/SKILL.md +464 -0
  381. package/skills/ui-to-vue/SKILL.md +134 -0
  382. package/skills/unified-notifications-ops/SKILL.md +186 -0
  383. package/skills/verification-loop/SKILL.md +125 -0
  384. package/skills/video-editing/SKILL.md +309 -0
  385. package/skills/videodb/SKILL.md +373 -0
  386. package/skills/videodb/reference/api-reference.md +550 -0
  387. package/skills/videodb/reference/capture-reference.md +407 -0
  388. package/skills/videodb/reference/capture.md +101 -0
  389. package/skills/videodb/reference/editor.md +443 -0
  390. package/skills/videodb/reference/generative.md +331 -0
  391. package/skills/videodb/reference/rtstream-reference.md +564 -0
  392. package/skills/videodb/reference/rtstream.md +65 -0
  393. package/skills/videodb/reference/search.md +230 -0
  394. package/skills/videodb/reference/streaming.md +406 -0
  395. package/skills/videodb/reference/use-cases.md +118 -0
  396. package/skills/videodb/scripts/ws_listener.py +282 -0
  397. package/skills/visa-doc-translate/README.md +86 -0
  398. package/skills/visa-doc-translate/SKILL.md +117 -0
  399. package/skills/vite-patterns/SKILL.md +448 -0
  400. package/skills/windows-desktop-e2e/SKILL.md +787 -0
  401. package/skills/workspace-surface-audit/SKILL.md +124 -0
  402. package/skills/x-api/SKILL.md +233 -0
@@ -0,0 +1,150 @@
1
+ ---
2
+ name: jpa-patterns
3
+ description: JPA/Hibernate patterns for entity design, relationships, query optimization, transactions, auditing, indexing, pagination, and pooling in Spring Boot.
4
+ ---
5
+
6
+ # JPA/Hibernate Patterns
7
+
8
+ Use for data modeling, repositories, and performance tuning in Spring Boot.
9
+
10
+ ## When to Activate
11
+
12
+ - Designing JPA entities and table mappings
13
+ - Defining relationships (@OneToMany, @ManyToOne, @ManyToMany)
14
+ - Optimizing queries (N+1 prevention, fetch strategies, projections)
15
+ - Configuring transactions, auditing, or soft deletes
16
+ - Setting up pagination, sorting, or custom repository methods
17
+ - Tuning connection pooling (HikariCP) or second-level caching
18
+
19
+ ## Entity Design
20
+
21
+ ```java
22
+ @Entity
23
+ @Table(name = "markets", indexes = {
24
+ @Index(name = "idx_markets_slug", columnList = "slug", unique = true)
25
+ })
26
+ @EntityListeners(AuditingEntityListener.class)
27
+ public class MarketEntity {
28
+ @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
29
+ private Long id;
30
+
31
+ @Column(nullable = false, length = 200)
32
+ private String name;
33
+
34
+ @Column(nullable = false, unique = true, length = 120)
35
+ private String slug;
36
+
37
+ @Enumerated(EnumType.STRING)
38
+ private MarketStatus status = MarketStatus.ACTIVE;
39
+
40
+ @CreatedDate private Instant createdAt;
41
+ @LastModifiedDate private Instant updatedAt;
42
+ }
43
+ ```
44
+
45
+ Enable auditing:
46
+ ```java
47
+ @Configuration
48
+ @EnableJpaAuditing
49
+ class JpaConfig {}
50
+ ```
51
+
52
+ ## Relationships and N+1 Prevention
53
+
54
+ ```java
55
+ @OneToMany(mappedBy = "market", cascade = CascadeType.ALL, orphanRemoval = true)
56
+ private List<PositionEntity> positions = new ArrayList<>();
57
+ ```
58
+
59
+ - Default to lazy loading; use `JOIN FETCH` in queries when needed
60
+ - Avoid `EAGER` on collections; use DTO projections for read paths
61
+
62
+ ```java
63
+ @Query("select m from MarketEntity m left join fetch m.positions where m.id = :id")
64
+ Optional<MarketEntity> findWithPositions(@Param("id") Long id);
65
+ ```
66
+
67
+ ## Repository Patterns
68
+
69
+ ```java
70
+ public interface MarketRepository extends JpaRepository<MarketEntity, Long> {
71
+ Optional<MarketEntity> findBySlug(String slug);
72
+
73
+ @Query("select m from MarketEntity m where m.status = :status")
74
+ Page<MarketEntity> findByStatus(@Param("status") MarketStatus status, Pageable pageable);
75
+ }
76
+ ```
77
+
78
+ - Use projections for lightweight queries:
79
+ ```java
80
+ public interface MarketSummary {
81
+ Long getId();
82
+ String getName();
83
+ MarketStatus getStatus();
84
+ }
85
+ Page<MarketSummary> findAllBy(Pageable pageable);
86
+ ```
87
+
88
+ ## Transactions
89
+
90
+ - Annotate service methods with `@Transactional`
91
+ - Use `@Transactional(readOnly = true)` for read paths to optimize
92
+ - Choose propagation carefully; avoid long-running transactions
93
+
94
+ ```java
95
+ @Transactional
96
+ public Market updateStatus(Long id, MarketStatus status) {
97
+ MarketEntity entity = repo.findById(id)
98
+ .orElseThrow(() -> new EntityNotFoundException("Market"));
99
+ entity.setStatus(status);
100
+ return Market.from(entity);
101
+ }
102
+ ```
103
+
104
+ ## Pagination
105
+
106
+ ```java
107
+ PageRequest page = PageRequest.of(pageNumber, pageSize, Sort.by("createdAt").descending());
108
+ Page<MarketEntity> markets = repo.findByStatus(MarketStatus.ACTIVE, page);
109
+ ```
110
+
111
+ For cursor-like pagination, include `id > :lastId` in JPQL with ordering.
112
+
113
+ ## Indexing and Performance
114
+
115
+ - Add indexes for common filters (`status`, `slug`, foreign keys)
116
+ - Use composite indexes matching query patterns (`status, created_at`)
117
+ - Avoid `select *`; project only needed columns
118
+ - Batch writes with `saveAll` and `hibernate.jdbc.batch_size`
119
+
120
+ ## Connection Pooling (HikariCP)
121
+
122
+ Recommended properties:
123
+ ```
124
+ spring.datasource.hikari.maximum-pool-size=20
125
+ spring.datasource.hikari.minimum-idle=5
126
+ spring.datasource.hikari.connection-timeout=30000
127
+ spring.datasource.hikari.validation-timeout=5000
128
+ ```
129
+
130
+ For PostgreSQL LOB handling, add:
131
+ ```
132
+ spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true
133
+ ```
134
+
135
+ ## Caching
136
+
137
+ - 1st-level cache is per EntityManager; avoid keeping entities across transactions
138
+ - For read-heavy entities, consider second-level cache cautiously; validate eviction strategy
139
+
140
+ ## Migrations
141
+
142
+ - Use Flyway or Liquibase; never rely on Hibernate auto DDL in production
143
+ - Keep migrations idempotent and additive; avoid dropping columns without plan
144
+
145
+ ## Testing Data Access
146
+
147
+ - Prefer `@DataJpaTest` with Testcontainers to mirror production
148
+ - Assert SQL efficiency using logs: set `logging.level.org.hibernate.SQL=DEBUG` and `logging.level.org.hibernate.orm.jdbc.bind=TRACE` for parameter values
149
+
150
+ **Remember**: Keep entities lean, queries intentional, and transactions short. Prevent N+1 with fetch strategies and projections, and index for your read/write paths.
@@ -0,0 +1,153 @@
1
+ ---
2
+ name: knowledge-ops
3
+ description: Knowledge base management, ingestion, sync, and retrieval across multiple storage layers (local files, MCP memory, vector stores, Git repos). Use when the user wants to save, organize, sync, deduplicate, or search across their knowledge systems.
4
+ ---
5
+
6
+ # Knowledge Operations
7
+
8
+ Manage a multi-layered knowledge system for ingesting, organizing, syncing, and retrieving knowledge across multiple stores.
9
+
10
+ Prefer the live workspace model:
11
+ - code work lives in the real cloned repos
12
+ - active execution context lives in GitHub, Linear, and repo-local working-context files
13
+ - broader human-facing notes can live in a non-repo context/archive folder
14
+ - durable cross-machine memory belongs in the knowledge base, not in a shadow repo workspace
15
+
16
+ ## When to Activate
17
+
18
+ - User wants to save information to their knowledge base
19
+ - Ingesting documents, conversations, or data into structured storage
20
+ - Syncing knowledge across systems (local files, MCP memory, Supabase, Git repos)
21
+ - Deduplicating or organizing existing knowledge
22
+ - User says "save this to KB", "sync knowledge", "what do I know about X", "ingest this", "update the knowledge base"
23
+ - Any knowledge management task beyond simple memory recall
24
+
25
+ ## Knowledge Architecture
26
+
27
+ ### Layer 1: Active execution truth
28
+ - **Sources:** GitHub issues, PRs, discussions, release notes, Linear issues/projects/docs
29
+ - **Use for:** the current operational state of the work
30
+ - **Rule:** if something affects an active engineering plan, roadmap, rollout, or release, prefer putting it here first
31
+
32
+ ### Layer 2: Claude Code Memory (Quick Access)
33
+ - **Path:** `~/.claude/projects/*/memory/`
34
+ - **Format:** Markdown files with frontmatter
35
+ - **Types:** user preferences, feedback, project context, reference
36
+ - **Use for:** quick-access context that persists across conversations
37
+ - **Automatically loaded at session start**
38
+
39
+ ### Layer 3: MCP Memory Server (Structured Knowledge Graph)
40
+ - **Access:** MCP memory tools (create_entities, create_relations, add_observations, search_nodes)
41
+ - **Use for:** Semantic search across all stored memories, relationship mapping
42
+ - **Cross-session persistence with queryable graph structure**
43
+
44
+ ### Layer 4: Knowledge base repo / durable document store
45
+ - **Use for:** curated durable notes, session exports, synthesized research, operator memory, long-form docs
46
+ - **Rule:** this is the preferred durable store for cross-machine context when the content is not repo-owned code
47
+
48
+ ### Layer 5: External Data Store (Supabase, PostgreSQL, etc.)
49
+ - **Use for:** Structured data, large document storage, full-text search
50
+ - **Good for:** Documents too large for memory files, data needing SQL queries
51
+
52
+ ### Layer 6: Local context/archive folder
53
+ - **Use for:** human-facing notes, archived gameplans, local media organization, temporary non-code docs
54
+ - **Rule:** writable for information storage, but not a shadow code workspace
55
+ - **Do not use for:** active code changes or repo truth that should live upstream
56
+
57
+ ## Ingestion Workflow
58
+
59
+ When new knowledge needs to be captured:
60
+
61
+ ### 1. Classify
62
+ What type of knowledge is it?
63
+ - Business decision -> memory file (project type) + MCP memory
64
+ - Active roadmap / release / implementation state -> GitHub + Linear first
65
+ - Personal preference -> memory file (user/feedback type)
66
+ - Reference info -> memory file (reference type) + MCP memory
67
+ - Large document -> external data store + summary in memory
68
+ - Conversation/session -> knowledge base repo + short summary in memory
69
+
70
+ ### 2. Deduplicate
71
+ Check if this knowledge already exists:
72
+ - Search memory files for existing entries
73
+ - Query MCP memory with relevant terms
74
+ - Check whether the information already exists in GitHub or Linear before creating another local note
75
+ - Do not create duplicates. Update existing entries instead.
76
+
77
+ ### 3. Store
78
+ Write to appropriate layer(s):
79
+ - Always update Claude Code memory for quick access
80
+ - Use MCP memory for semantic searchability and relationship mapping
81
+ - Update GitHub / Linear first when the information changes live project truth
82
+ - Commit to the knowledge base repo for durable long-form additions
83
+
84
+ ### 4. Index
85
+ Update any relevant indexes or summary files.
86
+
87
+ ## Sync Operations
88
+
89
+ ### Conversation Sync
90
+ Periodically sync conversation history into the knowledge base:
91
+ - Sources: Claude session files, Codex sessions, other agent sessions
92
+ - Destination: knowledge base repo
93
+ - Generate a session index for quick browsing
94
+ - Commit and push
95
+
96
+ ### Workspace State Sync
97
+ Mirror important workspace configuration and scripts to the knowledge base:
98
+ - Generate directory maps
99
+ - Redact sensitive config before committing
100
+ - Track changes over time
101
+ - Do not treat the knowledge base or archive folder as the live code workspace
102
+
103
+ ### GitHub / Linear Sync
104
+ When the information affects active execution:
105
+ - update the relevant GitHub issue, PR, discussion, release notes, or roadmap thread
106
+ - attach supporting docs to Linear when the work needs durable planning context
107
+ - only mirror a local note afterwards if it still adds value
108
+
109
+ ### Cross-Source Knowledge Sync
110
+ Pull knowledge from multiple sources into one place:
111
+ - Claude/ChatGPT/Grok conversation exports
112
+ - Browser bookmarks
113
+ - GitHub activity events
114
+ - Write status summary, commit and push
115
+
116
+ ## Memory Patterns
117
+
118
+ ```
119
+ # Short-term: current session context
120
+ Use TodoWrite for in-session task tracking
121
+
122
+ # Medium-term: project memory files
123
+ Write to ~/.claude/projects/*/memory/ for cross-session recall
124
+
125
+ # Long-term: GitHub / Linear / KB
126
+ Put active execution truth in GitHub + Linear
127
+ Put durable synthesized context in the knowledge base repo
128
+
129
+ # Semantic layer: MCP knowledge graph
130
+ Use mcp__memory__create_entities for permanent structured data
131
+ Use mcp__memory__create_relations for relationship mapping
132
+ Use mcp__memory__add_observations for new facts about known entities
133
+ Use mcp__memory__search_nodes to find existing knowledge
134
+ ```
135
+
136
+ ## Best Practices
137
+
138
+ - Keep memory files concise. Archive old data rather than letting files grow unbounded.
139
+ - Use frontmatter (YAML) for metadata on all knowledge files.
140
+ - Deduplicate before storing. Search first, then create or update.
141
+ - Prefer one canonical home per fact set. Avoid parallel copies of the same plan across local notes, repo files, and tracker docs.
142
+ - Redact sensitive information (API keys, passwords) before committing to Git.
143
+ - Use consistent naming conventions for knowledge files (lowercase-kebab-case).
144
+ - Tag entries with topics/categories for easier retrieval.
145
+
146
+ ## Quality Gate
147
+
148
+ Before completing any knowledge operation:
149
+ - no duplicate entries created
150
+ - sensitive data redacted from any Git-tracked files
151
+ - indexes and summaries updated
152
+ - appropriate storage layer chosen for the data type
153
+ - cross-references added where relevant
@@ -0,0 +1,283 @@
1
+ ---
2
+ name: kotlin-coroutines-flows
3
+ description: Kotlin Coroutines and Flow patterns for Android and KMP — structured concurrency, Flow operators, StateFlow, error handling, and testing.
4
+ ---
5
+
6
+ # Kotlin Coroutines & Flows
7
+
8
+ Patterns for structured concurrency, Flow-based reactive streams, and coroutine testing in Android and Kotlin Multiplatform projects.
9
+
10
+ ## When to Activate
11
+
12
+ - Writing async code with Kotlin coroutines
13
+ - Using Flow, StateFlow, or SharedFlow for reactive data
14
+ - Handling concurrent operations (parallel loading, debounce, retry)
15
+ - Testing coroutines and Flows
16
+ - Managing coroutine scopes and cancellation
17
+
18
+ ## Structured Concurrency
19
+
20
+ ### Scope Hierarchy
21
+
22
+ ```
23
+ Application
24
+ └── viewModelScope (ViewModel)
25
+ └── coroutineScope { } (structured child)
26
+ ├── async { } (concurrent task)
27
+ └── async { } (concurrent task)
28
+ ```
29
+
30
+ Always use structured concurrency — never `GlobalScope`:
31
+
32
+ ```kotlin
33
+ // BAD
34
+ GlobalScope.launch { fetchData() }
35
+
36
+ // GOOD — scoped to ViewModel lifecycle
37
+ viewModelScope.launch { fetchData() }
38
+
39
+ // GOOD — scoped to composable lifecycle
40
+ LaunchedEffect(key) { fetchData() }
41
+ ```
42
+
43
+ ### Parallel Decomposition
44
+
45
+ Use `coroutineScope` + `async` for parallel work:
46
+
47
+ ```kotlin
48
+ suspend fun loadDashboard(): Dashboard = coroutineScope {
49
+ val items = async { itemRepository.getRecent() }
50
+ val stats = async { statsRepository.getToday() }
51
+ val profile = async { userRepository.getCurrent() }
52
+ Dashboard(
53
+ items = items.await(),
54
+ stats = stats.await(),
55
+ profile = profile.await()
56
+ )
57
+ }
58
+ ```
59
+
60
+ ### SupervisorScope
61
+
62
+ Use `supervisorScope` when child failures should not cancel siblings:
63
+
64
+ ```kotlin
65
+ suspend fun syncAll() = supervisorScope {
66
+ launch { syncItems() } // failure here won't cancel syncStats
67
+ launch { syncStats() }
68
+ launch { syncSettings() }
69
+ }
70
+ ```
71
+
72
+ ## Flow Patterns
73
+
74
+ ### Cold Flow — One-Shot to Stream Conversion
75
+
76
+ ```kotlin
77
+ fun observeItems(): Flow<List<Item>> = flow {
78
+ // Re-emits whenever the database changes
79
+ itemDao.observeAll()
80
+ .map { entities -> entities.map { it.toDomain() } }
81
+ .collect { emit(it) }
82
+ }
83
+ ```
84
+
85
+ ### StateFlow for UI State
86
+
87
+ ```kotlin
88
+ class DashboardViewModel(
89
+ observeProgress: ObserveUserProgressUseCase
90
+ ) : ViewModel() {
91
+ val progress: StateFlow<UserProgress> = observeProgress()
92
+ .stateIn(
93
+ scope = viewModelScope,
94
+ started = SharingStarted.WhileSubscribed(5_000),
95
+ initialValue = UserProgress.EMPTY
96
+ )
97
+ }
98
+ ```
99
+
100
+ `WhileSubscribed(5_000)` keeps the upstream active for 5 seconds after the last subscriber leaves — survives configuration changes without restarting.
101
+
102
+ ### Combining Multiple Flows
103
+
104
+ ```kotlin
105
+ val uiState: StateFlow<HomeState> = combine(
106
+ itemRepository.observeItems(),
107
+ settingsRepository.observeTheme(),
108
+ userRepository.observeProfile()
109
+ ) { items, theme, profile ->
110
+ HomeState(items = items, theme = theme, profile = profile)
111
+ }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), HomeState())
112
+ ```
113
+
114
+ ### Flow Operators
115
+
116
+ ```kotlin
117
+ // Debounce search input
118
+ searchQuery
119
+ .debounce(300)
120
+ .distinctUntilChanged()
121
+ .flatMapLatest { query -> repository.search(query) }
122
+ .catch { emit(emptyList()) }
123
+ .collect { results -> _state.update { it.copy(results = results) } }
124
+
125
+ // Retry with exponential backoff
126
+ fun fetchWithRetry(): Flow<Data> = flow { emit(api.fetch()) }
127
+ .retryWhen { cause, attempt ->
128
+ if (cause is IOException && attempt < 3) {
129
+ delay(1000L * (1 shl attempt.toInt()))
130
+ true
131
+ } else {
132
+ false
133
+ }
134
+ }
135
+ ```
136
+
137
+ ### SharedFlow for One-Time Events
138
+
139
+ ```kotlin
140
+ class ItemListViewModel : ViewModel() {
141
+ private val _effects = MutableSharedFlow<Effect>()
142
+ val effects: SharedFlow<Effect> = _effects.asSharedFlow()
143
+
144
+ sealed interface Effect {
145
+ data class ShowSnackbar(val message: String) : Effect
146
+ data class NavigateTo(val route: String) : Effect
147
+ }
148
+
149
+ private fun deleteItem(id: String) {
150
+ viewModelScope.launch {
151
+ repository.delete(id)
152
+ _effects.emit(Effect.ShowSnackbar("Item deleted"))
153
+ }
154
+ }
155
+ }
156
+
157
+ // Collect in Composable
158
+ LaunchedEffect(Unit) {
159
+ viewModel.effects.collect { effect ->
160
+ when (effect) {
161
+ is Effect.ShowSnackbar -> snackbarHostState.showSnackbar(effect.message)
162
+ is Effect.NavigateTo -> navController.navigate(effect.route)
163
+ }
164
+ }
165
+ }
166
+ ```
167
+
168
+ ## Dispatchers
169
+
170
+ ```kotlin
171
+ // CPU-intensive work
172
+ withContext(Dispatchers.Default) { parseJson(largePayload) }
173
+
174
+ // IO-bound work
175
+ withContext(Dispatchers.IO) { database.query() }
176
+
177
+ // Main thread (UI) — default in viewModelScope
178
+ withContext(Dispatchers.Main) { updateUi() }
179
+ ```
180
+
181
+ In KMP, use `Dispatchers.Default` and `Dispatchers.Main` (available on all platforms). `Dispatchers.IO` is JVM/Android only — use `Dispatchers.Default` on other platforms or provide via DI.
182
+
183
+ ## Cancellation
184
+
185
+ ### Cooperative Cancellation
186
+
187
+ Long-running loops must check for cancellation:
188
+
189
+ ```kotlin
190
+ suspend fun processItems(items: List<Item>) = coroutineScope {
191
+ for (item in items) {
192
+ ensureActive() // throws CancellationException if cancelled
193
+ process(item)
194
+ }
195
+ }
196
+ ```
197
+
198
+ ### Cleanup with try/finally
199
+
200
+ ```kotlin
201
+ viewModelScope.launch {
202
+ try {
203
+ _state.update { it.copy(isLoading = true) }
204
+ val data = repository.fetch()
205
+ _state.update { it.copy(data = data) }
206
+ } finally {
207
+ _state.update { it.copy(isLoading = false) } // always runs, even on cancellation
208
+ }
209
+ }
210
+ ```
211
+
212
+ ## Testing
213
+
214
+ ### Testing StateFlow with Turbine
215
+
216
+ ```kotlin
217
+ @Test
218
+ fun `search updates item list`() = runTest {
219
+ val fakeRepository = FakeItemRepository().apply { emit(testItems) }
220
+ val viewModel = ItemListViewModel(GetItemsUseCase(fakeRepository))
221
+
222
+ viewModel.state.test {
223
+ assertEquals(ItemListState(), awaitItem()) // initial
224
+
225
+ viewModel.onSearch("query")
226
+ val loading = awaitItem()
227
+ assertTrue(loading.isLoading)
228
+
229
+ val loaded = awaitItem()
230
+ assertFalse(loaded.isLoading)
231
+ assertEquals(1, loaded.items.size)
232
+ }
233
+ }
234
+ ```
235
+
236
+ ### Testing with TestDispatcher
237
+
238
+ ```kotlin
239
+ @Test
240
+ fun `parallel load completes correctly`() = runTest {
241
+ val viewModel = DashboardViewModel(
242
+ itemRepo = FakeItemRepo(),
243
+ statsRepo = FakeStatsRepo()
244
+ )
245
+
246
+ viewModel.load()
247
+ advanceUntilIdle()
248
+
249
+ val state = viewModel.state.value
250
+ assertNotNull(state.items)
251
+ assertNotNull(state.stats)
252
+ }
253
+ ```
254
+
255
+ ### Faking Flows
256
+
257
+ ```kotlin
258
+ class FakeItemRepository : ItemRepository {
259
+ private val _items = MutableStateFlow<List<Item>>(emptyList())
260
+
261
+ override fun observeItems(): Flow<List<Item>> = _items
262
+
263
+ fun emit(items: List<Item>) { _items.value = items }
264
+
265
+ override suspend fun getItemsByCategory(category: String): Result<List<Item>> {
266
+ return Result.success(_items.value.filter { it.category == category })
267
+ }
268
+ }
269
+ ```
270
+
271
+ ## Anti-Patterns to Avoid
272
+
273
+ - Using `GlobalScope` — leaks coroutines, no structured cancellation
274
+ - Collecting Flows in `init {}` without a scope — use `viewModelScope.launch`
275
+ - Using `MutableStateFlow` with mutable collections — always use immutable copies: `_state.update { it.copy(list = it.list + newItem) }`
276
+ - Catching `CancellationException` — let it propagate for proper cancellation
277
+ - Using `flowOn(Dispatchers.Main)` to collect — collection dispatcher is the caller's dispatcher
278
+ - Creating `Flow` in `@Composable` without `remember` — recreates the flow every recomposition
279
+
280
+ ## References
281
+
282
+ See skill: `compose-multiplatform-patterns` for UI consumption of Flows.
283
+ See skill: `android-clean-architecture` for where coroutines fit in layers.