specweave 0.22.0 → 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 +211 -0
- package/README.md +5 -5
- package/bin/specweave.js +5 -8
- package/dist/plugins/specweave-github/lib/CodeValidator.d.ts +1 -1
- package/dist/plugins/specweave-github/lib/CodeValidator.js +1 -1
- 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/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 +50 -50
- 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/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/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/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/architecture/types.d.ts +10 -10
- 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 +4 -4
- 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-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.ts +1 -1
- 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-jira/lib/enhanced-jira-sync.js +3 -3
- package/plugins/specweave-release/hooks/.specweave/logs/dora-tracking.log +2022 -0
- 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,195 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workflow Orchestrator - Core orchestration logic for /specweave:next
|
|
3
|
+
*
|
|
4
|
+
* Coordinates workflow execution by detecting current phase and
|
|
5
|
+
* invoking appropriate commands.
|
|
6
|
+
*
|
|
7
|
+
* Part of increment 0039: Ultra-Smart Next Command
|
|
8
|
+
*
|
|
9
|
+
* @module core/workflow/workflow-orchestrator
|
|
10
|
+
* @since v0.22.0
|
|
11
|
+
*/
|
|
12
|
+
import { PhaseDetector } from './phase-detector.js';
|
|
13
|
+
import { WorkflowPhase } from './types.js';
|
|
14
|
+
import { ActiveIncrementManager } from '../increment/active-increment-manager.js';
|
|
15
|
+
/**
|
|
16
|
+
* Workflow Orchestrator - Coordinates intelligent workflow execution
|
|
17
|
+
*
|
|
18
|
+
* This is a simplified initial implementation focusing on core phase detection.
|
|
19
|
+
* Full autonomous execution will be added in future tasks.
|
|
20
|
+
*/
|
|
21
|
+
export class WorkflowOrchestrator {
|
|
22
|
+
constructor() {
|
|
23
|
+
this.phaseDetector = new PhaseDetector();
|
|
24
|
+
this.activeIncrementManager = new ActiveIncrementManager();
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Execute next step in workflow (interactive mode)
|
|
28
|
+
*
|
|
29
|
+
* Detects current phase and suggests/executes appropriate action.
|
|
30
|
+
*
|
|
31
|
+
* @param incrementId - Optional increment ID (auto-detects if not provided)
|
|
32
|
+
* @param options - Execution options
|
|
33
|
+
* @returns Workflow execution result
|
|
34
|
+
*/
|
|
35
|
+
async executeNext(incrementId, options = {}) {
|
|
36
|
+
try {
|
|
37
|
+
// Phase 1: Detect current workflow phase
|
|
38
|
+
const detection = await this.detectCurrentPhase(incrementId);
|
|
39
|
+
// Phase 2: Determine action based on phase and confidence
|
|
40
|
+
const action = this.determineAction(detection, options);
|
|
41
|
+
// Format reasoning from detection evidence
|
|
42
|
+
const reasoning = this.formatReasoning(detection);
|
|
43
|
+
// Phase 3: Execute action (or return suggestion)
|
|
44
|
+
if (options.dryRun) {
|
|
45
|
+
return {
|
|
46
|
+
success: true,
|
|
47
|
+
phase: detection.phase,
|
|
48
|
+
confidence: detection.confidence,
|
|
49
|
+
action: action.description,
|
|
50
|
+
reasoning: `[DRY RUN] Would execute: ${action.description}\n\n${reasoning}`
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
// For now, return suggestion (actual execution will be added in later tasks)
|
|
54
|
+
return {
|
|
55
|
+
success: true,
|
|
56
|
+
phase: detection.phase,
|
|
57
|
+
confidence: detection.confidence,
|
|
58
|
+
action: action.description,
|
|
59
|
+
command: action.command,
|
|
60
|
+
reasoning
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
return {
|
|
65
|
+
success: false,
|
|
66
|
+
phase: WorkflowPhase.UNKNOWN,
|
|
67
|
+
confidence: 0,
|
|
68
|
+
error: error instanceof Error ? error.message : String(error),
|
|
69
|
+
reasoning: 'Failed to detect workflow phase or execute action'
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Format reasoning from phase detection result
|
|
75
|
+
*/
|
|
76
|
+
formatReasoning(detection) {
|
|
77
|
+
const parts = [];
|
|
78
|
+
// Add suggestion reason if present
|
|
79
|
+
if (detection.suggestionReason) {
|
|
80
|
+
parts.push(detection.suggestionReason);
|
|
81
|
+
}
|
|
82
|
+
// Add evidence summary
|
|
83
|
+
if (detection.evidence && detection.evidence.length > 0) {
|
|
84
|
+
parts.push('\nEvidence:');
|
|
85
|
+
detection.evidence.forEach(ev => {
|
|
86
|
+
parts.push(`- ${ev.description} (${(ev.weight * 100).toFixed(0)}% weight)`);
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
return parts.join('\n');
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Detect current workflow phase for increment
|
|
93
|
+
*
|
|
94
|
+
* @param incrementId - Increment ID (auto-detects if not provided)
|
|
95
|
+
* @returns Phase detection result
|
|
96
|
+
*/
|
|
97
|
+
async detectCurrentPhase(incrementId) {
|
|
98
|
+
// If no increment ID provided, try to auto-detect active increment
|
|
99
|
+
if (!incrementId) {
|
|
100
|
+
incrementId = await this.detectActiveIncrement();
|
|
101
|
+
}
|
|
102
|
+
// Build detection context
|
|
103
|
+
const context = {
|
|
104
|
+
userPrompt: 'Detect current workflow phase',
|
|
105
|
+
incrementId,
|
|
106
|
+
workingDirectory: process.cwd()
|
|
107
|
+
};
|
|
108
|
+
// Detect phase using PhaseDetector
|
|
109
|
+
return this.phaseDetector.detect(context);
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Auto-detect active increment
|
|
113
|
+
*
|
|
114
|
+
* @returns Increment ID or throws if none found
|
|
115
|
+
*/
|
|
116
|
+
async detectActiveIncrement() {
|
|
117
|
+
const activeIds = this.activeIncrementManager.getActive();
|
|
118
|
+
if (activeIds.length === 0) {
|
|
119
|
+
throw new Error('No active increments found. Use /specweave:increment to create one.');
|
|
120
|
+
}
|
|
121
|
+
if (activeIds.length === 1) {
|
|
122
|
+
return activeIds[0];
|
|
123
|
+
}
|
|
124
|
+
// Multiple active increments - return primary (first)
|
|
125
|
+
console.log(`Multiple active increments detected: ${activeIds.join(', ')}`);
|
|
126
|
+
console.log(`Using primary increment: ${activeIds[0]}`);
|
|
127
|
+
return activeIds[0];
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Determine action based on phase and confidence
|
|
131
|
+
*
|
|
132
|
+
* @param detection - Phase detection result
|
|
133
|
+
* @param options - Execution options
|
|
134
|
+
* @returns Suggested action
|
|
135
|
+
*/
|
|
136
|
+
determineAction(detection, options) {
|
|
137
|
+
const { phase, confidence } = detection;
|
|
138
|
+
// Low confidence - prompt user
|
|
139
|
+
if (confidence < 0.7 && !options.force) {
|
|
140
|
+
return {
|
|
141
|
+
description: `Phase detection confidence is low (${(confidence * 100).toFixed(0)}%). Please specify action manually.`,
|
|
142
|
+
command: undefined
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
// Map phase to action
|
|
146
|
+
switch (phase) {
|
|
147
|
+
case WorkflowPhase.PLAN_GENERATION:
|
|
148
|
+
return {
|
|
149
|
+
description: 'Generate implementation plan',
|
|
150
|
+
command: '/specweave:plan'
|
|
151
|
+
};
|
|
152
|
+
case WorkflowPhase.IMPLEMENTATION:
|
|
153
|
+
return {
|
|
154
|
+
description: 'Execute tasks',
|
|
155
|
+
command: '/specweave:do'
|
|
156
|
+
};
|
|
157
|
+
case WorkflowPhase.TESTING:
|
|
158
|
+
return {
|
|
159
|
+
description: 'Run tests',
|
|
160
|
+
command: 'npm test'
|
|
161
|
+
};
|
|
162
|
+
case WorkflowPhase.REVIEW:
|
|
163
|
+
return {
|
|
164
|
+
description: 'Run quality assessment',
|
|
165
|
+
command: '/specweave:qa'
|
|
166
|
+
};
|
|
167
|
+
case WorkflowPhase.COMPLETION:
|
|
168
|
+
return {
|
|
169
|
+
description: 'Close increment',
|
|
170
|
+
command: '/specweave:done'
|
|
171
|
+
};
|
|
172
|
+
case WorkflowPhase.SPEC_WRITING:
|
|
173
|
+
return {
|
|
174
|
+
description: 'Complete spec.md and generate plan',
|
|
175
|
+
command: '/specweave:plan'
|
|
176
|
+
};
|
|
177
|
+
case WorkflowPhase.TASK_BREAKDOWN:
|
|
178
|
+
return {
|
|
179
|
+
description: 'Create tasks and start implementation',
|
|
180
|
+
command: '/specweave:do'
|
|
181
|
+
};
|
|
182
|
+
case WorkflowPhase.DOCUMENTATION:
|
|
183
|
+
return {
|
|
184
|
+
description: 'Update living documentation',
|
|
185
|
+
command: '/specweave:sync-docs update'
|
|
186
|
+
};
|
|
187
|
+
default:
|
|
188
|
+
return {
|
|
189
|
+
description: 'Phase detection unclear - please specify action manually',
|
|
190
|
+
command: undefined
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
//# sourceMappingURL=workflow-orchestrator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-orchestrator.js","sourceRoot":"","sources":["../../../../src/core/workflow/workflow-orchestrator.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
|
|
@@ -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":"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
|
|
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.22.
|
|
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",
|
|
@@ -97,13 +97,13 @@
|
|
|
97
97
|
"@types/inquirer": "^9.0.7",
|
|
98
98
|
"@types/js-yaml": "^4.0.9",
|
|
99
99
|
"@types/node": "^24.10.0",
|
|
100
|
-
"@vitest/coverage-v8": "^2.1.
|
|
101
|
-
"@vitest/ui": "^2.1.
|
|
100
|
+
"@vitest/coverage-v8": "^2.1.9",
|
|
101
|
+
"@vitest/ui": "^2.1.9",
|
|
102
102
|
"ajv": "^8.17.1",
|
|
103
103
|
"ajv-formats": "^3.0.1",
|
|
104
104
|
"dotenv": "^17.2.3",
|
|
105
105
|
"gray-matter": "^4.0.3",
|
|
106
106
|
"typescript": "^5.3.0",
|
|
107
|
-
"vitest": "^2.1.
|
|
107
|
+
"vitest": "^2.1.9"
|
|
108
108
|
}
|
|
109
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
|
|
@@ -10,6 +10,50 @@ fallback_behavior: strict
|
|
|
10
10
|
|
|
11
11
|
# PM Agent - Product Manager AI Assistant
|
|
12
12
|
|
|
13
|
+
## ⛔ CRITICAL: Increment Folder Structure (MANDATORY)
|
|
14
|
+
|
|
15
|
+
**ALL files created by this agent MUST follow this structure**:
|
|
16
|
+
|
|
17
|
+
### Allowed Files in Increment Root
|
|
18
|
+
**ONLY these 3 files are allowed** in `.specweave/increments/####-name/`:
|
|
19
|
+
1. ✅ `spec.md` - Specification
|
|
20
|
+
2. ✅ `plan.md` - Implementation plan
|
|
21
|
+
3. ✅ `tasks.md` - Tasks with embedded tests
|
|
22
|
+
|
|
23
|
+
### ALL Other Files Go in Subfolders
|
|
24
|
+
|
|
25
|
+
**MANDATORY subfolder organization**:
|
|
26
|
+
```
|
|
27
|
+
.specweave/increments/####-name/
|
|
28
|
+
├── spec.md # ✅ ONLY core file 1
|
|
29
|
+
├── plan.md # ✅ ONLY core file 2
|
|
30
|
+
├── tasks.md # ✅ ONLY core file 3
|
|
31
|
+
├── reports/ # ✅ ALL reports here
|
|
32
|
+
│ ├── PM-VALIDATION-REPORT.md
|
|
33
|
+
│ ├── COMPLETION-SUMMARY.md
|
|
34
|
+
│ ├── SESSION-NOTES.md
|
|
35
|
+
│ └── ANALYSIS-*.md
|
|
36
|
+
├── scripts/ # ✅ ALL scripts here
|
|
37
|
+
│ └── helper-*.sh
|
|
38
|
+
└── logs/ # ✅ ALL logs here
|
|
39
|
+
└── execution.log
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
**When writing ANY file**:
|
|
43
|
+
- ❌ **NEVER** write `.md` files to increment root (except spec.md, plan.md, tasks.md)
|
|
44
|
+
- ✅ **ALWAYS** write reports to `reports/` subfolder
|
|
45
|
+
- ✅ **ALWAYS** write scripts to `scripts/` subfolder
|
|
46
|
+
- ✅ **ALWAYS** write logs to `logs/` subfolder
|
|
47
|
+
|
|
48
|
+
**Example correct paths**:
|
|
49
|
+
- ✅ `.specweave/increments/0001-auth/reports/PM-VALIDATION-REPORT.md`
|
|
50
|
+
- ✅ `.specweave/increments/0001-auth/reports/COMPLETION-SUMMARY.md`
|
|
51
|
+
- ❌ `.specweave/increments/0001-auth/PM-VALIDATION-REPORT.md` (WRONG!)
|
|
52
|
+
|
|
53
|
+
**This is NON-NEGOTIABLE**. Violations will be flagged and files will be moved by maintainers.
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
13
57
|
## 📚 Required Reading (LOAD FIRST)
|
|
14
58
|
|
|
15
59
|
**CRITICAL**: Before planning features or increments, read these guides:
|
|
@@ -1164,10 +1208,23 @@ When creating metadata.json, extract values from spec.md frontmatter:
|
|
|
1164
1208
|
- `priority`: Look for `priority: P1|P2|P3`
|
|
1165
1209
|
- `testMode`: Look for `test_mode: TDD|BDD|Standard` (default: "TDD")
|
|
1166
1210
|
- `coverageTarget`: Look for `coverage_target: 80|85|90|95|100` (default: 95)
|
|
1167
|
-
- `epic`:
|
|
1211
|
+
- `epic`: **CRITICAL - Format depends on increment type**:
|
|
1212
|
+
- **Greenfield** (SpecWeave-native): Leave EMPTY (auto-generated as `FS-{increment-number}` during sync)
|
|
1213
|
+
- **Brownfield** (imported from Jira/GitHub/ADO): Use `epic: FS-YY-MM-DD-name` + add `imported: true`
|
|
1168
1214
|
|
|
1169
1215
|
**DO NOT hardcode values** - always extract from spec.md when possible!
|
|
1170
1216
|
|
|
1217
|
+
**⛔ CRITICAL: Epic Field Rules**
|
|
1218
|
+
|
|
1219
|
+
When creating spec.md frontmatter:
|
|
1220
|
+
- **NEW increments** (greenfield): DO NOT add `epic:` field (leave it empty for auto-generation)
|
|
1221
|
+
- **Imported work** (brownfield): Add `epic: FS-YY-MM-DD-name` AND `imported: true`
|
|
1222
|
+
|
|
1223
|
+
**Why this matters**:
|
|
1224
|
+
- Greenfield increments use `FS-{increment-number}` format (e.g., `FS-031`, `FS-043`)
|
|
1225
|
+
- Brownfield increments use `FS-YY-MM-DD-name` format (e.g., `FS-25-11-14-jira-epic`)
|
|
1226
|
+
- Mixing formats pollutes living docs and breaks feature tracking
|
|
1227
|
+
|
|
1171
1228
|
### Code Reference (TypeScript Pseudocode)
|
|
1172
1229
|
|
|
1173
1230
|
This is what you're executing with Read/Write tools:
|