@syncline-design/cli 0.1.0-sandbox.44 → 0.1.0-sandbox.46
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 +27 -0
- package/bin.js +1 -1
- package/index.js +51 -2
- package/package.json +1 -1
- package/{run-DJcpz49c.js → run-oaaRlk5Q.js} +4854 -4022
package/README.md
CHANGED
|
@@ -84,6 +84,10 @@ Every key is optional; this is the full shape with its defaults. The Figma plugi
|
|
|
84
84
|
"llm": false, // paid: let the bridge resolve what a 3-way merge can't
|
|
85
85
|
"sendSource": false, // required with llm: the conflicting files' source is sent to the bridge
|
|
86
86
|
},
|
|
87
|
+
"enrichStories": {
|
|
88
|
+
"enabled": false, // paid: AI-proposed stories with play() tests, for components with no stories file yet
|
|
89
|
+
"verify": true, // run each proposed story (jsdom, your Vitest) and write only the ones that pass
|
|
90
|
+
},
|
|
87
91
|
"theme": {
|
|
88
92
|
"cssReset": false, // global page state, so opt-in
|
|
89
93
|
"backgroundToken": "Background/Default/Default",
|
|
@@ -212,6 +216,29 @@ keep every export, and contain no conflict markers); anything else leaves the
|
|
|
212
216
|
conflict to you. `--check` never calls the bridge, and a run without a bridge,
|
|
213
217
|
credentials or the paid plan just reports the conflicts.
|
|
214
218
|
|
|
219
|
+
## AI-proposed stories (`enrichStories`)
|
|
220
|
+
|
|
221
|
+
With `enrichStories.enabled` (a paid feature) the CLI asks the bridge for extra
|
|
222
|
+
stories with `play()` interaction tests, for every component that has no stories
|
|
223
|
+
file yet. **Only facts leave the repo**: prop names and closed option lists, and
|
|
224
|
+
the roles and texts a story can act on; no source code. The model's answer is
|
|
225
|
+
data that the CLI validates against the real component (props, options and
|
|
226
|
+
targets must exist) before it renders the `play()` with `storybook/test`, so
|
|
227
|
+
whatever the model gets wrong is dropped, not written. Answers are cached in
|
|
228
|
+
`.figma/stories.enriched.json` (commit it), `--check` and `--no-enrich` never
|
|
229
|
+
call the bridge, and a run without a bridge, credentials or the paid plan just
|
|
230
|
+
writes the plain stories. An existing stories file is never rewritten.
|
|
231
|
+
|
|
232
|
+
**Every proposed story is run before it is written** (`enrichStories.verify`, on
|
|
233
|
+
by default). The model cannot know what a component really does, and in a first
|
|
234
|
+
trial 44% of the proposals failed when run. The CLI renders the proposals into
|
|
235
|
+
the project, runs them headless with the project's own Vitest (jsdom, your
|
|
236
|
+
`vite.config.*` and `.storybook/preview`, Storybook's portable stories), keeps
|
|
237
|
+
the ones that pass and records the rest, with the reason, under `rejected` in the
|
|
238
|
+
cache, so a re-run does not ask again. It needs `vitest`, `jsdom` and
|
|
239
|
+
`@storybook/react` in the project; without them nothing is written and the run
|
|
240
|
+
says why. Set `verify` to `false` to write the proposals unchecked.
|
|
241
|
+
|
|
215
242
|
## Dependencies
|
|
216
243
|
|
|
217
244
|
The generated code imports `react`, `react-dom`, `styled-components` and, with
|
package/bin.js
CHANGED
package/index.js
CHANGED
|
@@ -1,2 +1,51 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
1
|
+
import { A as e, C as t, D as n, E as r, O as i, S as a, T as o, _ as s, a as c, b as l, c as u, d, f, g as p, h as m, i as h, k as g, l as _, m as v, n as y, o as b, p as x, r as S, s as C, t as w, u as T, v as E, w as D, x as O, y as k } from "./run-oaaRlk5Q.js";
|
|
2
|
+
import { join as A } from "node:path";
|
|
3
|
+
//#region src/stories/project-step.ts
|
|
4
|
+
async function j(n) {
|
|
5
|
+
let { cwd: r, config: i, io: o } = n;
|
|
6
|
+
if (!i.enrichStories.enabled) return { status: "disabled" };
|
|
7
|
+
let s = a({
|
|
8
|
+
root: r,
|
|
9
|
+
designPath: i.inputs.design,
|
|
10
|
+
enrichedPath: i.inputs.enriched,
|
|
11
|
+
assetsPath: i.inputs.assets,
|
|
12
|
+
annotationsPath: i.inputs.annotations,
|
|
13
|
+
brandImage: i.theme.brand?.image
|
|
14
|
+
});
|
|
15
|
+
if (s.ok === !1) return {
|
|
16
|
+
status: "no-design",
|
|
17
|
+
reason: s.error
|
|
18
|
+
};
|
|
19
|
+
let l = A(r, i.inputs.stories), u = n.env ?? process.env, d = await f({
|
|
20
|
+
input: {
|
|
21
|
+
...s.input,
|
|
22
|
+
existing: O(r)
|
|
23
|
+
},
|
|
24
|
+
config: i,
|
|
25
|
+
cachePath: l,
|
|
26
|
+
bridgeUrl: t({
|
|
27
|
+
env: u,
|
|
28
|
+
configured: i.enrich.bridgeUrl ?? n.bridgeUrl,
|
|
29
|
+
baked: e
|
|
30
|
+
}),
|
|
31
|
+
audience: n.audience ?? i.enrich.audience,
|
|
32
|
+
provider: n.provider,
|
|
33
|
+
io: o,
|
|
34
|
+
env: u,
|
|
35
|
+
fetch: n.fetch,
|
|
36
|
+
sleep: n.sleep
|
|
37
|
+
});
|
|
38
|
+
if (!d) return { status: "skipped" };
|
|
39
|
+
let p = i.enrichStories.verify ? await b({
|
|
40
|
+
...n,
|
|
41
|
+
cachePath: l,
|
|
42
|
+
generate: c
|
|
43
|
+
}) : void 0;
|
|
44
|
+
return {
|
|
45
|
+
status: "done",
|
|
46
|
+
proposals: d.size,
|
|
47
|
+
...p && { verified: p }
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
//#endregion
|
|
51
|
+
export { o as BridgeError, w as CLI_NAME, g as CLI_VERSION, n as CliConfigSchema, i as DEFAULT_CONFIG_FILE, C as applyVerification, E as bridgeClientProvider, T as cachedStoryEnrichment, r as createBridgeClient, k as enrichDesign, v as enrichStories, p as formatFiles, c as generate, D as getBridgeToken, l as hashFacts, m as hashStoryFacts, y as helpText, h as loadCliConfig, u as proposalKeys, d as readStoriesCache, S as run, s as runEnrichStep, j as runProjectStoriesStep, f as runStoriesStep, _ as runVitestHarness, x as selectProposals, b as verifyProposals };
|