@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,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"])