specweave 0.21.2 → 0.21.3
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/CLAUDE.md +232 -5
- package/dist/plugins/specweave-github/lib/IssueStateManager.d.ts +98 -0
- package/dist/plugins/specweave-github/lib/IssueStateManager.d.ts.map +1 -0
- package/dist/plugins/specweave-github/lib/IssueStateManager.js +146 -0
- package/dist/plugins/specweave-github/lib/IssueStateManager.js.map +1 -0
- package/dist/plugins/specweave-github/lib/user-story-issue-builder.d.ts.map +1 -1
- package/dist/plugins/specweave-github/lib/user-story-issue-builder.js +6 -0
- package/dist/plugins/specweave-github/lib/user-story-issue-builder.js.map +1 -1
- package/dist/src/cli/commands/check-hooks.d.ts +11 -0
- package/dist/src/cli/commands/check-hooks.d.ts.map +1 -0
- package/dist/src/cli/commands/check-hooks.js +144 -0
- package/dist/src/cli/commands/check-hooks.js.map +1 -0
- package/dist/src/cli/commands/cicd-monitor.js +3 -3
- package/dist/src/cli/commands/cicd-monitor.js.map +1 -1
- package/dist/src/cli/commands/import-docs.js +2 -2
- package/dist/src/cli/commands/import-docs.js.map +1 -1
- package/dist/src/cli/commands/init-multiproject.js +4 -4
- package/dist/src/cli/commands/init-multiproject.js.map +1 -1
- package/dist/src/cli/commands/migrate-to-multiproject.js +3 -3
- package/dist/src/cli/commands/migrate-to-multiproject.js.map +1 -1
- package/dist/src/cli/commands/plan/agent-invoker.d.ts +79 -0
- package/dist/src/cli/commands/plan/agent-invoker.d.ts.map +1 -0
- package/dist/src/cli/commands/plan/agent-invoker.js +383 -0
- package/dist/src/cli/commands/plan/agent-invoker.js.map +1 -0
- package/dist/src/cli/commands/plan/increment-detector.d.ts +27 -0
- package/dist/src/cli/commands/plan/increment-detector.d.ts.map +1 -0
- package/dist/src/cli/commands/plan/increment-detector.js +159 -0
- package/dist/src/cli/commands/plan/increment-detector.js.map +1 -0
- package/dist/src/cli/commands/plan/plan-orchestrator.d.ts +45 -0
- package/dist/src/cli/commands/plan/plan-orchestrator.d.ts.map +1 -0
- package/dist/src/cli/commands/plan/plan-orchestrator.js +229 -0
- package/dist/src/cli/commands/plan/plan-orchestrator.js.map +1 -0
- package/dist/src/cli/commands/plan/plan-validator.d.ts +36 -0
- package/dist/src/cli/commands/plan/plan-validator.d.ts.map +1 -0
- package/dist/src/cli/commands/plan/plan-validator.js +174 -0
- package/dist/src/cli/commands/plan/plan-validator.js.map +1 -0
- package/dist/src/cli/commands/plan/types.d.ts +170 -0
- package/dist/src/cli/commands/plan/types.d.ts.map +1 -0
- package/dist/src/cli/commands/plan/types.js +42 -0
- package/dist/src/cli/commands/plan/types.js.map +1 -0
- package/dist/src/cli/commands/plan-command.d.ts +16 -0
- package/dist/src/cli/commands/plan-command.d.ts.map +1 -0
- package/dist/src/cli/commands/plan-command.js +127 -0
- package/dist/src/cli/commands/plan-command.js.map +1 -0
- package/dist/src/cli/commands/switch-project.js +3 -3
- package/dist/src/cli/commands/switch-project.js.map +1 -1
- package/dist/src/cli/commands/validate-parent-repo.js +1 -1
- package/dist/src/cli/commands/validate-parent-repo.js.map +1 -1
- package/dist/src/config/ConfigManager.d.ts +69 -0
- package/dist/src/config/ConfigManager.d.ts.map +1 -0
- package/dist/src/config/ConfigManager.js +130 -0
- package/dist/src/config/ConfigManager.js.map +1 -0
- package/dist/src/config/types.d.ts +1357 -0
- package/dist/src/config/types.d.ts.map +1 -0
- package/dist/src/config/types.js +67 -0
- package/dist/src/config/types.js.map +1 -0
- package/dist/src/core/brownfield/importer.d.ts +1 -1
- package/dist/src/core/brownfield/importer.d.ts.map +1 -1
- package/dist/src/core/brownfield/importer.js +3 -3
- package/dist/src/core/brownfield/importer.js.map +1 -1
- package/dist/src/core/cicd/config-loader.d.ts +1 -1
- package/dist/src/core/cicd/config-loader.d.ts.map +1 -1
- package/dist/src/core/cicd/index.d.ts +6 -6
- package/dist/src/core/cicd/index.d.ts.map +1 -1
- package/dist/src/core/cicd/index.js +6 -6
- package/dist/src/core/cicd/index.js.map +1 -1
- package/dist/src/core/cicd/monitor-service.d.ts +3 -3
- package/dist/src/core/cicd/monitor-service.d.ts.map +1 -1
- package/dist/src/core/cicd/monitor-service.js +3 -3
- package/dist/src/core/cicd/monitor-service.js.map +1 -1
- package/dist/src/core/cicd/notifier.d.ts +1 -1
- package/dist/src/core/cicd/notifier.d.ts.map +1 -1
- package/dist/src/core/cicd/state-manager.d.ts +1 -1
- package/dist/src/core/cicd/state-manager.d.ts.map +1 -1
- package/dist/src/core/cicd/state-manager.js +1 -1
- package/dist/src/core/cicd/state-manager.js.map +1 -1
- package/dist/src/core/cicd/workflow-monitor.d.ts +1 -1
- package/dist/src/core/cicd/workflow-monitor.d.ts.map +1 -1
- package/dist/src/core/cicd/workflow-monitor.js +1 -1
- package/dist/src/core/cicd/workflow-monitor.js.map +1 -1
- package/dist/src/core/cost-tracker.d.ts +2 -2
- package/dist/src/core/cost-tracker.d.ts.map +1 -1
- package/dist/src/core/cost-tracker.js +1 -1
- package/dist/src/core/cost-tracker.js.map +1 -1
- package/dist/src/core/hooks/HealthReporter.d.ts +55 -0
- package/dist/src/core/hooks/HealthReporter.d.ts.map +1 -0
- package/dist/src/core/hooks/HealthReporter.js +268 -0
- package/dist/src/core/hooks/HealthReporter.js.map +1 -0
- package/dist/src/core/hooks/HookAutoFixer.d.ts +41 -0
- package/dist/src/core/hooks/HookAutoFixer.d.ts.map +1 -0
- package/dist/src/core/hooks/HookAutoFixer.js +222 -0
- package/dist/src/core/hooks/HookAutoFixer.js.map +1 -0
- package/dist/src/core/hooks/HookExecutor.d.ts +57 -0
- package/dist/src/core/hooks/HookExecutor.d.ts.map +1 -0
- package/dist/src/core/hooks/HookExecutor.js +287 -0
- package/dist/src/core/hooks/HookExecutor.js.map +1 -0
- package/dist/src/core/hooks/HookHealthChecker.d.ts +51 -0
- package/dist/src/core/hooks/HookHealthChecker.d.ts.map +1 -0
- package/dist/src/core/hooks/HookHealthChecker.js +212 -0
- package/dist/src/core/hooks/HookHealthChecker.js.map +1 -0
- package/dist/src/core/hooks/HookScanner.d.ts +65 -0
- package/dist/src/core/hooks/HookScanner.d.ts.map +1 -0
- package/dist/src/core/hooks/HookScanner.js +214 -0
- package/dist/src/core/hooks/HookScanner.js.map +1 -0
- package/dist/src/core/hooks/types.d.ts +281 -0
- package/dist/src/core/hooks/types.d.ts.map +1 -0
- package/dist/src/core/hooks/types.js +10 -0
- package/dist/src/core/hooks/types.js.map +1 -0
- package/dist/src/core/iac/index.d.ts +10 -0
- package/dist/src/core/iac/index.d.ts.map +1 -0
- package/dist/src/core/iac/index.js +11 -0
- package/dist/src/core/iac/index.js.map +1 -0
- package/dist/src/core/iac/template-engine.d.ts +77 -0
- package/dist/src/core/iac/template-engine.d.ts.map +1 -0
- package/dist/src/core/iac/template-engine.js +182 -0
- package/dist/src/core/iac/template-engine.js.map +1 -0
- package/dist/src/core/increment/ac-status-manager.d.ts +115 -0
- package/dist/src/core/increment/ac-status-manager.d.ts.map +1 -0
- package/dist/src/core/increment/ac-status-manager.js +343 -0
- package/dist/src/core/increment/ac-status-manager.js.map +1 -0
- package/dist/src/core/increment/auto-transition-manager.d.ts +60 -0
- package/dist/src/core/increment/auto-transition-manager.d.ts.map +1 -0
- package/dist/src/core/increment/auto-transition-manager.js +192 -0
- package/dist/src/core/increment/auto-transition-manager.js.map +1 -0
- package/dist/src/core/increment/limits.d.ts +1 -1
- package/dist/src/core/increment/limits.d.ts.map +1 -1
- package/dist/src/core/increment/limits.js +2 -2
- package/dist/src/core/increment/limits.js.map +1 -1
- package/dist/src/core/increment/spec-sync-manager.d.ts +177 -0
- package/dist/src/core/increment/spec-sync-manager.d.ts.map +1 -0
- package/dist/src/core/increment/spec-sync-manager.js +496 -0
- package/dist/src/core/increment/spec-sync-manager.js.map +1 -0
- package/dist/src/core/increment/status-auto-transition.d.ts +46 -0
- package/dist/src/core/increment/status-auto-transition.d.ts.map +1 -0
- package/dist/src/core/increment/status-auto-transition.js +178 -0
- package/dist/src/core/increment/status-auto-transition.js.map +1 -0
- package/dist/src/core/increment/task-state-manager.d.ts +75 -0
- package/dist/src/core/increment/task-state-manager.d.ts.map +1 -0
- package/dist/src/core/increment/task-state-manager.js +117 -0
- package/dist/src/core/increment/task-state-manager.js.map +1 -0
- package/dist/src/core/living-docs/CodeValidator.d.ts +68 -0
- package/dist/src/core/living-docs/CodeValidator.d.ts.map +1 -0
- package/dist/src/core/living-docs/CodeValidator.js +160 -0
- package/dist/src/core/living-docs/CodeValidator.js.map +1 -0
- package/dist/src/core/living-docs/CompletionPropagator.d.ts +84 -0
- package/dist/src/core/living-docs/CompletionPropagator.d.ts.map +1 -0
- package/dist/src/core/living-docs/CompletionPropagator.js +205 -0
- package/dist/src/core/living-docs/CompletionPropagator.js.map +1 -0
- package/dist/src/core/living-docs/ProjectDetector.d.ts +29 -0
- package/dist/src/core/living-docs/ProjectDetector.d.ts.map +1 -0
- package/dist/src/core/living-docs/ProjectDetector.js +94 -0
- package/dist/src/core/living-docs/ProjectDetector.js.map +1 -0
- package/dist/src/core/living-docs/SpecDistributor.d.ts +55 -0
- package/dist/src/core/living-docs/SpecDistributor.d.ts.map +1 -0
- package/dist/src/core/living-docs/SpecDistributor.js +216 -0
- package/dist/src/core/living-docs/SpecDistributor.js.map +1 -0
- package/dist/src/core/living-docs/ThreeLayerSyncManager.d.ts +116 -0
- package/dist/src/core/living-docs/ThreeLayerSyncManager.d.ts.map +1 -0
- package/dist/src/core/living-docs/ThreeLayerSyncManager.js +356 -0
- package/dist/src/core/living-docs/ThreeLayerSyncManager.js.map +1 -0
- package/dist/src/core/living-docs/hierarchy-mapper.d.ts.map +1 -1
- package/dist/src/core/living-docs/hierarchy-mapper.js +2 -1
- package/dist/src/core/living-docs/hierarchy-mapper.js.map +1 -1
- package/dist/src/core/living-docs/index.d.ts +1 -1
- package/dist/src/core/living-docs/index.d.ts.map +1 -1
- package/dist/src/core/living-docs/index.js +5 -1
- package/dist/src/core/living-docs/index.js.map +1 -1
- package/dist/src/core/living-docs/types.d.ts +70 -300
- package/dist/src/core/living-docs/types.d.ts.map +1 -1
- package/dist/src/core/living-docs/types.js +2 -10
- package/dist/src/core/living-docs/types.js.map +1 -1
- package/dist/src/core/project-manager.d.ts +1 -1
- package/dist/src/core/project-manager.d.ts.map +1 -1
- package/dist/src/core/project-manager.js +2 -2
- package/dist/src/core/project-manager.js.map +1 -1
- package/dist/src/core/qa/quality-gate-decider.d.ts +1 -1
- package/dist/src/core/qa/quality-gate-decider.d.ts.map +1 -1
- package/dist/src/core/qa/risk-calculator.d.ts +1 -1
- package/dist/src/core/qa/risk-calculator.d.ts.map +1 -1
- package/dist/src/core/repo-structure/setup-summary.d.ts +1 -1
- package/dist/src/core/repo-structure/setup-summary.d.ts.map +1 -1
- package/dist/src/core/rfc-generator-v2.d.ts +1 -1
- package/dist/src/core/rfc-generator-v2.d.ts.map +1 -1
- package/dist/src/core/rfc-generator-v2.js +1 -1
- package/dist/src/core/rfc-generator-v2.js.map +1 -1
- package/dist/src/core/serverless/context-detector.d.ts +12 -0
- package/dist/src/core/serverless/context-detector.d.ts.map +1 -0
- package/dist/src/core/serverless/context-detector.js +213 -0
- package/dist/src/core/serverless/context-detector.js.map +1 -0
- package/dist/src/core/serverless/cost-comparison.d.ts +73 -0
- package/dist/src/core/serverless/cost-comparison.d.ts.map +1 -0
- package/dist/src/core/serverless/cost-comparison.js +198 -0
- package/dist/src/core/serverless/cost-comparison.js.map +1 -0
- package/dist/src/core/serverless/cost-estimator.d.ts +69 -0
- package/dist/src/core/serverless/cost-estimator.d.ts.map +1 -0
- package/dist/src/core/serverless/cost-estimator.js +127 -0
- package/dist/src/core/serverless/cost-estimator.js.map +1 -0
- package/dist/src/core/serverless/cost-optimizer.d.ts +57 -0
- package/dist/src/core/serverless/cost-optimizer.d.ts.map +1 -0
- package/dist/src/core/serverless/cost-optimizer.js +221 -0
- package/dist/src/core/serverless/cost-optimizer.js.map +1 -0
- package/dist/src/core/serverless/index.d.ts +20 -0
- package/dist/src/core/serverless/index.d.ts.map +1 -0
- package/dist/src/core/serverless/index.js +26 -0
- package/dist/src/core/serverless/index.js.map +1 -0
- package/dist/src/core/serverless/learning-path-recommender.d.ts +152 -0
- package/dist/src/core/serverless/learning-path-recommender.d.ts.map +1 -0
- package/dist/src/core/serverless/learning-path-recommender.js +389 -0
- package/dist/src/core/serverless/learning-path-recommender.js.map +1 -0
- package/dist/src/core/serverless/platform-data-loader.d.ts +22 -0
- package/dist/src/core/serverless/platform-data-loader.d.ts.map +1 -0
- package/dist/src/core/serverless/platform-data-loader.js +49 -0
- package/dist/src/core/serverless/platform-data-loader.js.map +1 -0
- package/dist/src/core/serverless/platform-selector.d.ts +20 -0
- package/dist/src/core/serverless/platform-selector.d.ts.map +1 -0
- package/dist/src/core/serverless/platform-selector.js +279 -0
- package/dist/src/core/serverless/platform-selector.js.map +1 -0
- package/dist/src/core/serverless/recommendation-formatter.d.ts +24 -0
- package/dist/src/core/serverless/recommendation-formatter.d.ts.map +1 -0
- package/dist/src/core/serverless/recommendation-formatter.js +70 -0
- package/dist/src/core/serverless/recommendation-formatter.js.map +1 -0
- package/dist/src/core/serverless/suitability-analyzer.d.ts +22 -0
- package/dist/src/core/serverless/suitability-analyzer.d.ts.map +1 -0
- package/dist/src/core/serverless/suitability-analyzer.js +262 -0
- package/dist/src/core/serverless/suitability-analyzer.js.map +1 -0
- package/dist/src/core/serverless/types.d.ts +96 -0
- package/dist/src/core/serverless/types.d.ts.map +1 -0
- package/dist/src/core/serverless/types.js +5 -0
- package/dist/src/core/serverless/types.js.map +1 -0
- package/dist/src/core/sync/bidirectional-engine.d.ts +1 -1
- package/dist/src/core/sync/bidirectional-engine.d.ts.map +1 -1
- package/dist/src/core/sync/enhanced-content-builder.d.ts +1 -1
- package/dist/src/core/sync/enhanced-content-builder.d.ts.map +1 -1
- package/dist/src/core/sync/profile-manager.d.ts +1 -1
- package/dist/src/core/sync/profile-manager.d.ts.map +1 -1
- package/dist/src/core/sync/profile-selector.d.ts +1 -1
- package/dist/src/core/sync/profile-selector.d.ts.map +1 -1
- package/dist/src/core/sync/profile-selector.js +1 -1
- package/dist/src/core/sync/profile-selector.js.map +1 -1
- package/dist/src/core/sync/project-context.d.ts +1 -1
- package/dist/src/core/sync/project-context.d.ts.map +1 -1
- package/dist/src/core/sync/rate-limiter.d.ts +1 -1
- package/dist/src/core/sync/rate-limiter.d.ts.map +1 -1
- package/dist/src/core/sync/status-sync-engine.d.ts +2 -2
- package/dist/src/core/sync/status-sync-engine.d.ts.map +1 -1
- package/dist/src/core/sync/status-sync-engine.js +2 -2
- package/dist/src/core/sync/status-sync-engine.js.map +1 -1
- package/dist/src/core/sync/time-range-selector.d.ts +1 -1
- package/dist/src/core/sync/time-range-selector.d.ts.map +1 -1
- package/dist/src/core/sync/time-range-selector.js +1 -1
- package/dist/src/core/sync/time-range-selector.js.map +1 -1
- package/dist/src/core/types/increment-metadata.d.ts +27 -0
- package/dist/src/core/types/increment-metadata.d.ts.map +1 -1
- package/dist/src/core/types/increment-metadata.js +45 -1
- package/dist/src/core/types/increment-metadata.js.map +1 -1
- package/dist/src/core/types/sync-profile.d.ts +2 -0
- package/dist/src/core/types/sync-profile.d.ts.map +1 -1
- package/dist/src/core/types/sync-profile.js.map +1 -1
- package/dist/src/core/validation/increment-structure-validator.d.ts +47 -0
- package/dist/src/core/validation/increment-structure-validator.d.ts.map +1 -0
- package/dist/src/core/validation/increment-structure-validator.js +187 -0
- package/dist/src/core/validation/increment-structure-validator.js.map +1 -0
- package/dist/src/core/validation/three-file-validator.d.ts +82 -0
- package/dist/src/core/validation/three-file-validator.d.ts.map +1 -0
- package/dist/src/core/validation/three-file-validator.js +320 -0
- package/dist/src/core/validation/three-file-validator.js.map +1 -0
- package/dist/src/core/workflow/phase-detector.d.ts +103 -0
- package/dist/src/core/workflow/phase-detector.d.ts.map +1 -0
- package/dist/src/core/workflow/phase-detector.js +704 -0
- package/dist/src/core/workflow/phase-detector.js.map +1 -0
- package/dist/src/core/workflow/types.d.ts +153 -0
- package/dist/src/core/workflow/types.d.ts.map +1 -0
- package/dist/src/core/workflow/types.js +47 -0
- package/dist/src/core/workflow/types.js.map +1 -0
- package/dist/src/init/InitFlow.d.ts +37 -0
- package/dist/src/init/InitFlow.d.ts.map +1 -0
- package/dist/src/init/InitFlow.js +209 -0
- package/dist/src/init/InitFlow.js.map +1 -0
- package/dist/src/init/architecture/ArchitectureDecisionEngine.d.ts +107 -0
- package/dist/src/init/architecture/ArchitectureDecisionEngine.d.ts.map +1 -0
- package/dist/src/init/architecture/ArchitectureDecisionEngine.js +405 -0
- package/dist/src/init/architecture/ArchitectureDecisionEngine.js.map +1 -0
- package/dist/src/init/architecture/CloudCreditsDatabase.d.ts +11 -0
- package/dist/src/init/architecture/CloudCreditsDatabase.d.ts.map +1 -0
- package/dist/src/init/architecture/CloudCreditsDatabase.js +92 -0
- package/dist/src/init/architecture/CloudCreditsDatabase.js.map +1 -0
- package/dist/src/init/architecture/types.d.ts +251 -0
- package/dist/src/init/architecture/types.d.ts.map +1 -0
- package/dist/src/init/architecture/types.js +54 -0
- package/dist/src/init/architecture/types.js.map +1 -0
- package/dist/src/init/compliance/ComplianceDetector.d.ts +17 -0
- package/dist/src/init/compliance/ComplianceDetector.d.ts.map +1 -0
- package/dist/src/init/compliance/ComplianceDetector.js +64 -0
- package/dist/src/init/compliance/ComplianceDetector.js.map +1 -0
- package/dist/src/init/compliance/standards-database.d.ts +48 -0
- package/dist/src/init/compliance/standards-database.d.ts.map +1 -0
- package/dist/src/init/compliance/standards-database.js +506 -0
- package/dist/src/init/compliance/standards-database.js.map +1 -0
- package/dist/src/init/compliance/types.d.ts +91 -0
- package/dist/src/init/compliance/types.d.ts.map +1 -0
- package/dist/src/init/compliance/types.js +43 -0
- package/dist/src/init/compliance/types.js.map +1 -0
- package/dist/src/init/repo/GitHubAPIClient.d.ts +51 -0
- package/dist/src/init/repo/GitHubAPIClient.d.ts.map +1 -0
- package/dist/src/init/repo/GitHubAPIClient.js +144 -0
- package/dist/src/init/repo/GitHubAPIClient.js.map +1 -0
- package/dist/src/init/repo/RepositorySelector.d.ts +45 -0
- package/dist/src/init/repo/RepositorySelector.d.ts.map +1 -0
- package/dist/src/init/repo/RepositorySelector.js +106 -0
- package/dist/src/init/repo/RepositorySelector.js.map +1 -0
- package/dist/src/init/repo/types.d.ts +95 -0
- package/dist/src/init/repo/types.d.ts.map +1 -0
- package/dist/src/init/repo/types.js +25 -0
- package/dist/src/init/repo/types.js.map +1 -0
- package/dist/src/init/research/CompetitorAnalyzer.d.ts +79 -0
- package/dist/src/init/research/CompetitorAnalyzer.d.ts.map +1 -0
- package/dist/src/init/research/CompetitorAnalyzer.js +265 -0
- package/dist/src/init/research/CompetitorAnalyzer.js.map +1 -0
- package/dist/src/init/research/MarketDetector.d.ts +62 -0
- package/dist/src/init/research/MarketDetector.d.ts.map +1 -0
- package/dist/src/init/research/MarketDetector.js +247 -0
- package/dist/src/init/research/MarketDetector.js.map +1 -0
- package/dist/src/init/research/OpportunityScorer.d.ts +58 -0
- package/dist/src/init/research/OpportunityScorer.d.ts.map +1 -0
- package/dist/src/init/research/OpportunityScorer.js +194 -0
- package/dist/src/init/research/OpportunityScorer.js.map +1 -0
- package/dist/src/init/research/QuestionGenerator.d.ts +68 -0
- package/dist/src/init/research/QuestionGenerator.d.ts.map +1 -0
- package/dist/src/init/research/QuestionGenerator.js +244 -0
- package/dist/src/init/research/QuestionGenerator.js.map +1 -0
- package/dist/src/init/research/ReportGenerator.d.ts +36 -0
- package/dist/src/init/research/ReportGenerator.d.ts.map +1 -0
- package/dist/src/init/research/ReportGenerator.js +125 -0
- package/dist/src/init/research/ReportGenerator.js.map +1 -0
- package/dist/src/init/research/VisionAnalyzer.d.ts +129 -0
- package/dist/src/init/research/VisionAnalyzer.d.ts.map +1 -0
- package/dist/src/init/research/VisionAnalyzer.js +212 -0
- package/dist/src/init/research/VisionAnalyzer.js.map +1 -0
- package/dist/src/init/research/keyword-extractor.d.ts +78 -0
- package/dist/src/init/research/keyword-extractor.d.ts.map +1 -0
- package/dist/src/init/research/keyword-extractor.js +230 -0
- package/dist/src/init/research/keyword-extractor.js.map +1 -0
- package/dist/src/init/research/src/config/ConfigManager.d.ts +14 -0
- package/dist/src/init/research/src/config/ConfigManager.d.ts.map +1 -0
- package/dist/src/init/research/src/config/ConfigManager.js +45 -0
- package/dist/src/init/research/src/config/ConfigManager.js.map +1 -0
- package/dist/src/init/research/src/config/types.d.ts +102 -0
- package/dist/src/init/research/src/config/types.d.ts.map +1 -0
- package/dist/src/init/research/src/config/types.js +24 -0
- package/dist/src/init/research/src/config/types.js.map +1 -0
- package/dist/src/init/research/types.d.ts +183 -0
- package/dist/src/init/research/types.d.ts.map +1 -0
- package/dist/src/init/research/types.js +65 -0
- package/dist/src/init/research/types.js.map +1 -0
- package/dist/src/init/team/ServerlessSavingsCalculator.d.ts +136 -0
- package/dist/src/init/team/ServerlessSavingsCalculator.d.ts.map +1 -0
- package/dist/src/init/team/ServerlessSavingsCalculator.js +360 -0
- package/dist/src/init/team/ServerlessSavingsCalculator.js.map +1 -0
- package/dist/src/init/team/TeamRecommender.d.ts +122 -0
- package/dist/src/init/team/TeamRecommender.d.ts.map +1 -0
- package/dist/src/init/team/TeamRecommender.js +405 -0
- package/dist/src/init/team/TeamRecommender.js.map +1 -0
- package/dist/src/init/team/types.d.ts +95 -0
- package/dist/src/init/team/types.d.ts.map +1 -0
- package/dist/src/init/team/types.js +23 -0
- package/dist/src/init/team/types.js.map +1 -0
- package/dist/src/integrations/jira/jira-mapper.d.ts +1 -1
- package/dist/src/integrations/jira/jira-mapper.d.ts.map +1 -1
- package/dist/src/types/cost-tracking.d.ts +1 -1
- package/dist/src/types/cost-tracking.d.ts.map +1 -1
- package/dist/src/utils/cost-reporter.d.ts +2 -2
- package/dist/src/utils/cost-reporter.d.ts.map +1 -1
- package/dist/src/utils/docs-preview/config-generator.d.ts +1 -1
- package/dist/src/utils/docs-preview/config-generator.d.ts.map +1 -1
- package/dist/src/utils/docs-preview/config-generator.js +1 -1
- package/dist/src/utils/docs-preview/docusaurus-setup.d.ts +1 -1
- package/dist/src/utils/docs-preview/docusaurus-setup.d.ts.map +1 -1
- package/dist/src/utils/docs-preview/docusaurus-setup.js +4 -4
- package/dist/src/utils/docs-preview/docusaurus-setup.js.map +1 -1
- package/dist/src/utils/docs-preview/index.d.ts +6 -6
- package/dist/src/utils/docs-preview/index.d.ts.map +1 -1
- package/dist/src/utils/docs-preview/index.js +6 -6
- package/dist/src/utils/docs-preview/index.js.map +1 -1
- package/dist/src/utils/docs-preview/package-installer.d.ts +1 -1
- package/dist/src/utils/docs-preview/package-installer.d.ts.map +1 -1
- package/dist/src/utils/docs-preview/package-installer.js +1 -1
- package/dist/src/utils/docs-preview/package-installer.js.map +1 -1
- package/dist/src/utils/docs-preview/server-manager.d.ts +1 -1
- package/dist/src/utils/docs-preview/server-manager.d.ts.map +1 -1
- package/dist/src/utils/docs-preview/server-manager.js +1 -1
- package/dist/src/utils/docs-preview/server-manager.js.map +1 -1
- package/dist/src/utils/docs-preview/sidebar-builder.d.ts +1 -1
- package/dist/src/utils/docs-preview/sidebar-builder.d.ts.map +1 -1
- package/dist/src/utils/generate-skills-index.d.ts +1 -1
- package/dist/src/utils/generate-skills-index.js +1 -1
- package/dist/src/utils/project-detection.js +1 -1
- package/dist/src/utils/project-detection.js.map +1 -1
- package/package.json +9 -3
- package/plugins/specweave/agents/architect/AGENT.md +605 -0
- package/plugins/specweave/agents/infrastructure/AGENT.md +760 -0
- package/plugins/specweave/agents/pm/AGENT.md +14 -13
- package/plugins/specweave/commands/specweave-check-hooks.md +186 -0
- package/plugins/specweave/commands/specweave-plan.md +151 -0
- package/plugins/specweave/commands/specweave-sync-acs.md +342 -0
- package/plugins/specweave/commands/specweave-validate.md +60 -11
- package/plugins/specweave/hooks/lib/update-status-line.sh +8 -4
- package/plugins/specweave/hooks/post-increment-change.sh +4 -0
- package/plugins/specweave/hooks/post-increment-completion.sh +7 -1
- package/plugins/specweave/hooks/post-increment-planning.sh +4 -0
- package/plugins/specweave/hooks/post-increment-status-change.sh +4 -0
- package/plugins/specweave/hooks/user-prompt-submit.sh +78 -0
- package/plugins/specweave/iac-templates/aws-lambda/README.md.hbs +280 -0
- package/plugins/specweave/iac-templates/aws-lambda/defaults.json +118 -0
- package/plugins/specweave/iac-templates/aws-lambda/environments/dev.defaults.json +46 -0
- package/plugins/specweave/iac-templates/aws-lambda/environments/prod.defaults.json +67 -0
- package/plugins/specweave/iac-templates/aws-lambda/environments/staging.defaults.json +47 -0
- package/plugins/specweave/iac-templates/aws-lambda/main.tf.hbs +241 -0
- package/plugins/specweave/iac-templates/aws-lambda/outputs.tf.hbs +61 -0
- package/plugins/specweave/iac-templates/aws-lambda/provider.tf.hbs +15 -0
- package/plugins/specweave/iac-templates/aws-lambda/variables.tf.hbs +88 -0
- package/plugins/specweave/iac-templates/azure-functions/README.md.hbs +315 -0
- package/plugins/specweave/iac-templates/azure-functions/defaults.json +65 -0
- package/plugins/specweave/iac-templates/azure-functions/environments/dev.defaults.json +30 -0
- package/plugins/specweave/iac-templates/azure-functions/environments/prod.defaults.json +34 -0
- package/plugins/specweave/iac-templates/azure-functions/environments/staging.defaults.json +31 -0
- package/plugins/specweave/iac-templates/azure-functions/iam.tf.hbs +34 -0
- package/plugins/specweave/iac-templates/azure-functions/main.tf.hbs +247 -0
- package/plugins/specweave/iac-templates/azure-functions/outputs.tf.hbs +72 -0
- package/plugins/specweave/iac-templates/azure-functions/provider.tf.hbs +14 -0
- package/plugins/specweave/iac-templates/azure-functions/variables.tf.hbs +64 -0
- package/plugins/specweave/iac-templates/firebase/README.md.hbs +487 -0
- package/plugins/specweave/iac-templates/firebase/defaults.json +55 -0
- package/plugins/specweave/iac-templates/firebase/environments/dev.defaults.json +44 -0
- package/plugins/specweave/iac-templates/firebase/environments/prod.defaults.json +52 -0
- package/plugins/specweave/iac-templates/firebase/environments/staging.defaults.json +43 -0
- package/plugins/specweave/iac-templates/firebase/iam.tf.hbs +75 -0
- package/plugins/specweave/iac-templates/firebase/main.tf.hbs +297 -0
- package/plugins/specweave/iac-templates/firebase/outputs.tf.hbs +67 -0
- package/plugins/specweave/iac-templates/firebase/provider.tf.hbs +26 -0
- package/plugins/specweave/iac-templates/firebase/variables.tf.hbs +68 -0
- package/plugins/specweave/iac-templates/gcp-cloud-functions/README.md.hbs +330 -0
- package/plugins/specweave/iac-templates/gcp-cloud-functions/defaults.json +69 -0
- package/plugins/specweave/iac-templates/gcp-cloud-functions/environments/dev.defaults.json +33 -0
- package/plugins/specweave/iac-templates/gcp-cloud-functions/environments/prod.defaults.json +40 -0
- package/plugins/specweave/iac-templates/gcp-cloud-functions/environments/staging.defaults.json +33 -0
- package/plugins/specweave/iac-templates/gcp-cloud-functions/iam.tf.hbs +54 -0
- package/plugins/specweave/iac-templates/gcp-cloud-functions/main.tf.hbs +211 -0
- package/plugins/specweave/iac-templates/gcp-cloud-functions/outputs.tf.hbs +44 -0
- package/plugins/specweave/iac-templates/gcp-cloud-functions/provider.tf.hbs +14 -0
- package/plugins/specweave/iac-templates/gcp-cloud-functions/variables.tf.hbs +82 -0
- package/plugins/specweave/iac-templates/supabase/README.md.hbs +534 -0
- package/plugins/specweave/iac-templates/supabase/defaults.json +69 -0
- package/plugins/specweave/iac-templates/supabase/environments/dev.defaults.json +55 -0
- package/plugins/specweave/iac-templates/supabase/environments/prod.defaults.json +75 -0
- package/plugins/specweave/iac-templates/supabase/environments/staging.defaults.json +54 -0
- package/plugins/specweave/iac-templates/supabase/iam.tf.hbs +146 -0
- package/plugins/specweave/iac-templates/supabase/main.tf.hbs +310 -0
- package/plugins/specweave/iac-templates/supabase/outputs.tf.hbs +74 -0
- package/plugins/specweave/iac-templates/supabase/provider.tf.hbs +19 -0
- package/plugins/specweave/iac-templates/supabase/variables.tf.hbs +78 -0
- package/plugins/specweave/knowledge-base/serverless/FRESHNESS.md +69 -0
- package/plugins/specweave/knowledge-base/serverless/learning-paths.json +865 -0
- package/plugins/specweave/knowledge-base/serverless/platforms/aws-lambda.json +41 -0
- package/plugins/specweave/knowledge-base/serverless/platforms/azure-functions.json +41 -0
- package/plugins/specweave/knowledge-base/serverless/platforms/firebase.json +46 -0
- package/plugins/specweave/knowledge-base/serverless/platforms/gcp-cloud-functions.json +41 -0
- package/plugins/specweave/knowledge-base/serverless/platforms/supabase.json +41 -0
- package/plugins/specweave/knowledge-base/serverless/schema.json +155 -0
- package/plugins/specweave/lib/hooks/auto-transition.js +50 -0
- package/plugins/specweave/lib/hooks/auto-transition.ts +84 -0
- package/plugins/specweave/lib/hooks/invoke-translator-skill.js +1 -1
- package/plugins/specweave/lib/hooks/invoke-translator-skill.ts +1 -1
- package/plugins/specweave/lib/hooks/sync-living-docs.js +4 -31
- package/plugins/specweave/lib/hooks/{sync-living-docs.ts → sync-living-docs.ts.DISABLED} +9 -48
- package/plugins/specweave/lib/hooks/translate-file.js +1 -1
- package/plugins/specweave/lib/hooks/translate-file.ts +1 -1
- package/plugins/specweave/lib/hooks/update-ac-status.js +24 -75
- package/plugins/specweave/lib/hooks/update-ac-status.ts +46 -135
- package/plugins/specweave/lib/hooks/update-tasks-md.js +115 -3
- package/plugins/specweave/lib/hooks/update-tasks-md.ts +182 -10
- package/plugins/specweave/lib/utils/validate-dev-setup.sh +133 -0
- package/plugins/specweave/skills/increment-planner/SKILL.md +25 -15
- package/plugins/specweave/skills/serverless-recommender/SKILL.md +368 -0
- package/plugins/specweave/templates/iac/aws-lambda/templates/iam.tf.hbs +137 -0
- package/plugins/specweave/templates/iac/aws-lambda/templates/main.tf.hbs +216 -0
- package/plugins/specweave-github/lib/IssueStateManager.js +117 -0
- package/plugins/specweave-github/lib/IssueStateManager.ts +231 -0
- package/plugins/specweave-github/lib/user-story-issue-builder.js +7 -0
- package/plugins/specweave-github/lib/user-story-issue-builder.ts +11 -0
- package/plugins/specweave-ui/.mcp.json +0 -10
- package/plugins/specweave-ui/README.md +26 -26
- package/plugins/specweave-ui/skills/browser-automation/SKILL.md +31 -18
- package/src/templates/tasks.md.template +51 -33
- package/dist/plugins/specweave/lib/hooks/git-diff-analyzer.d.ts +0 -89
- package/dist/plugins/specweave/lib/hooks/git-diff-analyzer.d.ts.map +0 -1
- package/dist/plugins/specweave/lib/hooks/git-diff-analyzer.js +0 -226
- package/dist/plugins/specweave/lib/hooks/git-diff-analyzer.js.map +0 -1
- package/dist/plugins/specweave/lib/hooks/invoke-translator-skill.d.ts +0 -60
- package/dist/plugins/specweave/lib/hooks/invoke-translator-skill.d.ts.map +0 -1
- package/dist/plugins/specweave/lib/hooks/invoke-translator-skill.js +0 -201
- package/dist/plugins/specweave/lib/hooks/invoke-translator-skill.js.map +0 -1
- package/dist/plugins/specweave/lib/hooks/prepare-reflection-context.d.ts +0 -42
- package/dist/plugins/specweave/lib/hooks/prepare-reflection-context.d.ts.map +0 -1
- package/dist/plugins/specweave/lib/hooks/prepare-reflection-context.js +0 -123
- package/dist/plugins/specweave/lib/hooks/prepare-reflection-context.js.map +0 -1
- package/dist/plugins/specweave/lib/hooks/reflection-config-loader.d.ts +0 -45
- package/dist/plugins/specweave/lib/hooks/reflection-config-loader.d.ts.map +0 -1
- package/dist/plugins/specweave/lib/hooks/reflection-config-loader.js +0 -132
- package/dist/plugins/specweave/lib/hooks/reflection-config-loader.js.map +0 -1
- package/dist/plugins/specweave/lib/hooks/reflection-parser.d.ts +0 -33
- package/dist/plugins/specweave/lib/hooks/reflection-parser.d.ts.map +0 -1
- package/dist/plugins/specweave/lib/hooks/reflection-parser.js +0 -419
- package/dist/plugins/specweave/lib/hooks/reflection-parser.js.map +0 -1
- package/dist/plugins/specweave/lib/hooks/reflection-prompt-builder.d.ts +0 -56
- package/dist/plugins/specweave/lib/hooks/reflection-prompt-builder.d.ts.map +0 -1
- package/dist/plugins/specweave/lib/hooks/reflection-prompt-builder.js +0 -239
- package/dist/plugins/specweave/lib/hooks/reflection-prompt-builder.js.map +0 -1
- package/dist/plugins/specweave/lib/hooks/reflection-storage.d.ts +0 -64
- package/dist/plugins/specweave/lib/hooks/reflection-storage.d.ts.map +0 -1
- package/dist/plugins/specweave/lib/hooks/reflection-storage.js +0 -305
- package/dist/plugins/specweave/lib/hooks/reflection-storage.js.map +0 -1
- package/dist/plugins/specweave/lib/hooks/run-self-reflection.d.ts +0 -43
- package/dist/plugins/specweave/lib/hooks/run-self-reflection.d.ts.map +0 -1
- package/dist/plugins/specweave/lib/hooks/run-self-reflection.js +0 -203
- package/dist/plugins/specweave/lib/hooks/run-self-reflection.js.map +0 -1
- package/dist/plugins/specweave/lib/hooks/sync-living-docs.d.ts +0 -32
- package/dist/plugins/specweave/lib/hooks/sync-living-docs.d.ts.map +0 -1
- package/dist/plugins/specweave/lib/hooks/sync-living-docs.js +0 -405
- package/dist/plugins/specweave/lib/hooks/sync-living-docs.js.map +0 -1
- package/dist/plugins/specweave/lib/hooks/translate-file.d.ts +0 -59
- package/dist/plugins/specweave/lib/hooks/translate-file.d.ts.map +0 -1
- package/dist/plugins/specweave/lib/hooks/translate-file.js +0 -350
- package/dist/plugins/specweave/lib/hooks/translate-file.js.map +0 -1
- package/dist/plugins/specweave/lib/hooks/translate-living-docs.d.ts +0 -13
- package/dist/plugins/specweave/lib/hooks/translate-living-docs.d.ts.map +0 -1
- package/dist/plugins/specweave/lib/hooks/translate-living-docs.js +0 -175
- package/dist/plugins/specweave/lib/hooks/translate-living-docs.js.map +0 -1
- package/dist/plugins/specweave/lib/hooks/types/reflection-types.d.ts +0 -164
- package/dist/plugins/specweave/lib/hooks/types/reflection-types.d.ts.map +0 -1
- package/dist/plugins/specweave/lib/hooks/types/reflection-types.js +0 -73
- package/dist/plugins/specweave/lib/hooks/types/reflection-types.js.map +0 -1
- package/dist/plugins/specweave/lib/hooks/update-ac-status.d.ts +0 -21
- package/dist/plugins/specweave/lib/hooks/update-ac-status.d.ts.map +0 -1
- package/dist/plugins/specweave/lib/hooks/update-ac-status.js +0 -162
- package/dist/plugins/specweave/lib/hooks/update-ac-status.js.map +0 -1
- package/dist/plugins/specweave/lib/hooks/update-tasks-md.d.ts +0 -29
- package/dist/plugins/specweave/lib/hooks/update-tasks-md.d.ts.map +0 -1
- package/dist/plugins/specweave/lib/hooks/update-tasks-md.js +0 -203
- package/dist/plugins/specweave/lib/hooks/update-tasks-md.js.map +0 -1
- package/dist/src/core/living-docs/spec-distributor.d.ts +0 -180
- package/dist/src/core/living-docs/spec-distributor.d.ts.map +0 -1
- package/dist/src/core/living-docs/spec-distributor.js +0 -1840
- package/dist/src/core/living-docs/spec-distributor.js.map +0 -1
|
@@ -0,0 +1,487 @@
|
|
|
1
|
+
# {{projectName}} - Firebase Infrastructure
|
|
2
|
+
|
|
3
|
+
🚀 Generated by **SpecWeave Serverless Intelligence**
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
This Terraform configuration deploys a full-stack serverless application on Firebase with the following components:
|
|
8
|
+
|
|
9
|
+
- **Firebase Hosting**: Static site hosting with global CDN{{#if enableAuth}}
|
|
10
|
+
- **Firebase Authentication**: Email/password authentication{{/if}}{{#if databaseName}}
|
|
11
|
+
- **Firestore**: NoSQL database with security rules{{/if}}
|
|
12
|
+
- **Cloud Storage**: File storage with security rules
|
|
13
|
+
- **Cloud Functions for Firebase**: Serverless backend functions
|
|
14
|
+
|
|
15
|
+
## Architecture
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
{{#if enableAuth}}
|
|
19
|
+
Internet → Firebase Hosting → Cloud Functions → Firestore
|
|
20
|
+
↓
|
|
21
|
+
Firebase Auth
|
|
22
|
+
{{else}}
|
|
23
|
+
Internet → Firebase Hosting → Cloud Functions → Firestore
|
|
24
|
+
{{/if}}
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Prerequisites
|
|
28
|
+
|
|
29
|
+
1. **Google Cloud Account** with billing enabled
|
|
30
|
+
2. **Firebase CLI** installed: `npm install -g firebase-tools`
|
|
31
|
+
3. **gcloud CLI** installed and authenticated
|
|
32
|
+
4. **Terraform** >= 1.0 installed
|
|
33
|
+
5. **Firebase project** created (or will be created by Terraform)
|
|
34
|
+
|
|
35
|
+
## Quick Start
|
|
36
|
+
|
|
37
|
+
### 1. Create Firebase Project (if new)
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
# Login to Firebase
|
|
41
|
+
firebase login
|
|
42
|
+
|
|
43
|
+
# Create new Firebase project
|
|
44
|
+
firebase projects:create {{kebabCase projectName}}-{{environment}}
|
|
45
|
+
|
|
46
|
+
# Set project ID
|
|
47
|
+
export PROJECT_ID={{kebabCase projectName}}-{{environment}}
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### 2. Enable Required APIs
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
gcloud auth application-default login
|
|
54
|
+
gcloud config set project $PROJECT_ID
|
|
55
|
+
|
|
56
|
+
# Enable APIs
|
|
57
|
+
gcloud services enable firebase.googleapis.com
|
|
58
|
+
gcloud services enable firestore.googleapis.com
|
|
59
|
+
gcloud services enable cloudfunctions.googleapis.com
|
|
60
|
+
gcloud services enable firebasehosting.googleapis.com
|
|
61
|
+
{{#if enableAuth}}
|
|
62
|
+
gcloud services enable identitytoolkit.googleapis.com
|
|
63
|
+
{{/if}}
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
### 3. Initialize Terraform
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
terraform init
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### 4. Review Plan
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
terraform plan -var="project_id=$PROJECT_ID"
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### 5. Deploy Infrastructure
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
terraform apply -var="project_id=$PROJECT_ID"
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
### 6. Initialize Firebase in Your Project
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
# Initialize Firebase
|
|
88
|
+
firebase init
|
|
89
|
+
|
|
90
|
+
# Select:
|
|
91
|
+
# - Hosting
|
|
92
|
+
# - Functions
|
|
93
|
+
# - Firestore
|
|
94
|
+
{{#if enableAuth}}
|
|
95
|
+
# - Authentication
|
|
96
|
+
{{/if}}
|
|
97
|
+
|
|
98
|
+
# Use existing project: Select your Firebase project
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### 7. Deploy Firebase Resources
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
# Deploy hosting
|
|
105
|
+
firebase deploy --only hosting
|
|
106
|
+
|
|
107
|
+
# Deploy functions
|
|
108
|
+
firebase deploy --only functions
|
|
109
|
+
|
|
110
|
+
# Deploy Firestore rules (if customized)
|
|
111
|
+
firebase deploy --only firestore:rules
|
|
112
|
+
|
|
113
|
+
# Deploy Storage rules (if customized)
|
|
114
|
+
firebase deploy --only storage:rules
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### 8. Test Deployment
|
|
118
|
+
|
|
119
|
+
```bash
|
|
120
|
+
# Get hosting URL
|
|
121
|
+
HOSTING_URL=$(terraform output -raw hosting_url)
|
|
122
|
+
|
|
123
|
+
# Open in browser
|
|
124
|
+
echo "Visit: $HOSTING_URL"
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
## Configuration
|
|
128
|
+
|
|
129
|
+
### Variables
|
|
130
|
+
|
|
131
|
+
Edit `terraform.tfvars` to customize:
|
|
132
|
+
|
|
133
|
+
```hcl
|
|
134
|
+
project_id = "{{kebabCase projectName}}-{{environment}}"
|
|
135
|
+
project_name = "{{projectName}}"
|
|
136
|
+
environment = "{{environment}}"
|
|
137
|
+
region = "{{#if region}}{{region}}{{else}}us-central1{{/if}}"
|
|
138
|
+
function_name = "{{functionName}}"
|
|
139
|
+
{{#if databaseName}}
|
|
140
|
+
database_name = "{{databaseName}}"
|
|
141
|
+
firestore_location = "us-central"
|
|
142
|
+
{{/if}}
|
|
143
|
+
{{#if enableAuth}}
|
|
144
|
+
enable_auth = true
|
|
145
|
+
{{/if}}
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
### Firebase Configuration
|
|
149
|
+
|
|
150
|
+
After Terraform deployment, get your Firebase config:
|
|
151
|
+
|
|
152
|
+
```bash
|
|
153
|
+
# Get Web App config
|
|
154
|
+
terraform output web_app_api_key
|
|
155
|
+
terraform output web_app_auth_domain
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
Add to your web app:
|
|
159
|
+
|
|
160
|
+
```javascript
|
|
161
|
+
// firebaseConfig.js
|
|
162
|
+
import { initializeApp } from 'firebase/app';
|
|
163
|
+
{{#if enableAuth}}
|
|
164
|
+
import { getAuth } from 'firebase/auth';
|
|
165
|
+
{{/if}}
|
|
166
|
+
{{#if databaseName}}
|
|
167
|
+
import { getFirestore } from 'firebase/firestore';
|
|
168
|
+
{{/if}}
|
|
169
|
+
import { getStorage } from 'firebase/storage';
|
|
170
|
+
|
|
171
|
+
const firebaseConfig = {
|
|
172
|
+
apiKey: process.env.FIREBASE_API_KEY,
|
|
173
|
+
authDomain: "{{kebabCase projectName}}-{{environment}}.firebaseapp.com",
|
|
174
|
+
projectId: "{{kebabCase projectName}}-{{environment}}",
|
|
175
|
+
storageBucket: "{{kebabCase projectName}}-{{environment}}.appspot.com",
|
|
176
|
+
messagingSenderId: "YOUR_MESSAGING_SENDER_ID",
|
|
177
|
+
appId: "YOUR_APP_ID"
|
|
178
|
+
};
|
|
179
|
+
|
|
180
|
+
const app = initializeApp(firebaseConfig);
|
|
181
|
+
{{#if enableAuth}}
|
|
182
|
+
export const auth = getAuth(app);
|
|
183
|
+
{{/if}}
|
|
184
|
+
{{#if databaseName}}
|
|
185
|
+
export const db = getFirestore(app);
|
|
186
|
+
{{/if}}
|
|
187
|
+
export const storage = getStorage(app);
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
## Outputs
|
|
191
|
+
|
|
192
|
+
After deployment, Terraform provides these outputs:
|
|
193
|
+
|
|
194
|
+
- `firebase_project_id`: Firebase project ID
|
|
195
|
+
- `web_app_id`: Firebase Web App ID
|
|
196
|
+
- `hosting_url`: Firebase Hosting URL{{#if databaseName}}
|
|
197
|
+
- `firestore_database_name`: Firestore database name{{/if}}
|
|
198
|
+
- `storage_bucket`: Storage bucket name
|
|
199
|
+
|
|
200
|
+
## Resource Details
|
|
201
|
+
|
|
202
|
+
### Firebase Hosting
|
|
203
|
+
|
|
204
|
+
- **Global CDN**: Automatic SSL, HTTP/2, and fast content delivery
|
|
205
|
+
- **Custom Domain**: Add via Firebase Console
|
|
206
|
+
- **Deploy Command**: `firebase deploy --only hosting`
|
|
207
|
+
|
|
208
|
+
### Cloud Functions for Firebase
|
|
209
|
+
|
|
210
|
+
Deploy functions using Firebase SDK:
|
|
211
|
+
|
|
212
|
+
```javascript
|
|
213
|
+
// functions/index.js
|
|
214
|
+
const {onRequest} = require("firebase-functions/v2/https");
|
|
215
|
+
{{#if databaseName}}
|
|
216
|
+
const {getFirestore} = require("firebase-admin/firestore");
|
|
217
|
+
{{/if}}
|
|
218
|
+
const admin = require("firebase-admin");
|
|
219
|
+
|
|
220
|
+
admin.initializeApp();
|
|
221
|
+
{{#if databaseName}}
|
|
222
|
+
const db = getFirestore();
|
|
223
|
+
{{/if}}
|
|
224
|
+
|
|
225
|
+
exports.{{functionName}} = onRequest(async (req, res) => {
|
|
226
|
+
{{#if databaseName}}
|
|
227
|
+
const snapshot = await db.collection('items').get();
|
|
228
|
+
const items = snapshot.docs.map(doc => doc.data());
|
|
229
|
+
res.json({items});
|
|
230
|
+
{{else}}
|
|
231
|
+
res.json({message: "Hello from Firebase!"});
|
|
232
|
+
{{/if}}
|
|
233
|
+
});
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
{{#if databaseName}}
|
|
237
|
+
### Firestore
|
|
238
|
+
|
|
239
|
+
- **Database**: `{{databaseName}}-{{environment}}`
|
|
240
|
+
- **Security Rules**: Deployed via Terraform{{#if (eq environment "prod")}}
|
|
241
|
+
- **Access Control**: Strict production rules{{else}}
|
|
242
|
+
- **Access Control**: Permissive for development{{/if}}
|
|
243
|
+
- **Point-in-Time Recovery**: {{#if (eq environment "prod")}}Enabled{{else}}Disabled{{/if}}
|
|
244
|
+
|
|
245
|
+
**Security Rules** (in `firestore.rules`):
|
|
246
|
+
```
|
|
247
|
+
rules_version = '2';
|
|
248
|
+
service cloud.firestore {
|
|
249
|
+
match /databases/{database}/documents {
|
|
250
|
+
match /users/{userId} {
|
|
251
|
+
allow read, write: if request.auth != null && request.auth.uid == userId;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
```
|
|
256
|
+
{{/if}}
|
|
257
|
+
|
|
258
|
+
{{#if enableAuth}}
|
|
259
|
+
### Firebase Authentication
|
|
260
|
+
|
|
261
|
+
- **Email/Password**: Enabled
|
|
262
|
+
- **Additional Providers**: Configure in Firebase Console
|
|
263
|
+
- **Custom Claims**: Add via Cloud Functions
|
|
264
|
+
|
|
265
|
+
**Example usage**:
|
|
266
|
+
```javascript
|
|
267
|
+
import { getAuth, signInWithEmailAndPassword } from 'firebase/auth';
|
|
268
|
+
|
|
269
|
+
const auth = getAuth();
|
|
270
|
+
signInWithEmailAndPassword(auth, email, password)
|
|
271
|
+
.then((userCredential) => {
|
|
272
|
+
const user = userCredential.user;
|
|
273
|
+
console.log('Signed in:', user.uid);
|
|
274
|
+
});
|
|
275
|
+
```
|
|
276
|
+
{{/if}}
|
|
277
|
+
|
|
278
|
+
### Cloud Storage for Firebase
|
|
279
|
+
|
|
280
|
+
- **Bucket**: `{{projectId}}.appspot.com`
|
|
281
|
+
- **Security Rules**: User-specific folders{{#if (eq environment "prod")}}
|
|
282
|
+
- **File Size Limit**: 10MB{{else}}
|
|
283
|
+
- **File Size Limit**: Unlimited (dev){{/if}}
|
|
284
|
+
|
|
285
|
+
## Security Best Practices
|
|
286
|
+
|
|
287
|
+
✅ **Implemented**:
|
|
288
|
+
- Firestore security rules (authenticated access)
|
|
289
|
+
- Storage security rules (user-specific folders)
|
|
290
|
+
- Service account with least privilege{{#if (eq environment "prod")}}
|
|
291
|
+
- Point-in-time recovery for Firestore
|
|
292
|
+
- Strict validation in production rules{{/if}}
|
|
293
|
+
|
|
294
|
+
⚠️ **TODO**:
|
|
295
|
+
- Customize Firestore rules for your data model
|
|
296
|
+
- Add reCAPTCHA to authentication
|
|
297
|
+
- Enable App Check for abuse prevention
|
|
298
|
+
- Add multi-factor authentication
|
|
299
|
+
- Implement custom authentication flows
|
|
300
|
+
|
|
301
|
+
## Cost Estimation
|
|
302
|
+
|
|
303
|
+
### Free Tier (Spark Plan - Always Free)
|
|
304
|
+
|
|
305
|
+
Firebase offers a generous free tier:
|
|
306
|
+
- **Hosting**: 10 GB storage, 360 MB/day transfer
|
|
307
|
+
- **Firestore**: 50K reads/day, 20K writes/day, 1GB storage
|
|
308
|
+
- **Storage**: 5 GB stored, 1 GB/day download
|
|
309
|
+
- **Functions**: 125K/month invocations, 40K GB-seconds
|
|
310
|
+
- **Authentication**: Unlimited (free forever)
|
|
311
|
+
|
|
312
|
+
### Estimated Monthly Cost (Blaze Plan - Pay as you go)
|
|
313
|
+
|
|
314
|
+
**Development (Within Free Tier)**:
|
|
315
|
+
- Hosting: $0.00
|
|
316
|
+
- Firestore: $0.00
|
|
317
|
+
- Storage: $0.00
|
|
318
|
+
- Functions: $0.00
|
|
319
|
+
- **Total**: $0.00/month
|
|
320
|
+
|
|
321
|
+
**Staging (Light usage)**:
|
|
322
|
+
- Hosting: ~$1.00
|
|
323
|
+
- Firestore: ~$2.00
|
|
324
|
+
- Storage: ~$0.50
|
|
325
|
+
- Functions: ~$1.00
|
|
326
|
+
- **Total**: ~$4.50/month
|
|
327
|
+
|
|
328
|
+
**Production (Moderate traffic)**:
|
|
329
|
+
- Hosting (1M requests): ~$5.00
|
|
330
|
+
- Firestore (1M operations): ~$10.00
|
|
331
|
+
- Storage (10GB + transfers): ~$2.00
|
|
332
|
+
- Functions (500K invocations): ~$8.00
|
|
333
|
+
- **Total**: ~$25.00/month
|
|
334
|
+
|
|
335
|
+
💡 **Tip**: Firebase free tier is very generous. Most small apps stay free.
|
|
336
|
+
|
|
337
|
+
## Monitoring
|
|
338
|
+
|
|
339
|
+
### Firebase Console
|
|
340
|
+
|
|
341
|
+
Monitor your app in [Firebase Console](https://console.firebase.google.com):
|
|
342
|
+
|
|
343
|
+
- **Performance Monitoring**: Page load times, network requests
|
|
344
|
+
- **Crashlytics**: Crash reports and analytics
|
|
345
|
+
- **Analytics**: User engagement and behavior
|
|
346
|
+
- **Usage Dashboard**: Firestore, Storage, Functions usage
|
|
347
|
+
|
|
348
|
+
### Cloud Logging
|
|
349
|
+
|
|
350
|
+
```bash
|
|
351
|
+
# View function logs
|
|
352
|
+
firebase functions:log
|
|
353
|
+
|
|
354
|
+
# Or in Cloud Console
|
|
355
|
+
gcloud logging read "resource.type=cloud_function" --limit 50
|
|
356
|
+
```
|
|
357
|
+
|
|
358
|
+
### Recommended Alerts
|
|
359
|
+
|
|
360
|
+
Set up budget alerts in GCP Console:
|
|
361
|
+
```bash
|
|
362
|
+
# Create budget alert
|
|
363
|
+
gcloud billing budgets create \
|
|
364
|
+
--billing-account=BILLING_ACCOUNT_ID \
|
|
365
|
+
--display-name="{{projectName}} Budget Alert" \
|
|
366
|
+
--budget-amount=50USD \
|
|
367
|
+
--threshold-rule=percent=80 \
|
|
368
|
+
--threshold-rule=percent=100
|
|
369
|
+
```
|
|
370
|
+
|
|
371
|
+
## Deployment Workflow
|
|
372
|
+
|
|
373
|
+
### Development
|
|
374
|
+
|
|
375
|
+
```bash
|
|
376
|
+
terraform workspace new dev
|
|
377
|
+
terraform workspace select dev
|
|
378
|
+
terraform apply -var="environment=dev"
|
|
379
|
+
firebase use dev
|
|
380
|
+
firebase deploy
|
|
381
|
+
```
|
|
382
|
+
|
|
383
|
+
### Staging
|
|
384
|
+
|
|
385
|
+
```bash
|
|
386
|
+
terraform workspace new staging
|
|
387
|
+
terraform workspace select staging
|
|
388
|
+
terraform apply -var="environment=staging"
|
|
389
|
+
firebase use staging
|
|
390
|
+
firebase deploy
|
|
391
|
+
```
|
|
392
|
+
|
|
393
|
+
### Production
|
|
394
|
+
|
|
395
|
+
```bash
|
|
396
|
+
terraform workspace new prod
|
|
397
|
+
terraform workspace select prod
|
|
398
|
+
terraform apply -var="environment=prod"
|
|
399
|
+
firebase use production
|
|
400
|
+
firebase deploy
|
|
401
|
+
```
|
|
402
|
+
|
|
403
|
+
## CI/CD Integration
|
|
404
|
+
|
|
405
|
+
### GitHub Actions Example
|
|
406
|
+
|
|
407
|
+
```yaml
|
|
408
|
+
name: Deploy to Firebase
|
|
409
|
+
|
|
410
|
+
on:
|
|
411
|
+
push:
|
|
412
|
+
branches: [main]
|
|
413
|
+
|
|
414
|
+
jobs:
|
|
415
|
+
deploy:
|
|
416
|
+
runs-on: ubuntu-latest
|
|
417
|
+
steps:
|
|
418
|
+
- uses: actions/checkout@v3
|
|
419
|
+
|
|
420
|
+
- name: Setup Node.js
|
|
421
|
+
uses: actions/setup-node@v3
|
|
422
|
+
with:
|
|
423
|
+
node-version: '18'
|
|
424
|
+
|
|
425
|
+
- name: Install dependencies
|
|
426
|
+
run: npm ci
|
|
427
|
+
|
|
428
|
+
- name: Build
|
|
429
|
+
run: npm run build
|
|
430
|
+
|
|
431
|
+
- name: Deploy to Firebase
|
|
432
|
+
uses: FirebaseExtended/action-hosting-deploy@v0
|
|
433
|
+
with:
|
|
434
|
+
repoToken: '${{ secrets.GITHUB_TOKEN }}'
|
|
435
|
+
firebaseServiceAccount: '${{ secrets.FIREBASE_SERVICE_ACCOUNT }}'
|
|
436
|
+
channelId: live
|
|
437
|
+
projectId: {{kebabCase projectName}}-{{environment}}
|
|
438
|
+
```
|
|
439
|
+
|
|
440
|
+
## Cleanup
|
|
441
|
+
|
|
442
|
+
To destroy all resources:
|
|
443
|
+
|
|
444
|
+
```bash
|
|
445
|
+
terraform destroy
|
|
446
|
+
```
|
|
447
|
+
|
|
448
|
+
⚠️ **Warning**: This will permanently delete:
|
|
449
|
+
- Firebase Hosting sites
|
|
450
|
+
- Firestore data
|
|
451
|
+
- Cloud Storage files
|
|
452
|
+
- Authentication users
|
|
453
|
+
|
|
454
|
+
## Troubleshooting
|
|
455
|
+
|
|
456
|
+
**"Project is not a Firebase project"?**
|
|
457
|
+
1. Enable Firebase: `firebase projects:addfirebase $PROJECT_ID`
|
|
458
|
+
2. Re-run Terraform apply
|
|
459
|
+
|
|
460
|
+
**Firestore rules not applying?**
|
|
461
|
+
1. Check syntax: `firebase deploy --only firestore:rules`
|
|
462
|
+
2. Review in Firebase Console
|
|
463
|
+
|
|
464
|
+
**Functions deployment failing?**
|
|
465
|
+
1. Check Node.js version compatibility
|
|
466
|
+
2. Review function logs: `firebase functions:log`
|
|
467
|
+
3. Verify IAM permissions
|
|
468
|
+
|
|
469
|
+
## Next Steps
|
|
470
|
+
|
|
471
|
+
1. **Customize Security Rules**: Tailor Firestore and Storage rules to your data model
|
|
472
|
+
2. **Add Performance Monitoring**: Install Firebase Performance SDK
|
|
473
|
+
3. **Enable Analytics**: Add Google Analytics for Firebase
|
|
474
|
+
4. **Add Custom Domain**: Configure custom domain in Hosting settings
|
|
475
|
+
5. **Implement CI/CD**: Automate deployments with GitHub Actions
|
|
476
|
+
|
|
477
|
+
## Resources
|
|
478
|
+
|
|
479
|
+
- [Firebase Documentation](https://firebase.google.com/docs)
|
|
480
|
+
- [Firestore Documentation](https://firebase.google.com/docs/firestore)
|
|
481
|
+
- [Firebase Hosting Documentation](https://firebase.google.com/docs/hosting)
|
|
482
|
+
- [Cloud Functions for Firebase](https://firebase.google.com/docs/functions)
|
|
483
|
+
- [Firebase Authentication](https://firebase.google.com/docs/auth)
|
|
484
|
+
|
|
485
|
+
---
|
|
486
|
+
|
|
487
|
+
**Generated by SpecWeave** | [Learn More](https://spec-weave.com)
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
{
|
|
2
|
+
"platform": "firebase",
|
|
3
|
+
"region": "us-central1",
|
|
4
|
+
"firestoreLocation": "us-central",
|
|
5
|
+
"enableAuth": true,
|
|
6
|
+
"enableHosting": true,
|
|
7
|
+
"enableFunctions": true,
|
|
8
|
+
"enableStorage": true,
|
|
9
|
+
"firestore": {
|
|
10
|
+
"type": "FIRESTORE_NATIVE",
|
|
11
|
+
"concurrencyMode": {
|
|
12
|
+
"dev": "PESSIMISTIC",
|
|
13
|
+
"staging": "OPTIMISTIC",
|
|
14
|
+
"prod": "OPTIMISTIC"
|
|
15
|
+
},
|
|
16
|
+
"pointInTimeRecovery": {
|
|
17
|
+
"dev": false,
|
|
18
|
+
"staging": false,
|
|
19
|
+
"prod": true
|
|
20
|
+
},
|
|
21
|
+
"deleteProtection": {
|
|
22
|
+
"dev": false,
|
|
23
|
+
"staging": false,
|
|
24
|
+
"prod": false
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
"storage": {
|
|
28
|
+
"versioning": {
|
|
29
|
+
"dev": false,
|
|
30
|
+
"staging": false,
|
|
31
|
+
"prod": true
|
|
32
|
+
},
|
|
33
|
+
"forceDestroy": {
|
|
34
|
+
"dev": true,
|
|
35
|
+
"staging": true,
|
|
36
|
+
"prod": false
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
"auth": {
|
|
40
|
+
"providers": ["email"],
|
|
41
|
+
"allowDuplicateEmails": false
|
|
42
|
+
},
|
|
43
|
+
"hosting": {
|
|
44
|
+
"rewrites": [
|
|
45
|
+
{
|
|
46
|
+
"source": "**",
|
|
47
|
+
"destination": "/index.html"
|
|
48
|
+
}
|
|
49
|
+
]
|
|
50
|
+
},
|
|
51
|
+
"functions": {
|
|
52
|
+
"runtime": "nodejs18",
|
|
53
|
+
"region": "us-central1"
|
|
54
|
+
}
|
|
55
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
"environment": "dev",
|
|
3
|
+
"region": "us-central1",
|
|
4
|
+
"firestoreLocation": "us-central",
|
|
5
|
+
"enableAuth": true,
|
|
6
|
+
"firestore": {
|
|
7
|
+
"concurrencyMode": "PESSIMISTIC",
|
|
8
|
+
"pointInTimeRecovery": false,
|
|
9
|
+
"deleteProtection": false,
|
|
10
|
+
"securityRules": "permissive"
|
|
11
|
+
},
|
|
12
|
+
"storage": {
|
|
13
|
+
"versioning": false,
|
|
14
|
+
"forceDestroy": true,
|
|
15
|
+
"fileSizeLimit": null,
|
|
16
|
+
"securityRules": "permissive"
|
|
17
|
+
},
|
|
18
|
+
"auth": {
|
|
19
|
+
"providers": ["email"],
|
|
20
|
+
"allowDuplicateEmails": false,
|
|
21
|
+
"advancedSecurity": false
|
|
22
|
+
},
|
|
23
|
+
"hosting": {
|
|
24
|
+
"caching": "disabled",
|
|
25
|
+
"customDomain": false
|
|
26
|
+
},
|
|
27
|
+
"functions": {
|
|
28
|
+
"runtime": "nodejs18",
|
|
29
|
+
"minInstances": 0,
|
|
30
|
+
"maxInstances": 10
|
|
31
|
+
},
|
|
32
|
+
"costOptimization": {
|
|
33
|
+
"description": "Free tier optimized - Stays within Spark plan limits",
|
|
34
|
+
"estimatedMonthlyCost": "$0",
|
|
35
|
+
"freeTierEligible": true,
|
|
36
|
+
"plan": "Spark (Free)",
|
|
37
|
+
"notes": [
|
|
38
|
+
"10 GB hosting storage",
|
|
39
|
+
"50K Firestore reads/day",
|
|
40
|
+
"125K function invocations/month",
|
|
41
|
+
"Unlimited authentication"
|
|
42
|
+
]
|
|
43
|
+
}
|
|
44
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
{
|
|
2
|
+
"environment": "prod",
|
|
3
|
+
"region": "us-central1",
|
|
4
|
+
"firestoreLocation": "us-central",
|
|
5
|
+
"enableAuth": true,
|
|
6
|
+
"firestore": {
|
|
7
|
+
"concurrencyMode": "OPTIMISTIC",
|
|
8
|
+
"pointInTimeRecovery": true,
|
|
9
|
+
"deleteProtection": false,
|
|
10
|
+
"securityRules": "strict"
|
|
11
|
+
},
|
|
12
|
+
"storage": {
|
|
13
|
+
"versioning": true,
|
|
14
|
+
"forceDestroy": false,
|
|
15
|
+
"fileSizeLimit": "10MB",
|
|
16
|
+
"securityRules": "strict"
|
|
17
|
+
},
|
|
18
|
+
"auth": {
|
|
19
|
+
"providers": ["email", "google"],
|
|
20
|
+
"allowDuplicateEmails": false,
|
|
21
|
+
"advancedSecurity": true,
|
|
22
|
+
"mfa": true
|
|
23
|
+
},
|
|
24
|
+
"hosting": {
|
|
25
|
+
"caching": "aggressive",
|
|
26
|
+
"customDomain": true,
|
|
27
|
+
"cdn": "enabled"
|
|
28
|
+
},
|
|
29
|
+
"functions": {
|
|
30
|
+
"runtime": "nodejs18",
|
|
31
|
+
"minInstances": 1,
|
|
32
|
+
"maxInstances": 100
|
|
33
|
+
},
|
|
34
|
+
"security": {
|
|
35
|
+
"appCheckEnabled": true,
|
|
36
|
+
"recaptchaEnabled": true,
|
|
37
|
+
"strictSecurityRules": true
|
|
38
|
+
},
|
|
39
|
+
"costOptimization": {
|
|
40
|
+
"description": "Production-ready - Optimized for performance and reliability",
|
|
41
|
+
"estimatedMonthlyCost": "$25-75",
|
|
42
|
+
"freeTierEligible": false,
|
|
43
|
+
"plan": "Blaze (Pay as you go)",
|
|
44
|
+
"notes": [
|
|
45
|
+
"Point-in-time recovery enabled",
|
|
46
|
+
"1 min instance (always warm)",
|
|
47
|
+
"Strict security rules",
|
|
48
|
+
"App Check for abuse prevention",
|
|
49
|
+
"Custom domain with CDN"
|
|
50
|
+
]
|
|
51
|
+
}
|
|
52
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{
|
|
2
|
+
"environment": "staging",
|
|
3
|
+
"region": "us-central1",
|
|
4
|
+
"firestoreLocation": "us-central",
|
|
5
|
+
"enableAuth": true,
|
|
6
|
+
"firestore": {
|
|
7
|
+
"concurrencyMode": "OPTIMISTIC",
|
|
8
|
+
"pointInTimeRecovery": false,
|
|
9
|
+
"deleteProtection": false,
|
|
10
|
+
"securityRules": "moderate"
|
|
11
|
+
},
|
|
12
|
+
"storage": {
|
|
13
|
+
"versioning": false,
|
|
14
|
+
"forceDestroy": true,
|
|
15
|
+
"fileSizeLimit": "20MB",
|
|
16
|
+
"securityRules": "moderate"
|
|
17
|
+
},
|
|
18
|
+
"auth": {
|
|
19
|
+
"providers": ["email", "google"],
|
|
20
|
+
"allowDuplicateEmails": false,
|
|
21
|
+
"advancedSecurity": false
|
|
22
|
+
},
|
|
23
|
+
"hosting": {
|
|
24
|
+
"caching": "enabled",
|
|
25
|
+
"customDomain": false
|
|
26
|
+
},
|
|
27
|
+
"functions": {
|
|
28
|
+
"runtime": "nodejs18",
|
|
29
|
+
"minInstances": 0,
|
|
30
|
+
"maxInstances": 25
|
|
31
|
+
},
|
|
32
|
+
"costOptimization": {
|
|
33
|
+
"description": "Light usage - Blaze plan with low traffic",
|
|
34
|
+
"estimatedMonthlyCost": "$4-8",
|
|
35
|
+
"freeTierEligible": false,
|
|
36
|
+
"plan": "Blaze (Pay as you go)",
|
|
37
|
+
"notes": [
|
|
38
|
+
"Optimistic concurrency for performance",
|
|
39
|
+
"No min instances for cost savings",
|
|
40
|
+
"Moderate security rules"
|
|
41
|
+
]
|
|
42
|
+
}
|
|
43
|
+
}
|