@haposoft/cafekit 0.16.0-rc.8 → 0.16.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 (297) hide show
  1. package/README.md +116 -27
  2. package/bin/__tests__/codex-hooks-ownership.test.js +239 -0
  3. package/bin/__tests__/codex-hooks.test.js +50 -0
  4. package/bin/__tests__/codex-native.test.js +1882 -70
  5. package/bin/__tests__/develop-contract.test.js +400 -23
  6. package/bin/__tests__/installer-safety.test.js +3 -3
  7. package/bin/__tests__/optional-skill-inventory.test.js +249 -0
  8. package/bin/__tests__/output-styles.test.js +214 -0
  9. package/bin/__tests__/package-inventory.test.js +1735 -98
  10. package/bin/__tests__/runtime-schema.test.js +111 -0
  11. package/bin/__tests__/secret-output-guardrail.test.js +122 -0
  12. package/bin/__tests__/skill-routing-source.test.js +172 -0
  13. package/bin/__tests__/specs-v2-execution-closeout.test.js +1 -1
  14. package/bin/install.js +10 -0
  15. package/bin/lib/codex-install.js +170 -5
  16. package/bin/lib/context.js +14 -0
  17. package/bin/lib/i18n.js +12 -6
  18. package/bin/lib/skill-deps.js +5 -5
  19. package/bin/phases/claude-runtime.js +23 -0
  20. package/bin/phases/claude-settings.js +8 -0
  21. package/bin/phases/codex-hooks.js +156 -0
  22. package/bin/phases/codex-runtime.js +29 -38
  23. package/bin/phases/copy-payload.js +8 -2
  24. package/bin/phases/select-skill-bundles.js +96 -0
  25. package/bin/phases/skill-inventory.js +71 -0
  26. package/bin/phases/skills-setup.js +9 -2
  27. package/bin/phases/write-metadata.js +8 -5
  28. package/package.json +8 -2
  29. package/src/claude/CLAUDE.md +3 -3
  30. package/src/claude/agents/brainstormer.md +52 -69
  31. package/src/claude/agents/code-auditor.md +32 -14
  32. package/src/claude/agents/debugger.md +35 -20
  33. package/src/claude/agents/deployer.md +12 -5
  34. package/src/claude/agents/docs-keeper.md +11 -1
  35. package/src/claude/agents/implementer.md +25 -13
  36. package/src/claude/agents/inspector.md +6 -3
  37. package/src/claude/agents/project-manager.md +1 -1
  38. package/src/claude/agents/researcher.md +26 -55
  39. package/src/claude/agents/spec-maker.md +12 -7
  40. package/src/claude/agents/strategist.md +52 -0
  41. package/src/claude/agents/test-runner.md +117 -132
  42. package/src/claude/agents/ui-ux-designer.md +1 -1
  43. package/src/claude/hooks/__tests__/fixtures/statusline-default.golden +1 -0
  44. package/src/claude/hooks/__tests__/precompact.test.js +158 -0
  45. package/src/claude/hooks/__tests__/spec-gate.test.js +10 -3
  46. package/src/claude/hooks/__tests__/state.test.js +5 -0
  47. package/src/claude/hooks/__tests__/statusline.test.js +196 -0
  48. package/src/claude/hooks/agent.cjs +1 -1
  49. package/src/claude/hooks/docs-sync.cjs +12 -10
  50. package/src/claude/hooks/inspect-block.cjs +1 -1
  51. package/src/claude/hooks/lib/config.cjs +3 -0
  52. package/src/claude/hooks/lib/hook-state-dir.cjs +39 -0
  53. package/src/claude/hooks/lib/secret-keywords.cjs +42 -0
  54. package/src/claude/hooks/precompact.cjs +105 -0
  55. package/src/claude/hooks/rules.cjs +1 -1
  56. package/src/claude/hooks/secret-output-guardrail.cjs +43 -0
  57. package/src/claude/hooks/session.cjs +27 -1
  58. package/src/claude/hooks/spec-gate.cjs +3 -3
  59. package/src/claude/hooks/spec-state.cjs +2 -2
  60. package/src/claude/hooks/state.cjs +1 -1
  61. package/src/claude/hooks/task-scaffold-guard.cjs +1 -1
  62. package/src/claude/hooks/usage.cjs +1 -1
  63. package/src/claude/migration-manifest.json +29 -15
  64. package/src/claude/output-styles/coding-level-0-eli5.md +103 -0
  65. package/src/claude/output-styles/coding-level-1-junior.md +124 -0
  66. package/src/claude/output-styles/coding-level-2-mid.md +146 -0
  67. package/src/claude/output-styles/coding-level-3-senior.md +148 -0
  68. package/src/claude/output-styles/coding-level-4-lead.md +159 -0
  69. package/src/claude/output-styles/coding-level-5-god.md +91 -0
  70. package/src/claude/references/debugger/core-philosophy.md +5 -3
  71. package/src/claude/references/debugger/frontend-verification.md +2 -2
  72. package/src/claude/references/debugger/log-ci-analysis.md +13 -1
  73. package/src/claude/references/debugger/parallel-agent-hydration.md +19 -34
  74. package/src/claude/references/debugger/performance-diagnostics.md +2 -2
  75. package/src/claude/references/debugger/root-cause-tracing.md +37 -6
  76. package/src/claude/references/debugger/side-effect-gate.md +3 -1
  77. package/src/claude/references/debugger/verification-protocol.md +13 -12
  78. package/src/claude/rules/orchestrator.md +7 -1
  79. package/src/claude/rules/process-management.md +39 -0
  80. package/src/claude/rules/review-audit-self-decision.md +48 -0
  81. package/src/claude/rules/skill-domain-routing.md +26 -24
  82. package/src/claude/rules/skill-workflow-routing.md +22 -14
  83. package/src/claude/rules/workflow.md +3 -3
  84. package/src/claude/runtime.json +1 -0
  85. package/src/claude/runtime.schema.json +205 -0
  86. package/src/claude/scripts/generate-skill-catalog.cjs +156 -122
  87. package/src/claude/scripts/provenance.cjs +18 -5
  88. package/src/claude/scripts/workflow-policy.cjs +1 -1
  89. package/src/claude/settings/settings.json +16 -0
  90. package/src/claude/skills/agent-browser/SKILL.md +1 -1
  91. package/src/claude/skills/ai-multimodal/SKILL.md +1 -1
  92. package/src/claude/skills/brainstorm/SKILL.md +193 -172
  93. package/src/claude/skills/brainstorm/references/question-framework.md +105 -167
  94. package/src/claude/skills/chrome-devtools/SKILL.md +1 -1
  95. package/src/claude/skills/code-review/SKILL.md +43 -25
  96. package/src/claude/skills/code-review/references/spec-compliance-review.md +3 -4
  97. package/src/claude/skills/code-review/references/verification-gate.md +1 -1
  98. package/src/claude/skills/debug/SKILL.md +48 -19
  99. package/src/claude/skills/delegate/SKILL.md +1 -1
  100. package/src/claude/skills/develop/SKILL.md +92 -65
  101. package/src/claude/skills/develop/references/parallel-waves.md +36 -63
  102. package/src/claude/skills/develop/references/quality-gate.md +31 -4
  103. package/src/claude/skills/develop/references/subagent-patterns.md +21 -7
  104. package/src/claude/skills/docs/SKILL.md +42 -23
  105. package/src/claude/skills/docs/references/init-workflow.md +4 -4
  106. package/src/claude/skills/docs/references/reconstruct-workflow.md +6 -6
  107. package/src/claude/skills/docs/references/standard-docs-workflow.md +6 -2
  108. package/src/claude/skills/docs/references/summarize-workflow.md +2 -2
  109. package/src/claude/skills/docs/references/update-workflow.md +9 -7
  110. package/src/claude/skills/docs/templates/requirements-as-is.md +1 -1
  111. package/src/claude/skills/docx/SKILL.md +1 -1
  112. package/src/claude/skills/git/SKILL.md +1 -1
  113. package/src/claude/skills/git/references/commit-protocols.md +1 -1
  114. package/src/claude/skills/git/references/finish-branch.md +1 -1
  115. package/src/claude/skills/hotfix/SKILL.md +159 -170
  116. package/src/claude/skills/hotfix/references/diagnosis-protocol.md +14 -9
  117. package/src/claude/skills/hotfix/references/parallel-patterns.md +27 -13
  118. package/src/claude/skills/hotfix/references/prevention-gate.md +5 -0
  119. package/src/claude/skills/hotfix/references/review-cycle.md +21 -15
  120. package/src/claude/skills/hotfix/references/workflow-specialized.md +53 -21
  121. package/src/claude/skills/inspect/SKILL.md +55 -46
  122. package/src/claude/skills/inspect/references/internal-inspection.md +21 -5
  123. package/src/claude/skills/loop/SKILL.md +114 -0
  124. package/src/claude/skills/loop/references/bounded-loop-protocol.md +104 -0
  125. package/src/claude/skills/loop/references/metric-and-guard-contract.md +76 -0
  126. package/src/claude/skills/pdf/SKILL.md +1 -1
  127. package/src/claude/skills/pptx/SKILL.md +1 -1
  128. package/src/claude/skills/question/SKILL.md +16 -13
  129. package/src/claude/skills/research/SKILL.md +70 -43
  130. package/src/claude/skills/route/SKILL.md +94 -0
  131. package/src/claude/skills/route/references/agent-timing.md +46 -0
  132. package/src/claude/skills/route/references/chaining-patterns.md +53 -0
  133. package/src/claude/skills/route/references/task-taxonomy.md +48 -0
  134. package/src/claude/skills/specs/SKILL.md +41 -60
  135. package/src/claude/skills/specs/references/review.md +11 -8
  136. package/src/claude/skills/specs/references/templates.md +34 -18
  137. package/src/claude/skills/specs/templates/requirements-init.md +1 -1
  138. package/src/claude/skills/specs/templates/research.md +2 -2
  139. package/src/claude/skills/sync/SKILL.md +6 -6
  140. package/src/claude/skills/sync/references/sync-protocols.md +1 -1
  141. package/src/claude/skills/test/SKILL.md +120 -120
  142. package/src/claude/skills/test/references/execution-strategy.md +208 -361
  143. package/src/claude/skills/test/references/failure-triage.md +55 -121
  144. package/src/claude/skills/test/references/test-memory.md +20 -34
  145. package/src/claude/skills/ui-ux-pro-max/SKILL.md +1 -1
  146. package/src/claude/skills/web-testing/SKILL.md +1 -1
  147. package/src/claude/skills/xlsx/SKILL.md +1 -1
  148. package/src/claude/status.cjs +135 -33
  149. package/src/codex/AGENTS.md +14 -4
  150. package/src/codex/hooks/docs-sync.cjs +8 -3
  151. package/src/codex/hooks/lib/hook-context.cjs +18 -4
  152. package/src/codex/hooks/rules.cjs +29 -1
  153. package/src/codex/hooks/secret-output-guardrail.cjs +30 -0
  154. package/src/codex/hooks/spec-gate.cjs +3 -8
  155. package/src/codex/hooks/spec-state.cjs +2 -1
  156. package/src/codex/hooks.json +5 -0
  157. package/src/codex/runtime.json +2 -0
  158. package/src/common/.env.example +1 -1
  159. package/src/claude/skills/backend-development/SKILL.md +0 -101
  160. package/src/claude/skills/backend-development/references/backend-api-design.md +0 -495
  161. package/src/claude/skills/backend-development/references/backend-architecture.md +0 -454
  162. package/src/claude/skills/backend-development/references/backend-authentication.md +0 -338
  163. package/src/claude/skills/backend-development/references/backend-code-quality.md +0 -659
  164. package/src/claude/skills/backend-development/references/backend-debugging.md +0 -904
  165. package/src/claude/skills/backend-development/references/backend-devops.md +0 -491
  166. package/src/claude/skills/backend-development/references/backend-mindset.md +0 -387
  167. package/src/claude/skills/backend-development/references/backend-performance.md +0 -397
  168. package/src/claude/skills/backend-development/references/backend-security.md +0 -342
  169. package/src/claude/skills/backend-development/references/backend-technologies.md +0 -256
  170. package/src/claude/skills/backend-development/references/backend-testing.md +0 -429
  171. package/src/claude/skills/devops/.env.example +0 -76
  172. package/src/claude/skills/devops/SKILL.md +0 -102
  173. package/src/claude/skills/devops/references/browser-rendering.md +0 -305
  174. package/src/claude/skills/devops/references/cloudflare-d1-kv.md +0 -123
  175. package/src/claude/skills/devops/references/cloudflare-platform.md +0 -271
  176. package/src/claude/skills/devops/references/cloudflare-r2-storage.md +0 -280
  177. package/src/claude/skills/devops/references/cloudflare-workers-advanced.md +0 -312
  178. package/src/claude/skills/devops/references/cloudflare-workers-apis.md +0 -309
  179. package/src/claude/skills/devops/references/cloudflare-workers-basics.md +0 -418
  180. package/src/claude/skills/devops/references/docker-basics.md +0 -297
  181. package/src/claude/skills/devops/references/docker-compose.md +0 -292
  182. package/src/claude/skills/devops/references/gcloud-platform.md +0 -297
  183. package/src/claude/skills/devops/references/gcloud-services.md +0 -304
  184. package/src/claude/skills/devops/references/kubernetes-basics.md +0 -95
  185. package/src/claude/skills/devops/references/kubernetes-helm-advanced.md +0 -70
  186. package/src/claude/skills/devops/references/kubernetes-helm.md +0 -81
  187. package/src/claude/skills/devops/references/kubernetes-kubectl.md +0 -74
  188. package/src/claude/skills/devops/references/kubernetes-security-advanced.md +0 -94
  189. package/src/claude/skills/devops/references/kubernetes-security.md +0 -89
  190. package/src/claude/skills/devops/references/kubernetes-troubleshooting-advanced.md +0 -74
  191. package/src/claude/skills/devops/references/kubernetes-troubleshooting.md +0 -49
  192. package/src/claude/skills/devops/references/kubernetes-workflows-advanced.md +0 -75
  193. package/src/claude/skills/devops/references/kubernetes-workflows.md +0 -76
  194. package/src/claude/skills/devops/scripts/cloudflare_deploy.py +0 -269
  195. package/src/claude/skills/devops/scripts/docker_optimize.py +0 -332
  196. package/src/claude/skills/devops/scripts/requirements.txt +0 -20
  197. package/src/claude/skills/devops/scripts/tests/requirements.txt +0 -3
  198. package/src/claude/skills/devops/scripts/tests/test_cloudflare_deploy.py +0 -285
  199. package/src/claude/skills/devops/scripts/tests/test_docker_optimize.py +0 -436
  200. package/src/claude/skills/frontend-design/SKILL.md +0 -135
  201. package/src/claude/skills/frontend-design/references/ai-multimodal-overview.md +0 -165
  202. package/src/claude/skills/frontend-design/references/analysis-best-practices.md +0 -80
  203. package/src/claude/skills/frontend-design/references/analysis-prompts.md +0 -141
  204. package/src/claude/skills/frontend-design/references/analysis-techniques.md +0 -118
  205. package/src/claude/skills/frontend-design/references/animejs.md +0 -396
  206. package/src/claude/skills/frontend-design/references/anti-slop-rules.md +0 -103
  207. package/src/claude/skills/frontend-design/references/asset-generation.md +0 -337
  208. package/src/claude/skills/frontend-design/references/bento-motion-engine.md +0 -142
  209. package/src/claude/skills/frontend-design/references/design-extraction-overview.md +0 -71
  210. package/src/claude/skills/frontend-design/references/extraction-best-practices.md +0 -141
  211. package/src/claude/skills/frontend-design/references/extraction-output-templates.md +0 -162
  212. package/src/claude/skills/frontend-design/references/extraction-prompts.md +0 -127
  213. package/src/claude/skills/frontend-design/references/magicui-components.md +0 -129
  214. package/src/claude/skills/frontend-design/references/performance-guardrails.md +0 -169
  215. package/src/claude/skills/frontend-design/references/premium-design-patterns.md +0 -93
  216. package/src/claude/skills/frontend-design/references/redesign-audit-checklist.md +0 -114
  217. package/src/claude/skills/frontend-design/references/technical-accessibility.md +0 -119
  218. package/src/claude/skills/frontend-design/references/technical-best-practices.md +0 -97
  219. package/src/claude/skills/frontend-design/references/technical-optimization.md +0 -44
  220. package/src/claude/skills/frontend-design/references/technical-overview.md +0 -90
  221. package/src/claude/skills/frontend-design/references/technical-workflows.md +0 -150
  222. package/src/claude/skills/frontend-design/references/visual-analysis-overview.md +0 -95
  223. package/src/claude/skills/frontend-design/references/workflow-3d.md +0 -102
  224. package/src/claude/skills/frontend-design/references/workflow-describe.md +0 -87
  225. package/src/claude/skills/frontend-design/references/workflow-immersive.md +0 -87
  226. package/src/claude/skills/frontend-design/references/workflow-quick.md +0 -57
  227. package/src/claude/skills/frontend-design/references/workflow-screenshot.md +0 -63
  228. package/src/claude/skills/frontend-design/references/workflow-video.md +0 -74
  229. package/src/claude/skills/frontend-development/SKILL.md +0 -406
  230. package/src/claude/skills/frontend-development/resources/common-patterns.md +0 -331
  231. package/src/claude/skills/frontend-development/resources/complete-examples.md +0 -872
  232. package/src/claude/skills/frontend-development/resources/component-patterns.md +0 -502
  233. package/src/claude/skills/frontend-development/resources/data-fetching.md +0 -767
  234. package/src/claude/skills/frontend-development/resources/file-organization.md +0 -502
  235. package/src/claude/skills/frontend-development/resources/loading-and-error-states.md +0 -501
  236. package/src/claude/skills/frontend-development/resources/performance.md +0 -406
  237. package/src/claude/skills/frontend-development/resources/routing-guide.md +0 -364
  238. package/src/claude/skills/frontend-development/resources/styling-guide.md +0 -428
  239. package/src/claude/skills/frontend-development/resources/typescript-standards.md +0 -418
  240. package/src/claude/skills/mobile-development/SKILL.md +0 -218
  241. package/src/claude/skills/mobile-development/references/mobile-android.md +0 -604
  242. package/src/claude/skills/mobile-development/references/mobile-best-practices.md +0 -544
  243. package/src/claude/skills/mobile-development/references/mobile-debugging.md +0 -1089
  244. package/src/claude/skills/mobile-development/references/mobile-frameworks.md +0 -465
  245. package/src/claude/skills/mobile-development/references/mobile-ios.md +0 -496
  246. package/src/claude/skills/mobile-development/references/mobile-mindset.md +0 -542
  247. package/src/claude/skills/react-best-practices/AGENTS.md +0 -2249
  248. package/src/claude/skills/react-best-practices/README.md +0 -123
  249. package/src/claude/skills/react-best-practices/SKILL.md +0 -128
  250. package/src/claude/skills/react-best-practices/metadata.json +0 -15
  251. package/src/claude/skills/react-best-practices/rules/_sections.md +0 -46
  252. package/src/claude/skills/react-best-practices/rules/_template.md +0 -28
  253. package/src/claude/skills/react-best-practices/rules/advanced-event-handler-refs.md +0 -55
  254. package/src/claude/skills/react-best-practices/rules/advanced-use-latest.md +0 -49
  255. package/src/claude/skills/react-best-practices/rules/async-api-routes.md +0 -38
  256. package/src/claude/skills/react-best-practices/rules/async-defer-await.md +0 -80
  257. package/src/claude/skills/react-best-practices/rules/async-dependencies.md +0 -36
  258. package/src/claude/skills/react-best-practices/rules/async-parallel.md +0 -28
  259. package/src/claude/skills/react-best-practices/rules/async-suspense-boundaries.md +0 -99
  260. package/src/claude/skills/react-best-practices/rules/bundle-barrel-imports.md +0 -59
  261. package/src/claude/skills/react-best-practices/rules/bundle-conditional.md +0 -31
  262. package/src/claude/skills/react-best-practices/rules/bundle-defer-third-party.md +0 -49
  263. package/src/claude/skills/react-best-practices/rules/bundle-dynamic-imports.md +0 -35
  264. package/src/claude/skills/react-best-practices/rules/bundle-preload.md +0 -50
  265. package/src/claude/skills/react-best-practices/rules/client-event-listeners.md +0 -74
  266. package/src/claude/skills/react-best-practices/rules/client-swr-dedup.md +0 -56
  267. package/src/claude/skills/react-best-practices/rules/js-batch-dom-css.md +0 -82
  268. package/src/claude/skills/react-best-practices/rules/js-cache-function-results.md +0 -80
  269. package/src/claude/skills/react-best-practices/rules/js-cache-property-access.md +0 -28
  270. package/src/claude/skills/react-best-practices/rules/js-cache-storage.md +0 -70
  271. package/src/claude/skills/react-best-practices/rules/js-combine-iterations.md +0 -32
  272. package/src/claude/skills/react-best-practices/rules/js-early-exit.md +0 -50
  273. package/src/claude/skills/react-best-practices/rules/js-hoist-regexp.md +0 -45
  274. package/src/claude/skills/react-best-practices/rules/js-index-maps.md +0 -37
  275. package/src/claude/skills/react-best-practices/rules/js-length-check-first.md +0 -49
  276. package/src/claude/skills/react-best-practices/rules/js-min-max-loop.md +0 -82
  277. package/src/claude/skills/react-best-practices/rules/js-set-map-lookups.md +0 -24
  278. package/src/claude/skills/react-best-practices/rules/js-tosorted-immutable.md +0 -57
  279. package/src/claude/skills/react-best-practices/rules/rendering-activity.md +0 -26
  280. package/src/claude/skills/react-best-practices/rules/rendering-animate-svg-wrapper.md +0 -47
  281. package/src/claude/skills/react-best-practices/rules/rendering-conditional-render.md +0 -40
  282. package/src/claude/skills/react-best-practices/rules/rendering-content-visibility.md +0 -38
  283. package/src/claude/skills/react-best-practices/rules/rendering-hoist-jsx.md +0 -46
  284. package/src/claude/skills/react-best-practices/rules/rendering-hydration-no-flicker.md +0 -82
  285. package/src/claude/skills/react-best-practices/rules/rendering-svg-precision.md +0 -28
  286. package/src/claude/skills/react-best-practices/rules/rerender-defer-reads.md +0 -39
  287. package/src/claude/skills/react-best-practices/rules/rerender-dependencies.md +0 -45
  288. package/src/claude/skills/react-best-practices/rules/rerender-derived-state.md +0 -29
  289. package/src/claude/skills/react-best-practices/rules/rerender-functional-setstate.md +0 -74
  290. package/src/claude/skills/react-best-practices/rules/rerender-lazy-state-init.md +0 -58
  291. package/src/claude/skills/react-best-practices/rules/rerender-memo.md +0 -44
  292. package/src/claude/skills/react-best-practices/rules/rerender-transitions.md +0 -40
  293. package/src/claude/skills/react-best-practices/rules/server-after-nonblocking.md +0 -73
  294. package/src/claude/skills/react-best-practices/rules/server-cache-lru.md +0 -41
  295. package/src/claude/skills/react-best-practices/rules/server-cache-react.md +0 -26
  296. package/src/claude/skills/react-best-practices/rules/server-parallel-fetching.md +0 -79
  297. package/src/claude/skills/react-best-practices/rules/server-serialization.md +0 -38
