aiblueprint-cli 1.4.80 → 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.
- package/README.md +21 -17
- package/agents-config/claude-config/scripts/statusline/data/.gitignore +8 -0
- package/agents-config/claude-config/scripts/statusline/data/.gitkeep +0 -0
- package/agents-config/claude-config/scripts/statusline/defaults.json +10 -10
- package/agents-config/claude-config/scripts/statusline/src/commands/interactive-config.ts +118 -6
- package/agents-config/claude-config/scripts/statusline/src/index.ts +100 -9
- package/agents-config/claude-config/scripts/statusline/src/lib/config.ts +28 -2
- package/agents-config/claude-config/scripts/statusline/src/lib/features/limits/commands/weekly-analysis.ts +108 -0
- package/agents-config/claude-config/scripts/statusline/src/lib/features/limits/index.ts +164 -0
- package/agents-config/claude-config/scripts/statusline/src/lib/features/limits/types.ts +15 -0
- package/agents-config/claude-config/scripts/statusline/src/lib/features/spend/commands/migrate-to-sqlite.ts +136 -0
- package/agents-config/claude-config/scripts/statusline/src/lib/features/spend/commands/spend-day.ts +79 -0
- package/agents-config/claude-config/scripts/statusline/src/lib/features/spend/commands/spend-month.ts +66 -0
- package/agents-config/claude-config/scripts/statusline/src/lib/features/spend/commands/spend-project.ts +85 -0
- package/agents-config/claude-config/scripts/statusline/src/lib/features/spend/database.ts +395 -0
- package/agents-config/claude-config/scripts/statusline/src/lib/features/spend/index.ts +178 -0
- package/agents-config/claude-config/scripts/statusline/src/lib/features/spend/payload-logger.ts +163 -0
- package/agents-config/claude-config/scripts/statusline/src/lib/features/spend/types.ts +37 -0
- package/agents-config/claude-config/scripts/statusline/src/lib/presets.ts +13 -13
- package/agents-config/claude-config/scripts/statusline/statusline.config.free.json +4 -1
- package/agents-config/claude-config/scripts/statusline/statusline.config.json +44 -23
- package/agents-config/scripts/statusline/data/.gitignore +8 -0
- package/agents-config/scripts/statusline/data/.gitkeep +0 -0
- package/agents-config/scripts/statusline/defaults.json +10 -10
- package/agents-config/scripts/statusline/src/commands/interactive-config.ts +118 -6
- package/agents-config/scripts/statusline/src/index.ts +100 -9
- package/agents-config/scripts/statusline/src/lib/config.ts +28 -2
- package/agents-config/scripts/statusline/src/lib/features/limits/commands/weekly-analysis.ts +108 -0
- package/agents-config/scripts/statusline/src/lib/features/limits/index.ts +164 -0
- package/agents-config/scripts/statusline/src/lib/features/limits/types.ts +15 -0
- package/agents-config/scripts/statusline/src/lib/features/spend/commands/migrate-to-sqlite.ts +136 -0
- package/agents-config/scripts/statusline/src/lib/features/spend/commands/spend-day.ts +79 -0
- package/agents-config/scripts/statusline/src/lib/features/spend/commands/spend-month.ts +66 -0
- package/agents-config/scripts/statusline/src/lib/features/spend/commands/spend-project.ts +85 -0
- package/agents-config/scripts/statusline/src/lib/features/spend/database.ts +395 -0
- package/agents-config/scripts/statusline/src/lib/features/spend/index.ts +178 -0
- package/agents-config/scripts/statusline/src/lib/features/spend/payload-logger.ts +163 -0
- package/agents-config/scripts/statusline/src/lib/features/spend/types.ts +37 -0
- package/agents-config/scripts/statusline/src/lib/presets.ts +13 -13
- package/agents-config/scripts/statusline/statusline.config.free.json +4 -1
- package/agents-config/scripts/statusline/statusline.config.json +44 -23
- package/agents-config/skills/agents-managers/SKILL.md +1 -1
- package/agents-config/skills/agents-managers/references/writing-agent-prompts.md +1 -1
- package/agents-config/skills/appstore-connect/SKILL.md +104 -0
- package/agents-config/skills/appstore-connect/scripts/asc-api.mjs +88 -0
- package/agents-config/skills/appstore-connect-setup/SKILL.md +159 -0
- package/agents-config/{commands/prompts/create-vitejs-app.md → skills/create-vitejs-app/SKILL.md} +2 -1
- package/agents-config/skills/environments-manager/SKILL.md +6 -6
- package/agents-config/skills/environments-manager/examples/{claude/commands/dev.md → skills/dev/SKILL.md} +2 -1
- package/agents-config/skills/environments-manager/examples/{claude/commands/lint.md → skills/lint/SKILL.md} +2 -1
- package/agents-config/skills/environments-manager/examples/{claude/commands/test.md → skills/test/SKILL.md} +2 -1
- package/agents-config/skills/environments-manager/examples/{claude/commands/typecheck.md → skills/typecheck/SKILL.md} +2 -1
- package/agents-config/skills/environments-manager/references/claude.md +13 -9
- package/agents-config/skills/environments-manager/references/cursor.md +2 -2
- package/agents-config/skills/ios-testflight/SKILL.md +280 -0
- package/agents-config/{commands/prompts/nextjs-add-prisma-db.md → skills/nextjs-add-prisma-db/SKILL.md} +1 -0
- package/agents-config/{commands/prompts/nextjs-setup-better-auth.md → skills/nextjs-setup-better-auth/SKILL.md} +1 -0
- package/agents-config/{commands/prompts/nextjs-setup-project.md → skills/nextjs-setup-project/SKILL.md} +1 -0
- package/agents-config/{commands/prompts/prompt.md → skills/prompt/SKILL.md} +5 -0
- package/agents-config/{commands/prompts/saas-challenge-idea.md → skills/saas-challenge-idea/SKILL.md} +1 -0
- package/agents-config/{commands/prompts/saas-create-architecture.md → skills/saas-create-architecture/SKILL.md} +1 -0
- package/agents-config/{commands/prompts/saas-create-headline.md → skills/saas-create-headline/SKILL.md} +1 -0
- package/agents-config/{commands/prompts/saas-create-landing-copywritting.md → skills/saas-create-landing-copywritting/SKILL.md} +1 -0
- package/agents-config/{commands/prompts/saas-create-legals-docs.md → skills/saas-create-legals-docs/SKILL.md} +1 -0
- package/agents-config/{commands/prompts/saas-create-logos.md → skills/saas-create-logos/SKILL.md} +1 -0
- package/agents-config/{commands/prompts/saas-create-prd.md → skills/saas-create-prd/SKILL.md} +4 -3
- package/agents-config/{commands/prompts/saas-create-tasks.md → skills/saas-create-tasks/SKILL.md} +1 -0
- package/agents-config/{commands/prompts/saas-define-pricing.md → skills/saas-define-pricing/SKILL.md} +1 -0
- package/agents-config/{commands/prompts/saas-find-domain-name.md → skills/saas-find-domain-name/SKILL.md} +1 -0
- package/agents-config/{commands/prompts/saas-implement-landing-page.md → skills/saas-implement-landing-page/SKILL.md} +1 -0
- package/agents-config/{commands/prompts/setup-tmux.md → skills/setup-tmux/SKILL.md} +5 -0
- package/agents-config/{commands/prompts/tools.md → skills/tools/SKILL.md} +1 -0
- package/agents-config/skills/ultrathink/SKILL.md +1 -1
- package/agents-config/skills/use-style/SKILL.md +7 -4
- package/agents-config/skills/use-style/examples/luma.html +221 -0
- package/agents-config/skills/use-style/examples/testspirite.html +340 -0
- package/agents-config/skills/use-style/styles/ios-app.md +350 -0
- package/agents-config/skills/use-style/styles/luma.md +422 -0
- package/agents-config/skills/use-style/styles/new-york-times.md +1 -1
- package/agents-config/skills/use-style/styles/split-auth.md +2 -2
- package/agents-config/skills/use-style/styles/testspirite.md +397 -0
- package/dist/cli.js +17 -80
- package/package.json +1 -1
- 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
|
-
|
|
34984
|
-
|
|
34985
|
-
|
|
34986
|
-
|
|
34987
|
-
|
|
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
|
|
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
|
-
|
|
35045
|
-
|
|
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 =
|
|
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 = ["
|
|
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
|
|
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,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>
|