uiux-storybook-architect 2.0.0 → 2.0.2
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 +18 -10
- package/bin/cli.js +57 -19
- package/package.json +1 -1
- package/src/SKILL.md +1 -1
package/README.md
CHANGED
|
@@ -255,14 +255,16 @@ The skill inventories existing sections, specifies motion before implementation,
|
|
|
255
255
|
|
|
256
256
|
## Supported tools and install locations
|
|
257
257
|
|
|
258
|
-
| `--ide` value | Tool |
|
|
258
|
+
| `--ide` value | Tool | Project skill | Global skill |
|
|
259
259
|
|---|---|---|---|
|
|
260
|
-
| `claude` | Claude Code | `.claude/skills/uiux-storybook-architect/` |
|
|
261
|
-
| `codex` | OpenAI Codex | `.agents/skills/uiux-storybook-architect/` | `~/.codex/
|
|
262
|
-
| `antigravity` | Google Antigravity | `.agents/skills/uiux-storybook-architect/` |
|
|
263
|
-
| `cursor` | Cursor | `.agents/skills/uiux-storybook-architect/` |
|
|
264
|
-
| `windsurf` | Windsurf | `.agents/skills/uiux-storybook-architect/` |
|
|
265
|
-
| `copilot` | VS Code / GitHub Copilot | `.agents/skills/uiux-storybook-architect/` |
|
|
260
|
+
| `claude` | Claude Code | `.claude/skills/uiux-storybook-architect/` | `~/.claude/skills/uiux-storybook-architect/` |
|
|
261
|
+
| `codex` | OpenAI Codex | `.agents/skills/uiux-storybook-architect/` | `~/.codex/skills/uiux-storybook-architect/` |
|
|
262
|
+
| `antigravity` | Google Antigravity IDE | `.agents/skills/uiux-storybook-architect/` | `~/.gemini/config/skills/uiux-storybook-architect/` |
|
|
263
|
+
| `cursor` | Cursor | `.agents/skills/uiux-storybook-architect/` | `~/.cursor/skills/uiux-storybook-architect/` |
|
|
264
|
+
| `windsurf` | Windsurf | `.agents/skills/uiux-storybook-architect/` | `~/.codeium/windsurf/skills/uiux-storybook-architect/` |
|
|
265
|
+
| `copilot` | VS Code / GitHub Copilot | `.agents/skills/uiux-storybook-architect/` | `~/.copilot/skills/uiux-storybook-architect/` |
|
|
266
|
+
|
|
267
|
+
Project commands/workflows are installed into each tool's native command directory. Global command files are installed where the tool supports them: `~/.claude/commands/`, `~/.codex/prompts/`, and `~/.gemini/config/global_workflows/`. In Cursor, Windsurf, and Copilot, invoke the globally installed skill itself from the skill picker or let the agent select it automatically.
|
|
266
268
|
|
|
267
269
|
Project instruction files are updated additively. Existing `AGENTS.md`, `CLAUDE.md`, Cursor rules, Windsurf rules, and Copilot instructions are not replaced.
|
|
268
270
|
|
|
@@ -287,7 +289,7 @@ npx uiux-storybook-architect init \
|
|
|
287
289
|
npx uiux-storybook-architect init --all --global --yes
|
|
288
290
|
```
|
|
289
291
|
|
|
290
|
-
|
|
292
|
+
All six supported tools receive the skill in their native global location. No project files are written by a global install.
|
|
291
293
|
|
|
292
294
|
### Other package runners
|
|
293
295
|
|
|
@@ -427,6 +429,12 @@ npm run check
|
|
|
427
429
|
|
|
428
430
|
`npm run check` runs the CLI test suite and an npm package dry run. CI runs on pushes and pull requests to `main`.
|
|
429
431
|
|
|
432
|
+
## Automatic npm releases
|
|
433
|
+
|
|
434
|
+
Every direct commit to `main` is published automatically after the complete CI workflow passes. The release workflow reruns the primary tests, inspects the npm tarball, increments the patch version from npm's current `latest`, publishes with provenance, and creates the synchronized version commit, Git tag, and GitHub release.
|
|
435
|
+
|
|
436
|
+
To intentionally release a new minor or major version, update the package version in the feature commit with `npm version minor --no-git-tag-version` or `npm version major --no-git-tag-version`. See the [publishing guide](PUBLISHING.md) for authentication, versioning, race protection, and recovery details.
|
|
437
|
+
|
|
430
438
|
## Update
|
|
431
439
|
|
|
432
440
|
Re-run the installer from the latest package:
|
|
@@ -485,9 +493,9 @@ Ask for it directly or use a focused `/ux-spec` scope. Single decisions, small e
|
|
|
485
493
|
</details>
|
|
486
494
|
|
|
487
495
|
<details>
|
|
488
|
-
<summary><strong>
|
|
496
|
+
<summary><strong>Antigravity does not show the skill</strong></summary>
|
|
489
497
|
|
|
490
|
-
|
|
498
|
+
Current Antigravity IDE releases discover global skills from `~/.gemini/config/skills/` and global workflows from `~/.gemini/config/global_workflows/`. Versions of this package before this fix used the internal `~/.gemini/antigravity/` data directory, which Antigravity does not index for custom skills. Reinstall globally, then fully restart Antigravity or start a new agent session.
|
|
491
499
|
|
|
492
500
|
</details>
|
|
493
501
|
|
package/bin/cli.js
CHANGED
|
@@ -33,7 +33,7 @@ const ok = (s) => log(` ${c.g("✓")} ${s}`);
|
|
|
33
33
|
const warn = (s) => log(` ${c.y("!")} ${s}`);
|
|
34
34
|
|
|
35
35
|
/* ------------------------------------------------------------ targets ---- */
|
|
36
|
-
const HOME = os.homedir();
|
|
36
|
+
const HOME = process.env.UIUX_TEST_HOME || os.homedir();
|
|
37
37
|
|
|
38
38
|
/**
|
|
39
39
|
* Each target describes where the skill and the commands go, for both scopes.
|
|
@@ -74,7 +74,7 @@ const TARGETS = {
|
|
|
74
74
|
verify: "/skills → uiux-storybook-architect should be listed",
|
|
75
75
|
},
|
|
76
76
|
antigravity: {
|
|
77
|
-
label: "Google Antigravity",
|
|
77
|
+
label: "Google Antigravity IDE",
|
|
78
78
|
detect: (d) =>
|
|
79
79
|
exists(path.join(HOME, ".gemini/antigravity")) ||
|
|
80
80
|
exists(path.join(d, ".agents/workflows")) ||
|
|
@@ -86,9 +86,9 @@ const TARGETS = {
|
|
|
86
86
|
memory: path.join(d, "AGENTS.md"),
|
|
87
87
|
}),
|
|
88
88
|
global: () => ({
|
|
89
|
-
skill: path.join(HOME, ".gemini/
|
|
90
|
-
cmds: path.join(HOME, ".gemini/
|
|
91
|
-
ref: path.join(HOME, ".gemini/
|
|
89
|
+
skill: path.join(HOME, ".gemini/config/skills"),
|
|
90
|
+
cmds: path.join(HOME, ".gemini/config/global_workflows"),
|
|
91
|
+
ref: path.join(HOME, ".gemini/config/skills", NAME),
|
|
92
92
|
}),
|
|
93
93
|
verify: "type / in the agent panel → ux-* workflows appear",
|
|
94
94
|
},
|
|
@@ -103,8 +103,11 @@ const TARGETS = {
|
|
|
103
103
|
ruleFrontmatter:
|
|
104
104
|
"---\ndescription: UI/UX design workflow — interview first, storybook before code\nglobs: [\"**/*.tsx\",\"**/*.jsx\",\"**/*.vue\",\"**/*.css\",\"design/**\"]\nalwaysApply: false\n---\n",
|
|
105
105
|
}),
|
|
106
|
-
global:
|
|
107
|
-
|
|
106
|
+
global: () => ({
|
|
107
|
+
skill: path.join(HOME, ".cursor/skills"),
|
|
108
|
+
ref: path.join(HOME, ".cursor/skills", NAME),
|
|
109
|
+
}),
|
|
110
|
+
verify: "type /uiux-storybook-architect or check Customize → Skills",
|
|
108
111
|
},
|
|
109
112
|
windsurf: {
|
|
110
113
|
label: "Windsurf",
|
|
@@ -115,8 +118,11 @@ const TARGETS = {
|
|
|
115
118
|
ref: `.agents/skills/${NAME}`,
|
|
116
119
|
rule: path.join(d, ".windsurf/rules/uiux.md"),
|
|
117
120
|
}),
|
|
118
|
-
global:
|
|
119
|
-
|
|
121
|
+
global: () => ({
|
|
122
|
+
skill: path.join(HOME, ".codeium/windsurf/skills"),
|
|
123
|
+
ref: path.join(HOME, ".codeium/windsurf/skills", NAME),
|
|
124
|
+
}),
|
|
125
|
+
verify: "type @uiux-storybook-architect in Cascade",
|
|
120
126
|
},
|
|
121
127
|
copilot: {
|
|
122
128
|
label: "VS Code / GitHub Copilot",
|
|
@@ -128,8 +134,11 @@ const TARGETS = {
|
|
|
128
134
|
ref: `.agents/skills/${NAME}`,
|
|
129
135
|
rule: path.join(d, ".github/copilot-instructions.md"),
|
|
130
136
|
}),
|
|
131
|
-
global:
|
|
132
|
-
|
|
137
|
+
global: () => ({
|
|
138
|
+
skill: path.join(HOME, ".copilot/skills"),
|
|
139
|
+
ref: path.join(HOME, ".copilot/skills", NAME),
|
|
140
|
+
}),
|
|
141
|
+
verify: "Agent mode → invoke /uiux-storybook-architect or ask a UI/UX task",
|
|
133
142
|
},
|
|
134
143
|
};
|
|
135
144
|
|
|
@@ -156,6 +165,18 @@ function installSkill(parent) {
|
|
|
156
165
|
copyDir(path.join(SRC, "docs"), path.join(dest, "docs"));
|
|
157
166
|
return dest;
|
|
158
167
|
}
|
|
168
|
+
function inspectSkill(file) {
|
|
169
|
+
const body = fs.readFileSync(file, "utf8");
|
|
170
|
+
const frontmatter = body.match(/^---\r?\n([\s\S]*?)\r?\n---(?:\r?\n|$)/);
|
|
171
|
+
const name = frontmatter?.[1].match(/^name:\s*(.+)$/m)?.[1].trim() || "";
|
|
172
|
+
const description = frontmatter?.[1].match(/^description:\s*(.+)$/m)?.[1].trim() || "";
|
|
173
|
+
const errors = [];
|
|
174
|
+
if (!frontmatter) errors.push("missing YAML frontmatter");
|
|
175
|
+
if (!/^[a-z0-9-]{1,64}$/.test(name)) errors.push("name must be 1-64 lowercase letters, digits, or hyphens");
|
|
176
|
+
if (!description) errors.push("description is required");
|
|
177
|
+
if (description.length > 1024) errors.push(`description is ${description.length} characters (maximum 1024)`);
|
|
178
|
+
return { body, errors };
|
|
179
|
+
}
|
|
159
180
|
function installCommands(dir, skillRef, suffix = ".md") {
|
|
160
181
|
fs.mkdirSync(dir, { recursive: true });
|
|
161
182
|
const files = fs.readdirSync(path.join(SRC, "commands")).filter((f) => f.endsWith(".md"));
|
|
@@ -222,6 +243,13 @@ async function cmdInit(args) {
|
|
|
222
243
|
|
|
223
244
|
banner();
|
|
224
245
|
|
|
246
|
+
const sourceCheck = inspectSkill(path.join(SRC, "SKILL.md"));
|
|
247
|
+
if (sourceCheck.errors.length) {
|
|
248
|
+
sourceCheck.errors.forEach((error) => warn(`invalid SKILL.md — ${error}`));
|
|
249
|
+
process.exitCode = 1;
|
|
250
|
+
return;
|
|
251
|
+
}
|
|
252
|
+
|
|
225
253
|
let chosen;
|
|
226
254
|
if (args.flags.ide) {
|
|
227
255
|
chosen = String(args.flags.ide).split(",").map((s) => s.trim()).filter(Boolean);
|
|
@@ -276,8 +304,12 @@ async function cmdInit(args) {
|
|
|
276
304
|
log(` ${c.cy(t.label)}`);
|
|
277
305
|
const skillDir = installSkill(plan.skill);
|
|
278
306
|
ok(`skill ${c.dim(path.relative(dest, skillDir) || skillDir)}`);
|
|
279
|
-
|
|
280
|
-
|
|
307
|
+
if (plan.cmds) {
|
|
308
|
+
const n = installCommands(plan.cmds, plan.ref, plan.suffix || ".md");
|
|
309
|
+
ok(`commands ${c.dim(path.relative(dest, plan.cmds) || plan.cmds)} ${c.dim(`(${n})`)}`);
|
|
310
|
+
} else {
|
|
311
|
+
log(` ${c.dim("The skill itself is available for automatic or manual invocation.")}`);
|
|
312
|
+
}
|
|
281
313
|
if (plan.note) log(` ${c.dim(plan.note)}`);
|
|
282
314
|
const rulesFile = plan.rule || plan.memory;
|
|
283
315
|
if (rulesFile && scope === "project") {
|
|
@@ -340,18 +372,24 @@ function cmdDoctor(args) {
|
|
|
340
372
|
if (!plan) continue;
|
|
341
373
|
const skillPath = path.join(plan.skill, NAME, "SKILL.md");
|
|
342
374
|
if (!exists(skillPath)) continue;
|
|
343
|
-
const cmdCount = exists(plan.cmds)
|
|
375
|
+
const cmdCount = plan.cmds && exists(plan.cmds)
|
|
344
376
|
? fs.readdirSync(plan.cmds).filter((f) => f.startsWith("ux-")).length
|
|
345
377
|
: 0;
|
|
346
378
|
// several IDEs share .agents/skills — without commands this target isn't really installed
|
|
347
|
-
if (cmdCount === 0 && plan.skill.includes(path.join(".agents", "skills"))) continue;
|
|
379
|
+
if (plan.cmds && cmdCount === 0 && plan.skill.includes(path.join(".agents", "skills"))) continue;
|
|
348
380
|
found++;
|
|
349
|
-
const
|
|
381
|
+
const skillCheck = inspectSkill(skillPath);
|
|
382
|
+
const gated = skillCheck.body.includes("When to interview");
|
|
350
383
|
log(` ${c.cy(t.label)} ${c.dim("(" + scope + ")")}`);
|
|
351
384
|
ok(`skill ${c.dim(path.join(plan.skill, NAME))}`);
|
|
352
|
-
cmdCount
|
|
385
|
+
plan.cmds && cmdCount
|
|
353
386
|
? ok(`commands ${cmdCount} installed ${c.dim(plan.cmds)}`)
|
|
354
|
-
:
|
|
387
|
+
: plan.cmds
|
|
388
|
+
? warn(`no commands found in ${plan.cmds}`)
|
|
389
|
+
: ok("skill invocation available (no separate global command directory)");
|
|
390
|
+
skillCheck.errors.length
|
|
391
|
+
? skillCheck.errors.forEach((error) => warn(`invalid SKILL.md — ${error}`))
|
|
392
|
+
: ok("skill metadata valid");
|
|
355
393
|
gated ? ok("interview logic present (new projects only)") : warn("interview logic MISSING — reinstall");
|
|
356
394
|
log();
|
|
357
395
|
}
|
|
@@ -377,7 +415,7 @@ function cmdUninstall(args) {
|
|
|
377
415
|
const plan = scope === "global" ? t.global?.() : t.project(dest);
|
|
378
416
|
if (!plan) continue;
|
|
379
417
|
if (removeIfOurs(path.join(plan.skill, NAME))) { ok(`removed skill ${c.dim(path.join(plan.skill, NAME))}`); n++; }
|
|
380
|
-
if (exists(plan.cmds)) {
|
|
418
|
+
if (plan.cmds && exists(plan.cmds)) {
|
|
381
419
|
for (const f of fs.readdirSync(plan.cmds)) {
|
|
382
420
|
if (/^ux-.*\.md$/.test(f)) { fs.rmSync(path.join(plan.cmds, f)); n++; }
|
|
383
421
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "uiux-storybook-architect",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.2",
|
|
4
4
|
"description": "Interview-driven UI/UX design skill with 8 workflow commands for Claude Code, Codex, Antigravity, Cursor, Windsurf and VS Code Copilot. Turns vague briefs into distinctive, buildable Design Storybooks with art direction, tokens, copy, motion and accessibility.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
package/src/SKILL.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: uiux-storybook-architect
|
|
3
|
-
description: Interview-driven UI/UX design director
|
|
3
|
+
description: Interview-driven UI/UX design director for websites and apps. Use for any request to design, redesign, plan, critique, or build a UI—including landing pages, dashboards, portfolios, e-commerce, color and type systems, themes, animation, scroll effects, or 3D heroes—even when the user provides only a stack or audience. Produces a distinctive, buildable Design Storybook covering discovery, information architecture, art direction, tokens, typography, color, composition, components, page blueprints, copy, motion, accessibility, and implementation. For new products and full redesigns, it interviews first and presents divergent directions before specification or code; for focused changes, it audits and acts directly.
|
|
4
4
|
license: For personal and commercial project use.
|
|
5
5
|
---
|
|
6
6
|
|