@@ -1,429 +0,0 @@
1
- # Backend Testing Strategies
2
-
3
- Comprehensive testing approaches, frameworks, and quality assurance practices (2025).
4
-
5
- ## Test Pyramid (70-20-10 Rule)
6
-
7
- ```
8
- /\
9
- /E2E\ 10% - End-to-End Tests
10
- /------\
11
- /Integr.\ 20% - Integration Tests
12
- /----------\
13
- / Unit \ 70% - Unit Tests
14
- /--------------\
15
- ```
16
-
17
- **Rationale:**
18
- - Unit tests: Fast, cheap, isolate bugs quickly
19
- - Integration tests: Verify component interactions
20
- - E2E tests: Expensive, slow, but validate real user flows
21
-
22
- ## Unit Testing
23
-
24
- ### Frameworks by Language
25
-
26
- **TypeScript/JavaScript:**
27
- - **Vitest** - Faster than Jest in CI/CD, ESM native
28
- - **Jest** - Mature, large ecosystem, snapshot testing
29
-
30
- **Python:**
31
- - **Pytest** - Industry standard, fixtures, parametrization
32
- - **Unittest** - Built-in, standard library
33
-
34
- **Go:**
35
- - **testing** - Built-in, table-driven tests
36
- - **testify** - Assertions and mocking
37
-
38
- ### Best Practices
39
-
40
- ```typescript
41
- // Good: Test single responsibility
42
- describe('UserService', () => {
43
- describe('createUser', () => {
44
- it('should create user with valid data', async () => {
45
- const userData = { email: 'test@example.com', name: 'Test' };
46
- const user = await userService.createUser(userData);
47
-
48
- expect(user).toMatchObject(userData);
49
- expect(user.id).toBeDefined();
50
- });
51
-
52
- it('should throw error with duplicate email', async () => {
53
- const userData = { email: 'existing@example.com', name: 'Test' };
54
-
55
- await expect(userService.createUser(userData))
56
- .rejects.toThrow('Email already exists');
57
- });
58
-
59
- it('should hash password before storing', async () => {
60
- const userData = { email: 'test@example.com', password: 'plain123' };
61
- const user = await userService.createUser(userData);
62
-
63
- expect(user.password).not.toBe('plain123');
64
- expect(user.password).toMatch(/^\$argon2id\$/);
65
- });
66
- });
67
- });
68
- ```
69
-
70
- ### Mocking
71
-
72
- ```typescript
73
- // Mock external dependencies
74
- jest.mock('./emailService');
75
-
76
- it('should send welcome email after user creation', async () => {
77
- const emailService = require('./emailService');
78
- emailService.sendWelcomeEmail = jest.fn();
79
-
80
- await userService.createUser({ email: 'test@example.com' });
81
-
82
- expect(emailService.sendWelcomeEmail).toHaveBeenCalledWith('test@example.com');
83
- });
84
- ```
85
-
86
- ## Integration Testing
87
-
88
- ### API Integration Tests
89
-
90
- ```typescript
91
- import request from 'supertest';
92
- import { app } from '../app';
93
-
94
- describe('POST /api/users', () => {
95
- beforeAll(async () => {
96
- await db.connect(); // Real database connection (test DB)
97
- });
98
-
99
- afterAll(async () => {
100
- await db.disconnect();
101
- });
102
-
103
- beforeEach(async () => {
104
- await db.users.deleteMany({}); // Clean state
105
- });
106
-
107
- it('should create user and return 201', async () => {
108
- const response = await request(app)
109
- .post('/api/users')
110
- .send({ email: 'test@example.com', name: 'Test User' })
111
- .expect(201);
112
-
113
- expect(response.body).toMatchObject({
114
- email: 'test@example.com',
115
- name: 'Test User',
116
- });
117
-
118
- // Verify database persistence
119
- const user = await db.users.findOne({ email: 'test@example.com' });
120
- expect(user).toBeDefined();
121
- });
122
-
123
- it('should return 400 for invalid email', async () => {
124
- await request(app)
125
- .post('/api/users')
126
- .send({ email: 'invalid-email', name: 'Test' })
127
- .expect(400)
128
- .expect((res) => {
129
- expect(res.body.error).toBe('Invalid email format');
130
- });
131
- });
132
- });
133
- ```
134
-
135
- ### Database Testing with TestContainers
136
-
137
- ```typescript
138
- import { GenericContainer } from 'testcontainers';
139
-
140
- let container;
141
- let db;
142
-
143
- beforeAll(async () => {
144
- // Spin up real PostgreSQL in Docker
145
- container = await new GenericContainer('postgres:15')
146
- .withEnvironment({ POSTGRES_PASSWORD: 'test' })
147
- .withExposedPorts(5432)
148
- .start();
149
-
150
- const port = container.getMappedPort(5432);
151
- db = await createConnection({
152
- host: 'localhost',
153
- port,
154
- database: 'test',
155
- password: 'test',
156
- });
157
- }, 60000);
158
-
159
- afterAll(async () => {
160
- await container.stop();
161
- });
162
- ```
163
-
164
- ## Contract Testing (Microservices)
165
-
166
- ### Pact (Consumer-Driven Contracts)
167
-
168
- ```typescript
169
- // Consumer test
170
- import { Pact } from '@pact-foundation/pact';
171
-
172
- const provider = new Pact({
173
- consumer: 'UserService',
174
- provider: 'AuthService',
175
- });
176
-
177
- describe('Auth Service Contract', () => {
178
- beforeAll(() => provider.setup());
179
- afterEach(() => provider.verify());
180
- afterAll(() => provider.finalize());
181
-
182
- it('should validate user token', async () => {
183
- await provider.addInteraction({
184
- state: 'user token exists',
185
- uponReceiving: 'a request to validate token',
186
- withRequest: {
187
- method: 'POST',
188
- path: '/auth/validate',
189
- headers: { 'Content-Type': 'application/json' },
190
- body: { token: 'valid-token-123' },
191
- },
192
- willRespondWith: {
193
- status: 200,
194
- body: { valid: true, userId: '123' },
195
- },
196
- });
197
-
198
- const response = await authClient.validateToken('valid-token-123');
199
- expect(response.valid).toBe(true);
200
- });
201
- });
202
- ```
203
-
204
- ## Load Testing
205
-
206
- ### Tools Comparison
207
-
208
- **k6** (Modern, Developer-Friendly)
209
- ```javascript
210
- import http from 'k6/http';
211
- import { check, sleep } from 'k6';
212
-
213
- export const options = {
214
- stages: [
215
- { duration: '2m', target: 100 }, // Ramp up to 100 users
216
- { duration: '5m', target: 100 }, // Stay at 100 users
217
- { duration: '2m', target: 0 }, // Ramp down to 0 users
218
- ],
219
- thresholds: {
220
- http_req_duration: ['p(95)<500'], // 95% requests under 500ms
221
- },
222
- };
223
-
224
- export default function () {
225
- const res = http.get('https://api.example.com/users');
226
- check(res, {
227
- 'status is 200': (r) => r.status === 200,
228
- 'response time < 500ms': (r) => r.timings.duration < 500,
229
- });
230
- sleep(1);
231
- }
232
- ```
233
-
234
- **Gatling** (JVM-based, Advanced Scenarios)
235
- **JMeter** (GUI-based, Traditional)
236
-
237
- ### Performance Thresholds
238
-
239
- - **Response time:** p95 < 500ms, p99 < 1s
240
- - **Throughput:** 1000+ req/sec (target based on SLA)
241
- - **Error rate:** < 1%
242
- - **Concurrent users:** Test at 2x expected peak
243
-
244
- ## E2E Testing
245
-
246
- ### Playwright (Modern, Multi-Browser)
247
-
248
- ```typescript
249
- import { test, expect } from '@playwright/test';
250
-
251
- test('user can register and login', async ({ page }) => {
252
- // Navigate to registration page
253
- await page.goto('https://app.example.com/register');
254
-
255
- // Fill registration form
256
- await page.fill('input[name="email"]', 'test@example.com');
257
- await page.fill('input[name="password"]', 'SecurePass123!');
258
- await page.click('button[type="submit"]');
259
-
260
- // Verify redirect to dashboard
261
- await expect(page).toHaveURL('/dashboard');
262
- await expect(page.locator('h1')).toContainText('Welcome');
263
-
264
- // Verify API call was made
265
- const response = await page.waitForResponse('/api/users');
266
- expect(response.status()).toBe(201);
267
- });
268
- ```
269
-
270
- ## Database Migration Testing
271
-
272
- **Migrations fail without proper testing**
273
-
274
- ```typescript
275
- describe('Database Migrations', () => {
276
- it('should migrate from v1 to v2 without data loss', async () => {
277
- // Insert test data in v1 schema
278
- await db.query(`
279
- INSERT INTO users (id, email, name)
280
- VALUES (1, 'test@example.com', 'Test User')
281
- `);
282
-
283
- // Run migration
284
- await runMigration('v2-add-created-at.sql');
285
-
286
- // Verify v2 schema
287
- const result = await db.query('SELECT * FROM users WHERE id = 1');
288
- expect(result.rows[0]).toMatchObject({
289
- id: 1,
290
- email: 'test@example.com',
291
- name: 'Test User',
292
- created_at: expect.any(Date),
293
- });
294
- });
295
-
296
- it('should rollback migration successfully', async () => {
297
- await runMigration('v2-add-created-at.sql');
298
- await rollbackMigration('v2-add-created-at.sql');
299
-
300
- // Verify v1 schema restored
301
- const columns = await db.query(`
302
- SELECT column_name FROM information_schema.columns
303
- WHERE table_name = 'users'
304
- `);
305
- expect(columns.rows.map(r => r.column_name)).not.toContain('created_at');
306
- });
307
- });
308
- ```
309
-
310
- ## Security Testing
311
-
312
- ### SAST (Static Application Security Testing)
313
-
314
- ```bash
315
- # SonarQube for code quality + security
316
- sonar-scanner \
317
- -Dsonar.projectKey=my-backend \
318
- -Dsonar.sources=src \
319
- -Dsonar.host.url=http://localhost:9000
320
-
321
- # Semgrep for security patterns
322
- semgrep --config auto src/
323
- ```
324
-
325
- ### DAST (Dynamic Application Security Testing)
326
-
327
- ```bash
328
- # OWASP ZAP for runtime security scanning
329
- docker run -t owasp/zap2docker-stable zap-baseline.py \
330
- -t https://api.example.com \
331
- -r zap-report.html
332
- ```
333
-
334
- ### Dependency Scanning (SCA)
335
-
336
- ```bash
337
- # npm audit for Node.js
338
- npm audit fix
339
-
340
- # Snyk for multi-language
341
- snyk test
342
- snyk monitor # Continuous monitoring
343
- ```
344
-
345
- ## Code Coverage
346
-
347
- ### Target Metrics (SonarQube Standards)
348
-
349
- - **Overall coverage:** 80%+
350
- - **Critical paths:** 100% (authentication, payment, data integrity)
351
- - **New code:** 90%+
352
-
353
- ### Implementation
354
-
355
- ```bash
356
- # Vitest with coverage
357
- vitest run --coverage
358
-
359
- # Jest with coverage
360
- jest --coverage --coverageThreshold='{"global":{"branches":80,"functions":80,"lines":80}}'
361
- ```
362
-
363
- ## CI/CD Testing Pipeline
364
-
365
- ```yaml
366
- # GitHub Actions example
367
- name: Test Pipeline
368
-
369
- on: [push, pull_request]
370
-
371
- jobs:
372
- test:
373
- runs-on: ubuntu-latest
374
- steps:
375
- - uses: actions/checkout@v3
376
-
377
- - name: Unit Tests
378
- run: npm run test:unit
379
-
380
- - name: Integration Tests
381
- run: npm run test:integration
382
-
383
- - name: E2E Tests
384
- run: npm run test:e2e
385
-
386
- - name: Load Tests
387
- run: k6 run load-test.js
388
-
389
- - name: Security Scan
390
- run: npm audit && snyk test
391
-
392
- - name: Coverage Report
393
- run: npm run test:coverage
394
-
395
- - name: Upload to Codecov
396
- uses: codecov/codecov-action@v3
397
- ```
398
-
399
- ## Testing Best Practices
400
-
401
- 1. **Arrange-Act-Assert (AAA) Pattern**
402
- 2. **One assertion per test** (when practical)
403
- 3. **Descriptive test names** - `should throw error when email is invalid`
404
- 4. **Test edge cases** - Empty inputs, boundary values, null/undefined
405
- 5. **Clean test data** - Reset database state between tests
406
- 6. **Fast tests** - Unit tests < 10ms, Integration < 100ms
407
- 7. **Deterministic** - No flaky tests, avoid sleep(), use waitFor()
408
- 8. **Independent** - Tests don't depend on execution order
409
-
410
- ## Testing Checklist
411
-
412
- - [ ] Unit tests cover 70% of codebase
413
- - [ ] Integration tests for all API endpoints
414
- - [ ] Contract tests for microservices
415
- - [ ] Load tests configured (k6/Gatling)
416
- - [ ] E2E tests for critical user flows
417
- - [ ] Database migration tests
418
- - [ ] Security scanning in CI/CD (SAST, DAST, SCA)
419
- - [ ] Code coverage reports automated
420
- - [ ] Tests run on every PR
421
- - [ ] Flaky tests eliminated
422
-
423
- ## Resources
424
-
425
- - **Vitest:** https://vitest.dev/
426
- - **Playwright:** https://playwright.dev/
427
- - **k6:** https://k6.io/docs/
428
- - **Pact:** https://docs.pact.io/
429
- - **TestContainers:** https://testcontainers.com/
@@ -1,76 +0,0 @@
1
- # DevOps Skill - Environment Variables
2
-
3
- # =============================================================================
4
- # Cloudflare Configuration
5
- # =============================================================================
6
- # Get these from: https://dash.cloudflare.com
7
- # API Token: Profile -> API Tokens -> Create Token
8
- # Account ID: Overview -> Account ID (right sidebar)
9
-
10
- CLOUDFLARE_API_TOKEN=your_cloudflare_api_token_here
11
- CLOUDFLARE_ACCOUNT_ID=your_cloudflare_account_id_here
12
-
13
- # Optional: Specific zone configuration
14
- # CLOUDFLARE_ZONE_ID=your_zone_id_here
15
-
16
- # =============================================================================
17
- # Google Cloud Configuration
18
- # =============================================================================
19
- # Authentication via service account key file or gcloud CLI
20
- # Download from: IAM & Admin -> Service Accounts -> Create Key
21
-
22
- # Option 1: Service account key file path
23
- GOOGLE_APPLICATION_CREDENTIALS=/path/to/service-account-key.json
24
-
25
- # Option 2: Project configuration
26
- # GCP_PROJECT_ID=your-project-id
27
- # GCP_REGION=us-central1
28
- # GCP_ZONE=us-central1-a
29
-
30
- # =============================================================================
31
- # Docker Configuration
32
- # =============================================================================
33
- # Optional: Docker registry authentication
34
-
35
- # Docker Hub
36
- # DOCKER_USERNAME=your_docker_username
37
- # DOCKER_PASSWORD=your_docker_password
38
-
39
- # Google Container Registry (GCR)
40
- # GCR_HOSTNAME=gcr.io
41
- # GCR_PROJECT_ID=your-project-id
42
-
43
- # AWS ECR
44
- # AWS_ACCOUNT_ID=123456789012
45
- # AWS_REGION=us-east-1
46
-
47
- # =============================================================================
48
- # CI/CD Configuration
49
- # =============================================================================
50
- # Optional: For automated deployments
51
-
52
- # GitHub Actions
53
- # GITHUB_TOKEN=your_github_token
54
-
55
- # GitLab CI
56
- # GITLAB_TOKEN=your_gitlab_token
57
-
58
- # =============================================================================
59
- # Monitoring & Logging
60
- # =============================================================================
61
- # Optional: For observability
62
-
63
- # Sentry
64
- # SENTRY_DSN=your_sentry_dsn
65
-
66
- # Datadog
67
- # DD_API_KEY=your_datadog_api_key
68
-
69
- # =============================================================================
70
- # Notes
71
- # =============================================================================
72
- # 1. Copy this file to .env and fill in your actual values
73
- # 2. Never commit .env file to version control
74
- # 3. Use different credentials for dev/staging/production
75
- # 4. Rotate credentials regularly
76
- # 5. Use least-privilege principle for API tokens
@@ -1,102 +0,0 @@
1
- ---
2
- name: hapo:devops
3
- description: Deploy to Cloudflare (Workers, R2, D1), Docker, GCP (Cloud Run, GKE), Kubernetes (kubectl, Helm). Use for serverless, containers, CI/CD, GitOps, security audit.
4
- license: MIT
5
- user-invocable: true
6
- when_to_use: "Invoke to deploy, containerize, or set up CI/CD and infra."
7
- category: devops
8
- keywords: [deploy, docker, ci-cd, kubernetes]
9
- argument-hint: "[platform] [task]"
10
- metadata:
11
- author: haposoft
12
- version: "2.0.0"
13
- ---
14
- # DevOps Skill
15
-
16
- Deploy and manage cloud infrastructure across Cloudflare, Docker, Google Cloud, and Kubernetes.
17
-
18
- ## When to Use
19
-
20
- - Deploy serverless apps to Cloudflare Workers/Pages
21
- - Containerize apps with Docker, Docker Compose
22
- - Manage GCP with gcloud CLI (Cloud Run, GKE, Cloud SQL)
23
- - Kubernetes cluster management (kubectl, Helm)
24
- - GitOps workflows (Argo CD, Flux)
25
- - CI/CD pipelines, multi-region deployments
26
- - Security audits, RBAC, network policies
27
-
28
- ## Platform Selection
29
-
30
- | Need | Choose |
31
- |------|--------|
32
- | Sub-50ms latency globally | Cloudflare Workers |
33
- | Large file storage (zero egress) | Cloudflare R2 |
34
- | SQL database (global reads) | Cloudflare D1 |
35
- | Containerized workloads | Docker + Cloud Run/GKE |
36
- | Enterprise Kubernetes | GKE |
37
- | Managed relational DB | Cloud SQL |
38
- | Static site + API | Cloudflare Pages |
39
- | Container orchestration | Kubernetes |
40
- | Package management for K8s | Helm |
41
-
42
- ## Quick Start
43
-
44
- ```bash
45
- # Cloudflare Worker
46
- wrangler init my-worker && cd my-worker && wrangler deploy
47
-
48
- # Docker
49
- docker build -t myapp . && docker run -p 3000:3000 myapp
50
-
51
- # GCP Cloud Run
52
- gcloud run deploy my-service --image gcr.io/project/image --region us-central1
53
-
54
- # Kubernetes
55
- kubectl apply -f manifests/ && kubectl get pods
56
- ```
57
-
58
- ## Reference Navigation
59
-
60
- ### Cloudflare Platform
61
- - `cloudflare-platform.md` - Edge computing overview
62
- - `cloudflare-workers-basics.md` - Handler types, patterns
63
- - `cloudflare-workers-advanced.md` - Performance, optimization
64
- - `cloudflare-workers-apis.md` - Runtime APIs, bindings
65
- - `cloudflare-r2-storage.md` - Object storage, S3 compatibility
66
- - `cloudflare-d1-kv.md` - D1 SQLite, KV store
67
- - `browser-rendering.md` - Puppeteer automation
68
-
69
- ### Docker
70
- - `docker-basics.md` - Dockerfile, images, containers
71
- - `docker-compose.md` - Multi-container apps
72
-
73
- ### Google Cloud
74
- - `gcloud-platform.md` - gcloud CLI, authentication
75
- - `gcloud-services.md` - Compute Engine, GKE, Cloud Run
76
-
77
- ### Kubernetes
78
- - `kubernetes-basics.md` - Core concepts, architecture, workloads
79
- - `kubernetes-kubectl.md` - Essential commands, debugging workflow
80
- - `kubernetes-helm.md` / `kubernetes-helm-advanced.md` - Helm charts, templates
81
- - `kubernetes-security.md` / `kubernetes-security-advanced.md` - RBAC, secrets
82
- - `kubernetes-workflows.md` / `kubernetes-workflows-advanced.md` - GitOps, CI/CD
83
- - `kubernetes-troubleshooting.md` / `kubernetes-troubleshooting-advanced.md` - Debug
84
-
85
- ### Scripts
86
- - `scripts/cloudflare-deploy.py` - Automate Worker deployments
87
- - `scripts/docker-optimize.py` - Analyze Dockerfiles
88
-
89
- ## Best Practices
90
-
91
- **Security:** Non-root containers, RBAC, secrets in env vars, image scanning
92
- **Performance:** Multi-stage builds, edge caching, resource limits
93
- **Cost:** R2 for large egress, caching, right-size resources
94
- **Development:** Docker Compose local dev, wrangler dev, version control IaC
95
-
96
- ## Resources
97
-
98
- - Cloudflare: https://developers.cloudflare.com
99
- - Docker: https://docs.docker.com
100
- - GCP: https://cloud.google.com/docs
101
- - Kubernetes: https://kubernetes.io/docs
102
- - Helm: https://helm.sh/docs