foundry-design 0.2.0-beta.16 → 0.2.0-beta.18
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 +11 -4
- package/dist/indexer.d.ts.map +1 -1
- package/dist/indexer.js +580 -0
- package/dist/indexer.js.map +1 -1
- package/dist/release.d.ts +3 -3
- package/dist/release.js +1 -1
- package/dist/skill/foundry-design-control/SKILL.md +21 -5
- package/dist/skill/foundry-design-control/references/component-workshop.md +46 -0
- package/dist/skill/foundry-design-control/references/design-branches.md +47 -0
- package/dist/skill/foundry-design-control/references/design-system-intelligence.md +40 -0
- package/dist/skill/foundry-design-control/references/motion-studio.md +101 -0
- package/dist/skill/foundry-design-control/references/portable-branch-records.md +38 -0
- package/dist/skill/foundry-design-control/references/responsive-design-lab.md +34 -0
- package/dist/skill/foundry-design-control/references/typography-studio.md +14 -0
- package/dist/skill/foundry-design-control/references/visual-agent-conversation.md +14 -0
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -2,11 +2,15 @@
|
|
|
2
2
|
|
|
3
3
|
Foundry is a local-first precision design workbench for Codex, Cursor, and Claude Code. It lets design engineers manipulate rendered interface elements, resolve each gesture to the right project-native source intent, review one structured change batch, and verify the rebuilt result across recorded states.
|
|
4
4
|
|
|
5
|
+
Responsive Design Lab links one live selection across native mobile, tablet, desktop, current, and custom viewport contexts. It exposes real breakpoint transitions, overflow, clipping, awkward wrapping, and temporary browser zoom, text-scale, and long-content stress tests without changing saved product state.
|
|
6
|
+
|
|
7
|
+
Design Branches keeps parallel visual directions isolated inside one local session. Teams can switch and compare rendered alternatives, combine selected decisions, preserve rejection rationale, and explicitly promote one direction into Review and apply without changing source early.
|
|
8
|
+
|
|
5
9
|
## Beta installation
|
|
6
10
|
|
|
7
11
|
Foundry is distributed through npm, so testers do not need GitHub access.
|
|
8
12
|
|
|
9
|
-
> **
|
|
13
|
+
> **Current public beta:** `0.2.0-beta.17`. Both npm `latest` and `beta` resolve to this release.
|
|
10
14
|
|
|
11
15
|
Full documentation is available at [withfoundry.ai](https://withfoundry.ai).
|
|
12
16
|
|
|
@@ -137,7 +141,7 @@ If an npm mirror or existing `npx` cache reports an old tag, bypass it with a te
|
|
|
137
141
|
|
|
138
142
|
```bash
|
|
139
143
|
FOUNDRY_NPX_CACHE="$(mktemp -d)"
|
|
140
|
-
npx --yes --prefer-online --registry=https://registry.npmjs.org --cache "$FOUNDRY_NPX_CACHE" --package=foundry-design@0.2.0-beta.
|
|
144
|
+
npx --yes --prefer-online --registry=https://registry.npmjs.org --cache "$FOUNDRY_NPX_CACHE" --package=foundry-design@0.2.0-beta.17 foundry-design
|
|
141
145
|
```
|
|
142
146
|
|
|
143
147
|
The beta supports Node.js 20 or newer. Read the [local-first safety model](https://withfoundry.ai/#safety) before using it with sensitive work.
|
|
@@ -154,7 +158,7 @@ Foundry remains local-first. Installing the plugin does not create an account, e
|
|
|
154
158
|
|
|
155
159
|
### Cursor one-click connection
|
|
156
160
|
|
|
157
|
-
[Add the Foundry MCP bridge to Cursor](cursor://anysphere.cursor-deeplink/mcp/install?name=foundry-design-control&config=
|
|
161
|
+
[Add the Foundry MCP bridge to Cursor](cursor://anysphere.cursor-deeplink/mcp/install?name=foundry-design-control&config=eyJjb21tYW5kIjoibnB4IiwiYXJncyI6WyIteSIsIi0tcHJlZmVyLW9ubGluZSIsImZvdW5kcnktZGVzaWduLW1jcC1zZXJ2ZXJAMC4yLjAtYmV0YS4xNiJdLCJlbnYiOnsiRk9VTkRSWV9ERVNJR05fUlVOVElNRV9VUkwiOiJodHRwOi8vMTI3LjAuMC4xOjQzODcifX0%3D), then run `npx foundry-design` inside the project. The repository's Cursor plugin additionally bundles the Foundry skill and session-start hook for marketplace distribution.
|
|
158
162
|
|
|
159
163
|
## Current capabilities
|
|
160
164
|
|
|
@@ -163,13 +167,16 @@ Foundry remains local-first. Installing the plugin does not create an account, e
|
|
|
163
167
|
- A searchable, collapsible, virtualized live layer hierarchy with mapped-source context, Shadow DOM traversal, drag reordering, and selection persistence across HMR
|
|
164
168
|
- Multi-selection, measured spacing annotations, sibling-aware resize snapping, keyboard nudging, alignment, distribution, and preview undo/redo
|
|
165
169
|
- A revisioned local design graph for CSS tokens, components, Storybook variants, breakpoints, themes, states, and motion presets
|
|
170
|
+
- A Design System workspace that resolves semantic alias chains, surfaces broken and circular references, traces native tokens from definition to indexed usages, groups recurring literals into existing-token-first promotion plans, and sends exact source refactors through Review without changing source automatically
|
|
166
171
|
- Semantic source-mapping choices that block ambiguous changes until the user selects the intended implementation
|
|
167
172
|
- Fixed, hug, fill, and min/max sizing; flex and grid flow; linked spacing; aspect ratio; overflow; and positional controls
|
|
168
|
-
- Project-native spacing, radius, typography, and color choices with token-only filtering, exact token
|
|
173
|
+
- Project-native spacing, radius, typography, and color choices with token-only filtering, exact and nearest-token ranking, component variants, type presets, gradients, opacity, and live contrast guidance
|
|
169
174
|
- Layout, typography, color, content, asset, accessibility, responsive, and motion controls
|
|
170
175
|
- Before/after toggles, continuous comparison scrubbing, side-by-side source comparison, isolation, per-element reset, keyboard shortcuts, and a searchable command palette
|
|
171
176
|
- Design Health scans for contrast, overflow and clipping, touch targets, accessible names, reduced-motion coverage, and project spacing consistency, with evidence, intentional-issue ignores, and safe corrections routed into review
|
|
172
177
|
- An in-app state workbench with real viewport frames, theme switching, forced interaction states, motion controls, and contextual verification
|
|
178
|
+
- A dedicated Motion Studio for live CSS and Web Animation discovery, preview-only transport, timeline scrubbing, keyframe editing, complete timing controls, performance classification, and reduced-motion review
|
|
179
|
+
- Isolated Design Branches with fixed-viewport comparison, selective composition, rejection notes, explicit promotion into the source-ready review ledger, and portable chosen or rejected decision records with source-aware compatibility, import, export, restore, removal, and explicit Design Memory linkage
|
|
173
180
|
- Persistent, coalescing change ledger with JSON and consolidated prompt export
|
|
174
181
|
- Center-workspace review with editable approved batches, grouped targets, and unresolved-target blocking
|
|
175
182
|
- Persistent Apply with agent runs across Codex, Cursor, and Claude Code through MCP
|
package/dist/indexer.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"indexer.d.ts","sourceRoot":"","sources":["../src/indexer.ts"],"names":[],"mappings":"AAGA,OAAO,
|
|
1
|
+
{"version":3,"file":"indexer.d.ts","sourceRoot":"","sources":["../src/indexer.ts"],"names":[],"mappings":"AAGA,OAAO,EAUL,KAAK,kBAAkB,EAExB,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAqX3D,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,oBAAoB,GAAG,SAAS,EACxC,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,kBAAkB,CAAC,CAyd7B"}
|
package/dist/indexer.js
CHANGED
|
@@ -39,6 +39,290 @@ function tokenCategory(name, value) {
|
|
|
39
39
|
return 'size';
|
|
40
40
|
return 'other';
|
|
41
41
|
}
|
|
42
|
+
function declarationCategory(property, value) {
|
|
43
|
+
const name = property.toLowerCase();
|
|
44
|
+
if (/shadow/.test(name))
|
|
45
|
+
return 'shadow';
|
|
46
|
+
if (/border.*radius|radius/.test(name))
|
|
47
|
+
return 'radius';
|
|
48
|
+
if (/font|line-height|letter-spacing|tracking/.test(name))
|
|
49
|
+
return 'typography';
|
|
50
|
+
if (/transition|animation|duration|easing/.test(name))
|
|
51
|
+
return 'motion';
|
|
52
|
+
if (/gap|padding|margin|inset/.test(name))
|
|
53
|
+
return 'spacing';
|
|
54
|
+
if (/color|background|fill|stroke/.test(name) && /#|rgb|hsl|oklch|color\(/i.test(value))
|
|
55
|
+
return 'color';
|
|
56
|
+
if (/width|height|size/.test(name) && /-?[\d.]+(?:px|rem|em|%|vh|vw)/i.test(value))
|
|
57
|
+
return 'size';
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
function comparable(value) {
|
|
61
|
+
return value
|
|
62
|
+
.trim()
|
|
63
|
+
.toLowerCase()
|
|
64
|
+
.replace(/\s*!important\s*$/, '')
|
|
65
|
+
.replaceAll(' ', '');
|
|
66
|
+
}
|
|
67
|
+
function numericValue(value) {
|
|
68
|
+
const match = /^(-?[\d.]+)(px|rem|em|ms|s|%)$/i.exec(comparable(value));
|
|
69
|
+
return match ? { amount: Number(match[1]), unit: match[2].toLowerCase() } : null;
|
|
70
|
+
}
|
|
71
|
+
function closeNumericToken(value, tokens) {
|
|
72
|
+
const parsed = numericValue(value);
|
|
73
|
+
if (!parsed)
|
|
74
|
+
return undefined;
|
|
75
|
+
return tokens
|
|
76
|
+
.map((token) => ({ token, parsed: numericValue(token.value) }))
|
|
77
|
+
.filter((entry) => entry.parsed?.unit === parsed.unit)
|
|
78
|
+
.map((entry) => ({ ...entry, distance: Math.abs(entry.parsed.amount - parsed.amount) }))
|
|
79
|
+
.filter((entry) => entry.distance > 0 && entry.distance <= Math.max(2, Math.abs(parsed.amount) * 0.25))
|
|
80
|
+
.sort((a, b) => a.distance - b.distance)[0]?.token;
|
|
81
|
+
}
|
|
82
|
+
function tokenComparableValue(token) {
|
|
83
|
+
return token.resolvedValue ?? token.value;
|
|
84
|
+
}
|
|
85
|
+
function aliasTarget(value) {
|
|
86
|
+
return /^var\(\s*(--[\w-]+)(?:\s*,[^)]*)?\s*\)$/.exec(value.trim())?.[1];
|
|
87
|
+
}
|
|
88
|
+
function resolveTokenAliases(tokens) {
|
|
89
|
+
const resolve = (token, trail = []) => {
|
|
90
|
+
const targetName = aliasTarget(token.value);
|
|
91
|
+
if (!targetName)
|
|
92
|
+
return { aliasChain: [token.name], aliasStatus: 'direct', resolvedValue: token.value };
|
|
93
|
+
if (trail.includes(token.name)) {
|
|
94
|
+
return { aliasChain: [...trail, token.name], aliasStatus: 'circular' };
|
|
95
|
+
}
|
|
96
|
+
const target = tokens.get(targetName);
|
|
97
|
+
if (!target)
|
|
98
|
+
return { aliasChain: [token.name, targetName], aliasStatus: 'broken' };
|
|
99
|
+
const resolved = resolve(target, [...trail, token.name]);
|
|
100
|
+
return {
|
|
101
|
+
aliasChain: [token.name, ...resolved.aliasChain.filter((name) => name !== token.name)],
|
|
102
|
+
aliasStatus: resolved.aliasStatus === 'direct' ? 'resolved' : resolved.aliasStatus,
|
|
103
|
+
resolvedValue: resolved.resolvedValue,
|
|
104
|
+
};
|
|
105
|
+
};
|
|
106
|
+
for (const token of tokens.values()) {
|
|
107
|
+
const targetName = aliasTarget(token.value);
|
|
108
|
+
if (targetName) {
|
|
109
|
+
token.aliasOfTokenName = targetName;
|
|
110
|
+
const target = tokens.get(targetName);
|
|
111
|
+
token.aliasOfTokenId = target?.id;
|
|
112
|
+
if (token.category === 'other' && target)
|
|
113
|
+
token.category = target.category;
|
|
114
|
+
}
|
|
115
|
+
Object.assign(token, resolve(token));
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
function promotionTokenName(category, property, value) {
|
|
119
|
+
const propertySlug = property
|
|
120
|
+
.toLowerCase()
|
|
121
|
+
.replace(/[^a-z0-9]+/g, '-')
|
|
122
|
+
.replace(/^-|-$/g, '');
|
|
123
|
+
const valueSlug = value
|
|
124
|
+
.toLowerCase()
|
|
125
|
+
.replace(/[^a-z0-9.]+/g, '-')
|
|
126
|
+
.replaceAll('.', '-')
|
|
127
|
+
.replace(/^-|-$/g, '')
|
|
128
|
+
.slice(0, 24);
|
|
129
|
+
return `--${category}-${propertySlug || 'value'}${valueSlug ? `-${valueSlug}` : ''}`;
|
|
130
|
+
}
|
|
131
|
+
function objectNumber(source, property) {
|
|
132
|
+
const match = new RegExp(`\\b${property}\\s*:\\s*(-?[\\d.]+)`).exec(source);
|
|
133
|
+
const value = Number(match?.[1]);
|
|
134
|
+
return Number.isFinite(value) ? value : undefined;
|
|
135
|
+
}
|
|
136
|
+
function objectString(source, property) {
|
|
137
|
+
const quoted = new RegExp(`\\b${property}\\s*:\\s*['\"]([^'\"]+)['\"]`).exec(source);
|
|
138
|
+
if (quoted?.[1])
|
|
139
|
+
return quoted[1];
|
|
140
|
+
const array = new RegExp(`\\b${property}\\s*:\\s*\\[([^\\]]+)\\]`).exec(source);
|
|
141
|
+
if (!array?.[1])
|
|
142
|
+
return undefined;
|
|
143
|
+
const values = array[1]
|
|
144
|
+
.split(',')
|
|
145
|
+
.map((value) => Number(value.trim()))
|
|
146
|
+
.filter(Number.isFinite);
|
|
147
|
+
return values.length === 4 ? `cubic-bezier(${values.join(', ')})` : undefined;
|
|
148
|
+
}
|
|
149
|
+
function nativeMotionPresets(file, content) {
|
|
150
|
+
const presets = [];
|
|
151
|
+
const push = (adapter, label, sourceProperty, index, body) => {
|
|
152
|
+
const seconds = adapter !== 'react-spring';
|
|
153
|
+
const duration = objectNumber(body, 'duration');
|
|
154
|
+
const delay = objectNumber(body, 'delay');
|
|
155
|
+
const easing = objectString(body, adapter === 'gsap' ? 'ease' : 'ease') ?? objectString(body, 'easing');
|
|
156
|
+
const configuration = Object.fromEntries([
|
|
157
|
+
'type',
|
|
158
|
+
'mass',
|
|
159
|
+
'stiffness',
|
|
160
|
+
'damping',
|
|
161
|
+
'tension',
|
|
162
|
+
'friction',
|
|
163
|
+
'velocity',
|
|
164
|
+
'repeat',
|
|
165
|
+
'repeatType',
|
|
166
|
+
'yoyo',
|
|
167
|
+
]
|
|
168
|
+
.map((property) => [property, objectNumber(body, property) ?? objectString(body, property)])
|
|
169
|
+
.filter((entry) => entry[1] != null));
|
|
170
|
+
presets.push({
|
|
171
|
+
id: stableId('mot', `${file}:${index}:${adapter}`),
|
|
172
|
+
label,
|
|
173
|
+
duration: duration == null ? undefined : seconds ? duration * 1000 : duration,
|
|
174
|
+
delay: delay == null ? undefined : seconds ? delay * 1000 : delay,
|
|
175
|
+
easing,
|
|
176
|
+
adapter,
|
|
177
|
+
sourceProperty,
|
|
178
|
+
configuration,
|
|
179
|
+
source: { file, line: lineAt(content, index) },
|
|
180
|
+
evidence: [`${adapter} source import`, `${sourceProperty} authoring site`],
|
|
181
|
+
});
|
|
182
|
+
};
|
|
183
|
+
if (/from\s+['\"](?:motion\/react|framer-motion)['\"]/.test(content)) {
|
|
184
|
+
for (const match of content.matchAll(/<motion\.([A-Za-z][\w]*)\b([\s\S]*?)>/g)) {
|
|
185
|
+
const body = match[2] ?? '';
|
|
186
|
+
if (!/\b(?:animate|transition|variants)\s*=/.test(body))
|
|
187
|
+
continue;
|
|
188
|
+
push('motion', `Motion ${match[1]}`, 'transition', match.index ?? 0, body);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
if (/from\s+['\"]gsap['\"]|require\(['\"]gsap['\"]\)/.test(content)) {
|
|
192
|
+
for (const match of content.matchAll(/gsap\.(to|from|fromTo|set)\s*\(([\s\S]{0,1200}?)\)\s*[;,]/g)) {
|
|
193
|
+
push('gsap', `GSAP ${match[1]} tween`, 'vars', match.index ?? 0, match[2] ?? '');
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
if (/from\s+['\"](?:@react-spring\/web|react-spring)['\"]/.test(content)) {
|
|
197
|
+
for (const match of content.matchAll(/\b(useSpring|useTransition|useTrail)\s*\(([\s\S]{0,1200}?)\)\s*[;,]/g)) {
|
|
198
|
+
push('react-spring', `React Spring ${match[1]}`, match[1] === 'useSpring' ? 'config' : (match[1] ?? 'config'), match.index ?? 0, match[2] ?? '');
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
return presets;
|
|
202
|
+
}
|
|
203
|
+
function balancedObject(content, openIndex) {
|
|
204
|
+
if (content[openIndex] !== '{')
|
|
205
|
+
return null;
|
|
206
|
+
let depth = 0;
|
|
207
|
+
let quote = '';
|
|
208
|
+
let escaped = false;
|
|
209
|
+
for (let index = openIndex; index < content.length; index += 1) {
|
|
210
|
+
const char = content[index];
|
|
211
|
+
if (quote) {
|
|
212
|
+
if (escaped)
|
|
213
|
+
escaped = false;
|
|
214
|
+
else if (char === '\\')
|
|
215
|
+
escaped = true;
|
|
216
|
+
else if (char === quote)
|
|
217
|
+
quote = '';
|
|
218
|
+
continue;
|
|
219
|
+
}
|
|
220
|
+
if (char === '"' || char === "'" || char === '`') {
|
|
221
|
+
quote = char;
|
|
222
|
+
continue;
|
|
223
|
+
}
|
|
224
|
+
if (char === '{')
|
|
225
|
+
depth += 1;
|
|
226
|
+
if (char === '}')
|
|
227
|
+
depth -= 1;
|
|
228
|
+
if (depth === 0)
|
|
229
|
+
return { body: content.slice(openIndex + 1, index), start: openIndex, end: index };
|
|
230
|
+
}
|
|
231
|
+
return null;
|
|
232
|
+
}
|
|
233
|
+
function objectProperty(content, property, offset = 0) {
|
|
234
|
+
const match = new RegExp(`(?:^|[,\\s])${property}\\s*:\\s*\\{`, 'm').exec(content.slice(offset));
|
|
235
|
+
if (!match)
|
|
236
|
+
return null;
|
|
237
|
+
const openIndex = offset + match.index + match[0].lastIndexOf('{');
|
|
238
|
+
return balancedObject(content, openIndex);
|
|
239
|
+
}
|
|
240
|
+
function topLevelObjectKeys(content) {
|
|
241
|
+
const keys = [];
|
|
242
|
+
let depth = 0;
|
|
243
|
+
let quote = '';
|
|
244
|
+
let escaped = false;
|
|
245
|
+
for (let index = 0; index < content.length; index += 1) {
|
|
246
|
+
const char = content[index];
|
|
247
|
+
if (quote) {
|
|
248
|
+
if (escaped)
|
|
249
|
+
escaped = false;
|
|
250
|
+
else if (char === '\\')
|
|
251
|
+
escaped = true;
|
|
252
|
+
else if (char === quote)
|
|
253
|
+
quote = '';
|
|
254
|
+
continue;
|
|
255
|
+
}
|
|
256
|
+
if (char === '"' || char === "'" || char === '`') {
|
|
257
|
+
quote = char;
|
|
258
|
+
continue;
|
|
259
|
+
}
|
|
260
|
+
if (char === '{' || char === '[' || char === '(')
|
|
261
|
+
depth += 1;
|
|
262
|
+
if (char === '}' || char === ']' || char === ')')
|
|
263
|
+
depth -= 1;
|
|
264
|
+
if (depth !== 0)
|
|
265
|
+
continue;
|
|
266
|
+
const match = /^\s*(?:['"]([^'"]+)['"]|([A-Za-z_$][\w$-]*))\s*:/.exec(content.slice(index));
|
|
267
|
+
const key = match?.[1] ?? match?.[2];
|
|
268
|
+
if (!key || keys.some((item) => item.key === key))
|
|
269
|
+
continue;
|
|
270
|
+
keys.push({ key, index });
|
|
271
|
+
index += (match?.[0].length ?? 1) - 1;
|
|
272
|
+
}
|
|
273
|
+
return keys;
|
|
274
|
+
}
|
|
275
|
+
function sourceVariantAxes(file, content) {
|
|
276
|
+
const axes = [];
|
|
277
|
+
for (const cva of content.matchAll(/\bcva\s*\(/g)) {
|
|
278
|
+
const configOpen = content.indexOf('{', cva.index ?? 0);
|
|
279
|
+
const config = configOpen >= 0 ? balancedObject(content, configOpen) : null;
|
|
280
|
+
if (!config)
|
|
281
|
+
continue;
|
|
282
|
+
const variants = objectProperty(config.body, 'variants');
|
|
283
|
+
if (!variants)
|
|
284
|
+
continue;
|
|
285
|
+
for (const axisKey of topLevelObjectKeys(variants.body)) {
|
|
286
|
+
const axisOpen = variants.body.indexOf('{', axisKey.index);
|
|
287
|
+
const axis = axisOpen >= 0 ? balancedObject(variants.body, axisOpen) : null;
|
|
288
|
+
if (!axis)
|
|
289
|
+
continue;
|
|
290
|
+
const values = topLevelObjectKeys(axis.body).map((item) => item.key);
|
|
291
|
+
if (!values.length)
|
|
292
|
+
continue;
|
|
293
|
+
const absolute = config.start + 1 + variants.start + 1 + axisOpen;
|
|
294
|
+
axes.push({
|
|
295
|
+
id: stableId('axis', `${file}:cva:${axisKey.key}`),
|
|
296
|
+
label: axisKey.key,
|
|
297
|
+
property: axisKey.key,
|
|
298
|
+
values,
|
|
299
|
+
adapter: 'cva',
|
|
300
|
+
source: { file, line: lineAt(content, absolute) },
|
|
301
|
+
sourceProperty: `variants.${axisKey.key}`,
|
|
302
|
+
canCreate: true,
|
|
303
|
+
evidence: ['CVA variants object', `Writable ${axisKey.key} option map`],
|
|
304
|
+
});
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
for (const match of content.matchAll(/\b([A-Za-z_$][\w$]*)\??\s*:\s*((?:['"][^'"]+['"]\s*\|\s*)+['"][^'"]+['"])/g)) {
|
|
308
|
+
const property = match[1];
|
|
309
|
+
const values = [...match[2].matchAll(/['"]([^'"]+)['"]/g)].map((item) => item[1]);
|
|
310
|
+
if (values.length < 2 || axes.some((axis) => axis.property === property))
|
|
311
|
+
continue;
|
|
312
|
+
axes.push({
|
|
313
|
+
id: stableId('axis', `${file}:typescript:${property}`),
|
|
314
|
+
label: property,
|
|
315
|
+
property,
|
|
316
|
+
values,
|
|
317
|
+
adapter: 'typescript',
|
|
318
|
+
source: { file, line: lineAt(content, match.index ?? 0) },
|
|
319
|
+
sourceProperty: property,
|
|
320
|
+
canCreate: true,
|
|
321
|
+
evidence: ['TypeScript string union', `Writable ${property} prop type`],
|
|
322
|
+
});
|
|
323
|
+
}
|
|
324
|
+
return axes;
|
|
325
|
+
}
|
|
42
326
|
async function sourceFiles(root, exclusions) {
|
|
43
327
|
const files = [];
|
|
44
328
|
const excluded = new Set([
|
|
@@ -74,12 +358,18 @@ export async function indexProjectDesign(root, config, revision) {
|
|
|
74
358
|
const tokens = new Map();
|
|
75
359
|
const components = new Map();
|
|
76
360
|
const breakpoints = new Map();
|
|
361
|
+
const containerQueries = new Map();
|
|
77
362
|
const themes = new Set();
|
|
78
363
|
const motion = new Map();
|
|
79
364
|
const storyVariants = new Map();
|
|
365
|
+
const axesByFile = new Map();
|
|
366
|
+
const documents = [];
|
|
80
367
|
for (const path of files) {
|
|
81
368
|
const content = await readFile(path, 'utf8').catch(() => '');
|
|
82
369
|
const file = relative(root, path).replaceAll('\\', '/');
|
|
370
|
+
documents.push({ file, content });
|
|
371
|
+
for (const preset of nativeMotionPresets(file, content))
|
|
372
|
+
motion.set(preset.id, preset);
|
|
83
373
|
for (const match of content.matchAll(/(--[\w-]+)\s*:\s*([^;}\n]+)/g)) {
|
|
84
374
|
const name = match[1];
|
|
85
375
|
const value = match[2].trim();
|
|
@@ -99,7 +389,10 @@ export async function indexProjectDesign(root, config, revision) {
|
|
|
99
389
|
id: stableId('mot', name),
|
|
100
390
|
label: name.replace(/^--/, ''),
|
|
101
391
|
duration: duration ? Number(duration[1]) * (value.includes('ms') ? 1 : 1000) : undefined,
|
|
392
|
+
adapter: 'css',
|
|
393
|
+
configuration: {},
|
|
102
394
|
source: { file, line: lineAt(content, match.index ?? 0) },
|
|
395
|
+
evidence: ['CSS custom property'],
|
|
103
396
|
});
|
|
104
397
|
}
|
|
105
398
|
}
|
|
@@ -110,12 +403,44 @@ export async function indexProjectDesign(root, config, revision) {
|
|
|
110
403
|
source: { file, line: lineAt(content, match.index ?? 0) },
|
|
111
404
|
});
|
|
112
405
|
}
|
|
406
|
+
for (const match of content.matchAll(/@container(?:\s+([\w-]+))?\s*\(([^)]*)\)/g)) {
|
|
407
|
+
const name = match[1];
|
|
408
|
+
const condition = match[2].trim();
|
|
409
|
+
const min = /min-(?:width|inline-size)\s*:\s*([\d.]+)px/i.exec(condition)?.[1] ??
|
|
410
|
+
/(?:width|inline-size)\s*>=?\s*([\d.]+)px/i.exec(condition)?.[1];
|
|
411
|
+
const max = /max-(?:width|inline-size)\s*:\s*([\d.]+)px/i.exec(condition)?.[1] ??
|
|
412
|
+
/(?:width|inline-size)\s*<=?\s*([\d.]+)px/i.exec(condition)?.[1];
|
|
413
|
+
if (!min && !max)
|
|
414
|
+
continue;
|
|
415
|
+
const axis = /block-size|height/i.test(condition)
|
|
416
|
+
? 'block-size'
|
|
417
|
+
: /\bsize\b/i.test(condition) && !/inline-size/i.test(condition)
|
|
418
|
+
? 'size'
|
|
419
|
+
: 'inline-size';
|
|
420
|
+
const id = stableId('container', `${file}:${name ?? 'anonymous'}:${condition}`);
|
|
421
|
+
containerQueries.set(id, {
|
|
422
|
+
id,
|
|
423
|
+
label: `${name ?? 'Anonymous container'} · ${condition}`,
|
|
424
|
+
...(name ? { name } : {}),
|
|
425
|
+
condition,
|
|
426
|
+
axis,
|
|
427
|
+
...(min ? { minWidth: Number(min) } : {}),
|
|
428
|
+
...(max ? { maxWidth: Number(max) } : {}),
|
|
429
|
+
source: { file, line: lineAt(content, match.index ?? 0) },
|
|
430
|
+
evidence: [
|
|
431
|
+
'CSS @container rule',
|
|
432
|
+
...(content.includes('container-type') ? ['CSS container-type declaration'] : []),
|
|
433
|
+
...(name && content.includes('container-name') ? ['CSS container-name declaration'] : []),
|
|
434
|
+
],
|
|
435
|
+
});
|
|
436
|
+
}
|
|
113
437
|
for (const match of content.matchAll(/(?:data-theme=["']|\[data-theme=["'])([\w-]+)/g)) {
|
|
114
438
|
themes.add(match[1]);
|
|
115
439
|
}
|
|
116
440
|
if (/(?:^|\s)\.dark(?:\s|[{,:])/.test(content))
|
|
117
441
|
themes.add('dark');
|
|
118
442
|
if (/\.(?:tsx?|jsx?|mjs|cjs)$/.test(path)) {
|
|
443
|
+
axesByFile.set(file, sourceVariantAxes(file, content));
|
|
119
444
|
if (/\.stories\.[cm]?[jt]sx?$/.test(path)) {
|
|
120
445
|
const componentName = basename(path).replace(/\.stories\.[cm]?[jt]sx?$/, '');
|
|
121
446
|
const variants = [...content.matchAll(/export\s+const\s+([A-Z][A-Za-z0-9_]*)/g)].map((story) => ({
|
|
@@ -123,7 +448,10 @@ export async function indexProjectDesign(root, config, revision) {
|
|
|
123
448
|
label: story[1],
|
|
124
449
|
property: 'story',
|
|
125
450
|
value: story[1],
|
|
451
|
+
props: { story: story[1] },
|
|
126
452
|
source: { file, line: lineAt(content, story.index ?? 0) },
|
|
453
|
+
adapter: 'storybook',
|
|
454
|
+
sourceProperty: story[1],
|
|
127
455
|
}));
|
|
128
456
|
storyVariants.set(componentName, variants);
|
|
129
457
|
continue;
|
|
@@ -137,6 +465,7 @@ export async function indexProjectDesign(root, config, revision) {
|
|
|
137
465
|
source: { file, line: lineAt(content, match.index ?? 0) },
|
|
138
466
|
instances: 0,
|
|
139
467
|
variants: [],
|
|
468
|
+
variantAxes: [],
|
|
140
469
|
evidence: ['exported component'],
|
|
141
470
|
};
|
|
142
471
|
components.set(id, component);
|
|
@@ -147,6 +476,17 @@ export async function indexProjectDesign(root, config, revision) {
|
|
|
147
476
|
const component = [...components.values()].find((item) => item.name === componentName);
|
|
148
477
|
if (component) {
|
|
149
478
|
component.variants = variants;
|
|
479
|
+
component.variantAxes.push({
|
|
480
|
+
id: stableId('axis', `${variants[0]?.source?.file}:storybook:story`),
|
|
481
|
+
label: 'Story',
|
|
482
|
+
property: 'story',
|
|
483
|
+
values: variants.map((variant) => variant.value),
|
|
484
|
+
adapter: 'storybook',
|
|
485
|
+
source: variants[0].source,
|
|
486
|
+
sourceProperty: 'named export',
|
|
487
|
+
canCreate: true,
|
|
488
|
+
evidence: ['Storybook named exports', 'Writable story definition'],
|
|
489
|
+
});
|
|
150
490
|
component.evidence.push('Storybook story');
|
|
151
491
|
}
|
|
152
492
|
else if (variants[0]?.source) {
|
|
@@ -157,10 +497,246 @@ export async function indexProjectDesign(root, config, revision) {
|
|
|
157
497
|
source: variants[0].source,
|
|
158
498
|
instances: 0,
|
|
159
499
|
variants,
|
|
500
|
+
variantAxes: [
|
|
501
|
+
{
|
|
502
|
+
id: stableId('axis', `${variants[0].source.file}:storybook:story`),
|
|
503
|
+
label: 'Story',
|
|
504
|
+
property: 'story',
|
|
505
|
+
values: variants.map((variant) => variant.value),
|
|
506
|
+
adapter: 'storybook',
|
|
507
|
+
source: variants[0].source,
|
|
508
|
+
sourceProperty: 'named export',
|
|
509
|
+
canCreate: true,
|
|
510
|
+
evidence: ['Storybook named exports', 'Writable story definition'],
|
|
511
|
+
},
|
|
512
|
+
],
|
|
160
513
|
evidence: ['Storybook story'],
|
|
161
514
|
});
|
|
162
515
|
}
|
|
163
516
|
}
|
|
517
|
+
for (const component of components.values()) {
|
|
518
|
+
const nativeAxes = axesByFile.get(component.source?.file ?? '') ?? [];
|
|
519
|
+
const known = new Set(component.variantAxes.map((axis) => axis.property));
|
|
520
|
+
component.variantAxes.push(...nativeAxes.filter((axis) => !known.has(axis.property)));
|
|
521
|
+
for (const axis of nativeAxes) {
|
|
522
|
+
for (const value of axis.values) {
|
|
523
|
+
const id = stableId('var', `${component.id}:${axis.property}:${String(value)}`);
|
|
524
|
+
if (component.variants.some((variant) => variant.id === id))
|
|
525
|
+
continue;
|
|
526
|
+
component.variants.push({
|
|
527
|
+
id,
|
|
528
|
+
label: String(value),
|
|
529
|
+
property: axis.property,
|
|
530
|
+
value,
|
|
531
|
+
props: { [axis.property]: value },
|
|
532
|
+
source: axis.source,
|
|
533
|
+
adapter: axis.adapter,
|
|
534
|
+
sourceProperty: `${axis.sourceProperty}.${String(value)}`,
|
|
535
|
+
});
|
|
536
|
+
}
|
|
537
|
+
}
|
|
538
|
+
if (nativeAxes.length)
|
|
539
|
+
component.evidence.push('Source-backed variant axis');
|
|
540
|
+
}
|
|
541
|
+
resolveTokenAliases(tokens);
|
|
542
|
+
const tokenList = [...tokens.values()];
|
|
543
|
+
const tokenUsages = [];
|
|
544
|
+
const findings = [];
|
|
545
|
+
const recurringLiterals = new Map();
|
|
546
|
+
const componentForSource = (file, line) => [...components.values()]
|
|
547
|
+
.filter((component) => component.source?.file === file && (component.source.line ?? 0) <= line)
|
|
548
|
+
.sort((a, b) => (b.source?.line ?? 0) - (a.source?.line ?? 0))[0];
|
|
549
|
+
for (const { file, content } of documents) {
|
|
550
|
+
for (const match of content.matchAll(/var\(\s*(--[\w-]+)(?:\s*,[^)]*)?\)/g)) {
|
|
551
|
+
const token = tokens.get(match[1]);
|
|
552
|
+
if (!token)
|
|
553
|
+
continue;
|
|
554
|
+
const line = lineAt(content, match.index ?? 0);
|
|
555
|
+
const lineStart = content.lastIndexOf('\n', match.index ?? 0) + 1;
|
|
556
|
+
const declarationPrefix = content.slice(lineStart, match.index ?? 0);
|
|
557
|
+
const alias = /--[\w-]+\s*:\s*$/.test(declarationPrefix);
|
|
558
|
+
const component = componentForSource(file, line);
|
|
559
|
+
tokenUsages.push({
|
|
560
|
+
id: stableId('use', `${file}:${match.index}:${token.id}`),
|
|
561
|
+
tokenId: token.id,
|
|
562
|
+
tokenName: token.name,
|
|
563
|
+
value: token.value,
|
|
564
|
+
category: token.category,
|
|
565
|
+
kind: alias ? 'alias' : 'reference',
|
|
566
|
+
componentId: component?.id,
|
|
567
|
+
source: { file, line },
|
|
568
|
+
evidence: [alias ? 'Token aliases this project value' : 'CSS variable reference'],
|
|
569
|
+
});
|
|
570
|
+
}
|
|
571
|
+
for (const match of content.matchAll(/([a-zA-Z][\w-]*)\s*:\s*([^;\n},]+)[;},]/g)) {
|
|
572
|
+
const property = match[1];
|
|
573
|
+
const value = match[2].trim();
|
|
574
|
+
if (property.startsWith('--') || value.includes('var('))
|
|
575
|
+
continue;
|
|
576
|
+
const category = declarationCategory(property, value);
|
|
577
|
+
if (!category)
|
|
578
|
+
continue;
|
|
579
|
+
const categoryTokens = tokenList.filter((token) => token.category === category);
|
|
580
|
+
const exact = categoryTokens
|
|
581
|
+
.filter((token) => comparable(tokenComparableValue(token)) === comparable(value))
|
|
582
|
+
.sort((a, b) => (b.aliasChain?.length ?? 0) - (a.aliasChain?.length ?? 0) ||
|
|
583
|
+
a.name.localeCompare(b.name))[0];
|
|
584
|
+
const suggested = exact ??
|
|
585
|
+
closeNumericToken(value, categoryTokens.map((token) => ({ ...token, value: tokenComparableValue(token) })));
|
|
586
|
+
const line = lineAt(content, match.index ?? 0);
|
|
587
|
+
const component = componentForSource(file, line);
|
|
588
|
+
const recurringKey = `${category}:${comparable(value)}`;
|
|
589
|
+
const recurring = recurringLiterals.get(recurringKey) ?? {
|
|
590
|
+
value,
|
|
591
|
+
category,
|
|
592
|
+
properties: [],
|
|
593
|
+
sources: [],
|
|
594
|
+
componentIds: [],
|
|
595
|
+
};
|
|
596
|
+
recurring.properties.push(property);
|
|
597
|
+
recurring.sources.push({ file, line });
|
|
598
|
+
if (component?.id)
|
|
599
|
+
recurring.componentIds.push(component.id);
|
|
600
|
+
recurringLiterals.set(recurringKey, recurring);
|
|
601
|
+
if (!suggested)
|
|
602
|
+
continue;
|
|
603
|
+
const usage = {
|
|
604
|
+
id: stableId('use', `${file}:${match.index}:${suggested.id}:literal`),
|
|
605
|
+
tokenId: suggested.id,
|
|
606
|
+
tokenName: suggested.name,
|
|
607
|
+
value,
|
|
608
|
+
category,
|
|
609
|
+
kind: 'literal',
|
|
610
|
+
property,
|
|
611
|
+
componentId: component?.id,
|
|
612
|
+
source: { file, line },
|
|
613
|
+
evidence: [
|
|
614
|
+
exact
|
|
615
|
+
? 'Literal equals an existing project token'
|
|
616
|
+
: 'Literal is close to a project token',
|
|
617
|
+
],
|
|
618
|
+
};
|
|
619
|
+
tokenUsages.push(usage);
|
|
620
|
+
findings.push({
|
|
621
|
+
id: stableId('finding', usage.id),
|
|
622
|
+
kind: component ? 'component-drift' : 'literal-drift',
|
|
623
|
+
severity: exact ? 'info' : 'warning',
|
|
624
|
+
title: exact ? `Use ${suggested.name}` : `${value} is close to ${suggested.name}`,
|
|
625
|
+
detail: exact
|
|
626
|
+
? `${property} repeats ${suggested.value} as a literal instead of its project token.`
|
|
627
|
+
: `${property} uses ${value}; the nearest ${category} token is ${suggested.name} at ${suggested.value}.`,
|
|
628
|
+
category,
|
|
629
|
+
tokenIds: [suggested.id],
|
|
630
|
+
usageIds: [usage.id],
|
|
631
|
+
componentIds: component ? [component.id] : [],
|
|
632
|
+
suggestedTokenId: suggested.id,
|
|
633
|
+
source: usage.source,
|
|
634
|
+
evidence: usage.evidence,
|
|
635
|
+
});
|
|
636
|
+
}
|
|
637
|
+
}
|
|
638
|
+
const tokenPromotions = [...recurringLiterals.entries()]
|
|
639
|
+
.filter(([, recurring]) => recurring.sources.length >= 2)
|
|
640
|
+
.map(([key, recurring]) => {
|
|
641
|
+
const categoryTokens = tokenList.filter((token) => token.category === recurring.category);
|
|
642
|
+
const exact = categoryTokens
|
|
643
|
+
.filter((token) => comparable(tokenComparableValue(token)) === comparable(recurring.value))
|
|
644
|
+
.sort((a, b) => (b.aliasChain?.length ?? 0) - (a.aliasChain?.length ?? 0) ||
|
|
645
|
+
a.name.localeCompare(b.name))[0];
|
|
646
|
+
const near = exact
|
|
647
|
+
? undefined
|
|
648
|
+
: closeNumericToken(recurring.value, categoryTokens.map((token) => ({ ...token, value: tokenComparableValue(token) })));
|
|
649
|
+
const suggested = exact ?? near;
|
|
650
|
+
const property = [...recurring.properties].sort((a, b) => recurring.properties.filter((item) => item === b).length -
|
|
651
|
+
recurring.properties.filter((item) => item === a).length || a.localeCompare(b))[0];
|
|
652
|
+
const sources = recurring.sources.filter((source, index, all) => all.findIndex((candidate) => candidate.file === source.file && candidate.line === source.line) === index);
|
|
653
|
+
const relation = exact ? 'exact' : near ? 'near' : 'new';
|
|
654
|
+
const proposedTokenName = promotionTokenName(recurring.category, property, recurring.value);
|
|
655
|
+
const suggestedTokenName = suggested?.name ??
|
|
656
|
+
(tokens.has(proposedTokenName)
|
|
657
|
+
? `${proposedTokenName}-${stableId('token-name', key).slice(-4)}`
|
|
658
|
+
: proposedTokenName);
|
|
659
|
+
return {
|
|
660
|
+
id: stableId('promotion', key),
|
|
661
|
+
value: recurring.value,
|
|
662
|
+
category: recurring.category,
|
|
663
|
+
property,
|
|
664
|
+
occurrenceCount: sources.length,
|
|
665
|
+
sources,
|
|
666
|
+
componentIds: [...new Set(recurring.componentIds)],
|
|
667
|
+
recommendation: suggested ? 'use-existing' : 'create-token',
|
|
668
|
+
relation,
|
|
669
|
+
suggestedTokenId: suggested?.id,
|
|
670
|
+
suggestedTokenName,
|
|
671
|
+
suggestedValue: suggested ? `var(${suggested.name})` : recurring.value,
|
|
672
|
+
aliasChain: suggested?.aliasChain ?? [],
|
|
673
|
+
canStage: sources.length > 0,
|
|
674
|
+
blockers: [],
|
|
675
|
+
evidence: [
|
|
676
|
+
`${sources.length} authored literal occurrences`,
|
|
677
|
+
...(suggested
|
|
678
|
+
? [
|
|
679
|
+
relation === 'exact'
|
|
680
|
+
? 'Resolved value matches an existing project token'
|
|
681
|
+
: 'Nearest compatible project token requires explicit review',
|
|
682
|
+
]
|
|
683
|
+
: ['No compatible project token exists; create one before replacing usages']),
|
|
684
|
+
...(suggested?.aliasStatus === 'resolved'
|
|
685
|
+
? [`Preserves alias chain ${(suggested.aliasChain ?? []).join(' → ')}`]
|
|
686
|
+
: []),
|
|
687
|
+
],
|
|
688
|
+
};
|
|
689
|
+
})
|
|
690
|
+
.sort((a, b) => b.occurrenceCount - a.occurrenceCount || a.value.localeCompare(b.value));
|
|
691
|
+
for (let index = 0; index < tokenList.length; index += 1) {
|
|
692
|
+
const token = tokenList[index];
|
|
693
|
+
const near = tokenList.slice(index + 1).find((candidate) => {
|
|
694
|
+
if (candidate.category !== token.category)
|
|
695
|
+
return false;
|
|
696
|
+
const first = numericValue(token.value);
|
|
697
|
+
const second = numericValue(candidate.value);
|
|
698
|
+
return Boolean(first &&
|
|
699
|
+
second &&
|
|
700
|
+
first.unit === second.unit &&
|
|
701
|
+
Math.abs(first.amount - second.amount) > 0 &&
|
|
702
|
+
Math.abs(first.amount - second.amount) <= Math.max(2, Math.abs(first.amount) * 0.2));
|
|
703
|
+
});
|
|
704
|
+
if (near) {
|
|
705
|
+
const relatedUsages = tokenUsages.filter((usage) => usage.tokenId === token.id || usage.tokenId === near.id);
|
|
706
|
+
findings.push({
|
|
707
|
+
id: stableId('finding', `near:${token.id}:${near.id}`),
|
|
708
|
+
kind: 'near-duplicate',
|
|
709
|
+
severity: 'warning',
|
|
710
|
+
title: `${token.name} and ${near.name} are unusually close`,
|
|
711
|
+
detail: `${token.value} and ${near.value} may represent the same ${token.category} decision.`,
|
|
712
|
+
category: token.category,
|
|
713
|
+
tokenIds: [token.id, near.id],
|
|
714
|
+
usageIds: relatedUsages.map((usage) => usage.id),
|
|
715
|
+
componentIds: [
|
|
716
|
+
...new Set(relatedUsages
|
|
717
|
+
.map((usage) => usage.componentId)
|
|
718
|
+
.filter((componentId) => Boolean(componentId))),
|
|
719
|
+
],
|
|
720
|
+
source: near.source ?? token.source,
|
|
721
|
+
evidence: ['Same category', 'Values fall within the project drift threshold'],
|
|
722
|
+
});
|
|
723
|
+
}
|
|
724
|
+
if (!tokenUsages.some((usage) => usage.tokenId === token.id)) {
|
|
725
|
+
findings.push({
|
|
726
|
+
id: stableId('finding', `unused:${token.id}`),
|
|
727
|
+
kind: 'unused-token',
|
|
728
|
+
severity: 'info',
|
|
729
|
+
title: `${token.name} has no indexed references`,
|
|
730
|
+
detail: 'Confirm whether this token is intentionally reserved before removing it.',
|
|
731
|
+
category: token.category,
|
|
732
|
+
tokenIds: [token.id],
|
|
733
|
+
usageIds: [],
|
|
734
|
+
componentIds: [],
|
|
735
|
+
source: token.source,
|
|
736
|
+
evidence: ['No references were found in indexed project files'],
|
|
737
|
+
});
|
|
738
|
+
}
|
|
739
|
+
}
|
|
164
740
|
const configuredViewports = config?.design?.viewports ?? [];
|
|
165
741
|
const graphBreakpoints = configuredViewports.length
|
|
166
742
|
? configuredViewports.map((item) => ({ ...item, height: item.height ?? 900 }))
|
|
@@ -191,9 +767,13 @@ export async function indexProjectDesign(root, config, revision) {
|
|
|
191
767
|
tokens: [...tokens.values()],
|
|
192
768
|
components: [...components.values()],
|
|
193
769
|
breakpoints: graphBreakpoints,
|
|
770
|
+
containerQueries: [...containerQueries.values()].sort((a, b) => (a.minWidth ?? a.maxWidth ?? 0) - (b.minWidth ?? b.maxWidth ?? 0)),
|
|
194
771
|
themes: graphThemes,
|
|
195
772
|
states: config?.design?.states ?? [],
|
|
196
773
|
motionPresets: [...motion.values()],
|
|
774
|
+
tokenUsages,
|
|
775
|
+
designSystemFindings: findings,
|
|
776
|
+
tokenPromotions,
|
|
197
777
|
indexedAt: new Date().toISOString(),
|
|
198
778
|
});
|
|
199
779
|
}
|
package/dist/indexer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"indexer.js","sourceRoot":"","sources":["../src/indexer.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"indexer.js","sourceRoot":"","sources":["../src/indexer.ts"],"names":[],"mappings":"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"}
|
package/dist/release.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export declare const FOUNDRY_VERSION = "0.2.0-beta.
|
|
2
|
-
export declare const FOUNDRY_PACKAGE_SPEC = "foundry-design@0.2.0-beta.
|
|
3
|
-
export declare const FOUNDRY_MCP_PACKAGE_SPEC = "foundry-design-mcp-server@0.2.0-beta.
|
|
1
|
+
export declare const FOUNDRY_VERSION = "0.2.0-beta.18";
|
|
2
|
+
export declare const FOUNDRY_PACKAGE_SPEC = "foundry-design@0.2.0-beta.18";
|
|
3
|
+
export declare const FOUNDRY_MCP_PACKAGE_SPEC = "foundry-design-mcp-server@0.2.0-beta.18";
|
|
4
4
|
export declare function releasePreflight(action: string): string;
|
|
5
5
|
//# sourceMappingURL=release.d.ts.map
|
package/dist/release.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export const FOUNDRY_VERSION = '0.2.0-beta.
|
|
1
|
+
export const FOUNDRY_VERSION = '0.2.0-beta.18';
|
|
2
2
|
export const FOUNDRY_PACKAGE_SPEC = `foundry-design@${FOUNDRY_VERSION}`;
|
|
3
3
|
export const FOUNDRY_MCP_PACKAGE_SPEC = `foundry-design-mcp-server@${FOUNDRY_VERSION}`;
|
|
4
4
|
export function releasePreflight(action) {
|
|
@@ -14,15 +14,27 @@ Resolve `<skill-root>` to the directory containing this `SKILL.md` before runnin
|
|
|
14
14
|
1. Inspect the project, current worktree, framework, development command, and existing Foundry configuration.
|
|
15
15
|
2. Run `<skill-root>/scripts/foundry.sh doctor --project <root>`.
|
|
16
16
|
3. If setup is absent, stale, or Doctor reports a missing or conflicting connection, read [platform-setup.md](references/platform-setup.md), then run `<skill-root>/scripts/foundry.sh doctor --project <root> --repair`. Repair refreshes both project-scoped and shared agent configuration to the same exact release. It is transactional, validates the project, and restores every touched file if Foundry introduces a failure.
|
|
17
|
-
4. Confirm that `foundry_design_wait_for_apply` is callable before promising
|
|
17
|
+
4. Confirm that `foundry_design_wait_for_work` or the legacy `foundry_design_wait_for_apply` is callable before promising agent collaboration. If setup just added MCP configuration but neither tool is available in the current process, stop and ask the user to restart their coding agent and reopen the same project root. Do not start a session or describe the connection as ready.
|
|
18
18
|
5. Run `<skill-root>/scripts/foundry.sh start --project <root>`. It may start the detected development command and resumes the most recent session for the same source revision. Use `--new` only when the user explicitly wants a clean ledger.
|
|
19
|
-
6. Read the project design graph, then immediately call `
|
|
20
|
-
7. Keep the Foundry runtime and
|
|
19
|
+
6. Read the project design graph, then immediately call `foundry_design_wait_for_work` in bounded waits using the returned session credentials and current revisions. This one listener receives reviewed Apply runs and grounded Visual Agent requests. Fall back to `foundry_design_wait_for_apply` only when the unified tool is unavailable. Repeat the wait while the session is active. Do not finish the turn merely because one wait returns `waiting`; the browser cannot initiate a new agent turn by itself.
|
|
20
|
+
7. Keep the Foundry runtime and agent listener alive while the user selects, discusses, and refines elements. End the wait loop only when the user exits Foundry, cancels the workflow, or asks to stop.
|
|
21
21
|
|
|
22
22
|
In web sessions, selection mode stays active so ordinary clicks can move continuously between elements. Inspector categories filter the selected element's controls without changing selection mode. Switch the pointer tool to interaction mode only when testing the underlying app; Option-click still makes a temporary selection there. Repeating a click cycles overlapping layers, and Option-click prioritizes the strongest mapped or semantic target. Use the Layers panel or the Parent and Child controls for obscured and nested targets. Shift-click builds a multi-selection and exposes measured gaps when the layers share a parent.
|
|
23
23
|
|
|
24
24
|
Use the inspector controls as the user's visual editing surface, not as source truth. For sizing modes, project values, component variants, layer reordering, comparison, keyboard commands, and reset behavior, read [visual-workbench.md](references/visual-workbench.md).
|
|
25
25
|
|
|
26
|
+
When the user asks to explore, compare, or edit a component across its instances, variants, or interaction states, read [component-workshop.md](references/component-workshop.md). Keep state previews temporary and require an exact source mapping before using variant or component scope.
|
|
27
|
+
|
|
28
|
+
When the user asks to inspect, compare, or repair behavior across viewport widths, read [responsive-design-lab.md](references/responsive-design-lab.md). Preserve real iframe viewport dimensions, keep stress tests temporary, and require exact source mapping before promoting an edit across breakpoints.
|
|
29
|
+
|
|
30
|
+
When the user asks to audit, trace, consolidate, or extend project tokens and component conventions, read [design-system-intelligence.md](references/design-system-intelligence.md). Treat findings and impact previews as evidence, preserve semantic aliases, and route every proposed source change through review.
|
|
31
|
+
|
|
32
|
+
When the user asks to inspect, scrub, preview, or edit rendered motion, read [motion-studio.md](references/motion-studio.md). Keep transport and scrubbing preview-only, preserve exact source timing and keyframe semantics, and review every editable motion change before apply.
|
|
33
|
+
|
|
34
|
+
When the user asks to audit, preview, or change fonts, type rhythm, scale, or reusable type styles, read [typography-studio.md](references/typography-studio.md). Keep local fonts preview-only, require an explicit integration strategy for new Google Fonts, and validate reviewed typography across the recorded viewport, theme, and state contexts.
|
|
35
|
+
|
|
36
|
+
When the user asks to explore, compare, combine, reject, choose, export, import, or restore parallel visual directions, read [design-branches.md](references/design-branches.md). For portable chosen and rejected outcomes, also read [portable-branch-records.md](references/portable-branch-records.md). Keep every direction isolated from Main, switch preview values reversibly, require explicit promotion before anything enters Review and apply, and never turn a portable record into Design Memory without a separate user action.
|
|
37
|
+
|
|
26
38
|
When the user runs Design Health or asks to correct its findings, read [design-health.md](references/design-health.md). Preserve evidence-only findings when Foundry cannot propose a narrow, reversible preview.
|
|
27
39
|
|
|
28
40
|
For web sessions, `start` indexes the local project design graph. Use `<skill-root>/scripts/foundry.sh index --project <root>` when the graph must be refreshed independently.
|
|
@@ -40,13 +52,17 @@ Do not launch Foundry merely because a task contains design work. Require an exp
|
|
|
40
52
|
|
|
41
53
|
Read [change-contract.md](references/change-contract.md) when interpreting or troubleshooting a change set.
|
|
42
54
|
|
|
55
|
+
## Discuss a visual request
|
|
56
|
+
|
|
57
|
+
When `foundry_design_wait_for_work` returns `kind: visual_request`, read [visual-agent-conversation.md](references/visual-agent-conversation.md). Ground the response in the attached rendered targets or region, source locations, viewport, theme, state, measurements, project tokens, and contextual comments. Return concrete proposals through `foundry_design_respond_to_visual_request`, then resume the unified listener. Never edit source from a proposal. Only a proposal the user previews, promotes to Review, and applies through a reviewed Apply run authorizes source work.
|
|
58
|
+
|
|
43
59
|
## Apply the reviewed batch
|
|
44
60
|
|
|
45
61
|
1. Read the project design graph with `foundry_design_get_project_design`.
|
|
46
|
-
2. For an interactive
|
|
62
|
+
2. For an interactive session, keep calling `foundry_design_wait_for_work` in bounded waits as soon as Foundry starts. Include the current source revision, design-graph revision, and agent identity. A reviewed run or visual request may already be queued while the agent was offline. A `waiting` result means poll again while the session remains active, not that the workflow is complete.
|
|
47
63
|
3. If a run is claimed, retain its `claimAttemptId`, read [apply-run-contract.md](references/apply-run-contract.md), and follow its state transitions. Do not edit from an unreviewed draft ledger.
|
|
48
64
|
4. Immediately report `applying` with the current `claimAttemptId`, then reinspect current source before editing. The MCP bridge automatically renews a fresh claim while this turn is inspecting prerequisites, but do not rely on that as a progress state. If a long prerequisite prevents the transition, explicitly extend the lease with `foundry_design_heartbeat_apply_run` while the run remains `claimed`.
|
|
49
|
-
5. Stop if the claim is no longer active or the source inspection finds a stale revision, stale graph, unresolved target, or unresolved operation. Return to `
|
|
65
|
+
5. Stop if the claim is no longer active or the source inspection finds a stale revision, stale graph, unresolved target, or unresolved operation. Return to `foundry_design_wait_for_work` when Foundry has safely requeued an abandoned handoff.
|
|
50
66
|
6. Implement the user's selected semantic mapping at the narrowest source of truth.
|
|
51
67
|
7. Preserve existing tokens and component conventions. Prefer a matching token over a new literal. Do not invent a global token for an instance-scoped adjustment.
|
|
52
68
|
8. Apply the batch as a normal, reviewable source diff. Never write generated preview styles into production code.
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# Component Workshop
|
|
2
|
+
|
|
3
|
+
Use Component Workshop to inspect a project-native component as a connected system rather than editing isolated screenshots.
|
|
4
|
+
|
|
5
|
+
## Enter the workshop
|
|
6
|
+
|
|
7
|
+
1. Open **Components** from the workspace menu, command palette, or Components tab in Structure.
|
|
8
|
+
2. Choose an indexed component. Prefer one with a live instance on the current canvas.
|
|
9
|
+
3. Select the exact live instance before changing a visual property.
|
|
10
|
+
4. Use the state controls to preview default, hover, focus, pressed, disabled, loading, empty, and error behavior.
|
|
11
|
+
5. Use variants only when the project design graph provides variant properties. Storybook stories are indexed as variant properties.
|
|
12
|
+
|
|
13
|
+
## Create a source-backed variant
|
|
14
|
+
|
|
15
|
+
1. Use **Create source variant** only when Component Workshop exposes a writable Storybook, CVA, configured, or TypeScript union axis.
|
|
16
|
+
2. Enter both the human label and the exact source value. Choose a mapped base variant when the new option should preserve its visual treatment.
|
|
17
|
+
3. Stage the operation, then inspect its exact authoring file, adapter, source property, base variant, and preservation evidence in Review.
|
|
18
|
+
4. During Apply, follow the recorded adapter rather than inventing a parallel API: create a named Storybook export, add the option to the existing CVA variant map, or extend the recorded TypeScript union and its existing implementation mapping.
|
|
19
|
+
5. Re-index after the source edit. The new option must return as a mapped variant on the same axis before verification can pass.
|
|
20
|
+
|
|
21
|
+
`component.variant.create.<property>` is a source-authoring operation, not a CSS property. Never satisfy it with a preview attribute or generated stylesheet.
|
|
22
|
+
|
|
23
|
+
## Repair cross-instance drift
|
|
24
|
+
|
|
25
|
+
After selecting a mapped variant, use **Cross-instance drift** to compare only explicitly instrumented instance properties. Missing properties are unknown, not mismatches. A repair stages one exact `variant.<property>` change for each differing instance and retains that instance's source reference. Apply each repair at the narrowest recorded call site, then verify every repaired instance against the selected variant.
|
|
26
|
+
|
|
27
|
+
State previews are presentation state. They must never create a design change or enter the review ledger. Return to Default before measuring or applying unrelated changes.
|
|
28
|
+
|
|
29
|
+
## Choose scope safely
|
|
30
|
+
|
|
31
|
+
- **Instance** changes the selected rendered instance and is available when that instance is live.
|
|
32
|
+
- **Variant** changes the selected mapped variant definition. Keep it disabled until the variant has an exact source reference.
|
|
33
|
+
- **Component** changes the component source for every instance. Keep it disabled until the component itself has an exact source reference.
|
|
34
|
+
|
|
35
|
+
Do not promote an instance edit to variant or component scope by inference. If the source target is missing or ambiguous, preserve the preview and ask the user to resolve the mapping.
|
|
36
|
+
|
|
37
|
+
## Review and verify
|
|
38
|
+
|
|
39
|
+
1. Review each recorded change with its component, selected variant, scope, viewport, theme, and state context.
|
|
40
|
+
2. Apply the narrowest source edit that satisfies the reviewed scope.
|
|
41
|
+
3. Rebuild and verify the selected state at its native artboard dimensions.
|
|
42
|
+
4. For variant scope, verify every rendered instance of the selected variant that is available in the session.
|
|
43
|
+
5. For component scope, verify every rendered instance of that component that is available in the session.
|
|
44
|
+
6. Keep unavailable combinations explicit. Never claim coverage for a state, theme, or viewport that was not rendered and measured.
|
|
45
|
+
7. For a newly created variant, confirm the indexed axis includes the exact new value and that the chosen base treatment was preserved.
|
|
46
|
+
8. For drift repair, confirm the mismatch count returns to zero without changing instances that did not expose that property.
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# Design branches
|
|
2
|
+
|
|
3
|
+
Use Design branches when the user wants to explore materially different visual directions before choosing what should enter Review and apply.
|
|
4
|
+
|
|
5
|
+
## Branch contract
|
|
6
|
+
|
|
7
|
+
- Main direction is the source-ready session change set.
|
|
8
|
+
- A branch owns an isolated list of design changes and direct-manipulation operations.
|
|
9
|
+
- Creating a direction from another direction copies its current decisions without linking future edits.
|
|
10
|
+
- Switching directions restores the previous preview values before applying the next direction.
|
|
11
|
+
- Branch navigation is presentation state. It must not edit source, create an Apply run, or mark changes applied.
|
|
12
|
+
- Keep no more than eight active directions in one session. Archive rejected or obsolete directions instead of deleting their rationale.
|
|
13
|
+
|
|
14
|
+
## Compare and compose
|
|
15
|
+
|
|
16
|
+
1. Compare two directions in fixed-size iframes using the recorded project viewport.
|
|
17
|
+
2. Treat the branch ledgers as canonical. Never infer a viewport from overflowing content.
|
|
18
|
+
3. Select individual decisions by branch and change identifier.
|
|
19
|
+
4. Combine selections into a new isolated direction. Coalesce only changes with the same target, property, scope, breakpoint, theme, and state.
|
|
20
|
+
5. Record a concise rejection note when a direction is rejected. Preserve that note with the session.
|
|
21
|
+
|
|
22
|
+
## Promote a direction
|
|
23
|
+
|
|
24
|
+
Choosing a direction is an explicit boundary:
|
|
25
|
+
|
|
26
|
+
1. Confirm there is no active Apply run.
|
|
27
|
+
2. Copy the chosen direction into the main change set with fresh identifiers and draft statuses.
|
|
28
|
+
3. Mark the direction as chosen and return the active editing direction to Main.
|
|
29
|
+
4. Open Review and apply. The user must still approve exact changes before the agent edits source.
|
|
30
|
+
|
|
31
|
+
Never merge a direction directly into project files and never automatically retry or promote a rejected direction.
|
|
32
|
+
|
|
33
|
+
## Preserve the outcome
|
|
34
|
+
|
|
35
|
+
Choosing or rejecting a direction creates a portable branch decision record. Read [portable-branch-records.md](portable-branch-records.md) before exporting, importing, restoring, or linking one of these records to Design Memory.
|
|
36
|
+
|
|
37
|
+
The record preserves evidence without becoming a permanent rule. Adding it to Design Memory is always a separate, explicit user action.
|
|
38
|
+
|
|
39
|
+
## Verification
|
|
40
|
+
|
|
41
|
+
- Confirm edits recorded in one branch never appear in another branch or Main.
|
|
42
|
+
- Switch repeatedly and verify the rendered product restores exact before and after values.
|
|
43
|
+
- Compare at the recorded viewport and theme.
|
|
44
|
+
- Combine decisions from at least two branches and verify only selected changes appear in the new direction.
|
|
45
|
+
- Promote the combined direction and confirm Review and apply contains the expected draft changes.
|
|
46
|
+
- Export and re-import chosen and rejected records, verify compatibility evidence, and restore only a current record into a new isolated direction.
|
|
47
|
+
- Verify Light and Dark Foundry interface themes without altering the product theme.
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# Design System Intelligence
|
|
2
|
+
|
|
3
|
+
Use the Design System workspace to understand and extend the product's existing visual language without silently introducing new conventions.
|
|
4
|
+
|
|
5
|
+
## Read the system map
|
|
6
|
+
|
|
7
|
+
1. Open **Design system** from the workspace menu or command palette.
|
|
8
|
+
2. Filter tokens by category and select the semantic token, not merely a matching raw value.
|
|
9
|
+
3. Read its source of truth, aliases, indexed references, literal repetitions, component reach, and file reach.
|
|
10
|
+
4. Treat impact counts as an indexed preview. Dynamic, generated, or runtime-only usage may remain outside the graph and must be reported as unavailable rather than inferred.
|
|
11
|
+
|
|
12
|
+
## Interpret guidance
|
|
13
|
+
|
|
14
|
+
- **Literal drift** means an authored literal equals or sits close to a project token.
|
|
15
|
+
- **Component drift** is literal drift inside a source-mapped component.
|
|
16
|
+
- **Near duplicate** means two tokens in the same category fall inside the conservative numeric similarity threshold.
|
|
17
|
+
- **Unused token** means no indexed reference was found. It is evidence for review, not permission to delete the token.
|
|
18
|
+
|
|
19
|
+
Recommendations explain the matching category, value relationship, and source evidence. Exact token matches rank first in Inspector menus, followed by the nearest compatible project values. Never recommend a token from an unrelated category merely because its serialized value matches.
|
|
20
|
+
|
|
21
|
+
## Promote recurring values
|
|
22
|
+
|
|
23
|
+
1. Open **Promote** in the Design System workspace.
|
|
24
|
+
2. Select a recurring authored value and inspect every indexed source location.
|
|
25
|
+
3. Prefer the recommended existing semantic token when its resolved value matches. Foundry ranks the deepest compatible alias chain ahead of a raw primitive so theme and component intent survive the refactor.
|
|
26
|
+
4. When no compatible token exists, review the proposed project-native token name and value. Treat the generated name as a source plan, not an applied convention.
|
|
27
|
+
5. Add the plan to Review. Foundry records the exact locations, resolved value, alias chain, source blast radius, and required rebuild checks in one `token-refactor` operation.
|
|
28
|
+
6. Apply with the active coding agent, re-index the project, and verify every affected consumer before marking the operation complete.
|
|
29
|
+
|
|
30
|
+
Broken and circular aliases remain visible in the token detail view but never receive an invented resolved value. Dynamic and generated usages remain outside the indexed count and must be reported as unresolved.
|
|
31
|
+
|
|
32
|
+
## Change the system safely
|
|
33
|
+
|
|
34
|
+
1. Inspect affected components and contexts before proposing a replacement or token edit.
|
|
35
|
+
2. Preserve semantic aliases when they encode intent across themes, states, or component roles.
|
|
36
|
+
3. Route literal replacements, consolidation, new tokens, and token-value changes into the normal review ledger.
|
|
37
|
+
4. Require an exact source mapping and explicit component, theme, breakpoint, and state scope.
|
|
38
|
+
5. Rebuild and verify every affected rendered context. A token definition change is complete only after its indexed consumers remain visually and functionally correct.
|
|
39
|
+
|
|
40
|
+
The Design System workspace never applies source changes automatically. Token promotion creates a draft Review operation; only the normal reviewed Apply workflow may change source.
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
# Motion Studio
|
|
2
|
+
|
|
3
|
+
Use Motion Studio when a rendered interface contains motion that must be understood, tuned, or verified against its source.
|
|
4
|
+
|
|
5
|
+
## Discover rendered motion
|
|
6
|
+
|
|
7
|
+
1. Select the animated target on the Canvas, then open **Motion studio** from the workspace menu or command palette.
|
|
8
|
+
2. Treat the live browser and timeline as views of the same registered CSS animation, CSS transition, Web Animation, Motion for React animation, GSAP tween, or React Spring animation.
|
|
9
|
+
3. Preserve the source type, duration, delay, easing, iterations, direction, fill mode, animated properties, and keyframes exactly as reported by the adapter.
|
|
10
|
+
4. Use the performance tier and reduced-motion status as evidence. Do not infer compositor safety or accessibility coverage from an animation name alone.
|
|
11
|
+
|
|
12
|
+
## Preserve project-native motion
|
|
13
|
+
|
|
14
|
+
Foundry indexes Motion for React, GSAP, and React Spring authoring sites and associates the nearest source-backed preset with an instrumented element. For the strongest runtime evidence, register the actual animation or an equivalent preview on the rendered element:
|
|
15
|
+
|
|
16
|
+
```ts
|
|
17
|
+
import { registerNativeMotion } from 'foundry-design-web-adapter';
|
|
18
|
+
|
|
19
|
+
registerNativeMotion(element, {
|
|
20
|
+
adapter: 'motion',
|
|
21
|
+
from: { opacity: 0, y: 12 },
|
|
22
|
+
to: { opacity: 1, y: 0 },
|
|
23
|
+
transition: { duration: 0.48, ease: [0.16, 1, 0.3, 1] },
|
|
24
|
+
source: { file: 'src/PrimaryAction.tsx', line: 18 },
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
registerNativeMotion(element, {
|
|
28
|
+
adapter: 'gsap',
|
|
29
|
+
from: { x: -24, opacity: 0 },
|
|
30
|
+
to: { x: 0, opacity: 1 },
|
|
31
|
+
config: { duration: 0.6, ease: 'power2.out' },
|
|
32
|
+
source: { file: 'src/Panel.tsx', line: 32 },
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
registerNativeMotion(element, {
|
|
36
|
+
adapter: 'react-spring',
|
|
37
|
+
from: { y: 16, opacity: 0 },
|
|
38
|
+
to: { y: 0, opacity: 1 },
|
|
39
|
+
config: { mass: 1, tension: 210, friction: 24 },
|
|
40
|
+
source: { file: 'src/Notice.tsx', line: 14 },
|
|
41
|
+
});
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
- Keep seconds in Motion and GSAP source. Foundry displays milliseconds but records the native `transition.duration` or `vars.duration` property path.
|
|
45
|
+
- Preserve React Spring's physical `mass`, `tension`, and `friction` values rather than flattening the source into a guessed duration.
|
|
46
|
+
- Keep Motion `animate` and `variants`, GSAP `vars`, and React Spring `from`/`to` semantics in Apply evidence.
|
|
47
|
+
- A runtime preview is presentation state. Source changes still enter the existing Review and Apply flow and require rendered verification.
|
|
48
|
+
|
|
49
|
+
## Preview without recording changes
|
|
50
|
+
|
|
51
|
+
Play, pause, replay, loop, speed, and timeline scrubbing are presentation controls. They must never enter the change ledger, modify source, or become part of an Apply run. Keep the selected motion and playhead synchronized between Motion Studio and the Inspector.
|
|
52
|
+
|
|
53
|
+
## Edit timing and keyframes
|
|
54
|
+
|
|
55
|
+
- Timing edits may update duration, delay, easing, iterations, direction, and fill mode.
|
|
56
|
+
- Keyframe edits preserve the selected property, offset, value, and segment easing.
|
|
57
|
+
- Route edits through the normal bridge so they coalesce by target, property, scope, breakpoint, theme, and state.
|
|
58
|
+
- Require exact source mapping before promoting an edit beyond the selected instance.
|
|
59
|
+
- Never replace a project easing token or motion convention with an unexplained literal when a matching native value exists.
|
|
60
|
+
|
|
61
|
+
## Shape timing curves
|
|
62
|
+
|
|
63
|
+
- Use the dedicated **Bezier** editor for CSS cubic Bezier timing. Drag either control point, use its keyboard-accessible handle, enter exact X and Y values, or start from a preset.
|
|
64
|
+
- Preserve all four cubic Bezier coordinates. Preview the resulting travel independently, then record the exact `cubic-bezier(x1, y1, x2, y2)` value through Review.
|
|
65
|
+
- Use the dedicated **Spring** editor to tune mass, stiffness, damping, and initial velocity. Show settling duration and overshoot so the physical response is understandable before it is recorded.
|
|
66
|
+
- CSS has no portable `spring()` timing function. For web targets, keep the exact physical parameters in the live Foundry curve model and generate a deterministic CSS `linear()` approximation for preview, Review, apply, and rendered verification.
|
|
67
|
+
- Treat presets as starting points, not hidden tokens. Every preset must resolve to visible editable values.
|
|
68
|
+
- Curve playback is temporary presentation state. It must never create a design change until the user changes a curve value.
|
|
69
|
+
- Respect reduced-motion preferences in the curve preview while retaining the authored curve values for inspection.
|
|
70
|
+
|
|
71
|
+
## Author motion paths
|
|
72
|
+
|
|
73
|
+
- Use the dedicated **Motion path** editor when at least two rendered transform keyframes expose pixel-based translation values.
|
|
74
|
+
- Drag a path point, use Arrow keys for one-pixel changes, hold Shift for eight-pixel changes, or enter exact X and Y coordinates.
|
|
75
|
+
- Preserve scale, rotation, and matrix coefficients when translation changes. Do not convert percentage or otherwise unresolved transforms into guessed pixels.
|
|
76
|
+
- Record path edits as the corresponding transform keyframe value so Review, source mapping, undo, and rebuilt verification keep using the existing keyframe contract.
|
|
77
|
+
- Show native path bounds and total travel distance as inspection evidence. Path geometry is not a new production artifact by itself.
|
|
78
|
+
|
|
79
|
+
## Compare before and after in sync
|
|
80
|
+
|
|
81
|
+
- Capture the source baseline once, immediately before the first timing, curve, or keyframe preview change.
|
|
82
|
+
- Draw the source baseline and current preview in one coordinate system. Use one playhead for both paths and evaluate each animation with its own timing curve.
|
|
83
|
+
- Playback, replay, and comparison scrubbing are presentation state. They must not enter Review or mutate the live product animation.
|
|
84
|
+
- Report duration, travel-distance, and keyframe-count deltas without claiming that a larger or smaller value is automatically better.
|
|
85
|
+
- If either side lacks a resolvable path, retain the timing and keyframe editors and explain why path comparison is unavailable.
|
|
86
|
+
|
|
87
|
+
## Review motion health
|
|
88
|
+
|
|
89
|
+
- Prefer transform and opacity when the intended effect can remain on the compositor.
|
|
90
|
+
- Flag layout- or paint-heavy properties as evidence, not as automatic rewrite instructions.
|
|
91
|
+
- Treat a matching `prefers-reduced-motion` rule or an intentionally short duration as reduced-motion coverage.
|
|
92
|
+
- Preserve unsupported or ambiguous motion as a finding and ask the user to choose the intended source behavior.
|
|
93
|
+
|
|
94
|
+
## Verify after apply
|
|
95
|
+
|
|
96
|
+
1. Rebuild the real application.
|
|
97
|
+
2. Reopen the same target, viewport, theme, breakpoint, and state.
|
|
98
|
+
3. Confirm the requested timing and keyframe values from the rendered animation snapshot.
|
|
99
|
+
4. Replay the full motion and inspect the start, intermediate, and end states.
|
|
100
|
+
5. Confirm transport and scrubbing still leave the change ledger untouched.
|
|
101
|
+
6. Recheck performance classification and reduced-motion coverage, then report any mismatch instead of silently normalizing it.
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# Portable branch decision records
|
|
2
|
+
|
|
3
|
+
Use portable branch records to carry the outcome and evidence of a Design Branch beyond its original session without turning that outcome into an automatic project rule.
|
|
4
|
+
|
|
5
|
+
## Record contract
|
|
6
|
+
|
|
7
|
+
- Choosing or rejecting a direction creates or refreshes one canonical record for that branch.
|
|
8
|
+
- Preserve the outcome, rationale, exact changes and operations, session context, design-graph revision, and source relationships.
|
|
9
|
+
- Export records as a versioned `foundry.design-branch-records` JSON bundle.
|
|
10
|
+
- Import records as reference material. Importing must not change the canvas, Main, source files, or Design Memory.
|
|
11
|
+
- Reassess compatibility against the current session and design graph whenever records are read, imported, or the graph changes.
|
|
12
|
+
- Match source relationships by project-relative path so a project can move between machines without becoming stale solely because its root path changed.
|
|
13
|
+
|
|
14
|
+
## Compatibility
|
|
15
|
+
|
|
16
|
+
- `current` means every recorded source relationship is present and the design-graph revision still matches. The direction may be restored for exploration.
|
|
17
|
+
- `stale` means the relevant source still exists but the graph revision or part of the recorded context changed. Show the evidence and require review or repair before restore.
|
|
18
|
+
- `missing` means the record has no recoverable source relationship or none of its source files exist in the current graph. Never guess a replacement.
|
|
19
|
+
|
|
20
|
+
Compatibility is evidence, not an edit. It must not create a design change or alter the record's original context.
|
|
21
|
+
|
|
22
|
+
## Restore and memory boundaries
|
|
23
|
+
|
|
24
|
+
1. Restore only a `current` record.
|
|
25
|
+
2. Clone its changes and operations with fresh identifiers into a new exploring direction.
|
|
26
|
+
3. Keep the restored direction isolated from Main until the user explicitly chooses it again.
|
|
27
|
+
4. Add a record to Design Memory only after the user selects **Add to Memory**. Choosing, rejecting, importing, or restoring a record must never silently create permanent guidance.
|
|
28
|
+
5. Let the user remove a record without deleting its original branch or changing source.
|
|
29
|
+
|
|
30
|
+
## Verification
|
|
31
|
+
|
|
32
|
+
- Export chosen and rejected records and parse the bundle against the protocol schema.
|
|
33
|
+
- Import into the same project at a different root path and confirm source-relative matching remains current.
|
|
34
|
+
- Change the design-graph revision and confirm the record becomes stale.
|
|
35
|
+
- Remove its source from the graph and confirm the record becomes missing.
|
|
36
|
+
- Restore a current record and confirm a new isolated direction appears without changing Main.
|
|
37
|
+
- Confirm explicit Add to Memory is the only path that creates remembered guidance.
|
|
38
|
+
- Verify Light and Dark workspace states and the matching Figma components.
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# Responsive Design Lab
|
|
2
|
+
|
|
3
|
+
Use Responsive Design Lab when a change must remain correct across real running viewport contexts.
|
|
4
|
+
|
|
5
|
+
## Inspect across native viewports
|
|
6
|
+
|
|
7
|
+
1. Select the target once on the Canvas, then open **Responsive design lab** from the workspace menu or command palette.
|
|
8
|
+
2. Treat each iframe's declared width and height as the browser viewport. Foundry may scale the outer frame for presentation, but must never resize the document to fit the workspace.
|
|
9
|
+
3. Check the linked selection in every configured breakpoint and the session's recorded Current viewport.
|
|
10
|
+
4. Keep **Viewport** selected to scrub the browser viewport through indexed media-query boundaries.
|
|
11
|
+
5. Switch to **Container** to resize the nearest authored query container around the selected element without changing the iframe viewport. Indexed `@container` conditions remain visible as exact, source-linked boundary shortcuts.
|
|
12
|
+
6. Capture **Before** and **After** at meaningful widths. Foundry freezes viewport, container, selected-element, wrapping, and overflow measurements while the live preview remains free to move.
|
|
13
|
+
7. Treat horizontal overflow, clipping, awkward wrapping, and large geometry jumps as findings. Do not enlarge a viewport from `scrollWidth` to conceal overflow.
|
|
14
|
+
|
|
15
|
+
Container and comparison previews are presentation state. They must not create design changes, alter source, or disguise the viewport used by screenshots and verification. Clearing the preview restores the container's exact prior inline styles.
|
|
16
|
+
|
|
17
|
+
## Use stress tests safely
|
|
18
|
+
|
|
19
|
+
Browser zoom, text scale, and long-content modes are temporary presentation tests. They must not record changes, alter product source, or persist after the preview frame closes. Use them to expose brittle layout behavior, then clear the stress mode before final measurement.
|
|
20
|
+
|
|
21
|
+
## Choose responsive scope
|
|
22
|
+
|
|
23
|
+
- **This breakpoint** records the current configured breakpoint as the change context.
|
|
24
|
+
- **All breakpoints** is an explicit promotion. Keep it unavailable until the selected target has exact source mapping.
|
|
25
|
+
|
|
26
|
+
Never infer a global responsive edit from a successful local preview. If a custom-width failure does not map to a configured breakpoint or source boundary, preserve the evidence and ask the user to choose the intended source scope.
|
|
27
|
+
|
|
28
|
+
## Verify after apply
|
|
29
|
+
|
|
30
|
+
1. Rebuild the real application.
|
|
31
|
+
2. Reopen the linked selection at every approved viewport using native iframe dimensions.
|
|
32
|
+
3. Compare the captured before and after measurements in the failing viewport or container context.
|
|
33
|
+
4. Confirm the original passing contexts remain stable.
|
|
34
|
+
5. Report unsupported, cross-origin, or unavailable contexts explicitly rather than substituting the current viewport.
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# Typography Studio
|
|
2
|
+
|
|
3
|
+
Typography Studio turns the selected rendered text into a source-accountable typography workspace.
|
|
4
|
+
|
|
5
|
+
1. Select a text layer on Canvas, then open **Typography studio** from the workspace menu, command palette, or `0` shortcut.
|
|
6
|
+
2. Use **Project** to review fonts already active or declared in the product. Choosing one creates a normal reviewed font-family change.
|
|
7
|
+
3. Use **Google** to preview the live catalog. Before review, choose the project-appropriate integration strategy. Foundry records the exact family, weight, style, source actions, and verification plan as evidence.
|
|
8
|
+
4. Use **Local** to preview fonts installed on the device when the browser supports local font access. Local fonts are never written to source without an explicit project asset or integration decision.
|
|
9
|
+
5. Use the live specimen, rendered metrics, diagnostics, and project usage map to judge the change in context. Do not treat the specimen alone as proof that the rebuilt product is correct.
|
|
10
|
+
6. Type treatments and modular or fluid scale values are temporary until added to review. Reset restores the original inline values without creating a change.
|
|
11
|
+
7. Saved project styles are local design memory. Applying one still creates exact reviewed property changes; saving a style does not silently create source tokens.
|
|
12
|
+
8. During apply, preserve the project-native font system, aliases, loading strategy, and framework conventions. Verify the rebuilt family, weight, style, axes, size, line height, tracking, wrapping, clipping, and load status across every recorded viewport, theme, and state.
|
|
13
|
+
|
|
14
|
+
Do not claim that a local preview is portable. Do not add a Google or self-hosted font without its recorded source plan. Do not hide overflow or clipping by changing the viewport.
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# Visual Agent conversation
|
|
2
|
+
|
|
3
|
+
Use this workflow only for a request claimed through `foundry_design_wait_for_work` or `foundry_design_wait_for_visual_request`.
|
|
4
|
+
|
|
5
|
+
1. Read every attached rendered target, drawn region, contextual comment, source location, viewport, breakpoint, theme, state, measurement, token, and design-graph revision before proposing a direction.
|
|
6
|
+
2. Inspect the referenced source and project conventions. State when a source location, token mapping, responsive effect, or measurement is unresolved. Do not fill missing evidence with an approximation.
|
|
7
|
+
3. Explain the visual cause in plain language. Connect each conclusion to the rendered or source evidence that supports it.
|
|
8
|
+
4. Return one to three meaningfully different proposals. For each proposal include a concise name, summary, reasoning, exact values, affected source locations, responsive impact, a verification plan, and complete draft `DesignChange` records for previewable edits.
|
|
9
|
+
5. Keep each proposal internally coherent and independently previewable. Do not mix competing directions into one change list.
|
|
10
|
+
6. Do not edit source, approve changes, or choose a proposal for the user. `foundry_design_respond_to_visual_request` only returns isolated proposals to Foundry.
|
|
11
|
+
7. If the context is insufficient, return a clear explanation with no speculative changes. Ask for a narrower selection, region, state, or source mapping.
|
|
12
|
+
8. After responding, resume `foundry_design_wait_for_work`. The user may preview, reject, or promote a proposal. Only a later reviewed Apply run authorizes source edits.
|
|
13
|
+
|
|
14
|
+
If a claim expires, stop. Do not retry automatically. Foundry preserves the request and requires the user to authorize a retry. If an applied proposal fails rebuilt verification, report the exact requested and rendered values and wait for explicit retry authorization.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "foundry-design",
|
|
3
|
-
"version": "0.2.0-beta.
|
|
3
|
+
"version": "0.2.0-beta.18",
|
|
4
4
|
"description": "Install and run the local-first Foundry visual design control plane",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"files": [
|
|
@@ -34,8 +34,8 @@
|
|
|
34
34
|
"inspector"
|
|
35
35
|
],
|
|
36
36
|
"dependencies": {
|
|
37
|
-
"foundry-design-
|
|
38
|
-
"foundry-design-
|
|
37
|
+
"foundry-design-runtime": "0.2.0-beta.18",
|
|
38
|
+
"foundry-design-protocol": "0.2.0-beta.18"
|
|
39
39
|
},
|
|
40
40
|
"scripts": {
|
|
41
41
|
"build": "tsc -p tsconfig.json && node ../../scripts/copy-cli-skill.mjs",
|