specweave 0.21.1 → 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/locales/de/.gitkeep +0 -0
- package/dist/locales/de/cli.json +0 -108
- package/dist/locales/en/cli.json +0 -287
- package/dist/locales/en/errors.json +0 -7
- package/dist/locales/en/templates.json +0 -6
- package/dist/locales/es/.gitkeep +0 -0
- package/dist/locales/es/cli.json +0 -41
- package/dist/locales/fr/.gitkeep +0 -0
- package/dist/locales/fr/cli.json +0 -108
- package/dist/locales/ja/.gitkeep +0 -0
- package/dist/locales/ja/cli.json +0 -108
- package/dist/locales/ko/.gitkeep +0 -0
- package/dist/locales/ko/cli.json +0 -108
- package/dist/locales/pt/.gitkeep +0 -0
- package/dist/locales/pt/cli.json +0 -108
- package/dist/locales/ru/.gitkeep +0 -0
- package/dist/locales/ru/cli.json +0 -269
- package/dist/locales/zh/.gitkeep +0 -0
- package/dist/locales/zh/cli.json +0 -108
- 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/plugins/specweave-ado/lib/enhanced-ado-sync.d.ts +0 -25
- package/dist/plugins/specweave-ado/lib/enhanced-ado-sync.d.ts.map +0 -1
- package/dist/plugins/specweave-ado/lib/enhanced-ado-sync.js +0 -191
- package/dist/plugins/specweave-ado/lib/enhanced-ado-sync.js.map +0 -1
- package/dist/plugins/specweave-kafka/lib/cli/kcat-wrapper.d.ts +0 -57
- package/dist/plugins/specweave-kafka/lib/cli/kcat-wrapper.d.ts.map +0 -1
- package/dist/plugins/specweave-kafka/lib/cli/kcat-wrapper.js +0 -248
- package/dist/plugins/specweave-kafka/lib/cli/kcat-wrapper.js.map +0 -1
- package/dist/plugins/specweave-kafka/lib/cli/types.d.ts +0 -82
- package/dist/plugins/specweave-kafka/lib/cli/types.d.ts.map +0 -1
- package/dist/plugins/specweave-kafka/lib/cli/types.js +0 -13
- package/dist/plugins/specweave-kafka/lib/cli/types.js.map +0 -1
- package/dist/plugins/specweave-kafka/lib/mcp/detector.d.ts +0 -49
- package/dist/plugins/specweave-kafka/lib/mcp/detector.d.ts.map +0 -1
- package/dist/plugins/specweave-kafka/lib/mcp/detector.js +0 -316
- package/dist/plugins/specweave-kafka/lib/mcp/detector.js.map +0 -1
- package/dist/plugins/specweave-kafka/lib/mcp/types.d.ts +0 -70
- package/dist/plugins/specweave-kafka/lib/mcp/types.d.ts.map +0 -1
- package/dist/plugins/specweave-kafka/lib/mcp/types.js +0 -23
- package/dist/plugins/specweave-kafka/lib/mcp/types.js.map +0 -1
- package/dist/plugins/specweave-kafka/lib/utils/partitioning.d.ts +0 -85
- package/dist/plugins/specweave-kafka/lib/utils/partitioning.d.ts.map +0 -1
- package/dist/plugins/specweave-kafka/lib/utils/partitioning.js +0 -281
- package/dist/plugins/specweave-kafka/lib/utils/partitioning.js.map +0 -1
- package/dist/plugins/specweave-kafka/lib/utils/sizing.d.ts +0 -75
- package/dist/plugins/specweave-kafka/lib/utils/sizing.d.ts.map +0 -1
- package/dist/plugins/specweave-kafka/lib/utils/sizing.js +0 -238
- package/dist/plugins/specweave-kafka/lib/utils/sizing.js.map +0 -1
- package/dist/spec-parser.js +0 -629
- 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
- package/dist/src/core/sync/spec-content-sync.d.ts +0 -88
- package/dist/src/core/sync/spec-content-sync.d.ts.map +0 -1
- package/dist/src/core/sync/spec-content-sync.js +0 -5
- package/dist/src/core/sync/spec-content-sync.js.map +0 -1
- package/dist/tsconfig.tsbuildinfo +0 -1
- package/plugins/specweave-ado/lib/enhanced-ado-sync.js +0 -170
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Types for Vision & Market Research Engine
|
|
3
|
+
*
|
|
4
|
+
* This module defines the core types for analyzing product vision,
|
|
5
|
+
* detecting market categories, identifying competitors, and calculating
|
|
6
|
+
* opportunity scores.
|
|
7
|
+
*/
|
|
8
|
+
import { z } from 'zod';
|
|
9
|
+
/**
|
|
10
|
+
* Zod schema for VisionInsights validation
|
|
11
|
+
*/
|
|
12
|
+
export const VisionInsightsSchema = z.object({
|
|
13
|
+
keywords: z.array(z.string()).min(3).max(15),
|
|
14
|
+
market: z.enum([
|
|
15
|
+
'productivity-saas',
|
|
16
|
+
'healthcare',
|
|
17
|
+
'fintech',
|
|
18
|
+
'e-commerce',
|
|
19
|
+
'education',
|
|
20
|
+
'gaming',
|
|
21
|
+
'social-network',
|
|
22
|
+
'enterprise-b2b',
|
|
23
|
+
'consumer-b2c',
|
|
24
|
+
'marketplace',
|
|
25
|
+
'iot',
|
|
26
|
+
'blockchain',
|
|
27
|
+
'ai-ml',
|
|
28
|
+
'unknown'
|
|
29
|
+
]),
|
|
30
|
+
competitors: z.array(z.object({
|
|
31
|
+
name: z.string(),
|
|
32
|
+
url: z.string().url().optional(),
|
|
33
|
+
strengths: z.array(z.string()),
|
|
34
|
+
weaknesses: z.array(z.string())
|
|
35
|
+
})).min(0).max(10),
|
|
36
|
+
opportunityScore: z.number().min(1).max(10),
|
|
37
|
+
viralPotential: z.boolean(),
|
|
38
|
+
followUpQuestions: z.array(z.object({
|
|
39
|
+
question: z.string(),
|
|
40
|
+
type: z.enum(['open', 'multiple-choice', 'scale']),
|
|
41
|
+
options: z.array(z.string()).optional(),
|
|
42
|
+
rationale: z.string()
|
|
43
|
+
})),
|
|
44
|
+
confidence: z.number().min(0).max(1).optional(),
|
|
45
|
+
rawVision: z.string()
|
|
46
|
+
});
|
|
47
|
+
/**
|
|
48
|
+
* Zod schema for Competitor validation
|
|
49
|
+
*/
|
|
50
|
+
export const CompetitorSchema = z.object({
|
|
51
|
+
name: z.string(),
|
|
52
|
+
url: z.string().url().optional(),
|
|
53
|
+
strengths: z.array(z.string()),
|
|
54
|
+
weaknesses: z.array(z.string())
|
|
55
|
+
});
|
|
56
|
+
/**
|
|
57
|
+
* Zod schema for Question validation
|
|
58
|
+
*/
|
|
59
|
+
export const QuestionSchema = z.object({
|
|
60
|
+
question: z.string(),
|
|
61
|
+
type: z.enum(['open', 'multiple-choice', 'scale']),
|
|
62
|
+
options: z.array(z.string()).optional(),
|
|
63
|
+
rationale: z.string()
|
|
64
|
+
});
|
|
65
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/init/research/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAwFxB;;GAEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;IAC5C,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC;QACb,mBAAmB;QACnB,YAAY;QACZ,SAAS;QACT,YAAY;QACZ,WAAW;QACX,QAAQ;QACR,gBAAgB;QAChB,gBAAgB;QAChB,cAAc;QACd,aAAa;QACb,KAAK;QACL,YAAY;QACZ,OAAO;QACP,SAAS;KACV,CAAC;IACF,WAAW,EAAE,CAAC,CAAC,KAAK,CAClB,CAAC,CAAC,MAAM,CAAC;QACP,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;QAChB,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;QAChC,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QAC9B,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;KAChC,CAAC,CACH,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;IAChB,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;IAC3C,cAAc,EAAE,CAAC,CAAC,OAAO,EAAE;IAC3B,iBAAiB,EAAE,CAAC,CAAC,KAAK,CACxB,CAAC,CAAC,MAAM,CAAC;QACP,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;QACpB,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,iBAAiB,EAAE,OAAO,CAAC,CAAC;QAClD,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;QACvC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;KACtB,CAAC,CACH;IACD,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IAC/C,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;CACtB,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;IAChC,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAC9B,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;CAChC,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC;IACrC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;IACpB,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,iBAAiB,EAAE,OAAO,CAAC,CAAC;IAClD,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IACvC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;CACtB,CAAC,CAAC"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Serverless Cost Savings Calculator
|
|
3
|
+
*
|
|
4
|
+
* Calculates potential monthly cost savings by using serverless
|
|
5
|
+
* alternatives instead of traditional infrastructure.
|
|
6
|
+
*
|
|
7
|
+
* **Savings Categories**:
|
|
8
|
+
* - Auth → AWS Cognito/Auth0: $185/month
|
|
9
|
+
* - File uploads → S3 + Lambda: $480/month
|
|
10
|
+
* - Image processing → Lambda/Cloudinary: $490/month
|
|
11
|
+
* - Email → SendGrid/SES: $85/month
|
|
12
|
+
* - Background jobs → Lambda: $280/month
|
|
13
|
+
* - **Total Potential: $1,520/month**
|
|
14
|
+
*/
|
|
15
|
+
/**
|
|
16
|
+
* Serverless alternative for a specific use case
|
|
17
|
+
*/
|
|
18
|
+
export interface ServerlessOption {
|
|
19
|
+
/** Use case name (e.g., "Authentication", "File Uploads") */
|
|
20
|
+
useCase: string;
|
|
21
|
+
/** Traditional infrastructure cost per month */
|
|
22
|
+
traditionalCost: number;
|
|
23
|
+
/** Serverless solution cost per month */
|
|
24
|
+
serverlessCost: number;
|
|
25
|
+
/** Monthly savings (traditionalCost - serverlessCost) */
|
|
26
|
+
savings: number;
|
|
27
|
+
/** Recommended serverless service */
|
|
28
|
+
service: string;
|
|
29
|
+
/** Alternative serverless services */
|
|
30
|
+
alternatives?: string[];
|
|
31
|
+
/** Trade-offs to consider */
|
|
32
|
+
tradeoffs: string[];
|
|
33
|
+
/** When to use serverless for this use case */
|
|
34
|
+
recommendedWhen: string[];
|
|
35
|
+
/** When NOT to use serverless for this use case */
|
|
36
|
+
notRecommendedWhen: string[];
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Complete serverless savings analysis
|
|
40
|
+
*/
|
|
41
|
+
export interface ServerlessSavingsAnalysis {
|
|
42
|
+
/** Total potential monthly savings */
|
|
43
|
+
totalSavings: number;
|
|
44
|
+
/** Breakdown by use case */
|
|
45
|
+
breakdown: ServerlessOption[];
|
|
46
|
+
/** Overall recommendation (serverless vs traditional) */
|
|
47
|
+
recommendation: 'serverless' | 'traditional' | 'hybrid';
|
|
48
|
+
/** Rationale for recommendation */
|
|
49
|
+
rationale: string;
|
|
50
|
+
/** Confidence level (0-1) */
|
|
51
|
+
confidence: number;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Serverless Savings Calculator
|
|
55
|
+
*
|
|
56
|
+
* Analyzes which services can benefit from serverless and calculates savings.
|
|
57
|
+
*/
|
|
58
|
+
export declare class ServerlessSavingsCalculator {
|
|
59
|
+
/**
|
|
60
|
+
* Calculate potential serverless savings for a project
|
|
61
|
+
*
|
|
62
|
+
* @param useCases - Array of use cases detected in project (e.g., ["auth", "file-uploads"])
|
|
63
|
+
* @returns Complete savings analysis with recommendations
|
|
64
|
+
*
|
|
65
|
+
* @example
|
|
66
|
+
* ```typescript
|
|
67
|
+
* const calculator = new ServerlessSavingsCalculator();
|
|
68
|
+
* const analysis = calculator.calculateSavings(['auth', 'file-uploads', 'email']);
|
|
69
|
+
* console.log(analysis.totalSavings); // 750
|
|
70
|
+
* console.log(analysis.recommendation); // 'serverless'
|
|
71
|
+
* ```
|
|
72
|
+
*/
|
|
73
|
+
calculateSavings(useCases: string[]): ServerlessSavingsAnalysis;
|
|
74
|
+
/**
|
|
75
|
+
* Get all available serverless options
|
|
76
|
+
*
|
|
77
|
+
* @returns Complete database of serverless savings options
|
|
78
|
+
*/
|
|
79
|
+
getAllOptions(): ServerlessOption[];
|
|
80
|
+
/**
|
|
81
|
+
* Get serverless option by use case
|
|
82
|
+
*
|
|
83
|
+
* @param useCase - Use case name
|
|
84
|
+
* @returns Serverless option or undefined if not found
|
|
85
|
+
*/
|
|
86
|
+
getOption(useCase: string): ServerlessOption | undefined;
|
|
87
|
+
/**
|
|
88
|
+
* Calculate savings for specific use case
|
|
89
|
+
*
|
|
90
|
+
* @param useCase - Use case name
|
|
91
|
+
* @returns Savings amount or 0 if not found
|
|
92
|
+
*/
|
|
93
|
+
getSavings(useCase: string): number;
|
|
94
|
+
/**
|
|
95
|
+
* Normalize use case name for matching
|
|
96
|
+
*
|
|
97
|
+
* @param useCase - Raw use case string
|
|
98
|
+
* @returns Normalized use case
|
|
99
|
+
*
|
|
100
|
+
* @example
|
|
101
|
+
* normalizeUseCase("file upload") → "file-uploads"
|
|
102
|
+
* normalizeUseCase("AUTH") → "authentication"
|
|
103
|
+
*/
|
|
104
|
+
private normalizeUseCase;
|
|
105
|
+
/**
|
|
106
|
+
* Check if normalized use case matches database use case
|
|
107
|
+
*
|
|
108
|
+
* @param normalized - Normalized use case from user input
|
|
109
|
+
* @param dbUseCase - Use case from database
|
|
110
|
+
* @returns True if match
|
|
111
|
+
*/
|
|
112
|
+
private matchesUseCase;
|
|
113
|
+
/**
|
|
114
|
+
* Determine serverless recommendation based on savings
|
|
115
|
+
*
|
|
116
|
+
* @param options - Applicable serverless options
|
|
117
|
+
* @param totalSavings - Total monthly savings
|
|
118
|
+
* @returns Recommendation with rationale
|
|
119
|
+
*/
|
|
120
|
+
private determineRecommendation;
|
|
121
|
+
/**
|
|
122
|
+
* Format savings analysis as markdown report
|
|
123
|
+
*
|
|
124
|
+
* @param analysis - Savings analysis result
|
|
125
|
+
* @returns Markdown-formatted report
|
|
126
|
+
*/
|
|
127
|
+
formatReport(analysis: ServerlessSavingsAnalysis): string;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Quick helper to calculate total potential serverless savings
|
|
131
|
+
*
|
|
132
|
+
* @param useCases - Array of use cases
|
|
133
|
+
* @returns Total monthly savings
|
|
134
|
+
*/
|
|
135
|
+
export declare function calculateTotalSavings(useCases: string[]): number;
|
|
136
|
+
//# sourceMappingURL=ServerlessSavingsCalculator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ServerlessSavingsCalculator.d.ts","sourceRoot":"","sources":["../../../../src/init/team/ServerlessSavingsCalculator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,6DAA6D;IAC7D,OAAO,EAAE,MAAM,CAAC;IAEhB,gDAAgD;IAChD,eAAe,EAAE,MAAM,CAAC;IAExB,yCAAyC;IACzC,cAAc,EAAE,MAAM,CAAC;IAEvB,yDAAyD;IACzD,OAAO,EAAE,MAAM,CAAC;IAEhB,qCAAqC;IACrC,OAAO,EAAE,MAAM,CAAC;IAEhB,sCAAsC;IACtC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IAExB,6BAA6B;IAC7B,SAAS,EAAE,MAAM,EAAE,CAAC;IAEpB,+CAA+C;IAC/C,eAAe,EAAE,MAAM,EAAE,CAAC;IAE1B,mDAAmD;IACnD,kBAAkB,EAAE,MAAM,EAAE,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC,sCAAsC;IACtC,YAAY,EAAE,MAAM,CAAC;IAErB,4BAA4B;IAC5B,SAAS,EAAE,gBAAgB,EAAE,CAAC;IAE9B,yDAAyD;IACzD,cAAc,EAAE,YAAY,GAAG,aAAa,GAAG,QAAQ,CAAC;IAExD,mCAAmC;IACnC,SAAS,EAAE,MAAM,CAAC;IAElB,6BAA6B;IAC7B,UAAU,EAAE,MAAM,CAAC;CACpB;AA0ID;;;;GAIG;AACH,qBAAa,2BAA2B;IACtC;;;;;;;;;;;;;OAaG;IACH,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,yBAAyB;IA2B/D;;;;OAIG;IACH,aAAa,IAAI,gBAAgB,EAAE;IAInC;;;;;OAKG;IACH,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS;IAOxD;;;;;OAKG;IACH,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAKnC;;;;;;;;;OASG;IACH,OAAO,CAAC,gBAAgB;IA0BxB;;;;;;OAMG;IACH,OAAO,CAAC,cAAc;IAKtB;;;;;;OAMG;IACH,OAAO,CAAC,uBAAuB;IAoD/B;;;;;OAKG;IACH,YAAY,CAAC,QAAQ,EAAE,yBAAyB,GAAG,MAAM;CA4C1D;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,CAIhE"}
|
|
@@ -0,0 +1,360 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Serverless Cost Savings Calculator
|
|
3
|
+
*
|
|
4
|
+
* Calculates potential monthly cost savings by using serverless
|
|
5
|
+
* alternatives instead of traditional infrastructure.
|
|
6
|
+
*
|
|
7
|
+
* **Savings Categories**:
|
|
8
|
+
* - Auth → AWS Cognito/Auth0: $185/month
|
|
9
|
+
* - File uploads → S3 + Lambda: $480/month
|
|
10
|
+
* - Image processing → Lambda/Cloudinary: $490/month
|
|
11
|
+
* - Email → SendGrid/SES: $85/month
|
|
12
|
+
* - Background jobs → Lambda: $280/month
|
|
13
|
+
* - **Total Potential: $1,520/month**
|
|
14
|
+
*/
|
|
15
|
+
/**
|
|
16
|
+
* Database of serverless cost savings by use case
|
|
17
|
+
*/
|
|
18
|
+
const SERVERLESS_SAVINGS_DATABASE = [
|
|
19
|
+
{
|
|
20
|
+
useCase: 'Authentication',
|
|
21
|
+
traditionalCost: 250, // EC2 t3.small ($17/month) + load balancer ($23/month) + dev time ($210/month maintenance)
|
|
22
|
+
serverlessCost: 65, // AWS Cognito free tier → $55/month at 10K users + minimal dev time
|
|
23
|
+
savings: 185,
|
|
24
|
+
service: 'AWS Cognito',
|
|
25
|
+
alternatives: ['Auth0', 'Firebase Auth', 'Supabase Auth'],
|
|
26
|
+
tradeoffs: [
|
|
27
|
+
'Limited customization vs full control',
|
|
28
|
+
'Vendor lock-in vs self-hosted',
|
|
29
|
+
'Instant scale vs manual scaling',
|
|
30
|
+
'AWS-specific vs multi-cloud'
|
|
31
|
+
],
|
|
32
|
+
recommendedWhen: [
|
|
33
|
+
'Standard OAuth/SAML requirements',
|
|
34
|
+
'User count < 100K (free tier optimized)',
|
|
35
|
+
'Want zero ops burden',
|
|
36
|
+
'Need instant global scale'
|
|
37
|
+
],
|
|
38
|
+
notRecommendedWhen: [
|
|
39
|
+
'Highly custom auth flows',
|
|
40
|
+
'On-premise requirements',
|
|
41
|
+
'Non-AWS infrastructure',
|
|
42
|
+
'Need full audit trail control'
|
|
43
|
+
]
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
useCase: 'File Uploads',
|
|
47
|
+
traditionalCost: 650, // EC2 t3.medium ($34/month) + EBS 500GB ($50/month) + bandwidth ($100/month) + dev time ($466/month)
|
|
48
|
+
serverlessCost: 170, // S3 500GB ($11.5/month) + Lambda processing ($45/month) + bandwidth ($100/month) + minimal dev time ($13/month)
|
|
49
|
+
savings: 480,
|
|
50
|
+
service: 'S3 + Lambda',
|
|
51
|
+
alternatives: ['Cloudflare R2 + Workers', 'Azure Blob + Functions', 'GCP Cloud Storage + Cloud Functions'],
|
|
52
|
+
tradeoffs: [
|
|
53
|
+
'Pay-per-use vs fixed cost',
|
|
54
|
+
'Automatic scaling vs manual capacity planning',
|
|
55
|
+
'Cold start latency vs always-on',
|
|
56
|
+
'Function timeout limits (15 min Lambda) vs unlimited processing'
|
|
57
|
+
],
|
|
58
|
+
recommendedWhen: [
|
|
59
|
+
'Sporadic upload patterns',
|
|
60
|
+
'Need global CDN',
|
|
61
|
+
'Variable file sizes',
|
|
62
|
+
'Want automatic backup/versioning'
|
|
63
|
+
],
|
|
64
|
+
notRecommendedWhen: [
|
|
65
|
+
'Constant high-volume uploads',
|
|
66
|
+
'Processing > 15 minutes per file',
|
|
67
|
+
'Need file system access patterns',
|
|
68
|
+
'On-premise storage requirements'
|
|
69
|
+
]
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
useCase: 'Image Processing',
|
|
73
|
+
traditionalCost: 800, // EC2 c5.large for ImageMagick ($70/month) + EBS ($30/month) + dev time ($700/month)
|
|
74
|
+
serverlessCost: 310, // Lambda with sharp.js ($120/month at scale) + S3 storage ($20/month) + Cloudinary transformations ($170/month) + minimal dev time
|
|
75
|
+
savings: 490,
|
|
76
|
+
service: 'Lambda + Cloudinary',
|
|
77
|
+
alternatives: ['Imgix', 'Cloudflare Images', 'AWS Lambda + sharp.js only', 'Vercel Image Optimization'],
|
|
78
|
+
tradeoffs: [
|
|
79
|
+
'Per-transformation cost vs fixed infrastructure',
|
|
80
|
+
'Automatic optimization vs manual tuning',
|
|
81
|
+
'CDN-integrated vs separate CDN setup',
|
|
82
|
+
'Limited processing time vs unlimited'
|
|
83
|
+
],
|
|
84
|
+
recommendedWhen: [
|
|
85
|
+
'On-demand image transformations',
|
|
86
|
+
'Need responsive images (multiple sizes)',
|
|
87
|
+
'Want automatic format optimization (WebP, AVIF)',
|
|
88
|
+
'Global user base (CDN benefit)'
|
|
89
|
+
],
|
|
90
|
+
notRecommendedWhen: [
|
|
91
|
+
'Batch processing millions of images',
|
|
92
|
+
'Custom processing algorithms',
|
|
93
|
+
'Processing time > 15 minutes',
|
|
94
|
+
'Need specific ImageMagick features'
|
|
95
|
+
]
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
useCase: 'Email Sending',
|
|
99
|
+
traditionalCost: 175, // EC2 t3.micro ($9/month) + Postfix setup + IP warming + dev time ($150/month) + deliverability monitoring ($16/month)
|
|
100
|
+
serverlessCost: 90, // SendGrid free tier → $20/month at 10K emails + SES backup ($5/month) + minimal dev time ($65/month)
|
|
101
|
+
savings: 85,
|
|
102
|
+
service: 'SendGrid / AWS SES',
|
|
103
|
+
alternatives: ['Mailgun', 'Postmark', 'Resend', 'Brevo (formerly Sendinblue)'],
|
|
104
|
+
tradeoffs: [
|
|
105
|
+
'Pay-per-email vs fixed cost',
|
|
106
|
+
'Managed deliverability vs DIY IP warming',
|
|
107
|
+
'Email templates vs custom SMTP',
|
|
108
|
+
'Analytics included vs separate tracking'
|
|
109
|
+
],
|
|
110
|
+
recommendedWhen: [
|
|
111
|
+
'Transactional emails (< 100K/month)',
|
|
112
|
+
'Want high deliverability out-of-box',
|
|
113
|
+
'Need email analytics',
|
|
114
|
+
'Don\'t want to manage SMTP servers'
|
|
115
|
+
],
|
|
116
|
+
notRecommendedWhen: [
|
|
117
|
+
'Sending millions of emails monthly',
|
|
118
|
+
'Need full SMTP control',
|
|
119
|
+
'On-premise email requirements',
|
|
120
|
+
'Highly sensitive email content (compliance)'
|
|
121
|
+
]
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
useCase: 'Background Jobs',
|
|
125
|
+
traditionalCost: 500, // EC2 t3.medium for queue workers ($34/month) + Redis ($50/month) + monitoring ($50/month) + dev time ($366/month)
|
|
126
|
+
serverlessCost: 220, // Lambda executions ($80/month at 1M jobs) + SQS ($10/month) + CloudWatch ($30/month) + minimal dev time ($100/month)
|
|
127
|
+
savings: 280,
|
|
128
|
+
service: 'AWS Lambda + SQS',
|
|
129
|
+
alternatives: ['Azure Functions + Queue Storage', 'GCP Cloud Functions + Pub/Sub', 'Cloudflare Workers + Queues'],
|
|
130
|
+
tradeoffs: [
|
|
131
|
+
'Per-invocation cost vs always-on workers',
|
|
132
|
+
'15-minute timeout vs unlimited job duration',
|
|
133
|
+
'Automatic scaling vs manual worker pools',
|
|
134
|
+
'Cold start delay vs instant execution'
|
|
135
|
+
],
|
|
136
|
+
recommendedWhen: [
|
|
137
|
+
'Sporadic job patterns',
|
|
138
|
+
'Jobs complete in < 15 minutes',
|
|
139
|
+
'Want automatic scaling',
|
|
140
|
+
'Need retry logic out-of-box'
|
|
141
|
+
],
|
|
142
|
+
notRecommendedWhen: [
|
|
143
|
+
'Long-running jobs (> 15 min)',
|
|
144
|
+
'Constant high-frequency jobs',
|
|
145
|
+
'Need stateful workers',
|
|
146
|
+
'Complex job dependencies'
|
|
147
|
+
]
|
|
148
|
+
}
|
|
149
|
+
];
|
|
150
|
+
/**
|
|
151
|
+
* Serverless Savings Calculator
|
|
152
|
+
*
|
|
153
|
+
* Analyzes which services can benefit from serverless and calculates savings.
|
|
154
|
+
*/
|
|
155
|
+
export class ServerlessSavingsCalculator {
|
|
156
|
+
/**
|
|
157
|
+
* Calculate potential serverless savings for a project
|
|
158
|
+
*
|
|
159
|
+
* @param useCases - Array of use cases detected in project (e.g., ["auth", "file-uploads"])
|
|
160
|
+
* @returns Complete savings analysis with recommendations
|
|
161
|
+
*
|
|
162
|
+
* @example
|
|
163
|
+
* ```typescript
|
|
164
|
+
* const calculator = new ServerlessSavingsCalculator();
|
|
165
|
+
* const analysis = calculator.calculateSavings(['auth', 'file-uploads', 'email']);
|
|
166
|
+
* console.log(analysis.totalSavings); // 750
|
|
167
|
+
* console.log(analysis.recommendation); // 'serverless'
|
|
168
|
+
* ```
|
|
169
|
+
*/
|
|
170
|
+
calculateSavings(useCases) {
|
|
171
|
+
// Normalize use cases to match database keys
|
|
172
|
+
const normalizedUseCases = useCases.map(uc => this.normalizeUseCase(uc));
|
|
173
|
+
// Filter database to matching use cases
|
|
174
|
+
const applicableOptions = SERVERLESS_SAVINGS_DATABASE.filter(option => normalizedUseCases.some(uc => this.matchesUseCase(uc, option.useCase)));
|
|
175
|
+
// Calculate total savings
|
|
176
|
+
const totalSavings = applicableOptions.reduce((sum, option) => sum + option.savings, 0);
|
|
177
|
+
// Determine recommendation
|
|
178
|
+
const { recommendation, rationale, confidence } = this.determineRecommendation(applicableOptions, totalSavings);
|
|
179
|
+
return {
|
|
180
|
+
totalSavings,
|
|
181
|
+
breakdown: applicableOptions,
|
|
182
|
+
recommendation,
|
|
183
|
+
rationale,
|
|
184
|
+
confidence
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Get all available serverless options
|
|
189
|
+
*
|
|
190
|
+
* @returns Complete database of serverless savings options
|
|
191
|
+
*/
|
|
192
|
+
getAllOptions() {
|
|
193
|
+
return [...SERVERLESS_SAVINGS_DATABASE];
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Get serverless option by use case
|
|
197
|
+
*
|
|
198
|
+
* @param useCase - Use case name
|
|
199
|
+
* @returns Serverless option or undefined if not found
|
|
200
|
+
*/
|
|
201
|
+
getOption(useCase) {
|
|
202
|
+
const normalized = this.normalizeUseCase(useCase);
|
|
203
|
+
return SERVERLESS_SAVINGS_DATABASE.find(option => this.matchesUseCase(normalized, option.useCase));
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Calculate savings for specific use case
|
|
207
|
+
*
|
|
208
|
+
* @param useCase - Use case name
|
|
209
|
+
* @returns Savings amount or 0 if not found
|
|
210
|
+
*/
|
|
211
|
+
getSavings(useCase) {
|
|
212
|
+
const option = this.getOption(useCase);
|
|
213
|
+
return option?.savings ?? 0;
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Normalize use case name for matching
|
|
217
|
+
*
|
|
218
|
+
* @param useCase - Raw use case string
|
|
219
|
+
* @returns Normalized use case
|
|
220
|
+
*
|
|
221
|
+
* @example
|
|
222
|
+
* normalizeUseCase("file upload") → "file-uploads"
|
|
223
|
+
* normalizeUseCase("AUTH") → "authentication"
|
|
224
|
+
*/
|
|
225
|
+
normalizeUseCase(useCase) {
|
|
226
|
+
const normalized = useCase.toLowerCase().trim().replace(/\s+/g, '-');
|
|
227
|
+
// Map common variations to standard names
|
|
228
|
+
const mappings = {
|
|
229
|
+
'auth': 'authentication',
|
|
230
|
+
'login': 'authentication',
|
|
231
|
+
'user-auth': 'authentication',
|
|
232
|
+
'file-upload': 'file-uploads',
|
|
233
|
+
'files': 'file-uploads',
|
|
234
|
+
'storage': 'file-uploads',
|
|
235
|
+
'images': 'image-processing',
|
|
236
|
+
'image-transform': 'image-processing',
|
|
237
|
+
'image-resize': 'image-processing',
|
|
238
|
+
'email': 'email-sending',
|
|
239
|
+
'emails': 'email-sending',
|
|
240
|
+
'notifications': 'email-sending',
|
|
241
|
+
'jobs': 'background-jobs',
|
|
242
|
+
'queue': 'background-jobs',
|
|
243
|
+
'workers': 'background-jobs',
|
|
244
|
+
'tasks': 'background-jobs'
|
|
245
|
+
};
|
|
246
|
+
return mappings[normalized] || normalized;
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Check if normalized use case matches database use case
|
|
250
|
+
*
|
|
251
|
+
* @param normalized - Normalized use case from user input
|
|
252
|
+
* @param dbUseCase - Use case from database
|
|
253
|
+
* @returns True if match
|
|
254
|
+
*/
|
|
255
|
+
matchesUseCase(normalized, dbUseCase) {
|
|
256
|
+
const dbNormalized = dbUseCase.toLowerCase().replace(/\s+/g, '-');
|
|
257
|
+
return normalized === dbNormalized;
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Determine serverless recommendation based on savings
|
|
261
|
+
*
|
|
262
|
+
* @param options - Applicable serverless options
|
|
263
|
+
* @param totalSavings - Total monthly savings
|
|
264
|
+
* @returns Recommendation with rationale
|
|
265
|
+
*/
|
|
266
|
+
determineRecommendation(options, totalSavings) {
|
|
267
|
+
// No applicable use cases → traditional
|
|
268
|
+
if (options.length === 0) {
|
|
269
|
+
return {
|
|
270
|
+
recommendation: 'traditional',
|
|
271
|
+
rationale: 'No serverless-optimized use cases detected',
|
|
272
|
+
confidence: 0.8
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
// High savings (> $500/month) → serverless
|
|
276
|
+
if (totalSavings >= 500) {
|
|
277
|
+
return {
|
|
278
|
+
recommendation: 'serverless',
|
|
279
|
+
rationale: `Serverless saves $${totalSavings}/month across ${options.length} use cases. Significant cost reduction with minimal trade-offs.`,
|
|
280
|
+
confidence: 0.95
|
|
281
|
+
};
|
|
282
|
+
}
|
|
283
|
+
// Moderate savings ($200-500) → hybrid
|
|
284
|
+
if (totalSavings >= 200) {
|
|
285
|
+
return {
|
|
286
|
+
recommendation: 'hybrid',
|
|
287
|
+
rationale: `Serverless saves $${totalSavings}/month. Consider hybrid approach: serverless for ${options.map(o => o.useCase.toLowerCase()).join(', ')}, traditional for other services.`,
|
|
288
|
+
confidence: 0.85
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
// Low savings (< $200) → evaluate trade-offs
|
|
292
|
+
if (totalSavings >= 100) {
|
|
293
|
+
return {
|
|
294
|
+
recommendation: 'hybrid',
|
|
295
|
+
rationale: `Modest savings of $${totalSavings}/month. Serverless benefits: zero ops burden, instant scaling. Trade-off: vendor lock-in.`,
|
|
296
|
+
confidence: 0.7
|
|
297
|
+
};
|
|
298
|
+
}
|
|
299
|
+
// Minimal savings → traditional
|
|
300
|
+
return {
|
|
301
|
+
recommendation: 'traditional',
|
|
302
|
+
rationale: `Minimal savings ($${totalSavings}/month). Traditional infrastructure may offer better control for your use cases.`,
|
|
303
|
+
confidence: 0.75
|
|
304
|
+
};
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* Format savings analysis as markdown report
|
|
308
|
+
*
|
|
309
|
+
* @param analysis - Savings analysis result
|
|
310
|
+
* @returns Markdown-formatted report
|
|
311
|
+
*/
|
|
312
|
+
formatReport(analysis) {
|
|
313
|
+
const lines = [];
|
|
314
|
+
lines.push('# Serverless Cost Savings Analysis\n');
|
|
315
|
+
lines.push(`**Total Potential Savings**: $${analysis.totalSavings}/month\n`);
|
|
316
|
+
lines.push(`**Recommendation**: ${analysis.recommendation.toUpperCase()}`);
|
|
317
|
+
lines.push(`**Confidence**: ${(analysis.confidence * 100).toFixed(0)}%\n`);
|
|
318
|
+
lines.push(`**Rationale**: ${analysis.rationale}\n`);
|
|
319
|
+
lines.push('---\n');
|
|
320
|
+
if (analysis.breakdown.length > 0) {
|
|
321
|
+
lines.push('## Savings Breakdown\n');
|
|
322
|
+
for (const option of analysis.breakdown) {
|
|
323
|
+
lines.push(`### ${option.useCase}\n`);
|
|
324
|
+
lines.push(`- **Service**: ${option.service}`);
|
|
325
|
+
if (option.alternatives && option.alternatives.length > 0) {
|
|
326
|
+
lines.push(`- **Alternatives**: ${option.alternatives.join(', ')}`);
|
|
327
|
+
}
|
|
328
|
+
lines.push(`- **Traditional Cost**: $${option.traditionalCost}/month`);
|
|
329
|
+
lines.push(`- **Serverless Cost**: $${option.serverlessCost}/month`);
|
|
330
|
+
lines.push(`- **Savings**: $${option.savings}/month\n`);
|
|
331
|
+
lines.push('**Recommended When**:');
|
|
332
|
+
for (const when of option.recommendedWhen) {
|
|
333
|
+
lines.push(` - ${when}`);
|
|
334
|
+
}
|
|
335
|
+
lines.push('\n**NOT Recommended When**:');
|
|
336
|
+
for (const when of option.notRecommendedWhen) {
|
|
337
|
+
lines.push(` - ${when}`);
|
|
338
|
+
}
|
|
339
|
+
lines.push('\n**Trade-offs**:');
|
|
340
|
+
for (const tradeoff of option.tradeoffs) {
|
|
341
|
+
lines.push(` - ${tradeoff}`);
|
|
342
|
+
}
|
|
343
|
+
lines.push('\n---\n');
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
return lines.join('\n');
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
/**
|
|
350
|
+
* Quick helper to calculate total potential serverless savings
|
|
351
|
+
*
|
|
352
|
+
* @param useCases - Array of use cases
|
|
353
|
+
* @returns Total monthly savings
|
|
354
|
+
*/
|
|
355
|
+
export function calculateTotalSavings(useCases) {
|
|
356
|
+
const calculator = new ServerlessSavingsCalculator();
|
|
357
|
+
const analysis = calculator.calculateSavings(useCases);
|
|
358
|
+
return analysis.totalSavings;
|
|
359
|
+
}
|
|
360
|
+
//# sourceMappingURL=ServerlessSavingsCalculator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ServerlessSavingsCalculator.js","sourceRoot":"","sources":["../../../../src/init/team/ServerlessSavingsCalculator.ts"],"names":[],"mappings":"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"}
|