{"_id":"@0gfoundation/design-collab","_rev":"10-f0ed49ba6430cef0e8ad81905f090e57","name":"@0gfoundation/design-collab","dist-tags":{"latest":"0.3.4"},"versions":{"0.1.1":{"name":"@0gfoundation/design-collab","version":"0.1.1","author":{"name":"0G Labs"},"license":"ISC","_id":"@0gfoundation/design-collab@0.1.1","maintainers":[{"name":"overi","email":"ibrahim.over@0g.ai"},{"name":"0g-jiahao","email":"jiahao@0g.ai"},{"name":"0g-will","email":"will.riches@0g.ai"},{"name":"0g-xie","email":"xie@0g.ai"},{"name":"ymh357","email":"minghao.yu@0g.ai"},{"name":"wilbertwu","email":"wei@0g.ai"},{"name":"0g-peterzhang","email":"peter@0g.ai"}],"bin":{"design-collab":"bin/design-collab.mjs"},"dist":{"shasum":"c33b7f396964e313dfaa9b18de9e180abdb40cc7","tarball":"https://registry.npmjs.org/@0gfoundation/design-collab/-/design-collab-0.1.1.tgz","fileCount":50,"integrity":"sha512-ke9+MNkrt9q04mShnJ3zKdH5DKrYIzCuQjhPSjfT4jjGv3oZcY9cWnDzXxKHWm3fKzxuZ7eTByc/dLYjZ+5YVA==","signatures":[{"sig":"MEQCIDquk1QApw87pidkqxxHNxuqNqjkMV8x2l9nGztuIZRzAiAacfKA3XzCfsJS8rFu0384wXHljMow9hGDQWIbtmIU4g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":364930},"type":"module","engines":{"node":">=20.0.0"},"exports":{".":"./src/index.mjs","./lib/*":"./src/lib/*.mjs","./config":"./src/config.mjs","./runner":"./src/runner.mjs","./checks/*":"./src/checks/*.mjs","./storybook":"./src/storybook/preset.mjs","./storybook/*":"./src/storybook/*.mjs"},"gitHead":"2aae11231cbc65042c2e0e67344058ae0ca1cd1a","scripts":{"test":"node --test test/*.test.mjs","typecheck":"tsc -p tsconfig.json"},"_npmUser":{"name":"ymh357","email":"minghao.yu@0g.ai"},"//exports":"NOTE: every key here must start with '.'. Node rejects an exports object that mixes subpath keys with anything else, so a '//comment' key inside it silently invalidates the whole map — the package then resolves as if it had no exports at all. Keep prose out here. ./lib/* exists because a consumer shares the hardcoded-copy predicate with its own eslint rule and script, so the editor, the script and the gate cannot disagree about what counts as copy.","_npmVersion":"10.8.2","description":"Designer/front-end collaboration infrastructure: per-commit Storybook, an aggregated design gate, and branch sync that never hands a designer a conflict.","directories":{},"_nodeVersion":"20.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"//publishConfig":"PUBLIC on npmjs, and the access field says so explicitly because a scoped package defaults to restricted and npm refuses the publish rather than guessing. This was on GitHub Packages first; that combination cost four separate failures — pnpm requesting a tarball path GitHub does not serve, a scope registry line hijacking a sibling package published on npmjs, GITHUB_TOKEN able to read metadata but not download on the Team plan, and finally a valid PAT still 401ing through pnpm. Each fix landed and the next layer appeared. The package holds no secrets (tooling only; the one `sk-live-` string is a test fixture) and its entire value is being reused, so the configuration burden was buying nothing.","devDependencies":{"typescript":"^5.9.0","@types/node":"^22.0.0"},"peerDependencies":{"storybook":">=10"},"//devDependencies":"Type definitions only, and they matter: this package is plain ESM checked with JSDoc + checkJs, and it imports node:fs, node:path and node:util throughout. It borrowed the host product's @types/node while it lived in that repo — an implicit dependency that only showed up when tsc ran here on its own. Nothing here reaches a consumer; `dependencies` stays empty on purpose.","peerDependenciesMeta":{"storybook":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/design-collab_0.1.1_1788233376354_0.22147724921858924","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@0gfoundation/design-collab","version":"0.2.0","author":{"name":"0G Labs"},"license":"ISC","_id":"@0gfoundation/design-collab@0.2.0","maintainers":[{"name":"overi","email":"ibrahim.over@0g.ai"},{"name":"0g-jiahao","email":"jiahao@0g.ai"},{"name":"0g-will","email":"will.riches@0g.ai"},{"name":"0g-xie","email":"xie@0g.ai"},{"name":"ymh357","email":"minghao.yu@0g.ai"},{"name":"wilbertwu","email":"wei@0g.ai"},{"name":"0g-peterzhang","email":"peter@0g.ai"}],"bin":{"design-collab":"bin/design-collab.mjs"},"dist":{"shasum":"fde16d7866264ce2f8a6a054da17a7c761e017a1","tarball":"https://registry.npmjs.org/@0gfoundation/design-collab/-/design-collab-0.2.0.tgz","fileCount":52,"integrity":"sha512-UZcLwnGOZK4rENFdAlOVN457n6nHtwx3JkXV2H80d5GNi1oPC9hiHrziiJapp56Lt0MIP2pMzWd77RV6KrftzQ==","signatures":[{"sig":"MEUCIEDbCI6LDjiAqkkk/7c2STlS6EybGrss77pcxDhNjNTFAiEA/zhnW1aZ44+RL5le3VLYInOjI3aFXYOJ9FvhmpEcVaM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":392514},"type":"module","engines":{"node":">=20.0.0"},"exports":{".":"./src/index.mjs","./lib/*":"./src/lib/*.mjs","./config":"./src/config.mjs","./runner":"./src/runner.mjs","./checks/*":"./src/checks/*.mjs","./storybook":"./src/storybook/preset.mjs","./storybook/*":"./src/storybook/*.mjs"},"gitHead":"35048504d3de49e5ab0d00ffa84295f6fa448a18","scripts":{"test":"node --test test/*.test.mjs","typecheck":"tsc -p tsconfig.json"},"_npmUser":{"name":"ymh357","email":"minghao.yu@0g.ai"},"//exports":"NOTE: every key here must start with '.'. Node rejects an exports object that mixes subpath keys with anything else, so a '//comment' key inside it silently invalidates the whole map — the package then resolves as if it had no exports at all. Keep prose out here. ./lib/* exists because a consumer shares the hardcoded-copy predicate with its own eslint rule and script, so the editor, the script and the gate cannot disagree about what counts as copy.","_npmVersion":"10.9.8","description":"Designer/front-end collaboration infrastructure: per-commit Storybook, an aggregated design gate, and branch sync that never hands a designer a conflict.","directories":{},"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"//publishConfig":"PUBLIC on npmjs, and the access field says so explicitly because a scoped package defaults to restricted and npm refuses the publish rather than guessing. This was on GitHub Packages first; that combination cost four separate failures — pnpm requesting a tarball path GitHub does not serve, a scope registry line hijacking a sibling package published on npmjs, GITHUB_TOKEN able to read metadata but not download on the Team plan, and finally a valid PAT still 401ing through pnpm. Each fix landed and the next layer appeared. The package holds no secrets (tooling only; the one `sk-live-` string is a test fixture) and its entire value is being reused, so the configuration burden was buying nothing.","devDependencies":{"typescript":"^5.9.0","@types/node":"^22.0.0"},"peerDependencies":{"storybook":">=10"},"//devDependencies":"Type definitions only, and they matter: this package is plain ESM checked with JSDoc + checkJs, and it imports node:fs, node:path and node:util throughout. It borrowed the host product's @types/node while it lived in that repo — an implicit dependency that only showed up when tsc ran here on its own. Nothing here reaches a consumer; `dependencies` stays empty on purpose.","peerDependenciesMeta":{"storybook":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/design-collab_0.2.0_1788242826526_0.7490804750064006","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@0gfoundation/design-collab","version":"0.2.1","author":{"name":"0G Labs"},"license":"ISC","_id":"@0gfoundation/design-collab@0.2.1","maintainers":[{"name":"overi","email":"ibrahim.over@0g.ai"},{"name":"0g-jiahao","email":"jiahao@0g.ai"},{"name":"0g-will","email":"will.riches@0g.ai"},{"name":"0g-xie","email":"xie@0g.ai"},{"name":"ymh357","email":"minghao.yu@0g.ai"},{"name":"wilbertwu","email":"wei@0g.ai"},{"name":"0g-peterzhang","email":"peter@0g.ai"}],"bin":{"design-collab":"bin/design-collab.mjs"},"dist":{"shasum":"e6ddd06ce8e97720058fbb77d89805a3d44d0394","tarball":"https://registry.npmjs.org/@0gfoundation/design-collab/-/design-collab-0.2.1.tgz","fileCount":52,"integrity":"sha512-HFilS9/lRh1WLdurvlfyHkil7jao4xYCTh9FTKtCfrTILagaNx1OOeidT5LufyUwQAhy7KGoFG+D116gPCOq0w==","signatures":[{"sig":"MEUCIQDSFGDgjZir5TEUJ8dQp9UFHs1q+attISsUaMI9ubbjEwIgfCELA40owIXJId2plvuHdY96x5widdlqvstsLmUkfWg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":393504},"type":"module","engines":{"node":">=20.0.0"},"exports":{".":"./src/index.mjs","./lib/*":"./src/lib/*.mjs","./config":"./src/config.mjs","./runner":"./src/runner.mjs","./checks/*":"./src/checks/*.mjs","./storybook":"./src/storybook/preset.mjs","./storybook/*":"./src/storybook/*.mjs"},"gitHead":"d8e8d7c06389e0cc1579f1811afc00a8efb42860","scripts":{"test":"node --test test/*.test.mjs","typecheck":"tsc -p tsconfig.json"},"_npmUser":{"name":"ymh357","email":"minghao.yu@0g.ai"},"//exports":"NOTE: every key here must start with '.'. Node rejects an exports object that mixes subpath keys with anything else, so a '//comment' key inside it silently invalidates the whole map — the package then resolves as if it had no exports at all. Keep prose out here. ./lib/* exists because a consumer shares the hardcoded-copy predicate with its own eslint rule and script, so the editor, the script and the gate cannot disagree about what counts as copy.","_npmVersion":"10.9.8","description":"Designer/front-end collaboration infrastructure: per-commit Storybook, an aggregated design gate, and branch sync that never hands a designer a conflict.","directories":{},"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"//publishConfig":"PUBLIC on npmjs, and the access field says so explicitly because a scoped package defaults to restricted and npm refuses the publish rather than guessing. This was on GitHub Packages first; that combination cost four separate failures — pnpm requesting a tarball path GitHub does not serve, a scope registry line hijacking a sibling package published on npmjs, GITHUB_TOKEN able to read metadata but not download on the Team plan, and finally a valid PAT still 401ing through pnpm. Each fix landed and the next layer appeared. The package holds no secrets (tooling only; the one `sk-live-` string is a test fixture) and its entire value is being reused, so the configuration burden was buying nothing.","devDependencies":{"typescript":"^5.9.0","@types/node":"^22.0.0"},"peerDependencies":{"storybook":">=10"},"//devDependencies":"Type definitions only, and they matter: this package is plain ESM checked with JSDoc + checkJs, and it imports node:fs, node:path and node:util throughout. It borrowed the host product's @types/node while it lived in that repo — an implicit dependency that only showed up when tsc ran here on its own. Nothing here reaches a consumer; `dependencies` stays empty on purpose.","peerDependenciesMeta":{"storybook":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/design-collab_0.2.1_1788244009078_0.027891615332286346","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"@0gfoundation/design-collab","version":"0.2.2","author":{"name":"0G Labs"},"license":"ISC","_id":"@0gfoundation/design-collab@0.2.2","maintainers":[{"name":"overi","email":"ibrahim.over@0g.ai"},{"name":"0g-jiahao","email":"jiahao@0g.ai"},{"name":"0g-will","email":"will.riches@0g.ai"},{"name":"0g-xie","email":"xie@0g.ai"},{"name":"ymh357","email":"minghao.yu@0g.ai"},{"name":"wilbertwu","email":"wei@0g.ai"},{"name":"0g-peterzhang","email":"peter@0g.ai"}],"bin":{"design-collab":"bin/design-collab.mjs"},"dist":{"shasum":"fa2e8846ebfd31015344c9c0e71cd84c35674939","tarball":"https://registry.npmjs.org/@0gfoundation/design-collab/-/design-collab-0.2.2.tgz","fileCount":52,"integrity":"sha512-nPSivuq9dpuPU8Y25MqgI2yWXNH4uEyb2H+NgccSBD2SkzVm/umWM8kX7veXjP/p9K9PMh8qeuFQ6w8t02APpA==","signatures":[{"sig":"MEUCIAy4jFJBtlNb4dmViGcogt9EZOb/btlg8UZHOA8hE+vhAiEAr1eLdk0y0iuHnyuy1kaEh7YZfR/XoB7LxNPm3QiiQ4A=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":404972},"type":"module","engines":{"node":">=20.0.0"},"exports":{".":"./src/index.mjs","./lib/*":"./src/lib/*.mjs","./config":"./src/config.mjs","./runner":"./src/runner.mjs","./checks/*":"./src/checks/*.mjs","./storybook":"./src/storybook/preset.mjs","./storybook/*":"./src/storybook/*.mjs"},"gitHead":"655f4fd683945afac024027605bbd9599c94298a","scripts":{"test":"node --test test/*.test.mjs","typecheck":"tsc -p tsconfig.json"},"_npmUser":{"name":"ymh357","email":"minghao.yu@0g.ai"},"//exports":"NOTE: every key here must start with '.'. Node rejects an exports object that mixes subpath keys with anything else, so a '//comment' key inside it silently invalidates the whole map — the package then resolves as if it had no exports at all. Keep prose out here. ./lib/* exists because a consumer shares the hardcoded-copy predicate with its own eslint rule and script, so the editor, the script and the gate cannot disagree about what counts as copy.","_npmVersion":"10.9.8","description":"Designer/front-end collaboration infrastructure: per-commit Storybook, an aggregated design gate, and branch sync that never hands a designer a conflict.","directories":{},"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"//publishConfig":"PUBLIC on npmjs, and the access field says so explicitly because a scoped package defaults to restricted and npm refuses the publish rather than guessing. This was on GitHub Packages first; that combination cost four separate failures — pnpm requesting a tarball path GitHub does not serve, a scope registry line hijacking a sibling package published on npmjs, GITHUB_TOKEN able to read metadata but not download on the Team plan, and finally a valid PAT still 401ing through pnpm. Each fix landed and the next layer appeared. The package holds no secrets (tooling only; the one `sk-live-` string is a test fixture) and its entire value is being reused, so the configuration burden was buying nothing.","devDependencies":{"typescript":"^5.9.0","@types/node":"^22.0.0"},"peerDependencies":{"storybook":">=10"},"//devDependencies":"Type definitions only, and they matter: this package is plain ESM checked with JSDoc + checkJs, and it imports node:fs, node:path and node:util throughout. It borrowed the host product's @types/node while it lived in that repo — an implicit dependency that only showed up when tsc ran here on its own. Nothing here reaches a consumer; `dependencies` stays empty on purpose.","peerDependenciesMeta":{"storybook":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/design-collab_0.2.2_1788248911762_0.6867297598973343","host":"s3://npm-registry-packages-npm-production"}},"0.2.3":{"name":"@0gfoundation/design-collab","version":"0.2.3","author":{"name":"0G Labs"},"license":"ISC","_id":"@0gfoundation/design-collab@0.2.3","maintainers":[{"name":"overi","email":"ibrahim.over@0g.ai"},{"name":"0g-jiahao","email":"jiahao@0g.ai"},{"name":"0g-will","email":"will.riches@0g.ai"},{"name":"0g-xie","email":"xie@0g.ai"},{"name":"ymh357","email":"minghao.yu@0g.ai"},{"name":"wilbertwu","email":"wei@0g.ai"},{"name":"0g-peterzhang","email":"peter@0g.ai"}],"bin":{"design-collab":"bin/design-collab.mjs"},"dist":{"shasum":"d3a44845c482417f8a5d84969143fcab9c2f02d4","tarball":"https://registry.npmjs.org/@0gfoundation/design-collab/-/design-collab-0.2.3.tgz","fileCount":52,"integrity":"sha512-2hlOyYmHqtnXBsTA4M/FplN69ViymiBnGy33ilJVpGotQ/a8jO3ItvcTMiSFfxZDvqQ7oNgO6xZDPlVgcPtgPg==","signatures":[{"sig":"MEQCIGNRhdPizQpy6t4e5qww/H6mtn9bTHZStJVII8ATlROFAiBqTFsgw5KCAp6d67x1TutQoFDfLJqbobx9+rE17MeSQQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":405548},"type":"module","engines":{"node":">=20.0.0"},"exports":{".":"./src/index.mjs","./lib/*":"./src/lib/*.mjs","./config":"./src/config.mjs","./runner":"./src/runner.mjs","./checks/*":"./src/checks/*.mjs","./storybook":"./src/storybook/preset.mjs","./storybook/*":"./src/storybook/*.mjs"},"gitHead":"8b53a341d4580021c4b38d87efe9530b3b782c81","scripts":{"test":"node --test test/*.test.mjs","typecheck":"tsc -p tsconfig.json"},"_npmUser":{"name":"ymh357","email":"minghao.yu@0g.ai"},"//exports":"NOTE: every key here must start with '.'. Node rejects an exports object that mixes subpath keys with anything else, so a '//comment' key inside it silently invalidates the whole map — the package then resolves as if it had no exports at all. Keep prose out here. ./lib/* exists because a consumer shares the hardcoded-copy predicate with its own eslint rule and script, so the editor, the script and the gate cannot disagree about what counts as copy.","_npmVersion":"10.9.8","description":"Designer/front-end collaboration infrastructure: per-commit Storybook, an aggregated design gate, and branch sync that never hands a designer a conflict.","directories":{},"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"//publishConfig":"PUBLIC on npmjs, and the access field says so explicitly because a scoped package defaults to restricted and npm refuses the publish rather than guessing. This was on GitHub Packages first; that combination cost four separate failures — pnpm requesting a tarball path GitHub does not serve, a scope registry line hijacking a sibling package published on npmjs, GITHUB_TOKEN able to read metadata but not download on the Team plan, and finally a valid PAT still 401ing through pnpm. Each fix landed and the next layer appeared. The package holds no secrets (tooling only; the one `sk-live-` string is a test fixture) and its entire value is being reused, so the configuration burden was buying nothing.","devDependencies":{"typescript":"^5.9.0","@types/node":"^22.0.0"},"peerDependencies":{"storybook":">=10"},"//devDependencies":"Type definitions only, and they matter: this package is plain ESM checked with JSDoc + checkJs, and it imports node:fs, node:path and node:util throughout. It borrowed the host product's @types/node while it lived in that repo — an implicit dependency that only showed up when tsc ran here on its own. Nothing here reaches a consumer; `dependencies` stays empty on purpose.","peerDependenciesMeta":{"storybook":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/design-collab_0.2.3_1788249644339_0.22278022640756245","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@0gfoundation/design-collab","version":"0.3.0","author":{"name":"0G Labs"},"license":"ISC","_id":"@0gfoundation/design-collab@0.3.0","maintainers":[{"name":"overi","email":"ibrahim.over@0g.ai"},{"name":"0g-jiahao","email":"jiahao@0g.ai"},{"name":"0g-will","email":"will.riches@0g.ai"},{"name":"0g-xie","email":"xie@0g.ai"},{"name":"ymh357","email":"minghao.yu@0g.ai"},{"name":"wilbertwu","email":"wei@0g.ai"},{"name":"0g-peterzhang","email":"peter@0g.ai"}],"bin":{"design-collab":"bin/design-collab.mjs"},"dist":{"shasum":"731cc1935adeeb8c45160dcbe578ab91c0156b4e","tarball":"https://registry.npmjs.org/@0gfoundation/design-collab/-/design-collab-0.3.0.tgz","fileCount":53,"integrity":"sha512-amoTeX2HayVMco5METGRDNuCAEzW9SOjdFys/AaGWEB4TAL4lXwL52kWPf3WnVofLTF+9GxJ/DwJYzvmOTqcXw==","signatures":[{"sig":"MEQCIDrEVFQq5XmlKtY3sRU1Oihws9wtuhZgMISLXu3AzbPsAiAJLH6/auOUKr6wWg3x75bXsE5YTYJhTI6n0Lwcthkr2Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":420171},"type":"module","engines":{"node":">=20.0.0"},"exports":{".":"./src/index.mjs","./lib/*":"./src/lib/*.mjs","./config":"./src/config.mjs","./runner":"./src/runner.mjs","./checks/*":"./src/checks/*.mjs","./storybook":"./src/storybook/preset.mjs","./storybook/*":"./src/storybook/*.mjs"},"gitHead":"4b97086c906fb66f0d808b0d3480043b25ccc047","scripts":{"test":"node --test test/*.test.mjs","typecheck":"tsc -p tsconfig.json"},"_npmUser":{"name":"ymh357","email":"minghao.yu@0g.ai"},"//exports":"NOTE: every key here must start with '.'. Node rejects an exports object that mixes subpath keys with anything else, so a '//comment' key inside it silently invalidates the whole map — the package then resolves as if it had no exports at all. Keep prose out here. ./lib/* exists because a consumer shares the hardcoded-copy predicate with its own eslint rule and script, so the editor, the script and the gate cannot disagree about what counts as copy.","_npmVersion":"10.9.8","description":"Designer/front-end collaboration infrastructure: per-commit Storybook, an aggregated design gate, and branch sync that never hands a designer a conflict.","directories":{},"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"//publishConfig":"PUBLIC on npmjs, and the access field says so explicitly because a scoped package defaults to restricted and npm refuses the publish rather than guessing. This was on GitHub Packages first; that combination cost four separate failures — pnpm requesting a tarball path GitHub does not serve, a scope registry line hijacking a sibling package published on npmjs, GITHUB_TOKEN able to read metadata but not download on the Team plan, and finally a valid PAT still 401ing through pnpm. Each fix landed and the next layer appeared. The package holds no secrets (tooling only; the one `sk-live-` string is a test fixture) and its entire value is being reused, so the configuration burden was buying nothing.","devDependencies":{"typescript":"^5.9.0","@types/node":"^22.0.0"},"peerDependencies":{"storybook":">=10"},"//devDependencies":"Type definitions only, and they matter: this package is plain ESM checked with JSDoc + checkJs, and it imports node:fs, node:path and node:util throughout. It borrowed the host product's @types/node while it lived in that repo — an implicit dependency that only showed up when tsc ran here on its own. Nothing here reaches a consumer; `dependencies` stays empty on purpose.","peerDependenciesMeta":{"storybook":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/design-collab_0.3.0_1788936014289_0.9240727424593742","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@0gfoundation/design-collab","version":"0.3.1","author":{"name":"0G Labs"},"license":"ISC","_id":"@0gfoundation/design-collab@0.3.1","maintainers":[{"name":"overi","email":"ibrahim.over@0g.ai"},{"name":"0g-jiahao","email":"jiahao@0g.ai"},{"name":"0g-will","email":"will.riches@0g.ai"},{"name":"0g-xie","email":"xie@0g.ai"},{"name":"ymh357","email":"minghao.yu@0g.ai"},{"name":"wilbertwu","email":"wei@0g.ai"},{"name":"0g-peterzhang","email":"peter@0g.ai"}],"bin":{"design-collab":"bin/design-collab.mjs"},"dist":{"shasum":"802915d9d3a810562773633bee0c85d24d799184","tarball":"https://registry.npmjs.org/@0gfoundation/design-collab/-/design-collab-0.3.1.tgz","fileCount":53,"integrity":"sha512-hj0gKPjVvDm1YCfsoREPAdUAIbxWb4da+A3LY+6nJVG9jiJnpIujlHPlISOquD8zkITJizGYPf2n3lIABg792w==","signatures":[{"sig":"MEQCIFLD3ASyWeBUhmsLKISiIyTzPK9xhDEPDItRTkOjiqBtAiB8BGc7yzpYms0b8Qab9jDNTqE0ONfswzDHLHJD/OlsKQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":422408},"type":"module","engines":{"node":">=20.0.0"},"exports":{".":"./src/index.mjs","./lib/*":"./src/lib/*.mjs","./config":"./src/config.mjs","./runner":"./src/runner.mjs","./checks/*":"./src/checks/*.mjs","./storybook":"./src/storybook/preset.mjs","./storybook/*":"./src/storybook/*.mjs"},"gitHead":"a1fd116a1b64a055864144569251a26819c52d7d","scripts":{"test":"node --test test/*.test.mjs","typecheck":"tsc -p tsconfig.json"},"_npmUser":{"name":"ymh357","email":"minghao.yu@0g.ai"},"//exports":"NOTE: every key here must start with '.'. Node rejects an exports object that mixes subpath keys with anything else, so a '//comment' key inside it silently invalidates the whole map — the package then resolves as if it had no exports at all. Keep prose out here. ./lib/* exists because a consumer shares the hardcoded-copy predicate with its own eslint rule and script, so the editor, the script and the gate cannot disagree about what counts as copy.","_npmVersion":"10.9.8","description":"Designer/front-end collaboration infrastructure: per-commit Storybook, an aggregated design gate, and branch sync that never hands a designer a conflict.","directories":{},"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"//publishConfig":"PUBLIC on npmjs, and the access field says so explicitly because a scoped package defaults to restricted and npm refuses the publish rather than guessing. This was on GitHub Packages first; that combination cost four separate failures — pnpm requesting a tarball path GitHub does not serve, a scope registry line hijacking a sibling package published on npmjs, GITHUB_TOKEN able to read metadata but not download on the Team plan, and finally a valid PAT still 401ing through pnpm. Each fix landed and the next layer appeared. The package holds no secrets (tooling only; the one `sk-live-` string is a test fixture) and its entire value is being reused, so the configuration burden was buying nothing.","devDependencies":{"typescript":"^5.9.0","@types/node":"^22.0.0"},"peerDependencies":{"storybook":">=10"},"//devDependencies":"Type definitions only, and they matter: this package is plain ESM checked with JSDoc + checkJs, and it imports node:fs, node:path and node:util throughout. It borrowed the host product's @types/node while it lived in that repo — an implicit dependency that only showed up when tsc ran here on its own. Nothing here reaches a consumer; `dependencies` stays empty on purpose.","peerDependenciesMeta":{"storybook":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/design-collab_0.3.1_1788938598325_0.18503795035296355","host":"s3://npm-registry-packages-npm-production"}},"0.3.2":{"name":"@0gfoundation/design-collab","version":"0.3.2","author":{"name":"0G Labs"},"license":"ISC","_id":"@0gfoundation/design-collab@0.3.2","maintainers":[{"name":"overi","email":"ibrahim.over@0g.ai"},{"name":"0g-jiahao","email":"jiahao@0g.ai"},{"name":"0g-will","email":"will.riches@0g.ai"},{"name":"0g-xie","email":"xie@0g.ai"},{"name":"ymh357","email":"minghao.yu@0g.ai"},{"name":"wilbertwu","email":"wei@0g.ai"},{"name":"0g-peterzhang","email":"peter@0g.ai"}],"bin":{"design-collab":"bin/design-collab.mjs"},"dist":{"shasum":"0adcaef8da43f03343bd97cc4f8fcef37caf44e3","tarball":"https://registry.npmjs.org/@0gfoundation/design-collab/-/design-collab-0.3.2.tgz","fileCount":53,"integrity":"sha512-nvmvy38YzUgxMdBlCrWvk51LpNyaEbAWt8TqYPm6kl++7GYY2DShG8q+g/v6Z2b0r310TGNaU08GtjcKB20P3A==","signatures":[{"sig":"MEUCIF6eWwSAK4KioZ2Gp5DXrWexL/JcH7aMVKxvMVxD5X+qAiEA0VKvI3DmEaTEahNSKexGvpcJS6ruFIMpvSU/YiC3pcQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":429760},"type":"module","engines":{"node":">=20.0.0"},"exports":{".":"./src/index.mjs","./lib/*":"./src/lib/*.mjs","./config":"./src/config.mjs","./runner":"./src/runner.mjs","./checks/*":"./src/checks/*.mjs","./storybook":"./src/storybook/preset.mjs","./storybook/*":"./src/storybook/*.mjs"},"gitHead":"605619a8e18baf08509074507a73f38df52a4aa2","scripts":{"test":"node --test test/*.test.mjs","typecheck":"tsc -p tsconfig.json"},"_npmUser":{"name":"ymh357","email":"minghao.yu@0g.ai"},"//exports":"NOTE: every key here must start with '.'. Node rejects an exports object that mixes subpath keys with anything else, so a '//comment' key inside it silently invalidates the whole map — the package then resolves as if it had no exports at all. Keep prose out here. ./lib/* exists because a consumer shares the hardcoded-copy predicate with its own eslint rule and script, so the editor, the script and the gate cannot disagree about what counts as copy.","_npmVersion":"10.9.8","description":"Designer/front-end collaboration infrastructure: per-commit Storybook, an aggregated design gate, and branch sync that never hands a designer a conflict.","directories":{},"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"//publishConfig":"PUBLIC on npmjs, and the access field says so explicitly because a scoped package defaults to restricted and npm refuses the publish rather than guessing. This was on GitHub Packages first; that combination cost four separate failures — pnpm requesting a tarball path GitHub does not serve, a scope registry line hijacking a sibling package published on npmjs, GITHUB_TOKEN able to read metadata but not download on the Team plan, and finally a valid PAT still 401ing through pnpm. Each fix landed and the next layer appeared. The package holds no secrets (tooling only; the one `sk-live-` string is a test fixture) and its entire value is being reused, so the configuration burden was buying nothing.","devDependencies":{"typescript":"^5.9.0","@types/node":"^22.0.0"},"peerDependencies":{"storybook":">=10"},"//devDependencies":"Type definitions only, and they matter: this package is plain ESM checked with JSDoc + checkJs, and it imports node:fs, node:path and node:util throughout. It borrowed the host product's @types/node while it lived in that repo — an implicit dependency that only showed up when tsc ran here on its own. Nothing here reaches a consumer; `dependencies` stays empty on purpose.","peerDependenciesMeta":{"storybook":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/design-collab_0.3.2_1788955892576_0.35723270647749583","host":"s3://npm-registry-packages-npm-production"}},"0.3.3":{"name":"@0gfoundation/design-collab","version":"0.3.3","author":{"name":"0G Labs"},"license":"ISC","_id":"@0gfoundation/design-collab@0.3.3","maintainers":[{"name":"overi","email":"ibrahim.over@0g.ai"},{"name":"0g-jiahao","email":"jiahao@0g.ai"},{"name":"0g-will","email":"will.riches@0g.ai"},{"name":"0g-xie","email":"xie@0g.ai"},{"name":"ymh357","email":"minghao.yu@0g.ai"},{"name":"wilbertwu","email":"wei@0g.ai"},{"name":"0g-peterzhang","email":"peter@0g.ai"}],"bin":{"design-collab":"bin/design-collab.mjs"},"dist":{"shasum":"80fd8cd185e2b3c1ed7753e6dcef897d507aa169","tarball":"https://registry.npmjs.org/@0gfoundation/design-collab/-/design-collab-0.3.3.tgz","fileCount":53,"integrity":"sha512-QfQUFqdxhdCu23pdaH80Hzyy1iZuNR7Jkq98DJyj2QgkzFD6bbjnrAyY0cweETuqKgPJKc0URJuWGGMJLctrdA==","signatures":[{"sig":"MEUCIE9a9A0VaIKyvvn6yX8GQqqWTxTE4StMnxuqRTGSlj3YAiEAvseTobPYEiNUd5rHDHbdedd5Uw9SpatQmLGuqZfjbTo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":434810},"type":"module","engines":{"node":">=20.0.0"},"exports":{".":"./src/index.mjs","./lib/*":"./src/lib/*.mjs","./config":"./src/config.mjs","./runner":"./src/runner.mjs","./checks/*":"./src/checks/*.mjs","./storybook":"./src/storybook/preset.mjs","./storybook/*":"./src/storybook/*.mjs"},"gitHead":"f64b6a7da637d2d662d833f9a805e22067002118","scripts":{"test":"node --test test/*.test.mjs","typecheck":"tsc -p tsconfig.json"},"_npmUser":{"name":"ymh357","email":"minghao.yu@0g.ai"},"//exports":"NOTE: every key here must start with '.'. Node rejects an exports object that mixes subpath keys with anything else, so a '//comment' key inside it silently invalidates the whole map — the package then resolves as if it had no exports at all. Keep prose out here. ./lib/* exists because a consumer shares the hardcoded-copy predicate with its own eslint rule and script, so the editor, the script and the gate cannot disagree about what counts as copy.","_npmVersion":"10.9.8","description":"Designer/front-end collaboration infrastructure: per-commit Storybook, an aggregated design gate, and branch sync that never hands a designer a conflict.","directories":{},"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"//publishConfig":"PUBLIC on npmjs, and the access field says so explicitly because a scoped package defaults to restricted and npm refuses the publish rather than guessing. This was on GitHub Packages first; that combination cost four separate failures — pnpm requesting a tarball path GitHub does not serve, a scope registry line hijacking a sibling package published on npmjs, GITHUB_TOKEN able to read metadata but not download on the Team plan, and finally a valid PAT still 401ing through pnpm. Each fix landed and the next layer appeared. The package holds no secrets (tooling only; the one `sk-live-` string is a test fixture) and its entire value is being reused, so the configuration burden was buying nothing.","devDependencies":{"typescript":"^5.9.0","@types/node":"^22.0.0"},"peerDependencies":{"storybook":">=10"},"//devDependencies":"Type definitions only, and they matter: this package is plain ESM checked with JSDoc + checkJs, and it imports node:fs, node:path and node:util throughout. It borrowed the host product's @types/node while it lived in that repo — an implicit dependency that only showed up when tsc ran here on its own. Nothing here reaches a consumer; `dependencies` stays empty on purpose.","peerDependenciesMeta":{"storybook":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/design-collab_0.3.3_1788956919524_0.7063913302021525","host":"s3://npm-registry-packages-npm-production"}},"0.3.4":{"name":"@0gfoundation/design-collab","version":"0.3.4","description":"Designer/front-end collaboration infrastructure: per-commit Storybook, an aggregated design gate, and branch sync that never hands a designer a conflict.","type":"module","license":"ISC","author":{"name":"0G Labs"},"engines":{"node":">=20.0.0"},"bin":{"design-collab":"bin/design-collab.mjs"},"//publishConfig":"PUBLIC on npmjs, and the access field says so explicitly because a scoped package defaults to restricted and npm refuses the publish rather than guessing. This was on GitHub Packages first; that combination cost four separate failures — pnpm requesting a tarball path GitHub does not serve, a scope registry line hijacking a sibling package published on npmjs, GITHUB_TOKEN able to read metadata but not download on the Team plan, and finally a valid PAT still 401ing through pnpm. Each fix landed and the next layer appeared. The package holds no secrets (tooling only; the one `sk-live-` string is a test fixture) and its entire value is being reused, so the configuration burden was buying nothing.","publishConfig":{"access":"public"},"//exports":"NOTE: every key here must start with '.'. Node rejects an exports object that mixes subpath keys with anything else, so a '//comment' key inside it silently invalidates the whole map — the package then resolves as if it had no exports at all. Keep prose out here. ./lib/* exists because a consumer shares the hardcoded-copy predicate with its own eslint rule and script, so the editor, the script and the gate cannot disagree about what counts as copy.","exports":{".":"./src/index.mjs","./config":"./src/config.mjs","./runner":"./src/runner.mjs","./storybook":"./src/storybook/preset.mjs","./storybook/*":"./src/storybook/*.mjs","./checks/*":"./src/checks/*.mjs","./lib/*":"./src/lib/*.mjs"},"scripts":{"test":"node --test test/*.test.mjs","typecheck":"tsc -p tsconfig.json"},"//devDependencies":"Type definitions only, and they matter: this package is plain ESM checked with JSDoc + checkJs, and it imports node:fs, node:path and node:util throughout. It borrowed the host product's @types/node while it lived in that repo — an implicit dependency that only showed up when tsc ran here on its own. Nothing here reaches a consumer; `dependencies` stays empty on purpose.","devDependencies":{"@types/node":"^22.0.0","typescript":"^5.9.0"},"peerDependencies":{"storybook":">=10"},"peerDependenciesMeta":{"storybook":{"optional":true}},"_id":"@0gfoundation/design-collab@0.3.4","gitHead":"b83cc0fc748edbab5c021cc61b5137cd62ec703c","_nodeVersion":"22.23.2","_npmVersion":"10.9.8","dist":{"integrity":"sha512-BPa7P8HUpmXvmwhukLwlgwNXfvRyVTzpoQuS3Iq62xU6MT5unzCGZe8oZxdLFwo7AMhDhq3+AvyVj9tvDA3yqQ==","shasum":"28e0aae9ff1e97158300eeddb1d210ad48198705","tarball":"https://registry.npmjs.org/@0gfoundation/design-collab/-/design-collab-0.3.4.tgz","fileCount":54,"unpackedSize":441794,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCEGvVCvtgIXBW6gpL21xVxfll4iEaEWP5z+W3dCJvgewIhALcBvsLWHRt5Ip65JQTaNjUHD73U12p/XcjsDwZvi0v0"}]},"_npmUser":{"name":"ymh357","email":"minghao.yu@0g.ai"},"directories":{},"maintainers":[{"name":"overi","email":"ibrahim.over@0g.ai"},{"name":"0g-jiahao","email":"jiahao@0g.ai"},{"name":"0g-will","email":"will.riches@0g.ai"},{"name":"0g-xie","email":"xie@0g.ai"},{"name":"ymh357","email":"minghao.yu@0g.ai"},{"name":"wilbertwu","email":"wei@0g.ai"},{"name":"0g-peterzhang","email":"peter@0g.ai"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/design-collab_0.3.4_1788972744167_0.5341891789369173"},"_hasShrinkwrap":false}},"time":{"created":"2026-09-01T03:29:36.234Z","modified":"2026-09-09T16:52:24.499Z","0.1.1":"2026-09-01T03:29:36.586Z","0.2.0":"2026-09-01T06:07:06.714Z","0.2.1":"2026-09-01T06:26:49.248Z","0.2.2":"2026-09-01T07:48:31.905Z","0.2.3":"2026-09-01T08:00:44.509Z","0.3.0":"2026-09-09T06:40:14.441Z","0.3.1":"2026-09-09T07:23:18.473Z","0.3.2":"2026-09-09T12:11:32.710Z","0.3.3":"2026-09-09T12:28:39.707Z","0.3.4":"2026-09-09T16:52:24.317Z"},"author":{"name":"0G Labs"},"license":"ISC","description":"Designer/front-end collaboration infrastructure: per-commit Storybook, an aggregated design gate, and branch sync that never hands a designer a conflict.","maintainers":[{"name":"overi","email":"ibrahim.over@0g.ai"},{"name":"0g-jiahao","email":"jiahao@0g.ai"},{"name":"0g-will","email":"will.riches@0g.ai"},{"name":"0g-xie","email":"xie@0g.ai"},{"name":"ymh357","email":"minghao.yu@0g.ai"},{"name":"wilbertwu","email":"wei@0g.ai"},{"name":"0g-peterzhang","email":"peter@0g.ai"}],"readme":"# @0gfoundation/design-collab\n\nInfrastructure for designer ↔ front-end collaboration in a shared codebase:\na per-commit Storybook, one aggregated design gate, and branch sync that never\nhands a designer a merge conflict.\n\nEvery check here is a **mechanism** with no project knowledge in it — \"a View\nmust have a sibling story\", \"a generated artifact must match its source\",\n\"these identifiers must not reach a production bundle\". Everything about *your*\nproject arrives through `design-collab.config.mjs`. That split is the whole\npoint: the mechanisms are portable, the paths are not.\n\nZero runtime dependencies. Node ≥ 20.\n\n> 中文的完整接入指南:[`ADOPTING.zh-CN.md`](./ADOPTING.zh-CN.md) — what `init`\n> reads and what it refuses to guess, how to read a gap, and what each of the\n> twelve checks needs before it can tell you anything.\n\n## Getting started\n\n```bash\npnpm add -D @0gfoundation/design-collab\n```\n\nPublic on npmjs, so there is nothing else to configure — no `.npmrc`, no\nregistry token in CI, no environment variable in your deploy platform. Then:\n\n```bash\ndesign-collab init             # writes the config; run it again to scaffold\n                               # the agent skill and the CI workflow\ndesign-collab install-drivers  # once per clone — see \"Merge drivers\" below\ndesign-collab start            # before each piece of design work\n```\n\n`init` runs in two passes on purpose. Without a config there is nothing to fill\nthe templates with, so the first pass writes only the config and stops. Once you\nhave edited it, the second pass generates the skill and the workflow **from your\nvalues**, so the three artifacts cannot disagree with each other.\n\nThe first pass reads your repository rather than copying an example: where the\napp lives, your source root, the path aliases in `tsconfig.json`, your typecheck\nscript, the base branch from `origin/HEAD`, and whether you have Storybook or an\ni18n library at all. It prints what it found and what it could not, and writes\nthe reasons into the file next to each value. Anything it could not observe is\n**absent rather than guessed** — the package's defaults then apply, and the gap\nstays visible.\n\nOne field is always yours: `writableSet` is written empty and an empty set is\nrejected at load time. Which paths a designer owns is a decision, not a property\nof your tree.\n\n## Adoption is not silent\n\nA check that cannot run does not report as one that passed. Three things used to\nlook identical in the output and now do not:\n\n| | Fails the run? |\n|---|---|\n| **declared** — you wrote `checks: { 'message-parity': false }` | no; it is an answer |\n| **n/a** — nothing relevant changed in this run | no |\n| **gap** — enabled, and it could not run | **yes** |\n\nA gap is either a check whose configuration is missing, or one that ran and\nexamined **zero** subjects. The second used to be the dangerous one: with globs\ndescribing a different repository, `view-stories` reported `PASS — 0 file(s)\ncovered` and `design-wiring` reported `PASS — no source files under src`. The\nsummary line then said \"all N check(s) passed\", because it counted only the\nchecks that ran.\n\nSo the summary now states every state at once —\n\n```\n[design-collab] 14 passed, 2 failed, 3 n/a.\n```\n\n— and each gap is listed with the one sentence that says what to do about it.\nConfigure it, or declare it inapplicable. Both are answers; leaving it silent is\nnot.\n\n## Commands\n\n| | |\n|---|---|\n| `start` | Preflight before writing code: branch topology, lineage, merge drivers, PR-body scaffold. |\n| `check` | Every gate CI runs, locally, reporting **all** failures at once. `--with-storybook` for the exact CI bar. |\n| `prepare` | Write what Storybook reads: the merged message catalogue and the three manifests. `--skip-manifests` for an app build, which wants the catalogue and nothing else. |\n| `sync` | Bring a design branch up to date — or stop cleanly, leaving the tree untouched. |\n| `install-drivers` | Wire the git merge drivers into this clone. |\n| `sb` | Resolve a commit to the Storybook that was built from it. |\n| `init` | Scaffold config, agent skill and CI workflow. |\n\n## `sync`, and why it exists\n\nA gate that detects a conflict and stops there has moved the problem onto the\nperson least equipped for it. The usual escalation — check out the integration\nbranch, merge, resolve, push — is not something a designer can or should do.\n\n`design-collab sync` rebases onto the base. If it cannot do so cleanly it\n**aborts and leaves the branch exactly as it was** — never a tree full of\nconflict markers — and prints a hand-off message naming each conflicting file\nand who last changed it on the base. The designer keeps designing; someone with\nfront-end context gets a specific request.\n\nIt rebases rather than merges because a design branch that merges its base\nabsorbs that line's history, and then conflicts against lockfiles and CI config\nits author never opened. `check` enforces that with a lineage check.\n\n## Merge drivers\n\nMost \"conflicts\" in a design workflow are not disagreements:\n\n- **i18n catalogs** — two people adding two *different* keys. Merged per key.\n- **Design tokens** — two people adding two *different* custom properties.\n  Merged per declaration.\n- **Generated artifacts** — recomputed from source instead of merged, because\n  reconciling a derived file by hand is doing what a command does correctly.\n\nOn a genuine conflict all three keep the file **valid and parseable** rather\nthan writing conflict markers into it, and name exactly which keys or\ndeclarations need a human.\n\n> `install-drivers` must run **once per clone**. `.gitattributes` maps paths to\n> a driver and is committed; the driver command is local git config and cannot\n> be — git refuses to execute a command that arrived with a repository, which is\n> a security property, not an oversight. `start` checks for it and tells you.\n\n## Configuration\n\n`design-collab.config.mjs` at the repo root. See\n[`design-collab.config.example.mjs`](./design-collab.config.example.mjs) — it is\nkept complete on purpose and doubles as the schema documentation.\n\nThe required fields are `appRoot` and `writableSet`. `writableSet` has no\ndefault because an empty set would reject every change and a permissive one\nwould make the path guard decorative.\n\nDisable any check by name: `checks: { 'view-stories': false }`.\n\n### One caveat about globs\n\nThe glob implementation here treats `(`, `)`, `[` and `]` as **literals**, so\ncharacter classes and alternation are unavailable. That is deliberate: Next.js\nroute directories are named `(app)` and `[locale]`, and a general-purpose glob\nreads `[locale]` as a character class and silently fails to match the single\nmost important path in the reference project.\n\n## Storybook\n\n`withDesignCollab()` wraps a Storybook config to tag stories changed since the\nbase, seed the manifests the manager imports statically, and — for Tailwind v4 —\nrewrite `@theme` to `@theme static` so the Foundations page shows live token\nvalues instead of a stale snapshot.\n\nIf your tokens are split across files pulled in with `@import`, the rewrite must\n**inline them first**: Tailwind v4 resolves `@import` itself, so an imported file\nis never handed to the bundler as its own module and a transform will never see\nit. Matching the imported filenames does not help. The template `main.ts` shows\nthe working shape.\n\n`withDesignCollab()` only GUARANTEES the manifests exist — Storybook does not\nawait `main.ts`, so it seeds empty ones rather than blocking startup on a git\ndiff. Re-deriving them is `prepare`'s job, in front of Storybook:\n\n```json\n\"storybook\":       \"design-collab prepare && storybook dev -p 6006\",\n\"build-storybook\": \"design-collab prepare && storybook build\",\n\"build\":           \"design-collab prepare --skip-manifests && next build\"\n```\n\nDo not copy a manifest generator into your project's `scripts/`. That is what\nthe reference project did, and the result was ~1200 lines living in two places\nwith nothing comparing them — a fix to one copy silently did nothing for the\nother.\n\n## Tests\n\n```bash\nnode --test test/\n```\n\nThe merge-driver and sync tests run against **real git repositories**. What\nthose units promise is a behaviour of `git merge` and `git rebase`, and a mock\ncan only confirm that the code calls git the way the test author imagined. Each\ndriver test also asserts a **baseline** — that the same scenario conflicts\n*without* the driver — because otherwise a green suite cannot distinguish \"the\ndriver works\" from \"nothing ever collided\".\n","readmeFilename":"README.md"}