aiblueprint-cli 1.4.81 → 1.4.83

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. package/README.md +25 -18
  2. package/agents-config/claude-config/scripts/statusline/data/.gitignore +8 -0
  3. package/agents-config/claude-config/scripts/statusline/data/.gitkeep +0 -0
  4. package/agents-config/claude-config/scripts/statusline/defaults.json +10 -10
  5. package/agents-config/claude-config/scripts/statusline/src/commands/interactive-config.ts +118 -6
  6. package/agents-config/claude-config/scripts/statusline/src/index.ts +100 -9
  7. package/agents-config/claude-config/scripts/statusline/src/lib/config.ts +28 -2
  8. package/agents-config/claude-config/scripts/statusline/src/lib/features/limits/commands/weekly-analysis.ts +108 -0
  9. package/agents-config/claude-config/scripts/statusline/src/lib/features/limits/index.ts +164 -0
  10. package/agents-config/claude-config/scripts/statusline/src/lib/features/limits/types.ts +15 -0
  11. package/agents-config/claude-config/scripts/statusline/src/lib/features/spend/commands/migrate-to-sqlite.ts +136 -0
  12. package/agents-config/claude-config/scripts/statusline/src/lib/features/spend/commands/spend-day.ts +79 -0
  13. package/agents-config/claude-config/scripts/statusline/src/lib/features/spend/commands/spend-month.ts +66 -0
  14. package/agents-config/claude-config/scripts/statusline/src/lib/features/spend/commands/spend-project.ts +85 -0
  15. package/agents-config/claude-config/scripts/statusline/src/lib/features/spend/database.ts +395 -0
  16. package/agents-config/claude-config/scripts/statusline/src/lib/features/spend/index.ts +178 -0
  17. package/agents-config/claude-config/scripts/statusline/src/lib/features/spend/payload-logger.ts +163 -0
  18. package/agents-config/claude-config/scripts/statusline/src/lib/features/spend/types.ts +37 -0
  19. package/agents-config/claude-config/scripts/statusline/src/lib/presets.ts +13 -13
  20. package/agents-config/claude-config/scripts/statusline/statusline.config.free.json +4 -1
  21. package/agents-config/claude-config/scripts/statusline/statusline.config.json +44 -23
  22. package/agents-config/scripts/statusline/data/.gitignore +8 -0
  23. package/agents-config/scripts/statusline/data/.gitkeep +0 -0
  24. package/agents-config/scripts/statusline/defaults.json +10 -10
  25. package/agents-config/scripts/statusline/src/commands/interactive-config.ts +118 -6
  26. package/agents-config/scripts/statusline/src/index.ts +100 -9
  27. package/agents-config/scripts/statusline/src/lib/config.ts +28 -2
  28. package/agents-config/scripts/statusline/src/lib/features/limits/commands/weekly-analysis.ts +108 -0
  29. package/agents-config/scripts/statusline/src/lib/features/limits/index.ts +164 -0
  30. package/agents-config/scripts/statusline/src/lib/features/limits/types.ts +15 -0
  31. package/agents-config/scripts/statusline/src/lib/features/spend/commands/migrate-to-sqlite.ts +136 -0
  32. package/agents-config/scripts/statusline/src/lib/features/spend/commands/spend-day.ts +79 -0
  33. package/agents-config/scripts/statusline/src/lib/features/spend/commands/spend-month.ts +66 -0
  34. package/agents-config/scripts/statusline/src/lib/features/spend/commands/spend-project.ts +85 -0
  35. package/agents-config/scripts/statusline/src/lib/features/spend/database.ts +395 -0
  36. package/agents-config/scripts/statusline/src/lib/features/spend/index.ts +178 -0
  37. package/agents-config/scripts/statusline/src/lib/features/spend/payload-logger.ts +163 -0
  38. package/agents-config/scripts/statusline/src/lib/features/spend/types.ts +37 -0
  39. package/agents-config/scripts/statusline/src/lib/presets.ts +13 -13
  40. package/agents-config/scripts/statusline/statusline.config.free.json +4 -1
  41. package/agents-config/scripts/statusline/statusline.config.json +44 -23
  42. package/agents-config/skills/{agents-managers → agents-manager}/SKILL.md +1 -1
  43. package/agents-config/skills/{agents-managers → agents-manager}/references/writing-agent-prompts.md +1 -1
  44. package/agents-config/skills/apex/SKILL.md +61 -0
  45. package/agents-config/skills/appstore-connect/SKILL.md +2 -2
  46. package/agents-config/skills/{appstore-connect-setup/SKILL.md → appstore-connect/references/setup.md} +3 -6
  47. package/agents-config/skills/environments-manager/SKILL.md +6 -6
  48. package/agents-config/skills/environments-manager/examples/{claude/commands/dev.md → skills/dev/SKILL.md} +2 -1
  49. package/agents-config/skills/environments-manager/examples/{claude/commands/lint.md → skills/lint/SKILL.md} +2 -1
  50. package/agents-config/skills/environments-manager/examples/{claude/commands/test.md → skills/test/SKILL.md} +2 -1
  51. package/agents-config/skills/environments-manager/examples/{claude/commands/typecheck.md → skills/typecheck/SKILL.md} +2 -1
  52. package/agents-config/skills/environments-manager/references/claude.md +13 -9
  53. package/agents-config/skills/environments-manager/references/cursor.md +2 -2
  54. package/agents-config/skills/ios-testflight/SKILL.md +2 -2
  55. package/agents-config/{commands/prompts/prompt.md → skills/prompt/SKILL.md} +5 -0
  56. package/agents-config/{commands/prompts/tools.md → skills/tools/SKILL.md} +1 -0
  57. package/agents-config/skills/ultrathink/SKILL.md +1 -1
  58. package/agents-config/skills/use-style/SKILL.md +7 -4
  59. package/agents-config/skills/use-style/examples/luma.html +221 -0
  60. package/agents-config/skills/use-style/examples/testspirite.html +340 -0
  61. package/agents-config/skills/use-style/styles/ios-app.md +350 -0
  62. package/agents-config/skills/use-style/styles/luma.md +422 -0
  63. package/agents-config/skills/use-style/styles/new-york-times.md +1 -1
  64. package/agents-config/skills/use-style/styles/split-auth.md +2 -2
  65. package/agents-config/skills/use-style/styles/testspirite.md +397 -0
  66. package/dist/cli.js +56 -118
  67. package/package.json +1 -1
  68. package/agents-config/claude-config/scripts/.claude/commands/fix-on-my-computer.md +0 -87
  69. package/agents-config/commands/prompts/create-vitejs-app.md +0 -272
  70. package/agents-config/commands/prompts/nextjs-add-prisma-db.md +0 -136
  71. package/agents-config/commands/prompts/nextjs-setup-better-auth.md +0 -173
  72. package/agents-config/commands/prompts/nextjs-setup-project.md +0 -200
  73. package/agents-config/commands/prompts/saas-challenge-idea.md +0 -135
  74. package/agents-config/commands/prompts/saas-create-architecture.md +0 -242
  75. package/agents-config/commands/prompts/saas-create-headline.md +0 -132
  76. package/agents-config/commands/prompts/saas-create-landing-copywritting.md +0 -267
  77. package/agents-config/commands/prompts/saas-create-legals-docs.md +0 -176
  78. package/agents-config/commands/prompts/saas-create-logos.md +0 -240
  79. package/agents-config/commands/prompts/saas-create-prd.md +0 -195
  80. package/agents-config/commands/prompts/saas-create-tasks.md +0 -240
  81. package/agents-config/commands/prompts/saas-define-pricing.md +0 -293
  82. package/agents-config/commands/prompts/saas-find-domain-name.md +0 -190
  83. package/agents-config/commands/prompts/saas-implement-landing-page.md +0 -257
  84. package/agents-config/commands/prompts/setup-tmux.md +0 -160
  85. /package/agents-config/skills/{agents-managers → agents-manager}/references/agents.md +0 -0
  86. /package/agents-config/skills/{agents-managers → agents-manager}/references/context-management.md +0 -0
  87. /package/agents-config/skills/{agents-managers → agents-manager}/references/debugging-agents.md +0 -0
  88. /package/agents-config/skills/{agents-managers → agents-manager}/references/error-handling-and-recovery.md +0 -0
  89. /package/agents-config/skills/{agents-managers → agents-manager}/references/evaluation-and-testing.md +0 -0
  90. /package/agents-config/skills/{agents-managers → agents-manager}/references/orchestration-patterns.md +0 -0
