codeply-cli 0.1.0 → 0.2.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 (351) hide show
  1. package/bin/codeply.js +125 -14
  2. package/lib/agent.mjs +157 -18
  3. package/lib/ai.js +221 -15
  4. package/lib/apply-limit.js +13 -3
  5. package/lib/config.js +63 -16
  6. package/lib/edit-engine.js +1 -1
  7. package/lib/skills.js +358 -0
  8. package/lib/tools.mjs +63 -6
  9. package/lib/tui.mjs +96 -3
  10. package/package.json +3 -2
  11. package/skills/SOURCE.md +58 -0
  12. package/skills/accessibility/SKILL.md +147 -0
  13. package/skills/agent-architecture-audit/SKILL.md +257 -0
  14. package/skills/agent-eval/SKILL.md +147 -0
  15. package/skills/agent-harness-construction/SKILL.md +74 -0
  16. package/skills/agent-introspection-debugging/SKILL.md +154 -0
  17. package/skills/agent-payment-x402/SKILL.md +225 -0
  18. package/skills/agent-self-evaluation/SKILL.md +182 -0
  19. package/skills/agent-self-evaluation/references/evaluation-criteria.md +71 -0
  20. package/skills/agent-self-evaluation/references/hook-integration.md +64 -0
  21. package/skills/agent-sort/SKILL.md +216 -0
  22. package/skills/agentic-engineering/SKILL.md +64 -0
  23. package/skills/agentic-os/SKILL.md +388 -0
  24. package/skills/ai-first-engineering/SKILL.md +52 -0
  25. package/skills/ai-regression-testing/SKILL.md +386 -0
  26. package/skills/android-clean-architecture/SKILL.md +340 -0
  27. package/skills/angular-developer/SKILL.md +155 -0
  28. package/skills/angular-developer/references/angular-animations.md +160 -0
  29. package/skills/angular-developer/references/angular-aria.md +410 -0
  30. package/skills/angular-developer/references/cli.md +86 -0
  31. package/skills/angular-developer/references/component-harnesses.md +59 -0
  32. package/skills/angular-developer/references/component-styling.md +91 -0
  33. package/skills/angular-developer/references/components.md +117 -0
  34. package/skills/angular-developer/references/creating-services.md +97 -0
  35. package/skills/angular-developer/references/data-resolvers.md +69 -0
  36. package/skills/angular-developer/references/define-routes.md +67 -0
  37. package/skills/angular-developer/references/defining-providers.md +72 -0
  38. package/skills/angular-developer/references/di-fundamentals.md +120 -0
  39. package/skills/angular-developer/references/e2e-testing.md +56 -0
  40. package/skills/angular-developer/references/effects.md +83 -0
  41. package/skills/angular-developer/references/hierarchical-injectors.md +43 -0
  42. package/skills/angular-developer/references/host-elements.md +80 -0
  43. package/skills/angular-developer/references/injection-context.md +63 -0
  44. package/skills/angular-developer/references/inputs.md +101 -0
  45. package/skills/angular-developer/references/linked-signal.md +59 -0
  46. package/skills/angular-developer/references/loading-strategies.md +61 -0
  47. package/skills/angular-developer/references/mcp.md +108 -0
  48. package/skills/angular-developer/references/navigate-to-routes.md +69 -0
  49. package/skills/angular-developer/references/outputs.md +86 -0
  50. package/skills/angular-developer/references/reactive-forms.md +122 -0
  51. package/skills/angular-developer/references/rendering-strategies.md +44 -0
  52. package/skills/angular-developer/references/resource.md +77 -0
  53. package/skills/angular-developer/references/route-animations.md +56 -0
  54. package/skills/angular-developer/references/route-guards.md +52 -0
  55. package/skills/angular-developer/references/router-lifecycle.md +45 -0
  56. package/skills/angular-developer/references/router-testing.md +87 -0
  57. package/skills/angular-developer/references/show-routes-with-outlets.md +68 -0
  58. package/skills/angular-developer/references/signal-forms.md +795 -0
  59. package/skills/angular-developer/references/signals-overview.md +94 -0
  60. package/skills/angular-developer/references/tailwind-css.md +69 -0
  61. package/skills/angular-developer/references/template-driven-forms.md +114 -0
  62. package/skills/angular-developer/references/testing-fundamentals.md +65 -0
  63. package/skills/api-connector-builder/SKILL.md +121 -0
  64. package/skills/api-design/SKILL.md +524 -0
  65. package/skills/architecture-decision-records/SKILL.md +180 -0
  66. package/skills/article-writing/SKILL.md +80 -0
  67. package/skills/automation-audit-ops/SKILL.md +143 -0
  68. package/skills/autonomous-agent-harness/SKILL.md +274 -0
  69. package/skills/autonomous-loops/SKILL.md +611 -0
  70. package/skills/backend-patterns/SKILL.md +562 -0
  71. package/skills/benchmark/SKILL.md +95 -0
  72. package/skills/benchmark-methodology/SKILL.md +191 -0
  73. package/skills/benchmark-optimization-loop/SKILL.md +71 -0
  74. package/skills/blender-motion-state-inspection/SKILL.md +165 -0
  75. package/skills/blueprint/SKILL.md +106 -0
  76. package/skills/brand-discovery/SKILL.md +145 -0
  77. package/skills/brand-discovery/references/10_purpose-why.md +40 -0
  78. package/skills/brand-discovery/references/20_positioning.md +44 -0
  79. package/skills/brand-discovery/references/30_audience-niche.md +52 -0
  80. package/skills/brand-discovery/references/40_personality-archetype.md +57 -0
  81. package/skills/brand-discovery/references/50_voice-tone.md +59 -0
  82. package/skills/brand-discovery/references/60_narrative-story.md +50 -0
  83. package/skills/brand-discovery/references/70_founder-tension.md +49 -0
  84. package/skills/brand-discovery/references/90_SYNTHESIS.md +133 -0
  85. package/skills/brand-voice/SKILL.md +98 -0
  86. package/skills/brand-voice/references/voice-profile-schema.md +55 -0
  87. package/skills/browser-qa/SKILL.md +105 -0
  88. package/skills/bun-runtime/SKILL.md +85 -0
  89. package/skills/canary-watch/SKILL.md +108 -0
  90. package/skills/carrier-relationship-management/SKILL.md +212 -0
  91. package/skills/cisco-ios-patterns/SKILL.md +164 -0
  92. package/skills/ck/SKILL.md +148 -0
  93. package/skills/claude-devfleet/SKILL.md +112 -0
  94. package/skills/click-path-audit/SKILL.md +245 -0
  95. package/skills/clickhouse-io/SKILL.md +445 -0
  96. package/skills/code-tour/SKILL.md +254 -0
  97. package/skills/codebase-onboarding/SKILL.md +234 -0
  98. package/skills/codehealth-mcp/SKILL.md +167 -0
  99. package/skills/coding-standards/SKILL.md +551 -0
  100. package/skills/competitive-platform-analysis/SKILL.md +214 -0
  101. package/skills/competitive-report-structure/SKILL.md +162 -0
  102. package/skills/compose-multiplatform-patterns/SKILL.md +300 -0
  103. package/skills/config-gc/SKILL.md +120 -0
  104. package/skills/configure-ecc/SKILL.md +385 -0
  105. package/skills/connections-optimizer/SKILL.md +190 -0
  106. package/skills/content-engine/SKILL.md +132 -0
  107. package/skills/content-hash-cache-pattern/SKILL.md +162 -0
  108. package/skills/context-budget/SKILL.md +136 -0
  109. package/skills/continuous-agent-loop/SKILL.md +46 -0
  110. package/skills/continuous-learning/SKILL.md +132 -0
  111. package/skills/continuous-learning-v2/SKILL.md +361 -0
  112. package/skills/contract-first/SKILL.md +287 -0
  113. package/skills/cost-aware-llm-pipeline/SKILL.md +184 -0
  114. package/skills/cost-tracking/SKILL.md +97 -0
  115. package/skills/council/SKILL.md +204 -0
  116. package/skills/cpp-coding-standards/SKILL.md +724 -0
  117. package/skills/cpp-testing/SKILL.md +325 -0
  118. package/skills/crosspost/SKILL.md +112 -0
  119. package/skills/csharp-testing/SKILL.md +322 -0
  120. package/skills/customer-billing-ops/SKILL.md +141 -0
  121. package/skills/customs-trade-compliance/SKILL.md +263 -0
  122. package/skills/dart-flutter-patterns/SKILL.md +564 -0
  123. package/skills/dashboard-builder/SKILL.md +109 -0
  124. package/skills/data-scraper-agent/SKILL.md +765 -0
  125. package/skills/data-throughput-accelerator/SKILL.md +74 -0
  126. package/skills/database-migrations/SKILL.md +430 -0
  127. package/skills/deep-research/SKILL.md +160 -0
  128. package/skills/defi-amm-security/SKILL.md +167 -0
  129. package/skills/delivery-gate/SKILL.md +126 -0
  130. package/skills/deployment-patterns/SKILL.md +428 -0
  131. package/skills/design-system/SKILL.md +83 -0
  132. package/skills/django-celery/SKILL.md +458 -0
  133. package/skills/django-patterns/SKILL.md +735 -0
  134. package/skills/django-security/SKILL.md +644 -0
  135. package/skills/django-tdd/SKILL.md +730 -0
  136. package/skills/django-verification/SKILL.md +470 -0
  137. package/skills/dmux-workflows/SKILL.md +192 -0
  138. package/skills/docker-patterns/SKILL.md +365 -0
  139. package/skills/documentation-lookup/SKILL.md +91 -0
  140. package/skills/dotnet-patterns/SKILL.md +322 -0
  141. package/skills/dynamic-workflow-mode/SKILL.md +124 -0
  142. package/skills/e2e-testing/SKILL.md +327 -0
  143. package/skills/ecc-guide/SKILL.md +190 -0
  144. package/skills/ecc-recipes/SKILL.md +149 -0
  145. package/skills/ecc-tools-cost-audit/SKILL.md +161 -0
  146. package/skills/email-ops/SKILL.md +122 -0
  147. package/skills/energy-procurement/SKILL.md +228 -0
  148. package/skills/enterprise-agent-ops/SKILL.md +51 -0
  149. package/skills/error-handling/SKILL.md +377 -0
  150. package/skills/eval-harness/SKILL.md +271 -0
  151. package/skills/evm-token-decimals/SKILL.md +131 -0
  152. package/skills/exa-search/SKILL.md +108 -0
  153. package/skills/fal-ai-media/SKILL.md +289 -0
  154. package/skills/fastapi-patterns/SKILL.md +514 -0
  155. package/skills/finance-billing-ops/SKILL.md +128 -0
  156. package/skills/flox-environments/SKILL.md +497 -0
  157. package/skills/flutter-dart-code-review/SKILL.md +436 -0
  158. package/skills/foundation-models-on-device/SKILL.md +243 -0
  159. package/skills/frontend-a11y/SKILL.md +446 -0
  160. package/skills/frontend-design-direction/SKILL.md +93 -0
  161. package/skills/frontend-patterns/SKILL.md +657 -0
  162. package/skills/frontend-slides/SKILL.md +185 -0
  163. package/skills/fsharp-testing/SKILL.md +281 -0
  164. package/skills/gan-style-harness/SKILL.md +279 -0
  165. package/skills/gateguard/SKILL.md +133 -0
  166. package/skills/generating-python-installer/SKILL.md +820 -0
  167. package/skills/git-workflow/SKILL.md +716 -0
  168. package/skills/github-ops/SKILL.md +145 -0
  169. package/skills/golang-patterns/SKILL.md +676 -0
  170. package/skills/golang-testing/SKILL.md +721 -0
  171. package/skills/google-workspace-ops/SKILL.md +96 -0
  172. package/skills/growth-log/SKILL.md +128 -0
  173. package/skills/healthcare-cdss-patterns/SKILL.md +246 -0
  174. package/skills/healthcare-emr-patterns/SKILL.md +160 -0
  175. package/skills/healthcare-eval-harness/SKILL.md +208 -0
  176. package/skills/healthcare-phi-compliance/SKILL.md +146 -0
  177. package/skills/hermes-imports/SKILL.md +89 -0
  178. package/skills/hexagonal-architecture/SKILL.md +277 -0
  179. package/skills/hipaa-compliance/SKILL.md +79 -0
  180. package/skills/homelab-network-readiness/SKILL.md +170 -0
  181. package/skills/homelab-network-setup/SKILL.md +130 -0
  182. package/skills/homelab-pihole-dns/SKILL.md +275 -0
  183. package/skills/homelab-vlan-segmentation/SKILL.md +312 -0
  184. package/skills/homelab-wireguard-vpn/SKILL.md +306 -0
  185. package/skills/hookify-rules/SKILL.md +128 -0
  186. package/skills/inherit-legacy-style/SKILL.md +157 -0
  187. package/skills/intent-driven-development/SKILL.md +360 -0
  188. package/skills/inventory-demand-planning/SKILL.md +247 -0
  189. package/skills/investor-materials/SKILL.md +97 -0
  190. package/skills/investor-outreach/SKILL.md +92 -0
  191. package/skills/ios-icon-gen/SKILL.md +158 -0
  192. package/skills/iterative-retrieval/SKILL.md +212 -0
  193. package/skills/ito-basket-compare/SKILL.md +64 -0
  194. package/skills/ito-compute/SKILL.md +129 -0
  195. package/skills/ito-data-atlas-agent/SKILL.md +64 -0
  196. package/skills/ito-market-intelligence/SKILL.md +61 -0
  197. package/skills/ito-trade-planner/SKILL.md +68 -0
  198. package/skills/java-coding-standards/SKILL.md +384 -0
  199. package/skills/jira-integration/SKILL.md +303 -0
  200. package/skills/jpa-patterns/SKILL.md +152 -0
  201. package/skills/knowledge-ops/SKILL.md +155 -0
  202. package/skills/kotlin-coroutines-flows/SKILL.md +285 -0
  203. package/skills/kotlin-exposed-patterns/SKILL.md +720 -0
  204. package/skills/kotlin-ktor-patterns/SKILL.md +690 -0
  205. package/skills/kotlin-patterns/SKILL.md +712 -0
  206. package/skills/kotlin-testing/SKILL.md +825 -0
  207. package/skills/kubernetes-patterns/SKILL.md +756 -0
  208. package/skills/laravel-patterns/SKILL.md +416 -0
  209. package/skills/laravel-plugin-discovery/SKILL.md +230 -0
  210. package/skills/laravel-security/SKILL.md +948 -0
  211. package/skills/laravel-tdd/SKILL.md +675 -0
  212. package/skills/laravel-verification/SKILL.md +180 -0
  213. package/skills/latency-critical-systems/SKILL.md +75 -0
  214. package/skills/lead-intelligence/SKILL.md +322 -0
  215. package/skills/liquid-glass-design/SKILL.md +279 -0
  216. package/skills/llm-trading-agent-security/SKILL.md +147 -0
  217. package/skills/logistics-exception-management/SKILL.md +222 -0
  218. package/skills/loop-design-check/SKILL.md +143 -0
  219. package/skills/mailtrap-email-integration/SKILL.md +77 -0
  220. package/skills/make-interfaces-feel-better/SKILL.md +152 -0
  221. package/skills/manim-video/SKILL.md +90 -0
  222. package/skills/market-research/SKILL.md +76 -0
  223. package/skills/marketing-campaign/SKILL.md +114 -0
  224. package/skills/mcp-server-patterns/SKILL.md +70 -0
  225. package/skills/messages-ops/SKILL.md +105 -0
  226. package/skills/ml-adoption-playbook/SKILL.md +57 -0
  227. package/skills/mle-workflow/SKILL.md +348 -0
  228. package/skills/motion-advanced/SKILL.md +596 -0
  229. package/skills/motion-foundations/SKILL.md +299 -0
  230. package/skills/motion-patterns/SKILL.md +434 -0
  231. package/skills/motion-ui/SKILL.md +576 -0
  232. package/skills/mysql-patterns/SKILL.md +413 -0
  233. package/skills/nanoclaw-repl/SKILL.md +34 -0
  234. package/skills/nestjs-patterns/SKILL.md +231 -0
  235. package/skills/netmiko-ssh-automation/SKILL.md +174 -0
  236. package/skills/network-bgp-diagnostics/SKILL.md +168 -0
  237. package/skills/network-config-validation/SKILL.md +211 -0
  238. package/skills/network-interface-health/SKILL.md +153 -0
  239. package/skills/nextjs-turbopack/SKILL.md +58 -0
  240. package/skills/nodejs-keccak256/SKILL.md +103 -0
  241. package/skills/nutrient-document-processing/SKILL.md +168 -0
  242. package/skills/nuxt4-patterns/SKILL.md +101 -0
  243. package/skills/openclaw-persona-forge/SKILL.md +289 -0
  244. package/skills/openclaw-persona-forge/references/avatar-style.md +124 -0
  245. package/skills/openclaw-persona-forge/references/boundary-rules.md +53 -0
  246. package/skills/openclaw-persona-forge/references/error-handling.md +53 -0
  247. package/skills/openclaw-persona-forge/references/identity-tension.md +48 -0
  248. package/skills/openclaw-persona-forge/references/naming-system.md +39 -0
  249. package/skills/openclaw-persona-forge/references/output-template.md +166 -0
  250. package/skills/opensource-pipeline/SKILL.md +256 -0
  251. package/skills/orch-add-feature/SKILL.md +45 -0
  252. package/skills/orch-build-mvp/SKILL.md +49 -0
  253. package/skills/orch-change-feature/SKILL.md +43 -0
  254. package/skills/orch-fix-defect/SKILL.md +43 -0
  255. package/skills/orch-pipeline/SKILL.md +121 -0
  256. package/skills/orch-refine-code/SKILL.md +44 -0
  257. package/skills/parallel-execution-optimizer/SKILL.md +74 -0
  258. package/skills/perl-patterns/SKILL.md +505 -0
  259. package/skills/perl-security/SKILL.md +504 -0
  260. package/skills/perl-testing/SKILL.md +476 -0
  261. package/skills/plan-canvas/SKILL.md +153 -0
  262. package/skills/plan-orchestrate/SKILL.md +263 -0
  263. package/skills/plankton-code-quality/SKILL.md +237 -0
  264. package/skills/postgres-patterns/SKILL.md +148 -0
  265. package/skills/prediction-market-oracle-research/SKILL.md +64 -0
  266. package/skills/prediction-market-risk-review/SKILL.md +61 -0
  267. package/skills/prisma-patterns/SKILL.md +401 -0
  268. package/skills/product-capability/SKILL.md +142 -0
  269. package/skills/product-lens/SKILL.md +93 -0
  270. package/skills/production-audit/SKILL.md +207 -0
  271. package/skills/production-scheduling/SKILL.md +238 -0
  272. package/skills/project-flow-ops/SKILL.md +112 -0
  273. package/skills/prompt-optimizer/SKILL.md +398 -0
  274. package/skills/python-patterns/SKILL.md +751 -0
  275. package/skills/python-testing/SKILL.md +817 -0
  276. package/skills/pytorch-patterns/SKILL.md +397 -0
  277. package/skills/quality-nonconformance/SKILL.md +260 -0
  278. package/skills/quarkus-patterns/SKILL.md +723 -0
  279. package/skills/quarkus-security/SKILL.md +468 -0
  280. package/skills/quarkus-tdd/SKILL.md +812 -0
  281. package/skills/quarkus-verification/SKILL.md +480 -0
  282. package/skills/ralphinho-rfc-pipeline/SKILL.md +68 -0
  283. package/skills/react-native-patterns/SKILL.md +326 -0
  284. package/skills/react-patterns/SKILL.md +342 -0
  285. package/skills/react-performance/SKILL.md +575 -0
  286. package/skills/react-testing/SKILL.md +424 -0
  287. package/skills/recsys-pipeline-architect/SKILL.md +115 -0
  288. package/skills/recursive-decision-ledger/SKILL.md +81 -0
  289. package/skills/redis-patterns/SKILL.md +404 -0
  290. package/skills/regex-vs-llm-structured-text/SKILL.md +221 -0
  291. package/skills/remotion-video-creation/SKILL.md +43 -0
  292. package/skills/repo-scan/SKILL.md +79 -0
  293. package/skills/research-ops/SKILL.md +113 -0
  294. package/skills/returns-reverse-logistics/SKILL.md +240 -0
  295. package/skills/rules-distill/SKILL.md +265 -0
  296. package/skills/rust-patterns/SKILL.md +500 -0
  297. package/skills/rust-testing/SKILL.md +501 -0
  298. package/skills/safety-guard/SKILL.md +76 -0
  299. package/skills/santa-method/SKILL.md +307 -0
  300. package/skills/scientific-db-pubmed-database/SKILL.md +176 -0
  301. package/skills/scientific-db-uspto-database/SKILL.md +178 -0
  302. package/skills/scientific-pkg-gget/SKILL.md +167 -0
  303. package/skills/scientific-thinking-literature-review/SKILL.md +193 -0
  304. package/skills/scientific-thinking-scholar-evaluation/SKILL.md +161 -0
  305. package/skills/search-first/SKILL.md +183 -0
  306. package/skills/security-bounty-hunter/SKILL.md +100 -0
  307. package/skills/security-review/SKILL.md +504 -0
  308. package/skills/security-scan/SKILL.md +166 -0
  309. package/skills/seo/SKILL.md +155 -0
  310. package/skills/skill-comply/SKILL.md +59 -0
  311. package/skills/skill-scout/SKILL.md +141 -0
  312. package/skills/skill-stocktake/SKILL.md +195 -0
  313. package/skills/social-graph-ranker/SKILL.md +155 -0
  314. package/skills/social-publisher/SKILL.md +130 -0
  315. package/skills/springboot-patterns/SKILL.md +315 -0
  316. package/skills/springboot-security/SKILL.md +273 -0
  317. package/skills/springboot-tdd/SKILL.md +159 -0
  318. package/skills/springboot-verification/SKILL.md +232 -0
  319. package/skills/strategic-compact/SKILL.md +142 -0
  320. package/skills/swift-actor-persistence/SKILL.md +144 -0
  321. package/skills/swift-concurrency-6-2/SKILL.md +216 -0
  322. package/skills/swift-protocol-di-testing/SKILL.md +191 -0
  323. package/skills/swiftui-patterns/SKILL.md +259 -0
  324. package/skills/taste/SKILL.md +264 -0
  325. package/skills/taste/references/genre-taxonomy.md +87 -0
  326. package/skills/tdd-workflow/SKILL.md +583 -0
  327. package/skills/team-agent-orchestration/SKILL.md +111 -0
  328. package/skills/team-builder/SKILL.md +169 -0
  329. package/skills/terminal-ops/SKILL.md +110 -0
  330. package/skills/tinystruct-patterns/SKILL.md +279 -0
  331. package/skills/tinystruct-patterns/references/architecture.md +90 -0
  332. package/skills/tinystruct-patterns/references/data-handling.md +60 -0
  333. package/skills/tinystruct-patterns/references/database.md +99 -0
  334. package/skills/tinystruct-patterns/references/routing.md +64 -0
  335. package/skills/tinystruct-patterns/references/system-usage.md +97 -0
  336. package/skills/tinystruct-patterns/references/testing.md +72 -0
  337. package/skills/token-budget-advisor/SKILL.md +134 -0
  338. package/skills/ui-demo/SKILL.md +466 -0
  339. package/skills/ui-to-vue/SKILL.md +135 -0
  340. package/skills/uncloud/SKILL.md +344 -0
  341. package/skills/unified-memory/SKILL.md +170 -0
  342. package/skills/unified-notifications-ops/SKILL.md +188 -0
  343. package/skills/verification-loop/SKILL.md +129 -0
  344. package/skills/video-editing/SKILL.md +311 -0
  345. package/skills/videodb/SKILL.md +375 -0
  346. package/skills/visa-doc-translate/SKILL.md +117 -0
  347. package/skills/vite-patterns/SKILL.md +450 -0
  348. package/skills/vue-patterns/SKILL.md +471 -0
  349. package/skills/windows-desktop-e2e/SKILL.md +888 -0
  350. package/skills/workspace-surface-audit/SKILL.md +126 -0
  351. package/skills/x-api/SKILL.md +235 -0
