@haposoft/cafekit 0.16.0-rc.8 → 0.16.1
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.
- package/README.md +117 -28
- package/bin/__tests__/codex-hooks-ownership.test.js +239 -0
- package/bin/__tests__/codex-hooks.test.js +175 -0
- package/bin/__tests__/codex-native.test.js +1882 -70
- package/bin/__tests__/develop-contract.test.js +442 -23
- package/bin/__tests__/grok-envelope.test.js +271 -0
- package/bin/__tests__/grok-platform.test.js +133 -0
- package/bin/__tests__/hook-payload.test.js +194 -0
- package/bin/__tests__/installer-safety.test.js +3 -3
- package/bin/__tests__/omp-bridge.test.js +168 -0
- package/bin/__tests__/omp-hooks.test.js +178 -0
- package/bin/__tests__/omp-runtime.test.js +150 -0
- package/bin/__tests__/optional-skill-inventory.test.js +249 -0
- package/bin/__tests__/output-styles.test.js +214 -0
- package/bin/__tests__/package-inventory.test.js +1735 -98
- package/bin/__tests__/runtime-dir.test.js +158 -0
- package/bin/__tests__/runtime-schema.test.js +113 -0
- package/bin/__tests__/secret-output-guardrail.test.js +122 -0
- package/bin/__tests__/skill-routing-source.test.js +172 -0
- package/bin/__tests__/specs-v2-execution-closeout.test.js +28 -1
- package/bin/install.js +15 -5
- package/bin/lib/codex-install.js +170 -5
- package/bin/lib/context.js +64 -3
- package/bin/lib/i18n.js +15 -36
- package/bin/lib/skill-deps.js +5 -5
- package/bin/phases/claude-runtime.js +23 -0
- package/bin/phases/claude-settings.js +8 -0
- package/bin/phases/codex-hooks.js +156 -0
- package/bin/phases/codex-runtime.js +29 -38
- package/bin/phases/copy-payload.js +15 -2
- package/bin/phases/omp-runtime.js +140 -0
- package/bin/phases/root-config.js +3 -0
- package/bin/phases/select-platform.js +22 -1
- package/bin/phases/select-skill-bundles.js +96 -0
- package/bin/phases/skill-inventory.js +71 -0
- package/bin/phases/skills-setup.js +9 -2
- package/bin/phases/summary.js +0 -4
- package/bin/phases/write-metadata.js +8 -5
- package/package.json +8 -2
- package/src/claude/CLAUDE.md +3 -3
- package/src/claude/agents/brainstormer.md +52 -69
- package/src/claude/agents/code-auditor.md +32 -14
- package/src/claude/agents/debugger.md +35 -20
- package/src/claude/agents/deployer.md +12 -5
- package/src/claude/agents/docs-keeper.md +11 -1
- package/src/claude/agents/implementer.md +25 -13
- package/src/claude/agents/inspector.md +6 -3
- package/src/claude/agents/project-manager.md +1 -1
- package/src/claude/agents/researcher.md +26 -55
- package/src/claude/agents/spec-maker.md +12 -7
- package/src/claude/agents/strategist.md +52 -0
- package/src/claude/agents/test-runner.md +117 -132
- package/src/claude/agents/ui-ux-designer.md +1 -1
- package/src/claude/hooks/__tests__/fixtures/statusline-default.golden +1 -0
- package/src/claude/hooks/__tests__/precompact.test.js +158 -0
- package/src/claude/hooks/__tests__/semantic-review-authority.test.js +2 -0
- package/src/claude/hooks/__tests__/spec-gate.test.js +348 -3
- package/src/claude/hooks/__tests__/state.test.js +7 -0
- package/src/claude/hooks/__tests__/statusline.test.js +196 -0
- package/src/claude/hooks/agent.cjs +13 -8
- package/src/claude/hooks/completion-authority.cjs +10 -4
- package/src/claude/hooks/docs-sync.cjs +14 -11
- package/src/claude/hooks/inspect-block.cjs +28 -8
- package/src/claude/hooks/lib/config.cjs +8 -2
- package/src/claude/hooks/lib/counter.cjs +7 -5
- package/src/claude/hooks/lib/hook-payload.cjs +160 -0
- package/src/claude/hooks/lib/hook-state-dir.cjs +39 -0
- package/src/claude/hooks/lib/runtime-dir.cjs +49 -0
- package/src/claude/hooks/lib/secret-keywords.cjs +42 -0
- package/src/claude/hooks/precompact.cjs +106 -0
- package/src/claude/hooks/privacy-block.cjs +4 -2
- package/src/claude/hooks/rules.cjs +5 -3
- package/src/claude/hooks/secret-output-guardrail.cjs +44 -0
- package/src/claude/hooks/semantic-review-authority.cjs +6 -4
- package/src/claude/hooks/session.cjs +37 -9
- package/src/claude/hooks/spec-gate.cjs +21 -11
- package/src/claude/hooks/spec-state.cjs +11 -7
- package/src/claude/hooks/state.cjs +7 -5
- package/src/claude/hooks/task-scaffold-guard.cjs +30 -9
- package/src/claude/hooks/usage.cjs +6 -5
- package/src/claude/migration-manifest.json +31 -15
- package/src/claude/output-styles/coding-level-0-eli5.md +103 -0
- package/src/claude/output-styles/coding-level-1-junior.md +124 -0
- package/src/claude/output-styles/coding-level-2-mid.md +146 -0
- package/src/claude/output-styles/coding-level-3-senior.md +148 -0
- package/src/claude/output-styles/coding-level-4-lead.md +159 -0
- package/src/claude/output-styles/coding-level-5-god.md +91 -0
- package/src/claude/references/debugger/core-philosophy.md +5 -3
- package/src/claude/references/debugger/frontend-verification.md +2 -2
- package/src/claude/references/debugger/log-ci-analysis.md +13 -1
- package/src/claude/references/debugger/parallel-agent-hydration.md +19 -34
- package/src/claude/references/debugger/performance-diagnostics.md +2 -2
- package/src/claude/references/debugger/root-cause-tracing.md +37 -6
- package/src/claude/references/debugger/side-effect-gate.md +3 -1
- package/src/claude/references/debugger/verification-protocol.md +13 -12
- package/src/claude/rules/orchestrator.md +7 -1
- package/src/claude/rules/process-management.md +39 -0
- package/src/claude/rules/review-audit-self-decision.md +48 -0
- package/src/claude/rules/skill-domain-routing.md +26 -24
- package/src/claude/rules/skill-workflow-routing.md +22 -14
- package/src/claude/rules/state-sync.md +7 -1
- package/src/claude/rules/workflow.md +5 -3
- package/src/claude/runtime.json +1 -0
- package/src/claude/runtime.schema.json +205 -0
- package/src/claude/scripts/generate-skill-catalog.cjs +156 -122
- package/src/claude/scripts/provenance.cjs +29 -9
- package/src/claude/scripts/spec-receipt.cjs +65 -4
- package/src/claude/scripts/workflow-policy.cjs +1 -1
- package/src/claude/settings/settings.json +16 -0
- package/src/claude/skills/agent-browser/SKILL.md +1 -1
- package/src/claude/skills/ai-multimodal/SKILL.md +1 -1
- package/src/claude/skills/brainstorm/SKILL.md +193 -172
- package/src/claude/skills/brainstorm/references/question-framework.md +105 -167
- package/src/claude/skills/chrome-devtools/SKILL.md +1 -1
- package/src/claude/skills/code-review/SKILL.md +43 -25
- package/src/claude/skills/code-review/references/spec-compliance-review.md +3 -4
- package/src/claude/skills/code-review/references/verification-gate.md +1 -1
- package/src/claude/skills/debug/SKILL.md +48 -19
- package/src/claude/skills/delegate/SKILL.md +1 -1
- package/src/claude/skills/develop/SKILL.md +92 -65
- package/src/claude/skills/develop/references/parallel-waves.md +36 -63
- package/src/claude/skills/develop/references/quality-gate.md +31 -4
- package/src/claude/skills/develop/references/subagent-patterns.md +21 -7
- package/src/claude/skills/docs/SKILL.md +42 -23
- package/src/claude/skills/docs/references/init-workflow.md +4 -4
- package/src/claude/skills/docs/references/reconstruct-workflow.md +6 -6
- package/src/claude/skills/docs/references/standard-docs-workflow.md +6 -2
- package/src/claude/skills/docs/references/summarize-workflow.md +2 -2
- package/src/claude/skills/docs/references/update-workflow.md +9 -7
- package/src/claude/skills/docs/templates/requirements-as-is.md +1 -1
- package/src/claude/skills/docx/SKILL.md +1 -1
- package/src/claude/skills/git/SKILL.md +1 -1
- package/src/claude/skills/git/references/commit-protocols.md +1 -1
- package/src/claude/skills/git/references/finish-branch.md +1 -1
- package/src/claude/skills/hotfix/SKILL.md +159 -170
- package/src/claude/skills/hotfix/references/diagnosis-protocol.md +14 -9
- package/src/claude/skills/hotfix/references/parallel-patterns.md +27 -13
- package/src/claude/skills/hotfix/references/prevention-gate.md +5 -0
- package/src/claude/skills/hotfix/references/review-cycle.md +21 -15
- package/src/claude/skills/hotfix/references/workflow-specialized.md +53 -21
- package/src/claude/skills/inspect/SKILL.md +55 -46
- package/src/claude/skills/inspect/references/internal-inspection.md +21 -5
- package/src/claude/skills/loop/SKILL.md +114 -0
- package/src/claude/skills/loop/references/bounded-loop-protocol.md +104 -0
- package/src/claude/skills/loop/references/metric-and-guard-contract.md +76 -0
- package/src/claude/skills/pdf/SKILL.md +1 -1
- package/src/claude/skills/pptx/SKILL.md +1 -1
- package/src/claude/skills/question/SKILL.md +16 -13
- package/src/claude/skills/research/SKILL.md +70 -43
- package/src/claude/skills/route/SKILL.md +94 -0
- package/src/claude/skills/route/references/agent-timing.md +46 -0
- package/src/claude/skills/route/references/chaining-patterns.md +53 -0
- package/src/claude/skills/route/references/task-taxonomy.md +48 -0
- package/src/claude/skills/specs/SKILL.md +51 -71
- package/src/claude/skills/specs/references/review.md +11 -8
- package/src/claude/skills/specs/references/templates.md +34 -18
- package/src/claude/skills/specs/templates/requirements-init.md +1 -1
- package/src/claude/skills/specs/templates/research.md +2 -2
- package/src/claude/skills/sync/SKILL.md +6 -6
- package/src/claude/skills/sync/references/sync-protocols.md +1 -1
- package/src/claude/skills/test/SKILL.md +120 -120
- package/src/claude/skills/test/references/execution-strategy.md +208 -361
- package/src/claude/skills/test/references/failure-triage.md +55 -121
- package/src/claude/skills/test/references/test-memory.md +20 -34
- package/src/claude/skills/ui-ux-pro-max/SKILL.md +1 -1
- package/src/claude/skills/web-testing/SKILL.md +1 -1
- package/src/claude/skills/xlsx/SKILL.md +1 -1
- package/src/claude/status.cjs +135 -33
- package/src/codex/AGENTS.md +14 -4
- package/src/codex/hooks/docs-sync.cjs +8 -3
- package/src/codex/hooks/lib/hook-context.cjs +18 -4
- package/src/codex/hooks/rules.cjs +29 -1
- package/src/codex/hooks/secret-output-guardrail.cjs +30 -0
- package/src/codex/hooks/spec-gate.cjs +3 -8
- package/src/codex/hooks/spec-state.cjs +3 -2
- package/src/codex/hooks.json +5 -0
- package/src/codex/rules/state-sync.md +7 -1
- package/src/codex/runtime.json +2 -0
- package/src/common/.env.example +1 -1
- package/src/omp/extensions/cafekit-bridge.mjs +233 -0
- package/src/omp/hooks/privacy-block.cjs +250 -0
- package/src/omp/runtime.json +33 -0
- package/bin/lib/rtk-run.js +0 -28
- package/bin/phases/setup-rtk.js +0 -159
- package/src/claude/skills/backend-development/SKILL.md +0 -101
- package/src/claude/skills/backend-development/references/backend-api-design.md +0 -495
- package/src/claude/skills/backend-development/references/backend-architecture.md +0 -454
- package/src/claude/skills/backend-development/references/backend-authentication.md +0 -338
- package/src/claude/skills/backend-development/references/backend-code-quality.md +0 -659
- package/src/claude/skills/backend-development/references/backend-debugging.md +0 -904
- package/src/claude/skills/backend-development/references/backend-devops.md +0 -491
- package/src/claude/skills/backend-development/references/backend-mindset.md +0 -387
- package/src/claude/skills/backend-development/references/backend-performance.md +0 -397
- package/src/claude/skills/backend-development/references/backend-security.md +0 -342
- package/src/claude/skills/backend-development/references/backend-technologies.md +0 -256
- package/src/claude/skills/backend-development/references/backend-testing.md +0 -429
- package/src/claude/skills/devops/.env.example +0 -76
- package/src/claude/skills/devops/SKILL.md +0 -102
- package/src/claude/skills/devops/references/browser-rendering.md +0 -305
- package/src/claude/skills/devops/references/cloudflare-d1-kv.md +0 -123
- package/src/claude/skills/devops/references/cloudflare-platform.md +0 -271
- package/src/claude/skills/devops/references/cloudflare-r2-storage.md +0 -280
- package/src/claude/skills/devops/references/cloudflare-workers-advanced.md +0 -312
- package/src/claude/skills/devops/references/cloudflare-workers-apis.md +0 -309
- package/src/claude/skills/devops/references/cloudflare-workers-basics.md +0 -418
- package/src/claude/skills/devops/references/docker-basics.md +0 -297
- package/src/claude/skills/devops/references/docker-compose.md +0 -292
- package/src/claude/skills/devops/references/gcloud-platform.md +0 -297
- package/src/claude/skills/devops/references/gcloud-services.md +0 -304
- package/src/claude/skills/devops/references/kubernetes-basics.md +0 -95
- package/src/claude/skills/devops/references/kubernetes-helm-advanced.md +0 -70
- package/src/claude/skills/devops/references/kubernetes-helm.md +0 -81
- package/src/claude/skills/devops/references/kubernetes-kubectl.md +0 -74
- package/src/claude/skills/devops/references/kubernetes-security-advanced.md +0 -94
- package/src/claude/skills/devops/references/kubernetes-security.md +0 -89
- package/src/claude/skills/devops/references/kubernetes-troubleshooting-advanced.md +0 -74
- package/src/claude/skills/devops/references/kubernetes-troubleshooting.md +0 -49
- package/src/claude/skills/devops/references/kubernetes-workflows-advanced.md +0 -75
- package/src/claude/skills/devops/references/kubernetes-workflows.md +0 -76
- package/src/claude/skills/devops/scripts/cloudflare_deploy.py +0 -269
- package/src/claude/skills/devops/scripts/docker_optimize.py +0 -332
- package/src/claude/skills/devops/scripts/requirements.txt +0 -20
- package/src/claude/skills/devops/scripts/tests/requirements.txt +0 -3
- package/src/claude/skills/devops/scripts/tests/test_cloudflare_deploy.py +0 -285
- package/src/claude/skills/devops/scripts/tests/test_docker_optimize.py +0 -436
- package/src/claude/skills/frontend-design/SKILL.md +0 -135
- package/src/claude/skills/frontend-design/references/ai-multimodal-overview.md +0 -165
- package/src/claude/skills/frontend-design/references/analysis-best-practices.md +0 -80
- package/src/claude/skills/frontend-design/references/analysis-prompts.md +0 -141
- package/src/claude/skills/frontend-design/references/analysis-techniques.md +0 -118
- package/src/claude/skills/frontend-design/references/animejs.md +0 -396
- package/src/claude/skills/frontend-design/references/anti-slop-rules.md +0 -103
- package/src/claude/skills/frontend-design/references/asset-generation.md +0 -337
- package/src/claude/skills/frontend-design/references/bento-motion-engine.md +0 -142
- package/src/claude/skills/frontend-design/references/design-extraction-overview.md +0 -71
- package/src/claude/skills/frontend-design/references/extraction-best-practices.md +0 -141
- package/src/claude/skills/frontend-design/references/extraction-output-templates.md +0 -162
- package/src/claude/skills/frontend-design/references/extraction-prompts.md +0 -127
- package/src/claude/skills/frontend-design/references/magicui-components.md +0 -129
- package/src/claude/skills/frontend-design/references/performance-guardrails.md +0 -169
- package/src/claude/skills/frontend-design/references/premium-design-patterns.md +0 -93
- package/src/claude/skills/frontend-design/references/redesign-audit-checklist.md +0 -114
- package/src/claude/skills/frontend-design/references/technical-accessibility.md +0 -119
- package/src/claude/skills/frontend-design/references/technical-best-practices.md +0 -97
- package/src/claude/skills/frontend-design/references/technical-optimization.md +0 -44
- package/src/claude/skills/frontend-design/references/technical-overview.md +0 -90
- package/src/claude/skills/frontend-design/references/technical-workflows.md +0 -150
- package/src/claude/skills/frontend-design/references/visual-analysis-overview.md +0 -95
- package/src/claude/skills/frontend-design/references/workflow-3d.md +0 -102
- package/src/claude/skills/frontend-design/references/workflow-describe.md +0 -87
- package/src/claude/skills/frontend-design/references/workflow-immersive.md +0 -87
- package/src/claude/skills/frontend-design/references/workflow-quick.md +0 -57
- package/src/claude/skills/frontend-design/references/workflow-screenshot.md +0 -63
- package/src/claude/skills/frontend-design/references/workflow-video.md +0 -74
- package/src/claude/skills/frontend-development/SKILL.md +0 -406
- package/src/claude/skills/frontend-development/resources/common-patterns.md +0 -331
- package/src/claude/skills/frontend-development/resources/complete-examples.md +0 -872
- package/src/claude/skills/frontend-development/resources/component-patterns.md +0 -502
- package/src/claude/skills/frontend-development/resources/data-fetching.md +0 -767
- package/src/claude/skills/frontend-development/resources/file-organization.md +0 -502
- package/src/claude/skills/frontend-development/resources/loading-and-error-states.md +0 -501
- package/src/claude/skills/frontend-development/resources/performance.md +0 -406
- package/src/claude/skills/frontend-development/resources/routing-guide.md +0 -364
- package/src/claude/skills/frontend-development/resources/styling-guide.md +0 -428
- package/src/claude/skills/frontend-development/resources/typescript-standards.md +0 -418
- package/src/claude/skills/mobile-development/SKILL.md +0 -218
- package/src/claude/skills/mobile-development/references/mobile-android.md +0 -604
- package/src/claude/skills/mobile-development/references/mobile-best-practices.md +0 -544
- package/src/claude/skills/mobile-development/references/mobile-debugging.md +0 -1089
- package/src/claude/skills/mobile-development/references/mobile-frameworks.md +0 -465
- package/src/claude/skills/mobile-development/references/mobile-ios.md +0 -496
- package/src/claude/skills/mobile-development/references/mobile-mindset.md +0 -542
- package/src/claude/skills/react-best-practices/AGENTS.md +0 -2249
- package/src/claude/skills/react-best-practices/README.md +0 -123
- package/src/claude/skills/react-best-practices/SKILL.md +0 -128
- package/src/claude/skills/react-best-practices/metadata.json +0 -15
- package/src/claude/skills/react-best-practices/rules/_sections.md +0 -46
- package/src/claude/skills/react-best-practices/rules/_template.md +0 -28
- package/src/claude/skills/react-best-practices/rules/advanced-event-handler-refs.md +0 -55
- package/src/claude/skills/react-best-practices/rules/advanced-use-latest.md +0 -49
- package/src/claude/skills/react-best-practices/rules/async-api-routes.md +0 -38
- package/src/claude/skills/react-best-practices/rules/async-defer-await.md +0 -80
- package/src/claude/skills/react-best-practices/rules/async-dependencies.md +0 -36
- package/src/claude/skills/react-best-practices/rules/async-parallel.md +0 -28
- package/src/claude/skills/react-best-practices/rules/async-suspense-boundaries.md +0 -99
- package/src/claude/skills/react-best-practices/rules/bundle-barrel-imports.md +0 -59
- package/src/claude/skills/react-best-practices/rules/bundle-conditional.md +0 -31
- package/src/claude/skills/react-best-practices/rules/bundle-defer-third-party.md +0 -49
- package/src/claude/skills/react-best-practices/rules/bundle-dynamic-imports.md +0 -35
- package/src/claude/skills/react-best-practices/rules/bundle-preload.md +0 -50
- package/src/claude/skills/react-best-practices/rules/client-event-listeners.md +0 -74
- package/src/claude/skills/react-best-practices/rules/client-swr-dedup.md +0 -56
- package/src/claude/skills/react-best-practices/rules/js-batch-dom-css.md +0 -82
- package/src/claude/skills/react-best-practices/rules/js-cache-function-results.md +0 -80
- package/src/claude/skills/react-best-practices/rules/js-cache-property-access.md +0 -28
- package/src/claude/skills/react-best-practices/rules/js-cache-storage.md +0 -70
- package/src/claude/skills/react-best-practices/rules/js-combine-iterations.md +0 -32
- package/src/claude/skills/react-best-practices/rules/js-early-exit.md +0 -50
- package/src/claude/skills/react-best-practices/rules/js-hoist-regexp.md +0 -45
- package/src/claude/skills/react-best-practices/rules/js-index-maps.md +0 -37
- package/src/claude/skills/react-best-practices/rules/js-length-check-first.md +0 -49
- package/src/claude/skills/react-best-practices/rules/js-min-max-loop.md +0 -82
- package/src/claude/skills/react-best-practices/rules/js-set-map-lookups.md +0 -24
- package/src/claude/skills/react-best-practices/rules/js-tosorted-immutable.md +0 -57
- package/src/claude/skills/react-best-practices/rules/rendering-activity.md +0 -26
- package/src/claude/skills/react-best-practices/rules/rendering-animate-svg-wrapper.md +0 -47
- package/src/claude/skills/react-best-practices/rules/rendering-conditional-render.md +0 -40
- package/src/claude/skills/react-best-practices/rules/rendering-content-visibility.md +0 -38
- package/src/claude/skills/react-best-practices/rules/rendering-hoist-jsx.md +0 -46
- package/src/claude/skills/react-best-practices/rules/rendering-hydration-no-flicker.md +0 -82
- package/src/claude/skills/react-best-practices/rules/rendering-svg-precision.md +0 -28
- package/src/claude/skills/react-best-practices/rules/rerender-defer-reads.md +0 -39
- package/src/claude/skills/react-best-practices/rules/rerender-dependencies.md +0 -45
- package/src/claude/skills/react-best-practices/rules/rerender-derived-state.md +0 -29
- package/src/claude/skills/react-best-practices/rules/rerender-functional-setstate.md +0 -74
- package/src/claude/skills/react-best-practices/rules/rerender-lazy-state-init.md +0 -58
- package/src/claude/skills/react-best-practices/rules/rerender-memo.md +0 -44
- package/src/claude/skills/react-best-practices/rules/rerender-transitions.md +0 -40
- package/src/claude/skills/react-best-practices/rules/server-after-nonblocking.md +0 -73
- package/src/claude/skills/react-best-practices/rules/server-cache-lru.md +0 -41
- package/src/claude/skills/react-best-practices/rules/server-cache-react.md +0 -26
- package/src/claude/skills/react-best-practices/rules/server-parallel-fetching.md +0 -79
- 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
|