@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,320 @@
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
+ ---
5
+
6
+ # .NET Development Patterns
7
+
8
+ Idiomatic C# and .NET patterns for building robust, performant, and maintainable applications.
9
+
10
+ ## When to Activate
11
+
12
+ - Writing new C# code
13
+ - Reviewing C# code
14
+ - Refactoring existing .NET applications
15
+ - Designing service architectures with ASP.NET Core
16
+
17
+ ## Core Principles
18
+
19
+ ### 1. Prefer Immutability
20
+
21
+ Use records and init-only properties for data models. Mutability should be an explicit, justified choice.
22
+
23
+ ```csharp
24
+ // Good: Immutable value object
25
+ public sealed record Money(decimal Amount, string Currency);
26
+
27
+ // Good: Immutable DTO with init setters
28
+ public sealed class CreateOrderRequest
29
+ {
30
+ public required string CustomerId { get; init; }
31
+ public required IReadOnlyList<OrderItem> Items { get; init; }
32
+ }
33
+
34
+ // Bad: Mutable model with public setters
35
+ public class Order
36
+ {
37
+ public string CustomerId { get; set; }
38
+ public List<OrderItem> Items { get; set; }
39
+ }
40
+ ```
41
+
42
+ ### 2. Explicit Over Implicit
43
+
44
+ Be clear about nullability, access modifiers, and intent.
45
+
46
+ ```csharp
47
+ // Good: Explicit access modifiers and nullability
48
+ public sealed class UserService
49
+ {
50
+ private readonly IUserRepository _repository;
51
+ private readonly ILogger<UserService> _logger;
52
+
53
+ public UserService(IUserRepository repository, ILogger<UserService> logger)
54
+ {
55
+ _repository = repository ?? throw new ArgumentNullException(nameof(repository));
56
+ _logger = logger ?? throw new ArgumentNullException(nameof(logger));
57
+ }
58
+
59
+ public async Task<User?> FindByIdAsync(Guid id, CancellationToken cancellationToken)
60
+ {
61
+ return await _repository.FindByIdAsync(id, cancellationToken);
62
+ }
63
+ }
64
+ ```
65
+
66
+ ### 3. Depend on Abstractions
67
+
68
+ Use interfaces for service boundaries. Register via DI container.
69
+
70
+ ```csharp
71
+ // Good: Interface-based dependency
72
+ public interface IOrderRepository
73
+ {
74
+ Task<Order?> FindByIdAsync(Guid id, CancellationToken cancellationToken);
75
+ Task<IReadOnlyList<Order>> FindByCustomerAsync(string customerId, CancellationToken cancellationToken);
76
+ Task AddAsync(Order order, CancellationToken cancellationToken);
77
+ }
78
+
79
+ // Registration
80
+ builder.Services.AddScoped<IOrderRepository, SqlOrderRepository>();
81
+ ```
82
+
83
+ ## Async/Await Patterns
84
+
85
+ ### Proper Async Usage
86
+
87
+ ```csharp
88
+ // Good: Async all the way, with CancellationToken
89
+ public async Task<OrderSummary> GetOrderSummaryAsync(
90
+ Guid orderId,
91
+ CancellationToken cancellationToken)
92
+ {
93
+ var order = await _repository.FindByIdAsync(orderId, cancellationToken)
94
+ ?? throw new NotFoundException($"Order {orderId} not found");
95
+
96
+ var customer = await _customerService.GetAsync(order.CustomerId, cancellationToken);
97
+
98
+ return new OrderSummary(order, customer);
99
+ }
100
+
101
+ // Bad: Blocking on async
102
+ public OrderSummary GetOrderSummary(Guid orderId)
103
+ {
104
+ var order = _repository.FindByIdAsync(orderId, CancellationToken.None).Result; // Deadlock risk
105
+ return new OrderSummary(order);
106
+ }
107
+ ```
108
+
109
+ ### Parallel Async Operations
110
+
111
+ ```csharp
112
+ // Good: Concurrent independent operations
113
+ public async Task<DashboardData> LoadDashboardAsync(CancellationToken cancellationToken)
114
+ {
115
+ var ordersTask = _orderService.GetRecentAsync(cancellationToken);
116
+ var metricsTask = _metricsService.GetCurrentAsync(cancellationToken);
117
+ var alertsTask = _alertService.GetActiveAsync(cancellationToken);
118
+
119
+ await Task.WhenAll(ordersTask, metricsTask, alertsTask);
120
+
121
+ return new DashboardData(
122
+ Orders: await ordersTask,
123
+ Metrics: await metricsTask,
124
+ Alerts: await alertsTask);
125
+ }
126
+ ```
127
+
128
+ ## Options Pattern
129
+
130
+ Bind configuration sections to strongly-typed objects.
131
+
132
+ ```csharp
133
+ public sealed class SmtpOptions
134
+ {
135
+ public const string SectionName = "Smtp";
136
+
137
+ public required string Host { get; init; }
138
+ public required int Port { get; init; }
139
+ public required string Username { get; init; }
140
+ public bool UseSsl { get; init; } = true;
141
+ }
142
+
143
+ // Registration
144
+ builder.Services.Configure<SmtpOptions>(
145
+ builder.Configuration.GetSection(SmtpOptions.SectionName));
146
+
147
+ // Usage via injection
148
+ public class EmailService(IOptions<SmtpOptions> options)
149
+ {
150
+ private readonly SmtpOptions _smtp = options.Value;
151
+ }
152
+ ```
153
+
154
+ ## Result Pattern
155
+
156
+ Return explicit success/failure instead of throwing for expected failures.
157
+
158
+ ```csharp
159
+ public sealed record Result<T>
160
+ {
161
+ public bool IsSuccess { get; }
162
+ public T? Value { get; }
163
+ public string? Error { get; }
164
+
165
+ private Result(T value) { IsSuccess = true; Value = value; }
166
+ private Result(string error) { IsSuccess = false; Error = error; }
167
+
168
+ public static Result<T> Success(T value) => new(value);
169
+ public static Result<T> Failure(string error) => new(error);
170
+ }
171
+
172
+ // Usage
173
+ public async Task<Result<Order>> PlaceOrderAsync(CreateOrderRequest request)
174
+ {
175
+ if (request.Items.Count == 0)
176
+ return Result<Order>.Failure("Order must contain at least one item");
177
+
178
+ var order = Order.Create(request);
179
+ await _repository.AddAsync(order, CancellationToken.None);
180
+ return Result<Order>.Success(order);
181
+ }
182
+ ```
183
+
184
+ ## Repository Pattern with EF Core
185
+
186
+ ```csharp
187
+ public sealed class SqlOrderRepository : IOrderRepository
188
+ {
189
+ private readonly AppDbContext _db;
190
+
191
+ public SqlOrderRepository(AppDbContext db) => _db = db;
192
+
193
+ public async Task<Order?> FindByIdAsync(Guid id, CancellationToken cancellationToken)
194
+ {
195
+ return await _db.Orders
196
+ .Include(o => o.Items)
197
+ .AsNoTracking()
198
+ .FirstOrDefaultAsync(o => o.Id == id, cancellationToken);
199
+ }
200
+
201
+ public async Task<IReadOnlyList<Order>> FindByCustomerAsync(
202
+ string customerId,
203
+ CancellationToken cancellationToken)
204
+ {
205
+ return await _db.Orders
206
+ .Where(o => o.CustomerId == customerId)
207
+ .OrderByDescending(o => o.CreatedAt)
208
+ .AsNoTracking()
209
+ .ToListAsync(cancellationToken);
210
+ }
211
+
212
+ public async Task AddAsync(Order order, CancellationToken cancellationToken)
213
+ {
214
+ _db.Orders.Add(order);
215
+ await _db.SaveChangesAsync(cancellationToken);
216
+ }
217
+ }
218
+ ```
219
+
220
+ ## Middleware and Pipeline
221
+
222
+ ```csharp
223
+ // Custom middleware
224
+ public sealed class RequestTimingMiddleware
225
+ {
226
+ private readonly RequestDelegate _next;
227
+ private readonly ILogger<RequestTimingMiddleware> _logger;
228
+
229
+ public RequestTimingMiddleware(RequestDelegate next, ILogger<RequestTimingMiddleware> logger)
230
+ {
231
+ _next = next;
232
+ _logger = logger;
233
+ }
234
+
235
+ public async Task InvokeAsync(HttpContext context)
236
+ {
237
+ var stopwatch = Stopwatch.StartNew();
238
+ try
239
+ {
240
+ await _next(context);
241
+ }
242
+ finally
243
+ {
244
+ stopwatch.Stop();
245
+ _logger.LogInformation(
246
+ "Request {Method} {Path} completed in {ElapsedMs}ms with status {StatusCode}",
247
+ context.Request.Method,
248
+ context.Request.Path,
249
+ stopwatch.ElapsedMilliseconds,
250
+ context.Response.StatusCode);
251
+ }
252
+ }
253
+ }
254
+ ```
255
+
256
+ ## Minimal API Patterns
257
+
258
+ ```csharp
259
+ // Organized with route groups
260
+ var orders = app.MapGroup("/api/orders")
261
+ .RequireAuthorization()
262
+ .WithTags("Orders");
263
+
264
+ orders.MapGet("/{id:guid}", async (
265
+ Guid id,
266
+ IOrderRepository repository,
267
+ CancellationToken cancellationToken) =>
268
+ {
269
+ var order = await repository.FindByIdAsync(id, cancellationToken);
270
+ return order is not null
271
+ ? TypedResults.Ok(order)
272
+ : TypedResults.NotFound();
273
+ });
274
+
275
+ orders.MapPost("/", async (
276
+ CreateOrderRequest request,
277
+ IOrderService service,
278
+ CancellationToken cancellationToken) =>
279
+ {
280
+ var result = await service.PlaceOrderAsync(request, cancellationToken);
281
+ return result.IsSuccess
282
+ ? TypedResults.Created($"/api/orders/{result.Value!.Id}", result.Value)
283
+ : TypedResults.BadRequest(result.Error);
284
+ });
285
+ ```
286
+
287
+ ## Guard Clauses
288
+
289
+ ```csharp
290
+ // Good: Early returns with clear validation
291
+ public async Task<ProcessResult> ProcessPaymentAsync(
292
+ PaymentRequest request,
293
+ CancellationToken cancellationToken)
294
+ {
295
+ ArgumentNullException.ThrowIfNull(request);
296
+
297
+ if (request.Amount <= 0)
298
+ throw new ArgumentOutOfRangeException(nameof(request.Amount), "Amount must be positive");
299
+
300
+ if (string.IsNullOrWhiteSpace(request.Currency))
301
+ throw new ArgumentException("Currency is required", nameof(request.Currency));
302
+
303
+ // Happy path continues here without nesting
304
+ var gateway = _gatewayFactory.Create(request.Currency);
305
+ return await gateway.ChargeAsync(request, cancellationToken);
306
+ }
307
+ ```
308
+
309
+ ## Anti-Patterns to Avoid
310
+
311
+ | Anti-Pattern | Fix |
312
+ |---|---|
313
+ | `async void` methods | Return `Task` (except event handlers) |
314
+ | `.Result` or `.Wait()` | Use `await` |
315
+ | `catch (Exception) { }` | Handle or rethrow with context |
316
+ | `new Service()` in constructors | Use constructor injection |
317
+ | `public` fields | Use properties with appropriate accessors |
318
+ | `dynamic` in business logic | Use generics or explicit types |
319
+ | Mutable `static` state | Use DI scoping or `ConcurrentDictionary` |
320
+ | `string.Format` in loops | Use `StringBuilder` or interpolated string handlers |
@@ -0,0 +1,325 @@
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
+ ---
5
+
6
+ # E2E Testing Patterns
7
+
8
+ Comprehensive Playwright patterns for building stable, fast, and maintainable E2E test suites.
9
+
10
+ ## Test File Organization
11
+
12
+ ```
13
+ tests/
14
+ ├── e2e/
15
+ │ ├── auth/
16
+ │ │ ├── login.spec.ts
17
+ │ │ ├── logout.spec.ts
18
+ │ │ └── register.spec.ts
19
+ │ ├── features/
20
+ │ │ ├── browse.spec.ts
21
+ │ │ ├── search.spec.ts
22
+ │ │ └── create.spec.ts
23
+ │ └── api/
24
+ │ └── endpoints.spec.ts
25
+ ├── fixtures/
26
+ │ ├── auth.ts
27
+ │ └── data.ts
28
+ └── playwright.config.ts
29
+ ```
30
+
31
+ ## Page Object Model (POM)
32
+
33
+ ```typescript
34
+ import { Page, Locator } from '@playwright/test'
35
+
36
+ export class ItemsPage {
37
+ readonly page: Page
38
+ readonly searchInput: Locator
39
+ readonly itemCards: Locator
40
+ readonly createButton: Locator
41
+
42
+ constructor(page: Page) {
43
+ this.page = page
44
+ this.searchInput = page.locator('[data-testid="search-input"]')
45
+ this.itemCards = page.locator('[data-testid="item-card"]')
46
+ this.createButton = page.locator('[data-testid="create-btn"]')
47
+ }
48
+
49
+ async goto() {
50
+ await this.page.goto('/items')
51
+ await this.page.waitForLoadState('networkidle')
52
+ }
53
+
54
+ async search(query: string) {
55
+ await this.searchInput.fill(query)
56
+ await this.page.waitForResponse(resp => resp.url().includes('/api/search'))
57
+ await this.page.waitForLoadState('networkidle')
58
+ }
59
+
60
+ async getItemCount() {
61
+ return await this.itemCards.count()
62
+ }
63
+ }
64
+ ```
65
+
66
+ ## Test Structure
67
+
68
+ ```typescript
69
+ import { test, expect } from '@playwright/test'
70
+ import { ItemsPage } from '../../pages/ItemsPage'
71
+
72
+ test.describe('Item Search', () => {
73
+ let itemsPage: ItemsPage
74
+
75
+ test.beforeEach(async ({ page }) => {
76
+ itemsPage = new ItemsPage(page)
77
+ await itemsPage.goto()
78
+ })
79
+
80
+ test('should search by keyword', async ({ page }) => {
81
+ await itemsPage.search('test')
82
+
83
+ const count = await itemsPage.getItemCount()
84
+ expect(count).toBeGreaterThan(0)
85
+
86
+ await expect(itemsPage.itemCards.first()).toContainText(/test/i)
87
+ await page.screenshot({ path: 'artifacts/search-results.png' })
88
+ })
89
+
90
+ test('should handle no results', async ({ page }) => {
91
+ await itemsPage.search('xyznonexistent123')
92
+
93
+ await expect(page.locator('[data-testid="no-results"]')).toBeVisible()
94
+ expect(await itemsPage.getItemCount()).toBe(0)
95
+ })
96
+ })
97
+ ```
98
+
99
+ ## Playwright Configuration
100
+
101
+ ```typescript
102
+ import { defineConfig, devices } from '@playwright/test'
103
+
104
+ export default defineConfig({
105
+ testDir: './tests/e2e',
106
+ fullyParallel: true,
107
+ forbidOnly: !!process.env.CI,
108
+ retries: process.env.CI ? 2 : 0,
109
+ workers: process.env.CI ? 1 : undefined,
110
+ reporter: [
111
+ ['html', { outputFolder: 'playwright-report' }],
112
+ ['junit', { outputFile: 'playwright-results.xml' }],
113
+ ['json', { outputFile: 'playwright-results.json' }]
114
+ ],
115
+ use: {
116
+ baseURL: process.env.BASE_URL || 'http://localhost:3000',
117
+ trace: 'on-first-retry',
118
+ screenshot: 'only-on-failure',
119
+ video: 'retain-on-failure',
120
+ actionTimeout: 10000,
121
+ navigationTimeout: 30000,
122
+ },
123
+ projects: [
124
+ { name: 'chromium', use: { ...devices['Desktop Chrome'] } },
125
+ { name: 'firefox', use: { ...devices['Desktop Firefox'] } },
126
+ { name: 'webkit', use: { ...devices['Desktop Safari'] } },
127
+ { name: 'mobile-chrome', use: { ...devices['Pixel 5'] } },
128
+ ],
129
+ webServer: {
130
+ command: 'npm run dev',
131
+ url: 'http://localhost:3000',
132
+ reuseExistingServer: !process.env.CI,
133
+ timeout: 120000,
134
+ },
135
+ })
136
+ ```
137
+
138
+ ## Flaky Test Patterns
139
+
140
+ ### Quarantine
141
+
142
+ ```typescript
143
+ test('flaky: complex search', async ({ page }) => {
144
+ test.fixme(true, 'Flaky - Issue #123')
145
+ // test code...
146
+ })
147
+
148
+ test('conditional skip', async ({ page }) => {
149
+ test.skip(process.env.CI, 'Flaky in CI - Issue #123')
150
+ // test code...
151
+ })
152
+ ```
153
+
154
+ ### Identify Flakiness
155
+
156
+ ```bash
157
+ npx playwright test tests/search.spec.ts --repeat-each=10
158
+ npx playwright test tests/search.spec.ts --retries=3
159
+ ```
160
+
161
+ ### Common Causes & Fixes
162
+
163
+ **Race conditions:**
164
+ ```typescript
165
+ // Bad: assumes element is ready
166
+ await page.click('[data-testid="button"]')
167
+
168
+ // Good: auto-wait locator
169
+ await page.locator('[data-testid="button"]').click()
170
+ ```
171
+
172
+ **Network timing:**
173
+ ```typescript
174
+ // Bad: arbitrary timeout
175
+ await page.waitForTimeout(5000)
176
+
177
+ // Good: wait for specific condition
178
+ await page.waitForResponse(resp => resp.url().includes('/api/data'))
179
+ ```
180
+
181
+ **Animation timing:**
182
+ ```typescript
183
+ // Bad: click during animation
184
+ await page.click('[data-testid="menu-item"]')
185
+
186
+ // Good: wait for stability
187
+ await page.locator('[data-testid="menu-item"]').waitFor({ state: 'visible' })
188
+ await page.waitForLoadState('networkidle')
189
+ await page.locator('[data-testid="menu-item"]').click()
190
+ ```
191
+
192
+ ## Artifact Management
193
+
194
+ ### Screenshots
195
+
196
+ ```typescript
197
+ await page.screenshot({ path: 'artifacts/after-login.png' })
198
+ await page.screenshot({ path: 'artifacts/full-page.png', fullPage: true })
199
+ await page.locator('[data-testid="chart"]').screenshot({ path: 'artifacts/chart.png' })
200
+ ```
201
+
202
+ ### Traces
203
+
204
+ ```typescript
205
+ await browser.startTracing(page, {
206
+ path: 'artifacts/trace.json',
207
+ screenshots: true,
208
+ snapshots: true,
209
+ })
210
+ // ... test actions ...
211
+ await browser.stopTracing()
212
+ ```
213
+
214
+ ### Video
215
+
216
+ ```typescript
217
+ // In playwright.config.ts
218
+ use: {
219
+ video: 'retain-on-failure',
220
+ videosPath: 'artifacts/videos/'
221
+ }
222
+ ```
223
+
224
+ ## CI/CD Integration
225
+
226
+ ```yaml
227
+ # .github/workflows/e2e.yml
228
+ name: E2E Tests
229
+ on: [push, pull_request]
230
+
231
+ jobs:
232
+ test:
233
+ runs-on: ubuntu-latest
234
+ steps:
235
+ - uses: actions/checkout@v4
236
+ - uses: actions/setup-node@v4
237
+ with:
238
+ node-version: 20
239
+ - run: npm ci
240
+ - run: npx playwright install --with-deps
241
+ - run: npx playwright test
242
+ env:
243
+ BASE_URL: ${{ vars.STAGING_URL }}
244
+ - uses: actions/upload-artifact@v4
245
+ if: always()
246
+ with:
247
+ name: playwright-report
248
+ path: playwright-report/
249
+ retention-days: 30
250
+ ```
251
+
252
+ ## Test Report Template
253
+
254
+ ```markdown
255
+ # E2E Test Report
256
+
257
+ **Date:** YYYY-MM-DD HH:MM
258
+ **Duration:** Xm Ys
259
+ **Status:** PASSING / FAILING
260
+
261
+ ## Summary
262
+ - Total: X | Passed: Y (Z%) | Failed: A | Flaky: B | Skipped: C
263
+
264
+ ## Failed Tests
265
+
266
+ ### test-name
267
+ **File:** `tests/e2e/feature.spec.ts:45`
268
+ **Error:** Expected element to be visible
269
+ **Screenshot:** artifacts/failed.png
270
+ **Recommended Fix:** [description]
271
+
272
+ ## Artifacts
273
+ - HTML Report: playwright-report/index.html
274
+ - Screenshots: artifacts/*.png
275
+ - Videos: artifacts/videos/*.webm
276
+ - Traces: artifacts/*.zip
277
+ ```
278
+
279
+ ## Wallet / Web3 Testing
280
+
281
+ ```typescript
282
+ test('wallet connection', async ({ page, context }) => {
283
+ // Mock wallet provider
284
+ await context.addInitScript(() => {
285
+ window.ethereum = {
286
+ isMetaMask: true,
287
+ request: async ({ method }) => {
288
+ if (method === 'eth_requestAccounts')
289
+ return ['0x1234567890123456789012345678901234567890']
290
+ if (method === 'eth_chainId') return '0x1'
291
+ }
292
+ }
293
+ })
294
+
295
+ await page.goto('/')
296
+ await page.locator('[data-testid="connect-wallet"]').click()
297
+ await expect(page.locator('[data-testid="wallet-address"]')).toContainText('0x1234')
298
+ })
299
+ ```
300
+
301
+ ## Financial / Critical Flow Testing
302
+
303
+ ```typescript
304
+ test('trade execution', async ({ page }) => {
305
+ // Skip on production — real money
306
+ test.skip(process.env.NODE_ENV === 'production', 'Skip on production')
307
+
308
+ await page.goto('/markets/test-market')
309
+ await page.locator('[data-testid="position-yes"]').click()
310
+ await page.locator('[data-testid="trade-amount"]').fill('1.0')
311
+
312
+ // Verify preview
313
+ const preview = page.locator('[data-testid="trade-preview"]')
314
+ await expect(preview).toContainText('1.0')
315
+
316
+ // Confirm and wait for blockchain
317
+ await page.locator('[data-testid="confirm-trade"]').click()
318
+ await page.waitForResponse(
319
+ resp => resp.url().includes('/api/trade') && resp.status() === 200,
320
+ { timeout: 30000 }
321
+ )
322
+
323
+ await expect(page.locator('[data-testid="trade-success"]')).toBeVisible()
324
+ })
325
+ ```