burnwatch 0.1.0
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/LICENSE +21 -0
- package/README.md +342 -0
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +1151 -0
- package/dist/cli.js.map +1 -0
- package/dist/hooks/on-file-change.d.ts +1 -0
- package/dist/hooks/on-file-change.js +226 -0
- package/dist/hooks/on-file-change.js.map +1 -0
- package/dist/hooks/on-prompt.d.ts +1 -0
- package/dist/hooks/on-prompt.js +211 -0
- package/dist/hooks/on-prompt.js.map +1 -0
- package/dist/hooks/on-session-start.d.ts +1 -0
- package/dist/hooks/on-session-start.js +766 -0
- package/dist/hooks/on-session-start.js.map +1 -0
- package/dist/hooks/on-stop.d.ts +1 -0
- package/dist/hooks/on-stop.js +561 -0
- package/dist/hooks/on-stop.js.map +1 -0
- package/dist/index.d.ts +246 -0
- package/dist/index.js +573 -0
- package/dist/index.js.map +1 -0
- package/package.json +54 -0
- package/registry.json +330 -0
- package/skills/setup-burnwatch/SKILL.md +95 -0
- package/skills/spend/SKILL.md +25 -0
package/package.json
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "burnwatch",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Passive cost memory for vibe coding — detects paid services, tracks spend, injects budget context into your AI coding sessions.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"burnwatch": "./dist/cli.js"
|
|
8
|
+
},
|
|
9
|
+
"main": "./dist/index.js",
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"exports": {
|
|
12
|
+
".": {
|
|
13
|
+
"types": "./dist/index.d.ts",
|
|
14
|
+
"import": "./dist/index.js"
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
"files": [
|
|
18
|
+
"dist",
|
|
19
|
+
"registry.json",
|
|
20
|
+
"skills",
|
|
21
|
+
"README.md",
|
|
22
|
+
"LICENSE"
|
|
23
|
+
],
|
|
24
|
+
"scripts": {
|
|
25
|
+
"build": "tsup && node -e \"const fs=require('fs');const f='dist/cli.js';const c=fs.readFileSync(f,'utf8');if(!c.startsWith('#!')){fs.writeFileSync(f,'#!/usr/bin/env node\\n'+c)}\"",
|
|
26
|
+
"dev": "tsup --watch",
|
|
27
|
+
"test": "vitest run",
|
|
28
|
+
"test:watch": "vitest",
|
|
29
|
+
"lint": "tsc --noEmit",
|
|
30
|
+
"prepublishOnly": "npm run build"
|
|
31
|
+
},
|
|
32
|
+
"keywords": [
|
|
33
|
+
"claude-code",
|
|
34
|
+
"cost-tracking",
|
|
35
|
+
"saas",
|
|
36
|
+
"spend",
|
|
37
|
+
"budget",
|
|
38
|
+
"developer-tools",
|
|
39
|
+
"ai",
|
|
40
|
+
"vibe-coding",
|
|
41
|
+
"finops"
|
|
42
|
+
],
|
|
43
|
+
"author": "",
|
|
44
|
+
"license": "MIT",
|
|
45
|
+
"engines": {
|
|
46
|
+
"node": ">=18"
|
|
47
|
+
},
|
|
48
|
+
"devDependencies": {
|
|
49
|
+
"@types/node": "^25.5.0",
|
|
50
|
+
"tsup": "^8.5.1",
|
|
51
|
+
"typescript": "^6.0.2",
|
|
52
|
+
"vitest": "^4.1.1"
|
|
53
|
+
}
|
|
54
|
+
}
|
package/registry.json
ADDED
|
@@ -0,0 +1,330 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "./registry.schema.json",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"lastUpdated": "2026-03-24",
|
|
5
|
+
"services": {
|
|
6
|
+
"anthropic": {
|
|
7
|
+
"id": "anthropic",
|
|
8
|
+
"name": "Anthropic (Claude)",
|
|
9
|
+
"packageNames": ["@anthropic-ai/sdk", "anthropic"],
|
|
10
|
+
"envPatterns": ["ANTHROPIC_API_KEY", "ANTHROPIC_ADMIN_KEY"],
|
|
11
|
+
"importPatterns": ["@anthropic-ai/sdk", "anthropic"],
|
|
12
|
+
"mentionKeywords": ["anthropic", "claude", "claude-3", "claude-4", "sonnet", "opus", "haiku"],
|
|
13
|
+
"billingModel": "token_usage",
|
|
14
|
+
"scalingShape": "linear",
|
|
15
|
+
"apiTier": "live",
|
|
16
|
+
"apiEndpoint": "https://api.anthropic.com/v1/organizations/usage",
|
|
17
|
+
"pricing": {
|
|
18
|
+
"formula": "input_tokens * input_rate + output_tokens * output_rate",
|
|
19
|
+
"unitName": "token"
|
|
20
|
+
},
|
|
21
|
+
"gotchas": [
|
|
22
|
+
"Admin API key required for billing data — standard API key only allows inference",
|
|
23
|
+
"Costs vary significantly by model: Haiku ~$0.25/MTok, Sonnet ~$3/MTok, Opus ~$15/MTok"
|
|
24
|
+
],
|
|
25
|
+
"alternatives": ["openai", "google-gemini"],
|
|
26
|
+
"docsUrl": "https://docs.anthropic.com/en/api/usage",
|
|
27
|
+
"lastVerified": "2026-03-24"
|
|
28
|
+
},
|
|
29
|
+
"openai": {
|
|
30
|
+
"id": "openai",
|
|
31
|
+
"name": "OpenAI",
|
|
32
|
+
"packageNames": ["openai"],
|
|
33
|
+
"envPatterns": ["OPENAI_API_KEY", "OPENAI_ORG_ID"],
|
|
34
|
+
"importPatterns": ["openai"],
|
|
35
|
+
"mentionKeywords": ["openai", "gpt-4", "gpt-5", "chatgpt", "dall-e", "whisper"],
|
|
36
|
+
"billingModel": "token_usage",
|
|
37
|
+
"scalingShape": "linear",
|
|
38
|
+
"apiTier": "live",
|
|
39
|
+
"apiEndpoint": "https://api.openai.com/v1/organization/usage",
|
|
40
|
+
"pricing": {
|
|
41
|
+
"formula": "input_tokens * input_rate + output_tokens * output_rate",
|
|
42
|
+
"unitName": "token"
|
|
43
|
+
},
|
|
44
|
+
"gotchas": [
|
|
45
|
+
"Organization-level API key may be needed for usage data",
|
|
46
|
+
"Image generation (DALL-E) billed per image, not per token"
|
|
47
|
+
],
|
|
48
|
+
"alternatives": ["anthropic", "google-gemini"],
|
|
49
|
+
"docsUrl": "https://platform.openai.com/docs/api-reference/usage",
|
|
50
|
+
"lastVerified": "2026-03-24"
|
|
51
|
+
},
|
|
52
|
+
"google-gemini": {
|
|
53
|
+
"id": "google-gemini",
|
|
54
|
+
"name": "Google Gemini",
|
|
55
|
+
"packageNames": ["@google/generative-ai", "@ai-sdk/google"],
|
|
56
|
+
"envPatterns": ["GEMINI_API_KEY", "GOOGLE_AI_API_KEY", "GOOGLE_GENERATIVE_AI_API_KEY"],
|
|
57
|
+
"importPatterns": ["@google/generative-ai", "@ai-sdk/google"],
|
|
58
|
+
"mentionKeywords": ["gemini", "google ai", "google-gemini"],
|
|
59
|
+
"billingModel": "token_usage",
|
|
60
|
+
"scalingShape": "linear",
|
|
61
|
+
"apiTier": "calc",
|
|
62
|
+
"pricing": {
|
|
63
|
+
"formula": "input_tokens * input_rate + output_tokens * output_rate",
|
|
64
|
+
"unitName": "token"
|
|
65
|
+
},
|
|
66
|
+
"gotchas": [
|
|
67
|
+
"Free tier available with rate limits",
|
|
68
|
+
"No standalone billing API for AI Studio — check Google Cloud Console"
|
|
69
|
+
],
|
|
70
|
+
"alternatives": ["anthropic", "openai"],
|
|
71
|
+
"docsUrl": "https://ai.google.dev/pricing",
|
|
72
|
+
"lastVerified": "2026-03-24"
|
|
73
|
+
},
|
|
74
|
+
"voyage-ai": {
|
|
75
|
+
"id": "voyage-ai",
|
|
76
|
+
"name": "Voyage AI",
|
|
77
|
+
"packageNames": ["voyageai"],
|
|
78
|
+
"envPatterns": ["VOYAGE_API_KEY"],
|
|
79
|
+
"importPatterns": ["voyageai"],
|
|
80
|
+
"mentionKeywords": ["voyage", "voyage ai", "voyage-ai"],
|
|
81
|
+
"billingModel": "token_usage",
|
|
82
|
+
"scalingShape": "linear",
|
|
83
|
+
"apiTier": "calc",
|
|
84
|
+
"pricing": {
|
|
85
|
+
"formula": "tokens * rate_per_token",
|
|
86
|
+
"unitName": "token"
|
|
87
|
+
},
|
|
88
|
+
"gotchas": [
|
|
89
|
+
"Embedding-only service — cost scales with document corpus size"
|
|
90
|
+
],
|
|
91
|
+
"alternatives": ["openai embeddings", "cohere embed"],
|
|
92
|
+
"docsUrl": "https://docs.voyageai.com/docs/pricing",
|
|
93
|
+
"lastVerified": "2026-03-24"
|
|
94
|
+
},
|
|
95
|
+
"vercel": {
|
|
96
|
+
"id": "vercel",
|
|
97
|
+
"name": "Vercel",
|
|
98
|
+
"packageNames": ["@vercel/analytics", "@vercel/functions", "@vercel/speed-insights", "@vercel/blob", "@vercel/edge-config"],
|
|
99
|
+
"envPatterns": ["VERCEL_TOKEN", "VERCEL_ORG_ID", "VERCEL_PROJECT_ID"],
|
|
100
|
+
"importPatterns": ["@vercel/"],
|
|
101
|
+
"mentionKeywords": ["vercel", "vercel deploy", "vercel functions"],
|
|
102
|
+
"billingModel": "compute",
|
|
103
|
+
"scalingShape": "tiered_jump",
|
|
104
|
+
"apiTier": "live",
|
|
105
|
+
"apiEndpoint": "https://api.vercel.com/v2/teams/{teamId}/billing",
|
|
106
|
+
"pricing": {
|
|
107
|
+
"formula": "base_plan + function_invocations + bandwidth + edge_requests",
|
|
108
|
+
"monthlyBase": 20
|
|
109
|
+
},
|
|
110
|
+
"gotchas": [
|
|
111
|
+
"Pro plan is $20/mo base, but overages on functions, bandwidth, and edge requests can spike",
|
|
112
|
+
"Edge Function pricing differs from Serverless Function pricing",
|
|
113
|
+
"Image optimization has separate per-image charges"
|
|
114
|
+
],
|
|
115
|
+
"alternatives": ["netlify", "railway", "fly.io"],
|
|
116
|
+
"docsUrl": "https://vercel.com/docs/pricing",
|
|
117
|
+
"lastVerified": "2026-03-24"
|
|
118
|
+
},
|
|
119
|
+
"supabase": {
|
|
120
|
+
"id": "supabase",
|
|
121
|
+
"name": "Supabase",
|
|
122
|
+
"packageNames": ["@supabase/supabase-js", "@supabase/ssr"],
|
|
123
|
+
"envPatterns": ["SUPABASE_URL", "NEXT_PUBLIC_SUPABASE_URL", "SUPABASE_SERVICE_ROLE_KEY", "NEXT_PUBLIC_SUPABASE_ANON_KEY"],
|
|
124
|
+
"importPatterns": ["@supabase/supabase-js", "@supabase/ssr"],
|
|
125
|
+
"mentionKeywords": ["supabase"],
|
|
126
|
+
"billingModel": "tiered",
|
|
127
|
+
"scalingShape": "tiered_jump",
|
|
128
|
+
"apiTier": "live",
|
|
129
|
+
"apiEndpoint": "https://api.supabase.com/v1/projects/{ref}/usage",
|
|
130
|
+
"pricing": {
|
|
131
|
+
"formula": "plan_base + storage_overage + bandwidth_overage + function_invocations",
|
|
132
|
+
"monthlyBase": 25
|
|
133
|
+
},
|
|
134
|
+
"gotchas": [
|
|
135
|
+
"Storage charges accumulate even when idle",
|
|
136
|
+
"Database size can grow quickly with unoptimized queries or missing cleanup",
|
|
137
|
+
"Free tier pauses after 1 week of inactivity"
|
|
138
|
+
],
|
|
139
|
+
"alternatives": ["neon", "planetscale", "firebase"],
|
|
140
|
+
"docsUrl": "https://supabase.com/pricing",
|
|
141
|
+
"lastVerified": "2026-03-24"
|
|
142
|
+
},
|
|
143
|
+
"stripe": {
|
|
144
|
+
"id": "stripe",
|
|
145
|
+
"name": "Stripe",
|
|
146
|
+
"packageNames": ["stripe", "@stripe/stripe-js", "@stripe/react-stripe-js"],
|
|
147
|
+
"envPatterns": ["STRIPE_SECRET_KEY", "STRIPE_PUBLISHABLE_KEY", "NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY", "STRIPE_WEBHOOK_SECRET"],
|
|
148
|
+
"importPatterns": ["stripe"],
|
|
149
|
+
"mentionKeywords": ["stripe", "stripe payments", "stripe checkout"],
|
|
150
|
+
"billingModel": "percentage",
|
|
151
|
+
"scalingShape": "percentage",
|
|
152
|
+
"apiTier": "live",
|
|
153
|
+
"apiEndpoint": "https://api.stripe.com/v1/balance",
|
|
154
|
+
"pricing": {
|
|
155
|
+
"formula": "transaction_volume * 0.029 + transaction_count * 0.30",
|
|
156
|
+
"unitRate": 0.029,
|
|
157
|
+
"unitName": "transaction"
|
|
158
|
+
},
|
|
159
|
+
"gotchas": [
|
|
160
|
+
"2.9% + $0.30 per successful card charge — this is processing fees, not SaaS cost",
|
|
161
|
+
"International cards and currency conversion add extra fees",
|
|
162
|
+
"Disputes (chargebacks) cost $15 each regardless of outcome"
|
|
163
|
+
],
|
|
164
|
+
"docsUrl": "https://stripe.com/pricing",
|
|
165
|
+
"lastVerified": "2026-03-24",
|
|
166
|
+
"pricingNotes": "Track as processing fees, not subscription cost"
|
|
167
|
+
},
|
|
168
|
+
"scrapfly": {
|
|
169
|
+
"id": "scrapfly",
|
|
170
|
+
"name": "Scrapfly",
|
|
171
|
+
"packageNames": ["scrapfly-sdk", "scrapfly"],
|
|
172
|
+
"envPatterns": ["SCRAPFLY_KEY", "SCRAPFLY_API_KEY"],
|
|
173
|
+
"importPatterns": ["scrapfly"],
|
|
174
|
+
"mentionKeywords": ["scrapfly"],
|
|
175
|
+
"billingModel": "credit_pool",
|
|
176
|
+
"scalingShape": "linear_burndown",
|
|
177
|
+
"apiTier": "live",
|
|
178
|
+
"apiEndpoint": "https://api.scrapfly.io/account",
|
|
179
|
+
"pricing": {
|
|
180
|
+
"formula": "credits_used * credit_usd_rate",
|
|
181
|
+
"unitRate": 0.00015,
|
|
182
|
+
"unitName": "credit"
|
|
183
|
+
},
|
|
184
|
+
"gotchas": [
|
|
185
|
+
"Anti-bot bypass options consume 5-25x base credits per request",
|
|
186
|
+
"JavaScript rendering adds extra credit cost",
|
|
187
|
+
"Credits reset monthly — unused credits do not roll over"
|
|
188
|
+
],
|
|
189
|
+
"alternatives": ["cheerio", "playwright", "firecrawl"],
|
|
190
|
+
"docsUrl": "https://scrapfly.io/docs/scrape-api/billing",
|
|
191
|
+
"lastVerified": "2026-03-24"
|
|
192
|
+
},
|
|
193
|
+
"browserbase": {
|
|
194
|
+
"id": "browserbase",
|
|
195
|
+
"name": "Browserbase",
|
|
196
|
+
"packageNames": ["@browserbasehq/sdk", "@browserbasehq/stagehand"],
|
|
197
|
+
"envPatterns": ["BROWSERBASE_API_KEY", "BROWSERBASE_PROJECT_ID"],
|
|
198
|
+
"importPatterns": ["@browserbasehq/sdk", "@browserbasehq/stagehand"],
|
|
199
|
+
"mentionKeywords": ["browserbase", "stagehand"],
|
|
200
|
+
"billingModel": "per_unit",
|
|
201
|
+
"scalingShape": "linear",
|
|
202
|
+
"apiTier": "est",
|
|
203
|
+
"pricing": {
|
|
204
|
+
"formula": "sessions * per_session_rate",
|
|
205
|
+
"unitName": "session"
|
|
206
|
+
},
|
|
207
|
+
"gotchas": [
|
|
208
|
+
"Session duration affects cost — long-running browser sessions burn more",
|
|
209
|
+
"Concurrent session limits may cause queuing on lower plans"
|
|
210
|
+
],
|
|
211
|
+
"alternatives": ["playwright", "puppeteer"],
|
|
212
|
+
"docsUrl": "https://docs.browserbase.com/guides/pricing",
|
|
213
|
+
"lastVerified": "2026-03-24"
|
|
214
|
+
},
|
|
215
|
+
"upstash": {
|
|
216
|
+
"id": "upstash",
|
|
217
|
+
"name": "Upstash Redis",
|
|
218
|
+
"packageNames": ["@upstash/redis", "@upstash/ratelimit", "@upstash/vector", "@upstash/qstash"],
|
|
219
|
+
"envPatterns": ["UPSTASH_REDIS_REST_URL", "UPSTASH_REDIS_REST_TOKEN"],
|
|
220
|
+
"importPatterns": ["@upstash/redis", "@upstash/ratelimit"],
|
|
221
|
+
"mentionKeywords": ["upstash", "upstash redis"],
|
|
222
|
+
"billingModel": "per_unit",
|
|
223
|
+
"scalingShape": "linear",
|
|
224
|
+
"apiTier": "est",
|
|
225
|
+
"pricing": {
|
|
226
|
+
"formula": "commands * per_command_rate",
|
|
227
|
+
"unitRate": 0.000002,
|
|
228
|
+
"unitName": "command"
|
|
229
|
+
},
|
|
230
|
+
"gotchas": [
|
|
231
|
+
"Free tier includes 10K commands/day",
|
|
232
|
+
"Pay-as-you-go is $0.2 per 100K commands after free tier"
|
|
233
|
+
],
|
|
234
|
+
"alternatives": ["redis (self-hosted)", "dragonfly"],
|
|
235
|
+
"docsUrl": "https://upstash.com/pricing",
|
|
236
|
+
"lastVerified": "2026-03-24"
|
|
237
|
+
},
|
|
238
|
+
"resend": {
|
|
239
|
+
"id": "resend",
|
|
240
|
+
"name": "Resend",
|
|
241
|
+
"packageNames": ["resend"],
|
|
242
|
+
"envPatterns": ["RESEND_API_KEY"],
|
|
243
|
+
"importPatterns": ["resend"],
|
|
244
|
+
"mentionKeywords": ["resend"],
|
|
245
|
+
"billingModel": "per_unit",
|
|
246
|
+
"scalingShape": "linear",
|
|
247
|
+
"apiTier": "est",
|
|
248
|
+
"pricing": {
|
|
249
|
+
"formula": "emails_sent * per_email_rate",
|
|
250
|
+
"unitName": "email"
|
|
251
|
+
},
|
|
252
|
+
"gotchas": [
|
|
253
|
+
"Free tier: 100 emails/day, 3000/month",
|
|
254
|
+
"Pro plan: $20/mo for 50K emails",
|
|
255
|
+
"Charges per email sent, not per API call"
|
|
256
|
+
],
|
|
257
|
+
"alternatives": ["sendgrid", "postmark", "ses"],
|
|
258
|
+
"docsUrl": "https://resend.com/pricing",
|
|
259
|
+
"lastVerified": "2026-03-24"
|
|
260
|
+
},
|
|
261
|
+
"inngest": {
|
|
262
|
+
"id": "inngest",
|
|
263
|
+
"name": "Inngest",
|
|
264
|
+
"packageNames": ["inngest"],
|
|
265
|
+
"envPatterns": ["INNGEST_EVENT_KEY", "INNGEST_SIGNING_KEY"],
|
|
266
|
+
"importPatterns": ["inngest"],
|
|
267
|
+
"mentionKeywords": ["inngest"],
|
|
268
|
+
"billingModel": "tiered",
|
|
269
|
+
"scalingShape": "tiered_jump",
|
|
270
|
+
"apiTier": "calc",
|
|
271
|
+
"pricing": {
|
|
272
|
+
"formula": "plan_base + function_runs_overage",
|
|
273
|
+
"unitName": "function run"
|
|
274
|
+
},
|
|
275
|
+
"gotchas": [
|
|
276
|
+
"Free tier: 24hr event history, community support",
|
|
277
|
+
"Cost scales with function step count, not just invocation count"
|
|
278
|
+
],
|
|
279
|
+
"alternatives": ["trigger.dev", "temporal"],
|
|
280
|
+
"docsUrl": "https://www.inngest.com/pricing",
|
|
281
|
+
"lastVerified": "2026-03-24"
|
|
282
|
+
},
|
|
283
|
+
"posthog": {
|
|
284
|
+
"id": "posthog",
|
|
285
|
+
"name": "PostHog",
|
|
286
|
+
"packageNames": ["posthog-js", "posthog-node"],
|
|
287
|
+
"envPatterns": ["POSTHOG_KEY", "NEXT_PUBLIC_POSTHOG_KEY", "POSTHOG_HOST", "NEXT_PUBLIC_POSTHOG_HOST"],
|
|
288
|
+
"importPatterns": ["posthog-js", "posthog-node"],
|
|
289
|
+
"mentionKeywords": ["posthog"],
|
|
290
|
+
"billingModel": "tiered",
|
|
291
|
+
"scalingShape": "tiered_jump",
|
|
292
|
+
"apiTier": "calc",
|
|
293
|
+
"pricing": {
|
|
294
|
+
"formula": "events beyond free tier * per_event_rate",
|
|
295
|
+
"unitName": "event"
|
|
296
|
+
},
|
|
297
|
+
"gotchas": [
|
|
298
|
+
"Free tier: 1M events/month — generous but easy to exceed with high-traffic apps",
|
|
299
|
+
"Session replay, feature flags, and surveys have separate pricing",
|
|
300
|
+
"Self-hosted option eliminates hosting cost but requires infrastructure"
|
|
301
|
+
],
|
|
302
|
+
"alternatives": ["mixpanel", "amplitude", "plausible"],
|
|
303
|
+
"docsUrl": "https://posthog.com/pricing",
|
|
304
|
+
"lastVerified": "2026-03-24"
|
|
305
|
+
},
|
|
306
|
+
"aws": {
|
|
307
|
+
"id": "aws",
|
|
308
|
+
"name": "Amazon Web Services",
|
|
309
|
+
"packageNames": ["@aws-sdk/client-s3", "@aws-sdk/client-ecs", "@aws-sdk/client-ssm", "@aws-sdk/client-lambda", "aws-sdk"],
|
|
310
|
+
"envPatterns": ["AWS_ACCESS_KEY_ID", "AWS_SECRET_ACCESS_KEY", "AWS_REGION", "AWS_SESSION_TOKEN"],
|
|
311
|
+
"importPatterns": ["@aws-sdk/"],
|
|
312
|
+
"mentionKeywords": ["aws", "amazon web services", "s3", "ecs", "lambda"],
|
|
313
|
+
"billingModel": "compute",
|
|
314
|
+
"scalingShape": "linear",
|
|
315
|
+
"apiTier": "blind",
|
|
316
|
+
"pricing": {
|
|
317
|
+
"formula": "Varies by service — S3, ECS, Lambda, etc. each have distinct pricing"
|
|
318
|
+
},
|
|
319
|
+
"gotchas": [
|
|
320
|
+
"AWS Cost Explorer API exists but requires IAM permissions and is itself billed",
|
|
321
|
+
"Data transfer costs are the most common surprise on AWS bills",
|
|
322
|
+
"ECS Fargate pricing is per-vCPU-hour and per-GB-hour"
|
|
323
|
+
],
|
|
324
|
+
"alternatives": ["gcp", "azure", "fly.io"],
|
|
325
|
+
"docsUrl": "https://aws.amazon.com/pricing/",
|
|
326
|
+
"lastVerified": "2026-03-24",
|
|
327
|
+
"pricingNotes": "Complex multi-service billing — recommend tracking via AWS Cost Explorer directly"
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: setup-burnwatch
|
|
3
|
+
description: Guided burnwatch setup — detects paid services in the project and walks through configuring budgets and API keys for each one. Use when the user wants to set up cost tracking, mentions burnwatch setup, or when burnwatch is not yet initialized.
|
|
4
|
+
user-invocable: true
|
|
5
|
+
allowed-tools: Read, Bash, Glob, Grep
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# /setup-burnwatch — Guided Cost Tracking Setup
|
|
9
|
+
|
|
10
|
+
Walk the user through setting up burnwatch for their project. This is an interactive, conversational onboarding — not a dump of commands.
|
|
11
|
+
|
|
12
|
+
## Step 1: Initialize
|
|
13
|
+
|
|
14
|
+
Check if `.burnwatch/config.json` exists. If not, run:
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
node <path-to-burnwatch>/dist/cli.js init
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
Present the detected services to the user in a clean summary.
|
|
21
|
+
|
|
22
|
+
## Step 2: Guided Service Configuration
|
|
23
|
+
|
|
24
|
+
For each detected service, walk the user through configuration **one service at a time** or in logical groups. Use this priority order:
|
|
25
|
+
|
|
26
|
+
### High-priority (usage-based, likely to cause surprises):
|
|
27
|
+
1. **LLM providers** (Anthropic, OpenAI, Google Gemini) — these are usually the biggest spend
|
|
28
|
+
2. **Scraping/browser** (Scrapfly, Browserbase) — credit-based, easy to overspend
|
|
29
|
+
3. **Infrastructure** (Vercel, AWS, Supabase) — tiered with overages
|
|
30
|
+
|
|
31
|
+
### Medium-priority (transaction/event-based):
|
|
32
|
+
4. **Payments** (Stripe) — percentage-based, scales with revenue
|
|
33
|
+
5. **Email** (Resend) — per-email, usually small
|
|
34
|
+
6. **Cache/queue** (Upstash, Inngest) — per-command, usually small
|
|
35
|
+
|
|
36
|
+
### Low-priority (flat-rate or free tier):
|
|
37
|
+
7. **Analytics** (PostHog) — often on free tier
|
|
38
|
+
8. **Embeddings** (Voyage AI) — usually small volume
|
|
39
|
+
|
|
40
|
+
For each service, ask the user:
|
|
41
|
+
|
|
42
|
+
1. **"Do you have a billing/admin API key for [service]?"**
|
|
43
|
+
- If yes: `burnwatch add <service> --key <KEY> --budget <N>`
|
|
44
|
+
- If no: explain what tier they'll get (CALC/EST) and that's fine
|
|
45
|
+
|
|
46
|
+
2. **"What's your monthly budget for [service]?"**
|
|
47
|
+
- Suggest a reasonable default based on the service type
|
|
48
|
+
- For flat-rate: "What plan are you on? (e.g., PostHog free tier = $0/mo)"
|
|
49
|
+
|
|
50
|
+
3. **"Any notes?"** — skip this for most, but for complex services like AWS, acknowledge that burnwatch tracks it as BLIND and suggest they check their AWS console directly.
|
|
51
|
+
|
|
52
|
+
## Step 3: Show the Brief
|
|
53
|
+
|
|
54
|
+
After configuring all services, run `burnwatch status` and show the result. Celebrate what's tracked and be honest about what's still BLIND.
|
|
55
|
+
|
|
56
|
+
## Key Behaviors
|
|
57
|
+
|
|
58
|
+
- **Be concise.** Don't explain what burnwatch is — the user already chose to set it up.
|
|
59
|
+
- **Group services.** Don't ask 14 questions one at a time. Group similar services: "For your LLM providers (Anthropic, OpenAI) — do you have admin API keys? What monthly budget for each?"
|
|
60
|
+
- **Suggest defaults.** "Most projects budget $50-100/mo for Anthropic. Sound right?"
|
|
61
|
+
- **Skip what's obvious.** If PostHog is on free tier, just say "I'll set PostHog to $0/mo free tier" and move on.
|
|
62
|
+
- **Be honest about BLIND.** "AWS is too complex for automatic tracking — I'll flag it so you see it in the ledger, but check your AWS console for actual spend."
|
|
63
|
+
- **Show the payoff.** End with the brief so they see the value immediately.
|
|
64
|
+
|
|
65
|
+
## Example Conversation Flow
|
|
66
|
+
|
|
67
|
+
```
|
|
68
|
+
Agent: I found 11 paid services in your project. Let me walk you through
|
|
69
|
+
setting up cost tracking for each one. This takes about 2 minutes.
|
|
70
|
+
|
|
71
|
+
First, your LLM providers — Anthropic and OpenAI.
|
|
72
|
+
Do you have admin API keys for either? And what monthly budget
|
|
73
|
+
feels right? Most projects do $50-150/mo per provider.
|
|
74
|
+
|
|
75
|
+
User: I have my anthropic admin key, it's sk-ant-admin-xxx. Budget $100.
|
|
76
|
+
OpenAI I don't have an admin key. Budget $50.
|
|
77
|
+
|
|
78
|
+
Agent: Got it.
|
|
79
|
+
✅ Anthropic — LIVE tracking, $100/mo budget
|
|
80
|
+
🔴 OpenAI — no admin key, setting $50 budget (will show as BLIND
|
|
81
|
+
until you add a key)
|
|
82
|
+
|
|
83
|
+
Next, your scraping services — Scrapfly and Browserbase.
|
|
84
|
+
These are credit-based and the most common source of surprise bills.
|
|
85
|
+
Do you have API keys? Budget thoughts?
|
|
86
|
+
|
|
87
|
+
[... continues through all services ...]
|
|
88
|
+
|
|
89
|
+
Agent: All set! Here's your spend brief:
|
|
90
|
+
[shows burnwatch status output]
|
|
91
|
+
|
|
92
|
+
You're tracking 8 services with real data, 3 are estimated,
|
|
93
|
+
and AWS is flagged as BLIND. The brief will appear automatically
|
|
94
|
+
at the start of every Claude Code session.
|
|
95
|
+
```
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: spend
|
|
3
|
+
description: Show current burnwatch spend brief for this project. Use when the user asks about costs, spend, budget, or says /spend.
|
|
4
|
+
user-invocable: true
|
|
5
|
+
allowed-tools: Read, Bash, Glob
|
|
6
|
+
argument-hint: "[service]"
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# /spend — Show Current Spend Brief
|
|
10
|
+
|
|
11
|
+
Run the burnwatch status command and present the results to the user.
|
|
12
|
+
|
|
13
|
+
## Instructions
|
|
14
|
+
|
|
15
|
+
1. Check if burnwatch is initialized by looking for `.burnwatch/config.json` in the project root
|
|
16
|
+
2. If not initialized, tell the user: "burnwatch isn't set up yet. Want me to run `/setup-burnwatch` to get started?"
|
|
17
|
+
3. If initialized, run: `node <path-to-burnwatch>/dist/cli.js status`
|
|
18
|
+
4. Present the brief output directly — it's already formatted for terminal display
|
|
19
|
+
5. If the user passed a service name as $ARGUMENTS, also read the registry entry for that service and show its gotchas, alternatives, and pricing details
|
|
20
|
+
|
|
21
|
+
If the user asks about a specific service (e.g., `/spend scrapfly`), also include:
|
|
22
|
+
- Current spend and budget status
|
|
23
|
+
- The service's gotchas from the registry
|
|
24
|
+
- Known alternatives
|
|
25
|
+
- Pricing model and scaling shape
|