vibe-roast 0.98.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/README.md +418 -0
- package/assests/README.md +43 -0
- package/assests/badges/.gitkeep +0 -0
- package/assests/badges/01-builder/builder-badge.png +0 -0
- package/assests/badges/01-builder/builder-badge.svg +4 -0
- package/assests/badges/02-debugger/debugger-badge.png +0 -0
- package/assests/badges/02-debugger/debugger-badge.svg +4 -0
- package/assests/badges/03-architect/architect-badge.png +0 -0
- package/assests/badges/03-architect/architect-badge.svg +4 -0
- package/assests/badges/04-codex-believer/codex-believer-badge.png +0 -0
- package/assests/badges/04-codex-believer/codex-believer-badge.svg +4 -0
- package/assests/badges/05-prompt-priest/prompt-priest-badge.png +0 -0
- package/assests/badges/05-prompt-priest/prompt-priest-badge.svg +4 -0
- package/assests/badges/06-tab-hoarder/tab-hoarder-badge.png +0 -0
- package/assests/badges/06-tab-hoarder/tab-hoarder-badge.svg +4 -0
- package/assests/badges/07-context-maxxer/context-maxxer-badge.png +0 -0
- package/assests/badges/07-context-maxxer/context-maxxer-badge.svg +4 -0
- package/assests/badges/08-yolo-shipper/yolo-shipper-badge.png +0 -0
- package/assests/badges/08-yolo-shipper/yolo-shipper-badge.svg +4 -0
- package/assests/banners/.gitkeep +0 -0
- package/assests/banners/home-hero.png +0 -0
- package/assests/banners/home-hero.svg +3 -0
- package/assests/banners/result-header.png +0 -0
- package/assests/banners/result-header.svg +3 -0
- package/assests/banners/share-strip.png +0 -0
- package/assests/banners/share-strip.svg +3 -0
- package/assests/characters/01-builder/builder-card.sbti-archive.svg +5 -0
- package/assests/characters/01-builder/builder-card.svg +3 -0
- package/assests/characters/01-builder/builder-character.sbti-archive.svg +3 -0
- package/assests/characters/01-builder/builder-character.svg +3 -0
- package/assests/characters/01-builder/builder-figure.png +0 -0
- package/assests/characters/01-builder/builder-mascot.png +0 -0
- package/assests/characters/02-debugger/debugger-card.sbti-archive.svg +5 -0
- package/assests/characters/02-debugger/debugger-card.svg +3 -0
- package/assests/characters/02-debugger/debugger-character.sbti-archive.svg +3 -0
- package/assests/characters/02-debugger/debugger-character.svg +3 -0
- package/assests/characters/02-debugger/debugger-figure.png +0 -0
- package/assests/characters/02-debugger/debugger-mascot.png +0 -0
- package/assests/characters/03-architect/architect-card.sbti-archive.svg +5 -0
- package/assests/characters/03-architect/architect-card.svg +3 -0
- package/assests/characters/03-architect/architect-character.sbti-archive.svg +3 -0
- package/assests/characters/03-architect/architect-character.svg +3 -0
- package/assests/characters/03-architect/architect-figure.png +0 -0
- package/assests/characters/03-architect/architect-mascot.png +0 -0
- package/assests/characters/04-codex-believer/codex-believer-card.sbti-archive.svg +5 -0
- package/assests/characters/04-codex-believer/codex-believer-card.svg +3 -0
- package/assests/characters/04-codex-believer/codex-believer-character.sbti-archive.svg +3 -0
- package/assests/characters/04-codex-believer/codex-believer-character.svg +3 -0
- package/assests/characters/04-codex-believer/codex-believer-figure.png +0 -0
- package/assests/characters/04-codex-believer/codex-believer-mascot.png +0 -0
- package/assests/characters/05-prompt-priest/prompt-priest-card.sbti-archive.svg +5 -0
- package/assests/characters/05-prompt-priest/prompt-priest-card.svg +3 -0
- package/assests/characters/05-prompt-priest/prompt-priest-character.sbti-archive.svg +3 -0
- package/assests/characters/05-prompt-priest/prompt-priest-character.svg +3 -0
- package/assests/characters/05-prompt-priest/prompt-priest-figure.png +0 -0
- package/assests/characters/05-prompt-priest/prompt-priest-mascot.png +0 -0
- package/assests/characters/06-tab-hoarder/tab-hoarder-card.sbti-archive.svg +5 -0
- package/assests/characters/06-tab-hoarder/tab-hoarder-card.svg +3 -0
- package/assests/characters/06-tab-hoarder/tab-hoarder-character.sbti-archive.svg +3 -0
- package/assests/characters/06-tab-hoarder/tab-hoarder-character.svg +3 -0
- package/assests/characters/06-tab-hoarder/tab-hoarder-figure.png +0 -0
- package/assests/characters/06-tab-hoarder/tab-hoarder-mascot.png +0 -0
- package/assests/characters/07-context-maxxer/context-maxxer-card.sbti-archive.svg +5 -0
- package/assests/characters/07-context-maxxer/context-maxxer-card.svg +3 -0
- package/assests/characters/07-context-maxxer/context-maxxer-character.sbti-archive.svg +3 -0
- package/assests/characters/07-context-maxxer/context-maxxer-character.svg +3 -0
- package/assests/characters/07-context-maxxer/context-maxxer-figure.png +0 -0
- package/assests/characters/07-context-maxxer/context-maxxer-mascot.png +0 -0
- package/assests/characters/08-yolo-shipper/yolo-shipper-card.sbti-archive.svg +5 -0
- package/assests/characters/08-yolo-shipper/yolo-shipper-card.svg +3 -0
- package/assests/characters/08-yolo-shipper/yolo-shipper-character.sbti-archive.svg +3 -0
- package/assests/characters/08-yolo-shipper/yolo-shipper-character.svg +3 -0
- package/assests/characters/08-yolo-shipper/yolo-shipper-figure.png +0 -0
- package/assests/characters/08-yolo-shipper/yolo-shipper-mascot.png +0 -0
- package/assests/characters-vibe-types/aosf-strategy-shipper/strategy-shipper-figure.png +0 -0
- package/assests/characters-vibe-types/aosx-agent-believer/agent-believer-figure.png +0 -0
- package/assests/characters-vibe-types/aovf-systems-architect/systems-architect-figure.png +0 -0
- package/assests/characters-vibe-types/aovx-context-cartographer/context-cartographer-figure.png +0 -0
- package/assests/characters-vibe-types/apsf-diagram-sprinter/diagram-sprinter-figure.png +0 -0
- package/assests/characters-vibe-types/apsx-infinite-planner/infinite-planner-figure.png +0 -0
- package/assests/characters-vibe-types/apvf-architect/architect-figure.png +0 -0
- package/assests/characters-vibe-types/apvx-prompt-priest/prompt-priest-figure.png +0 -0
- package/assests/characters-vibe-types/mosf-yolo-shipper/yolo-shipper-figure.png +0 -0
- package/assests/characters-vibe-types/mosx-agent-commander/agent-commander-figure.png +0 -0
- package/assests/characters-vibe-types/movf-agent-engineer/agent-engineer-figure.png +0 -0
- package/assests/characters-vibe-types/movx-systems-wrangler/systems-wrangler-figure.png +0 -0
- package/assests/characters-vibe-types/mpsf-builder/builder-figure.png +0 -0
- package/assests/characters-vibe-types/mpsx-tab-hoarder/tab-hoarder-figure.png +0 -0
- package/assests/characters-vibe-types/mpvf-debugger/debugger-figure.png +0 -0
- package/assests/characters-vibe-types/mpvx-context-maxxer/context-maxxer-figure.png +0 -0
- package/assests/live-report.html +1403 -0
- package/assests/notes/live-inspect-summary.json +3487 -0
- package/assests/scripts/compose-banners.py +148 -0
- package/assests/scripts/live-report-boot.js +2 -0
- package/assests/scripts/profiles.json +104 -0
- package/assests/scripts/qa-faces.mjs +72 -0
- package/assests/scripts/roast-extras.js +619 -0
- package/assests/scripts/score-engine.js +62 -0
- package/assests/scripts/split-badges.py +49 -0
- package/assests/scripts/split-reference.py +38 -0
- package/assests/scripts/sync-banners.mjs +45 -0
- package/assests/scripts/sync-cards.mjs +50 -0
- package/assests/scripts/sync-raster.mjs +118 -0
- package/assests/scripts/vibe-types.json +22 -0
- package/assests/source/design-system.md +50 -0
- package/assests/source/prompts/01-builder.md +19 -0
- package/assests/source/prompts/02-debugger.md +17 -0
- package/assests/source/prompts/03-architect.md +16 -0
- package/assests/source/prompts/04-codex-believer.md +13 -0
- package/assests/source/prompts/05-prompt-priest.md +13 -0
- package/assests/source/prompts/06-tab-hoarder.md +13 -0
- package/assests/source/prompts/07-context-maxxer.md +13 -0
- package/assests/source/prompts/08-yolo-shipper.md +13 -0
- package/assests/source/references/sbti-style-reference-board.png +0 -0
- package/assests/source/references/vibe-badges-v6-board.png +0 -0
- package/assests/source/references/vibe-mascots-v4-reference.png +0 -0
- package/assests/source/references/vibe-profiles-v5-board-a.png +0 -0
- package/assests/source/references/vibe-profiles-v5-board-b.png +0 -0
- package/assests/source/vibe-types-visual-brief.md +38 -0
- package/bin/hook.js +121 -0
- package/bin/vibe-roast.js +98 -0
- package/bin/vibe-wrapper.js +4 -0
- package/dashboard/dist/assets/index-DlBycTcO.css +1 -0
- package/dashboard/dist/assets/index-t8m64Hm9.js +168 -0
- package/dashboard/dist/index.html +32 -0
- package/package.json +58 -0
- package/src/extract/environment.js +160 -0
- package/src/extract/phrase-stats.js +684 -0
- package/src/extract/prompt-analysis.js +368 -0
- package/src/extract/text.js +30 -0
- package/src/hooks/install.js +184 -0
- package/src/inspect.js +261 -0
- package/src/lib/activity-metrics.js +238 -0
- package/src/lib/agent-score.js +187 -0
- package/src/lib/ai-roast.js +446 -0
- package/src/lib/dates.js +43 -0
- package/src/lib/hashtags.js +150 -0
- package/src/lib/jsonl.js +48 -0
- package/src/lib/load-env.js +59 -0
- package/src/lib/roast-evidence.js +186 -0
- package/src/lib/roast-snapshot.js +58 -0
- package/src/server.js +644 -0
- package/src/sources/aider.js +150 -0
- package/src/sources/amazonq.js +113 -0
- package/src/sources/antigravity.js +147 -0
- package/src/sources/claude.js +262 -0
- package/src/sources/cline.js +11 -0
- package/src/sources/codex.js +222 -0
- package/src/sources/common.js +133 -0
- package/src/sources/continue.js +67 -0
- package/src/sources/copilot.js +170 -0
- package/src/sources/cursor.js +238 -0
- package/src/sources/gemini.js +75 -0
- package/src/sources/index.js +61 -0
- package/src/sources/roo.js +11 -0
- package/src/sources/token-tracker.js +171 -0
- package/src/sources/vibe-tracker.js +79 -0
- package/src/sources/vscode-tasks.js +142 -0
- package/src/sources/windsurf.js +109 -0
- package/worker/README.md +96 -0
- package/worker/package-lock.json +1547 -0
- package/worker/package.json +20 -0
- package/worker/src/index.mjs +694 -0
- package/worker/wrangler.jsonc +40 -0
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
"""Compose banners from existing profile mascot PNGs only — no extra characters."""
|
|
2
|
+
import json
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
|
|
5
|
+
from PIL import Image, ImageDraw
|
|
6
|
+
|
|
7
|
+
ROOT = Path(__file__).resolve().parents[1]
|
|
8
|
+
CONFIG = Path(__file__).resolve().parent / "profiles.json"
|
|
9
|
+
BG = (10, 10, 15, 255)
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def load_profiles() -> list[dict]:
|
|
13
|
+
config = json.loads(CONFIG.read_text(encoding="utf-8"))
|
|
14
|
+
return [p for board in config["boards"] for p in board["profiles"]]
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def mascot_path(profile: dict) -> Path:
|
|
18
|
+
return ROOT / "characters" / profile["folder"] / f"{profile['name']}-mascot.png"
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def scale_to_height(im: Image.Image, height: int) -> Image.Image:
|
|
22
|
+
ratio = height / im.height
|
|
23
|
+
width = max(1, int(im.width * ratio))
|
|
24
|
+
return im.resize((width, height), Image.LANCZOS)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def draw_circuit_bg(canvas: Image.Image, accent: tuple[int, int, int] = (35, 214, 165)) -> None:
|
|
28
|
+
draw = ImageDraw.Draw(canvas)
|
|
29
|
+
w, h = canvas.size
|
|
30
|
+
for y in range(0, h, 48):
|
|
31
|
+
draw.line([(0, y), (w, y)], fill=(20, 28, 40), width=1)
|
|
32
|
+
for x in range(0, w, 64):
|
|
33
|
+
draw.line([(x, 0), (x, h)], fill=(16, 22, 32), width=1)
|
|
34
|
+
draw.line([(24, h - 24), (w - 24, h - 24)], fill=accent + (40,), width=2)
|
|
35
|
+
draw.line([(24, 24), (w * 0.35, 24)], fill=(92, 141, 255, 40), width=2)
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def paste_row(
|
|
39
|
+
canvas: Image.Image,
|
|
40
|
+
slices: list[Image.Image],
|
|
41
|
+
*,
|
|
42
|
+
pad_x: int = 16,
|
|
43
|
+
pad_y: int = 0,
|
|
44
|
+
gap: int = 8,
|
|
45
|
+
align: str = "center",
|
|
46
|
+
) -> None:
|
|
47
|
+
w, h = canvas.size
|
|
48
|
+
pad_y = pad_y or max(8, (h - slices[0].height) // 2)
|
|
49
|
+
total_w = sum(s.width for s in slices) + gap * (len(slices) - 1)
|
|
50
|
+
if align == "left":
|
|
51
|
+
x = pad_x
|
|
52
|
+
else:
|
|
53
|
+
x = max(pad_x, (w - total_w) // 2)
|
|
54
|
+
for im in slices:
|
|
55
|
+
canvas.paste(im, (x, pad_y), im)
|
|
56
|
+
x += im.width + gap
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def compose_home_hero(profiles: list[dict], out: Path) -> None:
|
|
60
|
+
"""Home: first 3 profiles on the left, empty hero space on the right."""
|
|
61
|
+
w, h = 1200, 400
|
|
62
|
+
canvas = Image.new("RGBA", (w, h), BG)
|
|
63
|
+
draw_circuit_bg(canvas)
|
|
64
|
+
|
|
65
|
+
picks = profiles[:3]
|
|
66
|
+
imgs = [scale_to_height(Image.open(mascot_path(p)).convert("RGBA"), h - 32) for p in picks]
|
|
67
|
+
paste_row(canvas, imgs, pad_x=28, pad_y=16, gap=12, align="left")
|
|
68
|
+
|
|
69
|
+
out.parent.mkdir(parents=True, exist_ok=True)
|
|
70
|
+
canvas.convert("RGB").save(out, optimize=True)
|
|
71
|
+
print(f"wrote {out} ({w}x{h})")
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def compose_share_strip(profiles: list[dict], out: Path) -> None:
|
|
75
|
+
"""Share: all 8 profiles, equal slots, full width."""
|
|
76
|
+
w, h = 1200, 400
|
|
77
|
+
canvas = Image.new("RGBA", (w, h), BG)
|
|
78
|
+
draw_circuit_bg(canvas, accent=(255, 195, 77))
|
|
79
|
+
|
|
80
|
+
slot_w = (w - 32 - 7 * 6) // 8
|
|
81
|
+
imgs = []
|
|
82
|
+
for p in profiles:
|
|
83
|
+
im = Image.open(mascot_path(p)).convert("RGBA")
|
|
84
|
+
imgs.append(scale_to_height(im, h - 24))
|
|
85
|
+
|
|
86
|
+
# Re-scale to fit equal slot widths
|
|
87
|
+
fitted = []
|
|
88
|
+
for im in imgs:
|
|
89
|
+
if im.width > slot_w:
|
|
90
|
+
ratio = slot_w / im.width
|
|
91
|
+
fitted.append(im.resize((slot_w, max(1, int(im.height * ratio))), Image.LANCZOS))
|
|
92
|
+
else:
|
|
93
|
+
fitted.append(im)
|
|
94
|
+
|
|
95
|
+
x = 16
|
|
96
|
+
for im in fitted:
|
|
97
|
+
y = (h - im.height) // 2
|
|
98
|
+
canvas.paste(im, (x, y), im)
|
|
99
|
+
x += slot_w + 6
|
|
100
|
+
|
|
101
|
+
canvas.convert("RGB").save(out, optimize=True)
|
|
102
|
+
print(f"wrote {out} ({w}x{h})")
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
def compose_result_header(profiles: list[dict], out: Path) -> None:
|
|
106
|
+
"""Result: all 8 profiles in shallow header."""
|
|
107
|
+
w, h = 1200, 280
|
|
108
|
+
canvas = Image.new("RGBA", (w, h), BG)
|
|
109
|
+
draw_circuit_bg(canvas, accent=(92, 141, 255))
|
|
110
|
+
|
|
111
|
+
target_h = h - 20
|
|
112
|
+
imgs = [scale_to_height(Image.open(mascot_path(p)).convert("RGBA"), target_h) for p in profiles]
|
|
113
|
+
slot_w = (w - 24 - 7 * 4) // 8
|
|
114
|
+
fitted = []
|
|
115
|
+
for im in imgs:
|
|
116
|
+
if im.width > slot_w:
|
|
117
|
+
ratio = slot_w / im.width
|
|
118
|
+
fitted.append(im.resize((slot_w, max(1, int(im.height * ratio))), Image.LANCZOS))
|
|
119
|
+
else:
|
|
120
|
+
fitted.append(im)
|
|
121
|
+
|
|
122
|
+
x = 12
|
|
123
|
+
for im in fitted:
|
|
124
|
+
y = (h - im.height) // 2
|
|
125
|
+
canvas.paste(im, (x, y), im)
|
|
126
|
+
x += slot_w + 4
|
|
127
|
+
|
|
128
|
+
canvas.convert("RGB").save(out, optimize=True)
|
|
129
|
+
print(f"wrote {out} ({w}x{h})")
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
def main() -> None:
|
|
133
|
+
profiles = load_profiles()
|
|
134
|
+
if len(profiles) != 8:
|
|
135
|
+
raise SystemExit(f"expected 8 profiles, got {len(profiles)}")
|
|
136
|
+
|
|
137
|
+
for p in profiles:
|
|
138
|
+
path = mascot_path(p)
|
|
139
|
+
if not path.exists():
|
|
140
|
+
raise SystemExit(f"missing mascot: {path}")
|
|
141
|
+
|
|
142
|
+
compose_home_hero(profiles, ROOT / "banners" / "home-hero.png")
|
|
143
|
+
compose_share_strip(profiles, ROOT / "banners" / "share-strip.png")
|
|
144
|
+
compose_result_header(profiles, ROOT / "banners" / "result-header.png")
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
if __name__ == "__main__":
|
|
148
|
+
main()
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
/** Auto-refreshed embed for static live-report fallback */
|
|
2
|
+
export const EMBED = {"LIVE":{"scores":{"orchestration":0.3,"promptCraft":17.8,"build":11.8,"debug":0.4,"context":15.8,"ship":4.3},"total":50.4,"tier":{"id":"NPC","min":35,"color":"#8b8680","emoji":"😐","blurb":"Background cast · needs plot","blurbZh":"路人甲 · 缺主线"},"archetype":{"id":"05-prompt-priest","folder":"05-prompt-priest","name":"prompt-priest","title":"Prompt Priest","code":"SPELL","accent":"#f0c14a","hook":"Rules scroll","hookZh":"规则卷轴"},"figure":"characters/05-prompt-priest/prompt-priest-figure.png","badge":"badges/05-prompt-priest/prompt-priest-badge.svg","dimensions":[{"key":"orchestration","label":"Agent orchestration","labelZh":"Agent 编排","hint":"Skills · MCP · multi-agent workflow","max":20,"value":0.3,"score":0.02},{"key":"promptCraft","label":"Prompt craft","labelZh":"提示词手艺","hint":"Useful intent vs paste dumps","max":18,"value":17.8,"score":0.99},{"key":"build","label":"Build throughput","labelZh":"构建吞吐","hint":"Implementation & packaging density","max":18,"value":11.8,"score":0.66},{"key":"debug","label":"Debug resilience","labelZh":"调试韧性","hint":"Breakpoint stamina & root-cause chase","max":14,"value":0.4,"score":0.03},{"key":"context","label":"Context discipline","labelZh":"上下文纪律","hint":"Window hygiene · no log farming","max":16,"value":15.8,"score":0.99},{"key":"ship","label":"Ship courage","labelZh":"上线勇气","hint":"Merge energy vs review paralysis","max":14,"value":4.3,"score":0.31}],"signals":[{"label":"Total tokens","labelZh":"总 Tokens","value":"631.7M"},{"label":"Active days","labelZh":"活跃天数","value":"112"},{"label":"Top provider","labelZh":"主平台","value":"CURSOR"}],"roast":"🔥 Your system prompt has chapters, footnotes, and a dress code. Prompt craft 17.8/18 is near-perfect; ship 4.3/14 is monastic abstinence. You can make an agent recite your coding religion, then spend three days polishing the amen until it scans in iambic pentameter.\n\nRules files grow like scripture. Few-shots become canon. The scroll is holy, the liturgy is airtight, and the binary still waits outside the temple for a baptism that somehow never makes the sprint board.\n\nBless the prompt. Then deploy something that users can sin against in production — preferably before the next rewrite of section 4.2.","roastZh":"🔥 你的 system prompt 分章节、有脚注,还有着装规范。提示词 17.8/18 接近满分,上线 4.3/14 像修道院禁欲。你能让 Agent 背诵编码教义,再花三天把「阿门」打磨成抑扬格五音步。\n\n规则文件像经文疯长。Few-shot 升级成正典。卷轴是圣物,礼仪滴水不漏,二进制还在庙门外等受洗——而这场洗礼永远挤不进 sprint 看板。\n\n请祝福提示词。然后部署一点用户能在生产环境里犯罪的东西——最好赶在下一轮重写第 4.2 节之前。","tldr":"Prompt Priest: liturgy excellence, deployment fasting.","tldrZh":"Prompt Priest:礼仪满分,部署斋戒。"},"META":{"generated_at":"2026-07-20T18:55:17.556Z","prompt_count":337,"source_count":3,"sources":{"codex":0,"claude":0,"cursor":337}},"WORDS":[{"term":"model","count":56},{"term":"代码","count":56},{"term":"讲解","count":52},{"term":"什么","count":50},{"term":"内容","count":47},{"term":"result","count":45},{"term":"实现","count":45},{"term":"详细","count":41},{"term":"pdf","count":38},{"term":"grad","count":36},{"term":"user","count":36},{"term":"ax","count":32},{"term":"roast","count":32},{"term":"html","count":30},{"term":"修改","count":29},{"term":"label","count":28},{"term":"完整","count":28},{"term":"是什","count":28},{"term":"imgs","count":27},{"term":"mbti","count":27},{"term":"现在","count":27},{"term":"character","count":26},{"term":"page","count":26},{"term":"style","count":26},{"term":"要求","count":26},{"term":"commit","count":25},{"term":"figure","count":24},{"term":"data","count":23},{"term":"怎么","count":23},{"term":"解释","count":23}],"ACTIVITY":{"source":"token-tracker","metric":"tokens","daily_rows":[{"day":"2025-10-22","total_tokens":29635820,"billable_total_tokens":29635820,"input_tokens":1973484,"cached_input_tokens":27484864,"cache_creation_input_tokens":0,"output_tokens":177472,"reasoning_output_tokens":0,"conversation_count":32,"models":{"cursor/auto":29635820},"sources":{"cursor":29635820},"value":29635820,"level_value":29635820},{"day":"2025-10-25","total_tokens":1210452,"billable_total_tokens":1210452,"input_tokens":0,"cached_input_tokens":1035520,"cache_creation_input_tokens":155399,"output_tokens":19533,"reasoning_output_tokens":0,"conversation_count":7,"models":{"cursor/auto":1210452},"sources":{"cursor":1210452},"value":1210452,"level_value":1210452},{"day":"2025-10-26","total_tokens":8056685,"billable_total_tokens":8056685,"input_tokens":0,"cached_input_tokens":7644928,"cache_creation_input_tokens":356011,"output_tokens":55746,"reasoning_output_tokens":0,"conversation_count":6,"models":{"cursor/auto":8056685},"sources":{"cursor":8056685},"value":8056685,"level_value":8056685},{"day":"2025-10-27","total_tokens":4037006,"billable_total_tokens":4037006,"input_tokens":0,"cached_input_tokens":3717120,"cache_creation_input_tokens":296510,"output_tokens":23376,"reasoning_output_tokens":0,"conversation_count":5,"models":{"cursor/auto":4037006},"sources":{"cursor":4037006},"value":4037006,"level_value":4037006},{"day":"2025-10-29","total_tokens":96850,"billable_total_tokens":96850,"input_tokens":0,"cached_input_tokens":76800,"cache_creation_input_tokens":18612,"output_tokens":1438,"reasoning_output_tokens":0,"conversation_count":1,"models":{"cursor/auto":96850},"sources":{"cursor":96850},"value":96850,"level_value":96850},{"day":"2025-11-04","total_tokens":3173694,"billable_total_tokens":3173694,"input_tokens":289121,"cached_input_tokens":2860032,"cache_creation_input_tokens":0,"output_tokens":24541,"reasoning_output_tokens":0,"conversation_count":5,"models":{"cursor/auto":3173694},"sources":{"cursor":3173694},"value":3173694,"level_value":3173694},{"day":"2025-11-05","total_tokens":21895322,"billable_total_tokens":21895322,"input_tokens":2202049,"cached_input_tokens":19509728,"cache_creation_input_tokens":0,"output_tokens":183545,"reasoning_output_tokens":0,"conversation_count":39,"models":{"cursor/auto":21895322},"sources":{"cursor":21895322},"value":21895322,"level_value":21895322},{"day":"2025-11-06","total_tokens":12074482,"billable_total_tokens":12074482,"input_tokens":507270,"cached_input_tokens":10172256,"cache_creation_input_tokens":1291440,"output_tokens":103516,"reasoning_output_tokens":0,"conversation_count":19,"models":{"cursor/auto":12074482},"sources":{"cursor":12074482},"value":12074482,"level_value":12074482},{"day":"2025-11-08","total_tokens":162984,"billable_total_tokens":162984,"input_tokens":0,"cached_input_tokens":139008,"cache_creation_input_tokens":19665,"output_tokens":4311,"reasoning_output_tokens":0,"conversation_count":2,"models":{"cursor/auto":162984},"sources":{"cursor":162984},"value":162984,"level_value":162984},{"day":"2025-11-11","total_tokens":199800,"billable_total_tokens":199800,"input_tokens":0,"cached_input_tokens":170240,"cache_creation_input_tokens":25517,"output_tokens":4043,"reasoning_output_tokens":0,"conversation_count":2,"models":{"cursor/auto":199800},"sources":{"cursor":199800},"value":199800,"level_value":199800},{"day":"2025-11-16","total_tokens":909916,"billable_total_tokens":909916,"input_tokens":0,"cached_input_tokens":828160,"cache_creation_input_tokens":71078,"output_tokens":10678,"reasoning_output_tokens":0,"conversation_count":5,"models":{"cursor/auto":909916},"sources":{"cursor":909916},"value":909916,"level_value":909916},{"day":"2025-11-18","total_tokens":23575522,"billable_total_tokens":23575522,"input_tokens":1535736,"cached_input_tokens":21464576,"cache_creation_input_tokens":491469,"output_tokens":83741,"reasoning_output_tokens":0,"conversation_count":33,"models":{"cursor/auto":23575522},"sources":{"cursor":23575522},"value":23575522,"level_value":23575522},{"day":"2025-11-19","total_tokens":27633085,"billable_total_tokens":27633085,"input_tokens":3512179,"cached_input_tokens":24020736,"cache_creation_input_tokens":0,"output_tokens":100170,"reasoning_output_tokens":0,"conversation_count":19,"models":{"cursor/auto":27633085},"sources":{"cursor":27633085},"value":27633085,"level_value":27633085},{"day":"2025-11-23","total_tokens":3356192,"billable_total_tokens":3356192,"input_tokens":0,"cached_input_tokens":3235296,"cache_creation_input_tokens":113943,"output_tokens":6953,"reasoning_output_tokens":0,"conversation_count":1,"models":{"cursor/auto":3356192},"sources":{"cursor":3356192},"value":3356192,"level_value":3356192},{"day":"2025-11-24","total_tokens":15315914,"billable_total_tokens":15315914,"input_tokens":251259,"cached_input_tokens":14696192,"cache_creation_input_tokens":288307,"output_tokens":80156,"reasoning_output_tokens":0,"conversation_count":8,"models":{"cursor/auto":15315914},"sources":{"cursor":15315914},"value":15315914,"level_value":15315914},{"day":"2025-11-25","total_tokens":610489,"billable_total_tokens":610489,"input_tokens":0,"cached_input_tokens":526080,"cache_creation_input_tokens":77613,"output_tokens":6796,"reasoning_output_tokens":0,"conversation_count":2,"models":{"cursor/auto":610489},"sources":{"cursor":610489},"value":610489,"level_value":610489},{"day":"2025-11-27","total_tokens":7766838,"billable_total_tokens":7766838,"input_tokens":369706,"cached_input_tokens":7161216,"cache_creation_input_tokens":203153,"output_tokens":32763,"reasoning_output_tokens":0,"conversation_count":11,"models":{"cursor/auto":7766838},"sources":{"cursor":7766838},"value":7766838,"level_value":7766838},{"day":"2025-11-29","total_tokens":2862380,"billable_total_tokens":2862380,"input_tokens":0,"cached_input_tokens":2557952,"cache_creation_input_tokens":275433,"output_tokens":28995,"reasoning_output_tokens":0,"conversation_count":4,"models":{"cursor/auto":2862380},"sources":{"cursor":2862380},"value":2862380,"level_value":2862380},{"day":"2025-11-30","total_tokens":9485723,"billable_total_tokens":9485723,"input_tokens":1978,"cached_input_tokens":8929536,"cache_creation_input_tokens":473249,"output_tokens":80960,"reasoning_output_tokens":0,"conversation_count":20,"models":{"cursor/auto":9485723},"sources":{"cursor":9485723},"value":9485723,"level_value":9485723},{"day":"2025-12-01","total_tokens":10363707,"billable_total_tokens":10363707,"input_tokens":1723,"cached_input_tokens":9745408,"cache_creation_input_tokens":551335,"output_tokens":65241,"reasoning_output_tokens":0,"conversation_count":21,"models":{"cursor/auto":10363707},"sources":{"cursor":10363707},"value":10363707,"level_value":10363707},{"day":"2025-12-02","total_tokens":19023403,"billable_total_tokens":19023403,"input_tokens":1094,"cached_input_tokens":17513984,"cache_creation_input_tokens":1361559,"output_tokens":146766,"reasoning_output_tokens":0,"conversation_count":27,"models":{"cursor/auto":19023403},"sources":{"cursor":19023403},"value":19023403,"level_value":19023403},{"day":"2025-12-03","total_tokens":121962,"billable_total_tokens":121962,"input_tokens":0,"cached_input_tokens":92928,"cache_creation_input_tokens":20857,"output_tokens":8177,"reasoning_output_tokens":0,"conversation_count":2,"models":{"cursor/auto":121962},"sources":{"cursor":121962},"value":121962,"level_value":121962},{"day":"2025-12-04","total_tokens":291693,"billable_total_tokens":291693,"input_tokens":0,"cached_input_tokens":241664,"cache_creation_input_tokens":40928,"output_tokens":9101,"reasoning_output_tokens":0,"conversation_count":4,"models":{"cursor/auto":291693},"sources":{"cursor":291693},"value":291693,"level_value":291693},{"day":"2025-12-05","total_tokens":1942012,"billable_total_tokens":1942012,"input_tokens":0,"cached_input_tokens":1782784,"cache_creation_input_tokens":123927,"output_tokens":35301,"reasoning_output_tokens":0,"conversation_count":7,"models":{"cursor/auto":1942012},"sources":{"cursor":1942012},"value":1942012,"level_value":1942012},{"day":"2025-12-06","total_tokens":5009599,"billable_total_tokens":5009599,"input_tokens":0,"cached_input_tokens":4658432,"cache_creation_input_tokens":295525,"output_tokens":55642,"reasoning_output_tokens":0,"conversation_count":8,"models":{"cursor/auto":5009599},"sources":{"cursor":5009599},"value":5009599,"level_value":5009599},{"day":"2025-12-09","total_tokens":80546,"billable_total_tokens":80546,"input_tokens":0,"cached_input_tokens":62720,"cache_creation_input_tokens":12299,"output_tokens":5527,"reasoning_output_tokens":0,"conversation_count":1,"models":{"cursor/auto":80546},"sources":{"cursor":80546},"value":80546,"level_value":80546},{"day":"2025-12-11","total_tokens":5740365,"billable_total_tokens":5740365,"input_tokens":1690,"cached_input_tokens":5081888,"cache_creation_input_tokens":591638,"output_tokens":65149,"reasoning_output_tokens":0,"conversation_count":13,"models":{"cursor/auto":5740365},"sources":{"cursor":5740365},"value":5740365,"level_value":5740365},{"day":"2025-12-16","total_tokens":14311106,"billable_total_tokens":14311106,"input_tokens":0,"cached_input_tokens":13272832,"cache_creation_input_tokens":908512,"output_tokens":129762,"reasoning_output_tokens":0,"conversation_count":27,"models":{"cursor/auto":14311106},"sources":{"cursor":14311106},"value":14311106,"level_value":14311106},{"day":"2025-12-17","total_tokens":1198993,"billable_total_tokens":1198993,"input_tokens":0,"cached_input_tokens":1059584,"cache_creation_input_tokens":126686,"output_tokens":12723,"reasoning_output_tokens":0,"conversation_count":3,"models":{"cursor/auto":1198993},"sources":{"cursor":1198993},"value":1198993,"level_value":1198993},{"day":"2025-12-30","total_tokens":497337,"billable_total_tokens":497337,"input_tokens":0,"cached_input_tokens":423168,"cache_creation_input_tokens":46420,"output_tokens":27749,"reasoning_output_tokens":0,"conversation_count":2,"models":{"cursor/auto":497337},"sources":{"cursor":497337},"value":497337,"level_value":497337},{"day":"2026-01-01","total_tokens":1421786,"billable_total_tokens":1421786,"input_tokens":0,"cached_input_tokens":1207808,"cache_creation_input_tokens":170561,"output_tokens":43417,"reasoning_output_tokens":0,"conversation_count":10,"models":{"cursor/auto":1421786},"sources":{"cursor":1421786},"value":1421786,"level_value":1421786},{"day":"2026-01-02","total_tokens":1650688,"billable_total_tokens":1650688,"input_tokens":0,"cached_input_tokens":1530624,"cache_creation_input_tokens":98580,"output_tokens":21484,"reasoning_output_tokens":0,"conversation_count":7,"models":{"cursor/auto":1650688},"sources":{"cursor":1650688},"value":1650688,"level_value":1650688},{"day":"2026-01-11","total_tokens":7353979,"billable_total_tokens":7353979,"input_tokens":210162,"cached_input_tokens":6720512,"cache_creation_input_tokens":357299,"output_tokens":66006,"reasoning_output_tokens":0,"conversation_count":14,"models":{"cursor/auto":7353979},"sources":{"cursor":7353979},"value":7353979,"level_value":7353979},{"day":"2026-01-12","total_tokens":6883749,"billable_total_tokens":6883749,"input_tokens":233565,"cached_input_tokens":6339328,"cache_creation_input_tokens":253102,"output_tokens":57754,"reasoning_output_tokens":0,"conversation_count":12,"models":{"cursor/auto":6883749},"sources":{"cursor":6883749},"value":6883749,"level_value":6883749},{"day":"2026-01-29","total_tokens":10236512,"billable_total_tokens":10236512,"input_tokens":435401,"cached_input_tokens":8912032,"cache_creation_input_tokens":817983,"output_tokens":71096,"reasoning_output_tokens":0,"conversation_count":24,"models":{"cursor/auto":10236512},"sources":{"cursor":10236512},"value":10236512,"level_value":10236512},{"day":"2026-01-30","total_tokens":3851941,"billable_total_tokens":3851941,"input_tokens":0,"cached_input_tokens":3559336,"cache_creation_input_tokens":252872,"output_tokens":39733,"reasoning_output_tokens":0,"conversation_count":5,"models":{"cursor/auto":3851941},"sources":{"cursor":3851941},"value":3851941,"level_value":3851941},{"day":"2026-02-02","total_tokens":1783699,"billable_total_tokens":1783699,"input_tokens":193442,"cached_input_tokens":1422304,"cache_creation_input_tokens":148946,"output_tokens":19007,"reasoning_output_tokens":0,"conversation_count":2,"models":{"cursor/auto":1783699},"sources":{"cursor":1783699},"value":1783699,"level_value":1783699},{"day":"2026-02-04","total_tokens":10331218,"billable_total_tokens":10331218,"input_tokens":266340,"cached_input_tokens":9882656,"cache_creation_input_tokens":131471,"output_tokens":50751,"reasoning_output_tokens":0,"conversation_count":7,"models":{"cursor/auto":10331218},"sources":{"cursor":10331218},"value":10331218,"level_value":10331218},{"day":"2026-02-05","total_tokens":239047,"billable_total_tokens":239047,"input_tokens":0,"cached_input_tokens":158240,"cache_creation_input_tokens":76025,"output_tokens":4782,"reasoning_output_tokens":0,"conversation_count":1,"models":{"cursor/auto":239047},"sources":{"cursor":239047},"value":239047,"level_value":239047},{"day":"2026-02-08","total_tokens":1877200,"billable_total_tokens":1877200,"input_tokens":6358,"cached_input_tokens":1772416,"cache_creation_input_tokens":84421,"output_tokens":14005,"reasoning_output_tokens":0,"conversation_count":1,"models":{"cursor/auto":1877200},"sources":{"cursor":1877200},"value":1877200,"level_value":1877200},{"day":"2026-02-10","total_tokens":11131422,"billable_total_tokens":11131422,"input_tokens":111772,"cached_input_tokens":10448256,"cache_creation_input_tokens":503286,"output_tokens":68108,"reasoning_output_tokens":0,"conversation_count":15,"models":{"cursor/auto":11131422},"sources":{"cursor":11131422},"value":11131422,"level_value":11131422},{"day":"2026-03-23","total_tokens":1427271,"billable_total_tokens":1427271,"input_tokens":170967,"cached_input_tokens":1229056,"cache_creation_input_tokens":0,"output_tokens":27248,"reasoning_output_tokens":0,"conversation_count":5,"models":{"cursor/auto":1427271},"sources":{"cursor":1427271},"value":1427271,"level_value":1427271},{"day":"2026-03-26","total_tokens":3722505,"billable_total_tokens":3722505,"input_tokens":894681,"cached_input_tokens":2796544,"cache_creation_input_tokens":0,"output_tokens":31280,"reasoning_output_tokens":0,"conversation_count":9,"models":{"cursor/auto":3722505},"sources":{"cursor":3722505},"value":3722505,"level_value":3722505},{"day":"2026-03-28","total_tokens":15411254,"billable_total_tokens":15411254,"input_tokens":15313273,"cached_input_tokens":0,"cache_creation_input_tokens":0,"output_tokens":97981,"reasoning_output_tokens":0,"conversation_count":23,"models":{"cursor/auto":15411254},"sources":{"cursor":15411254},"value":15411254,"level_value":15411254},{"day":"2026-03-29","total_tokens":9903057,"billable_total_tokens":9903057,"input_tokens":7130489,"cached_input_tokens":2715136,"cache_creation_input_tokens":0,"output_tokens":57432,"reasoning_output_tokens":0,"conversation_count":6,"models":{"cursor/auto":9903057},"sources":{"cursor":9903057},"value":9903057,"level_value":9903057},{"day":"2026-03-30","total_tokens":563098,"billable_total_tokens":563098,"input_tokens":254214,"cached_input_tokens":306944,"cache_creation_input_tokens":0,"output_tokens":1940,"reasoning_output_tokens":0,"conversation_count":1,"models":{"cursor/auto":563098},"sources":{"cursor":563098},"value":563098,"level_value":563098},{"day":"2026-03-31","total_tokens":2017061,"billable_total_tokens":2017061,"input_tokens":660336,"cached_input_tokens":1354240,"cache_creation_input_tokens":0,"output_tokens":2485,"reasoning_output_tokens":0,"conversation_count":4,"models":{"cursor/auto":2017061},"sources":{"cursor":2017061},"value":2017061,"level_value":2017061},{"day":"2026-04-01","total_tokens":357919,"billable_total_tokens":357919,"input_tokens":36888,"cached_input_tokens":315392,"cache_creation_input_tokens":0,"output_tokens":5639,"reasoning_output_tokens":0,"conversation_count":2,"models":{"cursor/auto":357919},"sources":{"cursor":357919},"value":357919,"level_value":357919},{"day":"2026-04-02","total_tokens":3844015,"billable_total_tokens":3844015,"input_tokens":3799331,"cached_input_tokens":13440,"cache_creation_input_tokens":0,"output_tokens":31244,"reasoning_output_tokens":0,"conversation_count":7,"models":{"cursor/auto":3844015},"sources":{"cursor":3844015},"value":3844015,"level_value":3844015},{"day":"2026-04-06","total_tokens":1690060,"billable_total_tokens":1690060,"input_tokens":1676538,"cached_input_tokens":0,"cache_creation_input_tokens":0,"output_tokens":13522,"reasoning_output_tokens":0,"conversation_count":6,"models":{"cursor/auto":1690060},"sources":{"cursor":1690060},"value":1690060,"level_value":1690060},{"day":"2026-04-09","total_tokens":3147407,"billable_total_tokens":3147407,"input_tokens":127805,"cached_input_tokens":3000576,"cache_creation_input_tokens":0,"output_tokens":19026,"reasoning_output_tokens":0,"conversation_count":1,"models":{"cursor/auto":3147407},"sources":{"cursor":3147407},"value":3147407,"level_value":3147407},{"day":"2026-04-10","total_tokens":1336044,"billable_total_tokens":1336044,"input_tokens":173993,"cached_input_tokens":1157408,"cache_creation_input_tokens":0,"output_tokens":4643,"reasoning_output_tokens":0,"conversation_count":2,"models":{"cursor/auto":1336044},"sources":{"cursor":1336044},"value":1336044,"level_value":1336044},{"day":"2026-04-12","total_tokens":1790637,"billable_total_tokens":1790637,"input_tokens":179026,"cached_input_tokens":1597440,"cache_creation_input_tokens":0,"output_tokens":14171,"reasoning_output_tokens":0,"conversation_count":3,"models":{"cursor/auto":1790637},"sources":{"cursor":1790637},"value":1790637,"level_value":1790637},{"day":"2026-04-15","total_tokens":9150152,"billable_total_tokens":9150152,"input_tokens":407225,"cached_input_tokens":8710528,"cache_creation_input_tokens":0,"output_tokens":32399,"reasoning_output_tokens":0,"conversation_count":6,"models":{"cursor/auto":9150152},"sources":{"cursor":9150152},"value":9150152,"level_value":9150152},{"day":"2026-04-16","total_tokens":772265,"billable_total_tokens":772265,"input_tokens":104660,"cached_input_tokens":659328,"cache_creation_input_tokens":0,"output_tokens":8277,"reasoning_output_tokens":0,"conversation_count":2,"models":{"cursor/auto":772265},"sources":{"cursor":772265},"value":772265,"level_value":772265},{"day":"2026-04-17","total_tokens":1070085,"billable_total_tokens":1070085,"input_tokens":77225,"cached_input_tokens":984448,"cache_creation_input_tokens":0,"output_tokens":8412,"reasoning_output_tokens":0,"conversation_count":5,"models":{"cursor/auto":1070085},"sources":{"cursor":1070085},"value":1070085,"level_value":1070085},{"day":"2026-04-18","total_tokens":6821438,"billable_total_tokens":6821438,"input_tokens":397410,"cached_input_tokens":6339584,"cache_creation_input_tokens":0,"output_tokens":84444,"reasoning_output_tokens":0,"conversation_count":34,"models":{"cursor/auto":6821438},"sources":{"cursor":6821438},"value":6821438,"level_value":6821438},{"day":"2026-04-19","total_tokens":4351615,"billable_total_tokens":4351615,"input_tokens":317044,"cached_input_tokens":4005888,"cache_creation_input_tokens":0,"output_tokens":28683,"reasoning_output_tokens":0,"conversation_count":10,"models":{"cursor/auto":4351615},"sources":{"cursor":4351615},"value":4351615,"level_value":4351615},{"day":"2026-04-21","total_tokens":2107507,"billable_total_tokens":2107507,"input_tokens":516387,"cached_input_tokens":1572896,"cache_creation_input_tokens":0,"output_tokens":18224,"reasoning_output_tokens":0,"conversation_count":8,"models":{"cursor/auto":2107507},"sources":{"cursor":2107507},"value":2107507,"level_value":2107507},{"day":"2026-04-23","total_tokens":8815590,"billable_total_tokens":8815590,"input_tokens":716143,"cached_input_tokens":8061056,"cache_creation_input_tokens":0,"output_tokens":38391,"reasoning_output_tokens":0,"conversation_count":39,"models":{"cursor/auto":8815590},"sources":{"cursor":8815590},"value":8815590,"level_value":8815590},{"day":"2026-04-24","total_tokens":4423608,"billable_total_tokens":4423608,"input_tokens":703042,"cached_input_tokens":3710336,"cache_creation_input_tokens":0,"output_tokens":10230,"reasoning_output_tokens":0,"conversation_count":17,"models":{"cursor/auto":4423608},"sources":{"cursor":4423608},"value":4423608,"level_value":4423608},{"day":"2026-04-27","total_tokens":4417284,"billable_total_tokens":4417284,"input_tokens":236141,"cached_input_tokens":4151552,"cache_creation_input_tokens":0,"output_tokens":29591,"reasoning_output_tokens":0,"conversation_count":11,"models":{"cursor/auto":4417284},"sources":{"cursor":4417284},"value":4417284,"level_value":4417284},{"day":"2026-04-28","total_tokens":19112123,"billable_total_tokens":19112123,"input_tokens":534550,"cached_input_tokens":18495488,"cache_creation_input_tokens":0,"output_tokens":82085,"reasoning_output_tokens":0,"conversation_count":23,"models":{"cursor/auto":19112123},"sources":{"cursor":19112123},"value":19112123,"level_value":19112123},{"day":"2026-04-29","total_tokens":17776431,"billable_total_tokens":17776431,"input_tokens":2342022,"cached_input_tokens":15398912,"cache_creation_input_tokens":0,"output_tokens":35497,"reasoning_output_tokens":0,"conversation_count":22,"models":{"cursor/auto":17776431},"sources":{"cursor":17776431},"value":17776431,"level_value":17776431},{"day":"2026-05-06","total_tokens":5567807,"billable_total_tokens":5567807,"input_tokens":357214,"cached_input_tokens":5134976,"cache_creation_input_tokens":0,"output_tokens":75617,"reasoning_output_tokens":0,"conversation_count":5,"models":{"cursor/auto":5567807},"sources":{"cursor":5567807},"value":5567807,"level_value":5567807},{"day":"2026-05-07","total_tokens":16460965,"billable_total_tokens":16460965,"input_tokens":926137,"cached_input_tokens":15385152,"cache_creation_input_tokens":0,"output_tokens":149676,"reasoning_output_tokens":0,"conversation_count":30,"models":{"cursor/auto":16460965},"sources":{"cursor":16460965},"value":16460965,"level_value":16460965},{"day":"2026-05-09","total_tokens":96071,"billable_total_tokens":96071,"input_tokens":90254,"cached_input_tokens":5536,"cache_creation_input_tokens":0,"output_tokens":281,"reasoning_output_tokens":0,"conversation_count":1,"models":{"cursor/auto":96071},"sources":{"cursor":96071},"value":96071,"level_value":96071},{"day":"2026-05-10","total_tokens":3260906,"billable_total_tokens":3260906,"input_tokens":147731,"cached_input_tokens":3092896,"cache_creation_input_tokens":0,"output_tokens":20279,"reasoning_output_tokens":0,"conversation_count":3,"models":{"cursor/auto":3260906},"sources":{"cursor":3260906},"value":3260906,"level_value":3260906},{"day":"2026-05-15","total_tokens":907384,"billable_total_tokens":907384,"input_tokens":44776,"cached_input_tokens":851456,"cache_creation_input_tokens":0,"output_tokens":11152,"reasoning_output_tokens":0,"conversation_count":1,"models":{"cursor/auto":907384},"sources":{"cursor":907384},"value":907384,"level_value":907384},{"day":"2026-05-16","total_tokens":3963662,"billable_total_tokens":3963662,"input_tokens":280441,"cached_input_tokens":3606272,"cache_creation_input_tokens":0,"output_tokens":76949,"reasoning_output_tokens":0,"conversation_count":21,"models":{"cursor/auto":3963662},"sources":{"cursor":3963662},"value":3963662,"level_value":3963662},{"day":"2026-05-17","total_tokens":254227,"billable_total_tokens":254227,"input_tokens":62876,"cached_input_tokens":184576,"cache_creation_input_tokens":0,"output_tokens":6775,"reasoning_output_tokens":0,"conversation_count":1,"models":{"cursor/auto":254227},"sources":{"cursor":254227},"value":254227,"level_value":254227},{"day":"2026-05-18","total_tokens":10028812,"billable_total_tokens":10028812,"input_tokens":1753626,"cached_input_tokens":8198656,"cache_creation_input_tokens":0,"output_tokens":76530,"reasoning_output_tokens":0,"conversation_count":21,"models":{"cursor/auto":10028812},"sources":{"cursor":10028812},"value":10028812,"level_value":10028812},{"day":"2026-05-19","total_tokens":1122744,"billable_total_tokens":1122744,"input_tokens":459468,"cached_input_tokens":654848,"cache_creation_input_tokens":0,"output_tokens":8428,"reasoning_output_tokens":0,"conversation_count":3,"models":{"cursor/auto":1122744},"sources":{"cursor":1122744},"value":1122744,"level_value":1122744},{"day":"2026-05-20","total_tokens":7521649,"billable_total_tokens":7521649,"input_tokens":1110776,"cached_input_tokens":6351072,"cache_creation_input_tokens":0,"output_tokens":59801,"reasoning_output_tokens":0,"conversation_count":19,"models":{"cursor/auto":4873964,"cursor/composer-2.5-fast":2647685},"sources":{"cursor":7521649},"value":7521649,"level_value":7521649},{"day":"2026-05-21","total_tokens":2776042,"billable_total_tokens":2776042,"input_tokens":1182138,"cached_input_tokens":1558016,"cache_creation_input_tokens":0,"output_tokens":35888,"reasoning_output_tokens":0,"conversation_count":13,"models":{"cursor/auto":2776042},"sources":{"cursor":2776042},"value":2776042,"level_value":2776042},{"day":"2026-05-22","total_tokens":24514,"billable_total_tokens":24514,"input_tokens":6908,"cached_input_tokens":16640,"cache_creation_input_tokens":0,"output_tokens":966,"reasoning_output_tokens":0,"conversation_count":1,"models":{"cursor/auto":24514},"sources":{"cursor":24514},"value":24514,"level_value":24514},{"day":"2026-05-27","total_tokens":391637,"billable_total_tokens":391637,"input_tokens":78855,"cached_input_tokens":300840,"cache_creation_input_tokens":0,"output_tokens":11942,"reasoning_output_tokens":0,"conversation_count":6,"models":{"cursor/auto":391637},"sources":{"cursor":391637},"value":391637,"level_value":391637},{"day":"2026-05-28","total_tokens":244564,"billable_total_tokens":244564,"input_tokens":22022,"cached_input_tokens":216231,"cache_creation_input_tokens":0,"output_tokens":6311,"reasoning_output_tokens":0,"conversation_count":1,"models":{"cursor/auto":244564},"sources":{"cursor":244564},"value":244564,"level_value":244564},{"day":"2026-05-29","total_tokens":12345059,"billable_total_tokens":12345059,"input_tokens":1544090,"cached_input_tokens":10701910,"cache_creation_input_tokens":0,"output_tokens":99059,"reasoning_output_tokens":0,"conversation_count":28,"models":{"cursor/auto":12345059},"sources":{"cursor":12345059},"value":12345059,"level_value":12345059},{"day":"2026-05-30","total_tokens":286807,"billable_total_tokens":286807,"input_tokens":35699,"cached_input_tokens":246336,"cache_creation_input_tokens":0,"output_tokens":4772,"reasoning_output_tokens":0,"conversation_count":3,"models":{"cursor/auto":286807},"sources":{"cursor":286807},"value":286807,"level_value":286807},{"day":"2026-06-01","total_tokens":677597,"billable_total_tokens":677597,"input_tokens":209040,"cached_input_tokens":461472,"cache_creation_input_tokens":0,"output_tokens":7085,"reasoning_output_tokens":0,"conversation_count":2,"models":{"cursor/auto":677597},"sources":{"cursor":677597},"value":677597,"level_value":677597},{"day":"2026-06-05","total_tokens":1777153,"billable_total_tokens":1777153,"input_tokens":202073,"cached_input_tokens":1567648,"cache_creation_input_tokens":0,"output_tokens":7432,"reasoning_output_tokens":0,"conversation_count":3,"models":{"cursor/auto":1777153},"sources":{"cursor":1777153},"value":1777153,"level_value":1777153},{"day":"2026-06-06","total_tokens":10714999,"billable_total_tokens":10714999,"input_tokens":556406,"cached_input_tokens":10076320,"cache_creation_input_tokens":0,"output_tokens":82273,"reasoning_output_tokens":0,"conversation_count":17,"models":{"cursor/auto":10714999},"sources":{"cursor":10714999},"value":10714999,"level_value":10714999},{"day":"2026-06-07","total_tokens":857662,"billable_total_tokens":857662,"input_tokens":126339,"cached_input_tokens":711968,"cache_creation_input_tokens":0,"output_tokens":19355,"reasoning_output_tokens":0,"conversation_count":13,"models":{"cursor/auto":857662},"sources":{"cursor":857662},"value":857662,"level_value":857662},{"day":"2026-06-08","total_tokens":921163,"billable_total_tokens":921163,"input_tokens":191637,"cached_input_tokens":721856,"cache_creation_input_tokens":0,"output_tokens":7670,"reasoning_output_tokens":0,"conversation_count":2,"models":{"cursor/auto":921163},"sources":{"cursor":921163},"value":921163,"level_value":921163},{"day":"2026-06-10","total_tokens":594946,"billable_total_tokens":594946,"input_tokens":115570,"cached_input_tokens":476800,"cache_creation_input_tokens":0,"output_tokens":2576,"reasoning_output_tokens":0,"conversation_count":2,"models":{"cursor/auto":594946},"sources":{"cursor":594946},"value":594946,"level_value":594946},{"day":"2026-06-11","total_tokens":5338439,"billable_total_tokens":5338439,"input_tokens":1613023,"cached_input_tokens":3611776,"cache_creation_input_tokens":0,"output_tokens":113640,"reasoning_output_tokens":0,"conversation_count":33,"models":{"cursor/auto":5338439},"sources":{"cursor":5338439},"value":5338439,"level_value":5338439},{"day":"2026-06-13","total_tokens":1274682,"billable_total_tokens":1274682,"input_tokens":239262,"cached_input_tokens":1008552,"cache_creation_input_tokens":0,"output_tokens":26868,"reasoning_output_tokens":0,"conversation_count":6,"models":{"cursor/auto":1274682},"sources":{"cursor":1274682},"value":1274682,"level_value":1274682},{"day":"2026-06-14","total_tokens":797624,"billable_total_tokens":797624,"input_tokens":233396,"cached_input_tokens":542752,"cache_creation_input_tokens":0,"output_tokens":21476,"reasoning_output_tokens":0,"conversation_count":5,"models":{"cursor/auto":797624},"sources":{"cursor":797624},"value":797624,"level_value":797624},{"day":"2026-06-15","total_tokens":7866942,"billable_total_tokens":7866942,"input_tokens":1954806,"cached_input_tokens":5827647,"cache_creation_input_tokens":0,"output_tokens":84489,"reasoning_output_tokens":0,"conversation_count":20,"models":{"cursor/auto":7866942},"sources":{"cursor":7866942},"value":7866942,"level_value":7866942},{"day":"2026-06-16","total_tokens":4188295,"billable_total_tokens":4188295,"input_tokens":985976,"cached_input_tokens":3132963,"cache_creation_input_tokens":0,"output_tokens":69356,"reasoning_output_tokens":0,"conversation_count":33,"models":{"cursor/auto":4188295},"sources":{"cursor":4188295},"value":4188295,"level_value":4188295},{"day":"2026-06-17","total_tokens":31962666,"billable_total_tokens":31962666,"input_tokens":5144852,"cached_input_tokens":25042385,"cache_creation_input_tokens":1484003,"output_tokens":259810,"reasoning_output_tokens":31616,"conversation_count":296,"models":{"cursor/auto":9582543,"workbuddy/auto":22380123},"sources":{"cursor":9582543,"workbuddy":22380123},"value":31962666,"level_value":31962666},{"day":"2026-06-18","total_tokens":12896005,"billable_total_tokens":12896005,"input_tokens":1827124,"cached_input_tokens":10831256,"cache_creation_input_tokens":38257,"output_tokens":168913,"reasoning_output_tokens":30455,"conversation_count":203,"models":{"cursor/auto":2846141,"workbuddy/auto":10049864},"sources":{"cursor":2846141,"workbuddy":10049864},"value":12896005,"level_value":12896005},{"day":"2026-06-19","total_tokens":2684250,"billable_total_tokens":2684250,"input_tokens":304262,"cached_input_tokens":2329024,"cache_creation_input_tokens":0,"output_tokens":31540,"reasoning_output_tokens":19424,"conversation_count":24,"models":{"cursor/auto":1110018,"workbuddy/auto":1574232},"sources":{"cursor":1110018,"workbuddy":1574232},"value":2684250,"level_value":2684250},{"day":"2026-06-20","total_tokens":9353063,"billable_total_tokens":9353063,"input_tokens":734003,"cached_input_tokens":7016413,"cache_creation_input_tokens":1476603,"output_tokens":117576,"reasoning_output_tokens":8468,"conversation_count":162,"models":{"workbuddy/auto":9353063},"sources":{"workbuddy":9353063},"value":9353063,"level_value":9353063},{"day":"2026-06-21","total_tokens":439949,"billable_total_tokens":439949,"input_tokens":222572,"cached_input_tokens":194949,"cache_creation_input_tokens":0,"output_tokens":22428,"reasoning_output_tokens":0,"conversation_count":1,"models":{"cursor/auto":439949},"sources":{"cursor":439949},"value":439949,"level_value":439949},{"day":"2026-06-22","total_tokens":927978,"billable_total_tokens":927978,"input_tokens":124756,"cached_input_tokens":631372,"cache_creation_input_tokens":165465,"output_tokens":5944,"reasoning_output_tokens":441,"conversation_count":9,"models":{"cursor/auto":364792,"workbuddy/auto":563186},"sources":{"cursor":364792,"workbuddy":563186},"value":927978,"level_value":927978},{"day":"2026-06-23","total_tokens":2054721,"billable_total_tokens":2054721,"input_tokens":238238,"cached_input_tokens":1803755,"cache_creation_input_tokens":0,"output_tokens":12728,"reasoning_output_tokens":0,"conversation_count":3,"models":{"cursor/auto":2054721},"sources":{"cursor":2054721},"value":2054721,"level_value":2054721},{"day":"2026-06-24","total_tokens":1228608,"billable_total_tokens":1228608,"input_tokens":437917,"cached_input_tokens":774024,"cache_creation_input_tokens":0,"output_tokens":16667,"reasoning_output_tokens":0,"conversation_count":6,"models":{"cursor/auto":1228608},"sources":{"cursor":1228608},"value":1228608,"level_value":1228608},{"day":"2026-06-25","total_tokens":4925631,"billable_total_tokens":4925631,"input_tokens":1082700,"cached_input_tokens":3792927,"cache_creation_input_tokens":0,"output_tokens":50004,"reasoning_output_tokens":0,"conversation_count":19,"models":{"cursor/auto":4707354,"workbuddy/auto":218277},"sources":{"cursor":4707354,"workbuddy":218277},"value":4925631,"level_value":4925631},{"day":"2026-06-26","total_tokens":101502,"billable_total_tokens":101502,"input_tokens":91527,"cached_input_tokens":8023,"cache_creation_input_tokens":0,"output_tokens":1952,"reasoning_output_tokens":0,"conversation_count":1,"models":{"cursor/auto":101502},"sources":{"cursor":101502},"value":101502,"level_value":101502},{"day":"2026-06-27","total_tokens":7889778,"billable_total_tokens":7889778,"input_tokens":877560,"cached_input_tokens":6758713,"cache_creation_input_tokens":149886,"output_tokens":89855,"reasoning_output_tokens":13764,"conversation_count":108,"models":{"workbuddy/auto":7889778},"sources":{"workbuddy":7889778},"value":7889778,"level_value":7889778},{"day":"2026-06-28","total_tokens":6554177,"billable_total_tokens":6554177,"input_tokens":139028,"cached_input_tokens":5863453,"cache_creation_input_tokens":497582,"output_tokens":44744,"reasoning_output_tokens":9370,"conversation_count":83,"models":{"workbuddy/auto":6554177},"sources":{"workbuddy":6554177},"value":6554177,"level_value":6554177},{"day":"2026-06-29","total_tokens":1294596,"billable_total_tokens":1294596,"input_tokens":202283,"cached_input_tokens":1085012,"cache_creation_input_tokens":0,"output_tokens":7301,"reasoning_output_tokens":0,"conversation_count":1,"models":{"cursor/auto":1294596},"sources":{"cursor":1294596},"value":1294596,"level_value":1294596},{"day":"2026-07-01","total_tokens":30110,"billable_total_tokens":30110,"input_tokens":29942,"cached_input_tokens":0,"cache_creation_input_tokens":0,"output_tokens":130,"reasoning_output_tokens":38,"conversation_count":1,"models":{"workbuddy/auto":30110},"sources":{"workbuddy":30110},"value":30110,"level_value":30110},{"day":"2026-07-02","total_tokens":71122,"billable_total_tokens":71122,"input_tokens":19714,"cached_input_tokens":50432,"cache_creation_input_tokens":0,"output_tokens":477,"reasoning_output_tokens":499,"conversation_count":2,"models":{"workbuddy/auto":71122},"sources":{"workbuddy":71122},"value":71122,"level_value":71122},{"day":"2026-07-03","total_tokens":41272,"billable_total_tokens":41272,"input_tokens":26487,"cached_input_tokens":13760,"cache_creation_input_tokens":0,"output_tokens":496,"reasoning_output_tokens":529,"conversation_count":1,"models":{"workbuddy/auto":41272},"sources":{"workbuddy":41272},"value":41272,"level_value":41272},{"day":"2026-07-08","total_tokens":1062794,"billable_total_tokens":1062794,"input_tokens":234972,"cached_input_tokens":811936,"cache_creation_input_tokens":0,"output_tokens":15886,"reasoning_output_tokens":0,"conversation_count":2,"models":{"cursor/auto":1062794},"sources":{"cursor":1062794},"value":1062794,"level_value":1062794},{"day":"2026-07-15","total_tokens":96728,"billable_total_tokens":96728,"input_tokens":31979,"cached_input_tokens":62528,"cache_creation_input_tokens":0,"output_tokens":1337,"reasoning_output_tokens":884,"conversation_count":3,"models":{"workbuddy/hy3":96728},"sources":{"workbuddy":96728},"value":96728,"level_value":96728},{"day":"2026-07-16","total_tokens":111856,"billable_total_tokens":111856,"input_tokens":24275,"cached_input_tokens":85136,"cache_creation_input_tokens":0,"output_tokens":2445,"reasoning_output_tokens":0,"conversation_count":2,"models":{"cursor/auto":111856},"sources":{"cursor":111856},"value":111856,"level_value":111856},{"day":"2026-07-19","total_tokens":28358651,"billable_total_tokens":28358651,"input_tokens":2554646,"cached_input_tokens":25356832,"cache_creation_input_tokens":0,"output_tokens":447173,"reasoning_output_tokens":0,"conversation_count":90,"models":{"cursor/auto":25369704,"cursor/cursor-grok-4.5-high-fast":2979565,"cursor/composer-2.5-fast":9382},"sources":{"cursor":28358651},"value":28358651,"level_value":28358651},{"day":"2026-07-20","total_tokens":7947569,"billable_total_tokens":7947569,"input_tokens":486484,"cached_input_tokens":7409408,"cache_creation_input_tokens":0,"output_tokens":51677,"reasoning_output_tokens":0,"conversation_count":27,"models":{"cursor/auto":7947569},"sources":{"cursor":7947569},"value":7947569,"level_value":7947569}],"total_tokens":631724922,"active_day_count":112,"bucket_count":479,"daily_row_count":112,"root":"/Users/zhuyanhao/.tokentracker/tracker/queue.jsonl","estimated_cost_usd":null,"longest_streak":17,"peak_day":{"day":"2026-06-17","value":31962666},"top_provider":"cursor","active_rate":"41.2"},"CATEGORIES":{"planning":{"count":11,"examples":[]},"debugging":{"count":10,"examples":[]},"implementation":{"count":216,"examples":[]},"refactor":{"count":3,"examples":[]},"testing":{"count":29,"examples":[]},"packaging":{"count":2,"examples":[]},"explanation":{"count":36,"examples":[]},"research":{"count":7,"examples":[]},"ui_design":{"count":12,"examples":[]},"workflow":{"count":7,"examples":[]},"reference":{"count":4,"examples":[]}}};
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
{
|
|
2
|
+
"style": "mbti-flat-vector-editorial",
|
|
3
|
+
"display": "freestanding-figure-no-card-frame",
|
|
4
|
+
"boards": [
|
|
5
|
+
{
|
|
6
|
+
"note": "Legacy SBTI boards archived; primary art is *-figure.png",
|
|
7
|
+
"cols": 4,
|
|
8
|
+
"profiles": [
|
|
9
|
+
{
|
|
10
|
+
"folder": "01-builder",
|
|
11
|
+
"name": "builder",
|
|
12
|
+
"code": "SHIP",
|
|
13
|
+
"label": "Builder SHIP — deploy first",
|
|
14
|
+
"figure": "builder-figure.png"
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"folder": "02-debugger",
|
|
18
|
+
"name": "debugger",
|
|
19
|
+
"code": "HUNT",
|
|
20
|
+
"label": "Debugger HUNT — duck at midnight",
|
|
21
|
+
"figure": "debugger-figure.png"
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"folder": "03-architect",
|
|
25
|
+
"name": "architect",
|
|
26
|
+
"code": "DRAW",
|
|
27
|
+
"label": "Architect DRAW — boxes before bytes",
|
|
28
|
+
"figure": "architect-figure.png"
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"folder": "04-codex-believer",
|
|
32
|
+
"name": "codex-believer",
|
|
33
|
+
"code": "FAITH",
|
|
34
|
+
"label": "Codex Believer FAITH — agent disciple",
|
|
35
|
+
"figure": "codex-believer-figure.png"
|
|
36
|
+
}
|
|
37
|
+
]
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
"cols": 4,
|
|
41
|
+
"profiles": [
|
|
42
|
+
{
|
|
43
|
+
"folder": "05-prompt-priest",
|
|
44
|
+
"name": "prompt-priest",
|
|
45
|
+
"code": "SPELL",
|
|
46
|
+
"label": "Prompt Priest SPELL — scroll of rules",
|
|
47
|
+
"figure": "prompt-priest-figure.png"
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
"folder": "06-tab-hoarder",
|
|
51
|
+
"name": "tab-hoarder",
|
|
52
|
+
"code": "TABS",
|
|
53
|
+
"label": "Tab Hoarder TABS — forty-seven localhost tabs",
|
|
54
|
+
"figure": "tab-hoarder-figure.png"
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
"folder": "07-context-maxxer",
|
|
58
|
+
"name": "context-maxxer",
|
|
59
|
+
"code": "METER",
|
|
60
|
+
"label": "Context Maxxer METER — gauge at ninety-nine",
|
|
61
|
+
"figure": "context-maxxer-figure.png"
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
"folder": "08-yolo-shipper",
|
|
65
|
+
"name": "yolo-shipper",
|
|
66
|
+
"code": "YOLO",
|
|
67
|
+
"label": "YOLO Shipper YOLO — skip review hit merge",
|
|
68
|
+
"figure": "yolo-shipper-figure.png"
|
|
69
|
+
}
|
|
70
|
+
]
|
|
71
|
+
}
|
|
72
|
+
],
|
|
73
|
+
"badgeBoard": {
|
|
74
|
+
"file": "source/references/vibe-badges-v6-board.png",
|
|
75
|
+
"cols": 8,
|
|
76
|
+
"note": "Symbolic icons per archetype — not mascot face crops"
|
|
77
|
+
},
|
|
78
|
+
"banners": [
|
|
79
|
+
{
|
|
80
|
+
"file": "banners/home-hero.png",
|
|
81
|
+
"out": "banners/home-hero.svg",
|
|
82
|
+
"width": 1200,
|
|
83
|
+
"height": 400,
|
|
84
|
+
"label": "Vibe Profile home hero banner",
|
|
85
|
+
"status": "legacy-sbti-compose"
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
"file": "banners/share-strip.png",
|
|
89
|
+
"out": "banners/share-strip.svg",
|
|
90
|
+
"width": 1200,
|
|
91
|
+
"height": 400,
|
|
92
|
+
"label": "Vibe Profile share strip banner",
|
|
93
|
+
"status": "legacy-sbti-compose"
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
"file": "banners/result-header.png",
|
|
97
|
+
"out": "banners/result-header.svg",
|
|
98
|
+
"width": 1200,
|
|
99
|
+
"height": 280,
|
|
100
|
+
"label": "Vibe Profile result header banner",
|
|
101
|
+
"status": "legacy-sbti-compose"
|
|
102
|
+
}
|
|
103
|
+
]
|
|
104
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import fs from "fs";
|
|
2
|
+
import path from "path";
|
|
3
|
+
import { fileURLToPath } from "url";
|
|
4
|
+
|
|
5
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
6
|
+
const root = path.join(__dirname, "..");
|
|
7
|
+
const config = JSON.parse(
|
|
8
|
+
fs.readFileSync(path.join(__dirname, "profiles.json"), "utf8")
|
|
9
|
+
);
|
|
10
|
+
|
|
11
|
+
const profiles = config.boards.flatMap((b) => b.profiles);
|
|
12
|
+
let ok = true;
|
|
13
|
+
|
|
14
|
+
for (const profile of profiles) {
|
|
15
|
+
const char = path.join(
|
|
16
|
+
root,
|
|
17
|
+
"characters",
|
|
18
|
+
profile.folder,
|
|
19
|
+
`${profile.name}-character.svg`
|
|
20
|
+
);
|
|
21
|
+
const card = path.join(
|
|
22
|
+
root,
|
|
23
|
+
"characters",
|
|
24
|
+
profile.folder,
|
|
25
|
+
`${profile.name}-card.svg`
|
|
26
|
+
);
|
|
27
|
+
const badge = path.join(
|
|
28
|
+
root,
|
|
29
|
+
"badges",
|
|
30
|
+
profile.folder,
|
|
31
|
+
`${profile.name}-badge.svg`
|
|
32
|
+
);
|
|
33
|
+
|
|
34
|
+
for (const [label, file] of [
|
|
35
|
+
["character", char],
|
|
36
|
+
["card", card],
|
|
37
|
+
["badge", badge],
|
|
38
|
+
]) {
|
|
39
|
+
const name = path.basename(file);
|
|
40
|
+
if (!fs.existsSync(file)) {
|
|
41
|
+
console.error(`FAIL missing ${file}`);
|
|
42
|
+
ok = false;
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
const svg = fs.readFileSync(file, "utf8");
|
|
46
|
+
if (!svg.includes("data:image/png;base64,")) {
|
|
47
|
+
console.error(`FAIL ${name}: expected embedded PNG`);
|
|
48
|
+
ok = false;
|
|
49
|
+
} else {
|
|
50
|
+
console.log(`PASS ${name}`);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
for (const banner of config.banners) {
|
|
56
|
+
const file = path.join(root, banner.out);
|
|
57
|
+
const name = path.basename(file);
|
|
58
|
+
if (!fs.existsSync(file)) {
|
|
59
|
+
console.error(`FAIL missing ${file}`);
|
|
60
|
+
ok = false;
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
const svg = fs.readFileSync(file, "utf8");
|
|
64
|
+
if (!svg.includes("data:image/png;base64,")) {
|
|
65
|
+
console.error(`FAIL ${name}: expected embedded PNG`);
|
|
66
|
+
ok = false;
|
|
67
|
+
} else {
|
|
68
|
+
console.log(`PASS ${name}`);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
process.exit(ok ? 0 : 1);
|