@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,285 +0,0 @@
1
- """
2
- Tests for cloudflare-deploy.py
3
-
4
- Run with: pytest test_cloudflare_deploy.py -v
5
- """
6
-
7
- import pytest
8
- import subprocess
9
- from pathlib import Path
10
- from unittest.mock import Mock, patch, mock_open
11
- import sys
12
- import os
13
-
14
- # Add parent directory to path for imports
15
- sys.path.insert(0, str(Path(__file__).parent.parent))
16
-
17
- from cloudflare_deploy import CloudflareDeploy, CloudflareDeployError
18
-
19
-
20
- @pytest.fixture
21
- def temp_project(tmp_path):
22
- """Create temporary project directory with wrangler.toml"""
23
- project_dir = tmp_path / "test-worker"
24
- project_dir.mkdir()
25
-
26
- wrangler_toml = project_dir / "wrangler.toml"
27
- wrangler_toml.write_text('''
28
- name = "test-worker"
29
- main = "src/index.ts"
30
- compatibility_date = "2024-01-01"
31
- ''')
32
-
33
- return project_dir
34
-
35
-
36
- @pytest.fixture
37
- def deployer(temp_project):
38
- """Create CloudflareDeploy instance with temp project"""
39
- return CloudflareDeploy(
40
- project_dir=temp_project,
41
- env="staging",
42
- dry_run=False,
43
- verbose=False
44
- )
45
-
46
-
47
- class TestCloudflareDeployInit:
48
- """Test CloudflareDeploy initialization"""
49
-
50
- def test_init_with_defaults(self, temp_project):
51
- deployer = CloudflareDeploy(project_dir=temp_project)
52
- assert deployer.project_dir == temp_project.resolve()
53
- assert deployer.env is None
54
- assert deployer.dry_run is False
55
- assert deployer.verbose is False
56
-
57
- def test_init_with_custom_params(self, temp_project):
58
- deployer = CloudflareDeploy(
59
- project_dir=temp_project,
60
- env="production",
61
- dry_run=True,
62
- verbose=True
63
- )
64
- assert deployer.env == "production"
65
- assert deployer.dry_run is True
66
- assert deployer.verbose is True
67
-
68
-
69
- class TestValidateProject:
70
- """Test project validation"""
71
-
72
- def test_validate_existing_project(self, deployer):
73
- assert deployer.validate_project() is True
74
-
75
- def test_validate_nonexistent_project(self, tmp_path):
76
- deployer = CloudflareDeploy(project_dir=tmp_path / "nonexistent")
77
- with pytest.raises(CloudflareDeployError, match="does not exist"):
78
- deployer.validate_project()
79
-
80
- def test_validate_missing_wrangler_toml(self, tmp_path):
81
- project_dir = tmp_path / "no-toml"
82
- project_dir.mkdir()
83
- deployer = CloudflareDeploy(project_dir=project_dir)
84
-
85
- with pytest.raises(CloudflareDeployError, match="wrangler.toml not found"):
86
- deployer.validate_project()
87
-
88
-
89
- class TestCheckWranglerInstalled:
90
- """Test wrangler CLI detection"""
91
-
92
- @patch('subprocess.run')
93
- def test_wrangler_installed(self, mock_run, deployer):
94
- mock_run.return_value = Mock(
95
- returncode=0,
96
- stdout="wrangler 3.0.0",
97
- stderr=""
98
- )
99
- assert deployer.check_wrangler_installed() is True
100
-
101
- @patch('subprocess.run')
102
- def test_wrangler_not_installed(self, mock_run, deployer):
103
- mock_run.side_effect = FileNotFoundError()
104
- assert deployer.check_wrangler_installed() is False
105
-
106
- @patch('subprocess.run')
107
- def test_wrangler_command_fails(self, mock_run, deployer):
108
- mock_run.side_effect = subprocess.CalledProcessError(1, "wrangler")
109
- assert deployer.check_wrangler_installed() is False
110
-
111
-
112
- class TestGetWorkerName:
113
- """Test worker name extraction"""
114
-
115
- def test_get_worker_name_success(self, deployer):
116
- name = deployer.get_worker_name()
117
- assert name == "test-worker"
118
-
119
- def test_get_worker_name_no_name(self, tmp_path):
120
- project_dir = tmp_path / "no-name"
121
- project_dir.mkdir()
122
-
123
- wrangler_toml = project_dir / "wrangler.toml"
124
- wrangler_toml.write_text("main = 'index.ts'")
125
-
126
- deployer = CloudflareDeploy(project_dir=project_dir)
127
- with pytest.raises(CloudflareDeployError, match="Worker name not found"):
128
- deployer.get_worker_name()
129
-
130
- def test_get_worker_name_with_quotes(self, tmp_path):
131
- project_dir = tmp_path / "quoted"
132
- project_dir.mkdir()
133
-
134
- wrangler_toml = project_dir / "wrangler.toml"
135
- wrangler_toml.write_text('name = "my-worker"\n')
136
-
137
- deployer = CloudflareDeploy(project_dir=project_dir)
138
- assert deployer.get_worker_name() == "my-worker"
139
-
140
- def test_get_worker_name_single_quotes(self, tmp_path):
141
- project_dir = tmp_path / "single-quotes"
142
- project_dir.mkdir()
143
-
144
- wrangler_toml = project_dir / "wrangler.toml"
145
- wrangler_toml.write_text("name = 'my-worker'\n")
146
-
147
- deployer = CloudflareDeploy(project_dir=project_dir)
148
- assert deployer.get_worker_name() == "my-worker"
149
-
150
-
151
- class TestBuildDeployCommand:
152
- """Test deploy command construction"""
153
-
154
- def test_basic_command(self, temp_project):
155
- deployer = CloudflareDeploy(project_dir=temp_project)
156
- cmd = deployer.build_deploy_command()
157
- assert cmd == ["wrangler", "deploy"]
158
-
159
- def test_command_with_env(self, temp_project):
160
- deployer = CloudflareDeploy(project_dir=temp_project, env="production")
161
- cmd = deployer.build_deploy_command()
162
- assert cmd == ["wrangler", "deploy", "--env", "production"]
163
-
164
- def test_command_with_dry_run(self, temp_project):
165
- deployer = CloudflareDeploy(project_dir=temp_project, dry_run=True)
166
- cmd = deployer.build_deploy_command()
167
- assert cmd == ["wrangler", "deploy", "--dry-run"]
168
-
169
- def test_command_with_env_and_dry_run(self, temp_project):
170
- deployer = CloudflareDeploy(
171
- project_dir=temp_project,
172
- env="staging",
173
- dry_run=True
174
- )
175
- cmd = deployer.build_deploy_command()
176
- assert cmd == ["wrangler", "deploy", "--env", "staging", "--dry-run"]
177
-
178
-
179
- class TestRunCommand:
180
- """Test command execution"""
181
-
182
- @patch('subprocess.run')
183
- def test_run_command_success(self, mock_run, deployer):
184
- mock_run.return_value = Mock(
185
- returncode=0,
186
- stdout="Success",
187
- stderr=""
188
- )
189
-
190
- exit_code, stdout, stderr = deployer.run_command(["echo", "test"])
191
-
192
- assert exit_code == 0
193
- assert stdout == "Success"
194
- assert stderr == ""
195
- mock_run.assert_called_once()
196
-
197
- @patch('subprocess.run')
198
- def test_run_command_failure_with_check(self, mock_run, deployer):
199
- mock_run.side_effect = subprocess.CalledProcessError(
200
- 1, "cmd", stderr="Error"
201
- )
202
-
203
- with pytest.raises(CloudflareDeployError, match="Command failed"):
204
- deployer.run_command(["false"], check=True)
205
-
206
- @patch('subprocess.run')
207
- def test_run_command_failure_no_check(self, mock_run, deployer):
208
- mock_run.side_effect = subprocess.CalledProcessError(
209
- 1, "cmd", output="", stderr="Error"
210
- )
211
-
212
- exit_code, stdout, stderr = deployer.run_command(["false"], check=False)
213
-
214
- assert exit_code == 1
215
-
216
-
217
- class TestDeploy:
218
- """Test full deployment flow"""
219
-
220
- @patch.object(CloudflareDeploy, 'check_wrangler_installed')
221
- @patch.object(CloudflareDeploy, 'run_command')
222
- def test_deploy_success(self, mock_run_cmd, mock_check_wrangler, deployer):
223
- mock_check_wrangler.return_value = True
224
- mock_run_cmd.return_value = (0, "Deployed successfully", "")
225
-
226
- result = deployer.deploy()
227
-
228
- assert result is True
229
- mock_check_wrangler.assert_called_once()
230
- mock_run_cmd.assert_called_once()
231
-
232
- @patch.object(CloudflareDeploy, 'check_wrangler_installed')
233
- def test_deploy_wrangler_not_installed(self, mock_check_wrangler, deployer):
234
- mock_check_wrangler.return_value = False
235
-
236
- with pytest.raises(CloudflareDeployError, match="wrangler CLI not installed"):
237
- deployer.deploy()
238
-
239
- @patch.object(CloudflareDeploy, 'check_wrangler_installed')
240
- @patch.object(CloudflareDeploy, 'run_command')
241
- def test_deploy_command_fails(self, mock_run_cmd, mock_check_wrangler, deployer):
242
- mock_check_wrangler.return_value = True
243
- mock_run_cmd.side_effect = CloudflareDeployError("Deploy failed")
244
-
245
- with pytest.raises(CloudflareDeployError, match="Deploy failed"):
246
- deployer.deploy()
247
-
248
- def test_deploy_invalid_project(self, tmp_path):
249
- deployer = CloudflareDeploy(project_dir=tmp_path / "nonexistent")
250
-
251
- with pytest.raises(CloudflareDeployError):
252
- deployer.deploy()
253
-
254
-
255
- class TestIntegration:
256
- """Integration tests"""
257
-
258
- @patch.object(CloudflareDeploy, 'check_wrangler_installed')
259
- @patch.object(CloudflareDeploy, 'run_command')
260
- def test_full_deployment_flow(self, mock_run_cmd, mock_check_wrangler, temp_project):
261
- mock_check_wrangler.return_value = True
262
- mock_run_cmd.return_value = (0, "Success", "")
263
-
264
- deployer = CloudflareDeploy(
265
- project_dir=temp_project,
266
- env="production",
267
- dry_run=False,
268
- verbose=True
269
- )
270
-
271
- result = deployer.deploy()
272
-
273
- assert result is True
274
- assert mock_run_cmd.call_count == 1
275
-
276
- # Verify correct command was built
277
- call_args = mock_run_cmd.call_args[0][0]
278
- assert "wrangler" in call_args
279
- assert "deploy" in call_args
280
- assert "--env" in call_args
281
- assert "production" in call_args
282
-
283
-
284
- if __name__ == "__main__":
285
- pytest.main([__file__, "-v"])