@haposoft/cafekit 0.16.0-rc.7 → 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 (299) 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 +295 -0
  4. package/bin/__tests__/codex-native.test.js +2289 -34
  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 +2131 -16
  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 +24 -13
  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 +87 -4
  46. package/src/claude/hooks/__tests__/state.test.js +254 -3
  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 +32 -5
  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/spec-receipt.cjs +76 -21
  89. package/src/claude/scripts/spec-resolver.cjs +144 -4
  90. package/src/claude/scripts/workflow-policy.cjs +1 -1
  91. package/src/claude/settings/settings.json +16 -0
  92. package/src/claude/skills/agent-browser/SKILL.md +1 -1
  93. package/src/claude/skills/ai-multimodal/SKILL.md +1 -1
  94. package/src/claude/skills/brainstorm/SKILL.md +193 -172
  95. package/src/claude/skills/brainstorm/references/question-framework.md +105 -167
  96. package/src/claude/skills/chrome-devtools/SKILL.md +1 -1
  97. package/src/claude/skills/code-review/SKILL.md +43 -25
  98. package/src/claude/skills/code-review/references/spec-compliance-review.md +3 -4
  99. package/src/claude/skills/code-review/references/verification-gate.md +1 -1
  100. package/src/claude/skills/debug/SKILL.md +48 -19
  101. package/src/claude/skills/delegate/SKILL.md +1 -1
  102. package/src/claude/skills/develop/SKILL.md +92 -65
  103. package/src/claude/skills/develop/references/parallel-waves.md +36 -63
  104. package/src/claude/skills/develop/references/quality-gate.md +31 -4
  105. package/src/claude/skills/develop/references/subagent-patterns.md +21 -7
  106. package/src/claude/skills/docs/SKILL.md +42 -23
  107. package/src/claude/skills/docs/references/init-workflow.md +4 -4
  108. package/src/claude/skills/docs/references/reconstruct-workflow.md +6 -6
  109. package/src/claude/skills/docs/references/standard-docs-workflow.md +6 -2
  110. package/src/claude/skills/docs/references/summarize-workflow.md +2 -2
  111. package/src/claude/skills/docs/references/update-workflow.md +9 -7
  112. package/src/claude/skills/docs/templates/requirements-as-is.md +1 -1
  113. package/src/claude/skills/docx/SKILL.md +1 -1
  114. package/src/claude/skills/git/SKILL.md +1 -1
  115. package/src/claude/skills/git/references/commit-protocols.md +1 -1
  116. package/src/claude/skills/git/references/finish-branch.md +1 -1
  117. package/src/claude/skills/hotfix/SKILL.md +159 -170
  118. package/src/claude/skills/hotfix/references/diagnosis-protocol.md +14 -9
  119. package/src/claude/skills/hotfix/references/parallel-patterns.md +27 -13
  120. package/src/claude/skills/hotfix/references/prevention-gate.md +5 -0
  121. package/src/claude/skills/hotfix/references/review-cycle.md +21 -15
  122. package/src/claude/skills/hotfix/references/workflow-specialized.md +53 -21
  123. package/src/claude/skills/inspect/SKILL.md +55 -46
  124. package/src/claude/skills/inspect/references/internal-inspection.md +21 -5
  125. package/src/claude/skills/loop/SKILL.md +114 -0
  126. package/src/claude/skills/loop/references/bounded-loop-protocol.md +104 -0
  127. package/src/claude/skills/loop/references/metric-and-guard-contract.md +76 -0
  128. package/src/claude/skills/pdf/SKILL.md +1 -1
  129. package/src/claude/skills/pptx/SKILL.md +1 -1
  130. package/src/claude/skills/question/SKILL.md +16 -13
  131. package/src/claude/skills/research/SKILL.md +70 -43
  132. package/src/claude/skills/route/SKILL.md +94 -0
  133. package/src/claude/skills/route/references/agent-timing.md +46 -0
  134. package/src/claude/skills/route/references/chaining-patterns.md +53 -0
  135. package/src/claude/skills/route/references/task-taxonomy.md +48 -0
  136. package/src/claude/skills/specs/SKILL.md +48 -57
  137. package/src/claude/skills/specs/references/review.md +26 -8
  138. package/src/claude/skills/specs/references/templates.md +76 -31
  139. package/src/claude/skills/specs/templates/requirements-init.md +1 -1
  140. package/src/claude/skills/specs/templates/research.md +2 -2
  141. package/src/claude/skills/sync/SKILL.md +6 -6
  142. package/src/claude/skills/sync/references/sync-protocols.md +1 -1
  143. package/src/claude/skills/test/SKILL.md +120 -120
  144. package/src/claude/skills/test/references/execution-strategy.md +208 -361
  145. package/src/claude/skills/test/references/failure-triage.md +55 -121
  146. package/src/claude/skills/test/references/test-memory.md +20 -34
  147. package/src/claude/skills/ui-ux-pro-max/SKILL.md +1 -1
  148. package/src/claude/skills/web-testing/SKILL.md +1 -1
  149. package/src/claude/skills/xlsx/SKILL.md +1 -1
  150. package/src/claude/status.cjs +135 -33
  151. package/src/codex/AGENTS.md +14 -4
  152. package/src/codex/hooks/docs-sync.cjs +8 -3
  153. package/src/codex/hooks/lib/hook-context.cjs +18 -4
  154. package/src/codex/hooks/rules.cjs +29 -1
  155. package/src/codex/hooks/secret-output-guardrail.cjs +30 -0
  156. package/src/codex/hooks/spec-gate.cjs +3 -8
  157. package/src/codex/hooks/spec-state.cjs +34 -5
  158. package/src/codex/hooks.json +5 -0
  159. package/src/codex/runtime.json +2 -0
  160. package/src/common/.env.example +1 -1
  161. package/src/claude/skills/backend-development/SKILL.md +0 -101
  162. package/src/claude/skills/backend-development/references/backend-api-design.md +0 -495
  163. package/src/claude/skills/backend-development/references/backend-architecture.md +0 -454
  164. package/src/claude/skills/backend-development/references/backend-authentication.md +0 -338
  165. package/src/claude/skills/backend-development/references/backend-code-quality.md +0 -659
  166. package/src/claude/skills/backend-development/references/backend-debugging.md +0 -904
  167. package/src/claude/skills/backend-development/references/backend-devops.md +0 -491
  168. package/src/claude/skills/backend-development/references/backend-mindset.md +0 -387
  169. package/src/claude/skills/backend-development/references/backend-performance.md +0 -397
  170. package/src/claude/skills/backend-development/references/backend-security.md +0 -342
  171. package/src/claude/skills/backend-development/references/backend-technologies.md +0 -256
  172. package/src/claude/skills/backend-development/references/backend-testing.md +0 -429
  173. package/src/claude/skills/devops/.env.example +0 -76
  174. package/src/claude/skills/devops/SKILL.md +0 -102
  175. package/src/claude/skills/devops/references/browser-rendering.md +0 -305
  176. package/src/claude/skills/devops/references/cloudflare-d1-kv.md +0 -123
  177. package/src/claude/skills/devops/references/cloudflare-platform.md +0 -271
  178. package/src/claude/skills/devops/references/cloudflare-r2-storage.md +0 -280
  179. package/src/claude/skills/devops/references/cloudflare-workers-advanced.md +0 -312
  180. package/src/claude/skills/devops/references/cloudflare-workers-apis.md +0 -309
  181. package/src/claude/skills/devops/references/cloudflare-workers-basics.md +0 -418
  182. package/src/claude/skills/devops/references/docker-basics.md +0 -297
  183. package/src/claude/skills/devops/references/docker-compose.md +0 -292
  184. package/src/claude/skills/devops/references/gcloud-platform.md +0 -297
  185. package/src/claude/skills/devops/references/gcloud-services.md +0 -304
  186. package/src/claude/skills/devops/references/kubernetes-basics.md +0 -95
  187. package/src/claude/skills/devops/references/kubernetes-helm-advanced.md +0 -70
  188. package/src/claude/skills/devops/references/kubernetes-helm.md +0 -81
  189. package/src/claude/skills/devops/references/kubernetes-kubectl.md +0 -74
  190. package/src/claude/skills/devops/references/kubernetes-security-advanced.md +0 -94
  191. package/src/claude/skills/devops/references/kubernetes-security.md +0 -89
  192. package/src/claude/skills/devops/references/kubernetes-troubleshooting-advanced.md +0 -74
  193. package/src/claude/skills/devops/references/kubernetes-troubleshooting.md +0 -49
  194. package/src/claude/skills/devops/references/kubernetes-workflows-advanced.md +0 -75
  195. package/src/claude/skills/devops/references/kubernetes-workflows.md +0 -76
  196. package/src/claude/skills/devops/scripts/cloudflare_deploy.py +0 -269
  197. package/src/claude/skills/devops/scripts/docker_optimize.py +0 -332
  198. package/src/claude/skills/devops/scripts/requirements.txt +0 -20
  199. package/src/claude/skills/devops/scripts/tests/requirements.txt +0 -3
  200. package/src/claude/skills/devops/scripts/tests/test_cloudflare_deploy.py +0 -285
  201. package/src/claude/skills/devops/scripts/tests/test_docker_optimize.py +0 -436
  202. package/src/claude/skills/frontend-design/SKILL.md +0 -135
  203. package/src/claude/skills/frontend-design/references/ai-multimodal-overview.md +0 -165
  204. package/src/claude/skills/frontend-design/references/analysis-best-practices.md +0 -80
  205. package/src/claude/skills/frontend-design/references/analysis-prompts.md +0 -141
  206. package/src/claude/skills/frontend-design/references/analysis-techniques.md +0 -118
  207. package/src/claude/skills/frontend-design/references/animejs.md +0 -396
  208. package/src/claude/skills/frontend-design/references/anti-slop-rules.md +0 -103
  209. package/src/claude/skills/frontend-design/references/asset-generation.md +0 -337
  210. package/src/claude/skills/frontend-design/references/bento-motion-engine.md +0 -142
  211. package/src/claude/skills/frontend-design/references/design-extraction-overview.md +0 -71
  212. package/src/claude/skills/frontend-design/references/extraction-best-practices.md +0 -141
  213. package/src/claude/skills/frontend-design/references/extraction-output-templates.md +0 -162
  214. package/src/claude/skills/frontend-design/references/extraction-prompts.md +0 -127
  215. package/src/claude/skills/frontend-design/references/magicui-components.md +0 -129
  216. package/src/claude/skills/frontend-design/references/performance-guardrails.md +0 -169
  217. package/src/claude/skills/frontend-design/references/premium-design-patterns.md +0 -93
  218. package/src/claude/skills/frontend-design/references/redesign-audit-checklist.md +0 -114
  219. package/src/claude/skills/frontend-design/references/technical-accessibility.md +0 -119
  220. package/src/claude/skills/frontend-design/references/technical-best-practices.md +0 -97
  221. package/src/claude/skills/frontend-design/references/technical-optimization.md +0 -44
  222. package/src/claude/skills/frontend-design/references/technical-overview.md +0 -90
  223. package/src/claude/skills/frontend-design/references/technical-workflows.md +0 -150
  224. package/src/claude/skills/frontend-design/references/visual-analysis-overview.md +0 -95
  225. package/src/claude/skills/frontend-design/references/workflow-3d.md +0 -102
  226. package/src/claude/skills/frontend-design/references/workflow-describe.md +0 -87
  227. package/src/claude/skills/frontend-design/references/workflow-immersive.md +0 -87
  228. package/src/claude/skills/frontend-design/references/workflow-quick.md +0 -57
  229. package/src/claude/skills/frontend-design/references/workflow-screenshot.md +0 -63
  230. package/src/claude/skills/frontend-design/references/workflow-video.md +0 -74
  231. package/src/claude/skills/frontend-development/SKILL.md +0 -406
  232. package/src/claude/skills/frontend-development/resources/common-patterns.md +0 -331
  233. package/src/claude/skills/frontend-development/resources/complete-examples.md +0 -872
  234. package/src/claude/skills/frontend-development/resources/component-patterns.md +0 -502
  235. package/src/claude/skills/frontend-development/resources/data-fetching.md +0 -767
  236. package/src/claude/skills/frontend-development/resources/file-organization.md +0 -502
  237. package/src/claude/skills/frontend-development/resources/loading-and-error-states.md +0 -501
  238. package/src/claude/skills/frontend-development/resources/performance.md +0 -406
  239. package/src/claude/skills/frontend-development/resources/routing-guide.md +0 -364
  240. package/src/claude/skills/frontend-development/resources/styling-guide.md +0 -428
  241. package/src/claude/skills/frontend-development/resources/typescript-standards.md +0 -418
  242. package/src/claude/skills/mobile-development/SKILL.md +0 -218
  243. package/src/claude/skills/mobile-development/references/mobile-android.md +0 -604
  244. package/src/claude/skills/mobile-development/references/mobile-best-practices.md +0 -544
  245. package/src/claude/skills/mobile-development/references/mobile-debugging.md +0 -1089
  246. package/src/claude/skills/mobile-development/references/mobile-frameworks.md +0 -465
  247. package/src/claude/skills/mobile-development/references/mobile-ios.md +0 -496
  248. package/src/claude/skills/mobile-development/references/mobile-mindset.md +0 -542
  249. package/src/claude/skills/react-best-practices/AGENTS.md +0 -2249
  250. package/src/claude/skills/react-best-practices/README.md +0 -123
  251. package/src/claude/skills/react-best-practices/SKILL.md +0 -128
  252. package/src/claude/skills/react-best-practices/metadata.json +0 -15
  253. package/src/claude/skills/react-best-practices/rules/_sections.md +0 -46
  254. package/src/claude/skills/react-best-practices/rules/_template.md +0 -28
  255. package/src/claude/skills/react-best-practices/rules/advanced-event-handler-refs.md +0 -55
  256. package/src/claude/skills/react-best-practices/rules/advanced-use-latest.md +0 -49
  257. package/src/claude/skills/react-best-practices/rules/async-api-routes.md +0 -38
  258. package/src/claude/skills/react-best-practices/rules/async-defer-await.md +0 -80
  259. package/src/claude/skills/react-best-practices/rules/async-dependencies.md +0 -36
  260. package/src/claude/skills/react-best-practices/rules/async-parallel.md +0 -28
  261. package/src/claude/skills/react-best-practices/rules/async-suspense-boundaries.md +0 -99
  262. package/src/claude/skills/react-best-practices/rules/bundle-barrel-imports.md +0 -59
  263. package/src/claude/skills/react-best-practices/rules/bundle-conditional.md +0 -31
  264. package/src/claude/skills/react-best-practices/rules/bundle-defer-third-party.md +0 -49
  265. package/src/claude/skills/react-best-practices/rules/bundle-dynamic-imports.md +0 -35
  266. package/src/claude/skills/react-best-practices/rules/bundle-preload.md +0 -50
  267. package/src/claude/skills/react-best-practices/rules/client-event-listeners.md +0 -74
  268. package/src/claude/skills/react-best-practices/rules/client-swr-dedup.md +0 -56
  269. package/src/claude/skills/react-best-practices/rules/js-batch-dom-css.md +0 -82
  270. package/src/claude/skills/react-best-practices/rules/js-cache-function-results.md +0 -80
  271. package/src/claude/skills/react-best-practices/rules/js-cache-property-access.md +0 -28
  272. package/src/claude/skills/react-best-practices/rules/js-cache-storage.md +0 -70
  273. package/src/claude/skills/react-best-practices/rules/js-combine-iterations.md +0 -32
  274. package/src/claude/skills/react-best-practices/rules/js-early-exit.md +0 -50
  275. package/src/claude/skills/react-best-practices/rules/js-hoist-regexp.md +0 -45
  276. package/src/claude/skills/react-best-practices/rules/js-index-maps.md +0 -37
  277. package/src/claude/skills/react-best-practices/rules/js-length-check-first.md +0 -49
  278. package/src/claude/skills/react-best-practices/rules/js-min-max-loop.md +0 -82
  279. package/src/claude/skills/react-best-practices/rules/js-set-map-lookups.md +0 -24
  280. package/src/claude/skills/react-best-practices/rules/js-tosorted-immutable.md +0 -57
  281. package/src/claude/skills/react-best-practices/rules/rendering-activity.md +0 -26
  282. package/src/claude/skills/react-best-practices/rules/rendering-animate-svg-wrapper.md +0 -47
  283. package/src/claude/skills/react-best-practices/rules/rendering-conditional-render.md +0 -40
  284. package/src/claude/skills/react-best-practices/rules/rendering-content-visibility.md +0 -38
  285. package/src/claude/skills/react-best-practices/rules/rendering-hoist-jsx.md +0 -46
  286. package/src/claude/skills/react-best-practices/rules/rendering-hydration-no-flicker.md +0 -82
  287. package/src/claude/skills/react-best-practices/rules/rendering-svg-precision.md +0 -28
  288. package/src/claude/skills/react-best-practices/rules/rerender-defer-reads.md +0 -39
  289. package/src/claude/skills/react-best-practices/rules/rerender-dependencies.md +0 -45
  290. package/src/claude/skills/react-best-practices/rules/rerender-derived-state.md +0 -29
  291. package/src/claude/skills/react-best-practices/rules/rerender-functional-setstate.md +0 -74
  292. package/src/claude/skills/react-best-practices/rules/rerender-lazy-state-init.md +0 -58
  293. package/src/claude/skills/react-best-practices/rules/rerender-memo.md +0 -44
  294. package/src/claude/skills/react-best-practices/rules/rerender-transitions.md +0 -40
  295. package/src/claude/skills/react-best-practices/rules/server-after-nonblocking.md +0 -73
  296. package/src/claude/skills/react-best-practices/rules/server-cache-lru.md +0 -41
  297. package/src/claude/skills/react-best-practices/rules/server-cache-react.md +0 -26
  298. package/src/claude/skills/react-best-practices/rules/server-parallel-fetching.md +0 -79
  299. 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