@syncline-design/cli 0.0.0-stage → 0.1.0-sandbox.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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Istvan Polacsek
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,3 +1,305 @@
1
- # Temporary Holding Version
1
+ # @syncline-design/cli
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ Generates a React component library from a Figma export. It needs only Node:
4
+ no nx, no monorepo tooling, and the generated library has no dependency on it.
5
+
6
+ ```bash
7
+ npx @syncline-design/cli generate # write the generated files
8
+ npx @syncline-design/cli generate --check # write nothing; exit 1 if they are out of date
9
+ ```
10
+
11
+ Two release channels share this package:
12
+
13
+ - **`@sandbox`**: `npx @syncline-design/cli@sandbox …` talks to the sandbox bridge by
14
+ default, so AI enrichment needs no bridge configuration.
15
+ - **`latest`**: the stable release. It has no bridge baked in; enrichment is off
16
+ until you point it at one (see below).
17
+
18
+ Until the first stable release only the `sandbox` tag exists.
19
+
20
+ ## What it reads and writes
21
+
22
+ | | |
23
+ | ------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
24
+ | Reads | `.figma/design.json` (required), `.figma/assets.json`, `.figma/annotations.json` and `.figma/design.enriched.json` (optional), `syncline.config.json` (optional) |
25
+ | Writes | components, stories, vector assets, the theme and its `ThemeProvider`, Storybook docs and wiring (`.storybook/`), and the `tsconfig.json` entry for the theme typings |
26
+
27
+ Output is formatted with **your own prettier config**, so it matches what your
28
+ commit hooks produce and a re-run shows no formatting churn.
29
+
30
+ Hand-editable files are written once and never overwritten unless you ask:
31
+ stories (`stories.overwrite`), docs guidelines (`docs.overwriteGuidelines`) and
32
+ a hand-written `.storybook/manager.ts`.
33
+
34
+ ## Options
35
+
36
+ | Option | |
37
+ | ----------------- | ----------------------------------------------------------------------------------------------- |
38
+ | `--config <file>` | Config file (default `syncline.config.json`; every setting has a default, so no file is needed) |
39
+ | `--cwd <dir>` | Project root (default: the current directory) |
40
+ | `--check` | Drift check for CI: nothing is written; exit 1 if the output differs from what is on disk |
41
+ | `--verbose` | List every warning instead of a per-phase count |
42
+ | `--accept <path>` | After a merge conflict you resolved by hand: keep the file and record the new base (repeatable) |
43
+
44
+ Warnings are design feedback (for example a fill that is not bound to a Figma
45
+ variable), never failures.
46
+
47
+ ## `syncline.config.json`
48
+
49
+ Every key is optional; this is the full shape with its defaults. The Figma plugin's first sync into a repo with no config adds one (framework, styling, library name and the paths below, for a single-level repo); after that it is yours to edit and syncs never touch it.
50
+
51
+ ```jsonc
52
+ {
53
+ "framework": "react",
54
+ "styling": "styled-components",
55
+ "libraryName": "design-system", // names the docs and the Storybook chrome
56
+ "inputs": {
57
+ "design": ".figma/design.json",
58
+ "enriched": ".figma/design.enriched.json", // absent on disk => raw tier
59
+ "assets": ".figma/assets.json",
60
+ "annotations": ".figma/annotations.json", // the designer's intents; absent => none
61
+ },
62
+ "paths": {
63
+ "components": "src/components",
64
+ "assetsRoot": "src", // the design's `assets/...` paths are relative to it
65
+ "theme": "src/providers/ThemeProvider",
66
+ "docs": "src/docs",
67
+ "storybook": ".storybook", // null: leave Storybook alone
68
+ "tsconfig": "tsconfig.json", // null: don't add theme.d.ts to `files`
69
+ },
70
+ "stories": {
71
+ "enabled": true,
72
+ "target": "react-vite", // or "react-native"
73
+ "typesPackage": null, // override the Storybook types package
74
+ "groupByPage": false, // title stories "<Figma page>/<Component>"; otherwise "Components/<Component>" (never ungrouped)
75
+ "overwrite": false,
76
+ },
77
+ "tests": {
78
+ "enabled": false, // a Vitest + Testing Library spec per component; needs vitest, jsdom and @testing-library/react
79
+ "overwrite": false, // specs are hand-owned: an existing file is kept
80
+ },
81
+ "merge": {
82
+ "enabled": false, // keep hand edits to generated components when the design changes
83
+ "baseDir": ".figma/base", // the last generated version of each component; commit it
84
+ "llm": false, // paid: let the bridge resolve what a 3-way merge can't
85
+ "sendSource": false, // required with llm: the conflicting files' source is sent to the bridge
86
+ },
87
+ "theme": {
88
+ "cssReset": false, // global page state, so opt-in
89
+ "backgroundToken": "Background/Default/Default",
90
+ "brand": {
91
+ "title": "My DS",
92
+ "image": "src/assets/logo.svg", // inlined as a data URI, up to 100 KB
93
+ "colorToken": "Brand/60",
94
+ "surfaceToken": "Brand/Grey",
95
+ },
96
+ },
97
+ "dependencies": {
98
+ "install": false, // true: add missing react/styled-components/Storybook packages with your package manager
99
+ },
100
+ "docs": {
101
+ "enabled": true,
102
+ "includeHidden": false, // tokens hidden from publishing in Figma
103
+ "overwriteGuidelines": false,
104
+ },
105
+ }
106
+ ```
107
+
108
+ ## For AI agents (`agent.enabled`)
109
+
110
+ Off by default. With `"agent": { "enabled": true, "packageName": "@acme/ds" }` the run also writes what a coding agent needs to use the library without reading its sources:
111
+
112
+ | File | Purpose |
113
+ | ------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
114
+ | `agent/llms.txt` | Index of every component, one line each ([llmstxt.org](https://llmstxt.org) layout) |
115
+ | `agent/components/<Name>.json` | One component's contract: props (types, options, defaults), what it renders / what renders it, widget behaviour **and what it does not cover**, a compiling example |
116
+ | `agent/components.json` | The same for all components in one file (used by `syncline mcp`) |
117
+ | `agent/tokens.json` | Every token: name, the `theme[...]` expression, value per mode, the designer's note |
118
+ | `agent/eslint-tokens.mjs` | ESLint flat-config fragment that flags raw colours in app code |
119
+ | `AGENTS.md` | The library's rules for an agent. Written once, then yours to edit |
120
+ | `src/index.ts` | A package entry exporting every component and the theme. Only written while the file is missing, `export {};` or generated by us; a hand-written entry is left alone (a diagnostic says so) |
121
+
122
+ Options: `agent.dir` (default `agent`), `agent.entry` (`src/index.ts`), `agent.guide` (`AGENTS.md`). Ship `agent/` in the published package so the files travel with the library.
123
+
124
+ `syncline mcp` serves the same data to an agent over MCP (stdio) with the tools `list_components`, `search_components`, `get_component` and `search_tokens`:
125
+
126
+ ```bash
127
+ claude mcp add design-system -- npx @syncline-design/cli mcp
128
+ ```
129
+
130
+ ## Storybook preview (paid)
131
+
132
+ ```bash
133
+ npx @syncline-design/cli preview publish --dir storybook-static
134
+ ```
135
+
136
+ Uploads a built Storybook to the bridge, which hosts it until the pull request
137
+ closes and links it from the sync in the Figma plugin. It needs the same bridge
138
+ and credentials as enrichment, the paid plan, and a `pull_request` run of a PR a
139
+ sync opened. Anything missing is reported and skipped (exit 0); only an unusable
140
+ build directory (no `index.html`, unhostable file names, over the size limits)
141
+ exits 1. The workflow a sync seeds runs it for accounts that have the plan.
142
+ `generate` also writes a minimal `.storybook/main.ts` when the repo has none.
143
+
144
+ ## Push token (for the seeded workflow)
145
+
146
+ `syncline ci push-token` asks the bridge for a short-lived token that lets the
147
+ generation job push to the sync's pull request as the GitHub App. In Actions it
148
+ masks the token and writes `token`, `name` and `email` to `$GITHUB_OUTPUT`;
149
+ without one (no bridge, no credentials, app not installed) it says why and exits
150
+ 0, and the workflow pushes with its own token instead.
151
+
152
+ ## TypeScript and Storybook defaults
153
+
154
+ - **`tsconfig.json`:** the generated components, ThemeProvider and Storybook decorator
155
+ use the automatic JSX runtime, so the project needs `"jsx": "react-jsx"`. A
156
+ repository with no tsconfig gets a minimal one (written once, never overwritten);
157
+ an existing self-contained one without `jsx` gets a warning instead of an edit.
158
+ `"paths": { "tsconfig": null }` opts out.
159
+ - **Generated tests** (`tests.enabled`, off by default): `<Component>/<Component>.spec.tsx`,
160
+ written from what the generated component provably does (renders and its root tag,
161
+ ref and native props, the suggested aria attributes, bound and toggled text, every
162
+ variant option, `onClick`/`disabled` on a button root, the input and progressbar
163
+ behaviour of those archetypes). A case the component's shape can't prove is left
164
+ out. No model and no network are involved. The file declares its own jsdom
165
+ environment, so it runs with a plain `vitest run`; it is hand-owned once written.
166
+ - **Stories are always titled** (`<Figma page>/<Name>` with `stories.groupByPage`,
167
+ else `Components/<Name>`), because Storybook lists ungrouped components above
168
+ every group. Existing stories files are hand-owned: set `stories.overwrite` once
169
+ to re-title them.
170
+ - **Branding:** the Storybook chrome (title, logo, colours, docs theme) is generated
171
+ only with `theme.brand`. The first sync seeds it from what the designer picked in
172
+ the plugin's Branding group (or, without a choice, a guess from the design):
173
+ `{ "title": "<library name>", "image": "src/assets/<Logo>/<Logo>.svg",
174
+ "colorToken": "Brand/…", "surfaceToken": "Brand/…" }`. `image` is a logo inlined up
175
+ to 100 KB; it may be one of the design's own exported assets even on the very
176
+ first run (the file does not need to exist yet). `colorToken` is the accent,
177
+ `surfaceToken` the sidebar background; both are colour variable names from
178
+ `design.json`. Edit them in the config afterwards.
179
+
180
+ ## Keeping hand edits (merge)
181
+
182
+ By default a generated component is rewritten on every run, so a hand edit to
183
+ it is lost. With `merge.enabled` the CLI records what it generated under
184
+ `merge.baseDir` (`<path>.base` files, **commit them**) and the next run does a
185
+ 3-way merge of base, your file and the new output, for component sources only
186
+ (`<Name>/<Name>.tsx`; stories, tests and guidelines are already yours):
187
+
188
+ - you changed nothing: the new output is written, as before;
189
+ - the generator changed nothing in that file: your file stays;
190
+ - you and the generator changed different places: both changes are merged;
191
+ - the same lines: **a conflict**. Your file stays untouched, the run reports it
192
+ (`--check` fails), and the base does not move, so it keeps being reported.
193
+ Resolve it by hand, then run `syncline generate --accept <path>` to record it.
194
+
195
+ A repo with no recorded base behaves as before (the output wins). Conflict
196
+ markers are never written into a source file.
197
+
198
+ With `merge.llm` and `merge.sendSource` (both required) the paid bridge may
199
+ resolve a conflict: **the base, your version and the new generated version of
200
+ each conflicting component are sent to the bridge** (at most 5 files of 60,000
201
+ characters per request; nothing else leaves the repo, and the bridge neither
202
+ stores nor logs them). The answer is checked before it is used (it must parse,
203
+ keep every export, and contain no conflict markers); anything else leaves the
204
+ conflict to you. `--check` never calls the bridge, and a run without a bridge,
205
+ credentials or the paid plan just reports the conflicts.
206
+
207
+ ## Dependencies
208
+
209
+ The generated code imports `react`, `react-dom`, `styled-components` and, with
210
+ stories, Storybook (`storybook`, `@storybook/react-vite`, `@storybook/addon-docs`,
211
+ `vite`) and, with `tests.enabled`, `vitest`, `jsdom` and Testing Library. After writing, `generate` compares that list with the `package.json`
212
+ files from the project up to the repository root and **warns** about what is
213
+ missing. With `"dependencies": { "install": true }` it **installs** them as dev
214
+ dependencies instead, using the package manager the repo's lockfile names (npm
215
+ when there is none, creating a minimal `package.json` and `.gitignore` if the
216
+ repo has neither). A failed install is a warning, never a failure; `--check`
217
+ never installs.
218
+
219
+ ## In CI
220
+
221
+ Regenerate after a design sync PR merges, and fail pull requests whose
222
+ generated files are stale:
223
+
224
+ ```yaml
225
+ name: synclineon:
226
+ push:
227
+ branches: [main]
228
+ paths: ['.figma/**', 'syncline.config.json']
229
+ pull_request:
230
+
231
+ jobs:
232
+ generate:
233
+ runs-on: ubuntu-latest
234
+ permissions:
235
+ contents: write
236
+ steps:
237
+ - uses: actions/checkout@v4
238
+ - uses: actions/setup-node@v4
239
+ with:
240
+ node-version: 24
241
+ - run: npm ci
242
+ # Pull requests: fail when the committed output is out of date.
243
+ - if: github.event_name == 'pull_request'
244
+ run: npx @syncline-design/cli generate --check
245
+ # Main: regenerate and commit the result.
246
+ - if: github.event_name == 'push'
247
+ run: |
248
+ npx @syncline-design/cli generate
249
+ git config user.name "syncline[bot]"
250
+ git config user.email "syncline[bot]@users.noreply.github.com"
251
+ git add -A
252
+ git diff --cached --quiet || git commit -m "chore: regenerate from Figma" && git push
253
+ ```
254
+
255
+ ## AI enrichment (paid)
256
+
257
+ Enrichment gives components semantic HTML tags, ARIA attributes and JSDoc. It
258
+ runs on the hosted bridge, so it needs a bridge URL and credentials, and the
259
+ GitHub account that owns the repository needs the paid plan with the bridge's
260
+ GitHub App installed on the repository. Without any of that the CLI generates
261
+ the raw tier and says why; **enrichment never makes a run fail**.
262
+
263
+ ```yaml
264
+ permissions:
265
+ contents: write
266
+ id-token: write # lets the job request a GitHub OIDC token for the bridge
267
+ ```
268
+
269
+ | | |
270
+ | ----------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- |
271
+ | Bridge URL | `SYNCLINE_URL`, then `enrich.bridgeUrl` in the config, then the build's own default (the sandbox build defaults to the sandbox bridge; `latest` has none) |
272
+ | Credentials | GitHub Actions' OIDC token (needs `id-token: write`), or `SYNCLINE_TOKEN` for local runs and other CI systems |
273
+
274
+ How a run behaves:
275
+
276
+ - The result is written to `.figma/design.enriched.json`, which is also the
277
+ cache: a component is only sent again when its facts or the bridge's prompt
278
+ version change. Commit the file, so the next run (and `--check`) reuses it.
279
+ - A component that fails is retried once, then left on the raw tier and retried
280
+ next run; everything that succeeded is kept. If the daily allowance runs out
281
+ mid-run, the rest are left for the next day.
282
+ - `--check` never calls the bridge, so a drift check is free and repeatable.
283
+ - The bridge only ever receives small per-component summaries, never
284
+ `design.json`.
285
+
286
+ ## Annotation overlay
287
+
288
+ `.figma/annotations.json` holds the same annotation lines a Figma component
289
+ description can carry (`@select`, `@input search`, `@continuous Progress 0..100`,
290
+ see the generated _Figma annotations_ guideline), keyed by the component's Figma
291
+ key, plus page entries (`@iconset` / `@iconset off`) for icon-set merging. The
292
+ plugin's review step writes it into the sync PR so the Figma file stays
293
+ untouched; you can also edit it by hand.
294
+
295
+ ```json
296
+ {
297
+ "version": 1,
298
+ "components": { "<component key>": "@select" },
299
+ "pages": { "Icons": "@iconset" }
300
+ }
301
+ ```
302
+
303
+ A line already in the component's Figma description wins. Entries that match no
304
+ component, or lines the generator does not read, are reported (`--verbose`) and
305
+ skipped; a malformed file stops the run instead of being ignored.
@@ -0,0 +1,95 @@
1
+ THIRD-PARTY NOTICES
2
+
3
+ This package bundles the third-party software listed below. Their licences
4
+ require the following notices to accompany copies of it.
5
+
6
+ ------------------------------------------------------------------------------
7
+
8
+ fflate@0.8.3 (MIT)
9
+ https://github.com/101arrowz/fflate
10
+
11
+ MIT License
12
+
13
+ Copyright (c) 2026 Arjun Barrett
14
+
15
+ Permission is hereby granted, free of charge, to any person obtaining a copy
16
+ of this software and associated documentation files (the "Software"), to deal
17
+ in the Software without restriction, including without limitation the rights
18
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
19
+ copies of the Software, and to permit persons to whom the Software is
20
+ furnished to do so, subject to the following conditions:
21
+
22
+ The above copyright notice and this permission notice shall be included in all
23
+ copies or substantial portions of the Software.
24
+
25
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
26
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
27
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
28
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
29
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
30
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
31
+ SOFTWARE.
32
+
33
+ ------------------------------------------------------------------------------
34
+
35
+ node-diff3@3.2.1 (MIT)
36
+ https://github.com/bhousel/node-diff3
37
+
38
+ ### The MIT License (MIT)
39
+
40
+ diff function extracted from Project Synchrotron.
41
+
42
+ For more detail please visit:
43
+ - https://leastfixedpoint.com/tonyg/kcbbs/projects/synchrotron.html
44
+ - https://github.com/tonyg/synchrotron
45
+
46
+ Copyright (c) 2006, 2008 Tony Garnock-Jones &lt;tonyg@lshift.net&gt;<br/>
47
+ Copyright (c) 2006, 2008 LShift Ltd. &lt;query@lshift.net&gt;<br/>
48
+ Copyright (c) 2019-2026 Bryan Housel &lt;bhousel@gmail.com&gt;<br/>
49
+
50
+ Permission is hereby granted, free of charge, to any person
51
+ obtaining a copy of this software and associated documentation files
52
+ (the "Software"), to deal in the Software without restriction,
53
+ including without limitation the rights to use, copy, modify, merge,
54
+ publish, distribute, sublicense, and/or sell copies of the Software,
55
+ and to permit persons to whom the Software is furnished to do so,
56
+ subject to the following conditions:
57
+
58
+ The above copyright notice and this permission notice shall be
59
+ included in all copies or substantial portions of the Software.
60
+
61
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
62
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
63
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
64
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
65
+ BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
66
+ ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
67
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
68
+ SOFTWARE.
69
+
70
+ ------------------------------------------------------------------------------
71
+
72
+ zod@4.6.5 (MIT)
73
+ https://github.com/colinhacks/zod
74
+
75
+ MIT License
76
+
77
+ Copyright (c) 2025 Colin McDonnell
78
+
79
+ Permission is hereby granted, free of charge, to any person obtaining a copy
80
+ of this software and associated documentation files (the "Software"), to deal
81
+ in the Software without restriction, including without limitation the rights
82
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
83
+ copies of the Software, and to permit persons to whom the Software is
84
+ furnished to do so, subject to the following conditions:
85
+
86
+ The above copyright notice and this permission notice shall be included in all
87
+ copies or substantial portions of the Software.
88
+
89
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
90
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
91
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
92
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
93
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
94
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
95
+ SOFTWARE.
package/bin.js ADDED
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env node
2
+ import { r as e } from "./run-rzkK5v61.js";
3
+ //#region src/bin.ts
4
+ e(process.argv.slice(2), {
5
+ out: (e) => process.stdout.write(e),
6
+ err: (e) => process.stderr.write(e)
7
+ }).then((e) => {
8
+ process.exitCode = e;
9
+ });
10
+ //#endregion
package/index.js ADDED
@@ -0,0 +1,2 @@
1
+ import { a as e, c as t, d as n, f as r, g as i, h as a, i as o, l as s, m as c, n as l, o as u, p as d, r as f, s as p, t as m, u as h } from "./run-rzkK5v61.js";
2
+ export { r as BridgeError, m as CLI_NAME, i as CLI_VERSION, c as CliConfigSchema, a as DEFAULT_CONFIG_FILE, t as bridgeClientProvider, d as createBridgeClient, s as enrichDesign, u as formatFiles, e as generate, n as getBridgeToken, h as hashFacts, l as helpText, o as loadCliConfig, f as run, p as runEnrichStep };
package/package.json CHANGED
@@ -1,6 +1,30 @@
1
1
  {
2
2
  "name": "@syncline-design/cli",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.1.0-sandbox.0",
4
+ "description": "Generates a React component library from a Figma export (Syncline).",
5
+ "license": "MIT",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/uxstudioteam/syncline.git"
9
+ },
10
+ "homepage": "https://syncline.design",
11
+ "type": "module",
12
+ "bin": {
13
+ "syncline": "./bin.js"
14
+ },
15
+ "engines": {
16
+ "node": ">=20"
17
+ },
18
+ "files": [
19
+ "*.js",
20
+ "README.md",
21
+ "LICENSE",
22
+ "THIRD-PARTY-NOTICES.txt"
23
+ ],
24
+ "publishConfig": {
25
+ "access": "public"
26
+ },
27
+ "dependencies": {
28
+ "prettier": "^3.9.6"
29
+ }
30
+ }