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/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