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 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 | Skill location in a project | Command/workflow location |
258
+ | `--ide` value | Tool | Project skill | Global skill |
259
259
  |---|---|---|---|
260
- | `claude` | Claude Code | `.claude/skills/uiux-storybook-architect/` | `.claude/commands/` |
261
- | `codex` | OpenAI Codex | `.agents/skills/uiux-storybook-architect/` | `~/.codex/prompts/` |
262
- | `antigravity` | Google Antigravity | `.agents/skills/uiux-storybook-architect/` | `.agents/workflows/` |
263
- | `cursor` | Cursor | `.agents/skills/uiux-storybook-architect/` | `.cursor/commands/` |
264
- | `windsurf` | Windsurf | `.agents/skills/uiux-storybook-architect/` | `.windsurf/workflows/` |
265
- | `copilot` | VS Code / GitHub Copilot | `.agents/skills/uiux-storybook-architect/` | `.github/prompts/` |
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
- Claude Code, Codex, and Antigravity support global skill locations. Tools without a global target fall back to project scope and report that choice.
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>A global installation wrote project files</strong></summary>
496
+ <summary><strong>Antigravity does not show the skill</strong></summary>
489
497
 
490
- Cursor, Windsurf, and GitHub Copilot do not have a supported global target in this CLI. They fall back to project scope and print a warning.
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/antigravity/skills"),
90
- cmds: path.join(HOME, ".gemini/antigravity/global_workflows"),
91
- ref: path.join(HOME, ".gemini/antigravity/skills", NAME),
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: null,
107
- verify: "type / in chat → ux-* commands appear",
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: null,
119
- verify: "type / in Cascade → ux-* workflows appear",
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: null,
132
- verify: "Agent mode → type / → ux-* prompts appear",
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
- const n = installCommands(plan.cmds, plan.ref, plan.suffix || ".md");
280
- ok(`commands ${c.dim(path.relative(dest, plan.cmds) || plan.cmds)} ${c.dim(`(${n})`)}`);
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 gated = fs.readFileSync(skillPath, "utf8").includes("When to interview");
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
- : warn(`no commands found in ${plan.cmds}`);
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.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 that turns vague website or app ideas into a distinctive, buildable Design Storybook — covering audience research, IA, art direction, tokens, typography, color, light/dark themes, composition, components, page blueprints, copy, motion with GSAP/Motion/Three.js, accessibility, and implementation. ALWAYS use this skill when the user asks to design, redesign, plan, critique, or build a website, landing page, web app, dashboard, portfolio, e-commerce store, or any UI — including requests phrased as "make it look premium/modern/award-winning", "give me a color palette", "pick fonts", "add animations", "add scroll effects", "add a 3D hero", "set up dark mode", "build me a landing page for X", or "how should this look". Trigger it even when the user only names a stack ("build a Next.js site for my client") or an audience ("a site for kids / for seniors / for a fintech"), because the interview, divergence, and storybook phases are what prevent generic template-looking output.
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