aiblueprint-cli 1.4.81 → 1.4.82

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 (80) hide show
  1. package/README.md +21 -17
  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/SKILL.md +1 -1
  43. package/agents-config/skills/agents-managers/references/writing-agent-prompts.md +1 -1
  44. package/agents-config/{commands/prompts/create-vitejs-app.md → skills/create-vitejs-app/SKILL.md} +2 -1
  45. package/agents-config/skills/environments-manager/SKILL.md +6 -6
  46. package/agents-config/skills/environments-manager/examples/{claude/commands/dev.md → skills/dev/SKILL.md} +2 -1
  47. package/agents-config/skills/environments-manager/examples/{claude/commands/lint.md → skills/lint/SKILL.md} +2 -1
  48. package/agents-config/skills/environments-manager/examples/{claude/commands/test.md → skills/test/SKILL.md} +2 -1
  49. package/agents-config/skills/environments-manager/examples/{claude/commands/typecheck.md → skills/typecheck/SKILL.md} +2 -1
  50. package/agents-config/skills/environments-manager/references/claude.md +13 -9
  51. package/agents-config/skills/environments-manager/references/cursor.md +2 -2
  52. package/agents-config/{commands/prompts/nextjs-add-prisma-db.md → skills/nextjs-add-prisma-db/SKILL.md} +1 -0
  53. package/agents-config/{commands/prompts/nextjs-setup-better-auth.md → skills/nextjs-setup-better-auth/SKILL.md} +1 -0
  54. package/agents-config/{commands/prompts/nextjs-setup-project.md → skills/nextjs-setup-project/SKILL.md} +1 -0
  55. package/agents-config/{commands/prompts/prompt.md → skills/prompt/SKILL.md} +5 -0
  56. package/agents-config/{commands/prompts/saas-challenge-idea.md → skills/saas-challenge-idea/SKILL.md} +1 -0
  57. package/agents-config/{commands/prompts/saas-create-architecture.md → skills/saas-create-architecture/SKILL.md} +1 -0
  58. package/agents-config/{commands/prompts/saas-create-headline.md → skills/saas-create-headline/SKILL.md} +1 -0
  59. package/agents-config/{commands/prompts/saas-create-landing-copywritting.md → skills/saas-create-landing-copywritting/SKILL.md} +1 -0
  60. package/agents-config/{commands/prompts/saas-create-legals-docs.md → skills/saas-create-legals-docs/SKILL.md} +1 -0
  61. package/agents-config/{commands/prompts/saas-create-logos.md → skills/saas-create-logos/SKILL.md} +1 -0
  62. package/agents-config/{commands/prompts/saas-create-prd.md → skills/saas-create-prd/SKILL.md} +4 -3
  63. package/agents-config/{commands/prompts/saas-create-tasks.md → skills/saas-create-tasks/SKILL.md} +1 -0
  64. package/agents-config/{commands/prompts/saas-define-pricing.md → skills/saas-define-pricing/SKILL.md} +1 -0
  65. package/agents-config/{commands/prompts/saas-find-domain-name.md → skills/saas-find-domain-name/SKILL.md} +1 -0
  66. package/agents-config/{commands/prompts/saas-implement-landing-page.md → skills/saas-implement-landing-page/SKILL.md} +1 -0
  67. package/agents-config/{commands/prompts/setup-tmux.md → skills/setup-tmux/SKILL.md} +5 -0
  68. package/agents-config/{commands/prompts/tools.md → skills/tools/SKILL.md} +1 -0
  69. package/agents-config/skills/ultrathink/SKILL.md +1 -1
  70. package/agents-config/skills/use-style/SKILL.md +7 -4
  71. package/agents-config/skills/use-style/examples/luma.html +221 -0
  72. package/agents-config/skills/use-style/examples/testspirite.html +340 -0
  73. package/agents-config/skills/use-style/styles/ios-app.md +350 -0
  74. package/agents-config/skills/use-style/styles/luma.md +422 -0
  75. package/agents-config/skills/use-style/styles/new-york-times.md +1 -1
  76. package/agents-config/skills/use-style/styles/split-auth.md +2 -2
  77. package/agents-config/skills/use-style/styles/testspirite.md +397 -0
  78. package/dist/cli.js +17 -80
  79. package/package.json +1 -1
  80. package/agents-config/claude-config/scripts/.claude/commands/fix-on-my-computer.md +0 -87
