specweave 0.21.3 → 0.22.2
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 +409 -6
- package/README.md +38 -8
- package/bin/specweave.js +5 -8
- package/dist/plugins/specweave-github/lib/CodeValidator.d.ts +101 -0
- package/dist/plugins/specweave-github/lib/CodeValidator.d.ts.map +1 -0
- package/dist/plugins/specweave-github/lib/CodeValidator.js +219 -0
- package/dist/plugins/specweave-github/lib/CodeValidator.js.map +1 -0
- package/dist/plugins/specweave-github/lib/ThreeLayerSyncManager.d.ts +182 -0
- package/dist/plugins/specweave-github/lib/ThreeLayerSyncManager.d.ts.map +1 -0
- package/dist/plugins/specweave-github/lib/ThreeLayerSyncManager.js +603 -0
- package/dist/plugins/specweave-github/lib/ThreeLayerSyncManager.js.map +1 -0
- package/dist/plugins/specweave-github/lib/github-client-v2.d.ts +10 -0
- package/dist/plugins/specweave-github/lib/github-client-v2.d.ts.map +1 -1
- package/dist/plugins/specweave-github/lib/github-client-v2.js +26 -0
- package/dist/plugins/specweave-github/lib/github-client-v2.js.map +1 -1
- package/dist/plugins/specweave-github/lib/task-sync.d.ts.map +1 -1
- package/dist/plugins/specweave-github/lib/task-sync.js +7 -0
- package/dist/plugins/specweave-github/lib/task-sync.js.map +1 -1
- package/dist/plugins/specweave-github/lib/types.d.ts +34 -0
- package/dist/plugins/specweave-github/lib/types.d.ts.map +1 -1
- package/dist/src/cli/commands/init.d.ts.map +1 -1
- package/dist/src/cli/commands/init.js +60 -5
- package/dist/src/cli/commands/init.js.map +1 -1
- package/dist/src/cli/commands/migrate-to-profiles.d.ts +1 -0
- package/dist/src/cli/commands/migrate-to-profiles.d.ts.map +1 -1
- package/dist/src/cli/commands/migrate-to-profiles.js +12 -1
- package/dist/src/cli/commands/migrate-to-profiles.js.map +1 -1
- package/dist/src/cli/commands/next-command.d.ts +52 -0
- package/dist/src/cli/commands/next-command.d.ts.map +1 -0
- package/dist/src/cli/commands/next-command.js +204 -0
- package/dist/src/cli/commands/next-command.js.map +1 -0
- package/dist/src/cli/commands/sync-specs.d.ts +16 -0
- package/dist/src/cli/commands/sync-specs.d.ts.map +1 -0
- package/dist/src/cli/commands/sync-specs.js +130 -0
- package/dist/src/cli/commands/sync-specs.js.map +1 -0
- package/dist/src/cli/count-tasks.d.ts +20 -0
- package/dist/src/cli/count-tasks.d.ts.map +1 -0
- package/dist/src/cli/count-tasks.js +50 -0
- package/dist/src/cli/count-tasks.js.map +1 -0
- package/dist/src/config/ConfigManager.d.ts.map +1 -1
- package/dist/src/config/ConfigManager.js +2 -1
- package/dist/src/config/ConfigManager.js.map +1 -1
- package/dist/src/config/types.d.ts +58 -58
- package/dist/src/core/cicd/state-manager.d.ts +8 -0
- package/dist/src/core/cicd/state-manager.d.ts.map +1 -1
- package/dist/src/core/cicd/state-manager.js +60 -15
- package/dist/src/core/cicd/state-manager.js.map +1 -1
- package/dist/src/core/cost-tracker.d.ts.map +1 -1
- package/dist/src/core/cost-tracker.js +2 -1
- package/dist/src/core/cost-tracker.js.map +1 -1
- package/dist/src/core/iac/template-engine.d.ts.map +1 -1
- package/dist/src/core/iac/template-engine.js +28 -0
- package/dist/src/core/iac/template-engine.js.map +1 -1
- package/dist/src/core/iac/template-generator.d.ts +53 -0
- package/dist/src/core/iac/template-generator.d.ts.map +1 -0
- package/dist/src/core/iac/template-generator.js +125 -0
- package/dist/src/core/iac/template-generator.js.map +1 -0
- package/dist/src/core/increment/status-auto-transition.js +3 -3
- package/dist/src/core/increment/status-auto-transition.js.map +1 -1
- package/dist/src/core/living-docs/CodeValidator.js +1 -1
- package/dist/src/core/living-docs/CodeValidator.js.map +1 -1
- package/dist/src/core/living-docs/CompletionPropagator.d.ts.map +1 -1
- package/dist/src/core/living-docs/CompletionPropagator.js +4 -3
- package/dist/src/core/living-docs/CompletionPropagator.js.map +1 -1
- package/dist/src/core/living-docs/SpecDistributor.d.ts +5 -0
- package/dist/src/core/living-docs/SpecDistributor.d.ts.map +1 -1
- package/dist/src/core/living-docs/SpecDistributor.js +12 -0
- package/dist/src/core/living-docs/SpecDistributor.js.map +1 -1
- package/dist/src/core/living-docs/content-distributor.d.ts.map +1 -1
- package/dist/src/core/living-docs/content-distributor.js +11 -1
- package/dist/src/core/living-docs/content-distributor.js.map +1 -1
- package/dist/src/core/living-docs/living-docs-sync.d.ts +166 -0
- package/dist/src/core/living-docs/living-docs-sync.d.ts.map +1 -0
- package/dist/src/core/living-docs/living-docs-sync.js +726 -0
- package/dist/src/core/living-docs/living-docs-sync.js.map +1 -0
- package/dist/src/core/living-docs/project-detector.d.ts.map +1 -1
- package/dist/src/core/living-docs/project-detector.js +38 -0
- package/dist/src/core/living-docs/project-detector.js.map +1 -1
- package/dist/src/core/living-docs/task-project-specific-generator.d.ts +7 -3
- package/dist/src/core/living-docs/task-project-specific-generator.d.ts.map +1 -1
- package/dist/src/core/living-docs/task-project-specific-generator.js +40 -24
- package/dist/src/core/living-docs/task-project-specific-generator.js.map +1 -1
- package/dist/src/core/plugin-loader.d.ts +7 -0
- package/dist/src/core/plugin-loader.d.ts.map +1 -1
- package/dist/src/core/plugin-loader.js +18 -1
- package/dist/src/core/plugin-loader.js.map +1 -1
- package/dist/src/core/serverless/platform-data-loader.d.ts +8 -0
- package/dist/src/core/serverless/platform-data-loader.d.ts.map +1 -1
- package/dist/src/core/serverless/platform-data-loader.js +14 -0
- package/dist/src/core/serverless/platform-data-loader.js.map +1 -1
- package/dist/src/core/serverless/types.d.ts +1 -1
- package/dist/src/core/serverless/types.d.ts.map +1 -1
- package/dist/src/core/status-line/status-line-manager.d.ts +6 -2
- package/dist/src/core/status-line/status-line-manager.d.ts.map +1 -1
- package/dist/src/core/status-line/status-line-manager.js +11 -5
- package/dist/src/core/status-line/status-line-manager.js.map +1 -1
- package/dist/src/core/status-line/task-counter.d.ts +69 -0
- package/dist/src/core/status-line/task-counter.d.ts.map +1 -0
- package/dist/src/core/status-line/task-counter.js +107 -0
- package/dist/src/core/status-line/task-counter.js.map +1 -0
- package/dist/src/core/types/config.d.ts +23 -0
- package/dist/src/core/types/config.d.ts.map +1 -1
- package/dist/src/core/types/config.js +10 -0
- package/dist/src/core/types/config.js.map +1 -1
- package/dist/src/core/workflow/autonomous-executor.d.ts +111 -0
- package/dist/src/core/workflow/autonomous-executor.d.ts.map +1 -0
- package/dist/src/core/workflow/autonomous-executor.js +275 -0
- package/dist/src/core/workflow/autonomous-executor.js.map +1 -0
- package/dist/src/core/workflow/backlog-scanner.d.ts +94 -0
- package/dist/src/core/workflow/backlog-scanner.d.ts.map +1 -0
- package/dist/src/core/workflow/backlog-scanner.js +170 -0
- package/dist/src/core/workflow/backlog-scanner.js.map +1 -0
- package/dist/src/core/workflow/command-invoker.d.ts +86 -0
- package/dist/src/core/workflow/command-invoker.d.ts.map +1 -0
- package/dist/src/core/workflow/command-invoker.js +131 -0
- package/dist/src/core/workflow/command-invoker.js.map +1 -0
- package/dist/src/core/workflow/cost-estimator.d.ts +120 -0
- package/dist/src/core/workflow/cost-estimator.d.ts.map +1 -0
- package/dist/src/core/workflow/cost-estimator.js +222 -0
- package/dist/src/core/workflow/cost-estimator.js.map +1 -0
- package/dist/src/core/workflow/index.d.ts +20 -0
- package/dist/src/core/workflow/index.d.ts.map +1 -0
- package/dist/src/core/workflow/index.js +24 -0
- package/dist/src/core/workflow/index.js.map +1 -0
- package/dist/src/core/workflow/state-manager.d.ts +107 -0
- package/dist/src/core/workflow/state-manager.d.ts.map +1 -0
- package/dist/src/core/workflow/state-manager.js +126 -0
- package/dist/src/core/workflow/state-manager.js.map +1 -0
- package/dist/src/core/workflow/workflow-orchestrator.d.ts +93 -0
- package/dist/src/core/workflow/workflow-orchestrator.d.ts.map +1 -0
- package/dist/src/core/workflow/workflow-orchestrator.js +195 -0
- package/dist/src/core/workflow/workflow-orchestrator.js.map +1 -0
- package/dist/src/init/ArchitecturePresenter.d.ts +47 -0
- package/dist/src/init/ArchitecturePresenter.d.ts.map +1 -0
- package/dist/src/init/ArchitecturePresenter.js +180 -0
- package/dist/src/init/ArchitecturePresenter.js.map +1 -0
- package/dist/src/init/InitFlow.d.ts.map +1 -1
- package/dist/src/init/InitFlow.js +30 -1
- package/dist/src/init/InitFlow.js.map +1 -1
- package/dist/src/init/architecture/CostEstimator.d.ts +52 -0
- package/dist/src/init/architecture/CostEstimator.d.ts.map +1 -0
- package/dist/src/init/architecture/CostEstimator.js +107 -0
- package/dist/src/init/architecture/CostEstimator.js.map +1 -0
- package/dist/src/init/architecture/InfrastructureMapper.d.ts +41 -0
- package/dist/src/init/architecture/InfrastructureMapper.d.ts.map +1 -0
- package/dist/src/init/architecture/InfrastructureMapper.js +140 -0
- package/dist/src/init/architecture/InfrastructureMapper.js.map +1 -0
- package/dist/src/init/architecture/ProjectGenerator.d.ts +44 -0
- package/dist/src/init/architecture/ProjectGenerator.d.ts.map +1 -0
- package/dist/src/init/architecture/ProjectGenerator.js +216 -0
- package/dist/src/init/architecture/ProjectGenerator.js.map +1 -0
- package/dist/src/init/architecture/types.d.ts +10 -10
- package/dist/src/init/research/src/config/types.d.ts +8 -8
- package/dist/src/metrics/dora-calculator.js +2 -2
- package/dist/src/metrics/dora-calculator.js.map +1 -1
- package/dist/src/utils/pricing-constants.d.ts +5 -2
- package/dist/src/utils/pricing-constants.d.ts.map +1 -1
- package/dist/src/utils/pricing-constants.js +3 -2
- package/dist/src/utils/pricing-constants.js.map +1 -1
- package/package.json +9 -8
- package/plugins/specweave/agents/infrastructure/AGENT.md +88 -46
- package/plugins/specweave/agents/pm/AGENT.md +58 -1
- package/plugins/specweave/commands/specweave-archive-features.md +1 -1
- package/plugins/specweave/commands/specweave-archive-increments.md +1 -1
- package/plugins/specweave/commands/specweave-check-hooks.md +5 -0
- package/plugins/specweave/commands/specweave-done.md +12 -0
- package/plugins/specweave/commands/specweave-plan.md +1 -1
- package/plugins/specweave/commands/specweave-progress.md +108 -379
- package/plugins/specweave/commands/specweave-reopen.md +1 -1
- package/plugins/specweave/commands/specweave-restore-feature.md +1 -1
- package/plugins/specweave/commands/specweave-sync-specs.md +20 -48
- package/plugins/specweave/hooks/lib/update-status-line.sh +44 -35
- package/plugins/specweave/hooks/lib/validate-spec-status.sh +163 -0
- package/plugins/specweave/hooks/user-prompt-submit.sh +17 -35
- package/plugins/specweave/lib/hooks/update-tasks-md.js +52 -9
- package/plugins/specweave/lib/hooks/update-tasks-md.ts +77 -16
- package/plugins/specweave/templates/iac/aws-lambda/defaults.json +24 -0
- package/plugins/specweave/templates/iac/aws-lambda/templates/README.md.hbs +260 -0
- package/plugins/specweave/templates/iac/aws-lambda/templates/environments/dev.tfvars.hbs +34 -0
- package/plugins/specweave/templates/iac/aws-lambda/templates/environments/prod.tfvars.hbs +37 -0
- package/plugins/specweave/templates/iac/aws-lambda/templates/environments/staging.tfvars.hbs +35 -0
- package/plugins/specweave/templates/iac/aws-lambda/templates/outputs.tf.hbs +77 -0
- package/plugins/specweave/templates/iac/aws-lambda/templates/providers.tf.hbs +36 -0
- package/plugins/specweave/templates/iac/aws-lambda/templates/variables.tf.hbs +115 -0
- package/plugins/specweave/templates/iac/azure-functions/defaults.json +25 -0
- package/plugins/specweave/templates/iac/azure-functions/templates/README.md.hbs +268 -0
- package/plugins/specweave/templates/iac/azure-functions/templates/environments/dev.tfvars.hbs +34 -0
- package/plugins/specweave/templates/iac/azure-functions/templates/environments/prod.tfvars.hbs +46 -0
- package/plugins/specweave/templates/iac/azure-functions/templates/environments/staging.tfvars.hbs +34 -0
- package/plugins/specweave/templates/iac/azure-functions/templates/main.tf.hbs +225 -0
- package/plugins/specweave/templates/iac/azure-functions/templates/outputs.tf.hbs +89 -0
- package/plugins/specweave/templates/iac/azure-functions/templates/provider.tf.hbs +27 -0
- package/plugins/specweave/templates/iac/azure-functions/templates/providers.tf.hbs +35 -0
- package/plugins/specweave/templates/iac/azure-functions/templates/variables.tf.hbs +124 -0
- package/plugins/specweave/templates/iac/firebase/defaults.json +29 -0
- package/plugins/specweave/templates/iac/firebase/templates/README.md.hbs +35 -0
- package/plugins/specweave/templates/iac/firebase/templates/environments/dev.tfvars.hbs +7 -0
- package/plugins/specweave/templates/iac/firebase/templates/environments/prod.tfvars.hbs +7 -0
- package/plugins/specweave/templates/iac/firebase/templates/environments/staging.tfvars.hbs +7 -0
- package/plugins/specweave/templates/iac/firebase/templates/main.tf.hbs +90 -0
- package/plugins/specweave/templates/iac/firebase/templates/outputs.tf.hbs +15 -0
- package/plugins/specweave/templates/iac/firebase/templates/providers.tf.hbs +23 -0
- package/plugins/specweave/templates/iac/firebase/templates/variables.tf.hbs +42 -0
- package/plugins/specweave/templates/iac/gcp-cloud-functions/defaults.json +26 -0
- package/plugins/specweave/templates/iac/gcp-cloud-functions/templates/README.md.hbs +299 -0
- package/plugins/specweave/templates/iac/gcp-cloud-functions/templates/environments/dev.tfvars.hbs +36 -0
- package/plugins/specweave/templates/iac/gcp-cloud-functions/templates/environments/prod.tfvars.hbs +48 -0
- package/plugins/specweave/templates/iac/gcp-cloud-functions/templates/environments/staging.tfvars.hbs +41 -0
- package/plugins/specweave/templates/iac/gcp-cloud-functions/templates/main.tf.hbs +192 -0
- package/plugins/specweave/templates/iac/gcp-cloud-functions/templates/outputs.tf.hbs +66 -0
- package/plugins/specweave/templates/iac/gcp-cloud-functions/templates/providers.tf.hbs +25 -0
- package/plugins/specweave/templates/iac/gcp-cloud-functions/templates/variables.tf.hbs +119 -0
- package/plugins/specweave/templates/iac/supabase/defaults.json +15 -0
- package/plugins/specweave/templates/iac/supabase/templates/README.md.hbs +46 -0
- package/plugins/specweave/templates/iac/supabase/templates/main.tf.hbs +50 -0
- package/plugins/specweave-ado/lib/enhanced-ado-sync.js +170 -0
- package/plugins/specweave-github/agents/github-manager/AGENT.md +39 -7
- package/plugins/specweave-github/commands/specweave-github-create-issue.md +5 -5
- package/plugins/specweave-github/lib/CodeValidator.js +195 -0
- package/plugins/specweave-github/lib/CodeValidator.ts +284 -0
- package/plugins/specweave-github/lib/ThreeLayerSyncManager.js +545 -0
- package/plugins/specweave-github/lib/ThreeLayerSyncManager.ts +809 -0
- package/plugins/specweave-github/lib/github-client-v2.js +29 -0
- package/plugins/specweave-github/lib/github-client-v2.ts +30 -0
- package/plugins/specweave-github/lib/task-sync.js +4 -0
- package/plugins/specweave-github/lib/task-sync.ts +7 -0
- package/plugins/specweave-github/lib/types.ts +38 -0
- package/plugins/specweave-jira/lib/enhanced-jira-sync.js +3 -3
- package/plugins/specweave-release/hooks/.specweave/logs/dora-tracking.log +3222 -0
- package/src/templates/AGENTS.md.template +22 -1
- package/src/templates/CLAUDE.md.template +31 -0
- package/dist/src/core/living-docs/ThreeLayerSyncManager.d.ts +0 -116
- package/dist/src/core/living-docs/ThreeLayerSyncManager.d.ts.map +0 -1
- package/dist/src/core/living-docs/ThreeLayerSyncManager.js +0 -356
- package/dist/src/core/living-docs/ThreeLayerSyncManager.js.map +0 -1
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Project Generator (T-042)
|
|
3
|
+
*
|
|
4
|
+
* Generates project list based on architecture type,
|
|
5
|
+
* compliance requirements, and vision keywords.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Project Generator Class
|
|
9
|
+
*/
|
|
10
|
+
export class ProjectGenerator {
|
|
11
|
+
/**
|
|
12
|
+
* Generate projects based on architecture and context
|
|
13
|
+
*
|
|
14
|
+
* @param architecture - Architecture type
|
|
15
|
+
* @param compliance - Compliance standards
|
|
16
|
+
* @param vision - Vision insights (optional)
|
|
17
|
+
* @returns Project definition list
|
|
18
|
+
*/
|
|
19
|
+
generateProjects(architecture, compliance = [], vision) {
|
|
20
|
+
const projects = [];
|
|
21
|
+
// Always add frontend (unless pure API)
|
|
22
|
+
if (!vision?.keywords.includes('api-only')) {
|
|
23
|
+
projects.push({
|
|
24
|
+
name: 'frontend',
|
|
25
|
+
description: 'Web application frontend',
|
|
26
|
+
stack: architecture === 'jamstack' ? ['Next.js', 'React'] : ['React', 'TypeScript']
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
// Add architecture-specific projects
|
|
30
|
+
const archProjects = this.getArchitectureProjects(architecture);
|
|
31
|
+
projects.push(...archProjects);
|
|
32
|
+
// Add compliance-driven projects
|
|
33
|
+
const complianceProjects = this.getComplianceProjects(compliance);
|
|
34
|
+
projects.push(...complianceProjects);
|
|
35
|
+
// Add vision-specific projects
|
|
36
|
+
if (vision) {
|
|
37
|
+
const visionProjects = this.getVisionProjects(vision);
|
|
38
|
+
projects.push(...visionProjects);
|
|
39
|
+
}
|
|
40
|
+
// Deduplicate by name
|
|
41
|
+
const uniqueProjects = this.deduplicateProjects(projects);
|
|
42
|
+
return uniqueProjects;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Get projects for architecture type
|
|
46
|
+
*/
|
|
47
|
+
getArchitectureProjects(architecture) {
|
|
48
|
+
switch (architecture) {
|
|
49
|
+
case 'serverless':
|
|
50
|
+
return [
|
|
51
|
+
{
|
|
52
|
+
name: 'backend-functions',
|
|
53
|
+
description: 'Serverless backend functions',
|
|
54
|
+
stack: ['AWS Lambda', 'Node.js', 'TypeScript']
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
name: 'api-gateway',
|
|
58
|
+
description: 'API Gateway configuration',
|
|
59
|
+
stack: ['AWS API Gateway']
|
|
60
|
+
}
|
|
61
|
+
];
|
|
62
|
+
case 'traditional-monolith':
|
|
63
|
+
case 'modular-monolith':
|
|
64
|
+
return [
|
|
65
|
+
{
|
|
66
|
+
name: 'backend',
|
|
67
|
+
description: 'Monolithic backend application',
|
|
68
|
+
stack: ['Node.js', 'Express', 'PostgreSQL']
|
|
69
|
+
}
|
|
70
|
+
];
|
|
71
|
+
case 'microservices':
|
|
72
|
+
return [
|
|
73
|
+
{
|
|
74
|
+
name: 'api-gateway',
|
|
75
|
+
description: 'API Gateway service',
|
|
76
|
+
stack: ['Kong', 'Nginx']
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
name: 'user-service',
|
|
80
|
+
description: 'User management service',
|
|
81
|
+
stack: ['Node.js', 'PostgreSQL']
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
name: 'auth-service',
|
|
85
|
+
description: 'Authentication service',
|
|
86
|
+
stack: ['Node.js', 'JWT', 'Redis']
|
|
87
|
+
}
|
|
88
|
+
];
|
|
89
|
+
case 'jamstack':
|
|
90
|
+
return [
|
|
91
|
+
{
|
|
92
|
+
name: 'cms',
|
|
93
|
+
description: 'Headless CMS',
|
|
94
|
+
stack: ['Contentful', 'Sanity']
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
name: 'backend-functions',
|
|
98
|
+
description: 'Serverless backend functions',
|
|
99
|
+
stack: ['Vercel Functions', 'Node.js']
|
|
100
|
+
}
|
|
101
|
+
];
|
|
102
|
+
case 'hybrid':
|
|
103
|
+
return [
|
|
104
|
+
{
|
|
105
|
+
name: 'backend-monolith',
|
|
106
|
+
description: 'Core backend monolith',
|
|
107
|
+
stack: ['Node.js', 'Express', 'PostgreSQL']
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
name: 'backend-functions',
|
|
111
|
+
description: 'Serverless functions for specific services',
|
|
112
|
+
stack: ['AWS Lambda', 'Node.js']
|
|
113
|
+
}
|
|
114
|
+
];
|
|
115
|
+
default:
|
|
116
|
+
return [];
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Get compliance-driven projects
|
|
121
|
+
*/
|
|
122
|
+
getComplianceProjects(compliance) {
|
|
123
|
+
const projects = [];
|
|
124
|
+
// HIPAA requires separate auth and data services
|
|
125
|
+
if (compliance.some((c) => c.id === 'HIPAA' || c.id === 'HITRUST')) {
|
|
126
|
+
projects.push({
|
|
127
|
+
name: 'auth-service',
|
|
128
|
+
description: 'HIPAA-compliant authentication service',
|
|
129
|
+
stack: ['Node.js', 'OAuth2', 'MFA', 'Audit Logging']
|
|
130
|
+
}, {
|
|
131
|
+
name: 'data-service',
|
|
132
|
+
description: 'HIPAA-compliant data encryption and access control',
|
|
133
|
+
stack: ['Node.js', 'PostgreSQL (encrypted)', 'Access Control']
|
|
134
|
+
}, {
|
|
135
|
+
name: 'audit-logs',
|
|
136
|
+
description: 'HIPAA audit trail and logging',
|
|
137
|
+
stack: ['CloudTrail', 'ELK Stack', 'Log Retention']
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
// PCI-DSS: Isolated payment service
|
|
141
|
+
if (compliance.some((c) => c.id === 'PCI-DSS')) {
|
|
142
|
+
projects.push({
|
|
143
|
+
name: 'payment-service',
|
|
144
|
+
description: 'PCI-DSS compliant payment processing (or use Stripe)',
|
|
145
|
+
stack: ['Node.js (PCI scope)', 'Stripe API', 'Tokenization']
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
return projects;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Get vision-specific projects
|
|
152
|
+
*/
|
|
153
|
+
getVisionProjects(vision) {
|
|
154
|
+
const projects = [];
|
|
155
|
+
// Mobile app
|
|
156
|
+
if (vision.keywords.includes('mobile') ||
|
|
157
|
+
vision.keywords.includes('app') ||
|
|
158
|
+
vision.keywords.includes('ios') ||
|
|
159
|
+
vision.keywords.includes('android')) {
|
|
160
|
+
projects.push({
|
|
161
|
+
name: 'mobile',
|
|
162
|
+
description: 'Mobile application',
|
|
163
|
+
stack: ['React Native', 'TypeScript']
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
// Payment/ecommerce
|
|
167
|
+
if (vision.keywords.includes('payment') ||
|
|
168
|
+
vision.keywords.includes('ecommerce') ||
|
|
169
|
+
vision.keywords.includes('shopping')) {
|
|
170
|
+
projects.push({
|
|
171
|
+
name: 'payment-service',
|
|
172
|
+
description: 'Payment processing service',
|
|
173
|
+
stack: ['Stripe', 'PayPal', 'Node.js']
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
// Notifications
|
|
177
|
+
if (vision.keywords.includes('notification') ||
|
|
178
|
+
vision.keywords.includes('messaging') ||
|
|
179
|
+
vision.keywords.includes('email')) {
|
|
180
|
+
projects.push({
|
|
181
|
+
name: 'notification-service',
|
|
182
|
+
description: 'Notification and messaging service',
|
|
183
|
+
stack: ['SendGrid', 'AWS SES', 'Node.js']
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
// Analytics/ML
|
|
187
|
+
if (vision.keywords.includes('analytics') ||
|
|
188
|
+
vision.keywords.includes('ml') ||
|
|
189
|
+
vision.keywords.includes('ai')) {
|
|
190
|
+
projects.push({
|
|
191
|
+
name: 'analytics-service',
|
|
192
|
+
description: 'Analytics and ML service',
|
|
193
|
+
stack: ['Python', 'TensorFlow', 'BigQuery']
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
return projects;
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Deduplicate projects by name (keep first occurrence)
|
|
200
|
+
*/
|
|
201
|
+
deduplicateProjects(projects) {
|
|
202
|
+
const seen = new Set();
|
|
203
|
+
return projects.filter((project) => {
|
|
204
|
+
if (seen.has(project.name)) {
|
|
205
|
+
return false;
|
|
206
|
+
}
|
|
207
|
+
seen.add(project.name);
|
|
208
|
+
return true;
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Singleton instance
|
|
214
|
+
*/
|
|
215
|
+
export const projectGenerator = new ProjectGenerator();
|
|
216
|
+
//# sourceMappingURL=ProjectGenerator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProjectGenerator.js","sourceRoot":"","sources":["../../../../src/init/architecture/ProjectGenerator.ts"],"names":[],"mappings":"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"}
|
|
@@ -199,6 +199,11 @@ export declare const ArchitectureRecommendationSchema: z.ZodObject<{
|
|
|
199
199
|
description?: string;
|
|
200
200
|
}[];
|
|
201
201
|
infrastructure?: string[];
|
|
202
|
+
alternatives?: {
|
|
203
|
+
architecture?: "serverless" | "traditional-monolith" | "microservices" | "modular-monolith" | "jamstack" | "hybrid";
|
|
204
|
+
pros?: string[];
|
|
205
|
+
cons?: string[];
|
|
206
|
+
}[];
|
|
202
207
|
rationale?: string;
|
|
203
208
|
costEstimate?: {
|
|
204
209
|
at1K?: string;
|
|
@@ -214,11 +219,6 @@ export declare const ArchitectureRecommendationSchema: z.ZodObject<{
|
|
|
214
219
|
duration?: string;
|
|
215
220
|
}[];
|
|
216
221
|
methodology?: "agile" | "waterfall";
|
|
217
|
-
alternatives?: {
|
|
218
|
-
architecture?: "serverless" | "traditional-monolith" | "microservices" | "modular-monolith" | "jamstack" | "hybrid";
|
|
219
|
-
pros?: string[];
|
|
220
|
-
cons?: string[];
|
|
221
|
-
}[];
|
|
222
222
|
}, {
|
|
223
223
|
architecture?: "serverless" | "traditional-monolith" | "microservices" | "modular-monolith" | "jamstack" | "hybrid";
|
|
224
224
|
projects?: {
|
|
@@ -227,6 +227,11 @@ export declare const ArchitectureRecommendationSchema: z.ZodObject<{
|
|
|
227
227
|
description?: string;
|
|
228
228
|
}[];
|
|
229
229
|
infrastructure?: string[];
|
|
230
|
+
alternatives?: {
|
|
231
|
+
architecture?: "serverless" | "traditional-monolith" | "microservices" | "modular-monolith" | "jamstack" | "hybrid";
|
|
232
|
+
pros?: string[];
|
|
233
|
+
cons?: string[];
|
|
234
|
+
}[];
|
|
230
235
|
rationale?: string;
|
|
231
236
|
costEstimate?: {
|
|
232
237
|
at1K?: string;
|
|
@@ -242,10 +247,5 @@ export declare const ArchitectureRecommendationSchema: z.ZodObject<{
|
|
|
242
247
|
duration?: string;
|
|
243
248
|
}[];
|
|
244
249
|
methodology?: "agile" | "waterfall";
|
|
245
|
-
alternatives?: {
|
|
246
|
-
architecture?: "serverless" | "traditional-monolith" | "microservices" | "modular-monolith" | "jamstack" | "hybrid";
|
|
247
|
-
pros?: string[];
|
|
248
|
-
cons?: string[];
|
|
249
|
-
}[];
|
|
250
250
|
}>;
|
|
251
251
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -68,6 +68,10 @@ export declare const SpecWeaveConfigSchema: z.ZodObject<{
|
|
|
68
68
|
name?: string;
|
|
69
69
|
type?: "single" | "multi";
|
|
70
70
|
};
|
|
71
|
+
livingDocs?: {
|
|
72
|
+
enabled?: boolean;
|
|
73
|
+
baseDir?: string;
|
|
74
|
+
};
|
|
71
75
|
research?: {
|
|
72
76
|
architecture?: any;
|
|
73
77
|
repositories?: string[];
|
|
@@ -75,16 +79,16 @@ export declare const SpecWeaveConfigSchema: z.ZodObject<{
|
|
|
75
79
|
vision?: any;
|
|
76
80
|
compliance?: any[];
|
|
77
81
|
};
|
|
78
|
-
livingDocs?: {
|
|
79
|
-
enabled?: boolean;
|
|
80
|
-
baseDir?: string;
|
|
81
|
-
};
|
|
82
82
|
}, {
|
|
83
83
|
version?: string;
|
|
84
84
|
project?: {
|
|
85
85
|
name?: string;
|
|
86
86
|
type?: "single" | "multi";
|
|
87
87
|
};
|
|
88
|
+
livingDocs?: {
|
|
89
|
+
enabled?: boolean;
|
|
90
|
+
baseDir?: string;
|
|
91
|
+
};
|
|
88
92
|
research?: {
|
|
89
93
|
architecture?: any;
|
|
90
94
|
repositories?: string[];
|
|
@@ -92,10 +96,6 @@ export declare const SpecWeaveConfigSchema: z.ZodObject<{
|
|
|
92
96
|
vision?: any;
|
|
93
97
|
compliance?: any[];
|
|
94
98
|
};
|
|
95
|
-
livingDocs?: {
|
|
96
|
-
enabled?: boolean;
|
|
97
|
-
baseDir?: string;
|
|
98
|
-
};
|
|
99
99
|
}>;
|
|
100
100
|
export type ResearchConfig = z.infer<typeof ResearchConfigSchema>;
|
|
101
101
|
export type SpecWeaveConfig = z.infer<typeof SpecWeaveConfigSchema>;
|
|
@@ -94,12 +94,12 @@ async function main() {
|
|
|
94
94
|
const client = new GitHubClient(config);
|
|
95
95
|
const result = await calculateDORAMetrics(client);
|
|
96
96
|
// Write JSON file
|
|
97
|
-
const jsonOutputPath = path.join(process.cwd(), 'metrics', 'dora-latest.json');
|
|
97
|
+
const jsonOutputPath = path.join(process.cwd(), '.specweave', 'metrics', 'dora-latest.json');
|
|
98
98
|
writeMetricsJSON(result.metrics, jsonOutputPath);
|
|
99
99
|
// Generate and write markdown report
|
|
100
100
|
console.log('\n📝 Generating detailed report...');
|
|
101
101
|
const report = generateMarkdownReport(result.metrics, result.releases, result.issues);
|
|
102
|
-
const reportOutputPath = path.join(process.cwd(), 'metrics', 'dora-report.md');
|
|
102
|
+
const reportOutputPath = path.join(process.cwd(), '.specweave', 'metrics', 'dora-report.md');
|
|
103
103
|
writeReport(report, reportOutputPath);
|
|
104
104
|
console.log('\n🎉 DORA metrics calculation complete!');
|
|
105
105
|
console.log(` 📊 JSON: ${jsonOutputPath}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dora-calculator.js","sourceRoot":"","sources":["../../../src/metrics/dora-calculator.ts"],"names":[],"mappings":";AACA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,4BAA4B,EAAE,MAAM,uCAAuC,CAAC;AACrF,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,0BAA0B,EAAE,MAAM,sCAAsC,CAAC;AAClF,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,sBAAsB,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAG5E;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,MAAoB;IAK7D,wCAAwC;IACxC,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC;IACzB,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC;IAEpC,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;IACnD,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IACjD,OAAO,CAAC,GAAG,CAAC,cAAc,QAAQ,CAAC,MAAM,WAAW,CAAC,CAAC;IAEtD,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC;QACjC,CAAC,CAAC,MAAM,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,gBAAgB,EAAE,IAAI,IAAI,EAAE,CAAC;QACnE,CAAC,CAAC,EAAE,CAAC;IACP,OAAO,CAAC,GAAG,CAAC,cAAc,OAAO,CAAC,MAAM,UAAU,CAAC,CAAC;IAEpD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC,UAAU,EAAE,gBAAgB,CAAC,EAAE,KAAK,CAAC,CAAC;IAC7E,OAAO,CAAC,GAAG,CAAC,cAAc,MAAM,CAAC,MAAM,YAAY,CAAC,CAAC;IAErD,oBAAoB;IACpB,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;IAEhD,MAAM,mBAAmB,GAAG,4BAA4B,CAAC,QAAQ,CAAC,CAAC;IACnE,OAAO,CAAC,GAAG,CAAC,8BAA8B,mBAAmB,CAAC,KAAK,IAAI,mBAAmB,CAAC,IAAI,KAAK,mBAAmB,CAAC,IAAI,GAAG,CAAC,CAAC;IAEjI,MAAM,QAAQ,GAAG,iBAAiB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACtD,OAAO,CAAC,GAAG,CAAC,mBAAmB,QAAQ,CAAC,KAAK,IAAI,QAAQ,CAAC,IAAI,KAAK,QAAQ,CAAC,IAAI,GAAG,CAAC,CAAC;IAErF,MAAM,iBAAiB,GAAG,0BAA0B,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACvE,OAAO,CAAC,GAAG,CAAC,6BAA6B,iBAAiB,CAAC,KAAK,MAAM,iBAAiB,CAAC,IAAI,GAAG,CAAC,CAAC;IAEjG,MAAM,IAAI,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IACnC,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;IAEpE,MAAM,aAAa,GAAgB;QACjC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,OAAO,EAAE;YACP,mBAAmB;YACnB,QAAQ;YACR,iBAAiB;YACjB,IAAI;SACL;KACF,CAAC;IAEF,OAAO;QACL,OAAO,EAAE,aAAa;QACtB,QAAQ;QACR,MAAM;KACP,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAoB,EAAE,QAAgB;IACrE,0BAA0B;IAC1B,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACnC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,CAAC;IAED,oCAAoC;IACpC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC9C,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IAE1C,OAAO,CAAC,GAAG,CAAC,0BAA0B,QAAQ,EAAE,CAAC,CAAC;AACpD,CAAC;AAED;;;;;GAKG;AACH,KAAK,UAAU,IAAI;IACjB,IAAI,CAAC;QACH,uCAAuC;QACvC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;QACvC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;QACnE,CAAC;QAED,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,wBAAwB,CAAC;QAC7E,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAE5C,MAAM,MAAM,GAAiB,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QAEpD,oBAAoB;QACpB,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;QACxC,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,MAAM,CAAC,CAAC;QAElD,kBAAkB;QAClB,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,kBAAkB,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"dora-calculator.js","sourceRoot":"","sources":["../../../src/metrics/dora-calculator.ts"],"names":[],"mappings":"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"}
|
|
@@ -64,7 +64,10 @@ export declare function getModelPricing(model: 'sonnet' | 'haiku' | 'opus'): {
|
|
|
64
64
|
* @param actualModel - Model actually used
|
|
65
65
|
* @param inputTokens - Input tokens
|
|
66
66
|
* @param outputTokens - Output tokens
|
|
67
|
-
* @returns
|
|
67
|
+
* @returns Object with savedAmount (dollars) and savedPercent (percentage)
|
|
68
68
|
*/
|
|
69
|
-
export declare function calculateSavings(actualModel: 'sonnet' | 'haiku' | 'opus', inputTokens: number, outputTokens: number):
|
|
69
|
+
export declare function calculateSavings(actualModel: 'sonnet' | 'haiku' | 'opus', inputTokens: number, outputTokens: number): {
|
|
70
|
+
savedAmount: number;
|
|
71
|
+
savedPercent: number;
|
|
72
|
+
};
|
|
70
73
|
//# sourceMappingURL=pricing-constants.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pricing-constants.d.ts","sourceRoot":"","sources":["../../../src/utils/pricing-constants.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH;;GAEG;AACH,eAAO,MAAM,OAAO;;;;;;;;;;;;;CAaV,CAAC;AAEX;;;;;;;;;;;;;GAaG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,QAAQ,GAAG,OAAO,GAAG,MAAM,EAClC,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,GACnB,MAAM,CAGR;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO,GAAG,MAAM;;;;;;;;;EAEjE;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAC9B,WAAW,EAAE,QAAQ,GAAG,OAAO,GAAG,MAAM,EACxC,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,GACnB,MAAM,
|
|
1
|
+
{"version":3,"file":"pricing-constants.d.ts","sourceRoot":"","sources":["../../../src/utils/pricing-constants.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH;;GAEG;AACH,eAAO,MAAM,OAAO;;;;;;;;;;;;;CAaV,CAAC;AAEX;;;;;;;;;;;;;GAaG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,QAAQ,GAAG,OAAO,GAAG,MAAM,EAClC,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,GACnB,MAAM,CAGR;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO,GAAG,MAAM;;;;;;;;;EAEjE;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAC9B,WAAW,EAAE,QAAQ,GAAG,OAAO,GAAG,MAAM,EACxC,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,GACnB;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAO/C"}
|
|
@@ -60,12 +60,13 @@ export function getModelPricing(model) {
|
|
|
60
60
|
* @param actualModel - Model actually used
|
|
61
61
|
* @param inputTokens - Input tokens
|
|
62
62
|
* @param outputTokens - Output tokens
|
|
63
|
-
* @returns
|
|
63
|
+
* @returns Object with savedAmount (dollars) and savedPercent (percentage)
|
|
64
64
|
*/
|
|
65
65
|
export function calculateSavings(actualModel, inputTokens, outputTokens) {
|
|
66
66
|
const actualCost = calculateCost(actualModel, inputTokens, outputTokens);
|
|
67
67
|
const baselineCost = calculateCost('sonnet', inputTokens, outputTokens);
|
|
68
68
|
const savedAmount = baselineCost - actualCost;
|
|
69
|
-
|
|
69
|
+
const savedPercent = baselineCost > 0 ? (savedAmount / baselineCost) * 100 : 0;
|
|
70
|
+
return { savedAmount, savedPercent };
|
|
70
71
|
}
|
|
71
72
|
//# sourceMappingURL=pricing-constants.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pricing-constants.js","sourceRoot":"","sources":["../../../src/utils/pricing-constants.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,MAAM,EAAE;QACN,KAAK,EAAE,QAAQ,EAAI,yBAAyB;QAC5C,MAAM,EAAE,QAAQ,EAAG,2BAA2B;KAC/C;IACD,KAAK,EAAE;QACL,KAAK,EAAE,QAAQ,EAAI,yBAAyB;QAC5C,MAAM,EAAE,QAAQ,EAAG,0BAA0B;KAC9C;IACD,IAAI,EAAE;QACJ,KAAK,EAAE,QAAQ,EAAI,0BAA0B;QAC7C,MAAM,EAAE,QAAQ,EAAG,2BAA2B;KAC/C;CACO,CAAC;AAEX;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,aAAa,CAC3B,KAAkC,EAClC,WAAmB,EACnB,YAAoB;IAEpB,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IAC/B,OAAO,CAAC,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;AACzE,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,KAAkC;IAChE,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC;AACxB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,gBAAgB,CAC9B,WAAwC,EACxC,WAAmB,EACnB,YAAoB;IAEpB,MAAM,UAAU,GAAG,aAAa,CAAC,WAAW,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC;IACzE,MAAM,YAAY,GAAG,aAAa,CAAC,QAAQ,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC;IACxE,MAAM,WAAW,GAAG,YAAY,GAAG,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"pricing-constants.js","sourceRoot":"","sources":["../../../src/utils/pricing-constants.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,MAAM,EAAE;QACN,KAAK,EAAE,QAAQ,EAAI,yBAAyB;QAC5C,MAAM,EAAE,QAAQ,EAAG,2BAA2B;KAC/C;IACD,KAAK,EAAE;QACL,KAAK,EAAE,QAAQ,EAAI,yBAAyB;QAC5C,MAAM,EAAE,QAAQ,EAAG,0BAA0B;KAC9C;IACD,IAAI,EAAE;QACJ,KAAK,EAAE,QAAQ,EAAI,0BAA0B;QAC7C,MAAM,EAAE,QAAQ,EAAG,2BAA2B;KAC/C;CACO,CAAC;AAEX;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,aAAa,CAC3B,KAAkC,EAClC,WAAmB,EACnB,YAAoB;IAEpB,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IAC/B,OAAO,CAAC,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;AACzE,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,KAAkC;IAChE,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC;AACxB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,gBAAgB,CAC9B,WAAwC,EACxC,WAAmB,EACnB,YAAoB;IAEpB,MAAM,UAAU,GAAG,aAAa,CAAC,WAAW,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC;IACzE,MAAM,YAAY,GAAG,aAAa,CAAC,QAAQ,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC;IACxE,MAAM,WAAW,GAAG,YAAY,GAAG,UAAU,CAAC;IAC9C,MAAM,YAAY,GAAG,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,GAAG,YAAY,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAE/E,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC;AACvC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "specweave",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.22.2",
|
|
4
4
|
"description": "Spec-driven development framework for Claude Code. AI-native workflow with living documentation, intelligent agents, and multilingual support (9 languages). Enterprise-grade traceability with permanent specs and temporary increments.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -16,17 +16,18 @@
|
|
|
16
16
|
"dev": "tsc --watch",
|
|
17
17
|
"prepare": "npm run build",
|
|
18
18
|
"prepublishOnly": "npm run rebuild",
|
|
19
|
-
"test:unit": "
|
|
20
|
-
"test:integration": "
|
|
19
|
+
"test:unit": "vitest run tests/unit --coverage",
|
|
20
|
+
"test:integration": "vitest run tests/integration --coverage",
|
|
21
21
|
"test:smoke": "bash tests/smoke/smoke-test.sh",
|
|
22
22
|
"test:e2e": "playwright test tests/e2e/ --grep-invert=\"(should default to claude adapter|should use claude adapter when explicitly requested|should use generic adapter|should create .claude|should initialize project with specweave init|should create correct directory structure|should handle non-interactive mode correctly|should validate config.json structure|should create .specweave directory structure|should create CLAUDE.md and AGENTS.md|should initialize git repository|should install SpecWeave|should scaffold SaaS|should create proper directory|should create required configuration|should install core skills|should install core agents|should have deployment|should have Stripe|ADO Sync|Increment Discipline Blocking|Self-Reflection|Increment Discipline Enforcement)\"",
|
|
23
23
|
"test:all": "npm run test:unit && npm run test:integration && npm run test:e2e",
|
|
24
|
-
"test:coverage": "
|
|
24
|
+
"test:coverage": "vitest run --coverage",
|
|
25
25
|
"test": "npm run test:smoke",
|
|
26
26
|
"benchmark": "ts-node tests/performance/run-all-benchmarks.ts",
|
|
27
27
|
"validate:plugins": "node scripts/validate-plugin-manifests.cjs",
|
|
28
28
|
"validate:platforms": "npx ts-node scripts/validate-platforms.ts",
|
|
29
29
|
"metrics:dora": "node dist/src/metrics/dora-calculator.js",
|
|
30
|
+
"migrate:copy-sync": "node scripts/migrate-to-copy-based-sync.js",
|
|
30
31
|
"generate:diagrams": "bash scripts/generate-diagram-svgs.sh",
|
|
31
32
|
"docs:dev": "cd docs-site && npm start",
|
|
32
33
|
"docs:build": "cd docs-site && npm run build",
|
|
@@ -94,15 +95,15 @@
|
|
|
94
95
|
"@playwright/test": "^1.48.0",
|
|
95
96
|
"@types/fs-extra": "^11.0.4",
|
|
96
97
|
"@types/inquirer": "^9.0.7",
|
|
97
|
-
"@types/jest": "^30.0.0",
|
|
98
98
|
"@types/js-yaml": "^4.0.9",
|
|
99
99
|
"@types/node": "^24.10.0",
|
|
100
|
+
"@vitest/coverage-v8": "^2.1.9",
|
|
101
|
+
"@vitest/ui": "^2.1.9",
|
|
100
102
|
"ajv": "^8.17.1",
|
|
101
103
|
"ajv-formats": "^3.0.1",
|
|
102
104
|
"dotenv": "^17.2.3",
|
|
103
105
|
"gray-matter": "^4.0.3",
|
|
104
|
-
"
|
|
105
|
-
"
|
|
106
|
-
"typescript": "^5.3.0"
|
|
106
|
+
"typescript": "^5.3.0",
|
|
107
|
+
"vitest": "^2.1.9"
|
|
107
108
|
}
|
|
108
109
|
}
|
|
@@ -60,24 +60,38 @@ I generate Terraform configurations for 5 serverless platforms:
|
|
|
60
60
|
|
|
61
61
|
### 2. Template Engine Integration
|
|
62
62
|
|
|
63
|
-
I use the **TerraformTemplateEngine** to render Handlebars templates:
|
|
64
|
-
|
|
65
|
-
**Template Location**: `plugins/specweave/
|
|
66
|
-
|
|
67
|
-
**
|
|
68
|
-
- `
|
|
69
|
-
- `
|
|
70
|
-
- `
|
|
71
|
-
- `
|
|
72
|
-
- `
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
- `
|
|
77
|
-
- `
|
|
78
|
-
- `
|
|
79
|
-
- `
|
|
63
|
+
I use the **TerraformTemplateEngine** to render Handlebars templates with full serverless platform support:
|
|
64
|
+
|
|
65
|
+
**Template Location**: `plugins/specweave/templates/iac/{platform}/`
|
|
66
|
+
|
|
67
|
+
**Supported Platforms**:
|
|
68
|
+
- `aws-lambda/` - AWS Lambda + API Gateway + DynamoDB
|
|
69
|
+
- `azure-functions/` - Azure Functions + Cosmos DB
|
|
70
|
+
- `gcp-cloud-functions/` - GCP Cloud Functions + Firestore
|
|
71
|
+
- `firebase/` - Firebase Hosting + Functions + Firestore
|
|
72
|
+
- `supabase/` - Supabase (PostgreSQL + Auth + Storage)
|
|
73
|
+
|
|
74
|
+
**Template Files** (each platform has):
|
|
75
|
+
- `templates/main.tf.hbs` - Core infrastructure resources
|
|
76
|
+
- `templates/variables.tf.hbs` - Input variables with defaults
|
|
77
|
+
- `templates/outputs.tf.hbs` - Output values (URLs, ARNs, IDs)
|
|
78
|
+
- `templates/providers.tf.hbs` - Cloud provider configuration
|
|
79
|
+
- `templates/iam.tf.hbs` - IAM roles, policies, service accounts (AWS/GCP)
|
|
80
|
+
- `templates/README.md.hbs` - Deployment instructions and cost estimates
|
|
81
|
+
- `templates/environments/dev.tfvars.hbs` - Development config (free tier optimized)
|
|
82
|
+
- `templates/environments/staging.tfvars.hbs` - Staging config
|
|
83
|
+
- `templates/environments/prod.tfvars.hbs` - Production config (HA, backup)
|
|
84
|
+
- `defaults.json` - Default values for template variables
|
|
85
|
+
|
|
86
|
+
**Custom Handlebars Helpers**:
|
|
87
|
+
- `{{snakeCase name}}` - Convert to snake_case (e.g., "myFunction" → "my_function")
|
|
88
|
+
- `{{kebabCase name}}` - Convert to kebab-case (e.g., "myFunction" → "my-function")
|
|
89
|
+
- `{{tfList items}}` - Format array as Terraform list (e.g., ["a","b"] → `["a", "b"]`)
|
|
90
|
+
- `{{tfMap obj}}` - Format object as Terraform map
|
|
80
91
|
- `{{#if (eq var "value")}}...{{/if}}` - Conditional rendering
|
|
92
|
+
- `{{#each items}}...{{/each}}` - Loop over arrays
|
|
93
|
+
- `{{multiply a b}}` - Arithmetic operations
|
|
94
|
+
- `{{add a b}}` - Addition for cost calculations
|
|
81
95
|
|
|
82
96
|
### 3. Environment-Specific Configurations
|
|
83
97
|
|
|
@@ -156,37 +170,65 @@ Architect Agent: → Recommends: AWS Lambda for startup project
|
|
|
156
170
|
|
|
157
171
|
Infrastructure Agent (me):
|
|
158
172
|
1. Load Templates:
|
|
159
|
-
- Locate: plugins/specweave/
|
|
160
|
-
- Read
|
|
173
|
+
- Locate: plugins/specweave/templates/iac/aws-lambda/
|
|
174
|
+
- Read all template files:
|
|
175
|
+
* templates/main.tf.hbs
|
|
176
|
+
* templates/variables.tf.hbs
|
|
177
|
+
* templates/outputs.tf.hbs
|
|
178
|
+
* templates/providers.tf.hbs
|
|
179
|
+
* templates/iam.tf.hbs
|
|
180
|
+
* templates/README.md.hbs
|
|
181
|
+
* templates/environments/*.tfvars.hbs
|
|
161
182
|
|
|
162
183
|
2. Merge Defaults:
|
|
163
|
-
- Load: aws-lambda/
|
|
164
|
-
- Merge: defaults +
|
|
165
|
-
- Result: Complete variable set
|
|
184
|
+
- Load: defaults.json from aws-lambda/
|
|
185
|
+
- Merge: defaults + architect recommendation metadata
|
|
186
|
+
- Result: Complete variable set with all required values
|
|
166
187
|
|
|
167
188
|
3. Render Templates:
|
|
168
|
-
- Use:
|
|
169
|
-
- Render: Each .hbs file →
|
|
170
|
-
- Apply: Custom helpers (snakeCase, conditionals)
|
|
189
|
+
- Use: Handlebars template engine
|
|
190
|
+
- Render: Each .hbs file → corresponding output file
|
|
191
|
+
- Apply: Custom helpers (snakeCase, tfList, conditionals, loops)
|
|
192
|
+
- Substitute: All {{variableName}} placeholders with actual values
|
|
171
193
|
|
|
172
194
|
4. Generate Environment Configs:
|
|
173
|
-
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
-
|
|
177
|
-
|
|
178
|
-
|
|
195
|
+
- Dev environment:
|
|
196
|
+
* Render: templates/environments/dev.tfvars.hbs → dev.tfvars
|
|
197
|
+
* Optimize: Free tier settings (min resources, pay-per-request)
|
|
198
|
+
- Staging environment:
|
|
199
|
+
* Render: templates/environments/staging.tfvars.hbs → staging.tfvars
|
|
200
|
+
* Balance: Performance vs cost
|
|
201
|
+
- Production environment:
|
|
202
|
+
* Render: templates/environments/prod.tfvars.hbs → prod.tfvars
|
|
203
|
+
* Maximize: Availability, backup, multi-region
|
|
179
204
|
|
|
180
205
|
5. Write Files:
|
|
181
|
-
- Create: .infrastructure/aws-lambda/ directory
|
|
182
|
-
- Write
|
|
183
|
-
|
|
184
|
-
|
|
206
|
+
- Create: .infrastructure/aws-lambda/ directory in project root
|
|
207
|
+
- Write Terraform files:
|
|
208
|
+
* main.tf (infrastructure resources)
|
|
209
|
+
* variables.tf (input variables)
|
|
210
|
+
* outputs.tf (output values)
|
|
211
|
+
* providers.tf (AWS provider config)
|
|
212
|
+
* iam.tf (IAM roles and policies)
|
|
213
|
+
- Write documentation:
|
|
214
|
+
* README.md (deployment instructions, cost estimates, troubleshooting)
|
|
215
|
+
- Write environment configs:
|
|
216
|
+
* environments/dev.tfvars
|
|
217
|
+
* environments/staging.tfvars
|
|
218
|
+
* environments/prod.tfvars
|
|
185
219
|
|
|
186
220
|
6. Output Summary:
|
|
187
221
|
✅ Generated 9 files in .infrastructure/aws-lambda/
|
|
188
|
-
📄 Review files
|
|
189
|
-
|
|
222
|
+
📄 Review generated files:
|
|
223
|
+
- main.tf: Lambda, API Gateway, DynamoDB resources
|
|
224
|
+
- iam.tf: Least-privilege IAM roles
|
|
225
|
+
- README.md: Deployment guide with cost estimates
|
|
226
|
+
💰 Estimated cost (dev): $0/month (free tier)
|
|
227
|
+
🚀 Next steps:
|
|
228
|
+
1. Review infrastructure files
|
|
229
|
+
2. Run: terraform init
|
|
230
|
+
3. Run: terraform plan -var-file="environments/dev.tfvars"
|
|
231
|
+
4. Run: terraform apply -var-file="environments/dev.tfvars"
|
|
190
232
|
```
|
|
191
233
|
|
|
192
234
|
### Workflow 2: Multi-Environment Deployment
|
|
@@ -239,12 +281,12 @@ Infrastructure Agent:
|
|
|
239
281
|
**My Process**:
|
|
240
282
|
```
|
|
241
283
|
1. Load Templates:
|
|
242
|
-
✅ plugins/specweave/
|
|
243
|
-
✅ plugins/specweave/
|
|
244
|
-
✅ plugins/specweave/
|
|
245
|
-
✅ plugins/specweave/
|
|
246
|
-
✅ plugins/specweave/
|
|
247
|
-
✅ plugins/specweave/
|
|
284
|
+
✅ plugins/specweave/templates/iac/aws-lambda/main.tf.hbs
|
|
285
|
+
✅ plugins/specweave/templates/iac/aws-lambda/variables.tf.hbs
|
|
286
|
+
✅ plugins/specweave/templates/iac/aws-lambda/outputs.tf.hbs
|
|
287
|
+
✅ plugins/specweave/templates/iac/aws-lambda/provider.tf.hbs
|
|
288
|
+
✅ plugins/specweave/templates/iac/aws-lambda/iam.tf.hbs
|
|
289
|
+
✅ plugins/specweave/templates/iac/aws-lambda/README.md.hbs
|
|
248
290
|
|
|
249
291
|
2. Render with Variables:
|
|
250
292
|
- projectName: "my-startup-api"
|
|
@@ -362,7 +404,7 @@ import { TerraformTemplateEngine } from '@specweave/core/iac/template-engine';
|
|
|
362
404
|
|
|
363
405
|
const engine = new TerraformTemplateEngine();
|
|
364
406
|
const result = await engine.render({
|
|
365
|
-
templatePath: 'plugins/specweave/
|
|
407
|
+
templatePath: 'plugins/specweave/templates/iac/aws-lambda',
|
|
366
408
|
variables: {
|
|
367
409
|
projectName: 'my-api',
|
|
368
410
|
functionName: 'my-handler',
|
|
@@ -406,7 +448,7 @@ const platformTemplateMap = {
|
|
|
406
448
|
'supabase': 'supabase'
|
|
407
449
|
};
|
|
408
450
|
|
|
409
|
-
const templateDir = `plugins/specweave/iac
|
|
451
|
+
const templateDir = `plugins/specweave/templates/iac/${platformTemplateMap[platformId]}`;
|
|
410
452
|
```
|
|
411
453
|
|
|
412
454
|
**Required Files**:
|
|
@@ -694,7 +736,7 @@ for (const env of environments) {
|
|
|
694
736
|
**Solution**:
|
|
695
737
|
```bash
|
|
696
738
|
# Verify template exists
|
|
697
|
-
ls plugins/specweave/
|
|
739
|
+
ls plugins/specweave/templates/iac/aws-lambda/
|
|
698
740
|
|
|
699
741
|
# Check platform ID mapping
|
|
700
742
|
# Valid IDs: aws-lambda, azure-functions, gcp-cloud-functions, firebase, supabase
|