specweave 0.3.13 → 0.4.1
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 +506 -17
- package/README.md +100 -58
- package/bin/install-all.sh +9 -2
- package/bin/install-hooks.sh +57 -0
- package/bin/specweave.js +16 -0
- package/dist/adapters/adapter-base.d.ts +21 -0
- package/dist/adapters/adapter-base.d.ts.map +1 -1
- package/dist/adapters/adapter-base.js +28 -0
- package/dist/adapters/adapter-base.js.map +1 -1
- package/dist/adapters/adapter-interface.d.ts +41 -0
- package/dist/adapters/adapter-interface.d.ts.map +1 -1
- package/dist/adapters/claude/adapter.d.ts +36 -0
- package/dist/adapters/claude/adapter.d.ts.map +1 -1
- package/dist/adapters/claude/adapter.js +135 -0
- package/dist/adapters/claude/adapter.js.map +1 -1
- package/dist/adapters/copilot/adapter.d.ts +25 -0
- package/dist/adapters/copilot/adapter.d.ts.map +1 -1
- package/dist/adapters/copilot/adapter.js +112 -0
- package/dist/adapters/copilot/adapter.js.map +1 -1
- package/dist/adapters/cursor/adapter.d.ts +36 -0
- package/dist/adapters/cursor/adapter.d.ts.map +1 -1
- package/dist/adapters/cursor/adapter.js +140 -0
- package/dist/adapters/cursor/adapter.js.map +1 -1
- package/dist/adapters/generic/adapter.d.ts +25 -0
- package/dist/adapters/generic/adapter.d.ts.map +1 -1
- package/dist/adapters/generic/adapter.js +111 -0
- package/dist/adapters/generic/adapter.js.map +1 -1
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +103 -1
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/plugin.d.ts +37 -0
- package/dist/cli/commands/plugin.d.ts.map +1 -0
- package/dist/cli/commands/plugin.js +296 -0
- package/dist/cli/commands/plugin.js.map +1 -0
- package/dist/core/agent-model-manager.d.ts +52 -0
- package/dist/core/agent-model-manager.d.ts.map +1 -0
- package/dist/core/agent-model-manager.js +120 -0
- package/dist/core/agent-model-manager.js.map +1 -0
- package/dist/core/cost-tracker.d.ts +108 -0
- package/dist/core/cost-tracker.d.ts.map +1 -0
- package/dist/core/cost-tracker.js +281 -0
- package/dist/core/cost-tracker.js.map +1 -0
- package/dist/core/model-selector.d.ts +57 -0
- package/dist/core/model-selector.d.ts.map +1 -0
- package/dist/core/model-selector.js +115 -0
- package/dist/core/model-selector.js.map +1 -0
- package/dist/core/phase-detector.d.ts +62 -0
- package/dist/core/phase-detector.d.ts.map +1 -0
- package/dist/core/phase-detector.js +229 -0
- package/dist/core/phase-detector.js.map +1 -0
- package/dist/core/plugin-detector.d.ts +96 -0
- package/dist/core/plugin-detector.d.ts.map +1 -0
- package/dist/core/plugin-detector.js +349 -0
- package/dist/core/plugin-detector.js.map +1 -0
- package/dist/core/plugin-loader.d.ts +111 -0
- package/dist/core/plugin-loader.d.ts.map +1 -0
- package/dist/core/plugin-loader.js +319 -0
- package/dist/core/plugin-loader.js.map +1 -0
- package/dist/core/plugin-manager.d.ts +144 -0
- package/dist/core/plugin-manager.d.ts.map +1 -0
- package/dist/core/plugin-manager.js +393 -0
- package/dist/core/plugin-manager.js.map +1 -0
- package/dist/core/schemas/plugin-manifest.schema.json +253 -0
- package/dist/core/types/plugin.d.ts +252 -0
- package/dist/core/types/plugin.d.ts.map +1 -0
- package/dist/core/types/plugin.js +48 -0
- package/dist/core/types/plugin.js.map +1 -0
- package/dist/integrations/jira/jira-mapper.d.ts +2 -2
- package/dist/integrations/jira/jira-mapper.js +2 -2
- package/dist/types/cost-tracking.d.ts +43 -0
- package/dist/types/cost-tracking.d.ts.map +1 -0
- package/dist/types/cost-tracking.js +8 -0
- package/dist/types/cost-tracking.js.map +1 -0
- package/dist/types/model-selection.d.ts +53 -0
- package/dist/types/model-selection.d.ts.map +1 -0
- package/dist/types/model-selection.js +12 -0
- package/dist/types/model-selection.js.map +1 -0
- package/dist/utils/cost-reporter.d.ts +58 -0
- package/dist/utils/cost-reporter.d.ts.map +1 -0
- package/dist/utils/cost-reporter.js +224 -0
- package/dist/utils/cost-reporter.js.map +1 -0
- package/dist/utils/pricing-constants.d.ts +70 -0
- package/dist/utils/pricing-constants.d.ts.map +1 -0
- package/dist/utils/pricing-constants.js +71 -0
- package/dist/utils/pricing-constants.js.map +1 -0
- package/package.json +13 -9
- package/src/adapters/adapter-base.ts +33 -0
- package/src/adapters/adapter-interface.ts +46 -0
- package/src/adapters/claude/adapter.ts +164 -0
- package/src/adapters/copilot/adapter.ts +138 -0
- package/src/adapters/cursor/adapter.ts +170 -0
- package/src/adapters/generic/adapter.ts +137 -0
- package/src/agents/architect/AGENT.md +3 -0
- package/src/agents/code-reviewer.md +156 -0
- package/src/agents/data-scientist/AGENT.md +181 -0
- package/src/agents/database-optimizer/AGENT.md +147 -0
- package/src/agents/devops/AGENT.md +3 -0
- package/src/agents/diagrams-architect/AGENT.md +3 -0
- package/src/agents/docs-writer/AGENT.md +3 -0
- package/src/agents/kubernetes-architect/AGENT.md +142 -0
- package/src/agents/ml-engineer/AGENT.md +150 -0
- package/src/agents/mlops-engineer/AGENT.md +201 -0
- package/src/agents/network-engineer/AGENT.md +149 -0
- package/src/agents/observability-engineer/AGENT.md +213 -0
- package/src/agents/payment-integration/AGENT.md +35 -0
- package/src/agents/performance/AGENT.md +3 -0
- package/src/agents/performance-engineer/AGENT.md +153 -0
- package/src/agents/pm/AGENT.md +3 -0
- package/src/agents/qa-lead/AGENT.md +3 -0
- package/src/agents/security/AGENT.md +3 -0
- package/src/agents/sre/AGENT.md +3 -0
- package/src/agents/tdd-orchestrator/AGENT.md +169 -0
- package/src/agents/tech-lead/AGENT.md +3 -0
- package/src/commands/specweave.costs.md +261 -0
- package/src/commands/specweave.increment.md +48 -4
- package/src/commands/specweave.ml-pipeline.md +292 -0
- package/src/commands/specweave.monitor-setup.md +501 -0
- package/src/commands/specweave.slo-implement.md +1055 -0
- package/src/commands/specweave.sync-github.md +1 -1
- package/src/commands/specweave.tdd-cycle.md +199 -0
- package/src/commands/specweave.tdd-green.md +842 -0
- package/src/commands/specweave.tdd-red.md +135 -0
- package/src/commands/specweave.tdd-refactor.md +165 -0
- package/src/hooks/post-increment-plugin-detect.sh +142 -0
- package/src/hooks/post-task-completion.sh +53 -11
- package/src/hooks/pre-task-plugin-detect.sh +96 -0
- package/src/skills/SKILLS-INDEX.md +18 -10
- package/src/skills/billing-automation/SKILL.md +559 -0
- package/src/skills/distributed-tracing/SKILL.md +438 -0
- package/src/skills/e2e-playwright/README.md +1 -1
- package/src/skills/e2e-playwright/package.json +1 -1
- package/src/skills/gitops-workflow/SKILL.md +285 -0
- package/src/skills/gitops-workflow/references/argocd-setup.md +134 -0
- package/src/skills/gitops-workflow/references/sync-policies.md +131 -0
- package/src/skills/grafana-dashboards/SKILL.md +369 -0
- package/src/skills/helm-chart-scaffolding/SKILL.md +544 -0
- package/src/skills/helm-chart-scaffolding/assets/Chart.yaml.template +42 -0
- package/src/skills/helm-chart-scaffolding/assets/values.yaml.template +185 -0
- package/src/skills/helm-chart-scaffolding/references/chart-structure.md +500 -0
- package/src/skills/helm-chart-scaffolding/scripts/validate-chart.sh +244 -0
- package/src/skills/k8s-manifest-generator/SKILL.md +511 -0
- package/src/skills/k8s-manifest-generator/assets/configmap-template.yaml +296 -0
- package/src/skills/k8s-manifest-generator/assets/deployment-template.yaml +203 -0
- package/src/skills/k8s-manifest-generator/assets/service-template.yaml +171 -0
- package/src/skills/k8s-manifest-generator/references/deployment-spec.md +753 -0
- package/src/skills/k8s-manifest-generator/references/service-spec.md +724 -0
- package/src/skills/k8s-security-policies/SKILL.md +334 -0
- package/src/skills/k8s-security-policies/assets/network-policy-template.yaml +177 -0
- package/src/skills/k8s-security-policies/references/rbac-patterns.md +187 -0
- package/src/skills/ml-pipeline-workflow/SKILL.md +245 -0
- package/src/skills/paypal-integration/SKILL.md +467 -0
- package/src/skills/pci-compliance/SKILL.md +466 -0
- package/src/skills/prometheus-configuration/SKILL.md +392 -0
- package/src/skills/slo-implementation/SKILL.md +329 -0
- package/src/skills/stripe-integration/SKILL.md +442 -0
- package/src/skills/tdd-workflow/SKILL.md +378 -0
- package/src/templates/README.md.template +1 -1
- package/src/skills/bmad-method-expert/SKILL.md +0 -626
- package/src/skills/bmad-method-expert/scripts/analyze-project.js +0 -318
- package/src/skills/bmad-method-expert/scripts/check-setup.js +0 -208
- package/src/skills/bmad-method-expert/scripts/generate-template.js +0 -1149
- package/src/skills/bmad-method-expert/scripts/validate-documents.js +0 -340
- package/src/skills/context-optimizer/SKILL.md +0 -588
- package/src/skills/figma-designer/SKILL.md +0 -149
- package/src/skills/figma-implementer/SKILL.md +0 -148
- package/src/skills/figma-mcp-connector/SKILL.md +0 -136
- package/src/skills/figma-to-code/SKILL.md +0 -128
- package/src/skills/spec-kit-expert/SKILL.md +0 -1010
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cost Report Generation
|
|
3
|
+
*
|
|
4
|
+
* Generates human-readable cost reports with multiple export formats:
|
|
5
|
+
* - JSON (machine-readable)
|
|
6
|
+
* - CSV (spreadsheet import)
|
|
7
|
+
* - ASCII Dashboard (CLI display)
|
|
8
|
+
*/
|
|
9
|
+
import fs from 'fs-extra';
|
|
10
|
+
export class CostReporter {
|
|
11
|
+
constructor(costTracker) {
|
|
12
|
+
this.costTracker = costTracker;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Generate cost report for a specific increment
|
|
16
|
+
*
|
|
17
|
+
* @param incrementId - Increment ID (e.g., '0003')
|
|
18
|
+
* @returns Aggregate cost report
|
|
19
|
+
*/
|
|
20
|
+
generateIncrementReport(incrementId) {
|
|
21
|
+
return this.costTracker.getIncrementCost(incrementId);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Export report to JSON file
|
|
25
|
+
*
|
|
26
|
+
* @param incrementId - Increment ID
|
|
27
|
+
* @param outputPath - Output file path
|
|
28
|
+
*/
|
|
29
|
+
async exportToJSON(incrementId, outputPath) {
|
|
30
|
+
const report = this.generateIncrementReport(incrementId);
|
|
31
|
+
await fs.writeJson(outputPath, report, { spaces: 2 });
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Export report to CSV file
|
|
35
|
+
*
|
|
36
|
+
* @param incrementId - Increment ID
|
|
37
|
+
* @param outputPath - Output file path
|
|
38
|
+
*/
|
|
39
|
+
async exportToCSV(incrementId, outputPath) {
|
|
40
|
+
const sessions = this.costTracker.getIncrementSessions(incrementId);
|
|
41
|
+
// CSV headers
|
|
42
|
+
const headers = [
|
|
43
|
+
'Session ID',
|
|
44
|
+
'Agent',
|
|
45
|
+
'Model',
|
|
46
|
+
'Command',
|
|
47
|
+
'Started At',
|
|
48
|
+
'Ended At',
|
|
49
|
+
'Input Tokens',
|
|
50
|
+
'Output Tokens',
|
|
51
|
+
'Total Tokens',
|
|
52
|
+
'Cost ($)',
|
|
53
|
+
'Savings ($)',
|
|
54
|
+
];
|
|
55
|
+
// CSV rows
|
|
56
|
+
const rows = sessions.map((s) => [
|
|
57
|
+
s.sessionId,
|
|
58
|
+
s.agent,
|
|
59
|
+
s.model,
|
|
60
|
+
s.command || 'N/A',
|
|
61
|
+
s.startedAt,
|
|
62
|
+
s.endedAt || 'In Progress',
|
|
63
|
+
s.tokenUsage.inputTokens.toString(),
|
|
64
|
+
s.tokenUsage.outputTokens.toString(),
|
|
65
|
+
s.tokenUsage.totalTokens.toString(),
|
|
66
|
+
s.cost.toFixed(4),
|
|
67
|
+
s.savings.toFixed(4),
|
|
68
|
+
]);
|
|
69
|
+
// Generate CSV (simple implementation, no external deps)
|
|
70
|
+
const csv = [headers.join(','), ...rows.map((row) => row.join(','))].join('\n');
|
|
71
|
+
await fs.writeFile(outputPath, csv, 'utf-8');
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Generate ASCII dashboard for CLI display
|
|
75
|
+
*
|
|
76
|
+
* @param incrementId - Optional increment ID (defaults to all increments)
|
|
77
|
+
* @returns ASCII table with cost breakdown
|
|
78
|
+
*/
|
|
79
|
+
generateDashboard(incrementId) {
|
|
80
|
+
if (incrementId) {
|
|
81
|
+
return this.generateIncrementDashboard(incrementId);
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
return this.generateOverallDashboard();
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Generate dashboard for a specific increment
|
|
89
|
+
*/
|
|
90
|
+
generateIncrementDashboard(incrementId) {
|
|
91
|
+
const report = this.generateIncrementReport(incrementId);
|
|
92
|
+
const sessions = this.costTracker.getIncrementSessions(incrementId);
|
|
93
|
+
if (sessions.length === 0) {
|
|
94
|
+
return `No cost data for increment ${incrementId}`;
|
|
95
|
+
}
|
|
96
|
+
const lines = [];
|
|
97
|
+
// Header
|
|
98
|
+
lines.push('');
|
|
99
|
+
lines.push('═══════════════════════════════════════════════════════════════');
|
|
100
|
+
lines.push(` Cost Report: Increment ${incrementId}`);
|
|
101
|
+
lines.push('═══════════════════════════════════════════════════════════════');
|
|
102
|
+
lines.push('');
|
|
103
|
+
// Summary
|
|
104
|
+
lines.push('SUMMARY');
|
|
105
|
+
lines.push('───────────────────────────────────────────────────────────────');
|
|
106
|
+
lines.push(` Total Cost: $${report.totalCost.toFixed(4).padStart(10)}`);
|
|
107
|
+
lines.push(` Total Savings: $${report.totalSavings.toFixed(4).padStart(10)}`);
|
|
108
|
+
const baselineCost = report.totalCost + report.totalSavings;
|
|
109
|
+
const savingsPercentage = baselineCost > 0 ? (report.totalSavings / baselineCost) * 100 : 0;
|
|
110
|
+
lines.push(` Savings %: ${savingsPercentage.toFixed(1).padStart(10)}%`);
|
|
111
|
+
lines.push(` Total Tokens: ${report.totalTokens.toLocaleString().padStart(10)}`);
|
|
112
|
+
lines.push(` Sessions: ${report.sessionCount.toString().padStart(10)}`);
|
|
113
|
+
lines.push('');
|
|
114
|
+
// Cost by Model
|
|
115
|
+
lines.push('COST BY MODEL');
|
|
116
|
+
lines.push('───────────────────────────────────────────────────────────────');
|
|
117
|
+
for (const [model, cost] of Object.entries(report.costByModel)) {
|
|
118
|
+
const percentage = (cost / report.totalCost) * 100;
|
|
119
|
+
lines.push(` ${model.padEnd(15)} $${cost.toFixed(4).padStart(10)} (${percentage.toFixed(1).padStart(5)}%)`);
|
|
120
|
+
}
|
|
121
|
+
lines.push('');
|
|
122
|
+
// Cost by Agent
|
|
123
|
+
lines.push('COST BY AGENT');
|
|
124
|
+
lines.push('───────────────────────────────────────────────────────────────');
|
|
125
|
+
const sortedAgents = Object.entries(report.costByAgent).sort(([, a], [, b]) => b - a);
|
|
126
|
+
for (const [agent, cost] of sortedAgents.slice(0, 10)) {
|
|
127
|
+
// Top 10
|
|
128
|
+
const percentage = (cost / report.totalCost) * 100;
|
|
129
|
+
lines.push(` ${agent.padEnd(25)} $${cost.toFixed(4).padStart(8)} (${percentage.toFixed(1).padStart(5)}%)`);
|
|
130
|
+
}
|
|
131
|
+
if (sortedAgents.length > 10) {
|
|
132
|
+
lines.push(` ... and ${sortedAgents.length - 10} more agents`);
|
|
133
|
+
}
|
|
134
|
+
lines.push('');
|
|
135
|
+
// Recent Sessions (last 5)
|
|
136
|
+
lines.push('RECENT SESSIONS');
|
|
137
|
+
lines.push('───────────────────────────────────────────────────────────────');
|
|
138
|
+
const recentSessions = sessions
|
|
139
|
+
.sort((a, b) => {
|
|
140
|
+
const timeA = new Date(a.startedAt).getTime();
|
|
141
|
+
const timeB = new Date(b.startedAt).getTime();
|
|
142
|
+
return timeB - timeA;
|
|
143
|
+
})
|
|
144
|
+
.slice(0, 5);
|
|
145
|
+
for (const session of recentSessions) {
|
|
146
|
+
const time = new Date(session.startedAt).toLocaleString();
|
|
147
|
+
lines.push(` ${time}`);
|
|
148
|
+
lines.push(` Agent: ${session.agent.padEnd(20)} Model: ${session.model}`);
|
|
149
|
+
lines.push(` Cost: $${session.cost.toFixed(4).padStart(8)} Savings: $${session.savings.toFixed(4).padStart(8)}`);
|
|
150
|
+
lines.push('');
|
|
151
|
+
}
|
|
152
|
+
lines.push('═══════════════════════════════════════════════════════════════');
|
|
153
|
+
lines.push('');
|
|
154
|
+
return lines.join('\n');
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Generate dashboard for all increments
|
|
158
|
+
*/
|
|
159
|
+
generateOverallDashboard() {
|
|
160
|
+
const summary = this.costTracker.getSummary();
|
|
161
|
+
if (summary.totalSessions === 0) {
|
|
162
|
+
return 'No cost data available';
|
|
163
|
+
}
|
|
164
|
+
const lines = [];
|
|
165
|
+
// Header
|
|
166
|
+
lines.push('');
|
|
167
|
+
lines.push('═══════════════════════════════════════════════════════════════');
|
|
168
|
+
lines.push(' SpecWeave Cost Summary - All Increments');
|
|
169
|
+
lines.push('═══════════════════════════════════════════════════════════════');
|
|
170
|
+
lines.push('');
|
|
171
|
+
// Overall Summary
|
|
172
|
+
lines.push('OVERALL SUMMARY');
|
|
173
|
+
lines.push('───────────────────────────────────────────────────────────────');
|
|
174
|
+
lines.push(` Total Cost: $${summary.totalCost.toFixed(4).padStart(10)}`);
|
|
175
|
+
lines.push(` Total Savings: $${summary.totalSavings.toFixed(4).padStart(10)}`);
|
|
176
|
+
lines.push(` Savings %: ${summary.savingsPercentage.toFixed(1).padStart(10)}%`);
|
|
177
|
+
lines.push(` Total Sessions: ${summary.totalSessions.toString().padStart(10)}`);
|
|
178
|
+
lines.push('');
|
|
179
|
+
// Agent Stats
|
|
180
|
+
if (summary.mostExpensiveAgent) {
|
|
181
|
+
lines.push('AGENT STATS');
|
|
182
|
+
lines.push('───────────────────────────────────────────────────────────────');
|
|
183
|
+
lines.push(` Most Expensive: ${summary.mostExpensiveAgent}`);
|
|
184
|
+
if (summary.cheapestAgent !== summary.mostExpensiveAgent) {
|
|
185
|
+
lines.push(` Least Expensive: ${summary.cheapestAgent}`);
|
|
186
|
+
}
|
|
187
|
+
lines.push('');
|
|
188
|
+
}
|
|
189
|
+
// By Increment
|
|
190
|
+
const allSessions = this.costTracker.getAllSessions();
|
|
191
|
+
const incrementIds = [...new Set(allSessions.map((s) => s.increment).filter(Boolean))];
|
|
192
|
+
if (incrementIds.length > 0) {
|
|
193
|
+
lines.push('COST BY INCREMENT');
|
|
194
|
+
lines.push('───────────────────────────────────────────────────────────────');
|
|
195
|
+
for (const incrementId of incrementIds) {
|
|
196
|
+
const report = this.generateIncrementReport(incrementId);
|
|
197
|
+
lines.push(` ${incrementId.padEnd(30)} $${report.totalCost.toFixed(4).padStart(8)} (${report.sessionCount} sessions)`);
|
|
198
|
+
}
|
|
199
|
+
lines.push('');
|
|
200
|
+
}
|
|
201
|
+
lines.push('═══════════════════════════════════════════════════════════════');
|
|
202
|
+
lines.push('');
|
|
203
|
+
lines.push('💡 Tip: Use "/specweave.costs 0003" to see detailed report for increment 0003');
|
|
204
|
+
lines.push('');
|
|
205
|
+
return lines.join('\n');
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Generate compact one-line summary
|
|
209
|
+
*
|
|
210
|
+
* @param incrementId - Optional increment ID
|
|
211
|
+
* @returns One-line summary string
|
|
212
|
+
*/
|
|
213
|
+
generateSummaryLine(incrementId) {
|
|
214
|
+
if (incrementId) {
|
|
215
|
+
const report = this.generateIncrementReport(incrementId);
|
|
216
|
+
return `Increment ${incrementId}: $${report.totalCost.toFixed(4)} cost, $${report.totalSavings.toFixed(4)} saved (${((report.totalSavings / (report.totalCost + report.totalSavings)) * 100).toFixed(1)}%)`;
|
|
217
|
+
}
|
|
218
|
+
else {
|
|
219
|
+
const summary = this.costTracker.getSummary();
|
|
220
|
+
return `Total: $${summary.totalCost.toFixed(4)} cost, $${summary.totalSavings.toFixed(4)} saved (${summary.savingsPercentage.toFixed(1)}%) across ${summary.totalSessions} sessions`;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
//# sourceMappingURL=cost-reporter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cost-reporter.js","sourceRoot":"","sources":["../../src/utils/cost-reporter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Anthropic API Pricing Constants
|
|
3
|
+
*
|
|
4
|
+
* Pricing as of 2025-10-31 (verified against https://www.anthropic.com/pricing)
|
|
5
|
+
*
|
|
6
|
+
* Model Tier Mapping:
|
|
7
|
+
* - sonnet → claude-sonnet-4-5-20250929 (latest Sonnet 4.5)
|
|
8
|
+
* - haiku → claude-4-5-haiku-20250110 (latest Haiku 4.5)
|
|
9
|
+
* - opus → claude-opus-4-0-... (when released)
|
|
10
|
+
*
|
|
11
|
+
* Note: This file should be updated when Anthropic releases new models.
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* Pricing per 1M tokens (input/output) in USD
|
|
15
|
+
*/
|
|
16
|
+
export declare const PRICING: {
|
|
17
|
+
readonly sonnet: {
|
|
18
|
+
readonly input: 0.000003;
|
|
19
|
+
readonly output: 0.000015;
|
|
20
|
+
};
|
|
21
|
+
readonly haiku: {
|
|
22
|
+
readonly input: 0.000001;
|
|
23
|
+
readonly output: 0.000005;
|
|
24
|
+
};
|
|
25
|
+
readonly opus: {
|
|
26
|
+
readonly input: 0.000015;
|
|
27
|
+
readonly output: 0.000075;
|
|
28
|
+
};
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* Calculate cost for a given model and token usage
|
|
32
|
+
*
|
|
33
|
+
* @param model - Model tier (sonnet, haiku, opus)
|
|
34
|
+
* @param inputTokens - Number of input tokens
|
|
35
|
+
* @param outputTokens - Number of output tokens
|
|
36
|
+
* @returns Total cost in USD
|
|
37
|
+
*
|
|
38
|
+
* @example
|
|
39
|
+
* ```typescript
|
|
40
|
+
* const cost = calculateCost('haiku', 1000, 500);
|
|
41
|
+
* // Returns: 0.0035 ($0.0035 = $0.001 input + $0.0025 output)
|
|
42
|
+
* ```
|
|
43
|
+
*/
|
|
44
|
+
export declare function calculateCost(model: 'sonnet' | 'haiku' | 'opus', inputTokens: number, outputTokens: number): number;
|
|
45
|
+
/**
|
|
46
|
+
* Get pricing constants for a specific model
|
|
47
|
+
*
|
|
48
|
+
* @param model - Model tier
|
|
49
|
+
* @returns Pricing object with input/output costs
|
|
50
|
+
*/
|
|
51
|
+
export declare function getModelPricing(model: 'sonnet' | 'haiku' | 'opus'): {
|
|
52
|
+
readonly input: 0.000003;
|
|
53
|
+
readonly output: 0.000015;
|
|
54
|
+
} | {
|
|
55
|
+
readonly input: 0.000001;
|
|
56
|
+
readonly output: 0.000005;
|
|
57
|
+
} | {
|
|
58
|
+
readonly input: 0.000015;
|
|
59
|
+
readonly output: 0.000075;
|
|
60
|
+
};
|
|
61
|
+
/**
|
|
62
|
+
* Calculate cost savings vs baseline (all-Sonnet)
|
|
63
|
+
*
|
|
64
|
+
* @param actualModel - Model actually used
|
|
65
|
+
* @param inputTokens - Input tokens
|
|
66
|
+
* @param outputTokens - Output tokens
|
|
67
|
+
* @returns Savings amount in dollars (positive = saved money)
|
|
68
|
+
*/
|
|
69
|
+
export declare function calculateSavings(actualModel: 'sonnet' | 'haiku' | 'opus', inputTokens: number, outputTokens: number): number;
|
|
70
|
+
//# sourceMappingURL=pricing-constants.d.ts.map
|
|
@@ -0,0 +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,CAMR"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Anthropic API Pricing Constants
|
|
3
|
+
*
|
|
4
|
+
* Pricing as of 2025-10-31 (verified against https://www.anthropic.com/pricing)
|
|
5
|
+
*
|
|
6
|
+
* Model Tier Mapping:
|
|
7
|
+
* - sonnet → claude-sonnet-4-5-20250929 (latest Sonnet 4.5)
|
|
8
|
+
* - haiku → claude-4-5-haiku-20250110 (latest Haiku 4.5)
|
|
9
|
+
* - opus → claude-opus-4-0-... (when released)
|
|
10
|
+
*
|
|
11
|
+
* Note: This file should be updated when Anthropic releases new models.
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* Pricing per 1M tokens (input/output) in USD
|
|
15
|
+
*/
|
|
16
|
+
export const PRICING = {
|
|
17
|
+
sonnet: {
|
|
18
|
+
input: 0.000003, // $3 per 1M input tokens
|
|
19
|
+
output: 0.000015, // $15 per 1M output tokens
|
|
20
|
+
},
|
|
21
|
+
haiku: {
|
|
22
|
+
input: 0.000001, // $1 per 1M input tokens
|
|
23
|
+
output: 0.000005, // $5 per 1M output tokens
|
|
24
|
+
},
|
|
25
|
+
opus: {
|
|
26
|
+
input: 0.000015, // $15 per 1M input tokens
|
|
27
|
+
output: 0.000075, // $75 per 1M output tokens
|
|
28
|
+
},
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* Calculate cost for a given model and token usage
|
|
32
|
+
*
|
|
33
|
+
* @param model - Model tier (sonnet, haiku, opus)
|
|
34
|
+
* @param inputTokens - Number of input tokens
|
|
35
|
+
* @param outputTokens - Number of output tokens
|
|
36
|
+
* @returns Total cost in USD
|
|
37
|
+
*
|
|
38
|
+
* @example
|
|
39
|
+
* ```typescript
|
|
40
|
+
* const cost = calculateCost('haiku', 1000, 500);
|
|
41
|
+
* // Returns: 0.0035 ($0.0035 = $0.001 input + $0.0025 output)
|
|
42
|
+
* ```
|
|
43
|
+
*/
|
|
44
|
+
export function calculateCost(model, inputTokens, outputTokens) {
|
|
45
|
+
const pricing = PRICING[model];
|
|
46
|
+
return (inputTokens * pricing.input) + (outputTokens * pricing.output);
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Get pricing constants for a specific model
|
|
50
|
+
*
|
|
51
|
+
* @param model - Model tier
|
|
52
|
+
* @returns Pricing object with input/output costs
|
|
53
|
+
*/
|
|
54
|
+
export function getModelPricing(model) {
|
|
55
|
+
return PRICING[model];
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Calculate cost savings vs baseline (all-Sonnet)
|
|
59
|
+
*
|
|
60
|
+
* @param actualModel - Model actually used
|
|
61
|
+
* @param inputTokens - Input tokens
|
|
62
|
+
* @param outputTokens - Output tokens
|
|
63
|
+
* @returns Savings amount in dollars (positive = saved money)
|
|
64
|
+
*/
|
|
65
|
+
export function calculateSavings(actualModel, inputTokens, outputTokens) {
|
|
66
|
+
const actualCost = calculateCost(actualModel, inputTokens, outputTokens);
|
|
67
|
+
const baselineCost = calculateCost('sonnet', inputTokens, outputTokens);
|
|
68
|
+
const savedAmount = baselineCost - actualCost;
|
|
69
|
+
return savedAmount;
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=pricing-constants.js.map
|
|
@@ -0,0 +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;IAE9C,OAAO,WAAW,CAAC;AACrB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "specweave",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.1",
|
|
4
4
|
"description": "Replace vibe coding with spec-driven development. Smart workflow: /specweave inc auto-closes previous, /specweave build auto-resumes, /specweave progress shows status. PM-led planning, 10 agents, 35+ skills. spec-weave.com",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -14,16 +14,19 @@
|
|
|
14
14
|
"test": "jest",
|
|
15
15
|
"test:smoke": "bash tests/smoke/e2e-smoke-test.sh",
|
|
16
16
|
"test:e2e": "playwright test tests/e2e/specweave-smoke.spec.ts",
|
|
17
|
-
"test:integration": "npm run test:integration:ado && npm run test:integration:jira",
|
|
18
|
-
"test:integration:ado": "
|
|
19
|
-
"test:integration:jira": "
|
|
20
|
-
"test:
|
|
21
|
-
"test:
|
|
22
|
-
"
|
|
23
|
-
"
|
|
17
|
+
"test:integration": "npm run test:integration:ado && npm run test:integration:jira && npm run test:integration:ml",
|
|
18
|
+
"test:integration:ado": "npx tsx tests/integration/ado-sync/ado-sync.test.ts",
|
|
19
|
+
"test:integration:jira": "npx tsx tests/integration/jira-sync/jira-sync.test.ts",
|
|
20
|
+
"test:integration:ml": "npx tsx tests/integration/ml-pipeline-workflow/ml-pipeline-soccer-detection.test.ts",
|
|
21
|
+
"test:sync:jira": "npx tsx tests/integration/jira-sync/jira-bidirectional-sync.test.ts",
|
|
22
|
+
"test:incremental:jira": "npx tsx tests/integration/jira-sync/jira-incremental-sync.test.ts",
|
|
23
|
+
"test:ml:pipeline": "npx tsx tests/integration/ml-pipeline-workflow/ml-pipeline-soccer-detection.test.ts",
|
|
24
|
+
"test:ml:real": "npx tsx tests/integration/ml-pipeline-workflow/ml-pipeline-real-video.test.ts",
|
|
25
|
+
"generate:tests": "npx tsx scripts/generate-tests.ts",
|
|
26
|
+
"generate:tests:skill": "npx tsx scripts/generate-tests.ts",
|
|
24
27
|
"test:all:generated": "bash scripts/run-all-tests.sh",
|
|
25
28
|
"test:all": "npm test && npm run test:smoke && npm run test:integration",
|
|
26
|
-
"generate:skills-index": "
|
|
29
|
+
"generate:skills-index": "npx tsx src/utils/generate-skills-index.ts",
|
|
27
30
|
"prepublishOnly": "npm run build",
|
|
28
31
|
"install:agents": "bash bin/install-agents.sh",
|
|
29
32
|
"install:skills": "bash bin/install-skills.sh",
|
|
@@ -77,6 +80,7 @@
|
|
|
77
80
|
"LICENSE"
|
|
78
81
|
],
|
|
79
82
|
"dependencies": {
|
|
83
|
+
"ajv": "^8.17.1",
|
|
80
84
|
"chalk": "^5.3.0",
|
|
81
85
|
"commander": "^11.1.0",
|
|
82
86
|
"fs-extra": "^11.2.0",
|
|
@@ -16,6 +16,7 @@ import {
|
|
|
16
16
|
AutomationLevel
|
|
17
17
|
} from './adapter-interface.js';
|
|
18
18
|
import { getDirname } from '../utils/esm-helpers.js';
|
|
19
|
+
import type { Plugin } from '../core/types/plugin.js';
|
|
19
20
|
|
|
20
21
|
const __dirname = getDirname(import.meta.url);
|
|
21
22
|
|
|
@@ -146,4 +147,36 @@ export abstract class AdapterBase implements IAdapter {
|
|
|
146
147
|
|
|
147
148
|
return content;
|
|
148
149
|
}
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Check if this adapter supports plugins
|
|
153
|
+
* Default: No plugin support (override in concrete adapters)
|
|
154
|
+
*/
|
|
155
|
+
supportsPlugins(): boolean {
|
|
156
|
+
return false;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* Compile and install a plugin
|
|
161
|
+
* Default: Throw error (override in concrete adapters that support plugins)
|
|
162
|
+
*/
|
|
163
|
+
async compilePlugin(plugin: Plugin): Promise<void> {
|
|
164
|
+
throw new Error(`Plugin support not implemented for ${this.name} adapter`);
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* Unload a plugin
|
|
169
|
+
* Default: Throw error (override in concrete adapters that support plugins)
|
|
170
|
+
*/
|
|
171
|
+
async unloadPlugin(pluginName: string): Promise<void> {
|
|
172
|
+
throw new Error(`Plugin support not implemented for ${this.name} adapter`);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* Get installed plugins
|
|
177
|
+
* Default: Return empty array (override in concrete adapters that support plugins)
|
|
178
|
+
*/
|
|
179
|
+
async getInstalledPlugins(): Promise<string[]> {
|
|
180
|
+
return [];
|
|
181
|
+
}
|
|
149
182
|
}
|
|
@@ -5,6 +5,8 @@
|
|
|
5
5
|
* Enables SpecWeave to work with ANY AI coding tool (Claude, Cursor, Copilot, etc.)
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
+
import type { Plugin } from '../core/types/plugin.js';
|
|
9
|
+
|
|
8
10
|
export interface AdapterOptions {
|
|
9
11
|
projectPath: string;
|
|
10
12
|
projectName: string;
|
|
@@ -117,4 +119,48 @@ export interface IAdapter {
|
|
|
117
119
|
* @returns string Markdown-formatted instructions
|
|
118
120
|
*/
|
|
119
121
|
getInstructions(): string;
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Check if this adapter supports plugins
|
|
125
|
+
*
|
|
126
|
+
* Returns true if the adapter can install and compile plugins
|
|
127
|
+
* (Claude native, Cursor AGENTS.md, Copilot instructions.md)
|
|
128
|
+
* Returns false for generic/manual adapters
|
|
129
|
+
*
|
|
130
|
+
* @returns boolean True if plugins are supported
|
|
131
|
+
*/
|
|
132
|
+
supportsPlugins(): boolean;
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Compile and install a plugin for this adapter
|
|
136
|
+
*
|
|
137
|
+
* Transforms plugin content (skills/agents/commands) to tool-specific format:
|
|
138
|
+
* - Claude: Copy to .claude/skills/, .claude/agents/, .claude/commands/
|
|
139
|
+
* - Cursor: Compile to AGENTS.md + team commands JSON
|
|
140
|
+
* - Copilot: Compile to .github/copilot/instructions.md
|
|
141
|
+
* - Generic: Generate manual copy-paste instructions
|
|
142
|
+
*
|
|
143
|
+
* @param plugin Plugin to compile and install
|
|
144
|
+
* @returns Promise<void>
|
|
145
|
+
*/
|
|
146
|
+
compilePlugin(plugin: Plugin): Promise<void>;
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* Unload (disable) a plugin for this adapter
|
|
150
|
+
*
|
|
151
|
+
* Removes plugin-specific files and restores previous state
|
|
152
|
+
*
|
|
153
|
+
* @param pluginName Name of plugin to unload
|
|
154
|
+
* @returns Promise<void>
|
|
155
|
+
*/
|
|
156
|
+
unloadPlugin(pluginName: string): Promise<void>;
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* Get plugin installation status
|
|
160
|
+
*
|
|
161
|
+
* Returns information about which plugins are currently installed
|
|
162
|
+
*
|
|
163
|
+
* @returns Promise<string[]> Array of installed plugin names
|
|
164
|
+
*/
|
|
165
|
+
getInstalledPlugins(): Promise<string[]>;
|
|
120
166
|
}
|