@@ -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.
package/dist/cli.js CHANGED
@@ -34846,7 +34846,6 @@ async function getToolPaths(tool, customFolder) {
34846
34846
  baseDir = customFolder ? path15.resolve(customFolder) : path15.join(os12.homedir(), ".claude");
34847
34847
  return {
34848
34848
  baseDir,
34849
- commandsPath: path15.join(baseDir, "commands"),
34850
34849
  agentsPath: path15.join(baseDir, "agents")
34851
34850
  };
34852
34851
  case "codex":
@@ -34855,17 +34854,10 @@ async function getToolPaths(tool, customFolder) {
34855
34854
  baseDir,
34856
34855
  agentsPath: path15.join(baseDir, "agents")
34857
34856
  };
34858
- case "opencode":
34859
- baseDir = customFolder ? path15.resolve(customFolder) : path15.join(os12.homedir(), ".config", "opencode");
34860
- return {
34861
- baseDir,
34862
- commandsPath: path15.join(baseDir, "command")
34863
- };
34864
34857
  case "factoryai":
34865
34858
  baseDir = customFolder ? path15.resolve(customFolder) : path15.join(os12.homedir(), ".factory");
34866
34859
  return {
34867
34860
  baseDir,
34868
- commandsPath: path15.join(baseDir, "commands"),
34869
34861
  agentsPath: path15.join(baseDir, "droids")
34870
34862
  };
34871
34863
  default:
@@ -34908,27 +34900,15 @@ async function createSymlink(sourcePath, targetPath, options = {}) {
34908
34900
  var TOOLS = [
34909
34901
  {
34910
34902
  name: "Claude Code",
34911
- value: "claude-code",
34912
- supportsCommands: false,
34913
- supportsAgents: true
34903
+ value: "claude-code"
34914
34904
  },
34915
34905
  {
34916
34906
  name: "Codex",
34917
- value: "codex",
34918
- supportsCommands: false,
34919
- supportsAgents: true
34920
- },
34921
- {
34922
- name: "OpenCode",
34923
- value: "opencode",
34924
- supportsCommands: false,
34925
- supportsAgents: false
34907
+ value: "codex"
34926
34908
  },
34927
34909
  {
34928
34910
  name: "FactoryAI",
34929
- value: "factoryai",
34930
- supportsCommands: false,
34931
- supportsAgents: true
34911
+ value: "factoryai"
34932
34912
  }
34933
34913
  ];
34934
34914
  async function symlinkCommand(params = {}) {
@@ -34949,57 +34929,19 @@ async function symlinkCommand(params = {}) {
34949
34929
  }
34950
34930
  ]);
34951
34931
  const sourceTool = sourceAnswer.source;
34952
- const sourceConfig = TOOLS.find((t) => t.value === sourceTool);
34953
- const contentTypeChoices = [];
34954
- if (sourceConfig.supportsCommands) {
34955
- contentTypeChoices.push({ name: "Commands only", value: "commands" });
34956
- }
34957
- if (sourceConfig.supportsAgents) {
34958
- contentTypeChoices.push({ name: "Agents only", value: "agents" });
34959
- }
34960
- if (sourceConfig.supportsCommands && sourceConfig.supportsAgents) {
34961
- contentTypeChoices.push({ name: "Both", value: "both" });
34962
- }
34963
- if (contentTypeChoices.length === 0) {
34964
- console.log(source_default.red(`
34965
- ❌ Error: ${sourceConfig.name} doesn't support any syncable content`));
34966
- process.exit(1);
34967
- }
34968
- const contentAnswer = await lib_default.prompt([
34969
- {
34970
- type: "list",
34971
- name: "contentType",
34972
- message: "What would you like to sync?",
34973
- choices: contentTypeChoices
34974
- }
34975
- ]);
34976
- const syncType = contentAnswer.contentType;
34977
- const syncCommands = syncType === "commands" || syncType === "both";
34978
- const syncAgents = syncType === "agents" || syncType === "both";
34979
34932
  const destinationChoices = [];
34980
34933
  for (const tool of TOOLS) {
34981
34934
  if (tool.value === sourceTool)
34982
34935
  continue;
34983
- if (syncCommands && tool.supportsCommands) {
34984
- destinationChoices.push({
34985
- name: syncAgents ? `${tool.name} (commands)` : tool.name,
34986
- value: `${tool.value}-commands`,
34987
- tool: tool.value,
34988
- contentType: "commands"
34989
- });
34990
- }
34991
- if (syncAgents && tool.supportsAgents) {
34992
- destinationChoices.push({
34993
- name: syncCommands ? `${tool.name} (agents)` : tool.name,
34994
- value: `${tool.value}-agents`,
34995
- tool: tool.value,
34996
- contentType: "agents"
34997
- });
34998
- }
34936
+ destinationChoices.push({
34937
+ name: tool.name,
34938
+ value: `${tool.value}-agents`,
34939
+ tool: tool.value
34940
+ });
34999
34941
  }
35000
34942
  if (destinationChoices.length === 0) {
35001
34943
  console.log(source_default.yellow(`
35002
- ⚠️ No compatible destination tools found for the selected sync type`));
34944
+ ⚠️ No compatible destination tools found for agent syncing`));
35003
34945
  process.exit(0);
35004
34946
  }
35005
34947
  const destinationAnswer = await lib_default.prompt([
@@ -35029,7 +34971,6 @@ async function symlinkCommand(params = {}) {
35029
34971
  const customFolders = {
35030
34972
  "claude-code": claudeDir,
35031
34973
  codex: codexDir,
35032
- opencode: undefined,
35033
34974
  factoryai: undefined
35034
34975
  };
35035
34976
  const sourcePaths = await getToolPaths(sourceTool, customFolders[sourceTool]);
@@ -35041,17 +34982,10 @@ async function symlinkCommand(params = {}) {
35041
34982
  for (const destValue of selectedDestinations) {
35042
34983
  const destChoice = destinationChoices.find((c) => c.value === destValue);
35043
34984
  const destPaths = await getToolPaths(destChoice.tool, customFolders[destChoice.tool]);
35044
- let sourcePath;
35045
- let targetPath;
35046
- if (destChoice.contentType === "commands") {
35047
- sourcePath = sourcePaths.commandsPath;
35048
- targetPath = destPaths.commandsPath;
35049
- } else {
35050
- sourcePath = sourcePaths.agentsPath;
35051
- targetPath = destPaths.agentsPath;
35052
- }
34985
+ const sourcePath = sourcePaths.agentsPath;
34986
+ const targetPath = destPaths.agentsPath;
35053
34987
  const toolName = TOOLS.find((t) => t.value === destChoice.tool)?.name || destChoice.tool;
35054
- const contentLabel = destChoice.contentType === "commands" ? "commands" : "agents";
34988
+ const contentLabel = "agents";
35055
34989
  try {
35056
34990
  const success = await createSymlink(sourcePath, targetPath, {
35057
34991
  skipMessage: source_default.yellow(` ⚠️ ${toolName} ${contentLabel} path already exists and is not a symlink. Skipping...`)
@@ -35842,7 +35776,7 @@ async function listBackups() {
35842
35776
  return backups.sort((a, b3) => b3.date.getTime() - a.date.getTime());
35843
35777
  }
35844
35778
  var AGENTS_BACKUP_SUBDIR = ".agents";
35845
- var CLAUDE_ITEMS = ["commands", "agents", "skills", "scripts", "settings.json"];
35779
+ var CLAUDE_ITEMS = ["agents", "skills", "scripts", "settings.json"];
35846
35780
  var MANAGED_FOLDERS = [".claude", ".codex", ".agents"];
35847
35781
  async function copyForBackup(sourcePath, destPath) {
35848
35782
  await import_fs_extra12.default.copy(sourcePath, destPath, {
@@ -37605,6 +37539,9 @@ function routePath(relativePath) {
37605
37539
  if (isAgentCategory(first)) {
37606
37540
  return { kind: "agents-category", category: first, relativePath };
37607
37541
  }
37542
+ if (first === "commands") {
37543
+ return { kind: "skip" };
37544
+ }
37608
37545
  if (first === ".claude") {
37609
37546
  return { kind: "claude", relativePath: rest };
37610
37547
  }
@@ -39498,7 +39435,7 @@ function registerAgentsCommands(cmd) {
39498
39435
  homeDir: parentOptions.folder
39499
39436
  });
39500
39437
  });
39501
- cmd.command("symlink").description("Create symlinks between different AI coding tools (Claude Code, Codex, OpenCode, FactoryAI)").action((options, command) => {
39438
+ cmd.command("symlink").description("Create agent symlinks between AI coding tools (Claude Code, Codex, FactoryAI)").action((options, command) => {
39502
39439
  const parentOptions = command.parent.opts();
39503
39440
  symlinkCommand({
39504
39441
  folder: parentOptions.folder,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "aiblueprint-cli",
3
- "version": "1.4.81",
3
+ "version": "1.4.82",
4
4
  "description": "AIBlueprint CLI for setting up AI coding configurations",
5
5
  "author": "AIBlueprint",
6
6
  "license": "MIT",
@@ -1,87 +0,0 @@
1
- ---
2
- description: Setup wizard - verify bun, install deps, run tests, fix until ALL pass
3
- allowed-tools: Bash, Read, Edit, Write, Glob, Grep, TodoWrite
4
- ---
5
-
6
- <objective>
7
- Make this scripts repository work PERFECTLY on this machine.
8
-
9
- You are a relentless setup wizard. Your mission is to verify the environment, install dependencies, run all tests, and fix ANY failing tests until 100% pass. You NEVER give up until every single test is green.
10
- </objective>
11
-
12
- <context>
13
- Current OS: !`uname -s`
14
- Current directory: !`pwd`
15
- Bun version: !`bun --version 2>&1 || echo "NOT_INSTALLED"`
16
- Package.json: @package.json
17
- </context>
18
-
19
- <process>
20
- **Phase 1: Environment Check**
21
-
22
- 1. Verify Bun is installed (`bun --version`)
23
- - If NOT installed → STOP and tell user: "Install Bun from https://bun.sh"
24
- 2. Verify in correct directory (must have package.json with "test" script)
25
- 3. Check OS: macOS/Linux (full support), Windows (needs WSL)
26
-
27
- **Phase 2: Install Dependencies**
28
-
29
- 4. Run `bun install`
30
- - If fails: Delete `bun.lockb` and retry
31
- - If still fails: Report specific error to user
32
-
33
- **Phase 3: Run Tests**
34
-
35
- 5. Run `bun run test`
36
- 6. Record output - note which tests pass/fail
37
-
38
- **Phase 4: Fix Loop (NEVER STOP UNTIL GREEN)**
39
-
40
- 7. While ANY tests fail:
41
- - Analyze the error message
42
- - Identify root cause:
43
- - Missing dependency → `bun install <package>`
44
- - Wrong import path → Fix the import
45
- - Cross-platform issue → Use `path.join()`, `os.homedir()`
46
- - Missing credentials → Check `~/.claude/.credentials.json`
47
- - File not found → Verify path exists
48
- - Type error → Fix TypeScript
49
- - Apply minimal fix
50
- - Re-run `bun run test`
51
- - **REPEAT until 100% green**
52
-
53
- **Phase 5: Final Verification**
54
-
55
- 8. Run `bun run test` one final time
56
- 9. Run `bun run lint` (fix if needed)
57
-
58
- **Phase 6: Victory Report**
59
-
60
- 10. Report to user:
61
- - Total tests passed
62
- - Fixes applied (list each one)
63
- - Status: READY TO USE
64
- </process>
65
-
66
- <testing>
67
- Install: !`bun install`
68
- Tests: !`bun run test`
69
- Lint: !`bun run lint`
70
- </testing>
71
-
72
- <verification>
73
- Before declaring success:
74
- - `bun run test` exits with code 0
75
- - ALL 186+ tests pass
76
- - No lint errors
77
- - All package.json scripts work
78
- </verification>
79
-
80
- <success_criteria>
81
- - Bun installed and working
82
- - All dependencies installed
83
- - ALL tests passing (0 failures)
84
- - Lint check passes
85
- - User can run any command from package.json
86
- - Repository is READY TO USE
87
- </success_criteria>