get-shit-pretty 0.6.2 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -12
- package/bin/install.js +125 -84
- package/gsp/agents/gsp-accessibility-auditor.md +4 -4
- package/gsp/agents/gsp-ascii-artist.md +2 -2
- package/gsp/agents/gsp-brand-auditor.md +3 -3
- package/gsp/agents/gsp-brand-engineer.md +131 -0
- package/gsp/agents/gsp-brand-strategist.md +3 -3
- package/gsp/agents/gsp-brand-syncer.md +8 -7
- package/gsp/agents/gsp-builder.md +49 -6
- package/gsp/agents/gsp-campaign-director.md +3 -4
- package/gsp/agents/gsp-creative-director.md +80 -0
- package/gsp/agents/gsp-critic.md +100 -18
- package/gsp/agents/gsp-designer.md +52 -5
- package/gsp/agents/gsp-project-researcher.md +4 -4
- package/gsp/agents/gsp-researcher.md +5 -5
- package/gsp/agents/gsp-reviewer.md +3 -3
- package/gsp/agents/gsp-scoper.md +3 -3
- package/gsp/hooks/hooks.json +5 -5
- package/gsp/skills/get-shit-pretty/SKILL.md +10 -9
- package/gsp/skills/gsp-accessibility/SKILL.md +12 -12
- package/gsp/skills/gsp-accessibility-audit/SKILL.md +8 -9
- package/gsp/skills/gsp-add-reference/SKILL.md +6 -1
- package/gsp/skills/gsp-art/SKILL.md +6 -1
- package/gsp/skills/gsp-brand-audit/SKILL.md +5 -5
- package/gsp/skills/gsp-brand-guidelines/SKILL.md +233 -0
- package/gsp/skills/gsp-brand-guidelines/token-mapping.md +329 -0
- package/gsp/skills/gsp-brand-identity/SKILL.md +29 -20
- package/gsp/skills/gsp-brand-refine/SKILL.md +30 -23
- package/gsp/skills/gsp-brand-research/SKILL.md +4 -4
- package/gsp/{references → skills/gsp-brand-research}/design-trends.md +4 -4
- package/gsp/skills/gsp-brand-strategy/SKILL.md +7 -7
- package/gsp/skills/gsp-brand-sync/SKILL.md +10 -10
- package/gsp/skills/gsp-brand-sync/chunk-format.md +79 -0
- package/gsp/skills/gsp-color/SKILL.md +73 -0
- package/gsp/skills/gsp-color/chunk-format.md +79 -0
- package/gsp/skills/{gsp-palette/SKILL.md → gsp-color/domains/palette.md} +31 -101
- package/gsp/skills/gsp-color/domains/system.md +123 -0
- package/gsp/skills/gsp-design-system/SKILL.md +9 -4
- package/gsp/skills/gsp-doctor/SKILL.md +25 -18
- package/gsp/skills/gsp-help/SKILL.md +30 -29
- package/gsp/skills/gsp-icons/SKILL.md +108 -0
- package/gsp/skills/gsp-icons/chunk-format.md +79 -0
- package/gsp/skills/gsp-launch/SKILL.md +3 -4
- package/gsp/skills/gsp-logo/SKILL.md +173 -0
- package/gsp/skills/gsp-logo/chunk-format.md +79 -0
- package/gsp/skills/gsp-phase-transition/SKILL.md +124 -0
- package/gsp/skills/gsp-pretty/SKILL.md +2 -2
- package/gsp/skills/gsp-progress/SKILL.md +20 -20
- package/gsp/skills/gsp-project-brief/SKILL.md +8 -9
- package/gsp/skills/gsp-project-build/SKILL.md +30 -25
- package/gsp/skills/gsp-project-critique/SKILL.md +17 -18
- package/gsp/{references → skills/gsp-project-critique}/visual-taste.md +1 -1
- package/gsp/skills/gsp-project-design/SKILL.md +18 -18
- package/gsp/skills/gsp-project-research/SKILL.md +6 -7
- package/gsp/skills/gsp-project-review/SKILL.md +8 -10
- package/gsp/skills/gsp-scaffold/SKILL.md +3 -3
- package/gsp/skills/gsp-start/SKILL.md +15 -15
- package/gsp/{references → skills/gsp-start}/questioning.md +1 -1
- package/gsp/skills/gsp-style/SKILL.md +43 -45
- package/gsp/skills/gsp-style/chunk-format.md +79 -0
- package/gsp/skills/gsp-style/style-preset-schema.md +124 -0
- package/gsp/skills/gsp-style/styles/INDEX.yml +1 -1
- package/gsp/skills/gsp-style/styles/academia.yml +80 -0
- package/gsp/skills/gsp-style/styles/art-deco.yml +81 -0
- package/gsp/skills/gsp-style/styles/bauhaus.yml +78 -0
- package/gsp/skills/gsp-style/styles/bold-typography.yml +73 -0
- package/gsp/skills/gsp-style/styles/botanical.yml +78 -0
- package/gsp/skills/gsp-style/styles/claymorphism.yml +84 -0
- package/gsp/skills/gsp-style/styles/cyberpunk.yml +87 -0
- package/gsp/skills/gsp-style/styles/enterprise.yml +81 -0
- package/gsp/skills/gsp-style/styles/flat-design.yml +67 -0
- package/gsp/skills/gsp-style/styles/fluent.yml +82 -0
- package/gsp/skills/gsp-style/styles/glassmorphism.yml +83 -0
- package/gsp/skills/gsp-style/styles/humanist-literary.yml +74 -0
- package/gsp/skills/gsp-style/styles/industrial.yml +82 -0
- package/gsp/skills/gsp-style/styles/kinetic.yml +94 -0
- package/gsp/skills/gsp-style/styles/liquid-glass.yml +91 -0
- package/gsp/skills/gsp-style/styles/luxury.yml +83 -0
- package/gsp/skills/gsp-style/styles/material.yml +83 -0
- package/gsp/skills/gsp-style/styles/maximalism.yml +92 -0
- package/gsp/skills/gsp-style/styles/minimal-dark.yml +75 -0
- package/gsp/skills/gsp-style/styles/modern-dark.yml +88 -0
- package/gsp/skills/gsp-style/styles/monochrome.yml +68 -0
- package/gsp/skills/gsp-style/styles/neubrutalism.yml +83 -0
- package/gsp/skills/gsp-style/styles/neumorphism.yml +77 -0
- package/gsp/skills/gsp-style/styles/newsprint.yml +81 -0
- package/gsp/skills/gsp-style/styles/organic.yml +77 -0
- package/gsp/skills/gsp-style/styles/playful-geometric.yml +90 -0
- package/gsp/skills/gsp-style/styles/professional.yml +67 -0
- package/gsp/skills/gsp-style/styles/retro.yml +85 -0
- package/gsp/skills/gsp-style/styles/saas.yml +83 -0
- package/gsp/skills/gsp-style/styles/sketch.yml +86 -0
- package/gsp/skills/gsp-style/styles/swiss-minimalist.yml +69 -0
- package/gsp/skills/gsp-style/styles/terminal.yml +83 -0
- package/gsp/skills/gsp-style/styles/vaporwave.yml +84 -0
- package/gsp/skills/gsp-style/styles/web3.yml +82 -0
- package/gsp/skills/gsp-typography/SKILL.md +70 -0
- package/gsp/skills/gsp-typography/chunk-format.md +79 -0
- package/gsp/skills/gsp-typography/domains/pairing.md +109 -0
- package/gsp/skills/gsp-typography/domains/scale.md +227 -0
- package/gsp/skills/gsp-typography/domains/system.md +108 -0
- package/gsp/skills/gsp-update/SKILL.md +1 -2
- package/gsp/skills/gsp-visuals/SKILL.md +82 -0
- package/gsp/skills/gsp-visuals/chunk-format.md +79 -0
- package/gsp/skills/gsp-visuals/domains/3d.md +127 -0
- package/gsp/skills/gsp-visuals/domains/imagery.md +145 -0
- package/gsp/skills/gsp-visuals/domains/textures.md +138 -0
- package/gsp/skills/gsp-visuals/domains/video.md +107 -0
- package/gsp/templates/branding/config.json +1 -1
- package/gsp/templates/branding/roadmap.md +9 -9
- package/gsp/templates/exports-index.md +8 -8
- package/gsp/templates/phases/brief.md +1 -1
- package/gsp/templates/phases/build.md +1 -1
- package/gsp/templates/phases/critique.md +1 -1
- package/gsp/templates/phases/design.md +2 -2
- package/gsp/templates/phases/discover.md +1 -1
- package/gsp/templates/phases/identity.md +1 -1
- package/gsp/templates/phases/launch.md +1 -1
- package/gsp/templates/phases/patterns.md +60 -71
- package/gsp/templates/phases/research.md +1 -1
- package/gsp/templates/phases/review.md +1 -1
- package/gsp/templates/phases/strategy.md +1 -1
- package/gsp/templates/phases/style.md +158 -0
- package/gsp/templates/projects/config.json +1 -1
- package/gsp/templates/projects/roadmap.md +7 -7
- package/gsp/templates/projects/state.md +1 -1
- package/package.json +1 -2
- package/.claude-plugin/plugin.json +0 -24
- package/gsp/agents/gsp-identity-designer.md +0 -74
- package/gsp/agents/gsp-pattern-architect.md +0 -189
- package/gsp/prompts/01-design-system-architect.md +0 -19
- package/gsp/prompts/02-brand-identity-creator.md +0 -16
- package/gsp/prompts/03-ui-ux-pattern-master.md +0 -21
- package/gsp/prompts/04-marketing-asset-factory.md +0 -14
- package/gsp/prompts/05-implementation-spec-expert.md +0 -15
- package/gsp/prompts/06-design-critique-partner.md +0 -14
- package/gsp/prompts/07-design-trend-synthesizer.md +0 -3
- package/gsp/prompts/08-accessibility-auditor.md +0 -23
- package/gsp/prompts/09-design-to-code-translator.md +0 -49
- package/gsp/prompts/10-project-scoper.md +0 -17
- package/gsp/prompts/11-deliverable-reviewer.md +0 -18
- package/gsp/prompts/12-project-researcher.md +0 -18
- package/gsp/references/phase-transitions.md +0 -132
- package/gsp/references/style-preset-schema.md +0 -63
- package/gsp/skills/gsp-brand-patterns/SKILL.md +0 -240
- package/gsp/skills/gsp-typescale/SKILL.md +0 -234
- /package/gsp/{references → skills/gsp-accessibility-audit}/wcag-checklist.md +0 -0
- /package/gsp/{references → skills/gsp-art}/terminal-art.md +0 -0
- /package/gsp/{references → skills/gsp-brand-audit}/chunk-format.md +0 -0
- /package/gsp/{references → skills/gsp-brand-guidelines}/design-tokens.md +0 -0
- /package/gsp/{references → skills/gsp-brand-strategy}/brand-archetypes.md +0 -0
- /package/gsp/{references → skills/gsp-brand-strategy}/brand-prism.md +0 -0
- /package/gsp/{references → skills/gsp-brand-strategy}/positioning-frameworks.md +0 -0
- /package/gsp/{references → skills/gsp-brand-strategy}/voice-tone.md +0 -0
- /package/gsp/{references → skills/gsp-color/references}/color-composition.md +0 -0
- /package/gsp/{references → skills/gsp-project-build}/visual-effects.md +0 -0
- /package/gsp/{references → skills/gsp-project-critique}/anti-patterns.md +0 -0
- /package/gsp/{references → skills/gsp-project-critique}/nielsen-heuristics.md +0 -0
- /package/gsp/{references → skills/gsp-project-design}/apple-hig-patterns.md +0 -0
- /package/gsp/{references → skills/gsp-project-design}/block-patterns.md +0 -0
- /package/gsp/{references → skills/gsp-typography/references}/typography-scales.md +0 -0
|
@@ -1,85 +1,37 @@
|
|
|
1
|
-
|
|
2
|
-
name: palette
|
|
3
|
-
description: Generate OKLCH color palettes — standalone or as a building block for identity
|
|
4
|
-
user-invocable: true
|
|
5
|
-
model: sonnet
|
|
6
|
-
allowed-tools:
|
|
7
|
-
- Read
|
|
8
|
-
- Write
|
|
9
|
-
- Bash
|
|
10
|
-
- AskUserQuestion
|
|
11
|
-
- WebFetch
|
|
12
|
-
---
|
|
13
|
-
<context>
|
|
14
|
-
You are a GSP palette generator. You produce OKLCH 11-stop color scales from input hex colors using the tints.dev API. Downstream agents (identity-designer, system-architect, builder) consume the output files.
|
|
15
|
-
|
|
16
|
-
This is a standalone composable skill. It works two ways:
|
|
17
|
-
1. **Standalone** — user runs `/gsp:palette #FF5733 #3366FF` directly, gets palettes
|
|
18
|
-
2. **As a building block** — identity phase detects existing palette files and reuses them
|
|
19
|
-
</context>
|
|
20
|
-
|
|
21
|
-
<objective>
|
|
22
|
-
Generate production-ready OKLCH color palettes from hex colors.
|
|
23
|
-
|
|
24
|
-
**Input:** Hex color(s), optional flags (`--preview`)
|
|
25
|
-
**Output:** `palettes.json` + `color-system.md` foundation chunk in the target directory
|
|
26
|
-
**Agent:** None — deterministic API calls, handled inline
|
|
27
|
-
</objective>
|
|
1
|
+
# Palette Generation
|
|
28
2
|
|
|
29
|
-
|
|
30
|
-
@${CLAUDE_SKILL_DIR}/../../references/chunk-format.md
|
|
31
|
-
</execution_context>
|
|
3
|
+
Domain expertise for OKLCH palette generation from hex colors.
|
|
32
4
|
|
|
33
|
-
|
|
34
|
-
- Always use `AskUserQuestion` for user interaction — never prompt via plain text
|
|
35
|
-
- One decision per question — never batch multiple questions in a single message
|
|
36
|
-
- Palettes are deterministic — same hex input always produces the same OKLCH scales
|
|
37
|
-
- Foundation chunks follow `references/chunk-format.md` format exactly
|
|
38
|
-
- Every palette gets the full 11-stop scale: 50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 950
|
|
39
|
-
- Minimum colors: primary. Secondary and accent are recommended but optional
|
|
40
|
-
- Color names must be semantic (primary, secondary, accent, neutral) not literal (red, blue)
|
|
41
|
-
</rules>
|
|
42
|
-
|
|
43
|
-
<process>
|
|
44
|
-
## Step 0: Parse invocation
|
|
5
|
+
---
|
|
45
6
|
|
|
46
|
-
|
|
7
|
+
## Modes
|
|
47
8
|
|
|
48
9
|
| Input | Mode |
|
|
49
10
|
|-------|------|
|
|
50
|
-
|
|
|
51
|
-
|
|
|
52
|
-
| `/gsp:palette` | Interactive — ask for colors |
|
|
11
|
+
| `#hex [#hex...]` | Direct — parse hex values, assign roles in order |
|
|
12
|
+
| `#hex [#hex...] --preview` | Preview — show scales without writing files |
|
|
53
13
|
|
|
54
|
-
##
|
|
14
|
+
## Color role assignment
|
|
55
15
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
Parse hex values from the invocation. Assign semantic roles in order:
|
|
16
|
+
Parse hex values from invocation and assign semantic roles in order:
|
|
59
17
|
1. First color → **primary**
|
|
60
18
|
2. Second color → **secondary**
|
|
61
19
|
3. Third color → **accent**
|
|
62
20
|
4. Additional colors → **custom-{n}**
|
|
63
21
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
Use `AskUserQuestion` to collect colors:
|
|
22
|
+
Minimum colors: primary. Secondary and accent are recommended but optional.
|
|
67
23
|
|
|
68
|
-
|
|
24
|
+
Color names must be semantic (primary, secondary, accent, neutral) — not literal (red, blue).
|
|
69
25
|
|
|
70
|
-
|
|
71
|
-
- **Add secondary** — "I have a secondary color"
|
|
72
|
-
- **Add accent** — "I have an accent color"
|
|
73
|
-
- **Generate complements** — "suggest secondary/accent from my primary"
|
|
74
|
-
- **Just primary** — "that's enough, generate from one color"
|
|
26
|
+
## Complement generation
|
|
75
27
|
|
|
76
|
-
|
|
77
|
-
- Secondary
|
|
78
|
-
- Accent
|
|
28
|
+
When the user has only a primary and wants suggestions:
|
|
29
|
+
- **Secondary:** rotate hue by 180 degrees (complement)
|
|
30
|
+
- **Accent:** rotate hue by 30 degrees (analogous)
|
|
79
31
|
|
|
80
|
-
Present the generated suggestions and let the user confirm or adjust
|
|
32
|
+
Present the generated suggestions and let the user confirm or adjust via `AskUserQuestion`.
|
|
81
33
|
|
|
82
|
-
##
|
|
34
|
+
## OKLCH scale generation via tints.dev API
|
|
83
35
|
|
|
84
36
|
For each color, call the tints.dev API:
|
|
85
37
|
|
|
@@ -93,14 +45,16 @@ Where:
|
|
|
93
45
|
|
|
94
46
|
The API returns an 11-stop OKLCH scale (50-950) with L, C, H values for each stop.
|
|
95
47
|
|
|
96
|
-
|
|
48
|
+
Every palette gets the full 11-stop scale: 50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 950.
|
|
97
49
|
|
|
98
|
-
|
|
50
|
+
Palettes are deterministic — same hex input always produces the same OKLCH scales.
|
|
99
51
|
|
|
100
|
-
|
|
52
|
+
## Preview mode (`--preview`)
|
|
53
|
+
|
|
54
|
+
Display scales without writing files:
|
|
101
55
|
|
|
102
56
|
```
|
|
103
|
-
/gsp
|
|
57
|
+
/gsp-color preview
|
|
104
58
|
═══════════════════════════════════════
|
|
105
59
|
|
|
106
60
|
primary (#FF5733)
|
|
@@ -120,14 +74,12 @@ If `--preview`, display the scales without writing files:
|
|
|
120
74
|
...
|
|
121
75
|
|
|
122
76
|
─────────────────────────────────────
|
|
123
|
-
Run /gsp
|
|
77
|
+
Run /gsp-color #FF5733 #3366FF to write files.
|
|
124
78
|
```
|
|
125
79
|
|
|
126
80
|
Stop here. Do not write any files.
|
|
127
81
|
|
|
128
|
-
##
|
|
129
|
-
|
|
130
|
-
Determine where to write the palette output:
|
|
82
|
+
## Output path resolution
|
|
131
83
|
|
|
132
84
|
### Within a brand identity
|
|
133
85
|
If a brand context exists (`.design/branding/{brand}/`):
|
|
@@ -138,15 +90,13 @@ If a brand context exists (`.design/branding/{brand}/`):
|
|
|
138
90
|
- Write to `.design/branding/_palette/`
|
|
139
91
|
- Create minimal directory structure
|
|
140
92
|
|
|
141
|
-
##
|
|
93
|
+
## palettes.json format
|
|
142
94
|
|
|
143
|
-
If `{OUTPUT_PATH}/palettes.json` already exists, use `AskUserQuestion`: "palettes.json already exists — overwrite with new palette?" with options **Overwrite** and **Cancel**. If cancelled, skip writing
|
|
144
|
-
|
|
145
|
-
Write `{OUTPUT_PATH}/palettes.json` with the full OKLCH scales:
|
|
95
|
+
If `{OUTPUT_PATH}/palettes.json` already exists, use `AskUserQuestion`: "palettes.json already exists — overwrite with new palette?" with options **Overwrite** and **Cancel**. If cancelled, skip writing.
|
|
146
96
|
|
|
147
97
|
```json
|
|
148
98
|
{
|
|
149
|
-
"$description": "OKLCH 11-stop color palettes generated by /gsp
|
|
99
|
+
"$description": "OKLCH 11-stop color palettes generated by /gsp-color",
|
|
150
100
|
"$source": "tints.dev",
|
|
151
101
|
"primary": {
|
|
152
102
|
"source": "#FF5733",
|
|
@@ -167,9 +117,9 @@ Write `{OUTPUT_PATH}/palettes.json` with the full OKLCH scales:
|
|
|
167
117
|
}
|
|
168
118
|
```
|
|
169
119
|
|
|
170
|
-
##
|
|
120
|
+
## color-system.md format (palette-only)
|
|
171
121
|
|
|
172
|
-
Write `{OUTPUT_PATH}/color-system.md` as a foundation chunk per
|
|
122
|
+
Write `{OUTPUT_PATH}/color-system.md` as a foundation chunk per chunk-format.md:
|
|
173
123
|
|
|
174
124
|
```markdown
|
|
175
125
|
# Color System
|
|
@@ -222,16 +172,6 @@ Write `{OUTPUT_PATH}/color-system.md` as a foundation chunk per `references/chun
|
|
|
222
172
|
| primary-900 (text) | primary-100 | Invert for readability |
|
|
223
173
|
| secondary-500 | secondary-400 | Same shift as primary |
|
|
224
174
|
|
|
225
|
-
## Semantic Assignments
|
|
226
|
-
|
|
227
|
-
| Token | Light value | Dark value |
|
|
228
|
-
|-------|-------------|------------|
|
|
229
|
-
| --color-brand | primary-500 | primary-400 |
|
|
230
|
-
| --color-brand-hover | primary-600 | primary-300 |
|
|
231
|
-
| --color-surface | primary-50 | primary-950 |
|
|
232
|
-
| --color-text | primary-900 | primary-50 |
|
|
233
|
-
| --color-accent | accent-500 | accent-400 |
|
|
234
|
-
|
|
235
175
|
---
|
|
236
176
|
|
|
237
177
|
## Related
|
|
@@ -240,12 +180,10 @@ Write `{OUTPUT_PATH}/color-system.md` as a foundation chunk per `references/chun
|
|
|
240
180
|
- [typography.md](./typography.md)
|
|
241
181
|
```
|
|
242
182
|
|
|
243
|
-
##
|
|
244
|
-
|
|
245
|
-
Display the result:
|
|
183
|
+
## Completion output
|
|
246
184
|
|
|
247
185
|
```
|
|
248
|
-
/gsp
|
|
186
|
+
/gsp-color — {n} colors scaled
|
|
249
187
|
═══════════════════════════════════════
|
|
250
188
|
|
|
251
189
|
{OUTPUT_PATH}/
|
|
@@ -257,11 +195,3 @@ Display the result:
|
|
|
257
195
|
|
|
258
196
|
─────────────────────────────────────
|
|
259
197
|
```
|
|
260
|
-
|
|
261
|
-
Then use `AskUserQuestion` with routing options:
|
|
262
|
-
|
|
263
|
-
- **Generate type scale** — "pair these palettes with typography" → route to `/gsp:typescale`
|
|
264
|
-
- **Apply a full style** — "use a style preset for the complete system" → route to `/gsp:style`
|
|
265
|
-
- **Continue to identity** — "use these palettes in the branding diamond" → route to `/gsp:brand-identity`
|
|
266
|
-
- **Done** — "that's all for now"
|
|
267
|
-
</process>
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
# Color System
|
|
2
|
+
|
|
3
|
+
Domain expertise for full color system design — creative rationale, contrast validation, semantic mapping, dark mode.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Modes
|
|
8
|
+
|
|
9
|
+
| Input | Mode |
|
|
10
|
+
|-------|------|
|
|
11
|
+
| `--enrich` | Enrich existing color-system.md with technical precision |
|
|
12
|
+
| *(no args)* | Interactive — explore and build a color system from scratch |
|
|
13
|
+
|
|
14
|
+
## Enrich mode (`--enrich`)
|
|
15
|
+
|
|
16
|
+
Read existing `{BRAND_PATH}/identity/color-system.md`. Extract chosen hex values and rationale.
|
|
17
|
+
|
|
18
|
+
Read `references/color-composition.md` via `${CLAUDE_SKILL_DIR}/references/color-composition.md` for domain expertise on composition strategies.
|
|
19
|
+
|
|
20
|
+
Enrich the file with:
|
|
21
|
+
- OKLCH 11-stop scales via tints.dev API: `https://www.tints.dev/api/{colorName}/{hexWithoutHash}`
|
|
22
|
+
- WCAG AA contrast ratios for every semantic foreground/background pair
|
|
23
|
+
- Semantic color mapping (error, success, warning, info)
|
|
24
|
+
- Dark mode color mapping with equivalent contrast
|
|
25
|
+
- Write `palettes.json` alongside color-system.md
|
|
26
|
+
|
|
27
|
+
Overwrite `color-system.md` with enriched version. Preserve the creative rationale — add technical data around it.
|
|
28
|
+
|
|
29
|
+
## Interactive mode (no args)
|
|
30
|
+
|
|
31
|
+
One `AskUserQuestion` at a time:
|
|
32
|
+
|
|
33
|
+
1. **Starting point** — use `AskUserQuestion`:
|
|
34
|
+
- **I have hex values** — "I know my brand colors"
|
|
35
|
+
- **From a style preset** — "Start from a GSP preset palette"
|
|
36
|
+
- **Explore** — "Help me find the right palette"
|
|
37
|
+
2. If exploring: ask about mood (warm/cool/neutral), energy (vibrant/muted/earthy), context (tech/health/luxury/etc.)
|
|
38
|
+
3. Propose a palette with primary + secondary + accent + neutral, show hex swatches
|
|
39
|
+
4. Confirm or iterate
|
|
40
|
+
|
|
41
|
+
After colors are confirmed, build the full system (contrast, semantics, dark mode).
|
|
42
|
+
|
|
43
|
+
## WCAG AA contrast validation
|
|
44
|
+
|
|
45
|
+
Calculate contrast for every text/background pair:
|
|
46
|
+
- Normal text: 4.5:1 minimum
|
|
47
|
+
- Large text (18px+ or 14px+ bold): 3:1 minimum
|
|
48
|
+
- Flag failures with suggested alternatives from the palette scale
|
|
49
|
+
|
|
50
|
+
Test these combinations:
|
|
51
|
+
- Each semantic color on white (#fff) and black (#000)
|
|
52
|
+
- Primary text on secondary backgrounds and vice versa
|
|
53
|
+
- All foreground/background pairs used in semantic assignments
|
|
54
|
+
|
|
55
|
+
## Semantic color mapping
|
|
56
|
+
|
|
57
|
+
Map brand colors to semantic roles:
|
|
58
|
+
- **Primary** → CTAs, primary buttons, links
|
|
59
|
+
- **Secondary** → supporting UI, secondary surfaces
|
|
60
|
+
- **Accent** → highlights, badges, decorative
|
|
61
|
+
|
|
62
|
+
Define standard semantic colors:
|
|
63
|
+
- **Error** — red-family, distinct from brand palette
|
|
64
|
+
- **Success** — green-family
|
|
65
|
+
- **Warning** — amber/yellow-family
|
|
66
|
+
- **Info** — blue-family (or brand secondary if blue-adjacent)
|
|
67
|
+
|
|
68
|
+
Each semantic color needs its own 11-stop scale or at minimum light/default/dark stops.
|
|
69
|
+
|
|
70
|
+
## Dark mode mapping
|
|
71
|
+
|
|
72
|
+
Maintain equivalent contrast relationships:
|
|
73
|
+
|
|
74
|
+
| Light mode | Dark mode | Rationale |
|
|
75
|
+
|------------|-----------|-----------|
|
|
76
|
+
| primary-500 (buttons) | primary-400 | Lighter for dark bg contrast |
|
|
77
|
+
| primary-50 (bg tint) | primary-950 | Invert the tint |
|
|
78
|
+
| primary-900 (text) | primary-100 | Invert for readability |
|
|
79
|
+
| secondary-500 | secondary-400 | Same shift as primary |
|
|
80
|
+
| neutral-50 (page bg) | neutral-950 | Full inversion |
|
|
81
|
+
| neutral-900 (body text) | neutral-100 | Full inversion |
|
|
82
|
+
|
|
83
|
+
## Output structure
|
|
84
|
+
|
|
85
|
+
Write to the resolved output path:
|
|
86
|
+
|
|
87
|
+
### color-system.md
|
|
88
|
+
|
|
89
|
+
Full color system chunk (~100-150 lines) per chunk-format.md including:
|
|
90
|
+
- Source colors table
|
|
91
|
+
- Palette scales (all 11 stops per color)
|
|
92
|
+
- Contrast audit results (pass/fail per pair)
|
|
93
|
+
- Semantic color assignments (light + dark values)
|
|
94
|
+
- Dark mode mapping table
|
|
95
|
+
- Composition strategy recommendation (referencing color-composition.md strategies)
|
|
96
|
+
|
|
97
|
+
### palettes.json
|
|
98
|
+
|
|
99
|
+
Full OKLCH scales in structured JSON (same format as palette domain).
|
|
100
|
+
|
|
101
|
+
### Semantic assignments template
|
|
102
|
+
|
|
103
|
+
```
|
|
104
|
+
| Token | Light value | Dark value |
|
|
105
|
+
|-------|-------------|------------|
|
|
106
|
+
| --color-brand | primary-500 | primary-400 |
|
|
107
|
+
| --color-brand-hover | primary-600 | primary-300 |
|
|
108
|
+
| --color-surface | primary-50 | primary-950 |
|
|
109
|
+
| --color-text | primary-900 | primary-50 |
|
|
110
|
+
| --color-accent | accent-500 | accent-400 |
|
|
111
|
+
| --color-error | error-500 | error-400 |
|
|
112
|
+
| --color-success | success-500 | success-400 |
|
|
113
|
+
| --color-warning | warning-500 | warning-400 |
|
|
114
|
+
| --color-info | info-500 | info-400 |
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
## Completion
|
|
118
|
+
|
|
119
|
+
Display palette summary with contrast status. Offer next steps via `AskUserQuestion`:
|
|
120
|
+
- **Generate type scale** — route to `/gsp-typography`
|
|
121
|
+
- **Apply a full style** — route to `/gsp-style`
|
|
122
|
+
- **Continue to identity** — route to `/gsp-brand-identity`
|
|
123
|
+
- **Done** — "that's all for now"
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
name: design-system
|
|
2
|
+
name: gsp-design-system
|
|
3
3
|
description: Scan and document the existing design system state
|
|
4
4
|
user-invocable: true
|
|
5
5
|
model: sonnet
|
|
@@ -15,8 +15,8 @@ allowed-tools:
|
|
|
15
15
|
Composable skill that scans the workspace codebase and documents the existing design system state. Produces focused documents that downstream skills and agents consume selectively.
|
|
16
16
|
|
|
17
17
|
Works two ways:
|
|
18
|
-
1. **Standalone** — user runs `/gsp
|
|
19
|
-
2. **Building block** — `/gsp
|
|
18
|
+
1. **Standalone** — user runs `/gsp-design-system` for a quick workspace audit
|
|
19
|
+
2. **Building block** — `/gsp-start` invokes this in the background during project setup
|
|
20
20
|
|
|
21
21
|
Output is workspace-level (not project-scoped), so it's shared across all projects and only needs to run once per codebase state change. Re-runnable — overwrites previous output.
|
|
22
22
|
</context>
|
|
@@ -35,6 +35,11 @@ Scan the codebase and produce five focused design system documents.
|
|
|
35
35
|
@${CLAUDE_SKILL_DIR}/../../templates/system/CONCERNS.md
|
|
36
36
|
</execution_context>
|
|
37
37
|
|
|
38
|
+
<rules>
|
|
39
|
+
- Always use `AskUserQuestion` for user interaction — never prompt via plain text
|
|
40
|
+
- One decision per question — never batch multiple questions in a single message
|
|
41
|
+
</rules>
|
|
42
|
+
|
|
38
43
|
<process>
|
|
39
44
|
## Step 0: Prepare output directory
|
|
40
45
|
|
|
@@ -136,7 +141,7 @@ Each concern includes: file paths, severity (high/medium/low), and fix approach.
|
|
|
136
141
|
Display a summary box:
|
|
137
142
|
|
|
138
143
|
```
|
|
139
|
-
/gsp
|
|
144
|
+
/gsp- design-system scan complete
|
|
140
145
|
|
|
141
146
|
┌──────────────────────────────────────────┐
|
|
142
147
|
│ type {classification} │
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
name: doctor
|
|
2
|
+
name: gsp-doctor
|
|
3
3
|
description: Check project health
|
|
4
4
|
user-invocable: true
|
|
5
5
|
model: sonnet
|
|
@@ -27,7 +27,7 @@ Check for `.design/` in the current directory.
|
|
|
27
27
|
If not found:
|
|
28
28
|
```
|
|
29
29
|
🩺 GSP Doctor — No project found
|
|
30
|
-
No .design/ directory detected. Run /gsp
|
|
30
|
+
No .design/ directory detected. Run /gsp-start to start.
|
|
31
31
|
```
|
|
32
32
|
Stop here.
|
|
33
33
|
|
|
@@ -68,12 +68,12 @@ If all 4 phases complete, check:
|
|
|
68
68
|
- `identity/INDEX.md` exists (chunk format)
|
|
69
69
|
- `identity/palettes.json` exists (WARN if missing)
|
|
70
70
|
- `patterns/INDEX.md` exists (chunk format)
|
|
71
|
-
- `patterns
|
|
71
|
+
- `patterns/*.yml` preset exists (WARN if missing)
|
|
72
72
|
- If monolith exists without INDEX.md → WARN: "Legacy monolith format"
|
|
73
73
|
|
|
74
74
|
**Check B4: Legacy Monolith Detection**
|
|
75
75
|
For each brand phase directory (discover, strategy, identity, patterns):
|
|
76
|
-
- If monolith exists but no INDEX.md → WARN: "Monolith files are no longer supported in GSP v0.6.0+. Re-run `/gsp
|
|
76
|
+
- If monolith exists but no INDEX.md → WARN: "Monolith files are no longer supported in GSP v0.6.0+. Re-run `/gsp-brand-{phase}` to generate chunk output."
|
|
77
77
|
|
|
78
78
|
### Per-Project Checks (6-phase)
|
|
79
79
|
|
|
@@ -86,12 +86,12 @@ Required dirs: brief/, research/, design/, critique/, build/, review/
|
|
|
86
86
|
|
|
87
87
|
Check each exists:
|
|
88
88
|
- All present → PASS
|
|
89
|
-
- Core files missing → FAIL: list which are missing, suggest `/gsp
|
|
89
|
+
- Core files missing → FAIL: list which are missing, suggest `/gsp-start`
|
|
90
90
|
|
|
91
91
|
**Design system check:**
|
|
92
92
|
- If `.design/system/` directory exists, verify at least `STACK.md` is present → PASS
|
|
93
|
-
- If `.design/system/` is missing and codebase is not greenfield → WARN: "Design system scan missing. Run `/gsp
|
|
94
|
-
- If old project-scoped `codebase/INVENTORY.md` exists → WARN: "Legacy INVENTORY.md found. Run `/gsp
|
|
93
|
+
- If `.design/system/` is missing and codebase is not greenfield → WARN: "Design system scan missing. Run `/gsp-design-system` to scan."
|
|
94
|
+
- If old project-scoped `codebase/INVENTORY.md` exists → WARN: "Legacy INVENTORY.md found. Run `/gsp-design-system` to migrate to workspace-level design system docs."
|
|
95
95
|
|
|
96
96
|
Legacy detection: if system/, screens/, specs/, plan/ dirs exist → WARN: "Legacy structure detected — project uses old phase layout"
|
|
97
97
|
|
|
@@ -103,7 +103,7 @@ WARN if brand referenced but system not complete
|
|
|
103
103
|
**Check P3: Brand Drift**
|
|
104
104
|
Read `identity_hash` from brand.ref
|
|
105
105
|
If brand identity/IDENTITY.md exists, compute current hash (first 8 chars of md5)
|
|
106
|
-
If hashes differ → WARN: "Brand identity has changed since project consumed it. Consider re-running `/gsp
|
|
106
|
+
If hashes differ → WARN: "Brand identity has changed since project consumed it. Consider re-running `/gsp-project-brief`."
|
|
107
107
|
If identity_hash is "pending" → INFO: "Brand identity wasn't complete when project was created."
|
|
108
108
|
|
|
109
109
|
**Check P4: Phase Ordering**
|
|
@@ -117,7 +117,7 @@ brief < research < design < critique < build < review
|
|
|
117
117
|
2. Valid skip scenarios (not violations):
|
|
118
118
|
- design skipped when `design_scope` is `tokens`
|
|
119
119
|
- research can proceed without brief
|
|
120
|
-
3. build complete but critique pending → WARN: "Build completed without critique. Run `/gsp
|
|
120
|
+
3. build complete but critique pending → WARN: "Build completed without critique. Run `/gsp-project-critique` to audit."
|
|
121
121
|
4. Any other out-of-order completion → FAIL with specifics
|
|
122
122
|
|
|
123
123
|
All phases in order (or validly skipped) → PASS
|
|
@@ -130,7 +130,7 @@ Only check phases that are `complete`. All paths relative to the project instanc
|
|
|
130
130
|
|
|
131
131
|
**When `system_strategy` is `extend`:**
|
|
132
132
|
- Check if brand's `patterns/` output contains "Component Audit" or "KEEP" or "RESTYLE" or "REFACTOR" or "REPLACE"
|
|
133
|
-
- If none found → WARN: "Strategy is `extend` but system output lacks component audit table. Re-run `/gsp
|
|
133
|
+
- If none found → WARN: "Strategy is `extend` but system output lacks component audit table. Re-run `/gsp-brand-guidelines`."
|
|
134
134
|
|
|
135
135
|
**When `implementation_target` is `shadcn`:**
|
|
136
136
|
- If brief phase is complete, check brief/ output for "shadcn" or "npx shadcn"
|
|
@@ -169,7 +169,7 @@ No drift detected → PASS
|
|
|
169
169
|
**What it catches:** Chunk directories missing, INDEX.md references broken.
|
|
170
170
|
|
|
171
171
|
For each completed project phase (brief, research, design, critique, build, review):
|
|
172
|
-
- Check for `{phase}/INDEX.md` — if missing → WARN: "Phase {phase} is complete but has no INDEX.md. Re-run `/gsp
|
|
172
|
+
- Check for `{phase}/INDEX.md` — if missing → WARN: "Phase {phase} is complete but has no INDEX.md. Re-run `/gsp-{command}` to generate chunks."
|
|
173
173
|
|
|
174
174
|
**If exports/INDEX.md exists, check for broken references:**
|
|
175
175
|
- Read INDEX.md, extract all file paths from markdown links
|
|
@@ -190,7 +190,7 @@ Legacy path detection: if `screens/` exists instead of `design/` → WARN
|
|
|
190
190
|
**design/ → brand system:**
|
|
191
191
|
If both exist, extract component names referenced in design chunks (look for patterns like "Uses: {ComponentName}" or component references). Check each exists in the brand's system output.
|
|
192
192
|
|
|
193
|
-
Components referenced in designs but not in system → WARN: "Design references components not defined in brand system: {list}. Re-run `/gsp
|
|
193
|
+
Components referenced in designs but not in system → WARN: "Design references components not defined in brand system: {list}. Re-run `/gsp-brand-guidelines` to add them, or update designs."
|
|
194
194
|
|
|
195
195
|
**critique/ → design/:**
|
|
196
196
|
If both exist, extract screen references from critique chunks. Check each referenced screen exists in design/.
|
|
@@ -229,14 +229,14 @@ No review issues → PASS
|
|
|
229
229
|
|
|
230
230
|
**palettes.json check:**
|
|
231
231
|
- If brand's identity phase is complete, check for `identity/palettes.json`
|
|
232
|
-
- If missing → INFO: "No tints.dev palettes found. Re-run `/gsp
|
|
232
|
+
- If missing → INFO: "No tints.dev palettes found. Re-run `/gsp-brand-identity` to generate OKLCH color palettes."
|
|
233
233
|
|
|
234
234
|
No upgrade concerns → PASS
|
|
235
235
|
|
|
236
236
|
### Installation Health Checks
|
|
237
237
|
|
|
238
238
|
**Check I1: Skills have `user-invocable: true`**
|
|
239
|
-
Glob for all SKILL.md files in the skills directory (`{runtime-dir}/skills/*/SKILL.md` — e.g. `.claude/skills/` for Claude Code, `.opencode/skills/` for OpenCode, `.gemini/skills/` for Gemini). For each skill (except the
|
|
239
|
+
Glob for all SKILL.md files in the skills directory (`{runtime-dir}/skills/*/SKILL.md` — e.g. `.claude/skills/` for Claude Code, `.opencode/skills/` for OpenCode, `.gemini/skills/` for Gemini). For each skill (except the entry point `get-shit-pretty`), check frontmatter for `user-invocable: true`.
|
|
240
240
|
- All present → PASS
|
|
241
241
|
- Missing → WARN: "Skills missing `user-invocable: true`: {list}. They won't appear in the slash-command menu. Re-run the installer or add the field manually."
|
|
242
242
|
|
|
@@ -246,7 +246,7 @@ For each gsp-* skill directory, check if `SKILL.md` references sibling files via
|
|
|
246
246
|
- Missing siblings → FAIL: "Skill {name} references {path} but it's missing. Re-run the installer: `npx get-shit-pretty`"
|
|
247
247
|
|
|
248
248
|
**Check I3: Bundle directories accessible**
|
|
249
|
-
Check that the runtime bundle directories exist (`{runtime-dir}/
|
|
249
|
+
Check that the runtime bundle directories exist (`{runtime-dir}/templates/`, `{runtime-dir}/references/`). Skills reference these via `${CLAUDE_SKILL_DIR}/../../`.
|
|
250
250
|
- All present → PASS
|
|
251
251
|
- Missing → FAIL: "Bundle directory {dir} missing. Re-run the installer: `npx get-shit-pretty`"
|
|
252
252
|
|
|
@@ -256,6 +256,12 @@ Check `{runtime-dir}/VERSION` exists and contains a valid semver string.
|
|
|
256
256
|
- Missing → WARN: "VERSION file missing. Re-run the installer."
|
|
257
257
|
- Mismatched with source → INFO: "Installed version {installed} differs from source {source}."
|
|
258
258
|
|
|
259
|
+
**Check I5: No duplicate skills (stale global install)**
|
|
260
|
+
Check if `~/.claude/skills/` contains `gsp-*` directories when running from a local install. These cause duplicates between global and local.
|
|
261
|
+
- Run: `ls ~/.claude/skills/ | grep '^gsp-'`
|
|
262
|
+
- No matches → PASS
|
|
263
|
+
- Matches found → FAIL: "Found {N} stale GSP skills in ~/.claude/skills/. Fix: run `npx get-shit-pretty --claude --local` to reinstall (the installer cleans stale globals automatically), or manually remove: `rm -rf ~/.claude/skills/gsp-*`"
|
|
264
|
+
|
|
259
265
|
### Cross-Instance Checks
|
|
260
266
|
|
|
261
267
|
**Check X1: Multiple projects, same brand**
|
|
@@ -307,6 +313,7 @@ Overall Health: {SCORE}/100 {emoji}
|
|
|
307
313
|
✅ I2. Skill completeness ...... PASS
|
|
308
314
|
✅ I3. Bundle directories ...... PASS
|
|
309
315
|
✅ I4. VERSION file ............ PASS
|
|
316
|
+
✅ I5. No duplicate skills ..... PASS
|
|
310
317
|
|
|
311
318
|
─── Cross-Instance ────────────────────
|
|
312
319
|
✅ X1. Brand Consistency ...... PASS
|
|
@@ -315,15 +322,15 @@ Overall Health: {SCORE}/100 {emoji}
|
|
|
315
322
|
|
|
316
323
|
FAIL:
|
|
317
324
|
• [acme-website/P1] Missing brand.ref
|
|
318
|
-
→ Fix: Re-run /gsp
|
|
325
|
+
→ Fix: Re-run /gsp-start to set up project with brand reference
|
|
319
326
|
|
|
320
327
|
WARN:
|
|
321
328
|
• [acme-corp/B3] No palettes.json found
|
|
322
|
-
→ Fix: Re-run /gsp
|
|
329
|
+
→ Fix: Re-run /gsp-brand-identity to generate OKLCH palettes
|
|
323
330
|
|
|
324
331
|
INFO:
|
|
325
332
|
• [acme-corp/P10] Config version is 0.3.0, current GSP is 0.5.0
|
|
326
|
-
→ Fix: Re-run /gsp
|
|
333
|
+
→ Fix: Re-run /gsp-start to upgrade config
|
|
327
334
|
|
|
328
335
|
─── Summary ───────────────────────────
|
|
329
336
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
name: help
|
|
2
|
+
name: gsp-help
|
|
3
3
|
description: Show all skills
|
|
4
4
|
user-invocable: true
|
|
5
5
|
model: sonnet
|
|
@@ -26,53 +26,54 @@ Output the following as plain text. Use Unicode characters (`───`, `◇`,
|
|
|
26
26
|
Skill names are left-padded with 4 spaces. Descriptions start at column 27 (4 indent + 23 max skill name width).
|
|
27
27
|
|
|
28
28
|
```
|
|
29
|
-
/gsp
|
|
29
|
+
/gsp- ◇◇ v{VERSION}
|
|
30
30
|
skill reference
|
|
31
31
|
|
|
32
32
|
|
|
33
33
|
─── Getting Started ──────────────────
|
|
34
34
|
|
|
35
|
-
/gsp
|
|
36
|
-
/gsp
|
|
37
|
-
/gsp
|
|
35
|
+
/gsp-start start here — picks up where you left off
|
|
36
|
+
/gsp-help this skill reference
|
|
37
|
+
/gsp-progress how pretty are we?
|
|
38
38
|
|
|
39
39
|
─── Branding ─────────────────────────
|
|
40
40
|
|
|
41
|
-
/gsp
|
|
42
|
-
/gsp
|
|
43
|
-
/gsp
|
|
44
|
-
/gsp
|
|
45
|
-
/gsp
|
|
46
|
-
/gsp
|
|
47
|
-
/gsp
|
|
41
|
+
/gsp-brand-research research your market and audience
|
|
42
|
+
/gsp-brand-strategy define positioning, personality, voice and messaging
|
|
43
|
+
/gsp-brand-identity create visual identity
|
|
44
|
+
/gsp-brand-guidelines build design system tokens and components
|
|
45
|
+
/gsp-brand-sync sync brand to match a project's shipped state
|
|
46
|
+
/gsp-brand-refine tweak brand tokens mid-project without re-running identity
|
|
47
|
+
/gsp-brand-audit audit existing brand before evolving (optional)
|
|
48
48
|
|
|
49
49
|
─── Project ──────────────────────────
|
|
50
50
|
|
|
51
|
-
/gsp
|
|
52
|
-
/gsp
|
|
53
|
-
/gsp
|
|
54
|
-
/gsp
|
|
55
|
-
/gsp
|
|
56
|
-
/gsp
|
|
57
|
-
/gsp
|
|
51
|
+
/gsp-project-brief scope what you're building
|
|
52
|
+
/gsp-project-research research UX patterns and approaches
|
|
53
|
+
/gsp-project-design design screens and flows
|
|
54
|
+
/gsp-project-critique critique designs + accessibility audit
|
|
55
|
+
/gsp-project-build implement designs in the codebase
|
|
56
|
+
/gsp-project-review QA validate implementation against designs
|
|
57
|
+
/gsp-add-reference add reference material to a project
|
|
58
58
|
|
|
59
|
-
───
|
|
59
|
+
─── Expertise ───────────────────────
|
|
60
60
|
|
|
61
|
-
/gsp
|
|
62
|
-
/gsp
|
|
63
|
-
/gsp
|
|
64
|
-
/gsp
|
|
61
|
+
/gsp-color color systems — palettes, contrast, semantic mapping, dark mode
|
|
62
|
+
/gsp-typography type systems — scale, pairing, fluid type, vertical rhythm
|
|
63
|
+
/gsp-visuals visual direction — imagery, 3D, video, textures
|
|
64
|
+
/gsp-accessibility accessibility audit — contrast, WCAG, code checks
|
|
65
|
+
/gsp-style apply a design style preset
|
|
65
66
|
|
|
66
67
|
─── Utilities ────────────────────────
|
|
67
68
|
|
|
68
|
-
/gsp
|
|
69
|
-
/gsp
|
|
70
|
-
/gsp
|
|
69
|
+
/gsp-doctor check project health
|
|
70
|
+
/gsp-update update GSP to latest version
|
|
71
|
+
/gsp-launch create launch and marketing assets (optional)
|
|
71
72
|
|
|
72
73
|
─── Easter Eggs ────────────────────
|
|
73
74
|
|
|
74
|
-
/gsp
|
|
75
|
-
/gsp
|
|
75
|
+
/gsp-art ASCII art studio
|
|
76
|
+
/gsp-pretty surprise terminal art
|
|
76
77
|
|
|
77
78
|
─── Flow ─────────────────────────────
|
|
78
79
|
|