moai-adk 0.34.0__py3-none-any.whl → 1.1.0__py3-none-any.whl
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.
- moai_adk/__main__.py +136 -5
- moai_adk/astgrep/__init__.py +37 -0
- moai_adk/astgrep/analyzer.py +522 -0
- moai_adk/astgrep/models.py +124 -0
- moai_adk/astgrep/rules.py +179 -0
- moai_adk/cli/commands/analyze.py +11 -2
- moai_adk/cli/commands/doctor.py +7 -1
- moai_adk/cli/commands/init.py +321 -11
- moai_adk/cli/commands/language.py +7 -1
- moai_adk/cli/commands/rank.py +449 -0
- moai_adk/cli/commands/status.py +7 -1
- moai_adk/cli/commands/switch.py +325 -0
- moai_adk/cli/commands/update.py +296 -23
- moai_adk/cli/prompts/init_prompts.py +362 -66
- moai_adk/cli/prompts/translations/__init__.py +573 -0
- moai_adk/cli/ui/prompts.py +61 -2
- moai_adk/cli/worktree/cli.py +106 -1
- moai_adk/cli/worktree/manager.py +155 -0
- moai_adk/core/config/unified.py +244 -63
- moai_adk/core/credentials.py +264 -0
- moai_adk/core/error_recovery_system.py +22 -4
- moai_adk/core/git/conflict_detector.py +10 -1
- moai_adk/core/git/event_detector.py +16 -5
- moai_adk/core/integration/engine.py +2 -2
- moai_adk/core/integration/integration_tester.py +5 -5
- moai_adk/core/language_config_resolver.py +9 -3
- moai_adk/core/merge/analyzer.py +509 -324
- moai_adk/core/migration/alfred_to_moai_migrator.py +7 -1
- moai_adk/core/migration/backup_manager.py +54 -4
- moai_adk/core/migration/file_migrator.py +174 -2
- moai_adk/core/migration/interactive_checkbox_ui.py +42 -31
- moai_adk/core/migration/version_detector.py +123 -19
- moai_adk/core/migration/version_migrator.py +44 -9
- moai_adk/core/model_allocator.py +241 -0
- moai_adk/core/project/backup_utils.py +12 -2
- moai_adk/core/project/initializer.py +44 -87
- moai_adk/core/project/phase_executor.py +95 -33
- moai_adk/core/project/validator.py +16 -1
- moai_adk/core/quality/trust_checker.py +30 -10
- moai_adk/core/rollback_manager.py +60 -25
- moai_adk/core/template/backup.py +88 -6
- moai_adk/core/template/config.py +33 -9
- moai_adk/core/template/merger.py +34 -8
- moai_adk/core/template/processor.py +334 -11
- moai_adk/core/template_engine.py +10 -1
- moai_adk/core/template_variable_synchronizer.py +16 -2
- moai_adk/core/version_sync.py +54 -6
- moai_adk/foundation/__init__.py +1 -20
- moai_adk/foundation/testing.py +1 -1
- moai_adk/loop/__init__.py +54 -0
- moai_adk/loop/controller.py +305 -0
- moai_adk/loop/feedback.py +230 -0
- moai_adk/loop/state.py +209 -0
- moai_adk/loop/storage.py +220 -0
- moai_adk/lsp/__init__.py +70 -0
- moai_adk/lsp/client.py +320 -0
- moai_adk/lsp/models.py +261 -0
- moai_adk/lsp/protocol.py +404 -0
- moai_adk/lsp/server_manager.py +248 -0
- moai_adk/project/configuration.py +8 -1
- moai_adk/py.typed +0 -0
- moai_adk/ralph/__init__.py +37 -0
- moai_adk/ralph/engine.py +307 -0
- moai_adk/rank/__init__.py +21 -0
- moai_adk/rank/auth.py +425 -0
- moai_adk/rank/client.py +557 -0
- moai_adk/rank/config.py +147 -0
- moai_adk/rank/hook.py +1503 -0
- moai_adk/rank/py.typed +0 -0
- moai_adk/statusline/__init__.py +3 -0
- moai_adk/statusline/enhanced_output_style_detector.py +5 -5
- moai_adk/statusline/main.py +20 -1
- moai_adk/statusline/memory_collector.py +268 -0
- moai_adk/statusline/renderer.py +54 -38
- moai_adk/tag_system/__init__.py +48 -0
- moai_adk/tag_system/atomic_ops.py +117 -0
- moai_adk/tag_system/linkage.py +335 -0
- moai_adk/tag_system/parser.py +176 -0
- moai_adk/tag_system/validator.py +200 -0
- moai_adk/templates/.claude/agents/moai/builder-agent.md +19 -3
- moai_adk/templates/.claude/agents/moai/builder-command.md +62 -16
- moai_adk/templates/.claude/agents/moai/builder-plugin.md +763 -0
- moai_adk/templates/.claude/agents/moai/builder-skill.md +21 -5
- moai_adk/templates/.claude/agents/moai/expert-backend.md +103 -39
- moai_adk/templates/.claude/agents/moai/expert-debug.md +9 -3
- moai_adk/templates/.claude/agents/moai/expert-devops.md +16 -14
- moai_adk/templates/.claude/agents/moai/expert-frontend.md +45 -31
- moai_adk/templates/.claude/agents/moai/expert-performance.md +13 -9
- moai_adk/templates/.claude/agents/moai/expert-refactoring.md +228 -0
- moai_adk/templates/.claude/agents/moai/expert-security.md +19 -3
- moai_adk/templates/.claude/agents/moai/expert-testing.md +13 -9
- moai_adk/templates/.claude/agents/moai/manager-claude-code.md +8 -2
- moai_adk/templates/.claude/agents/moai/manager-docs.md +10 -5
- moai_adk/templates/.claude/agents/moai/manager-git.md +99 -27
- moai_adk/templates/.claude/agents/moai/manager-project.md +87 -7
- moai_adk/templates/.claude/agents/moai/manager-quality.md +22 -5
- moai_adk/templates/.claude/agents/moai/manager-spec.md +8 -2
- moai_adk/templates/.claude/agents/moai/manager-strategy.md +45 -14
- moai_adk/templates/.claude/agents/moai/manager-tdd.md +16 -3
- moai_adk/templates/.claude/commands/moai/0-project.md +239 -1185
- moai_adk/templates/.claude/commands/moai/1-plan.md +383 -363
- moai_adk/templates/.claude/commands/moai/2-run.md +254 -347
- moai_adk/templates/.claude/commands/moai/3-sync.md +174 -100
- moai_adk/templates/.claude/commands/moai/9-feedback.md +49 -33
- moai_adk/templates/.claude/commands/moai/alfred.md +339 -0
- moai_adk/templates/.claude/commands/moai/cancel-loop.md +163 -0
- moai_adk/templates/.claude/commands/moai/fix.md +264 -0
- moai_adk/templates/.claude/commands/moai/loop.md +363 -0
- moai_adk/templates/.claude/hooks/moai/lib/README.md +143 -0
- moai_adk/templates/.claude/hooks/moai/lib/__init__.py +37 -81
- moai_adk/templates/.claude/hooks/moai/lib/alfred_detector.py +105 -0
- moai_adk/templates/.claude/hooks/moai/lib/atomic_write.py +122 -0
- moai_adk/templates/.claude/hooks/moai/lib/checkpoint.py +4 -1
- moai_adk/templates/.claude/hooks/moai/lib/common.py +35 -5
- moai_adk/templates/.claude/hooks/moai/lib/config.py +376 -0
- moai_adk/templates/.claude/hooks/moai/lib/config_manager.py +24 -28
- moai_adk/templates/.claude/hooks/moai/lib/config_validator.py +14 -14
- moai_adk/templates/.claude/hooks/moai/lib/enhanced_output_style_detector.py +372 -0
- moai_adk/templates/.claude/hooks/moai/lib/exceptions.py +171 -0
- moai_adk/templates/.claude/hooks/moai/lib/file_utils.py +95 -0
- moai_adk/templates/.claude/hooks/moai/lib/git_collector.py +190 -0
- moai_adk/templates/.claude/hooks/moai/lib/git_operations_manager.py +15 -13
- moai_adk/templates/.claude/hooks/moai/lib/language_detector.py +298 -0
- moai_adk/templates/.claude/hooks/moai/lib/language_validator.py +125 -25
- moai_adk/templates/.claude/hooks/moai/lib/main.py +341 -0
- moai_adk/templates/.claude/hooks/moai/lib/memory_collector.py +268 -0
- moai_adk/templates/.claude/hooks/moai/lib/metrics_tracker.py +78 -0
- moai_adk/templates/.claude/hooks/moai/lib/models.py +9 -7
- moai_adk/templates/.claude/hooks/moai/lib/path_utils.py +204 -13
- moai_adk/templates/.claude/hooks/moai/lib/project.py +23 -14
- moai_adk/templates/.claude/hooks/moai/lib/renderer.py +359 -0
- moai_adk/templates/.claude/hooks/moai/lib/tag_linkage.py +333 -0
- moai_adk/templates/.claude/hooks/moai/lib/tag_parser.py +176 -0
- moai_adk/templates/.claude/hooks/moai/lib/tag_validator.py +200 -0
- moai_adk/templates/.claude/hooks/moai/lib/timeout.py +5 -5
- moai_adk/templates/.claude/hooks/moai/lib/tool_registry.py +896 -0
- moai_adk/templates/.claude/hooks/moai/lib/unified_timeout_manager.py +30 -18
- moai_adk/templates/.claude/hooks/moai/lib/update_checker.py +129 -0
- moai_adk/templates/.claude/hooks/moai/lib/version_reader.py +741 -0
- moai_adk/templates/.claude/hooks/moai/post_tool__ast_grep_scan.py +276 -0
- moai_adk/templates/.claude/hooks/moai/post_tool__code_formatter.py +255 -0
- moai_adk/templates/.claude/hooks/moai/post_tool__coverage_guard.py +325 -0
- moai_adk/templates/.claude/hooks/moai/post_tool__linter.py +315 -0
- moai_adk/templates/.claude/hooks/moai/post_tool__lsp_diagnostic.py +508 -0
- moai_adk/templates/.claude/hooks/moai/pre_commit__tag_validator.py +287 -0
- moai_adk/templates/.claude/hooks/moai/pre_tool__security_guard.py +268 -0
- moai_adk/templates/.claude/hooks/moai/pre_tool__tdd_enforcer.py +208 -0
- moai_adk/templates/.claude/hooks/moai/session_end__auto_cleanup.py +93 -61
- moai_adk/templates/.claude/hooks/moai/session_end__rank_submit.py +69 -0
- moai_adk/templates/.claude/hooks/moai/session_start__show_project_info.py +165 -70
- moai_adk/templates/.claude/hooks/moai/shared/utils/announcement_translator.py +206 -0
- moai_adk/templates/.claude/hooks/moai/stop__loop_controller.py +621 -0
- moai_adk/templates/.claude/output-styles/moai/alfred.md +758 -0
- moai_adk/templates/.claude/output-styles/moai/r2d2.md +86 -3
- moai_adk/templates/.claude/output-styles/moai/yoda.md +2 -2
- moai_adk/templates/.claude/settings.json +154 -77
- moai_adk/templates/.claude/skills/moai-docs-generation/SKILL.md +252 -198
- moai_adk/templates/.claude/skills/moai-docs-generation/examples.md +169 -323
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/README.md +39 -27
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/api-documentation.md +115 -125
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/code-documentation.md +150 -150
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/multi-format-output.md +182 -175
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/user-guides.md +198 -138
- moai_adk/templates/.claude/skills/moai-docs-generation/reference.md +226 -320
- moai_adk/templates/.claude/skills/moai-domain-backend/SKILL.md +43 -222
- moai_adk/templates/.claude/skills/moai-domain-database/SKILL.md +75 -219
- moai_adk/templates/.claude/skills/moai-domain-frontend/SKILL.md +103 -463
- moai_adk/templates/.claude/skills/moai-domain-frontend/modules/component-architecture.md +723 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/modules/nextjs16-patterns.md +713 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/modules/performance-optimization.md +694 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/modules/react19-patterns.md +591 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/modules/state-management.md +680 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/modules/vue35-patterns.md +802 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/SKILL.md +118 -339
- moai_adk/templates/.claude/skills/moai-formats-data/SKILL.md +74 -377
- moai_adk/templates/.claude/skills/moai-formats-data/modules/README.md +299 -70
- moai_adk/templates/.claude/skills/moai-foundation-claude/SKILL.md +205 -182
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/advanced-agent-patterns.md +370 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-cli-reference-official.md +420 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-custom-slash-commands-official.md +32 -22
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-devcontainers-official.md +381 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-discover-plugins-official.md +379 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-headless-official.md +378 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-hooks-official.md +110 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-plugin-marketplaces-official.md +308 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-plugins-official.md +640 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-sandboxing-official.md +282 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-skills-official.md +425 -71
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-statusline-official.md +293 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-sub-agents-official.md +325 -143
- moai_adk/templates/.claude/skills/moai-foundation-context/SKILL.md +96 -316
- moai_adk/templates/.claude/skills/moai-foundation-core/SKILL.md +116 -294
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/delegation-advanced.md +279 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/delegation-implementation.md +267 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/delegation-patterns.md +121 -650
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/patterns.md +22 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/spec-ears-format.md +200 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/spec-first-tdd.md +37 -730
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/spec-tdd-implementation.md +275 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/trust-5-framework.md +77 -819
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/trust-5-implementation.md +244 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/trust-5-validation.md +219 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/SKILL.md +14 -18
- moai_adk/templates/.claude/skills/moai-foundation-quality/SKILL.md +86 -270
- moai_adk/templates/.claude/skills/moai-framework-electron/SKILL.md +288 -0
- moai_adk/templates/.claude/skills/moai-framework-electron/examples.md +2082 -0
- moai_adk/templates/.claude/skills/moai-framework-electron/reference.md +1649 -0
- moai_adk/templates/.claude/skills/moai-lang-cpp/SKILL.md +76 -582
- moai_adk/templates/.claude/skills/moai-lang-cpp/examples.md +1239 -0
- moai_adk/templates/.claude/skills/moai-lang-cpp/modules/advanced-patterns.md +401 -0
- moai_adk/templates/.claude/skills/moai-lang-cpp/reference.md +1136 -0
- moai_adk/templates/.claude/skills/moai-lang-csharp/SKILL.md +82 -436
- moai_adk/templates/.claude/skills/moai-lang-csharp/examples.md +585 -0
- moai_adk/templates/.claude/skills/moai-lang-csharp/modules/aspnet-core.md +627 -0
- moai_adk/templates/.claude/skills/moai-lang-csharp/modules/blazor-components.md +767 -0
- moai_adk/templates/.claude/skills/moai-lang-csharp/modules/cqrs-validation.md +626 -0
- moai_adk/templates/.claude/skills/moai-lang-csharp/modules/csharp12-features.md +580 -0
- moai_adk/templates/.claude/skills/moai-lang-csharp/modules/efcore-patterns.md +622 -0
- moai_adk/templates/.claude/skills/moai-lang-csharp/reference.md +403 -0
- moai_adk/templates/.claude/skills/moai-lang-elixir/SKILL.md +65 -542
- moai_adk/templates/.claude/skills/moai-lang-elixir/examples.md +1171 -0
- moai_adk/templates/.claude/skills/moai-lang-elixir/modules/advanced-patterns.md +531 -0
- moai_adk/templates/.claude/skills/moai-lang-elixir/reference.md +889 -0
- moai_adk/templates/.claude/skills/moai-lang-flutter/SKILL.md +32 -405
- moai_adk/templates/.claude/skills/moai-lang-go/SKILL.md +114 -293
- moai_adk/templates/.claude/skills/moai-lang-java/SKILL.md +83 -307
- moai_adk/templates/.claude/skills/moai-lang-javascript/SKILL.md +179 -0
- moai_adk/templates/.claude/skills/moai-lang-javascript/examples.md +973 -0
- moai_adk/templates/.claude/skills/moai-lang-javascript/reference.md +1543 -0
- moai_adk/templates/.claude/skills/moai-lang-kotlin/SKILL.md +42 -279
- moai_adk/templates/.claude/skills/moai-lang-php/SKILL.md +94 -556
- moai_adk/templates/.claude/skills/moai-lang-php/examples.md +1608 -0
- moai_adk/templates/.claude/skills/moai-lang-php/modules/advanced-patterns.md +538 -0
- moai_adk/templates/.claude/skills/moai-lang-php/reference.md +1323 -0
- moai_adk/templates/.claude/skills/moai-lang-python/SKILL.md +108 -358
- moai_adk/templates/.claude/skills/moai-lang-r/SKILL.md +84 -482
- moai_adk/templates/.claude/skills/moai-lang-r/examples.md +1154 -0
- moai_adk/templates/.claude/skills/moai-lang-r/modules/advanced-patterns.md +489 -0
- moai_adk/templates/.claude/skills/moai-lang-r/reference.md +1087 -0
- moai_adk/templates/.claude/skills/moai-lang-ruby/SKILL.md +106 -610
- moai_adk/templates/.claude/skills/moai-lang-ruby/examples.md +1106 -0
- moai_adk/templates/.claude/skills/moai-lang-ruby/modules/advanced-patterns.md +309 -0
- moai_adk/templates/.claude/skills/moai-lang-ruby/modules/testing-patterns.md +306 -0
- moai_adk/templates/.claude/skills/moai-lang-ruby/reference.md +1024 -0
- moai_adk/templates/.claude/skills/moai-lang-rust/SKILL.md +51 -265
- moai_adk/templates/.claude/skills/moai-lang-scala/SKILL.md +106 -442
- moai_adk/templates/.claude/skills/moai-lang-scala/modules/akka-actors.md +479 -0
- moai_adk/templates/.claude/skills/moai-lang-scala/modules/cats-effect.md +489 -0
- moai_adk/templates/.claude/skills/moai-lang-scala/modules/functional-programming.md +460 -0
- moai_adk/templates/.claude/skills/moai-lang-scala/modules/spark-data.md +498 -0
- moai_adk/templates/.claude/skills/moai-lang-scala/modules/zio-patterns.md +541 -0
- moai_adk/templates/.claude/skills/moai-lang-swift/SKILL.md +88 -457
- moai_adk/templates/.claude/skills/moai-lang-swift/modules/combine-reactive.md +256 -0
- moai_adk/templates/.claude/skills/moai-lang-swift/modules/concurrency.md +270 -0
- moai_adk/templates/.claude/skills/moai-lang-swift/modules/swift6-features.md +265 -0
- moai_adk/templates/.claude/skills/moai-lang-swift/modules/swiftui-patterns.md +314 -0
- moai_adk/templates/.claude/skills/moai-lang-typescript/SKILL.md +75 -283
- moai_adk/templates/.claude/skills/moai-library-mermaid/SKILL.md +97 -252
- moai_adk/templates/.claude/skills/moai-library-nextra/SKILL.md +64 -240
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/advanced-patterns.md +331 -12
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/configuration.md +330 -37
- moai_adk/templates/.claude/skills/moai-library-shadcn/SKILL.md +90 -287
- moai_adk/templates/.claude/skills/moai-platform-auth0/SKILL.md +200 -206
- moai_adk/templates/.claude/skills/moai-platform-auth0/examples.md +2446 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/adaptive-mfa.md +233 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/akamai-integration.md +214 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/application-credentials.md +280 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/attack-protection-log-events.md +224 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/attack-protection-overview.md +140 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/bot-detection.md +144 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/breached-password-detection.md +187 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/brute-force-protection.md +189 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/certifications.md +282 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/compliance-overview.md +263 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/continuous-session-protection.md +307 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/customize-mfa.md +177 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/dpop-implementation.md +283 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/fapi-implementation.md +259 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/gdpr-compliance.md +313 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/guardian-configuration.md +269 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/highly-regulated-identity.md +272 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/jwt-fundamentals.md +248 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/mdl-verification.md +210 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/mfa-api-management.md +278 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/mfa-factors.md +226 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/mfa-overview.md +174 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/mtls-sender-constraining.md +316 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/ropg-flow-mfa.md +216 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/security-center.md +325 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/security-guidance.md +277 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/state-parameters.md +177 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/step-up-authentication.md +251 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/suspicious-ip-throttling.md +240 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/tenant-access-control.md +179 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/webauthn-fido.md +235 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/reference.md +224 -0
- moai_adk/templates/.claude/skills/moai-platform-clerk/SKILL.md +75 -330
- moai_adk/templates/.claude/skills/moai-platform-clerk/examples.md +1426 -0
- moai_adk/templates/.claude/skills/moai-platform-clerk/modules/advanced-patterns.md +417 -0
- moai_adk/templates/.claude/skills/moai-platform-clerk/reference.md +273 -0
- moai_adk/templates/.claude/skills/moai-platform-convex/SKILL.md +100 -340
- moai_adk/templates/.claude/skills/moai-platform-convex/examples.md +506 -0
- moai_adk/templates/.claude/skills/moai-platform-convex/modules/auth-integration.md +421 -0
- moai_adk/templates/.claude/skills/moai-platform-convex/modules/file-storage.md +474 -0
- moai_adk/templates/.claude/skills/moai-platform-convex/modules/reactive-queries.md +302 -0
- moai_adk/templates/.claude/skills/moai-platform-convex/modules/server-functions.md +452 -0
- moai_adk/templates/.claude/skills/moai-platform-convex/reference.md +385 -0
- moai_adk/templates/.claude/skills/moai-platform-firebase-auth/SKILL.md +113 -326
- moai_adk/templates/.claude/skills/moai-platform-firebase-auth/examples.md +514 -0
- moai_adk/templates/.claude/skills/moai-platform-firebase-auth/modules/custom-claims.md +374 -0
- moai_adk/templates/.claude/skills/moai-platform-firebase-auth/modules/phone-auth.md +372 -0
- moai_adk/templates/.claude/skills/moai-platform-firebase-auth/modules/social-auth.md +339 -0
- moai_adk/templates/.claude/skills/moai-platform-firebase-auth/reference.md +382 -0
- moai_adk/templates/.claude/skills/moai-platform-firestore/SKILL.md +71 -302
- moai_adk/templates/.claude/skills/moai-platform-firestore/examples.md +445 -0
- moai_adk/templates/.claude/skills/moai-platform-firestore/modules/offline-cache.md +392 -0
- moai_adk/templates/.claude/skills/moai-platform-firestore/modules/realtime-listeners.md +441 -0
- moai_adk/templates/.claude/skills/moai-platform-firestore/modules/security-rules.md +352 -0
- moai_adk/templates/.claude/skills/moai-platform-firestore/modules/transactions.md +452 -0
- moai_adk/templates/.claude/skills/moai-platform-firestore/reference.md +322 -0
- moai_adk/templates/.claude/skills/moai-platform-neon/SKILL.md +101 -412
- moai_adk/templates/.claude/skills/moai-platform-neon/examples.md +470 -0
- moai_adk/templates/.claude/skills/moai-platform-neon/modules/auto-scaling.md +349 -0
- moai_adk/templates/.claude/skills/moai-platform-neon/modules/branching-workflows.md +354 -0
- moai_adk/templates/.claude/skills/moai-platform-neon/modules/connection-pooling.md +412 -0
- moai_adk/templates/.claude/skills/moai-platform-neon/modules/pitr-backups.md +458 -0
- moai_adk/templates/.claude/skills/moai-platform-neon/reference.md +272 -0
- moai_adk/templates/.claude/skills/moai-platform-railway/SKILL.md +96 -327
- moai_adk/templates/.claude/skills/moai-platform-railway/examples.md +539 -0
- moai_adk/templates/.claude/skills/moai-platform-railway/modules/docker-deployment.md +261 -0
- moai_adk/templates/.claude/skills/moai-platform-railway/modules/multi-service.md +291 -0
- moai_adk/templates/.claude/skills/moai-platform-railway/modules/networking-domains.md +338 -0
- moai_adk/templates/.claude/skills/moai-platform-railway/modules/volumes-storage.md +353 -0
- moai_adk/templates/.claude/skills/moai-platform-railway/reference.md +374 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/SKILL.md +103 -428
- moai_adk/templates/.claude/skills/moai-platform-supabase/examples.md +502 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/modules/auth-integration.md +384 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/modules/edge-functions.md +371 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/modules/postgresql-pgvector.md +231 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/modules/realtime-presence.md +354 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/modules/row-level-security.md +286 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/modules/storage-cdn.md +319 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/modules/typescript-patterns.md +453 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/reference.md +284 -0
- moai_adk/templates/.claude/skills/moai-platform-vercel/SKILL.md +96 -446
- moai_adk/templates/.claude/skills/moai-platform-vercel/examples.md +502 -0
- moai_adk/templates/.claude/skills/moai-platform-vercel/modules/analytics-speed.md +348 -0
- moai_adk/templates/.claude/skills/moai-platform-vercel/modules/deployment-config.md +344 -0
- moai_adk/templates/.claude/skills/moai-platform-vercel/modules/edge-functions.md +222 -0
- moai_adk/templates/.claude/skills/moai-platform-vercel/modules/isr-caching.md +306 -0
- moai_adk/templates/.claude/skills/moai-platform-vercel/modules/kv-storage.md +399 -0
- moai_adk/templates/.claude/skills/moai-platform-vercel/reference.md +360 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/SKILL.md +193 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/examples.md +1099 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/modules/language-specific.md +307 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/modules/pattern-syntax.md +237 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/modules/refactoring-patterns.md +260 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/modules/security-rules.md +239 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/reference.md +288 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/languages/go.yml +90 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/languages/python.yml +101 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/languages/typescript.yml +83 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/quality/complexity-check.yml +94 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/quality/deprecated-apis.yml +84 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/security/secrets-detection.yml +89 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/security/sql-injection.yml +45 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/security/xss-prevention.yml +50 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/sgconfig.yml +54 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/SKILL.md +225 -423
- moai_adk/templates/.claude/skills/moai-workflow-loop/SKILL.md +197 -0
- moai_adk/templates/.claude/skills/moai-workflow-loop/examples.md +1063 -0
- moai_adk/templates/.claude/skills/moai-workflow-loop/reference.md +1414 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/SKILL.md +211 -314
- moai_adk/templates/.claude/skills/moai-workflow-project/schemas/tab_schema.json +15 -43
- moai_adk/templates/.claude/skills/moai-workflow-spec/SKILL.md +119 -316
- moai_adk/templates/.claude/skills/moai-workflow-spec/modules/advanced-patterns.md +237 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/SKILL.md +96 -203
- moai_adk/templates/.claude/skills/moai-workflow-testing/SKILL.md +201 -388
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/README.md +52 -3
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/ai-debugging.md +263 -806
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/context7-integration.md +286 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/review-workflows.md +500 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/trust5-framework/relevance-analysis.md +154 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/trust5-framework/safety-analysis.md +148 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/trust5-framework/scoring-algorithms.md +196 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/trust5-framework/timeliness-analysis.md +168 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/trust5-framework/truthfulness-analysis.md +136 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/trust5-framework/usability-analysis.md +153 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/trust5-framework.md +257 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review.md +191 -1344
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/code-review/analysis-patterns.md +340 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/code-review/core-classes.md +299 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/code-review/tool-integration.md +380 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/debugging/debugging-workflows.md +451 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/debugging/error-analysis.md +442 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance/optimization-patterns.md +473 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance/profiling-techniques.md +481 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization/ai-optimization.md +241 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization/bottleneck-detection.md +397 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization/optimization-plan.md +315 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization/profiler-core.md +277 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization/real-time-monitoring.md +187 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization.md +287 -1194
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/quality-metrics.md +415 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/refactoring/ai-workflows.md +620 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/refactoring/patterns.md +692 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/security-analysis.md +429 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/smart-refactoring.md +262 -1192
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/static-analysis.md +438 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd/core-classes.md +397 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7/advanced-features.md +494 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7/red-green-refactor.md +316 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7/test-generation.md +471 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7/test-patterns.md +371 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7.md +227 -1222
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/trust5-validation.md +428 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/SKILL.md +228 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/integration-patterns.md +149 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/moai-adk-integration.md +245 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/parallel-advanced.md +310 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/parallel-development.md +202 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/parallel-workflows.md +302 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/registry-architecture.md +271 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/resource-optimization.md +300 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/tools-integration.md +280 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/troubleshooting.md +397 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/worktree-commands.md +296 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/worktree-management.md +217 -0
- moai_adk/templates/.git-hooks/pre-push +162 -59
- moai_adk/templates/.github/workflows/ci-universal.yml +934 -133
- moai_adk/templates/.gitignore +65 -107
- moai_adk/templates/.lsp.json +152 -0
- moai_adk/templates/.mcp.json +2 -20
- moai_adk/templates/.moai/announcements/en.json +18 -0
- moai_adk/templates/.moai/announcements/ja.json +18 -0
- moai_adk/templates/.moai/announcements/ko.json +18 -0
- moai_adk/templates/.moai/announcements/zh.json +18 -0
- moai_adk/templates/.moai/config/config.yaml +8 -2
- moai_adk/templates/.moai/config/multilingual-triggers.yaml +213 -0
- moai_adk/templates/.moai/config/sections/language.yaml +2 -2
- moai_adk/templates/.moai/config/sections/llm.yaml +41 -0
- moai_adk/templates/.moai/config/sections/pricing.yaml +30 -0
- moai_adk/templates/.moai/config/sections/project.yaml +2 -2
- moai_adk/templates/.moai/config/sections/quality.yaml +43 -5
- moai_adk/templates/.moai/config/sections/ralph.yaml +55 -0
- moai_adk/templates/.moai/config/sections/system.yaml +46 -1
- moai_adk/templates/.moai/config/sections/user.yaml +1 -1
- moai_adk/templates/.moai/config/statusline-config.yaml +2 -2
- moai_adk/templates/.moai/llm-configs/glm.json +22 -0
- moai_adk/templates/CLAUDE.ja.md +343 -0
- moai_adk/templates/CLAUDE.ko.md +343 -0
- moai_adk/templates/CLAUDE.md +200 -499
- moai_adk/templates/CLAUDE.zh.md +343 -0
- moai_adk/utils/common.py +37 -0
- moai_adk/version.py +1 -1
- moai_adk-1.1.0.dist-info/METADATA +2443 -0
- moai_adk-1.1.0.dist-info/RECORD +701 -0
- {moai_adk-0.34.0.dist-info → moai_adk-1.1.0.dist-info}/entry_points.txt +2 -0
- moai_adk-1.1.0.dist-info/licenses/LICENSE +99 -0
- moai_adk/core/config/auto_spec_config.py +0 -340
- moai_adk/core/hooks/post_tool_auto_spec_completion.py +0 -901
- moai_adk/core/spec/confidence_scoring.py +0 -680
- moai_adk/core/spec/ears_template_engine.py +0 -1247
- moai_adk/core/spec/quality_validator.py +0 -687
- moai_adk/templates/.claude/agents/moai/ai-nano-banana.md +0 -670
- moai_adk/templates/.claude/agents/moai/expert-database.md +0 -777
- moai_adk/templates/.claude/agents/moai/expert-uiux.md +0 -1041
- moai_adk/templates/.claude/agents/moai/mcp-context7.md +0 -458
- moai_adk/templates/.claude/agents/moai/mcp-figma.md +0 -1607
- moai_adk/templates/.claude/agents/moai/mcp-notion.md +0 -789
- moai_adk/templates/.claude/agents/moai/mcp-playwright.md +0 -469
- moai_adk/templates/.claude/agents/moai/mcp-sequential-thinking.md +0 -1032
- moai_adk/templates/.claude/skills/moai-ai-nano-banana/SKILL.md +0 -438
- moai_adk/templates/.claude/skills/moai-ai-nano-banana/examples.md +0 -431
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/design-system-tokens.md +0 -405
- moai_adk/templates/.claude/skills/moai-library-nextra/advanced-patterns.md +0 -336
- moai_adk/templates/.claude/skills/moai-mcp-figma/SKILL.md +0 -402
- moai_adk/templates/.claude/skills/moai-mcp-figma/advanced-patterns.md +0 -607
- moai_adk/templates/.claude/skills/moai-mcp-notion/SKILL.md +0 -300
- moai_adk/templates/.claude/skills/moai-mcp-notion/advanced-patterns.md +0 -537
- moai_adk/templates/.claude/skills/moai-workflow-project/__init__.py +0 -520
- moai_adk/templates/.claude/skills/moai-workflow-project/complete_workflow_demo_fixed.py +0 -574
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/complete_project_setup.py +0 -317
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/complete_workflow_demo.py +0 -663
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/config-migration-example.json +0 -190
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/question-examples.json +0 -175
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/quick_start.py +0 -196
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/__init__.py +0 -17
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/advanced-patterns.md +0 -158
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/ask_user_integration.py +0 -340
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/batch_questions.py +0 -713
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/config_manager.py +0 -538
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/documentation_manager.py +0 -1336
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/language_initializer.py +0 -730
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/migration_manager.py +0 -608
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/template_optimizer.py +0 -1005
- moai_adk/templates/.claude/skills/moai-workflow-project/test_integration_simple.py +0 -436
- moai_adk/templates/.claude/skills/moai-worktree/SKILL.md +0 -411
- moai_adk/templates/.claude/skills/moai-worktree/modules/integration-patterns.md +0 -982
- moai_adk/templates/.claude/skills/moai-worktree/modules/parallel-development.md +0 -778
- moai_adk/templates/.claude/skills/moai-worktree/modules/worktree-commands.md +0 -646
- moai_adk/templates/.claude/skills/moai-worktree/modules/worktree-management.md +0 -782
- moai_adk/templates/.moai/config/questions/_schema.yaml +0 -151
- moai_adk/templates/.moai/config/questions/tab0-init.yaml +0 -251
- moai_adk/templates/.moai/config/questions/tab1-user.yaml +0 -108
- moai_adk/templates/.moai/config/questions/tab2-project.yaml +0 -81
- moai_adk/templates/.moai/config/questions/tab3-git.yaml +0 -634
- moai_adk/templates/.moai/config/questions/tab4-quality.yaml +0 -170
- moai_adk/templates/.moai/config/questions/tab5-system.yaml +0 -87
- moai_adk/templates/.moai/scripts/setup-glm.py +0 -136
- moai_adk-0.34.0.dist-info/METADATA +0 -2999
- moai_adk-0.34.0.dist-info/RECORD +0 -463
- moai_adk-0.34.0.dist-info/licenses/LICENSE +0 -21
- /moai_adk/foundation/{git.py → git/__init__.py} +0 -0
- /moai_adk/templates/.claude/skills/moai-library-mermaid/{advanced-patterns.md → modules/advanced-patterns.md} +0 -0
- /moai_adk/templates/.claude/skills/moai-library-mermaid/{optimization.md → modules/optimization.md} +0 -0
- /moai_adk/templates/.claude/skills/moai-library-nextra/{optimization.md → modules/optimization.md} +0 -0
- /moai_adk/templates/.claude/skills/moai-workflow-jit-docs/{advanced-patterns.md → modules/advanced-patterns.md} +0 -0
- /moai_adk/templates/.claude/skills/moai-workflow-jit-docs/{optimization.md → modules/optimization.md} +0 -0
- /moai_adk/templates/.claude/skills/moai-workflow-testing/{advanced-patterns.md → modules/advanced-patterns.md} +0 -0
- /moai_adk/templates/.claude/skills/moai-workflow-testing/{optimization.md → modules/optimization.md} +0 -0
- /moai_adk/templates/.claude/skills/{moai-worktree → moai-workflow-worktree}/examples.md +0 -0
- /moai_adk/templates/.claude/skills/{moai-worktree → moai-workflow-worktree}/reference.md +0 -0
- {moai_adk-0.34.0.dist-info → moai_adk-1.1.0.dist-info}/WHEEL +0 -0
|
@@ -0,0 +1,349 @@
|
|
|
1
|
+
# Auto-Scaling and Compute Management
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
Neon auto-scaling automatically adjusts compute resources based on workload demand, with scale-to-zero capability for cost optimization during idle periods.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Compute Unit Specifications
|
|
10
|
+
|
|
11
|
+
### Available Compute Sizes
|
|
12
|
+
|
|
13
|
+
0.25 CU Specifications:
|
|
14
|
+
- vCPU: 0.25
|
|
15
|
+
- RAM: 1 GB
|
|
16
|
+
- Use Case: Development, testing, low-traffic applications
|
|
17
|
+
|
|
18
|
+
0.5 CU Specifications:
|
|
19
|
+
- vCPU: 0.5
|
|
20
|
+
- RAM: 2 GB
|
|
21
|
+
- Use Case: Light production workloads, staging environments
|
|
22
|
+
|
|
23
|
+
1 CU Specifications:
|
|
24
|
+
- vCPU: 1
|
|
25
|
+
- RAM: 4 GB
|
|
26
|
+
- Use Case: Standard production applications
|
|
27
|
+
|
|
28
|
+
2 CU Specifications:
|
|
29
|
+
- vCPU: 2
|
|
30
|
+
- RAM: 8 GB
|
|
31
|
+
- Use Case: Medium workloads, moderate traffic
|
|
32
|
+
|
|
33
|
+
4 CU Specifications:
|
|
34
|
+
- vCPU: 4
|
|
35
|
+
- RAM: 16 GB
|
|
36
|
+
- Use Case: Heavy workloads, high traffic applications
|
|
37
|
+
|
|
38
|
+
8 CU Specifications:
|
|
39
|
+
- vCPU: 8
|
|
40
|
+
- RAM: 32 GB
|
|
41
|
+
- Use Case: High-performance requirements, data processing
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## Auto-Scaling Configuration
|
|
46
|
+
|
|
47
|
+
### Configuration via API
|
|
48
|
+
|
|
49
|
+
```typescript
|
|
50
|
+
interface AutoScalingConfig {
|
|
51
|
+
minCu: number // Minimum compute units (0.25 for scale-to-zero)
|
|
52
|
+
maxCu: number // Maximum compute units
|
|
53
|
+
suspendTimeout: number // Seconds before suspension (0 to disable)
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
async function configureAutoScaling(endpointId: string, config: AutoScalingConfig) {
|
|
57
|
+
const response = await fetch(
|
|
58
|
+
`https://console.neon.tech/api/v2/projects/${process.env.NEON_PROJECT_ID}/endpoints/${endpointId}`,
|
|
59
|
+
{
|
|
60
|
+
method: 'PATCH',
|
|
61
|
+
headers: {
|
|
62
|
+
'Authorization': `Bearer ${process.env.NEON_API_KEY}`,
|
|
63
|
+
'Content-Type': 'application/json'
|
|
64
|
+
},
|
|
65
|
+
body: JSON.stringify({
|
|
66
|
+
endpoint: {
|
|
67
|
+
autoscaling_limit_min_cu: config.minCu,
|
|
68
|
+
autoscaling_limit_max_cu: config.maxCu,
|
|
69
|
+
suspend_timeout_seconds: config.suspendTimeout
|
|
70
|
+
}
|
|
71
|
+
})
|
|
72
|
+
}
|
|
73
|
+
)
|
|
74
|
+
|
|
75
|
+
if (!response.ok) {
|
|
76
|
+
throw new Error(`Failed to configure auto-scaling: ${response.statusText}`)
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
return response.json()
|
|
80
|
+
}
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### Environment-Specific Configurations
|
|
84
|
+
|
|
85
|
+
Development Configuration:
|
|
86
|
+
```typescript
|
|
87
|
+
const devConfig: AutoScalingConfig = {
|
|
88
|
+
minCu: 0.25, // Scale to zero when idle
|
|
89
|
+
maxCu: 0.5, // Limited compute for development
|
|
90
|
+
suspendTimeout: 300 // Suspend after 5 minutes idle
|
|
91
|
+
}
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
Staging Configuration:
|
|
95
|
+
```typescript
|
|
96
|
+
const stagingConfig: AutoScalingConfig = {
|
|
97
|
+
minCu: 0.25, // Scale to zero during off-hours
|
|
98
|
+
maxCu: 1, // Moderate compute for testing
|
|
99
|
+
suspendTimeout: 600 // Suspend after 10 minutes idle
|
|
100
|
+
}
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
Production Configuration:
|
|
104
|
+
```typescript
|
|
105
|
+
const productionConfig: AutoScalingConfig = {
|
|
106
|
+
minCu: 0.5, // Always-on minimum for faster response
|
|
107
|
+
maxCu: 4, // Scale up for peak traffic
|
|
108
|
+
suspendTimeout: 3600 // Suspend after 1 hour idle (or 0 to disable)
|
|
109
|
+
}
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
High-Traffic Production Configuration:
|
|
113
|
+
```typescript
|
|
114
|
+
const highTrafficConfig: AutoScalingConfig = {
|
|
115
|
+
minCu: 1, // Higher baseline for consistent performance
|
|
116
|
+
maxCu: 8, // Maximum scale for peak loads
|
|
117
|
+
suspendTimeout: 0 // Never suspend (always-on)
|
|
118
|
+
}
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
---
|
|
122
|
+
|
|
123
|
+
## Scale-to-Zero Behavior
|
|
124
|
+
|
|
125
|
+
### How Scale-to-Zero Works
|
|
126
|
+
|
|
127
|
+
Idle Detection: Neon monitors connection activity and query execution
|
|
128
|
+
Suspension: After suspend_timeout seconds of inactivity, compute suspends
|
|
129
|
+
Wake-Up: First connection request triggers automatic wake-up
|
|
130
|
+
Cold Start: Typical wake-up time is 500ms to 2 seconds
|
|
131
|
+
|
|
132
|
+
### Cold Start Optimization
|
|
133
|
+
|
|
134
|
+
Connection Pooling Impact:
|
|
135
|
+
- Use pooled connections to reduce cold start frequency
|
|
136
|
+
- Pooler maintains connection state during suspension
|
|
137
|
+
- First query after wake-up experiences latency
|
|
138
|
+
|
|
139
|
+
Warming Strategies:
|
|
140
|
+
```typescript
|
|
141
|
+
// Health check endpoint to keep database warm
|
|
142
|
+
async function warmDatabase() {
|
|
143
|
+
const sql = neon(process.env.DATABASE_URL_POOLED!)
|
|
144
|
+
|
|
145
|
+
// Simple query to prevent suspension
|
|
146
|
+
await sql`SELECT 1`
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
// Schedule periodic warming (every 4 minutes for 5-minute timeout)
|
|
150
|
+
setInterval(warmDatabase, 4 * 60 * 1000)
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
### Cost Implications
|
|
154
|
+
|
|
155
|
+
Scale-to-Zero Benefits:
|
|
156
|
+
- Zero compute charges during idle periods
|
|
157
|
+
- Ideal for development and low-traffic applications
|
|
158
|
+
- Automatic cost optimization without manual intervention
|
|
159
|
+
|
|
160
|
+
Trade-offs:
|
|
161
|
+
- Cold start latency on first request after suspension
|
|
162
|
+
- Not suitable for latency-sensitive applications
|
|
163
|
+
- Consider always-on minimum for production workloads
|
|
164
|
+
|
|
165
|
+
---
|
|
166
|
+
|
|
167
|
+
## Endpoint Management
|
|
168
|
+
|
|
169
|
+
### Get Current Endpoint Configuration
|
|
170
|
+
|
|
171
|
+
```typescript
|
|
172
|
+
async function getEndpointConfig(endpointId: string) {
|
|
173
|
+
const response = await fetch(
|
|
174
|
+
`https://console.neon.tech/api/v2/projects/${process.env.NEON_PROJECT_ID}/endpoints/${endpointId}`,
|
|
175
|
+
{
|
|
176
|
+
headers: {
|
|
177
|
+
'Authorization': `Bearer ${process.env.NEON_API_KEY}`
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
)
|
|
181
|
+
|
|
182
|
+
return response.json()
|
|
183
|
+
}
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
### List All Endpoints
|
|
187
|
+
|
|
188
|
+
```typescript
|
|
189
|
+
async function listEndpoints() {
|
|
190
|
+
const response = await fetch(
|
|
191
|
+
`https://console.neon.tech/api/v2/projects/${process.env.NEON_PROJECT_ID}/endpoints`,
|
|
192
|
+
{
|
|
193
|
+
headers: {
|
|
194
|
+
'Authorization': `Bearer ${process.env.NEON_API_KEY}`
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
)
|
|
198
|
+
|
|
199
|
+
return response.json()
|
|
200
|
+
}
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
### Monitor Endpoint Status
|
|
204
|
+
|
|
205
|
+
```typescript
|
|
206
|
+
interface EndpointStatus {
|
|
207
|
+
id: string
|
|
208
|
+
state: 'active' | 'idle' | 'suspended'
|
|
209
|
+
currentCu: number
|
|
210
|
+
lastActiveAt: string
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
async function getEndpointStatus(endpointId: string): Promise<EndpointStatus> {
|
|
214
|
+
const { endpoint } = await getEndpointConfig(endpointId)
|
|
215
|
+
|
|
216
|
+
return {
|
|
217
|
+
id: endpoint.id,
|
|
218
|
+
state: endpoint.current_state,
|
|
219
|
+
currentCu: endpoint.autoscaling_limit_min_cu,
|
|
220
|
+
lastActiveAt: endpoint.last_active
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
---
|
|
226
|
+
|
|
227
|
+
## Cost Optimization Strategies
|
|
228
|
+
|
|
229
|
+
### Development Environments
|
|
230
|
+
|
|
231
|
+
Strategy: Aggressive scale-to-zero with low maximum compute
|
|
232
|
+
|
|
233
|
+
```typescript
|
|
234
|
+
// Minimize costs for development databases
|
|
235
|
+
await configureAutoScaling(devEndpointId, {
|
|
236
|
+
minCu: 0.25,
|
|
237
|
+
maxCu: 0.5,
|
|
238
|
+
suspendTimeout: 180 // 3 minutes - quick suspension
|
|
239
|
+
})
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
### Staging Environments
|
|
243
|
+
|
|
244
|
+
Strategy: Balance between cost and performance for testing
|
|
245
|
+
|
|
246
|
+
```typescript
|
|
247
|
+
// Cost-effective staging with reasonable performance
|
|
248
|
+
await configureAutoScaling(stagingEndpointId, {
|
|
249
|
+
minCu: 0.25,
|
|
250
|
+
maxCu: 2,
|
|
251
|
+
suspendTimeout: 600 // 10 minutes
|
|
252
|
+
})
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
### Production Environments
|
|
256
|
+
|
|
257
|
+
Strategy: Prioritize performance with cost awareness
|
|
258
|
+
|
|
259
|
+
```typescript
|
|
260
|
+
// Production with always-on minimum
|
|
261
|
+
await configureAutoScaling(prodEndpointId, {
|
|
262
|
+
minCu: 0.5, // Avoid cold starts
|
|
263
|
+
maxCu: 4, // Handle traffic spikes
|
|
264
|
+
suspendTimeout: 0 // Never suspend
|
|
265
|
+
})
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
### Off-Hours Optimization
|
|
269
|
+
|
|
270
|
+
```typescript
|
|
271
|
+
// Reduce compute during off-peak hours
|
|
272
|
+
async function adjustForOffHours(endpointId: string, isOffHours: boolean) {
|
|
273
|
+
const config = isOffHours
|
|
274
|
+
? { minCu: 0.25, maxCu: 1, suspendTimeout: 300 }
|
|
275
|
+
: { minCu: 0.5, maxCu: 4, suspendTimeout: 0 }
|
|
276
|
+
|
|
277
|
+
await configureAutoScaling(endpointId, config)
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
// Schedule-based adjustment
|
|
281
|
+
const hour = new Date().getUTCHours()
|
|
282
|
+
const isOffHours = hour >= 2 && hour < 8 // 2 AM - 8 AM UTC
|
|
283
|
+
await adjustForOffHours(productionEndpointId, isOffHours)
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
---
|
|
287
|
+
|
|
288
|
+
## Monitoring and Alerts
|
|
289
|
+
|
|
290
|
+
### Compute Usage Tracking
|
|
291
|
+
|
|
292
|
+
```typescript
|
|
293
|
+
interface ComputeMetrics {
|
|
294
|
+
currentCu: number
|
|
295
|
+
avgCu: number
|
|
296
|
+
peakCu: number
|
|
297
|
+
suspendedMinutes: number
|
|
298
|
+
activeMinutes: number
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
async function getComputeMetrics(endpointId: string): Promise<ComputeMetrics> {
|
|
302
|
+
// Fetch from Neon console API or monitoring integration
|
|
303
|
+
const { endpoint } = await getEndpointConfig(endpointId)
|
|
304
|
+
|
|
305
|
+
return {
|
|
306
|
+
currentCu: endpoint.current_state === 'active' ? endpoint.autoscaling_limit_min_cu : 0,
|
|
307
|
+
avgCu: 0, // Calculate from historical data
|
|
308
|
+
peakCu: endpoint.autoscaling_limit_max_cu,
|
|
309
|
+
suspendedMinutes: 0, // Calculate from suspension logs
|
|
310
|
+
activeMinutes: 0 // Calculate from activity logs
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
### Alert Thresholds
|
|
316
|
+
|
|
317
|
+
High Compute Alert: Notify when consistently at max CU
|
|
318
|
+
Frequent Suspensions: Alert if cold starts affecting performance
|
|
319
|
+
Cost Threshold: Alert when monthly compute exceeds budget
|
|
320
|
+
|
|
321
|
+
---
|
|
322
|
+
|
|
323
|
+
## Best Practices
|
|
324
|
+
|
|
325
|
+
### Configuration Guidelines
|
|
326
|
+
|
|
327
|
+
Development: Use 0.25-0.5 CU range with short suspension timeout
|
|
328
|
+
Staging: Use 0.25-2 CU range with moderate suspension timeout
|
|
329
|
+
Production: Use 0.5-4 CU range, consider disabling suspension for critical apps
|
|
330
|
+
High-Traffic: Use 1-8 CU range with suspension disabled
|
|
331
|
+
|
|
332
|
+
### Performance Considerations
|
|
333
|
+
|
|
334
|
+
Connection Pooling: Always use pooled connections with auto-scaling
|
|
335
|
+
Query Optimization: Optimize queries to reduce compute time
|
|
336
|
+
Indexing: Proper indexes reduce CPU usage and allow smaller compute
|
|
337
|
+
Caching: Implement application-level caching to reduce database load
|
|
338
|
+
|
|
339
|
+
### Cost Management
|
|
340
|
+
|
|
341
|
+
Monitor Usage: Track compute hours and identify optimization opportunities
|
|
342
|
+
Right-Size: Adjust max CU based on actual peak usage
|
|
343
|
+
Schedule Scaling: Reduce compute during known low-traffic periods
|
|
344
|
+
Branch Cleanup: Delete unused branches to avoid dormant compute costs
|
|
345
|
+
|
|
346
|
+
---
|
|
347
|
+
|
|
348
|
+
Version: 2.0.0
|
|
349
|
+
Last Updated: 2026-01-06
|
|
@@ -0,0 +1,354 @@
|
|
|
1
|
+
# Database Branching Workflows
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
Neon database branching creates instant copy-on-write clones of your database, enabling isolated development environments, preview deployments, and safe testing with production data.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Core Concepts
|
|
10
|
+
|
|
11
|
+
### Copy-on-Write Architecture
|
|
12
|
+
|
|
13
|
+
Branch Creation: Instant creation with no data copying
|
|
14
|
+
Storage Efficiency: Branches share unchanged data with parent
|
|
15
|
+
Write Isolation: Changes in branch do not affect parent
|
|
16
|
+
Inheritance: New data in parent does not propagate to existing branches
|
|
17
|
+
|
|
18
|
+
### Branch Types
|
|
19
|
+
|
|
20
|
+
Main Branch: Primary production database
|
|
21
|
+
Development Branch: Long-lived branch for development work
|
|
22
|
+
Feature Branch: Short-lived branch for specific features
|
|
23
|
+
Preview Branch: Ephemeral branch for PR preview environments
|
|
24
|
+
Restore Branch: Branch created for point-in-time recovery
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## Branch Management API
|
|
29
|
+
|
|
30
|
+
### NeonBranchManager Implementation
|
|
31
|
+
|
|
32
|
+
```typescript
|
|
33
|
+
class NeonBranchManager {
|
|
34
|
+
private apiKey: string
|
|
35
|
+
private projectId: string
|
|
36
|
+
private baseUrl = 'https://console.neon.tech/api/v2'
|
|
37
|
+
|
|
38
|
+
constructor(apiKey: string, projectId: string) {
|
|
39
|
+
this.apiKey = apiKey
|
|
40
|
+
this.projectId = projectId
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
private async request(path: string, options: RequestInit = {}) {
|
|
44
|
+
const response = await fetch(`${this.baseUrl}${path}`, {
|
|
45
|
+
...options,
|
|
46
|
+
headers: {
|
|
47
|
+
'Authorization': `Bearer ${this.apiKey}`,
|
|
48
|
+
'Content-Type': 'application/json',
|
|
49
|
+
...options.headers
|
|
50
|
+
}
|
|
51
|
+
})
|
|
52
|
+
if (!response.ok) throw new Error(`Neon API error: ${response.statusText}`)
|
|
53
|
+
return response.json()
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
async createBranch(name: string, parentId: string = 'main') {
|
|
57
|
+
return this.request(`/projects/${this.projectId}/branches`, {
|
|
58
|
+
method: 'POST',
|
|
59
|
+
body: JSON.stringify({
|
|
60
|
+
branch: { name, parent_id: parentId }
|
|
61
|
+
})
|
|
62
|
+
})
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
async deleteBranch(branchId: string) {
|
|
66
|
+
return this.request(`/projects/${this.projectId}/branches/${branchId}`, {
|
|
67
|
+
method: 'DELETE'
|
|
68
|
+
})
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
async listBranches() {
|
|
72
|
+
return this.request(`/projects/${this.projectId}/branches`)
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
async getBranchConnectionString(branchId: string) {
|
|
76
|
+
const endpoints = await this.request(
|
|
77
|
+
`/projects/${this.projectId}/branches/${branchId}/endpoints`
|
|
78
|
+
)
|
|
79
|
+
return endpoints.endpoints[0]?.connection_uri
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
## Preview Environment Pattern
|
|
87
|
+
|
|
88
|
+
### Per-PR Database Branches
|
|
89
|
+
|
|
90
|
+
```typescript
|
|
91
|
+
async function createPreviewEnvironment(prNumber: number) {
|
|
92
|
+
const branchManager = new NeonBranchManager(
|
|
93
|
+
process.env.NEON_API_KEY!,
|
|
94
|
+
process.env.NEON_PROJECT_ID!
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
// Create branch from main with PR identifier
|
|
98
|
+
const branch = await branchManager.createBranch(`pr-${prNumber}`, 'main')
|
|
99
|
+
|
|
100
|
+
// Get connection string for the new branch
|
|
101
|
+
const connectionString = await branchManager.getBranchConnectionString(branch.branch.id)
|
|
102
|
+
|
|
103
|
+
return {
|
|
104
|
+
branchId: branch.branch.id,
|
|
105
|
+
branchName: branch.branch.name,
|
|
106
|
+
connectionString,
|
|
107
|
+
createdAt: new Date().toISOString()
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
async function cleanupPreviewEnvironment(prNumber: number) {
|
|
112
|
+
const branchManager = new NeonBranchManager(
|
|
113
|
+
process.env.NEON_API_KEY!,
|
|
114
|
+
process.env.NEON_PROJECT_ID!
|
|
115
|
+
)
|
|
116
|
+
|
|
117
|
+
// Find and delete the PR branch
|
|
118
|
+
const { branches } = await branchManager.listBranches()
|
|
119
|
+
const prBranch = branches.find(b => b.name === `pr-${prNumber}`)
|
|
120
|
+
|
|
121
|
+
if (prBranch) {
|
|
122
|
+
await branchManager.deleteBranch(prBranch.id)
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
## GitHub Actions Integration
|
|
130
|
+
|
|
131
|
+
### Preview Environment Workflow
|
|
132
|
+
|
|
133
|
+
```yaml
|
|
134
|
+
name: Preview Environment
|
|
135
|
+
|
|
136
|
+
on:
|
|
137
|
+
pull_request:
|
|
138
|
+
types: [opened, synchronize, closed]
|
|
139
|
+
|
|
140
|
+
env:
|
|
141
|
+
NEON_API_KEY: ${{ secrets.NEON_API_KEY }}
|
|
142
|
+
NEON_PROJECT_ID: ${{ secrets.NEON_PROJECT_ID }}
|
|
143
|
+
|
|
144
|
+
jobs:
|
|
145
|
+
create-preview:
|
|
146
|
+
if: github.event.action != 'closed'
|
|
147
|
+
runs-on: ubuntu-latest
|
|
148
|
+
outputs:
|
|
149
|
+
branch_id: ${{ steps.create-branch.outputs.branch_id }}
|
|
150
|
+
database_url: ${{ steps.create-branch.outputs.database_url }}
|
|
151
|
+
steps:
|
|
152
|
+
- name: Create Neon Branch
|
|
153
|
+
id: create-branch
|
|
154
|
+
run: |
|
|
155
|
+
RESPONSE=$(curl -s -X POST \
|
|
156
|
+
-H "Authorization: Bearer $NEON_API_KEY" \
|
|
157
|
+
-H "Content-Type: application/json" \
|
|
158
|
+
-d '{"branch":{"name":"pr-${{ github.event.number }}"}}' \
|
|
159
|
+
"https://console.neon.tech/api/v2/projects/$NEON_PROJECT_ID/branches")
|
|
160
|
+
|
|
161
|
+
BRANCH_ID=$(echo $RESPONSE | jq -r '.branch.id')
|
|
162
|
+
echo "branch_id=$BRANCH_ID" >> $GITHUB_OUTPUT
|
|
163
|
+
|
|
164
|
+
# Get connection string
|
|
165
|
+
ENDPOINTS=$(curl -s \
|
|
166
|
+
-H "Authorization: Bearer $NEON_API_KEY" \
|
|
167
|
+
"https://console.neon.tech/api/v2/projects/$NEON_PROJECT_ID/branches/$BRANCH_ID/endpoints")
|
|
168
|
+
|
|
169
|
+
DATABASE_URL=$(echo $ENDPOINTS | jq -r '.endpoints[0].connection_uri')
|
|
170
|
+
echo "database_url=$DATABASE_URL" >> $GITHUB_OUTPUT
|
|
171
|
+
|
|
172
|
+
- name: Comment PR with Database URL
|
|
173
|
+
uses: actions/github-script@v7
|
|
174
|
+
with:
|
|
175
|
+
script: |
|
|
176
|
+
github.rest.issues.createComment({
|
|
177
|
+
issue_number: context.issue.number,
|
|
178
|
+
owner: context.repo.owner,
|
|
179
|
+
repo: context.repo.repo,
|
|
180
|
+
body: `Preview database created: \`pr-${{ github.event.number }}\`\n\nBranch ID: \`${{ steps.create-branch.outputs.branch_id }}\``
|
|
181
|
+
})
|
|
182
|
+
|
|
183
|
+
deploy-preview:
|
|
184
|
+
needs: create-preview
|
|
185
|
+
runs-on: ubuntu-latest
|
|
186
|
+
steps:
|
|
187
|
+
- uses: actions/checkout@v4
|
|
188
|
+
|
|
189
|
+
- name: Run Migrations
|
|
190
|
+
env:
|
|
191
|
+
DATABASE_URL: ${{ needs.create-preview.outputs.database_url }}
|
|
192
|
+
run: |
|
|
193
|
+
npm ci
|
|
194
|
+
npm run db:migrate
|
|
195
|
+
|
|
196
|
+
- name: Deploy Preview
|
|
197
|
+
env:
|
|
198
|
+
DATABASE_URL: ${{ needs.create-preview.outputs.database_url }}
|
|
199
|
+
run: |
|
|
200
|
+
# Deploy to preview environment (Vercel, Netlify, etc.)
|
|
201
|
+
echo "Deploying with preview database..."
|
|
202
|
+
|
|
203
|
+
cleanup-preview:
|
|
204
|
+
if: github.event.action == 'closed'
|
|
205
|
+
runs-on: ubuntu-latest
|
|
206
|
+
steps:
|
|
207
|
+
- name: Find Branch ID
|
|
208
|
+
id: find-branch
|
|
209
|
+
run: |
|
|
210
|
+
BRANCHES=$(curl -s \
|
|
211
|
+
-H "Authorization: Bearer $NEON_API_KEY" \
|
|
212
|
+
"https://console.neon.tech/api/v2/projects/$NEON_PROJECT_ID/branches")
|
|
213
|
+
|
|
214
|
+
BRANCH_ID=$(echo $BRANCHES | jq -r '.branches[] | select(.name == "pr-${{ github.event.number }}") | .id')
|
|
215
|
+
echo "branch_id=$BRANCH_ID" >> $GITHUB_OUTPUT
|
|
216
|
+
|
|
217
|
+
- name: Delete Neon Branch
|
|
218
|
+
if: steps.find-branch.outputs.branch_id != ''
|
|
219
|
+
run: |
|
|
220
|
+
curl -X DELETE \
|
|
221
|
+
-H "Authorization: Bearer $NEON_API_KEY" \
|
|
222
|
+
"https://console.neon.tech/api/v2/projects/$NEON_PROJECT_ID/branches/${{ steps.find-branch.outputs.branch_id }}"
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
---
|
|
226
|
+
|
|
227
|
+
## Development Workflow Pattern
|
|
228
|
+
|
|
229
|
+
### Feature Branch Database
|
|
230
|
+
|
|
231
|
+
```typescript
|
|
232
|
+
interface FeatureBranchConfig {
|
|
233
|
+
featureName: string
|
|
234
|
+
baseBranch?: string
|
|
235
|
+
autoCleanupDays?: number
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
async function createFeatureBranch(config: FeatureBranchConfig) {
|
|
239
|
+
const { featureName, baseBranch = 'main', autoCleanupDays = 7 } = config
|
|
240
|
+
|
|
241
|
+
const branchManager = new NeonBranchManager(
|
|
242
|
+
process.env.NEON_API_KEY!,
|
|
243
|
+
process.env.NEON_PROJECT_ID!
|
|
244
|
+
)
|
|
245
|
+
|
|
246
|
+
// Create branch with feature prefix
|
|
247
|
+
const branchName = `feature-${featureName}-${Date.now()}`
|
|
248
|
+
const branch = await branchManager.createBranch(branchName, baseBranch)
|
|
249
|
+
|
|
250
|
+
// Store cleanup metadata
|
|
251
|
+
const metadata = {
|
|
252
|
+
branchId: branch.branch.id,
|
|
253
|
+
branchName,
|
|
254
|
+
featureName,
|
|
255
|
+
createdAt: new Date().toISOString(),
|
|
256
|
+
expiresAt: new Date(Date.now() + autoCleanupDays * 24 * 60 * 60 * 1000).toISOString()
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
return {
|
|
260
|
+
...metadata,
|
|
261
|
+
connectionString: await branchManager.getBranchConnectionString(branch.branch.id)
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
async function cleanupExpiredBranches() {
|
|
266
|
+
const branchManager = new NeonBranchManager(
|
|
267
|
+
process.env.NEON_API_KEY!,
|
|
268
|
+
process.env.NEON_PROJECT_ID!
|
|
269
|
+
)
|
|
270
|
+
|
|
271
|
+
const { branches } = await branchManager.listBranches()
|
|
272
|
+
const now = new Date()
|
|
273
|
+
|
|
274
|
+
for (const branch of branches) {
|
|
275
|
+
// Check if branch is a feature branch and expired
|
|
276
|
+
if (branch.name.startsWith('feature-')) {
|
|
277
|
+
const createdAt = new Date(branch.created_at)
|
|
278
|
+
const ageInDays = (now.getTime() - createdAt.getTime()) / (24 * 60 * 60 * 1000)
|
|
279
|
+
|
|
280
|
+
if (ageInDays > 7) {
|
|
281
|
+
console.log(`Cleaning up expired branch: ${branch.name}`)
|
|
282
|
+
await branchManager.deleteBranch(branch.id)
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
---
|
|
290
|
+
|
|
291
|
+
## Branch Reset Pattern
|
|
292
|
+
|
|
293
|
+
### Reset Branch to Parent State
|
|
294
|
+
|
|
295
|
+
```typescript
|
|
296
|
+
async function resetBranchToParent(branchName: string) {
|
|
297
|
+
const branchManager = new NeonBranchManager(
|
|
298
|
+
process.env.NEON_API_KEY!,
|
|
299
|
+
process.env.NEON_PROJECT_ID!
|
|
300
|
+
)
|
|
301
|
+
|
|
302
|
+
// Find the current branch
|
|
303
|
+
const { branches } = await branchManager.listBranches()
|
|
304
|
+
const currentBranch = branches.find(b => b.name === branchName)
|
|
305
|
+
|
|
306
|
+
if (!currentBranch) {
|
|
307
|
+
throw new Error(`Branch ${branchName} not found`)
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
const parentId = currentBranch.parent_id
|
|
311
|
+
|
|
312
|
+
// Delete current branch
|
|
313
|
+
await branchManager.deleteBranch(currentBranch.id)
|
|
314
|
+
|
|
315
|
+
// Recreate with same name from parent
|
|
316
|
+
const newBranch = await branchManager.createBranch(branchName, parentId)
|
|
317
|
+
|
|
318
|
+
return {
|
|
319
|
+
branchId: newBranch.branch.id,
|
|
320
|
+
connectionString: await branchManager.getBranchConnectionString(newBranch.branch.id),
|
|
321
|
+
resetAt: new Date().toISOString()
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
---
|
|
327
|
+
|
|
328
|
+
## Best Practices
|
|
329
|
+
|
|
330
|
+
### Branch Naming Conventions
|
|
331
|
+
|
|
332
|
+
Preview Branches: pr-{number} for pull request previews
|
|
333
|
+
Feature Branches: feature-{name}-{timestamp} for development
|
|
334
|
+
Staging Branches: staging or staging-{version} for staging environments
|
|
335
|
+
Restore Branches: restore-{timestamp} for point-in-time recovery
|
|
336
|
+
|
|
337
|
+
### Lifecycle Management
|
|
338
|
+
|
|
339
|
+
Automatic Cleanup: Configure scheduled cleanup for expired branches
|
|
340
|
+
Branch Limits: Monitor branch count against project limits
|
|
341
|
+
Connection Management: Use pooled connections for branch databases
|
|
342
|
+
Cost Awareness: Branches consume compute when active
|
|
343
|
+
|
|
344
|
+
### Security Considerations
|
|
345
|
+
|
|
346
|
+
Sensitive Data: Consider data masking for non-production branches
|
|
347
|
+
Access Control: Limit API key permissions for branch operations
|
|
348
|
+
Audit Trail: Log branch creation and deletion operations
|
|
349
|
+
Credential Rotation: Rotate branch credentials on schedule
|
|
350
|
+
|
|
351
|
+
---
|
|
352
|
+
|
|
353
|
+
Version: 2.0.0
|
|
354
|
+
Last Updated: 2026-01-06
|