@ericrisco/rsc 3.3.1 → 3.5.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 +3 -3
- package/manifest.json +43 -22
- package/package.json +1 -1
- package/scripts/lib/default-skill-floor.js +5 -1
- package/scripts/lib/domains.js +2 -2
- package/scripts/lib/retired-skills.js +4 -0
- package/scripts/rsc.js +1 -1
- package/skills/design/SKILL.md +4 -3
- package/skills/design/evals/cases.yaml +2 -2
- package/skills/ftd/SKILL.md +1 -1
- package/skills/react/SKILL.md +2 -1
- package/skills/ux/SKILL.md +149 -0
- package/skills/ux/THIRD_PARTY.md +32 -0
- package/skills/ux/evals/cases.yaml +40 -0
- package/skills/ux/references/flows.md +124 -0
- package/skills/ux/upstream/UPSTREAM.json +59 -0
- package/skills/ux/upstream/ux-designer/GUIDE.md +180 -0
- package/skills/ux/upstream/ux-designer/LICENSE +21 -0
- package/skills/ux/upstream/ux-designer/references/01-core-principles.md +251 -0
- package/skills/ux/upstream/ux-designer/references/02-laws-of-ux.md +330 -0
- package/skills/ux/upstream/ux-designer/references/03-accessibility.md +411 -0
- package/skills/ux/upstream/ux-designer/references/04-visual-design.md +433 -0
- package/skills/ux/upstream/ux-designer/references/05-information-architecture.md +432 -0
- package/skills/ux/upstream/ux-designer/references/06-interaction-design.md +495 -0
- package/skills/ux/upstream/ux-designer/references/07-forms-and-inputs.md +491 -0
- package/skills/ux/upstream/ux-designer/references/08-mobile-ux.md +539 -0
- package/skills/ux/upstream/ux-designer/references/09-ux-writing.md +493 -0
- package/skills/ux/upstream/ux-designer/references/10-user-research.md +533 -0
- package/skills/ux/upstream/ux-designer/references/11-design-systems.md +618 -0
- package/skills/ux/upstream/ux-designer/references/12a-presence-awareness.md +395 -0
- package/skills/ux/upstream/ux-designer/references/12b-conflict-resolution-sync.md +420 -0
- package/skills/ux/upstream/ux-designer/references/13a-canvas-navigation.md +388 -0
- package/skills/ux/upstream/ux-designer/references/13b-canvas-objects-performance.md +559 -0
- package/skills/ux/upstream/ux-designer/references/14-ai-ux-patterns.md +511 -0
- package/skills/ux/upstream/ux-designer/references/15-ethical-design.md +419 -0
- package/skills/ux/upstream/ux-designer/references/16-onboarding.md +430 -0
- package/skills/ux/upstream/ux-designer/references/17-notifications.md +461 -0
- package/skills/ux/upstream/ux-designer/references/18-data-visualization.md +453 -0
- package/skills/ux/upstream/ux-designer/references/19-search-ux.md +479 -0
- package/skills/ux/upstream/ux-designer/references/20-emotional-design.md +382 -0
- package/skills/ux/upstream/ux-designer/references/21-data-tables.md +629 -0
- package/skills/ux/upstream/ux-designer/references/22-performance-ux.md +626 -0
- package/skills/ux/upstream/ux-designer/references/23-internationalization.md +347 -0
- package/skills/ux/upstream/ux-designer/references/24-voice-and-multimodal.md +308 -0
- package/skills/ux/upstream/ux-designer/references/25a-barcode-camera-scanning.md +342 -0
- package/skills/ux/upstream/ux-designer/references/25b-barcode-scanner-workflows.md +412 -0
- package/skills/ux/upstream/ux-designer/references/25c-barcode-display.md +277 -0
- package/skills/ux/upstream/ux-usability-foundations/GUIDE.md +285 -0
- package/skills/ux/upstream/ux-usability-foundations/LICENSE +21 -0
- package/skills/ux/upstream/ux-usability-foundations/references/anti-patterns.md +267 -0
- package/skills/ux/upstream/ux-usability-foundations/references/checklists.md +130 -0
- package/skills/ux/upstream/ux-usability-foundations/references/decision-prompts.md +340 -0
- package/skills/ux/upstream/ux-usability-foundations/references/principle-cards.md +449 -0
- package/skills/worktrees/SKILL.md +19 -5
- package/targets/branch-guard.mjs +59 -4
- package/targets/clone-bootstrap.mjs +1 -1
- package/targets/session-memory-adapter.mjs +2 -2
- package/targets/team-safe-start.mjs +1 -0
- package/targets/worktree-reaper.mjs +14 -1
- package/skills/ui-engineering/SKILL.md +0 -113
- package/skills/ui-engineering/evals/cases.yaml +0 -38
package/README.md
CHANGED
|
@@ -239,7 +239,7 @@ project. rsc handles four things by default:
|
|
|
239
239
|
| | What happens | Turn it off |
|
|
240
240
|
| --- | --- | --- |
|
|
241
241
|
| **You choose how the project works** | The install asks once: straight on `main`, or branches and pull requests? With branches, a commit on `main` is refused and the agent asks before each change: this branch, a new one, or unlock `main`? It never opens a branch on its own. | «unlock main», or `rsc main unlock` |
|
|
242
|
-
| **One workspace per agent** | If another session works in the same folder, new work goes to `.worktrees/<branch
|
|
242
|
+
| **One workspace per agent** | If another session works in the same folder, new work goes to `.worktrees/<branch>/` at the root you work in (never inside a project folder) and is never committed. A `post-merge` hook retires it once the branch lands. | `rsc isolation off` |
|
|
243
243
|
| **The agent picks the method** | FTD for simple changes, SDD for complex ones. The agent decides and says why. | Ask for the other lane |
|
|
244
244
|
| **Knowledge reaches everyone** | `01-TOOLS/`, `02-DOCS/wiki/` and `02-DOCS/attachments/` travel through one exchange branch, `rsc/knowledge`, and reach `main` inside your normal pull requests. | `rsc knowledge-sync off` |
|
|
245
245
|
|
|
@@ -564,11 +564,11 @@ whether, what and which platform.
|
|
|
564
564
|
|
|
565
565
|
### 🌀 Motion & interface craft
|
|
566
566
|
|
|
567
|
-
[
|
|
567
|
+
[variant-explorer](skills/variant-explorer/) · [scroll-film](skills/scroll-film/)
|
|
568
568
|
|
|
569
569
|
### 🎨 Design & content craft
|
|
570
570
|
|
|
571
|
-
[design](skills/design/) · [presentations](skills/presentations/) · [course-storytelling](skills/course-storytelling/) · [course-builder](skills/course-builder/) · [technical-writing](skills/technical-writing/) · [translation-l10n](skills/translation-l10n/)
|
|
571
|
+
[design](skills/design/) · [ux](skills/ux/) · [presentations](skills/presentations/) · [course-storytelling](skills/course-storytelling/) · [course-builder](skills/course-builder/) · [technical-writing](skills/technical-writing/) · [translation-l10n](skills/translation-l10n/)
|
|
572
572
|
|
|
573
573
|
### 🧠 Knowledge & meta
|
|
574
574
|
|
package/manifest.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "3.
|
|
2
|
+
"version": "3.5.0",
|
|
3
3
|
"counts": {
|
|
4
4
|
"skills": 269,
|
|
5
5
|
"agents": 34,
|
|
@@ -1311,7 +1311,7 @@
|
|
|
1311
1311
|
},
|
|
1312
1312
|
{
|
|
1313
1313
|
"id": "design",
|
|
1314
|
-
"description": "Use when designing, redesigning, restyling or reviewing a web page or app screen (landing, product site, portfolio, dashboard, docs) or when a UI looks generic or AI-made. Deals a researched direction, takes the idea from the subject, uses real pictures, proves it in a browser. NOT the words (landing-copy), NOT
|
|
1314
|
+
"description": "Use when designing, redesigning, restyling or reviewing a web page or app screen (landing, product site, portfolio, dashboard, docs) or when a UI looks generic or AI-made. Deals a researched direction, takes the idea from the subject, uses real pictures, proves it in a browser. NOT the words (landing-copy), NOT flows or usability (ux).",
|
|
1315
1315
|
"tags": [
|
|
1316
1316
|
"design",
|
|
1317
1317
|
"ui",
|
|
@@ -1323,7 +1323,7 @@
|
|
|
1323
1323
|
],
|
|
1324
1324
|
"recommends": [
|
|
1325
1325
|
"landing-copy",
|
|
1326
|
-
"
|
|
1326
|
+
"ux",
|
|
1327
1327
|
"accessibility",
|
|
1328
1328
|
"brand-identity",
|
|
1329
1329
|
"nextjs"
|
|
@@ -5108,25 +5108,6 @@
|
|
|
5108
5108
|
],
|
|
5109
5109
|
"profiles": []
|
|
5110
5110
|
},
|
|
5111
|
-
{
|
|
5112
|
-
"id": "ui-engineering",
|
|
5113
|
-
"description": "Use when the question is how interface should be BUILT — component boundaries, state that belongs in the URL vs the component, loading/empty/error states, forms, optimistic updates, build vs adopt. NOT the visual system (`design`), NOT framework mechanics (`react`/`nextjs`).",
|
|
5114
|
-
"tags": [
|
|
5115
|
-
"interface",
|
|
5116
|
-
"frontend",
|
|
5117
|
-
"architecture",
|
|
5118
|
-
"components",
|
|
5119
|
-
"state",
|
|
5120
|
-
"craft"
|
|
5121
|
-
],
|
|
5122
|
-
"recommends": [
|
|
5123
|
-
"design"
|
|
5124
|
-
],
|
|
5125
|
-
"profiles": [
|
|
5126
|
-
"core",
|
|
5127
|
-
"full"
|
|
5128
|
-
]
|
|
5129
|
-
},
|
|
5130
5111
|
{
|
|
5131
5112
|
"id": "unit-economics",
|
|
5132
5113
|
"description": "Use when computing or improving the per-customer economics of a business — CAC, LTV, CAC payback period and contribution margin — judging whether the ratios are healthy against current norms, and naming the one lever that fixes the worst number. Covers a blended CAC that hides a bleeding channel, and a model that shows profit while each customer loses money. NOT the multi-year P&L or scenario projection (that is `financial-model`).",
|
|
@@ -5242,6 +5223,46 @@
|
|
|
5242
5223
|
],
|
|
5243
5224
|
"profiles": []
|
|
5244
5225
|
},
|
|
5226
|
+
{
|
|
5227
|
+
"id": "ux",
|
|
5228
|
+
"description": "Use when an app or SaaS must be easy to use: designing complete user flows, screens and every state, navigation, forms, onboarding, tables, dashboards, search or AI features, or auditing usability and accessibility. Anyone finishes the job without a manual; experts go fast. NOT the visual direction (design), NOT the words (landing-copy).",
|
|
5229
|
+
"tags": [
|
|
5230
|
+
"ux",
|
|
5231
|
+
"usability",
|
|
5232
|
+
"user-flows",
|
|
5233
|
+
"flows",
|
|
5234
|
+
"screens",
|
|
5235
|
+
"states",
|
|
5236
|
+
"empty-state",
|
|
5237
|
+
"signup",
|
|
5238
|
+
"modal",
|
|
5239
|
+
"saas",
|
|
5240
|
+
"app",
|
|
5241
|
+
"product-design",
|
|
5242
|
+
"navigation",
|
|
5243
|
+
"forms",
|
|
5244
|
+
"onboarding",
|
|
5245
|
+
"dashboard",
|
|
5246
|
+
"productivity",
|
|
5247
|
+
"accessibility",
|
|
5248
|
+
"wcag",
|
|
5249
|
+
"interaction-design",
|
|
5250
|
+
"usabilidad",
|
|
5251
|
+
"flujos",
|
|
5252
|
+
"pantallas"
|
|
5253
|
+
],
|
|
5254
|
+
"recommends": [
|
|
5255
|
+
"design",
|
|
5256
|
+
"accessibility",
|
|
5257
|
+
"landing-copy",
|
|
5258
|
+
"react"
|
|
5259
|
+
],
|
|
5260
|
+
"profiles": [
|
|
5261
|
+
"minimal",
|
|
5262
|
+
"core",
|
|
5263
|
+
"full"
|
|
5264
|
+
]
|
|
5265
|
+
},
|
|
5245
5266
|
{
|
|
5246
5267
|
"id": "variant-explorer",
|
|
5247
5268
|
"description": "Use when someone wants OPTIONS rather than an answer — 'show me a few versions', picking between approaches by seeing them. Genuinely different candidates, cheap to throw away, trade-off named. NOT the critique that judges one (`design`), NOT the spec (`specify`).",
|
package/package.json
CHANGED
|
@@ -18,7 +18,11 @@
|
|
|
18
18
|
// `design` joined in 3.3.0 (spec design-from-scratch): it was `full`-only, so most projects designed
|
|
19
19
|
// with no design skill at all. Only its description is paid for on other turns; the engine it ships
|
|
20
20
|
// (scripts and data) is never loaded into context.
|
|
21
|
-
|
|
21
|
+
//
|
|
22
|
+
// `ux` joined in 3.4.0: `design` decides how a screen looks, `ux` decides whether people can use it —
|
|
23
|
+
// the whole flow, every state, the browser walk. It replaced `ui-engineering`, which was core-only.
|
|
24
|
+
// Only its description is paid for on other turns; the upstream references load on demand.
|
|
25
|
+
export const DEFAULT_SKILL_FLOOR = Object.freeze(['orient', 'suggest', 'unslop', 'ftd', 'connect-tool', 'design', 'ux']);
|
|
22
26
|
|
|
23
27
|
export function withDefaultSkillFloor(skillIds = []) {
|
|
24
28
|
return [...new Set([...DEFAULT_SKILL_FLOOR, ...skillIds])];
|
package/scripts/lib/domains.js
CHANGED
|
@@ -24,8 +24,8 @@ export const DOMAINS = [
|
|
|
24
24
|
{ title: 'Ship & operate — platforms', ids: ['vercel', 'netlify', 'cloudflare', 'railway', 'render', 'fly-io', 'coolify', 'hetzner', 'digitalocean', 'aws-essentials', 'gcp-essentials'] },
|
|
25
25
|
{ title: 'Ship & operate — devops', ids: ['docker', 'github-actions', 'git-workflow', 'domains-dns', 'monitoring', 'email-deliverability', 'scaling', 'deployment', 'deprecation'] },
|
|
26
26
|
{ title: 'Ship & operate — quality & security', ids: ['code-review', 'security-scan', 'secure-coding', 'testing-py', 'testing-web', 'testing-go', 'e2e-testing', 'accessibility', 'performance', 'error-handling', 'observability'] },
|
|
27
|
-
{ title: 'Motion & interface craft', ids: ['
|
|
28
|
-
{ title: 'Design & content craft', ids: ['design', 'presentations', 'course-storytelling', 'course-builder', 'technical-writing', 'translation-l10n'] },
|
|
27
|
+
{ title: 'Motion & interface craft', ids: ['variant-explorer', 'scroll-film'] },
|
|
28
|
+
{ title: 'Design & content craft', ids: ['design', 'ux', 'presentations', 'course-storytelling', 'course-builder', 'technical-writing', 'translation-l10n'] },
|
|
29
29
|
{ title: 'Knowledge & meta', ids: ['knowledge-ops', 'codebase-onboarding', 'research-ops', 'decision-records', 'continuous-learning', 'skill-scout', 'context-budget', 'roast-me', 'fable-operator'] },
|
|
30
30
|
];
|
|
31
31
|
|
|
@@ -11,9 +11,13 @@
|
|
|
11
11
|
//
|
|
12
12
|
// `design-loop`, `design-dna` and `motion-craft` folded into the rebuilt `design` in 3.3.0 (spec
|
|
13
13
|
// design-from-scratch): its engine deals the direction, measures the render and owns the motion layer.
|
|
14
|
+
//
|
|
15
|
+
// `ui-engineering` folded into `ux` in 3.4.0: the screen states and form behaviour it owned are
|
|
16
|
+
// `ux`'s state matrix now, and where component state lives is `react`'s.
|
|
14
17
|
export const RETIRED_SKILLS = Object.freeze({
|
|
15
18
|
eli5: 'orient', 'show-me': 'orient', bro: 'unslop',
|
|
16
19
|
'design-loop': 'design', 'design-dna': 'design', 'motion-craft': 'design',
|
|
20
|
+
'ui-engineering': 'ux',
|
|
17
21
|
});
|
|
18
22
|
|
|
19
23
|
const retiredTo = (id) => (Object.hasOwn(RETIRED_SKILLS, id) ? RETIRED_SKILLS[id] : id);
|
package/scripts/rsc.js
CHANGED
|
@@ -927,7 +927,7 @@ async function main() {
|
|
|
927
927
|
: 'rsc main lock: branches and pull requests for this project — the default branch is closed for the agent, and it asks before each code change where it goes. Commit .rsc.json so the team gets the same decision.')
|
|
928
928
|
: (sub === OFF
|
|
929
929
|
? 'rsc isolation off: sessions may share this folder without a worktree. Commit .rsc.json so the team gets the same decision.'
|
|
930
|
-
: 'rsc isolation on: with another session active in this folder, new work goes to .worktrees/<branch
|
|
930
|
+
: 'rsc isolation on: with another session active in this folder, new work goes to .worktrees/<branch>/ at the root, never inside a project folder. Commit .rsc.json so the team gets the same decision.'));
|
|
931
931
|
return;
|
|
932
932
|
}
|
|
933
933
|
if (sub === 'status') {
|
package/skills/design/SKILL.md
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: design
|
|
3
|
-
description: "Use when designing, redesigning, restyling or reviewing a web page or app screen (landing, product site, portfolio, dashboard, docs) or when a UI looks generic or AI-made. Deals a researched direction, takes the idea from the subject, uses real pictures, proves it in a browser. NOT the words (landing-copy), NOT
|
|
3
|
+
description: "Use when designing, redesigning, restyling or reviewing a web page or app screen (landing, product site, portfolio, dashboard, docs) or when a UI looks generic or AI-made. Deals a researched direction, takes the idea from the subject, uses real pictures, proves it in a browser. NOT the words (landing-copy), NOT flows or usability (ux)."
|
|
4
4
|
tags: [design, ui, ux, landing, dashboard, frontend, taste]
|
|
5
|
-
recommends: [landing-copy,
|
|
5
|
+
recommends: [landing-copy, ux, accessibility, brand-identity, nextjs]
|
|
6
6
|
profiles: [minimal, core, full]
|
|
7
7
|
origin: risco
|
|
8
8
|
---
|
|
@@ -91,7 +91,8 @@ launch. Do not claim a check you did not run.
|
|
|
91
91
|
## Hand-offs
|
|
92
92
|
|
|
93
93
|
- The words on a conversion page → `../landing-copy/SKILL.md`.
|
|
94
|
-
-
|
|
94
|
+
- Flows, screen states, navigation, forms and usability → `../ux/SKILL.md`.
|
|
95
|
+
- Component code and where state lives → `../react/SKILL.md`.
|
|
95
96
|
- WCAG conformance work → `../accessibility/SKILL.md`.
|
|
96
97
|
- A full brand system (logo, print colours, usage rules) → `../brand-identity/SKILL.md`.
|
|
97
98
|
- The App Router build → `../nextjs/SKILL.md`.
|
|
@@ -19,8 +19,8 @@ should_not_trigger:
|
|
|
19
19
|
route_to: "landing-copy"
|
|
20
20
|
why: "The words on a conversion page belong to landing-copy; design builds the page around them."
|
|
21
21
|
- prompt: "Where should the filter state live, in the URL or in the component, and how do we handle loading and errors?"
|
|
22
|
-
route_to: "
|
|
23
|
-
why: "How interface is built (state, boundaries, async states) is
|
|
22
|
+
route_to: "react"
|
|
23
|
+
why: "How interface is built (state, boundaries, async states) is react's (and the states it shows are ux's), not visual design."
|
|
24
24
|
- prompt: "Make our web app pass WCAG 2.2 AA: fix the axe violations and keyboard traps."
|
|
25
25
|
route_to: "accessibility"
|
|
26
26
|
why: "Conformance remediation is the accessibility skill's job."
|
package/skills/ftd/SKILL.md
CHANGED
|
@@ -73,7 +73,7 @@ says which on every turn) — never a branch opened on your own:
|
|
|
73
73
|
is no exception: an unrelated change does not go into it without asking. A new branch is named by
|
|
74
74
|
intent and closes with a pull request. Unlocking is `rsc main unlock`; never without that answer.
|
|
75
75
|
- **Docs, wiki or config only** → no question, no branch.
|
|
76
|
-
- **Another session working in this same folder** → a worktree in `.worktrees/<branch
|
|
76
|
+
- **Another session working in this same folder** → a worktree in `.worktrees/<branch>/` at the root you work in (never inside a project folder), never a
|
|
77
77
|
branch switch under the other session. Not a question: rsc tells you when that is the case.
|
|
78
78
|
|
|
79
79
|
A worktree only when another session is there: alone, setting one up costs more than it protects.
|
package/skills/react/SKILL.md
CHANGED
|
@@ -10,7 +10,8 @@ origin: risco
|
|
|
10
10
|
|
|
11
11
|
**Hand-off — picking dependencies.** Which library to reach for (UI primitives, command menus,
|
|
12
12
|
toasts, OTP inputs, charts, virtualization, drag and drop, state, styling, theming) is
|
|
13
|
-
|
|
13
|
+
this skill's call: reuse what the project already depends on, then prefer a maintained, accessible library
|
|
14
|
+
over hand-rolling a component. How the screen should behave for people is `../ux/SKILL.md`'s. The look of a page
|
|
14
15
|
or screen, and its motion layer, is `../design/SKILL.md`'s.
|
|
15
16
|
|
|
16
17
|
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ux
|
|
3
|
+
description: "Use when an app or SaaS must be easy to use: designing complete user flows, screens and every state, navigation, forms, onboarding, tables, dashboards, search or AI features, or auditing usability and accessibility. Anyone finishes the job without a manual; experts go fast. NOT the visual direction (design), NOT the words (landing-copy)."
|
|
4
|
+
tags: [ux, usability, user-flows, flows, screens, states, empty-state, signup, modal, saas, app, product-design, navigation, forms, onboarding, dashboard, productivity, accessibility, wcag, interaction-design, usabilidad, flujos, pantallas]
|
|
5
|
+
recommends: [design, accessibility, landing-copy, react]
|
|
6
|
+
profiles: [minimal, core, full]
|
|
7
|
+
origin: risco
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# ux
|
|
11
|
+
|
|
12
|
+
The bar: someone who has never seen the product finishes the main job **without asking anyone**,
|
|
13
|
+
someone who uses it every day finishes it **fast**, and nobody loses work when something fails. A
|
|
14
|
+
screen that looks good and misses that bar is not done.
|
|
15
|
+
|
|
16
|
+
- **The flow comes before the screen.** Map the whole journey, from arrival to the job done and back
|
|
17
|
+
again, before drawing anything.
|
|
18
|
+
- **Every screen answers five questions:** where am I, what is this, what can I do, what just
|
|
19
|
+
happened, where do I go next.
|
|
20
|
+
- **Every state is designed,** not only the full one: empty, loading, error, offline, no permission,
|
|
21
|
+
too much data.
|
|
22
|
+
- **You prove it by using it,** in a real browser, with the keyboard, at phone width. Reading the
|
|
23
|
+
code is not a check.
|
|
24
|
+
|
|
25
|
+
The depth ships in `upstream/`, two MIT skills copied unmodified (`THIRD_PARTY.md`). This file is the
|
|
26
|
+
method; load only the reference the task touches (table in **Files**).
|
|
27
|
+
|
|
28
|
+
## 0. Name the job
|
|
29
|
+
|
|
30
|
+
Write four lines before anything else: **who** (first-time, occasional, daily expert, admin),
|
|
31
|
+
**the job** in their words, **done when** (what they can see), and **the risk** (money, data, legal,
|
|
32
|
+
irreversible). Assume motivated but distracted people with average domain knowledge and imperfect
|
|
33
|
+
memory.
|
|
34
|
+
|
|
35
|
+
Ask one question only when the answer changes the design: the main task is unclear, the action is
|
|
36
|
+
risky or irreversible, novices and experts need different things, the platform is unknown, or the
|
|
37
|
+
request asks for a hidden or manipulative pattern. The ready-made questions, each with its default,
|
|
38
|
+
are in `upstream/ux-usability-foundations/references/decision-prompts.md`. Everything else is
|
|
39
|
+
decided by the defaults in `upstream/ux-usability-foundations/GUIDE.md`.
|
|
40
|
+
|
|
41
|
+
## 1. Map the whole flow
|
|
42
|
+
|
|
43
|
+
Use [references/flows.md](references/flows.md): the flow map, the lifecycle (sign-up, empty
|
|
44
|
+
account, first value, the daily loop, limits, permissions, failures, offline, leaving and coming
|
|
45
|
+
back), the second role (whoever is invited, not only the admin who set it up), and the step count of
|
|
46
|
+
the core loop. Output a table with one row per step and screen. Missing lifecycle rows are the usual
|
|
47
|
+
reason an app "feels broken".
|
|
48
|
+
|
|
49
|
+
## 2. Design each screen
|
|
50
|
+
|
|
51
|
+
1. **One job and one primary action.** The primary action is named with a verb and an object
|
|
52
|
+
("Send invoice"), it is the strongest element, and the destructive action is never the primary
|
|
53
|
+
one.
|
|
54
|
+
2. **Pick the pattern from the job:** list, detail, form, wizard, settings, dashboard, search, or an
|
|
55
|
+
overlay. Decision trees (modal, side panel or page; which notification type) are in
|
|
56
|
+
`upstream/ux-designer/GUIDE.md`. Navigation and IA in `05-information-architecture.md`.
|
|
57
|
+
3. **Fill the state matrix** in `references/flows.md` for every screen: default, loading, empty
|
|
58
|
+
(new account and filtered to zero), partial, error, offline, no permission, overflow, pending.
|
|
59
|
+
4. **Prevent, then recover:** constraints and safe defaults first, inline validation, input kept
|
|
60
|
+
across every failure, undo for anything reversible, confirmation only for the irreversible.
|
|
61
|
+
Forms in `07-forms-and-inputs.md`.
|
|
62
|
+
5. **Speed for experts:** keyboard shortcuts, command search, bulk actions, saved views, remembered
|
|
63
|
+
filters, sensible defaults. They never replace the visible route for everyone else.
|
|
64
|
+
6. **Accessible from the start:** native elements first, keyboard reaches everything, visible focus,
|
|
65
|
+
labels, colour never the only signal, targets of at least 24×24 CSS px. WCAG 2.2 AA in
|
|
66
|
+
`03-accessibility.md`.
|
|
67
|
+
|
|
68
|
+
The rules with their numbers (contrast, type, timing, targets, toasts) are in
|
|
69
|
+
`upstream/ux-designer/GUIDE.md` › *Core rules* and *Reference values*. Use them; do not invent
|
|
70
|
+
others.
|
|
71
|
+
|
|
72
|
+
## 3. How it looks
|
|
73
|
+
|
|
74
|
+
The visual direction (type, palette, composition, pictures) is `../design/SKILL.md`'s, and it runs its
|
|
75
|
+
engine on the screens this skill has specified. What stays here is the hierarchy that serves the job:
|
|
76
|
+
one dominant element per screen, three levels of emphasis, one spacing scale, colour that means state,
|
|
77
|
+
density chosen by the job (monitoring dense, onboarding calm). The tells of generated interfaces are
|
|
78
|
+
listed in `upstream/ux-designer/GUIDE.md` › *Generated-UI defaults to avoid*, and visual detail in
|
|
79
|
+
`04-visual-design.md`.
|
|
80
|
+
|
|
81
|
+
## 4. Prove it by using it
|
|
82
|
+
|
|
83
|
+
Walk the main job from a cold start in a real browser (the Chrome DevTools tools, when present): a new
|
|
84
|
+
account, then one with data. Then the extremes: keyboard only, 320px wide, 200% zoom, a long
|
|
85
|
+
translated string, empty data, a lot of data, a slow network, a failed request. Run axe or Lighthouse
|
|
86
|
+
when the browser is there. Write down every hesitation and fix the hesitations before polishing
|
|
87
|
+
anything. A check that could not run is reported as not run.
|
|
88
|
+
|
|
89
|
+
## Review mode
|
|
90
|
+
|
|
91
|
+
When the task is to audit an existing interface: steps 0 and 4 first, then report findings ranked
|
|
92
|
+
by impact on the job, in the format of `upstream/ux-designer/GUIDE.md` › *Reviewing or auditing a
|
|
93
|
+
UI* (Blocker / Major / Minor, where, fix, reference). Inspection order and the full checklists:
|
|
94
|
+
`upstream/ux-usability-foundations/GUIDE.md` › *Workflow for critiquing* and
|
|
95
|
+
`references/checklists.md`. Split quick wins from structural changes. If nothing serious turns up,
|
|
96
|
+
say so in one line.
|
|
97
|
+
|
|
98
|
+
## Report
|
|
99
|
+
|
|
100
|
+
Say briefly: the person and the job; the flow map; the screens with their primary action and the
|
|
101
|
+
states covered; what was walked in the browser and what was not; the findings or decisions with
|
|
102
|
+
their reference; what still needs real data or real users to confirm.
|
|
103
|
+
|
|
104
|
+
## Hand-offs
|
|
105
|
+
|
|
106
|
+
- Visual direction, type, palette, pictures, landing pages → `../design/SKILL.md`.
|
|
107
|
+
- The words on a marketing or conversion page → `../landing-copy/SKILL.md`.
|
|
108
|
+
- A formal WCAG conformance programme or audit → `../accessibility/SKILL.md`.
|
|
109
|
+
- Component code, state and data fetching → `../react/SKILL.md` or `../nextjs/SKILL.md`.
|
|
110
|
+
- Measuring a flow with real users at scale → `../analytics/SKILL.md`, `../ab-testing/SKILL.md`.
|
|
111
|
+
|
|
112
|
+
## Files
|
|
113
|
+
|
|
114
|
+
| Load when the task involves… | File |
|
|
115
|
+
| --- | --- |
|
|
116
|
+
| The whole journey, lifecycle, roles, state matrix | [references/flows.md](references/flows.md) |
|
|
117
|
+
| Workflows, core rules, numbers, decision trees, generated-UI tells | `upstream/ux-designer/GUIDE.md` |
|
|
118
|
+
| Principles, defaults, questions to ask, critique order | `upstream/ux-usability-foundations/GUIDE.md` |
|
|
119
|
+
| Questions with their recommended default | `upstream/ux-usability-foundations/references/decision-prompts.md` |
|
|
120
|
+
| Principles as cards, full checklists, anti-patterns | `upstream/ux-usability-foundations/references/` › `principle-cards.md`, `checklists.md`, `anti-patterns.md` |
|
|
121
|
+
| Nielsen's heuristics, Gestalt | `upstream/ux-designer/references/01-core-principles.md` |
|
|
122
|
+
| Fitts, Hick, Jakob, Tesler, peak-end | `…/02-laws-of-ux.md` |
|
|
123
|
+
| WCAG 2.2, ARIA, EAA | `…/03-accessibility.md` |
|
|
124
|
+
| Type, colour, spacing, hierarchy, dark mode | `…/04-visual-design.md` |
|
|
125
|
+
| Navigation, sitemaps, card sorting | `…/05-information-architecture.md` |
|
|
126
|
+
| Modals, tooltips, drag and drop, motion timing | `…/06-interaction-design.md` |
|
|
127
|
+
| Forms, validation, input types, errors | `…/07-forms-and-inputs.md` |
|
|
128
|
+
| Touch, gestures, responsive, mobile navigation | `…/08-mobile-ux.md` |
|
|
129
|
+
| Microcopy, error messages, tone | `…/09-ux-writing.md` |
|
|
130
|
+
| Interviews, usability tests, surveys, metrics | `…/10-user-research.md` |
|
|
131
|
+
| Tokens, component APIs, design system docs | `…/11-design-systems.md` |
|
|
132
|
+
| Presence, cursors, avatars | `…/12a-presence-awareness.md` |
|
|
133
|
+
| Conflicts, sync, offline, sharing, history | `…/12b-conflict-resolution-sync.md` |
|
|
134
|
+
| Canvas zoom, pan, selection; layers, snapping, performance | `…/13a-canvas-navigation.md`, `…/13b-canvas-objects-performance.md` |
|
|
135
|
+
| Chat, copilots, agents, generative UI | `…/14-ai-ux-patterns.md` |
|
|
136
|
+
| Dark patterns, consent, DSA and GDPR interface rules | `…/15-ethical-design.md` |
|
|
137
|
+
| First run, activation, empty states, checklists | `…/16-onboarding.md` |
|
|
138
|
+
| Notifications, push, toasts, preferences | `…/17-notifications.md` |
|
|
139
|
+
| Charts and dashboards | `…/18-data-visualization.md` |
|
|
140
|
+
| Search, autocomplete, filters, zero results | `…/19-search-ux.md` |
|
|
141
|
+
| Trust, delight, recovering from errors | `…/20-emotional-design.md` |
|
|
142
|
+
| Tables, sorting, pagination, bulk actions | `…/21-data-tables.md` |
|
|
143
|
+
| Loading, skeletons, optimistic updates, Core Web Vitals | `…/22-performance-ux.md` |
|
|
144
|
+
| Localisation, RTL, `Intl`, plurals | `…/23-internationalization.md` |
|
|
145
|
+
| Voice and multimodal input | `…/24-voice-and-multimodal.md` |
|
|
146
|
+
| Barcodes and QR: scanning, scanner workflows, display | `…/25a-barcode-camera-scanning.md`, `…/25b-barcode-scanner-workflows.md`, `…/25c-barcode-display.md` |
|
|
147
|
+
| Which upstream versions ship here, with file hashes | `upstream/UPSTREAM.json` |
|
|
148
|
+
|
|
149
|
+
`…/` is `upstream/ux-designer/references/`.
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# Third-party work in this skill
|
|
2
|
+
|
|
3
|
+
Both sources are copied unmodified. The exact commit of each, and the sha256 of every file shipped,
|
|
4
|
+
are in `upstream/UPSTREAM.json`; `tests/ux-upstream.test.js` fails if a shipped file drifts from it.
|
|
5
|
+
|
|
6
|
+
## ux-designer
|
|
7
|
+
|
|
8
|
+
- **Source:** https://github.com/szilu/ux-designer-skill
|
|
9
|
+
- **Licence:** MIT, Copyright (c) 2026 Szilárd Hajba. Full text: `upstream/ux-designer/LICENSE`.
|
|
10
|
+
- **What is here:** `upstream/ux-designer/references/` (29 files), copied unmodified.
|
|
11
|
+
`upstream/ux-designer/GUIDE.md` is the upstream `SKILL.md` with its YAML front matter removed so it
|
|
12
|
+
is not discovered as a second skill; the text is unchanged.
|
|
13
|
+
|
|
14
|
+
## ux-usability-foundations
|
|
15
|
+
|
|
16
|
+
- **Source:** https://github.com/hueyexe/frontend-agent-skills (`ux-usability-foundations`)
|
|
17
|
+
- **Licence:** MIT, Copyright (c) 2026 hueyexe. Full text: `upstream/ux-usability-foundations/LICENSE`
|
|
18
|
+
(the repository licence).
|
|
19
|
+
- **What is here:** `upstream/ux-usability-foundations/references/` (4 files), copied unmodified.
|
|
20
|
+
`upstream/ux-usability-foundations/GUIDE.md` is the upstream `SKILL.md` with its YAML front matter
|
|
21
|
+
removed; the text is unchanged.
|
|
22
|
+
|
|
23
|
+
## Written for rsc
|
|
24
|
+
|
|
25
|
+
`SKILL.md` and `references/flows.md` are original to rsc. They route into the upstream material and
|
|
26
|
+
add what neither source covers in depth: mapping a whole application's flows, its lifecycle, its
|
|
27
|
+
roles and the state matrix per screen.
|
|
28
|
+
|
|
29
|
+
## Updating
|
|
30
|
+
|
|
31
|
+
Copy a reviewed checkout over `upstream/<name>/`, strip the front matter from its `SKILL.md` into
|
|
32
|
+
`GUIDE.md`, and regenerate the hashes and commit in `UPSTREAM.json`. Never an automatic download.
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
skill: ux
|
|
2
|
+
|
|
3
|
+
should_trigger:
|
|
4
|
+
- prompt: "Diseña todos los flujos de la app: desde que alguien se registra hasta que envía su primera factura."
|
|
5
|
+
why: "A whole application journey, the thing this skill maps before any screen."
|
|
6
|
+
- prompt: "New users sign up, see an empty dashboard and leave. What should they see instead?"
|
|
7
|
+
why: "The empty account and first value, rows of the lifecycle this skill owns."
|
|
8
|
+
- prompt: "Revisa la usabilidad de nuestro panel antes de la demo: que cualquiera entienda cómo usarlo."
|
|
9
|
+
why: "A usability audit by use, reported by severity, in Spanish."
|
|
10
|
+
- prompt: "Should editing a customer open a modal, a side panel or a full page?"
|
|
11
|
+
why: "A pattern decision driven by the job, from the decision trees this skill routes to."
|
|
12
|
+
- prompt: "The signup form wipes everything when the email is already taken. How should it behave?"
|
|
13
|
+
why: "Error prevention and recovery in a form."
|
|
14
|
+
- prompt: "Our power users complain the app is slow to work with. How do we make it more productive?"
|
|
15
|
+
why: "Expert speed: shortcuts, command search, bulk actions, saved views."
|
|
16
|
+
- prompt: "What states does this list screen need besides the loaded one?"
|
|
17
|
+
why: "The state matrix, the checklist that replaced ui-engineering's five states."
|
|
18
|
+
|
|
19
|
+
should_not_trigger:
|
|
20
|
+
- prompt: "Give our landing page a distinctive look: type, palette, hero picture."
|
|
21
|
+
route_to: "design"
|
|
22
|
+
why: "Visual direction for a page; design runs its engine for that."
|
|
23
|
+
- prompt: "Write the headline and the call to action for the pricing page."
|
|
24
|
+
route_to: "landing-copy"
|
|
25
|
+
why: "The words on a conversion page."
|
|
26
|
+
- prompt: "My useEffect fires twice in development. Why?"
|
|
27
|
+
route_to: "react"
|
|
28
|
+
why: "Framework mechanics, not how the interface should behave for people."
|
|
29
|
+
- prompt: "Prepare our WCAG 2.2 conformance report for the public tender."
|
|
30
|
+
route_to: "accessibility"
|
|
31
|
+
why: "A formal conformance programme, not designing a flow."
|
|
32
|
+
- prompt: "Convert this PDF contract into plain text."
|
|
33
|
+
route_to: "none"
|
|
34
|
+
why: "No interface or flow involved."
|
|
35
|
+
|
|
36
|
+
capability:
|
|
37
|
+
- prompt: "We are building a SaaS for clinics to book appointments. Map the complete flows for the receptionist and the invited doctor, with the states of each screen."
|
|
38
|
+
why: "Forces the flow map, the second role and the state matrix, before any visual work."
|
|
39
|
+
- prompt: "Audit this app by using it: a new account creating a client and sending an invoice. Report by severity with fixes and references."
|
|
40
|
+
why: "Forces the browser walk and the finding format instead of a code-only review."
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
# Flows — the whole application, before any screen
|
|
2
|
+
|
|
3
|
+
Most apps that "feel broken" have good screens and missing steps: nobody designed the empty account,
|
|
4
|
+
the invited member, the failed payment or the way back after a week away. Map the journey first;
|
|
5
|
+
the screens fall out of it.
|
|
6
|
+
|
|
7
|
+
## 1. The flow map
|
|
8
|
+
|
|
9
|
+
One table per job. One row per step. Every row names its screen and the states that screen can be
|
|
10
|
+
in when the person arrives.
|
|
11
|
+
|
|
12
|
+
```
|
|
13
|
+
Person: Office manager · weekly · average domain knowledge
|
|
14
|
+
Job: Send this month's invoice to a client
|
|
15
|
+
Done when: The client has it and the manager can see "Sent" on the invoice
|
|
16
|
+
Risk: Money and a client relationship — sending is not reversible
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
| # | Step (the person's words) | Screen | Primary action | States on arrival | Way back / out |
|
|
20
|
+
| --- | --- | --- | --- | --- | --- |
|
|
21
|
+
| 1 | Find the client | Clients list | Open client | empty, filtered to zero, many | — |
|
|
22
|
+
| 2 | Start the invoice | Client detail | New invoice | no invoices yet, has drafts | Back to list, filters kept |
|
|
23
|
+
| 3 | Fill the lines | Invoice form | Review invoice | draft restored, validation error | Save as draft |
|
|
24
|
+
| 4 | Check before sending | Review | Send invoice | missing client email, over plan limit | Edit |
|
|
25
|
+
| 5 | Know it worked | Invoice detail | — (status visible) | sending, sent, bounced | Back to client |
|
|
26
|
+
|
|
27
|
+
Rules for the map:
|
|
28
|
+
|
|
29
|
+
- **Steps in the person's words,** not the system's ("Find the client", not "Query CRM entity").
|
|
30
|
+
- **Every row has a way back.** A step with no way back is a defect, unless it is the irreversible
|
|
31
|
+
action and it said so first.
|
|
32
|
+
- **Count the core loop.** Clicks and decisions from "I want to do this" to "done". Each one earns its
|
|
33
|
+
place: can it be defaulted, inferred, remembered or skipped? The daily job gets the fewest steps.
|
|
34
|
+
- **No step depends on memory.** If step 4 needs something seen in step 1, step 4 shows it.
|
|
35
|
+
|
|
36
|
+
## 2. The lifecycle — rows people forget
|
|
37
|
+
|
|
38
|
+
Walk every one. A row with no answer is a gap in the design, not an edge case.
|
|
39
|
+
|
|
40
|
+
| Moment | What the person must see |
|
|
41
|
+
| --- | --- |
|
|
42
|
+
| Arrives with no account | What the product does for them, then a sign-up asking for the least it can. |
|
|
43
|
+
| Account just created, nothing exists | An empty state that names the first useful action and shows what it produces. Import or a sample, when that is faster than starting blank. |
|
|
44
|
+
| First value | Proof it worked, and the next most useful step. Not a celebration that blocks the screen. |
|
|
45
|
+
| Daily use | The shortest route to the core job: recent items, saved views, shortcuts, remembered filters. |
|
|
46
|
+
| Near or at a plan limit | A warning before the limit; at it, what is blocked, why, and the one action that unblocks it. Never a silent failure. |
|
|
47
|
+
| No permission | Who can do it and a way to ask them. Actions that this role can never use are hidden, not disabled. |
|
|
48
|
+
| Network lost | Work stays on screen, offline is visible, changes sync when back and say so. |
|
|
49
|
+
| Request fails | What failed, what is safe, input intact, retry in one click. |
|
|
50
|
+
| Long operation | Progress, what is happening, whether they can leave and come back. |
|
|
51
|
+
| Payment fails | What happens to their data and when, and the one action that fixes it. |
|
|
52
|
+
| Coming back after weeks | Things where they left them; what changed while away, if anything did. |
|
|
53
|
+
| Leaving | Export first, then delete; what is removed, what stays, and for how long it can be undone. |
|
|
54
|
+
|
|
55
|
+
## 3. The second role
|
|
56
|
+
|
|
57
|
+
Whoever set the account up is rarely whoever uses it most. Map the flow again for each role that
|
|
58
|
+
exists:
|
|
59
|
+
|
|
60
|
+
- **The invited member:** arrives from an email, has no context, did not choose the product. Their
|
|
61
|
+
first screen is the thing they were invited to, not the generic dashboard.
|
|
62
|
+
- **The admin:** billing, members, roles, security, audit. Rare tasks, high stakes: clarity over
|
|
63
|
+
speed, consequences written out.
|
|
64
|
+
- **The viewer or guest:** sees only what they can act on. No dead buttons.
|
|
65
|
+
- **Support acting as the user,** when the product allows it: clearly marked, never invisible.
|
|
66
|
+
|
|
67
|
+
## 4. Flows every SaaS needs
|
|
68
|
+
|
|
69
|
+
Check each exists and is mapped; most products ship without two or three of them.
|
|
70
|
+
|
|
71
|
+
| Flow | The part that is usually missing |
|
|
72
|
+
| --- | --- |
|
|
73
|
+
| Sign-up and sign-in | Password managers and paste working; magic link or SSO path; the expired-link screen. |
|
|
74
|
+
| Onboarding to first value | Skippable, resumable, disappears once done. See `../upstream/ux-designer/references/16-onboarding.md`. |
|
|
75
|
+
| Invite and join | The invited person's first screen; resending; an expired invitation. |
|
|
76
|
+
| Create, edit, delete the core object | Drafts, autosave or an unsaved-changes guard, undo after delete. |
|
|
77
|
+
| Find (search, filter, sort) | Zero results that suggest a way out; filters kept when coming back from detail. |
|
|
78
|
+
| Bulk work | How many items, what will change, undo or a summary of what failed. |
|
|
79
|
+
| Import and export | Preview and mapping before import; a report of what was skipped and why. |
|
|
80
|
+
| Notifications | Severity matches reality; per-channel preferences. See `../upstream/ux-designer/references/17-notifications.md`. |
|
|
81
|
+
| Settings | Grouped by subject; changes say when they take effect; dangerous ones apart, at the end. |
|
|
82
|
+
| Plan, billing, limits | Current plan and usage visible; upgrade from the point of need; downgrade explains what is lost. |
|
|
83
|
+
| Account and data deletion | Export offered first; the consequence spelled out; a grace period when the product can keep one. |
|
|
84
|
+
|
|
85
|
+
## 5. The state matrix
|
|
86
|
+
|
|
87
|
+
Fill it for every screen in the map. "N/A" is allowed; blank is not.
|
|
88
|
+
|
|
89
|
+
| Screen | Default | Loading | Empty (new) | Empty (filtered) | Partial | Error | Offline | No permission | Overflow | Pending item |
|
|
90
|
+
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
|
|
91
|
+
| Clients list | | | | | | | | | | |
|
|
92
|
+
|
|
93
|
+
What each state needs:
|
|
94
|
+
|
|
95
|
+
- **Loading:** skeleton in the layout of what is coming, after about 300ms so fast loads do not
|
|
96
|
+
flash; progress and cancel past ten seconds.
|
|
97
|
+
- **Empty (new):** why it is empty, the action that fills it, and what it will look like.
|
|
98
|
+
- **Empty (filtered):** the active filters, and a way to clear them. Never the "new account" message.
|
|
99
|
+
- **Partial:** what loaded, what did not, retry for the part that failed.
|
|
100
|
+
- **Error:** what happened in plain words, what is safe, retry; the request id when support needs it.
|
|
101
|
+
- **Offline:** cached data marked as possibly stale; what can still be done.
|
|
102
|
+
- **No permission:** who can grant it, a way to ask.
|
|
103
|
+
- **Overflow:** long names truncated with the full text reachable, many items paginated or
|
|
104
|
+
virtualised with a count, huge numbers formatted.
|
|
105
|
+
- **Pending item:** the row or card marked as working, the rest of the screen usable.
|
|
106
|
+
|
|
107
|
+
## 6. Expert speed
|
|
108
|
+
|
|
109
|
+
The person who uses the product every day is the one who decides whether it is "productive". For
|
|
110
|
+
each daily job, decide:
|
|
111
|
+
|
|
112
|
+
- the keyboard shortcut and where it is shown (menus, a `?` overlay);
|
|
113
|
+
- whether a command search (Cmd/Ctrl+K) reaches it;
|
|
114
|
+
- which bulk action replaces doing it item by item;
|
|
115
|
+
- which view or filter should be saved or remembered;
|
|
116
|
+
- which field can default from the last time.
|
|
117
|
+
|
|
118
|
+
None of these replaces the visible route; they sit on top of it.
|
|
119
|
+
|
|
120
|
+
## 7. Walking the map
|
|
121
|
+
|
|
122
|
+
Before calling the flow done, walk it in a browser twice: once as the new person on an empty
|
|
123
|
+
account, once as the daily user with real-sized data. Keyboard only for one of the walks, phone width
|
|
124
|
+
for the other. Every pause, every "where is…", every re-typed value is a row to fix in the map.
|