burnwatch 0.11.0 → 0.12.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/CHANGELOG.md +63 -0
- package/dist/cli.js +24 -0
- package/dist/cli.js.map +1 -1
- package/dist/cost-impact.js +54 -0
- package/dist/cost-impact.js.map +1 -1
- package/dist/hooks/on-file-change.js +54 -0
- package/dist/hooks/on-file-change.js.map +1 -1
- package/dist/hooks/on-prompt.js +24 -0
- package/dist/hooks/on-prompt.js.map +1 -1
- package/dist/hooks/on-session-start.js +24 -0
- package/dist/hooks/on-session-start.js.map +1 -1
- package/dist/hooks/on-stop.js +39 -5
- package/dist/hooks/on-stop.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +54 -0
- package/dist/index.js.map +1 -1
- package/dist/mcp-server.js +35 -8
- package/dist/mcp-server.js.map +1 -1
- package/package.json +1 -1
- package/registry.json +286 -2
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,65 @@ All notable changes to burnwatch will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [0.12.0] - 2026-03-25
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
- **10 new services in registry** (14 → 24): Firebase, Cloudflare, Neon Postgres, MongoDB Atlas, Twilio, SendGrid, Sentry, Clerk, DeepSeek, Replicate. All with plans, pricing, gotchas, detection patterns, and cost-impact SDK call patterns.
|
|
13
|
+
- **EST tier activated**: BLIND services with accumulated cost-impact data from file change analysis are now upgraded to EST tier in the spend brief. Uses the midpoint of projected cost range. The EST tier was defined since v0.1.0 but never produced — now it is.
|
|
14
|
+
- **Connector and probe tests**: 20 new tests with mocked HTTP covering all 6 billing connectors and 9 service probes. Total test count: 40 → 60.
|
|
15
|
+
- **Registry cache invalidation**: The registry cache now tracks file mtime and auto-invalidates when `registry.json` is modified. Prevents stale data in long-running processes (MCP server).
|
|
16
|
+
- **Community contribution guide**: Rewrote `CONTRIBUTING.md` with tiered contribution path — registry-only (5 min, JSON), billing connector (30 min, TypeScript), and probe (plan auto-detection). Documented `.burnwatch/registry.json` project-local override for custom services.
|
|
17
|
+
|
|
18
|
+
### Fixed
|
|
19
|
+
|
|
20
|
+
- **Registry `apiTier` reconciled with actual connectors**: `browserbase` changed from `"est"` to `"live"` (has a working connector). `stripe` changed from `"live"` to `"calc"` (no billing connector — only has a probe for balance checking, not Stripe's fees to you).
|
|
21
|
+
- **MCP server version**: Was hardcoded at `"0.1.2"` since initial release. Now reads dynamically from `package.json`.
|
|
22
|
+
|
|
23
|
+
### Changed
|
|
24
|
+
|
|
25
|
+
- Cost-impact SDK call patterns added for Firebase, Twilio, SendGrid, MongoDB, Clerk, and Replicate.
|
|
26
|
+
|
|
27
|
+
## [0.11.0] - 2026-03-25
|
|
28
|
+
|
|
29
|
+
### Fixed
|
|
30
|
+
|
|
31
|
+
- **CALC services showed ~$0.00 in session brief**: Session-start hook was passing raw `planCost` as spend instead of projecting based on day of month. Now correctly calculates `(planCost / daysInMonth) * dayOfMonth`.
|
|
32
|
+
- **envKeysFound always empty**: `.env` file scanning only ran conditionally. Now always scans `.env`, `.env.local`, `.env.development` on disk and populates `envKeysFound` regardless of global key status.
|
|
33
|
+
- **Box-drawing characters render poorly in agent/IDE contexts**: Added `formatBriefMarkdown()` using markdown tables. Session-start hook now uses markdown format.
|
|
34
|
+
- **Excluded services showing as BLIND in brief**: Added `filter(s => s.tier !== "excluded")` to brief display.
|
|
35
|
+
- **`configure --key` silent when LIVE not possible**: Now returns `tierNote` explaining why a key didn't enable LIVE tracking (e.g., no billing connector for that service).
|
|
36
|
+
|
|
37
|
+
### Added
|
|
38
|
+
|
|
39
|
+
- **`burnwatch reset` command**: Removes `.burnwatch/`, skills from `.claude/skills/`, and hooks from `.claude/settings.json`. Preserves global API keys in `~/.config/burnwatch/`.
|
|
40
|
+
- **Interview JSON enrichment**: `hasConnector`, `canGoLive`, `envKeysFound[]`, `suggestedAction`, and `instructions{}` fields guide agent behavior during the interview.
|
|
41
|
+
|
|
42
|
+
## [0.10.0] - 2026-03-25
|
|
43
|
+
|
|
44
|
+
### Added
|
|
45
|
+
|
|
46
|
+
- **Supabase billing connector**: Uses Management API via Personal Access Token (PAT). Detects plan tier (free/pro/team), maps to monthly cost, and checks usage endpoint for overages.
|
|
47
|
+
- **Browserbase billing connector**: Uses projects/usage API to track session count and browser minutes. Estimates spend from minutes × rate.
|
|
48
|
+
|
|
49
|
+
### Changed
|
|
50
|
+
|
|
51
|
+
- **Interview skill rewritten**: Complete rewrite of `/burnwatch-interview` SKILL.md. Now leads with API key discovery from `.env` files BEFORE asking questions. Enforces one-service-at-a-time pacing. Includes smart inference (e.g., `gpt-4o-mini` → low budget suggestion). Budget philosophy: LIVE → track actual + alert threshold; CALC → budget = plan cost; BLIND → safety net budget.
|
|
52
|
+
- **BLIND services no longer show $0.00**: Shows "—" instead of "$0.00" to avoid false confidence. Status label says "needs API key" instead of "no budget".
|
|
53
|
+
- **Brief footer says "No billing data: N"** instead of "Untracked: N" — because services ARE configured with budgets, they just lack billing API access.
|
|
54
|
+
- **`pollService` returns explicit error context** when LIVE fails instead of silently falling through to CALC/BLIND.
|
|
55
|
+
|
|
56
|
+
## [0.9.0] - 2026-03-25
|
|
57
|
+
|
|
58
|
+
### Added
|
|
59
|
+
|
|
60
|
+
- **Skill auto-installation during init**: `registerHooks()` now copies `/burnwatch-interview`, `/setup-burnwatch`, and `/spend` skills to `.claude/skills/` so agents can discover them.
|
|
61
|
+
- **Non-TTY init suggests `/burnwatch-interview`**: When running in an agent context, init output recommends the conversational interview skill instead of manual CLI commands.
|
|
62
|
+
|
|
63
|
+
### Changed
|
|
64
|
+
|
|
65
|
+
- **Terminology update**: All references to "vibe coding" changed to "AI-assisted development" across package description, README, llms.txt, and source files.
|
|
66
|
+
|
|
8
67
|
## [0.8.0] - 2026-03-25
|
|
9
68
|
|
|
10
69
|
### Added
|
|
@@ -133,6 +192,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
133
192
|
- Snapshot system for delta computation across sessions
|
|
134
193
|
- Claude Code skills: `/spend` (on-demand brief), `/setup-burnwatch` (guided onboarding)
|
|
135
194
|
|
|
195
|
+
[0.12.0]: https://github.com/RaleighSF/burnwatch/compare/v0.11.0...v0.12.0
|
|
196
|
+
[0.11.0]: https://github.com/RaleighSF/burnwatch/compare/v0.10.0...v0.11.0
|
|
197
|
+
[0.10.0]: https://github.com/RaleighSF/burnwatch/compare/v0.9.0...v0.10.0
|
|
198
|
+
[0.9.0]: https://github.com/RaleighSF/burnwatch/compare/v0.8.0...v0.9.0
|
|
136
199
|
[0.8.0]: https://github.com/RaleighSF/burnwatch/compare/v0.7.0...v0.8.0
|
|
137
200
|
[0.7.0]: https://github.com/RaleighSF/burnwatch/compare/v0.6.0...v0.7.0
|
|
138
201
|
[0.6.0]: https://github.com/RaleighSF/burnwatch/compare/v0.5.2...v0.6.0
|
package/dist/cli.js
CHANGED
|
@@ -363,9 +363,22 @@ import * as path2 from "path";
|
|
|
363
363
|
import * as url from "url";
|
|
364
364
|
var __dirname = path2.dirname(url.fileURLToPath(import.meta.url));
|
|
365
365
|
var cachedRegistry = null;
|
|
366
|
+
var cachedRegistryPath = null;
|
|
367
|
+
var cachedRegistryMtime = null;
|
|
366
368
|
function loadRegistry(projectRoot) {
|
|
369
|
+
if (cachedRegistry && cachedRegistryPath && cachedRegistryMtime !== null) {
|
|
370
|
+
try {
|
|
371
|
+
const stat = fs2.statSync(cachedRegistryPath);
|
|
372
|
+
if (stat.mtimeMs !== cachedRegistryMtime) {
|
|
373
|
+
cachedRegistry = null;
|
|
374
|
+
}
|
|
375
|
+
} catch {
|
|
376
|
+
cachedRegistry = null;
|
|
377
|
+
}
|
|
378
|
+
}
|
|
367
379
|
if (cachedRegistry) return cachedRegistry;
|
|
368
380
|
const registry = /* @__PURE__ */ new Map();
|
|
381
|
+
let resolvedPath = null;
|
|
369
382
|
const candidates = [
|
|
370
383
|
path2.resolve(__dirname, "../../registry.json"),
|
|
371
384
|
// from src/core/
|
|
@@ -375,6 +388,7 @@ function loadRegistry(projectRoot) {
|
|
|
375
388
|
for (const candidate of candidates) {
|
|
376
389
|
if (fs2.existsSync(candidate)) {
|
|
377
390
|
loadRegistryFile(candidate, registry);
|
|
391
|
+
resolvedPath = candidate;
|
|
378
392
|
break;
|
|
379
393
|
}
|
|
380
394
|
}
|
|
@@ -382,9 +396,19 @@ function loadRegistry(projectRoot) {
|
|
|
382
396
|
const localPath = path2.join(projectRoot, ".burnwatch", "registry.json");
|
|
383
397
|
if (fs2.existsSync(localPath)) {
|
|
384
398
|
loadRegistryFile(localPath, registry);
|
|
399
|
+
resolvedPath = localPath;
|
|
385
400
|
}
|
|
386
401
|
}
|
|
387
402
|
cachedRegistry = registry;
|
|
403
|
+
if (resolvedPath) {
|
|
404
|
+
try {
|
|
405
|
+
cachedRegistryPath = resolvedPath;
|
|
406
|
+
cachedRegistryMtime = fs2.statSync(resolvedPath).mtimeMs;
|
|
407
|
+
} catch {
|
|
408
|
+
cachedRegistryPath = null;
|
|
409
|
+
cachedRegistryMtime = null;
|
|
410
|
+
}
|
|
411
|
+
}
|
|
388
412
|
return registry;
|
|
389
413
|
}
|
|
390
414
|
function loadRegistryFile(filePath, registry) {
|