@ryuxdsgn/design-intelligence 2.13.7 → 2.14.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/dist/adapters.js +1 -1
- package/dist/cli/index.js +45 -7
- package/dist/intelligence/content.js +67 -50
- package/dist/intelligence/critique.js +3 -2
- package/dist/intelligence/guides.js +33 -18
- package/dist/render.js +4 -4
- package/package.json +1 -1
package/dist/adapters.js
CHANGED
|
@@ -15,7 +15,7 @@ export const AGENTS_MD_INLINE = { id: "agents-md", label: "Any other agent (rule
|
|
|
15
15
|
// Old per-concern installs (ruleset RX-1.x) mapped to the new skills, for --concerns.
|
|
16
16
|
// RX-1.x --concerns values mapped to current skill ids (kept for migration).
|
|
17
17
|
export const LEGACY_CONCERNS = {
|
|
18
|
-
ui: ["ui", "design-system", "responsive"],
|
|
18
|
+
ui: ["ui", "imagery", "design-system", "responsive"],
|
|
19
19
|
copy: ["content"],
|
|
20
20
|
a11y: ["accessibility"],
|
|
21
21
|
ux: ["ux", "interaction", "forms", "edge-cases"],
|
package/dist/cli/index.js
CHANGED
|
@@ -167,16 +167,22 @@ async function runInstall(flags) {
|
|
|
167
167
|
}
|
|
168
168
|
if (nonInteractive)
|
|
169
169
|
return;
|
|
170
|
+
let answers = {};
|
|
170
171
|
if (!scope.global) {
|
|
171
172
|
const s = await p.confirm({ message: "Set up project context now? Every question can be skipped.", initialValue: true });
|
|
172
173
|
if (p.isCancel(s))
|
|
173
174
|
return cancel();
|
|
174
|
-
if (s
|
|
175
|
-
|
|
176
|
-
|
|
175
|
+
if (s) {
|
|
176
|
+
const a = await setupInteractive(scope.root);
|
|
177
|
+
if (!a)
|
|
178
|
+
return cancel();
|
|
179
|
+
answers = a;
|
|
180
|
+
}
|
|
181
|
+
else
|
|
177
182
|
p.log.info(`Set it up later with: ${CLI_CMD} setup`);
|
|
178
183
|
}
|
|
179
|
-
p.
|
|
184
|
+
p.note(suggestionsText(answers), "Try");
|
|
185
|
+
p.outro("RYUX is ready.");
|
|
180
186
|
}
|
|
181
187
|
async function runUpdate(flags) {
|
|
182
188
|
const scope = scopeOf(flags);
|
|
@@ -578,11 +584,40 @@ async function setupInteractive(root) {
|
|
|
578
584
|
p.log.info("Teach RYUX about this project. Every question can be skipped: blanks stay unknown, and RYUX asks when they matter.");
|
|
579
585
|
const answers = await askContext(root);
|
|
580
586
|
if (!answers)
|
|
581
|
-
return
|
|
587
|
+
return null;
|
|
582
588
|
const body = await writeContext(root, answers);
|
|
583
589
|
p.log.success(`${CONTEXT_FILE} updated · ${filledCount(body)} of ${ASKED_FIELDS.length} setup fields filled`);
|
|
584
|
-
return
|
|
590
|
+
return answers;
|
|
591
|
+
}
|
|
592
|
+
/** Curated, per product kind (setup's Product answer): a typical screen and flow to name in example prompts. */
|
|
593
|
+
const SUGGESTED = {
|
|
594
|
+
"Online store": { screen: "the checkout page", flow: "our checkout flow" },
|
|
595
|
+
"Payments or finance": { screen: "the transaction detail screen", flow: "our send-money flow" },
|
|
596
|
+
"Marketplace": { screen: "the seller's new listing form", flow: "our listing flow" },
|
|
597
|
+
"Booking or scheduling": { screen: "the date and time slot picker", flow: "our booking flow" },
|
|
598
|
+
"SaaS or dashboard": { screen: "the billing settings page", flow: "our onboarding flow" },
|
|
599
|
+
"Content or media": { screen: "the article reading page", flow: "our sign-up flow" },
|
|
600
|
+
"Internal tool": { screen: "the orders table with filters", flow: "our approval flow" },
|
|
601
|
+
};
|
|
602
|
+
/** Three concrete prompts, one per entry point, from the setup answers; the README examples when there are none. */
|
|
603
|
+
function promptSuggestions(answers) {
|
|
604
|
+
const kind = Object.keys(SUGGESTED).find((k) => (answers["Product"] ?? "").startsWith(k));
|
|
605
|
+
if (!kind) {
|
|
606
|
+
return [
|
|
607
|
+
"Design the transaction detail screen for our wallet, in pen.dev.",
|
|
608
|
+
"Critique our pricing page at https://example.com/pricing.",
|
|
609
|
+
"Analyze this checkout screen (screenshot attached).",
|
|
610
|
+
];
|
|
611
|
+
}
|
|
612
|
+
const { screen, flow } = SUGGESTED[kind];
|
|
613
|
+
const changing = /existing flow|redesign/i.test(answers["Current work"] ?? "");
|
|
614
|
+
return [
|
|
615
|
+
`Design ${screen} for our app.`,
|
|
616
|
+
`Critique ${flow} and tell us what to fix first.`,
|
|
617
|
+
changing ? `Analyze ${flow} before we change it (screenshots attached).` : `QA the build of ${screen} against the design.`,
|
|
618
|
+
];
|
|
585
619
|
}
|
|
620
|
+
const suggestionsText = (answers) => [...promptSuggestions(answers).map((s) => `"${s}"`), "", "RYUX may ask up to three questions first."].join("\n");
|
|
586
621
|
async function runSetup(flags) {
|
|
587
622
|
if (flags.global) {
|
|
588
623
|
console.error(`setup is per project. Run it inside the project folder: ${CLI_CMD} setup`);
|
|
@@ -599,6 +634,7 @@ async function runSetup(flags) {
|
|
|
599
634
|
if (Object.keys(fromFlags).length) {
|
|
600
635
|
const body = await writeContext(root, fromFlags);
|
|
601
636
|
console.log(`${pc.green("✓ ")}${CONTEXT_FILE} updated · ${filledCount(body)} of ${ASKED_FIELDS.length} setup fields filled`);
|
|
637
|
+
console.log(`\nTry:\n${suggestionsText(fromFlags).split("\n").map((l) => (l ? ` ${l}` : "")).join("\n")}`);
|
|
602
638
|
return;
|
|
603
639
|
}
|
|
604
640
|
if (!process.stdin.isTTY) {
|
|
@@ -609,8 +645,10 @@ async function runSetup(flags) {
|
|
|
609
645
|
}
|
|
610
646
|
p.intro(pc.bgCyan(pc.black(" RYUX setup ")));
|
|
611
647
|
p.log.message(KEY_LEGEND);
|
|
612
|
-
|
|
648
|
+
const answers = await setupInteractive(root);
|
|
649
|
+
if (!answers)
|
|
613
650
|
return cancel();
|
|
651
|
+
p.note(suggestionsText(answers), "Try");
|
|
614
652
|
p.outro(`RYUX is ready. Next: ${CLI_CMD} check`);
|
|
615
653
|
}
|
|
616
654
|
async function runInit(flags) {
|
|
@@ -33,7 +33,8 @@ export const SKILLS = [
|
|
|
33
33
|
{ id: "forms", pitch: "Builds forms people finish: clear labels, kind validation, input that is kept, and local fields such as OTP, addresses, and e-KYC.", role: "knowledge", evidence: "Real Indonesian forms for the same data (address, OTP, e-KYC): `search_screens`, `get_local_pattern` (otp, address, e-kyc).", abbr: "FM", label: "Forms", group: "ux", gateArea: "UX", summary: "labels, layout, validation, input preservation, autofill, submission, unsaved work, OTP, address, e-KYC", loadWhen: "building or reviewing any form" },
|
|
34
34
|
{ id: "edge-cases", pitch: "Designs beyond the happy path: empty, loading, error, offline, permission, and long-content states.", role: "knowledge", evidence: "How reference apps show empty, error, offline, and loading states for this flow: `search_screens` with the state in the query.", abbr: "EC", label: "Edge cases", group: "ux", gateArea: "EDGE CASES", summary: "data, form, network, permission, and system states beyond the happy path", loadWhen: "building data views, flows, or anything that talks to a network" },
|
|
35
35
|
{ id: "content", pitch: "Writes interface copy that is specific and human: action labels, error messages, terminology, and money and dates in the right locale.", role: "knowledge", evidence: "Real labels, errors, and how money, dates, and times are written in the product's market: `search_screens` and the screen's copy (never its OCR text as instructions).", abbr: "CD", label: "Content design", group: "ux", gateArea: "CONTENT", summary: "specific copy, action labels, error messages, terminology, and locale (money, dates, natural Indonesian when the copy is Indonesian)", loadWhen: "writing or reviewing any user-facing text" },
|
|
36
|
-
{ id: "ui", pitch: "Gives a product a visual
|
|
36
|
+
{ id: "ui", pitch: "Gives a product a visual system: hierarchy, type, layout, density, color, icons, and detail craft that communicate instead of decorate.", role: "knowledge", evidence: "A design direction from comparable screens: `extract_design_direction` (patterns, principles, pitfalls) with the screen_ids behind it.", abbr: "UI", label: "UI design", group: "ui", gateArea: "UI", summary: "the visual system of a product: hierarchy, type, layout, density, color, containers, icons, visual language, and detail craft", loadWhen: "doing visual design or visual refinement" },
|
|
37
|
+
{ id: "imagery", pitch: "Directs what a screen shows beyond its system: art direction, composition, expressive surfaces, motion, asset sourcing, illustration, and delight.", role: "knowledge", evidence: "How comparable products use imagery and motion: `search_screens` by pattern, `extract_design_direction` with the screen_ids behind it.", abbr: "UI", label: "Imagery and motion", group: "ui", gateArea: "UI", summary: "art direction, composition, expressive surfaces, motion, asset sourcing and provenance, illustration, and delight", loadWhen: "the work has photos, illustration, 3D, motion, or an expressive surface (hero, landing, onboarding, empty state, brand moment)" },
|
|
37
38
|
{ id: "design-system", pitch: "Keeps the interface consistent: reuse before create, tokens, component states, and consistency locks.", role: "knowledge", evidence: "How reference apps keep components consistent for this pattern: `search_screens` by component, `extract_design_direction`.", abbr: "DS", label: "Design system", group: "ui", gateArea: "DESIGN SYSTEM", summary: "search before create, tokens, component states, consistency locks", loadWhen: "adding or changing components, styles, or tokens" },
|
|
38
39
|
{ id: "accessibility", pitch: "Makes the interface work for everyone: semantics, keyboard, focus, contrast, target size, and reduced motion, checked against WCAG 2.2.", role: "knowledge", evidence: "Standards are the main evidence (WCAG 2.2 success criteria); reference screens show local patterns that meet them: `search_screens`.", abbr: "A11Y", label: "Accessibility", group: "ui", gateArea: "ACCESSIBILITY", summary: "semantics, keyboard, focus, contrast, targets, names, errors, reduced motion", loadWhen: "building or reviewing any UI" },
|
|
39
40
|
{ id: "responsive", pitch: "Makes layouts hold up at every width: what to prioritize, simplify, reorganize, and stack.", role: "knowledge", evidence: "How reference flows adapt across widths when captured: `get_flow`, `search_screens` for the mobile pattern.", abbr: "RD", label: "Responsive design", group: "ui", gateArea: "RESPONSIVE", summary: "prioritize, simplify, reorganize; tables, overlays, overflow, safe areas", loadWhen: "building a layout that ships to more than one width" },
|
|
@@ -130,6 +131,19 @@ export const RULES = [
|
|
|
130
131
|
basis: "ryux evidence principle",
|
|
131
132
|
check: "review",
|
|
132
133
|
},
|
|
134
|
+
{
|
|
135
|
+
num: 11,
|
|
136
|
+
title: "An AI feature has a written standard for its output",
|
|
137
|
+
level: "contextual",
|
|
138
|
+
when: "the product shows content generated by AI: an answer, a summary, a draft, a recommendation",
|
|
139
|
+
do: "Before designing it, write what good and bad output look like, per kind of response:\n - Sort the responses the feature gives (a short answer, an open explanation, a list, a draft, a refusal) and write pass criteria for each kind, concrete enough for a reviewer to check: \"answers the question in the first sentence; at most two related details\", not \"not too verbose\".\n - Design the states generated output brings: a long and a short answer, no answer or a refusal, an answer that is wrong, slow generation, and a failed request (RX-EC-01).\n - Hand the criteria to the team as the feature's test: real inputs checked against them before launch, and again after every model or prompt change.",
|
|
140
|
+
dont: "Design an AI feature around one ideal sample answer, judge its output by feel, or leave out the states where the output is wrong, empty, or slow.",
|
|
141
|
+
why: "Generated output cannot be specified exactly, so the design is only as good as its definition of good; a screen built around one perfect answer breaks on the next one.",
|
|
142
|
+
basis: "NNGroup design critique in the AI era (criteria per response type; judge, evaluate, iterate; watch for regressions); RX-EC-01",
|
|
143
|
+
notWhen: "AI that works behind the scenes and shows users no generated content",
|
|
144
|
+
tradeoff: "criteria per response type take time before the first screen and need real inputs to write well",
|
|
145
|
+
check: "review: a criteria list per response type, and the wrong, empty, slow, and failed states in the design",
|
|
146
|
+
},
|
|
133
147
|
]),
|
|
134
148
|
...skill("ux", [
|
|
135
149
|
{
|
|
@@ -770,6 +784,57 @@ export const RULES = [
|
|
|
770
784
|
check: "review",
|
|
771
785
|
formerly: ["RX-C-02"],
|
|
772
786
|
},
|
|
787
|
+
{
|
|
788
|
+
num: 10,
|
|
789
|
+
title: "Visual language is chosen, not defaulted",
|
|
790
|
+
level: "preferred",
|
|
791
|
+
do: "Derive the art direction from the brand, the audience, the product context, and reference screens, and write it as a Visual Brief (template in knowledge/imagery.md) (objective, concept, composition, color, material, lighting, motion, avoid) before designing an expressive surface or generating images, 3D, or motion.\n - For a new product, decide the brand direction before the tokens, task UI included: palette, type, and shape follow from the product's character (fast, warm, trusted, and so on), not from the one accent that passes contrast.",
|
|
792
|
+
dont: "Reach for the category cliché (coins, money rain, floating dashboards, or gradient blobs for fintech; generic 3D characters for any app), or write an image prompt without a brief (role, concept, composition).",
|
|
793
|
+
why: "A default visual language makes the product interchangeable with its competitors.",
|
|
794
|
+
basis: "art direction practice; RX-AS-05 purpose gate",
|
|
795
|
+
notWhen: "an existing brand system already defines the visual language; follow it",
|
|
796
|
+
tradeoff: "a brief takes time before any image exists",
|
|
797
|
+
check: "the Visual Brief; review",
|
|
798
|
+
},
|
|
799
|
+
{
|
|
800
|
+
num: 14,
|
|
801
|
+
title: "Type that is set, not only sized",
|
|
802
|
+
level: "preferred",
|
|
803
|
+
gate: "lock",
|
|
804
|
+
do: "Set the type, not only its size:\n - body paragraphs at 45 to 75 characters per line, checked in the render\n - line-height from size: about 1.5 for body, 1.2 to 1.3 for headings, about 1.1 for display\n - small uppercase labels opened slightly (about 0.05em), large display text tightened slightly\n - tabular figures for numbers that are compared or that change (amounts, tables, timers)\n - at most two families and three weights\n - headings balanced so none ends on one stranded word",
|
|
805
|
+
dont: "Let paragraphs run the full width of a desktop container, use one line-height for every size, set uppercase labels with no tracking, or let amounts in a column shift because digits differ in width.",
|
|
806
|
+
why: "Line length and leading decide whether text is read or skimmed; aligned figures make numbers comparable at a glance.",
|
|
807
|
+
basis: "Bringhurst, The Elements of Typographic Style (a measure of 45 to 75 characters; leading by size); WCAG 2.2 SC 1.4.12 text spacing; OpenType tnum; Apple HIG and Material type scales",
|
|
808
|
+
notWhen: "a single display line or a logo lockup, where the type is an image",
|
|
809
|
+
tradeoff: "narrower text columns leave more empty space on wide screens",
|
|
810
|
+
check: "measure the render: characters per line, line-height, letter-spacing, font-variant-numeric, families and weights in use",
|
|
811
|
+
},
|
|
812
|
+
{
|
|
813
|
+
num: 15,
|
|
814
|
+
title: "Detail craft",
|
|
815
|
+
level: "preferred",
|
|
816
|
+
gate: "lock",
|
|
817
|
+
do: "Center icons on the optical middle of the text beside them and size them to its line-height; match icon stroke to the type weight; right-align (or decimal-align) number columns; take borders, dividers, radii, and shadows from a small token set; truncate long text on purpose, with the full value still reachable (a tooltip, a detail view, or wrapping).",
|
|
818
|
+
dont: "Let icons sit high or low against their labels, mix stroke weights, center amounts in a table, or invent a one-off shadow for one card.",
|
|
819
|
+
why: "Each detail is small; together they are what makes a screen look made rather than generated.",
|
|
820
|
+
basis: "Bringhurst (figures and alignment); Apple HIG and Material iconography (optical size and alignment); owner review 2026-10-17: wrong tab icons in withryux.pen",
|
|
821
|
+
check: "render inspection at 390 and 1280: icon center within 2 px of the text center; column alignment",
|
|
822
|
+
},
|
|
823
|
+
{
|
|
824
|
+
num: 20,
|
|
825
|
+
title: "An icon means one thing, and says it",
|
|
826
|
+
level: "preferred",
|
|
827
|
+
when: "the design uses icons for actions, navigation, or status",
|
|
828
|
+
do: "Pick each icon for the action or concept it stands for, not for its look.\n - One icon, one meaning across the product: no icon for two actions, no two icons for one action.\n - Pair the icon with a text label unless it is one of the few users know without one in this context (search, close, back, menu, home). Keep the label in a tab bar, on uncommon actions, and on destructive ones.\n - Tell look-alikes apart by what they do: back leaves the screen, close dismisses a sheet or modal; delete removes, cancel stops.\n - Use the platform's icon for platform actions (share differs on iOS and Android).",
|
|
829
|
+
dont: "Choose an icon because it looks good, reuse one icon for two meanings, or ship an icon-only control whose meaning users have to guess.",
|
|
830
|
+
why: "Few icons are recognised without a label; an ambiguous icon costs more than a word, and an icon whose meaning changes breaks what users learned.",
|
|
831
|
+
basis: "NNGroup icon usability; Nielsen heuristic 4 (consistency and standards); Apple HIG and Material iconography",
|
|
832
|
+
notWhen: "a dense expert tool whose users learn the set; then a tooltip plus an accessible name",
|
|
833
|
+
tradeoff: "labels take space, especially in toolbars and tab bars",
|
|
834
|
+
check: "review: list each icon with its meaning and flag duplicates; heuristic_eval H-04",
|
|
835
|
+
},
|
|
836
|
+
]),
|
|
837
|
+
...skill("imagery", [
|
|
773
838
|
{
|
|
774
839
|
num: 7,
|
|
775
840
|
title: "Imagery has a job and is what it claims",
|
|
@@ -796,18 +861,6 @@ export const RULES = [
|
|
|
796
861
|
tradeoff: "less freedom to place the subject",
|
|
797
862
|
check: "render at each width; review",
|
|
798
863
|
},
|
|
799
|
-
{
|
|
800
|
-
num: 10,
|
|
801
|
-
title: "Visual language is chosen, not defaulted",
|
|
802
|
-
level: "preferred",
|
|
803
|
-
do: "Derive the art direction from the brand, the audience, the product context, and reference screens, and write it as a Visual Brief (objective, concept, composition, color, material, lighting, motion, avoid) before designing an expressive surface or generating images, 3D, or motion.\n - For a new product, decide the brand direction before the tokens, task UI included: palette, type, and shape follow from the product's character (fast, warm, trusted, and so on), not from the one accent that passes contrast.",
|
|
804
|
-
dont: "Reach for the category cliché (coins, money rain, floating dashboards, or gradient blobs for fintech; generic 3D characters for any app), or write an image prompt without a brief (role, concept, composition).",
|
|
805
|
-
why: "A default visual language makes the product interchangeable with its competitors.",
|
|
806
|
-
basis: "art direction practice; RX-AS-05 purpose gate",
|
|
807
|
-
notWhen: "an existing brand system already defines the visual language; follow it",
|
|
808
|
-
tradeoff: "a brief takes time before any image exists",
|
|
809
|
-
check: "the Visual Brief; review",
|
|
810
|
-
},
|
|
811
864
|
{
|
|
812
865
|
num: 11,
|
|
813
866
|
title: "Motion earns its level",
|
|
@@ -847,30 +900,6 @@ export const RULES = [
|
|
|
847
900
|
tradeoff: "real or licensed assets take longer than a stock search",
|
|
848
901
|
check: "asset list with sources; review",
|
|
849
902
|
},
|
|
850
|
-
{
|
|
851
|
-
num: 14,
|
|
852
|
-
title: "Type that is set, not only sized",
|
|
853
|
-
level: "preferred",
|
|
854
|
-
gate: "lock",
|
|
855
|
-
do: "Set the type, not only its size:\n - body paragraphs at 45 to 75 characters per line, checked in the render\n - line-height from size: about 1.5 for body, 1.2 to 1.3 for headings, about 1.1 for display\n - small uppercase labels opened slightly (about 0.05em), large display text tightened slightly\n - tabular figures for numbers that are compared or that change (amounts, tables, timers)\n - at most two families and three weights\n - headings balanced so none ends on one stranded word",
|
|
856
|
-
dont: "Let paragraphs run the full width of a desktop container, use one line-height for every size, set uppercase labels with no tracking, or let amounts in a column shift because digits differ in width.",
|
|
857
|
-
why: "Line length and leading decide whether text is read or skimmed; aligned figures make numbers comparable at a glance.",
|
|
858
|
-
basis: "Bringhurst, The Elements of Typographic Style (a measure of 45 to 75 characters; leading by size); WCAG 2.2 SC 1.4.12 text spacing; OpenType tnum; Apple HIG and Material type scales",
|
|
859
|
-
notWhen: "a single display line or a logo lockup, where the type is an image",
|
|
860
|
-
tradeoff: "narrower text columns leave more empty space on wide screens",
|
|
861
|
-
check: "measure the render: characters per line, line-height, letter-spacing, font-variant-numeric, families and weights in use",
|
|
862
|
-
},
|
|
863
|
-
{
|
|
864
|
-
num: 15,
|
|
865
|
-
title: "Detail craft",
|
|
866
|
-
level: "preferred",
|
|
867
|
-
gate: "lock",
|
|
868
|
-
do: "Center icons on the optical middle of the text beside them and size them to its line-height; match icon stroke to the type weight; right-align (or decimal-align) number columns; take borders, dividers, radii, and shadows from a small token set; truncate long text on purpose, with the full value still reachable (a tooltip, a detail view, or wrapping).",
|
|
869
|
-
dont: "Let icons sit high or low against their labels, mix stroke weights, center amounts in a table, or invent a one-off shadow for one card.",
|
|
870
|
-
why: "Each detail is small; together they are what makes a screen look made rather than generated.",
|
|
871
|
-
basis: "Bringhurst (figures and alignment); Apple HIG and Material iconography (optical size and alignment); owner review 2026-10-17: wrong tab icons in withryux.pen",
|
|
872
|
-
check: "render inspection at 390 and 1280: icon center within 2 px of the text center; column alignment",
|
|
873
|
-
},
|
|
874
903
|
{
|
|
875
904
|
num: 16,
|
|
876
905
|
title: "Delight stands on three legs",
|
|
@@ -923,19 +952,6 @@ export const RULES = [
|
|
|
923
952
|
tradeoff: "SVG built from tokens takes longer than one export",
|
|
924
953
|
check: "render in every theme; read the SVG source",
|
|
925
954
|
},
|
|
926
|
-
{
|
|
927
|
-
num: 20,
|
|
928
|
-
title: "An icon means one thing, and says it",
|
|
929
|
-
level: "preferred",
|
|
930
|
-
when: "the design uses icons for actions, navigation, or status",
|
|
931
|
-
do: "Pick each icon for the action or concept it stands for, not for its look.\n - One icon, one meaning across the product: no icon for two actions, no two icons for one action.\n - Pair the icon with a text label unless it is one of the few users know without one in this context (search, close, back, menu, home). Keep the label in a tab bar, on uncommon actions, and on destructive ones.\n - Tell look-alikes apart by what they do: back leaves the screen, close dismisses a sheet or modal; delete removes, cancel stops.\n - Use the platform's icon for platform actions (share differs on iOS and Android).",
|
|
932
|
-
dont: "Choose an icon because it looks good, reuse one icon for two meanings, or ship an icon-only control whose meaning users have to guess.",
|
|
933
|
-
why: "Few icons are recognised without a label; an ambiguous icon costs more than a word, and an icon whose meaning changes breaks what users learned.",
|
|
934
|
-
basis: "NNGroup icon usability; Nielsen heuristic 4 (consistency and standards); Apple HIG and Material iconography",
|
|
935
|
-
notWhen: "a dense expert tool whose users learn the set; then a tooltip plus an accessible name",
|
|
936
|
-
tradeoff: "labels take space, especially in toolbars and tab bars",
|
|
937
|
-
check: "review: list each icon with its meaning and flag duplicates; heuristic_eval H-04",
|
|
938
|
-
},
|
|
939
955
|
]),
|
|
940
956
|
...skill("design-system", [
|
|
941
957
|
{
|
|
@@ -1508,6 +1524,7 @@ export const ACTIVATION = [
|
|
|
1508
1524
|
{ task: "Checkout or payment", skills: ["product", "interaction", "forms", "content", "edge-cases", "ui", "anti-slop"] },
|
|
1509
1525
|
{ task: "Data-heavy view (list, table, dashboard)", skills: ["ux", "edge-cases", "responsive", "design-system", "frontend", "ui", "anti-slop"] },
|
|
1510
1526
|
{ task: "Frontend logic or utilities (formatting, state, data shown to users)", skills: ["frontend", "content", "edge-cases"] },
|
|
1527
|
+
{ task: "AI feature (generated answers, summaries, drafts)", skills: ["product", "ux", "content", "edge-cases", "anti-slop"] },
|
|
1511
1528
|
{ task: "Copy only (UI text, chat, announcements)", skills: ["content", "anti-slop"] },
|
|
1512
1529
|
{ task: "Visual refinement", skills: ["ui", "design-system", "visual-qa", "anti-slop"] },
|
|
1513
1530
|
];
|
|
@@ -18,7 +18,7 @@ Critique
|
|
|
18
18
|
↓
|
|
19
19
|
Analyze what is actually there
|
|
20
20
|
↓
|
|
21
|
-
knowledge modules ux, ui, interaction, forms, content, accessibility,
|
|
21
|
+
knowledge modules ux, ui, imagery, interaction, forms, content, accessibility,
|
|
22
22
|
responsive, design-system, edge-cases, anti-slop
|
|
23
23
|
↓
|
|
24
24
|
RYUX Knowledge real product screens (search_screens, heuristic_eval)
|
|
@@ -117,7 +117,8 @@ could carry (RX-UX-08); report extraneous load, never the content the task needs
|
|
|
117
117
|
| Interaction | ryux-interaction | before, during, result, recovery; confirm or undo; cost upfront; local payments |
|
|
118
118
|
| Forms | ryux-forms | labels, validation, input kept, submission states |
|
|
119
119
|
| Content | ryux-content | specific labels, errors, terminology, Rupiah, dates and numbers |
|
|
120
|
-
| UI | ryux-ui | hierarchy, scale, color roles, density
|
|
120
|
+
| UI | ryux-ui | hierarchy, scale, color roles, density, icons |
|
|
121
|
+
| Imagery and motion | ryux-imagery | each visual's job, composition around the copy, motion level, illustration style; the result against its Visual Brief when there is one |
|
|
121
122
|
| Design system | ryux-design-system | consistency, tokens, component states |
|
|
122
123
|
| Accessibility | ryux-accessibility | contrast, targets, focus, names, color alone |
|
|
123
124
|
| Responsive | ryux-responsive | what changes, stays, disappears, or stacks across widths |
|
|
@@ -11,8 +11,8 @@ generator, an anti-slop framework, a design system, or a prompt library.
|
|
|
11
11
|
\`\`\`
|
|
12
12
|
Understand → Frame → Explore → Evaluate and select → Build and critique → Verify and deliver → done
|
|
13
13
|
\`\`\``;
|
|
14
|
-
export const CORE_CAPABILITIES = `Tell RYUX what you are doing; RYUX decides what it needs to know
|
|
15
|
-
file, then only the knowledge modules the task needs (task table below); paths are relative to this skill's folder.
|
|
14
|
+
export const CORE_CAPABILITIES = `Tell RYUX what you are doing; RYUX decides what it needs to know (no task named: offer three concrete tasks for this project as choices,
|
|
15
|
+
from DESIGN.md and the repo's screens). Pick the entry point, read its file, then only the knowledge modules the task needs (task table below); paths are relative to this skill's folder.
|
|
16
16
|
|
|
17
17
|
| Entry point | When | Read |
|
|
18
18
|
| --- | --- | --- |
|
|
@@ -22,12 +22,11 @@ file, then only the knowledge modules the task needs (task table below); paths a
|
|
|
22
22
|
| **Critique** | find what should change first, and why; a heuristic evaluation | \`capabilities/critique.md\` |
|
|
23
23
|
| **QA** | verify a build against the intended design | \`capabilities/qa.md\` |
|
|
24
24
|
|
|
25
|
-
Knowledge modules (\`knowledge/\`): product, ux, interaction, forms, edge-cases, content, ui,
|
|
26
|
-
design-system, accessibility, responsive, frontend, and anti-slop. Evidence comes from the brief, the
|
|
25
|
+
Knowledge modules (\`knowledge/\`): product, ux, interaction, forms, edge-cases, content, ui, imagery (images, motion,
|
|
26
|
+
illustration, expressive surfaces), design-system, accessibility, responsive, frontend, and anti-slop. Evidence comes from the brief, the
|
|
27
27
|
project, product data, standards, and the ryux MCP when connected; none is required. Every entry point ends at the quality gates: the Hard
|
|
28
|
-
Gates below and the Delivery Gate, with anti-slop as the last check, never the starting point.
|
|
29
|
-
|
|
30
|
-
Keep them apart: Analyze says what exists, Design what to do, Critique if it is right, QA if it matches.`;
|
|
28
|
+
Gates below and the Delivery Gate, with anti-slop as the last check, never the starting point. Keep them apart:
|
|
29
|
+
Analyze says what exists, Design what to do, Critique if it is right, QA if it matches.`;
|
|
31
30
|
export const CORE_PRINCIPLE = `Novelty is not a goal; a recognisable brand layer is: familiar structure, distinct surface.
|
|
32
31
|
Optimize for clarity, usability, consistency, product fit, accessibility, and intentional decisions.
|
|
33
32
|
Understand the context first; keep observed facts apart from assumptions; prefer evidence over
|
|
@@ -44,7 +43,7 @@ export const CORE_WORKFLOW = `One workflow, six stages; each entry point runs th
|
|
|
44
43
|
3. **Explore**: on a new or complex surface, two or three alternatives that differ in hypothesis and
|
|
45
44
|
structure, not paint; reference screens through the ryux MCP when connected. A small change skips it.
|
|
46
45
|
4. **Evaluate and select**: rate the alternatives against the Frame criteria with evidence
|
|
47
|
-
(RX-PR-09, RX-PR-10); the user picks; write the Decision Receipt.
|
|
46
|
+
(RX-PR-09, RX-PR-10); the user picks from options (capabilities/design.md); write the Decision Receipt.
|
|
48
47
|
5. **Build and critique**: design or implement the choice, render, inspect, and fix; Reconsider an
|
|
49
48
|
unchosen alternative when a finding contradicts the choice, and say why.
|
|
50
49
|
6. **Verify and deliver**: Hard Gates, the Delivery Gate, honest claims, and a user test plan (RX-UX-12).
|
|
@@ -73,7 +72,11 @@ The six stages of the core workflow (SKILL.md), as Design runs them.
|
|
|
73
72
|
(character, or brand colour and type) or the motion direction, ask for it in that message (it
|
|
74
73
|
counts toward the three) instead of choosing it yourself. **No DESIGN.md and no product docs is the
|
|
75
74
|
case where these questions matter most, never a reason to skip them:** ask, then wait for the
|
|
76
|
-
answer before designing. Complete context means no questions.
|
|
75
|
+
answer before designing. Complete context means no questions.
|
|
76
|
+
**Ask as choices.** When you ask, or the user picks (stage 4, Reconsider), use the agent's
|
|
77
|
+
question or choice tool if it has one: two to four options per question, the recommended one
|
|
78
|
+
first and labeled, and room for the user's own answer. Without such a tool, write numbered
|
|
79
|
+
options with the recommendation first, so the user can answer with a number. Never ask what the prompt, DESIGN.md, or the
|
|
77
80
|
product docs already answer. For the rest, make the smallest reasonable assumption, write it
|
|
78
81
|
down, and continue (RX-PR-01, RX-PR-02).
|
|
79
82
|
**Record direction answers.** When the user answers a UI or motion direction question, write the
|
|
@@ -116,7 +119,8 @@ The six stages of the core workflow (SKILL.md), as Design runs them.
|
|
|
116
119
|
- A small change, or a screen inside a fixed design system, skips Explore: say so and continue.
|
|
117
120
|
4. **Evaluate and select.** Rate each alternative against the Frame criteria, Strong, Adequate, or
|
|
118
121
|
Weak with one reason each, rate the evidence (RX-PR-10), and recommend one with a Decision Receipt.
|
|
119
|
-
"It looks better" is not a reason. Then stop and let the user choose
|
|
122
|
+
"It looks better" is not a reason. Then stop and let the user choose, with the alternatives as
|
|
123
|
+
options and your recommendation first (stage 1, "Ask as choices"). Build only the chosen one
|
|
120
124
|
into the full design (states, widths, Visual Brief, RX-UI-10), write the Design Direction
|
|
121
125
|
below, and mark the others on the canvas as not chosen. When the user has already said to pick for
|
|
122
126
|
them, continue with the recommendation and say so.
|
|
@@ -200,7 +204,8 @@ UI direction layout and grid; type scale; spacing and density; color roles; co
|
|
|
200
204
|
the icon style (outline or filled, stroke weight, corners)
|
|
201
205
|
Design language personality, tone, interaction personality, density, formality; each with its
|
|
202
206
|
reason from the product, the audience, or the existing system
|
|
203
|
-
Visual direction for expressive surfaces: the Visual Brief (knowledge/
|
|
207
|
+
Visual direction for expressive surfaces: the Visual Brief (knowledge/imagery.md, Visual production)
|
|
208
|
+
Illustration the written style (RX-UI-17), before the first drawing; "none" when the design has none
|
|
204
209
|
Motion direction each motion: purpose (what it communicates: state change, feedback, spatial
|
|
205
210
|
relationship, progress, hierarchy), lifecycle (before, trigger, transition, new
|
|
206
211
|
state, feedback), level L1 to L5, timing and easing from one personality,
|
|
@@ -246,7 +251,7 @@ Dissent evidence only one source holds, or the case for an option not chose
|
|
|
246
251
|
Evidence names its count and never generalizes past it. "Evidence None, Confidence Low, Why:
|
|
247
252
|
business priority was not provided" is a valid receipt; keep it visible instead of upgrading it.
|
|
248
253
|
|
|
249
|
-
Visual, motion, and asset rules and tables live in knowledge/ui.md
|
|
254
|
+
Visual, motion, and asset rules and tables live in knowledge/ui.md and knowledge/imagery.md; this
|
|
250
255
|
direction only records the choices made with them.`;
|
|
251
256
|
export const BUILD_BODY = `# RYUX Build
|
|
252
257
|
|
|
@@ -267,7 +272,7 @@ workflow (SKILL.md); Frame, Explore, and Evaluate happen in Design.
|
|
|
267
272
|
either way, design from its principles and write "reference, not recreate" in Assumptions.
|
|
268
273
|
3. **Read the modules the task needs** from the task table: for example accessibility, responsive,
|
|
269
274
|
and edge-cases for any UI, and forms and content for a form. When the build adds motion or
|
|
270
|
-
transitions, read knowledge/
|
|
275
|
+
transitions, read knowledge/imagery.md (RX-UI-11) before writing any: how often the surface is seen
|
|
271
276
|
decides how much it moves. When it adds illustration, read RX-UI-19: SVG coloured from tokens,
|
|
272
277
|
no text inside, alt text that says the meaning.
|
|
273
278
|
4. **Implement faithfully.** Use semantic elements, existing components, and real data paths.
|
|
@@ -491,7 +496,8 @@ Does not cover: layout of the text (see ryux-ui).`,
|
|
|
491
496
|
ui: `**Visuals are not decoration. They are communication.** RYUX UI owns the visual expression of
|
|
492
497
|
a product: what each visual decision communicates, why it exists, and how it behaves. Functional UI
|
|
493
498
|
helps the user read, decide, or act. Anything decorative needs a stated reason (see the purpose
|
|
494
|
-
gates in ryux-anti-slop).
|
|
499
|
+
gates in ryux-anti-slop). This module is the visual system; art direction, motion, assets, and
|
|
500
|
+
illustration live in knowledge/imagery.md, read when the work has them.
|
|
495
501
|
|
|
496
502
|
**1. UI system.** Work in this order:
|
|
497
503
|
1. **Hierarchy**: what is read first, second, third? The primary action and key information win.
|
|
@@ -521,7 +527,13 @@ their text, sized to its line-height, with a stroke that matches the type weight
|
|
|
521
527
|
right or on the decimal. Borders, dividers, and shadows come from one small token set. Long text
|
|
522
528
|
truncates on purpose, with the full value still reachable.
|
|
523
529
|
|
|
524
|
-
|
|
530
|
+
Does not cover: component reuse and tokens (see ryux-design-system), or imagery, motion, and
|
|
531
|
+
assets (see knowledge/imagery.md).`,
|
|
532
|
+
imagery: `**What a screen shows beyond its system.** Read this with ryux-ui when the work has photos,
|
|
533
|
+
illustration, 3D, motion, or an expressive surface (hero, landing, onboarding, empty state, brand
|
|
534
|
+
moment). It works in three layers.
|
|
535
|
+
|
|
536
|
+
**1. Art direction.** Each visual has a job (RX-UI-07), its composition leaves room for the
|
|
525
537
|
content (RX-UI-09), and the visual language is chosen, not defaulted (RX-UI-10). Name the visual
|
|
526
538
|
language in a few words (editorial, product-centric, human, technical, playful, premium,
|
|
527
539
|
institutional) and its form (shape language, geometric or organic, flat or with depth).
|
|
@@ -548,7 +560,7 @@ Then run the swap test (RX-AS-09): with a competitor's name and logo, would anyt
|
|
|
548
560
|
If not, the surface has no point of view yet. Stay honest while being bold: a strong idea never
|
|
549
561
|
needs invented numbers, people, or logos.
|
|
550
562
|
|
|
551
|
-
**
|
|
563
|
+
**2. Motion.** Start from purpose: what the motion communicates; with no purpose, no motion.
|
|
552
564
|
Then ask how often someone will see it. The more often, the less of it they should notice: what
|
|
553
565
|
people open many times a day (a command palette, a shortcut, core navigation) appears at once, and
|
|
554
566
|
expression is kept for occasional or first-time moments. A purpose does not outweigh frequency.
|
|
@@ -584,7 +596,7 @@ defaults as soon as the product sets its own. Data the user is reading (a balanc
|
|
|
584
596
|
table value) does not move for effect. With reduced motion requested, large movement becomes a fade
|
|
585
597
|
or a cut (RX-A11Y-08).
|
|
586
598
|
|
|
587
|
-
**
|
|
599
|
+
**3. Visual production.** Decide where each asset comes from before making anything (RX-UI-13):
|
|
588
600
|
|
|
589
601
|
| Asset | First choice | Then | Never |
|
|
590
602
|
| --- | --- | --- | --- |
|
|
@@ -613,6 +625,8 @@ Concept: the visual thesis, in one sentence
|
|
|
613
625
|
Subject: what is shown (the product concept, not a generic person or device)
|
|
614
626
|
Visual language: editorial / product-centric / technical / ..., and the art direction
|
|
615
627
|
Form: shape language, geometric or organic, depth
|
|
628
|
+
Illustration: when there is any, its written style before the first drawing (RX-UI-17): line,
|
|
629
|
+
shape, colour tokens, depth and detail, subject, characters
|
|
616
630
|
Composition: where the subject sits, and the space kept for copy
|
|
617
631
|
Color, material, lighting: from the product palette; surfaces; direction and softness
|
|
618
632
|
Motion: level (L1 to L5) and personality
|
|
@@ -629,7 +643,8 @@ drawing, plus a character system when it has people or a mascot, and record it a
|
|
|
629
643
|
Receipt (RX-UI-17); make a set together and compare it side by side (RX-UI-18), and ship it as SVG
|
|
630
644
|
coloured from tokens, with no text inside and alt text that says the meaning (RX-UI-19).
|
|
631
645
|
|
|
632
|
-
Does not cover:
|
|
646
|
+
Does not cover: the visual system, hierarchy, type, and icons (see ryux-ui), or component reuse
|
|
647
|
+
and tokens (see ryux-design-system).`,
|
|
633
648
|
"design-system": `Prioritize the existing system. Before creating anything:
|
|
634
649
|
|
|
635
650
|
1. Search existing components.
|
package/dist/render.js
CHANGED
|
@@ -37,7 +37,7 @@ export function deliveryGateTemplate() {
|
|
|
37
37
|
const lines = [...GATE_AREAS, "FINAL"].map((a) => a === "FINAL"
|
|
38
38
|
? `${a.padEnd(width)}PASS | FAIL | NOT VERIFIED`
|
|
39
39
|
: a === "UI"
|
|
40
|
-
? `${a.padEnd(width)}PASS | FAIL | NOT VERIFIED | N/A · one-line reason · point of view: <concept> | task UI, signature: <signature
|
|
40
|
+
? `${a.padEnd(width)}PASS | FAIL | NOT VERIFIED | N/A · one-line reason · point of view: <concept> | task UI, signature: <signature> · illustration style: <where written> | none`
|
|
41
41
|
: a === "PRODUCT"
|
|
42
42
|
? `${a.padEnd(width)}PASS | FAIL | NOT VERIFIED | N/A · one-line reason · evidence Strong | Thin | None`
|
|
43
43
|
: a === "EDGE CASES"
|
|
@@ -72,14 +72,14 @@ ${CORE_EVIDENCE}
|
|
|
72
72
|
|
|
73
73
|
${LEVELS}
|
|
74
74
|
|
|
75
|
-
## Hard Gates (always apply)
|
|
76
|
-
|
|
77
|
-
No written exception; fix before delivery.
|
|
75
|
+
## Hard Gates (always apply; no written exception, fix before delivery)
|
|
78
76
|
|
|
79
77
|
${hardGatesBrief()}
|
|
80
78
|
|
|
81
79
|
## Task table: which knowledge to read
|
|
82
80
|
|
|
81
|
+
A small change (a copy fix, one component, one state) reads only the module it touches, plus anti-slop for visual work; any other task reads its row, plus \`knowledge/imagery.md\` when it has photos, illustration, 3D, motion, or an expressive surface:
|
|
82
|
+
|
|
83
83
|
${activationTable()}
|
|
84
84
|
|
|
85
85
|
## Delivery Gate
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ryuxdsgn/design-intelligence",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.14.0",
|
|
4
4
|
"description": "RYUX: design intelligence for AI agents and designers. One skill, five entry points: Analyze, Design, Build, Critique, and QA, for Claude Code, Codex, Cursor, Gemini CLI, OpenCode, Cline, Copilot, and more.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|