@@ -0,0 +1,397 @@
1
+ # TestSpirite Style
2
+
3
+ Calm light SaaS product UI. Warm paper-white canvas, one forest-green accent, grouped sidebar, soft rounded cards on quiet borders, pale-green status pills, and isometric line-art empty states. Trust-driven dev tooling, never loud.
4
+
5
+ **Reference vibe:** TestSprite app shell (home dashboard, sidebar nav, test lists, monitoring, plan/billing, changelog rail).
6
+
7
+ ---
8
+
9
+ ## Core vibe
10
+
11
+ - **Product UI, not marketing.** App shell aesthetic: grouped sidebar + content + promo rail. Use it for dashboards, settings, and tool surfaces, not splashy hero landings.
12
+ - **Warm paper light mode.** Faint sage-tinted off-white canvas, white cards, near-black warm ink. Light, airy, never stark white-on-white.
13
+ - **One green, used calmly.** A single forest green `#3d7c4e` carries every action, active state, and positive status. 90% of the UI stays neutral gray; green is the only saturated color.
14
+ - **Line over depth.** 1px low-contrast borders define cards and panes. At most one barely-there ambient shadow on raised cards. No heavy elevation.
15
+ - **Soft, generous radius.** `rounded-xl` (12px) cards, `rounded-lg` (8px) buttons/inputs, `rounded-full` pills and avatars. Never sharp `0`.
16
+ - **Pale-green pills everywhere.** Feature checkmarks, `New` tags, `New Feature` changelog labels, status dots: tinted green text on a pale green wash.
17
+ - **Isometric wireframe empty states.** Light gray line-art stacked cubes / layered chevrons (echoing the TestSprite mark) sit centered above an empty-state CTA.
18
+ - **Conversion woven in.** Free-trial and upgrade promo cards live inside the shell (sidebar foot, right rail, section banners), not bolted on.
19
+ - **Clean Inter sans.** Inter / system grotesque for everything; `tabular-nums` for credits, counts, and dates. Mono only for IDs/keys.
20
+
21
+ ---
22
+
23
+ ## Color
24
+
25
+ Portable palette. Map to project tokens when available.
26
+
27
+ | Role | Hex | CSS var (suggested) | Usage |
28
+ |------|-----|---------------------|-------|
29
+ | Canvas | `#f7f7f3` | `--ts-bg` | Page + sidebar background (warm sage-white) |
30
+ | Surface | `#ffffff` | `--ts-surface` | Cards, panels, promo rail, inputs |
31
+ | Surface sunken | `#f0f1ec` | `--ts-sunken` | Hover rows, inset blocks, table headers |
32
+ | Ink | `#1a1c19` | `--ts-fg` | Headings, primary values, active nav |
33
+ | Slate ink | `#494c46` | `--ts-slate` | Body copy, descriptions |
34
+ | Muted ink | `#8a8d84` | `--ts-muted-fg` | Section labels, metadata, inactive nav |
35
+ | Subtle ink | `#a8aaa0` | `--ts-subtle-fg` | Placeholders, helper text, faint icons |
36
+ | Border | `#e8e9e3` | `--ts-border` | Card outlines, dividers, row separators |
37
+ | Border strong | `#d8dad2` | `--ts-border-strong` | Hover/focus outlines |
38
+ | Primary | `#3d7c4e` | `--ts-primary` | Buttons, active state, links, focus ring |
39
+ | Primary hover | `#336b42` | `--ts-primary-hover` | Button / link hover |
40
+ | Primary surface | `#eaf3ea` | `--ts-primary-surface` | Pill / badge / promo-card wash, active row tint |
41
+ | Primary border | `#d3e6d5` | `--ts-primary-border` | Outline on pale-green surfaces |
42
+ | Status dot | `#2f9e54` | `--ts-status` | Brighter green for live/connected dots |
43
+ | Warning | `#c98a28` | `--ts-warning` | Pending, attention, low-credit |
44
+ | Error | `#cf4a3e` | `--ts-error` | Failed runs, destructive |
45
+ | Link | `#3d7c4e` | `--ts-link` | Text links |
46
+
47
+ ### Tailwind mapping (when no project tokens)
48
+
49
+ ```css
50
+ :root {
51
+ --ts-bg: #f7f7f3;
52
+ --ts-surface: #fff;
53
+ --ts-sunken: #f0f1ec;
54
+ --ts-fg: #1a1c19;
55
+ --ts-slate: #494c46;
56
+ --ts-muted-fg: #8a8d84;
57
+ --ts-border: #e8e9e3;
58
+ --ts-primary: #3d7c4e;
59
+ --ts-primary-surface: #eaf3ea;
60
+ }
61
+ ```
62
+
63
+ | Tailwind | Value |
64
+ |----------|-------|
65
+ | `bg-[#f7f7f3]` | Canvas / sidebar |
66
+ | `bg-white` | Card / surface |
67
+ | `bg-[#f0f1ec]` | Hover / sunken |
68
+ | `text-[#1a1c19]` | Primary ink |
69
+ | `text-[#8a8d84]` | Muted |
70
+ | `border-[#e8e9e3]` | Structure |
71
+ | `bg-[#3d7c4e]` | Primary action |
72
+ | `bg-[#eaf3ea]` | Green pill / promo wash |
73
+ | `text-[#3d7c4e]` | Accent / link |
74
+
75
+ **Rule:** Keep the layout neutral warm-gray and reserve forest green for actions, active state, and positive status. One green only; no second accent hue.
76
+
77
+ ---
78
+
79
+ ## Typography
80
+
81
+ ### Font stacks
82
+
83
+ | Role | Stack |
84
+ |------|-------|
85
+ | Sans (everything) | `Inter, ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif` |
86
+ | Mono (keys, IDs) | `"Geist Mono", ui-monospace, SFMono-Regular, Menlo, monospace` |
87
+
88
+ Load Inter via `@fontsource/inter` or `next/font`. No display/serif face: TestSpirite is sans-only.
89
+
90
+ ### Scale
91
+
92
+ | Level | Pattern |
93
+ |-------|---------|
94
+ | Page title | `text-xl md:text-2xl font-semibold tracking-tight text-[#1a1c19]` |
95
+ | Card / promo heading | `text-lg md:text-xl font-semibold text-[#1a1c19]` |
96
+ | Section heading (Recent Created Tests) | `text-sm font-semibold text-[#1a1c19]` |
97
+ | Sidebar section label | `text-[11px] font-medium uppercase tracking-wide text-[#8a8d84]` |
98
+ | Nav item | `text-sm text-[#494c46]` |
99
+ | Body / description | `text-sm leading-relaxed text-[#494c46]` |
100
+ | Metadata / date | `text-xs tabular-nums text-[#8a8d84]` |
101
+ | Metric / credits | `text-sm font-medium tabular-nums text-[#1a1c19]` |
102
+ | Key / ID | `font-mono text-xs text-[#494c46]` |
103
+
104
+ ### Weight & tracking
105
+
106
+ - Headings: `font-semibold` (600), `tracking-tight`.
107
+ - Body: `font-normal` (400), relaxed leading.
108
+ - Sidebar section labels: `font-medium` (500), `uppercase`, light tracking, muted. (This is the one uppercase label in the system.)
109
+ - Nav items + most labels: sentence case.
110
+ - Counts, credits, dates: always `tabular-nums`.
111
+
112
+ ---
113
+
114
+ ## Layout tokens
115
+
116
+ | Token | Value |
117
+ |-------|-------|
118
+ | `TS_SIDEBAR` | `w-60 shrink-0 border-r border-[#e8e9e3] bg-[#f7f7f3] flex flex-col` |
119
+ | `TS_MAIN` | `flex-1 min-w-0 bg-[#f7f7f3]` |
120
+ | `TS_TOPBAR` | `flex h-14 items-center border-b border-[#e8e9e3] px-6` |
121
+ | `TS_CONTENT` | `mx-auto w-full max-w-6xl px-6 py-6 md:py-8` |
122
+ | `TS_RAIL` | `w-80 shrink-0 space-y-4` (right promo/plan/changelog rail) |
123
+ | `TS_CARD` | `rounded-xl border border-[#e8e9e3] bg-white p-5` |
124
+ | `TS_ROW` | `flex items-center gap-2.5 rounded-lg px-2.5 py-2` |
125
+ | `TS_GAP` | `space-y-6 md:space-y-8` |
126
+
127
+ ### App shell (TestSpirite's core layout)
128
+
129
+ Grouped sidebar + main column; main splits into a content stream and a right promo rail.
130
+
131
+ ```
132
+ +--------+--------------------------------+-----------------+
133
+ | side | topbar (page title) | |
134
+ | bar +--------------------------------+ |
135
+ | groups | hero / section cards | promo rail |
136
+ | + foot | (recent tests, lists, ...) | plan, updates |
137
+ | w-60 | max-w-6xl | w-80 |
138
+ +--------+--------------------------------+-----------------+
139
+ ```
140
+
141
+ ```tsx
142
+ <div className="flex min-h-screen bg-[#f7f7f3] text-[#1a1c19]">
143
+ <aside className="flex w-60 shrink-0 flex-col border-r border-[#e8e9e3] bg-[#f7f7f3]">
144
+ <WorkspaceSwitcher />
145
+ <nav className="flex-1 space-y-5 px-3 py-4">{groups}</nav>
146
+ <TrialCard /> {/* sidebar foot */}
147
+ </aside>
148
+ <div className="flex flex-1 flex-col">
149
+ <header className="flex h-14 items-center border-b border-[#e8e9e3] px-6 text-sm text-[#494c46]">Home</header>
150
+ <main className="mx-auto flex w-full max-w-6xl gap-6 px-6 py-8">
151
+ <div className="min-w-0 flex-1 space-y-8">{content}</div>
152
+ <aside className="w-80 shrink-0 space-y-4">{rail}</aside>
153
+ </main>
154
+ </div>
155
+ </div>
156
+ ```
157
+
158
+ ### Workspace switcher (sidebar head)
159
+
160
+ ```tsx
161
+ <button className="flex items-center gap-2.5 px-4 py-3 text-sm hover:bg-[#f0f1ec]">
162
+ <span className="grid size-7 place-items-center rounded-md bg-[#3d7c4e] text-xs font-semibold text-white">MW</span>
163
+ <span className="flex-1 truncate font-medium text-[#1a1c19]">My Workspace</span>
164
+ <ChevronsUpDown className="size-4 text-[#8a8d84]" />
165
+ </button>
166
+ ```
167
+
168
+ ---
169
+
170
+ ## Borders, radius & elevation
171
+
172
+ Line-defined and soft. Cards are bordered; one faint ambient shadow at most.
173
+
174
+ | Context | Radius | Border | Shadow |
175
+ |---------|--------|--------|--------|
176
+ | Card / panel / promo | `rounded-xl` (12px) | `border-[#e8e9e3]` | none, or `TS_SHADOW_CARD` |
177
+ | Hero / billboard card | `rounded-2xl` (16px) | `border-[#e8e9e3]` | `TS_SHADOW_CARD` |
178
+ | Button | `rounded-lg` (8px) | none (primary) / `border-[#e8e9e3]` (secondary) | none |
179
+ | Input | `rounded-lg` (8px) | `border-[#e8e9e3]` | none |
180
+ | Nav row / list row | `rounded-lg` (8px) | none; active = `bg-[#f0f1ec]` | none |
181
+ | Pill / badge / avatar | `rounded-full` | optional `border-[#d3e6d5]` | none |
182
+ | Workspace logo mark | `rounded-md` (6px) | none | none |
183
+
184
+ ### Shadow token (the one soft ambient lift)
185
+
186
+ ```css
187
+ --ts-shadow-card: 0 1px 2px rgba(26,28,25,0.04), 0 1px 3px rgba(26,28,25,0.03);
188
+ ```
189
+
190
+ ```tsx
191
+ className="shadow-[0_1px_2px_rgba(26,28,25,0.04),0_1px_3px_rgba(26,28,25,0.03)]"
192
+ ```
193
+
194
+ Dividers: `border-t border-[#e8e9e3]`. Rows separate by spacing + hover bg, not per-row borders.
195
+
196
+ ---
197
+
198
+ ## Component patterns
199
+
200
+ ### Sidebar nav group
201
+
202
+ Tiny muted uppercase label, then icon + label rows. Active row = sunken bg + ink text. No left accent bar.
203
+
204
+ ```tsx
205
+ <div>
206
+ <p className="px-2.5 pb-1.5 text-[11px] font-medium uppercase tracking-wide text-[#8a8d84]">Testing</p>
207
+ <a className={cn(
208
+ "flex items-center gap-2.5 rounded-lg px-2.5 py-2 text-sm",
209
+ active ? "bg-[#f0f1ec] font-medium text-[#1a1c19]" : "text-[#494c46] hover:bg-[#f0f1ec]"
210
+ )}>
211
+ <FlaskConical className="size-4 shrink-0 text-[#8a8d84]" />
212
+ <span className="flex-1 truncate">Create Tests</span>
213
+ <NewBadge />
214
+ </a>
215
+ </div>
216
+ ```
217
+
218
+ ### `New` badge / `New Feature` tag
219
+
220
+ The signature pale-green pill.
221
+
222
+ ```tsx
223
+ <span className="rounded-full bg-[#eaf3ea] px-2 py-0.5 text-[11px] font-medium text-[#3d7c4e]">New</span>
224
+ ```
225
+
226
+ ### Feature pill with checkmark (promo cards)
227
+
228
+ ```tsx
229
+ <span className="inline-flex items-center gap-1.5 rounded-full bg-[#eaf3ea] px-2.5 py-1 text-xs font-medium text-[#3d7c4e]">
230
+ <Check className="size-3.5" /> Better Coverage
231
+ </span>
232
+ ```
233
+
234
+ ### Status pill (live / connected)
235
+
236
+ ```tsx
237
+ <span className="inline-flex items-center gap-1.5 rounded-full bg-[#eaf3ea] px-2.5 py-0.5 text-xs font-medium text-[#3d7c4e]">
238
+ <span className="size-1.5 rounded-full bg-[#2f9e54]" /> Connected
239
+ </span>
240
+ ```
241
+
242
+ ### Buttons
243
+
244
+ | Variant | Classes |
245
+ |---------|---------|
246
+ | Primary | `rounded-lg bg-[#3d7c4e] px-4 py-2 text-sm font-medium text-white transition-colors hover:bg-[#336b42]` |
247
+ | Secondary | `rounded-lg border border-[#e8e9e3] bg-white px-4 py-2 text-sm font-medium text-[#1a1c19] transition-colors hover:bg-[#f0f1ec]` |
248
+ | Ghost / icon | `rounded-lg p-2 text-[#8a8d84] transition-colors hover:bg-[#f0f1ec] hover:text-[#1a1c19]` |
249
+ | Link | `text-sm font-medium text-[#3d7c4e] hover:text-[#336b42]` |
250
+
251
+ ### Input
252
+
253
+ ```tsx
254
+ <input
255
+ className="w-full rounded-lg border border-[#e8e9e3] bg-white px-3 py-2 text-sm text-[#1a1c19] placeholder:text-[#a8aaa0] transition-shadow focus:border-[#3d7c4e] focus:shadow-[0_0_0_3px_rgba(61,124,78,0.15)] focus:outline-none"
256
+ placeholder="Search tests..."
257
+ />
258
+ ```
259
+
260
+ ### Card
261
+
262
+ ```tsx
263
+ <div className="rounded-xl border border-[#e8e9e3] bg-white p-5">...</div>
264
+ ```
265
+
266
+ ### Section header (with action)
267
+
268
+ ```tsx
269
+ <div className="flex items-center justify-between">
270
+ <h2 className="text-sm font-semibold text-[#1a1c19]">Recent Created Tests</h2>
271
+ <div className="flex items-center gap-2">
272
+ <button className="rounded-lg border border-[#e8e9e3] bg-white px-2.5 py-1.5 text-xs text-[#494c46] hover:bg-[#f0f1ec]">Last 7 Days ▾</button>
273
+ <button className="rounded-lg border border-[#e8e9e3] bg-white p-1.5 text-[#8a8d84] hover:bg-[#f0f1ec]"><Plus className="size-4" /></button>
274
+ </div>
275
+ </div>
276
+ ```
277
+
278
+ ### Empty state (signature)
279
+
280
+ Isometric line-art mark, centered, muted, above a label + primary CTA. Draw the mark as stacked/offset wireframe cubes or layered chevrons in `--ts-subtle-fg` strokes (no fill).
281
+
282
+ ```tsx
283
+ <div className="flex flex-col items-center gap-4 rounded-xl border border-[#e8e9e3] bg-white py-16">
284
+ <IsometricStackMark className="size-16 text-[#cfd1c8]" /> {/* line-art, stroke only */}
285
+ <p className="text-sm text-[#8a8d84]">No tests</p>
286
+ <button className="rounded-lg border border-[#e8e9e3] bg-white px-3.5 py-2 text-sm font-medium text-[#1a1c19] hover:bg-[#f0f1ec]">
287
+ <Plus className="mr-1.5 inline size-4" /> Create Tests
288
+ </button>
289
+ </div>
290
+ ```
291
+
292
+ ### Promo / trial card (sidebar foot or rail)
293
+
294
+ Pale-green wash, sparkle glyph, headline, sub, feature pills, full-width primary CTA.
295
+
296
+ ```tsx
297
+ <div className="rounded-xl border border-[#d3e6d5] bg-[#eaf3ea] p-4">
298
+ <p className="flex items-center gap-1.5 text-sm font-semibold text-[#1a1c19]"><Sparkles className="size-4 text-[#3d7c4e]" /> 1 Month Free Trial</p>
299
+ <p className="mt-1 text-xs text-[#494c46]">Unlock all features free for 1 month.</p>
300
+ <div className="mt-3 flex flex-wrap gap-1.5">{featurePills}</div>
301
+ <button className="mt-3 w-full rounded-lg bg-[#3d7c4e] px-4 py-2 text-sm font-medium text-white hover:bg-[#336b42]">Try For Free</button>
302
+ </div>
303
+ ```
304
+
305
+ ### Plan / credits block (rail)
306
+
307
+ ```tsx
308
+ <div className="rounded-xl border border-[#e8e9e3] bg-white p-4">
309
+ <div className="flex items-center justify-between">
310
+ <p className="text-sm font-semibold text-[#1a1c19]">My Plan</p>
311
+ <button className="text-xs font-medium text-[#3d7c4e]">Manage Plan</button>
312
+ </div>
313
+ <div className="mt-3 h-1.5 overflow-hidden rounded-full bg-[#f0f1ec]">
314
+ <div className="h-full rounded-full bg-[#3d7c4e]" style={{width:"30%"}} />
315
+ </div>
316
+ <p className="mt-2 flex items-center justify-between text-xs text-[#494c46]">
317
+ <span>Free</span><span className="tabular-nums"><b className="text-[#1a1c19]">150</b> Credits Remaining</span>
318
+ </p>
319
+ </div>
320
+ ```
321
+
322
+ ### Changelog rail item
323
+
324
+ ```tsx
325
+ <div className="border-t border-[#e8e9e3] py-3 first:border-0">
326
+ <span className="rounded-full bg-[#eaf3ea] px-2 py-0.5 text-[11px] font-medium text-[#3d7c4e]">New Feature</span>
327
+ <p className="mt-2 text-sm font-medium text-[#1a1c19]">GitHub Integration</p>
328
+ <p className="mt-1 text-xs leading-relaxed text-[#494c46]">Connect your repositories to streamline testing.</p>
329
+ <p className="mt-2 text-xs tabular-nums text-[#a8aaa0]">Feb 17, 2026</p>
330
+ </div>
331
+ ```
332
+
333
+ ---
334
+
335
+ ## Charts (light app data viz)
336
+
337
+ Quiet, green-led, on white panels:
338
+
339
+ - Primary series in forest green `#3d7c4e`; supporting series fade through a green ramp `#6fa67d → #a9cdb1 → #d3e6d5`. Status colors (`#c98a28`, `#cf4a3e`) only when the chart literally encodes pass/fail.
340
+ - **Rounded bars** (`borderRadius: 6`), flat fills. No gradients, no glow.
341
+ - Background = white card; gridlines `#e8e9e3`; axis text Inter, muted `#8a8d84`, `tabular-nums`.
342
+ - Tooltip: white bg, `#e8e9e3` border, ink `#1a1c19`, `8px` corners, the one soft card shadow.
343
+
344
+ ```js
345
+ const PRIMARY="#3d7c4e", S2="#6fa67d", S3="#a9cdb1", S4="#d3e6d5", GRID="#e8e9e3";
346
+ Chart.defaults.font.family = "Inter, system-ui, sans-serif";
347
+ Chart.defaults.color = "#8a8d84";
348
+ // bars: backgroundColor:[S3, PRIMARY], borderRadius:6
349
+ // grid: { color: GRID }
350
+ // tooltip: { backgroundColor:"#fff", borderColor:"#e8e9e3", borderWidth:1, titleColor:"#1a1c19", bodyColor:"#494c46", cornerRadius:8 }
351
+ ```
352
+
353
+ ---
354
+
355
+ ## Motion & effects
356
+
357
+ - **Calm.** `transition-colors duration-150` on interactive elements; `transition-shadow` on inputs.
358
+ - Hover = bg shift to `#f0f1ec` on rows/secondary buttons, darker fill `#336b42` on primary. No scale, no lift on rows.
359
+ - Focus: soft 3px green ring `rgba(61,124,78,0.15)` + green border on inputs. Always visible.
360
+ - At most one faint ambient card shadow; no neon glow (raycast), no hard offset (gumroad), no glass blur.
361
+ - Empty-state marks may fade/slide in gently; no bounce.
362
+
363
+ ---
364
+
365
+ ## When to use
366
+
367
+ | Surface | Fit |
368
+ |---------|-----|
369
+ | Dev-tool dashboard, test runner, monitoring, settings, plan/billing | Strong fit |
370
+ | App shell with grouped sidebar + content + promo rail | Strong fit |
371
+ | Onboarding / empty states with illustrated CTAs | Strong fit |
372
+ | Marketing hero / landing page | Poor fit - use `grid`, `vercel-simple`, or `raycast` |
373
+ | Dense issue-tracker triage (3-pane) | Use `linear` |
374
+
375
+ TestSpirite is for **calm light-mode product app shells**. If the request is a marketing page, redirect to another style.
376
+
377
+ ---
378
+
379
+ ## Anti-patterns
380
+
381
+ | Avoid | Why |
382
+ |-------|-----|
383
+ | Pure cool `#fff` / `#f9fafb` gray canvas | Use the warm sage-white `#f7f7f3`; the warmth is the signature |
384
+ | A second accent hue (blue, purple, etc.) | TestSpirite is one green only; color lives in green + status |
385
+ | Sharp `rounded-none` cards/buttons | The look is soft 8-16px radius, never blueprint-square |
386
+ | Heavy `shadow-lg`/`shadow-2xl` elevation | Structure is line-defined; at most one faint ambient shadow |
387
+ | Large green fills / green backgrounds | Reserve green for actions, active state, pills, and the pale promo wash |
388
+ | Filled or photographic empty-state art | Empty states are light gray isometric line-art (stroke only) |
389
+ | Uppercase letter-spaced labels everywhere | Only the sidebar section labels are uppercase; everything else is sentence case |
390
+ | Dark mode by default | TestSpirite is a light, warm, paper surface |
391
+ | Mono for body text | Inter sans for prose; mono only for keys/IDs |
392
+
393
+ ---
394
+
395
+ ## Project overrides
396
+
397
+ If the repo defines `.agents/styles/testspirite.md` or `.agents/styles/testspirite-theme.md`, prefer those tokens and components over this portable spec.