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.
Files changed (168) hide show
  1. package/CLAUDE.md +506 -17
  2. package/README.md +100 -58
  3. package/bin/install-all.sh +9 -2
  4. package/bin/install-hooks.sh +57 -0
  5. package/bin/specweave.js +16 -0
  6. package/dist/adapters/adapter-base.d.ts +21 -0
  7. package/dist/adapters/adapter-base.d.ts.map +1 -1
  8. package/dist/adapters/adapter-base.js +28 -0
  9. package/dist/adapters/adapter-base.js.map +1 -1
  10. package/dist/adapters/adapter-interface.d.ts +41 -0
  11. package/dist/adapters/adapter-interface.d.ts.map +1 -1
  12. package/dist/adapters/claude/adapter.d.ts +36 -0
  13. package/dist/adapters/claude/adapter.d.ts.map +1 -1
  14. package/dist/adapters/claude/adapter.js +135 -0
  15. package/dist/adapters/claude/adapter.js.map +1 -1
  16. package/dist/adapters/copilot/adapter.d.ts +25 -0
  17. package/dist/adapters/copilot/adapter.d.ts.map +1 -1
  18. package/dist/adapters/copilot/adapter.js +112 -0
  19. package/dist/adapters/copilot/adapter.js.map +1 -1
  20. package/dist/adapters/cursor/adapter.d.ts +36 -0
  21. package/dist/adapters/cursor/adapter.d.ts.map +1 -1
  22. package/dist/adapters/cursor/adapter.js +140 -0
  23. package/dist/adapters/cursor/adapter.js.map +1 -1
  24. package/dist/adapters/generic/adapter.d.ts +25 -0
  25. package/dist/adapters/generic/adapter.d.ts.map +1 -1
  26. package/dist/adapters/generic/adapter.js +111 -0
  27. package/dist/adapters/generic/adapter.js.map +1 -1
  28. package/dist/cli/commands/init.d.ts.map +1 -1
  29. package/dist/cli/commands/init.js +103 -1
  30. package/dist/cli/commands/init.js.map +1 -1
  31. package/dist/cli/commands/plugin.d.ts +37 -0
  32. package/dist/cli/commands/plugin.d.ts.map +1 -0
  33. package/dist/cli/commands/plugin.js +296 -0
  34. package/dist/cli/commands/plugin.js.map +1 -0
  35. package/dist/core/agent-model-manager.d.ts +52 -0
  36. package/dist/core/agent-model-manager.d.ts.map +1 -0
  37. package/dist/core/agent-model-manager.js +120 -0
  38. package/dist/core/agent-model-manager.js.map +1 -0
  39. package/dist/core/cost-tracker.d.ts +108 -0
  40. package/dist/core/cost-tracker.d.ts.map +1 -0
  41. package/dist/core/cost-tracker.js +281 -0
  42. package/dist/core/cost-tracker.js.map +1 -0
  43. package/dist/core/model-selector.d.ts +57 -0
  44. package/dist/core/model-selector.d.ts.map +1 -0
  45. package/dist/core/model-selector.js +115 -0
  46. package/dist/core/model-selector.js.map +1 -0
  47. package/dist/core/phase-detector.d.ts +62 -0
  48. package/dist/core/phase-detector.d.ts.map +1 -0
  49. package/dist/core/phase-detector.js +229 -0
  50. package/dist/core/phase-detector.js.map +1 -0
  51. package/dist/core/plugin-detector.d.ts +96 -0
  52. package/dist/core/plugin-detector.d.ts.map +1 -0
  53. package/dist/core/plugin-detector.js +349 -0
  54. package/dist/core/plugin-detector.js.map +1 -0
  55. package/dist/core/plugin-loader.d.ts +111 -0
  56. package/dist/core/plugin-loader.d.ts.map +1 -0
  57. package/dist/core/plugin-loader.js +319 -0
  58. package/dist/core/plugin-loader.js.map +1 -0
  59. package/dist/core/plugin-manager.d.ts +144 -0
  60. package/dist/core/plugin-manager.d.ts.map +1 -0
  61. package/dist/core/plugin-manager.js +393 -0
  62. package/dist/core/plugin-manager.js.map +1 -0
  63. package/dist/core/schemas/plugin-manifest.schema.json +253 -0
  64. package/dist/core/types/plugin.d.ts +252 -0
  65. package/dist/core/types/plugin.d.ts.map +1 -0
  66. package/dist/core/types/plugin.js +48 -0
  67. package/dist/core/types/plugin.js.map +1 -0
  68. package/dist/integrations/jira/jira-mapper.d.ts +2 -2
  69. package/dist/integrations/jira/jira-mapper.js +2 -2
  70. package/dist/types/cost-tracking.d.ts +43 -0
  71. package/dist/types/cost-tracking.d.ts.map +1 -0
  72. package/dist/types/cost-tracking.js +8 -0
  73. package/dist/types/cost-tracking.js.map +1 -0
  74. package/dist/types/model-selection.d.ts +53 -0
  75. package/dist/types/model-selection.d.ts.map +1 -0
  76. package/dist/types/model-selection.js +12 -0
  77. package/dist/types/model-selection.js.map +1 -0
  78. package/dist/utils/cost-reporter.d.ts +58 -0
  79. package/dist/utils/cost-reporter.d.ts.map +1 -0
  80. package/dist/utils/cost-reporter.js +224 -0
  81. package/dist/utils/cost-reporter.js.map +1 -0
  82. package/dist/utils/pricing-constants.d.ts +70 -0
  83. package/dist/utils/pricing-constants.d.ts.map +1 -0
  84. package/dist/utils/pricing-constants.js +71 -0
  85. package/dist/utils/pricing-constants.js.map +1 -0
  86. package/package.json +13 -9
  87. package/src/adapters/adapter-base.ts +33 -0
  88. package/src/adapters/adapter-interface.ts +46 -0
  89. package/src/adapters/claude/adapter.ts +164 -0
  90. package/src/adapters/copilot/adapter.ts +138 -0
  91. package/src/adapters/cursor/adapter.ts +170 -0
  92. package/src/adapters/generic/adapter.ts +137 -0
  93. package/src/agents/architect/AGENT.md +3 -0
  94. package/src/agents/code-reviewer.md +156 -0
  95. package/src/agents/data-scientist/AGENT.md +181 -0
  96. package/src/agents/database-optimizer/AGENT.md +147 -0
  97. package/src/agents/devops/AGENT.md +3 -0
  98. package/src/agents/diagrams-architect/AGENT.md +3 -0
  99. package/src/agents/docs-writer/AGENT.md +3 -0
  100. package/src/agents/kubernetes-architect/AGENT.md +142 -0
  101. package/src/agents/ml-engineer/AGENT.md +150 -0
  102. package/src/agents/mlops-engineer/AGENT.md +201 -0
  103. package/src/agents/network-engineer/AGENT.md +149 -0
  104. package/src/agents/observability-engineer/AGENT.md +213 -0
  105. package/src/agents/payment-integration/AGENT.md +35 -0
  106. package/src/agents/performance/AGENT.md +3 -0
  107. package/src/agents/performance-engineer/AGENT.md +153 -0
  108. package/src/agents/pm/AGENT.md +3 -0
  109. package/src/agents/qa-lead/AGENT.md +3 -0
  110. package/src/agents/security/AGENT.md +3 -0
  111. package/src/agents/sre/AGENT.md +3 -0
  112. package/src/agents/tdd-orchestrator/AGENT.md +169 -0
  113. package/src/agents/tech-lead/AGENT.md +3 -0
  114. package/src/commands/specweave.costs.md +261 -0
  115. package/src/commands/specweave.increment.md +48 -4
  116. package/src/commands/specweave.ml-pipeline.md +292 -0
  117. package/src/commands/specweave.monitor-setup.md +501 -0
  118. package/src/commands/specweave.slo-implement.md +1055 -0
  119. package/src/commands/specweave.sync-github.md +1 -1
  120. package/src/commands/specweave.tdd-cycle.md +199 -0
  121. package/src/commands/specweave.tdd-green.md +842 -0
  122. package/src/commands/specweave.tdd-red.md +135 -0
  123. package/src/commands/specweave.tdd-refactor.md +165 -0
  124. package/src/hooks/post-increment-plugin-detect.sh +142 -0
  125. package/src/hooks/post-task-completion.sh +53 -11
  126. package/src/hooks/pre-task-plugin-detect.sh +96 -0
  127. package/src/skills/SKILLS-INDEX.md +18 -10
  128. package/src/skills/billing-automation/SKILL.md +559 -0
  129. package/src/skills/distributed-tracing/SKILL.md +438 -0
  130. package/src/skills/e2e-playwright/README.md +1 -1
  131. package/src/skills/e2e-playwright/package.json +1 -1
  132. package/src/skills/gitops-workflow/SKILL.md +285 -0
  133. package/src/skills/gitops-workflow/references/argocd-setup.md +134 -0
  134. package/src/skills/gitops-workflow/references/sync-policies.md +131 -0
  135. package/src/skills/grafana-dashboards/SKILL.md +369 -0
  136. package/src/skills/helm-chart-scaffolding/SKILL.md +544 -0
  137. package/src/skills/helm-chart-scaffolding/assets/Chart.yaml.template +42 -0
  138. package/src/skills/helm-chart-scaffolding/assets/values.yaml.template +185 -0
  139. package/src/skills/helm-chart-scaffolding/references/chart-structure.md +500 -0
  140. package/src/skills/helm-chart-scaffolding/scripts/validate-chart.sh +244 -0
  141. package/src/skills/k8s-manifest-generator/SKILL.md +511 -0
  142. package/src/skills/k8s-manifest-generator/assets/configmap-template.yaml +296 -0
  143. package/src/skills/k8s-manifest-generator/assets/deployment-template.yaml +203 -0
  144. package/src/skills/k8s-manifest-generator/assets/service-template.yaml +171 -0
  145. package/src/skills/k8s-manifest-generator/references/deployment-spec.md +753 -0
  146. package/src/skills/k8s-manifest-generator/references/service-spec.md +724 -0
  147. package/src/skills/k8s-security-policies/SKILL.md +334 -0
  148. package/src/skills/k8s-security-policies/assets/network-policy-template.yaml +177 -0
  149. package/src/skills/k8s-security-policies/references/rbac-patterns.md +187 -0
  150. package/src/skills/ml-pipeline-workflow/SKILL.md +245 -0
  151. package/src/skills/paypal-integration/SKILL.md +467 -0
  152. package/src/skills/pci-compliance/SKILL.md +466 -0
  153. package/src/skills/prometheus-configuration/SKILL.md +392 -0
  154. package/src/skills/slo-implementation/SKILL.md +329 -0
  155. package/src/skills/stripe-integration/SKILL.md +442 -0
  156. package/src/skills/tdd-workflow/SKILL.md +378 -0
  157. package/src/templates/README.md.template +1 -1
  158. package/src/skills/bmad-method-expert/SKILL.md +0 -626
  159. package/src/skills/bmad-method-expert/scripts/analyze-project.js +0 -318
  160. package/src/skills/bmad-method-expert/scripts/check-setup.js +0 -208
  161. package/src/skills/bmad-method-expert/scripts/generate-template.js +0 -1149
  162. package/src/skills/bmad-method-expert/scripts/validate-documents.js +0 -340
  163. package/src/skills/context-optimizer/SKILL.md +0 -588
  164. package/src/skills/figma-designer/SKILL.md +0 -149
  165. package/src/skills/figma-implementer/SKILL.md +0 -148
  166. package/src/skills/figma-mcp-connector/SKILL.md +0 -136
  167. package/src/skills/figma-to-code/SKILL.md +0 -128
  168. 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.13",
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": "ts-node tests/integration/ado-sync/ado-sync.test.ts",
19
- "test:integration:jira": "ts-node tests/integration/jira-sync/jira-sync.test.ts",
20
- "test:sync:jira": "ts-node tests/integration/jira-sync/jira-bidirectional-sync.test.ts",
21
- "test:incremental:jira": "ts-node tests/integration/jira-sync/jira-incremental-sync.test.ts",
22
- "generate:tests": "ts-node scripts/generate-tests.ts",
23
- "generate:tests:skill": "ts-node scripts/generate-tests.ts",
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": "ts-node src/utils/generate-skills-index.ts",
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
  }