@@ -0,0 +1,185 @@
1
+ ---
2
+ name: frontend-slides
3
+ description: Create stunning, animation-rich HTML presentations from scratch or by converting PowerPoint files. Use when the user wants to build a presentation, convert a PPT/PPTX to web, or create slides for a talk/pitch. Helps non-designers discover their aesthetic through visual exploration rather than abstract choices.
4
+ metadata:
5
+ origin: ECC
6
+ ---
7
+
8
+ # Frontend Slides
9
+
10
+ Create zero-dependency, animation-rich HTML presentations that run entirely in the browser.
11
+
12
+ Inspired by the visual exploration approach showcased in work by zarazhangrui (credit: @zarazhangrui).
13
+
14
+ ## When to Activate
15
+
16
+ - Creating a talk deck, pitch deck, workshop deck, or internal presentation
17
+ - Converting `.ppt` or `.pptx` slides into an HTML presentation
18
+ - Improving an existing HTML presentation's layout, motion, or typography
19
+ - Exploring presentation styles with a user who does not know their design preference yet
20
+
21
+ ## Non-Negotiables
22
+
23
+ 1. **Zero dependencies**: default to one self-contained HTML file with inline CSS and JS.
24
+ 2. **Viewport fit is mandatory**: every slide must fit inside one viewport with no internal scrolling.
25
+ 3. **Show, don't tell**: use visual previews instead of abstract style questionnaires.
26
+ 4. **Distinctive design**: avoid generic purple-gradient, Inter-on-white, template-looking decks.
27
+ 5. **Production quality**: keep code commented, accessible, responsive, and performant.
28
+
29
+ Before generating, read `STYLE_PRESETS.md` for the viewport-safe CSS base, density limits, preset catalog, and CSS gotchas.
30
+
31
+ ## Workflow
32
+
33
+ ### 1. Detect Mode
34
+
35
+ Choose one path:
36
+ - **New presentation**: user has a topic, notes, or full draft
37
+ - **PPT conversion**: user has `.ppt` or `.pptx`
38
+ - **Enhancement**: user already has HTML slides and wants improvements
39
+
40
+ ### 2. Discover Content
41
+
42
+ Ask only the minimum needed:
43
+ - purpose: pitch, teaching, conference talk, internal update
44
+ - length: short (5-10), medium (10-20), long (20+)
45
+ - content state: finished copy, rough notes, topic only
46
+
47
+ If the user has content, ask them to paste it before styling.
48
+
49
+ ### 3. Discover Style
50
+
51
+ Default to visual exploration.
52
+
53
+ If the user already knows the desired preset, skip previews and use it directly.
54
+
55
+ Otherwise:
56
+ 1. Ask what feeling the deck should create: impressed, energized, focused, inspired.
57
+ 2. Generate **3 single-slide preview files** in `.ecc-design/slide-previews/`.
58
+ 3. Each preview must be self-contained, show typography/color/motion clearly, and stay under roughly 100 lines of slide content.
59
+ 4. Ask the user which preview to keep or what elements to mix.
60
+
61
+ Use the preset guide in `STYLE_PRESETS.md` when mapping mood to style.
62
+
63
+ ### 4. Build the Presentation
64
+
65
+ Output either:
66
+ - `presentation.html`
67
+ - `[presentation-name].html`
68
+
69
+ Use an `assets/` folder only when the deck contains extracted or user-supplied images.
70
+
71
+ Required structure:
72
+ - semantic slide sections
73
+ - a viewport-safe CSS base from `STYLE_PRESETS.md`
74
+ - CSS custom properties for theme values
75
+ - a presentation controller class for keyboard, wheel, and touch navigation
76
+ - Intersection Observer for reveal animations
77
+ - reduced-motion support
78
+
79
+ ### 5. Enforce Viewport Fit
80
+
81
+ Treat this as a hard gate.
82
+
83
+ Rules:
84
+ - every `.slide` must use `height: 100vh; height: 100dvh; overflow: hidden;`
85
+ - all type and spacing must scale with `clamp()`
86
+ - when content does not fit, split into multiple slides
87
+ - never solve overflow by shrinking text below readable sizes
88
+ - never allow scrollbars inside a slide
89
+
90
+ Use the density limits and mandatory CSS block in `STYLE_PRESETS.md`.
91
+
92
+ ### 6. Validate
93
+
94
+ Check the finished deck at these sizes:
95
+ - 1920x1080
96
+ - 1280x720
97
+ - 768x1024
98
+ - 375x667
99
+ - 667x375
100
+
101
+ If browser automation is available, use it to verify no slide overflows and that keyboard navigation works.
102
+
103
+ ### 7. Deliver
104
+
105
+ At handoff:
106
+ - delete temporary preview files unless the user wants to keep them
107
+ - open the deck with the platform-appropriate opener when useful
108
+ - summarize file path, preset used, slide count, and easy theme customization points
109
+
110
+ Use the correct opener for the current OS:
111
+ - macOS: `open file.html`
112
+ - Linux: `xdg-open file.html`
113
+ - Windows: `start "" file.html`
114
+
115
+ ## PPT / PPTX Conversion
116
+
117
+ For PowerPoint conversion:
118
+ 1. Prefer `python3` with `python-pptx` to extract text, images, and notes.
119
+ 2. If `python-pptx` is unavailable, ask whether to install it or fall back to a manual/export-based workflow.
120
+ 3. Preserve slide order, speaker notes, and extracted assets.
121
+ 4. After extraction, run the same style-selection workflow as a new presentation.
122
+
123
+ Keep conversion cross-platform. Do not rely on macOS-only tools when Python can do the job.
124
+
125
+ ## Implementation Requirements
126
+
127
+ ### HTML / CSS
128
+
129
+ - Use inline CSS and JS unless the user explicitly wants a multi-file project.
130
+ - Fonts may come from Google Fonts or Fontshare.
131
+ - Prefer atmospheric backgrounds, strong type hierarchy, and a clear visual direction.
132
+ - Use abstract shapes, gradients, grids, noise, and geometry rather than illustrations.
133
+
134
+ ### JavaScript
135
+
136
+ Include:
137
+ - keyboard navigation
138
+ - touch / swipe navigation
139
+ - mouse wheel navigation
140
+ - progress indicator or slide index
141
+ - reveal-on-enter animation triggers
142
+
143
+ ### Accessibility
144
+
145
+ - use semantic structure (`main`, `section`, `nav`)
146
+ - keep contrast readable
147
+ - support keyboard-only navigation
148
+ - respect `prefers-reduced-motion`
149
+
150
+ ## Content Density Limits
151
+
152
+ Use these maxima unless the user explicitly asks for denser slides and readability still holds:
153
+
154
+ | Slide type | Limit |
155
+ |------------|-------|
156
+ | Title | 1 heading + 1 subtitle + optional tagline |
157
+ | Content | 1 heading + 4-6 bullets or 2 short paragraphs |
158
+ | Feature grid | 6 cards max |
159
+ | Code | 8-10 lines max |
160
+ | Quote | 1 quote + attribution |
161
+ | Image | 1 image constrained by viewport |
162
+
163
+ ## Anti-Patterns
164
+
165
+ - generic startup gradients with no visual identity
166
+ - system-font decks unless intentionally editorial
167
+ - long bullet walls
168
+ - code blocks that need scrolling
169
+ - fixed-height content boxes that break on short screens
170
+ - invalid negated CSS functions like `-clamp(...)`
171
+
172
+ ## Related ECC Skills
173
+
174
+ - `frontend-patterns` for component and interaction patterns around the deck
175
+ - `liquid-glass-design` when a presentation intentionally borrows Apple glass aesthetics
176
+ - `e2e-testing` if you need automated browser verification for the final deck
177
+
178
+ ## Deliverable Checklist
179
+
180
+ - presentation runs from a local file in a browser
181
+ - every slide fits the viewport without scrolling
182
+ - style is distinctive and intentional
183
+ - animation is meaningful, not noisy
184
+ - reduced motion is respected
185
+ - file paths and customization points are explained at handoff
@@ -0,0 +1,281 @@
1
+ ---
2
+ name: fsharp-testing
3
+ description: F# testing patterns with xUnit, FsUnit, Unquote, FsCheck property-based testing, integration tests, and test organization best practices.
4
+ metadata:
5
+ origin: ECC
6
+ ---
7
+
8
+ # F# Testing Patterns
9
+
10
+ Comprehensive testing patterns for F# applications using xUnit, FsUnit, Unquote, FsCheck, and modern .NET testing practices.
11
+
12
+ ## When to Activate
13
+
14
+ - Writing new tests for F# code
15
+ - Reviewing test quality and coverage
16
+ - Setting up test infrastructure for F# projects
17
+ - Debugging flaky or slow tests
18
+
19
+ ## Test Framework Stack
20
+
21
+ | Tool | Purpose |
22
+ |---|---|
23
+ | **xUnit** | Test framework (standard .NET ecosystem choice) |
24
+ | **FsUnit.xUnit** | F#-friendly assertion syntax for xUnit |
25
+ | **Unquote** | Assertion library using F# quotations for clear failure messages |
26
+ | **FsCheck.xUnit** | Property-based testing integrated with xUnit |
27
+ | **NSubstitute** | Mocking .NET dependencies |
28
+ | **Testcontainers** | Real infrastructure in integration tests |
29
+ | **WebApplicationFactory** | ASP.NET Core integration tests |
30
+
31
+ ## Unit Tests with xUnit + FsUnit
32
+
33
+ ### Basic Test Structure
34
+
35
+ ```fsharp
36
+ module OrderServiceTests
37
+
38
+ open Xunit
39
+ open FsUnit.Xunit
40
+
41
+ [<Fact>]
42
+ let ``create sets status to Pending`` () =
43
+ let order = Order.create "cust-1" [ validItem ]
44
+ order.Status |> should equal Pending
45
+
46
+ [<Fact>]
47
+ let ``confirm changes status to Confirmed`` () =
48
+ let order = Order.create "cust-1" [ validItem ]
49
+ let confirmed = Order.confirm order
50
+ confirmed.Status |> should be (ofCase <@ Confirmed @>)
51
+ ```
52
+
53
+ ### Assertions with Unquote
54
+
55
+ Unquote uses F# quotations so failure messages show the full expression that failed, not just "expected X got Y".
56
+
57
+ ```fsharp
58
+ module OrderValidationTests
59
+
60
+ open Xunit
61
+ open Swensen.Unquote
62
+
63
+ [<Fact>]
64
+ let ``PlaceOrder returns success when request is valid`` () =
65
+ let request = { CustomerId = "cust-123"; Items = [ validItem ] }
66
+ let result = OrderService.placeOrder request
67
+ test <@ Result.isOk result @>
68
+
69
+ [<Fact>]
70
+ let ``order total sums item prices`` () =
71
+ let items = [ { Sku = "A"; Quantity = 2; Price = 10m }
72
+ { Sku = "B"; Quantity = 1; Price = 5m } ]
73
+ let total = Order.calculateTotal items
74
+ test <@ total = 25m @>
75
+
76
+ [<Fact>]
77
+ let ``validated email rejects empty input`` () =
78
+ let result = ValidatedEmail.create ""
79
+ test <@ Result.isError result @>
80
+ ```
81
+
82
+ ### Async Tests
83
+
84
+ ```fsharp
85
+ [<Fact>]
86
+ let ``PlaceOrder returns success when request is valid`` () = task {
87
+ let deps = createTestDeps ()
88
+ let request = { CustomerId = "cust-123"; Items = [ validItem ] }
89
+
90
+ let! result = OrderService.placeOrder deps request
91
+
92
+ test <@ Result.isOk result @>
93
+ }
94
+
95
+ [<Fact>]
96
+ let ``PlaceOrder returns error when items are empty`` () = task {
97
+ let deps = createTestDeps ()
98
+ let request = { CustomerId = "cust-123"; Items = [] }
99
+
100
+ let! result = OrderService.placeOrder deps request
101
+
102
+ test <@ Result.isError result @>
103
+ }
104
+ ```
105
+
106
+ ### Parameterized Tests with Theory
107
+
108
+ ```fsharp
109
+ [<Theory>]
110
+ [<InlineData("")>]
111
+ [<InlineData(" ")>]
112
+ let ``PlaceOrder rejects empty customer ID`` (customerId: string) =
113
+ let request = { CustomerId = customerId; Items = [ validItem ] }
114
+ let result = OrderService.placeOrder request
115
+ result |> should be (ofCase <@ Error @>)
116
+
117
+ [<Theory>]
118
+ [<InlineData("", false)>]
119
+ [<InlineData("a", false)>]
120
+ [<InlineData("user@example.com", true)>]
121
+ [<InlineData("user+tag@example.co.uk", true)>]
122
+ let ``IsValidEmail returns expected result`` (email: string, expected: bool) =
123
+ test <@ EmailValidator.isValid email = expected @>
124
+ ```
125
+
126
+ ## Property-Based Testing with FsCheck
127
+
128
+ ### Using FsCheck.xUnit
129
+
130
+ ```fsharp
131
+ open FsCheck
132
+ open FsCheck.Xunit
133
+
134
+ [<Property>]
135
+ let ``order total is always non-negative`` (items: NonEmptyList<PositiveInt * decimal>) =
136
+ let orderItems =
137
+ items.Get
138
+ |> List.map (fun (qty, price) ->
139
+ { Sku = "SKU"; Quantity = qty.Get; Price = abs price })
140
+ let total = Order.calculateTotal orderItems
141
+ total >= 0m
142
+
143
+ [<Property>]
144
+ let ``serialization roundtrips`` (order: Order) =
145
+ let json = JsonSerializer.Serialize order
146
+ let deserialized = JsonSerializer.Deserialize<Order> json
147
+ deserialized = order
148
+ ```
149
+
150
+ ### Custom Generators
151
+
152
+ ```fsharp
153
+ type OrderGenerators =
154
+ static member ValidEmail () =
155
+ gen {
156
+ let! user = Gen.elements [ "alice"; "bob"; "carol" ]
157
+ let! domain = Gen.elements [ "example.com"; "test.org" ]
158
+ return $"{user}@{domain}"
159
+ }
160
+ |> Arb.fromGen
161
+
162
+ [<Property(Arbitrary = [| typeof<OrderGenerators> |])>]
163
+ let ``valid emails pass validation`` (email: string) =
164
+ EmailValidator.isValid email
165
+ ```
166
+
167
+ ## Mocking Dependencies
168
+
169
+ ### Function Stubs (Preferred)
170
+
171
+ ```fsharp
172
+ let createTestDeps () =
173
+ let mutable savedOrders = []
174
+ { FindOrder = fun id -> task { return Map.tryFind id testData }
175
+ SaveOrder = fun order -> task { savedOrders <- order :: savedOrders }
176
+ SendNotification = fun _ -> Task.CompletedTask }
177
+
178
+ [<Fact>]
179
+ let ``PlaceOrder saves the confirmed order`` () = task {
180
+ let mutable saved = []
181
+ let deps =
182
+ { createTestDeps () with
183
+ SaveOrder = fun order -> task { saved <- order :: saved } }
184
+
185
+ let! _ = OrderService.placeOrder deps validRequest
186
+
187
+ test <@ saved.Length = 1 @>
188
+ }
189
+ ```
190
+
191
+ ### NSubstitute for .NET Interfaces
192
+
193
+ ```fsharp
194
+ open NSubstitute
195
+
196
+ [<Fact>]
197
+ let ``calls repository with correct ID`` () = task {
198
+ let repo = Substitute.For<IOrderRepository>()
199
+ repo.FindByIdAsync(Arg.Any<Guid>(), Arg.Any<CancellationToken>())
200
+ .Returns(Task.FromResult(Some testOrder))
201
+
202
+ let service = OrderService(repo)
203
+ let! _ = service.GetOrder(testOrder.Id, CancellationToken.None)
204
+
205
+ do! repo.Received(1).FindByIdAsync(testOrder.Id, Arg.Any<CancellationToken>())
206
+ }
207
+ ```
208
+
209
+ ## ASP.NET Core Integration Tests
210
+
211
+ ```fsharp
212
+ type OrderApiTests (factory: WebApplicationFactory<Program>) =
213
+ interface IClassFixture<WebApplicationFactory<Program>>
214
+
215
+ let client =
216
+ factory.WithWebHostBuilder(fun builder ->
217
+ builder.ConfigureServices(fun services ->
218
+ services.RemoveAll<DbContextOptions<AppDbContext>>() |> ignore
219
+ services.AddDbContext<AppDbContext>(fun options ->
220
+ options.UseInMemoryDatabase("TestDb") |> ignore) |> ignore))
221
+ .CreateClient()
222
+
223
+ [<Fact>]
224
+ member _.``GET order returns 404 when not found`` () = task {
225
+ let! response = client.GetAsync($"/api/orders/{Guid.NewGuid()}")
226
+ test <@ response.StatusCode = HttpStatusCode.NotFound @>
227
+ }
228
+ ```
229
+
230
+ ## Test Organization
231
+
232
+ ```
233
+ tests/
234
+ MyApp.Tests/
235
+ Unit/
236
+ OrderServiceTests.fs
237
+ PaymentServiceTests.fs
238
+ Integration/
239
+ OrderApiTests.fs
240
+ OrderRepositoryTests.fs
241
+ Properties/
242
+ OrderPropertyTests.fs
243
+ Helpers/
244
+ TestData.fs
245
+ TestDeps.fs
246
+ ```
247
+
248
+ ## Common Anti-Patterns
249
+
250
+ | Anti-Pattern | Fix |
251
+ |---|---|
252
+ | Testing implementation details | Test behavior and outcomes |
253
+ | Mutable shared test state | Fresh state per test |
254
+ | `Thread.Sleep` in async tests | Use `Task.Delay` with timeout, or polling helpers |
255
+ | Asserting on `sprintf` output | Assert on typed values and pattern matches |
256
+ | Ignoring `CancellationToken` | Always pass and verify cancellation |
257
+ | Skipping property-based tests | Use FsCheck for any function with clear invariants |
258
+
259
+ ## Related Skills
260
+
261
+ - `dotnet-patterns` - Idiomatic .NET patterns, dependency injection, and architecture
262
+ - `csharp-testing` - C# testing patterns (shared infrastructure like WebApplicationFactory and Testcontainers applies to F# too)
263
+
264
+ ## Running Tests
265
+
266
+ ```bash
267
+ # Run all tests
268
+ dotnet test
269
+
270
+ # Run with coverage
271
+ dotnet test --collect:"XPlat Code Coverage"
272
+
273
+ # Run specific project
274
+ dotnet test tests/MyApp.Tests/
275
+
276
+ # Filter by test name
277
+ dotnet test --filter "FullyQualifiedName~OrderService"
278
+
279
+ # Watch mode during development
280
+ dotnet watch test --project tests/MyApp.Tests/
281
+ ```