{"_id":"@aestheticfunction/dspack-emit","_rev":"8-c9b922c3baa2f913e0bf6db49e329901","name":"@aestheticfunction/dspack-emit","dist-tags":{"latest":"0.7.0"},"versions":{"0.3.0":{"name":"@aestheticfunction/dspack-emit","version":"0.3.0","license":"Apache-2.0","_id":"@aestheticfunction/dspack-emit@0.3.0","maintainers":[{"name":"ryandmonk","email":"rdombrowski@gmail.com"}],"dist":{"shasum":"b17798c357f60a5553724af7ac3380f5f7ca2137","tarball":"https://registry.npmjs.org/@aestheticfunction/dspack-emit/-/dspack-emit-0.3.0.tgz","fileCount":62,"integrity":"sha512-TE3dhCDoMOzfNyponuq7oleYCS5smlWzCJLJ4iLpBjpaujhJIbMzi6WZDiaarToMlbjfhItxjmPZb3pTRzVMUQ==","signatures":[{"sig":"MEUCIBvGyoIQisVWVBR2yFPSm7ZY/Qm1VV7fLlHUdRK9DLzRAiEAzuhSOpVB16HMaA8SrFys0xR3zshaqZmWvMQOkVv4N38=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":275045},"type":"module","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"49af78e0a4685dba03261c2174a6d1a68c5ef6f2","scripts":{"test":"vitest run","build":"tsc -p tsconfig.json && mkdir -p dist/validate/meta && cp src/validate/meta/*.json dist/validate/meta/","prepare":"npm run build","test:pack":"bash scripts/pack-test.sh","transform":"tsx src/cli.ts","check:sync":"node scripts/check-sync.mjs","build:catalogs":"tsx src/cli.ts --in input/shadcn-ui.dspack.json --a2ui-version 0.9.1 --out out && tsx src/cli.ts --in input/shadcn-ui.dspack.json --a2ui-version 1.0 --out out","test:json-render":"bash scripts/json-render-gate.sh"},"_npmUser":{"name":"ryandmonk","email":"rdombrowski@gmail.com"},"_npmVersion":"11.6.2","description":"dspack emitters: compile a dspack design-system contract and dspack surfaces into protocol targets — an A2UI catalog + surface messages (gates A1-A3) and json-render catalog/registry modules + specs (gates J1-J3).","directories":{},"_nodeVersion":"25.2.1","dependencies":{"ajv":"^8.17.1","ajv-formats":"^3.0.1"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.2","zod":"3.25.76","vitest":"^2.1.8","typescript":"^5.7.2","@types/node":"^22.10.2","@a2ui/web_core":"0.10.3"},"_npmOperationalInternal":{"tmp":"tmp/dspack-emit_0.3.0_1783054834108_0.6563714405798691","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@aestheticfunction/dspack-emit","version":"0.3.1","license":"Apache-2.0","_id":"@aestheticfunction/dspack-emit@0.3.1","maintainers":[{"name":"ryandmonk","email":"rdombrowski@gmail.com"}],"dist":{"shasum":"7a2ff0f340f02e74baa443cdd04bd5e1a8b3bbea","tarball":"https://registry.npmjs.org/@aestheticfunction/dspack-emit/-/dspack-emit-0.3.1.tgz","fileCount":62,"integrity":"sha512-0vCFP5rvWGoIPvnBlB3puXkhoJhEyq/FQHrfj3JfPwf37WfASZb5ZOK3tPzB8ZhZTFkxvhjrvHeEYgRDOGm04w==","signatures":[{"sig":"MEQCIF7O2ybPaI5i3HhK2ttPHgMBStRXoI2vNBIWdAE8KyAnAiAvLSaQC3l0RuoGK+ccsg+TnEKrSxXWu8RC1/mkpObaAQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":280769},"type":"module","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"8df146c854ce8538c0dcb28992f59c6f3fca8a38","scripts":{"test":"vitest run","build":"tsc -p tsconfig.json && mkdir -p dist/validate/meta && cp src/validate/meta/*.json dist/validate/meta/","prepare":"npm run build","test:pack":"bash scripts/pack-test.sh","transform":"tsx src/cli.ts","check:sync":"node scripts/check-sync.mjs","build:catalogs":"tsx src/cli.ts --in input/shadcn-ui.dspack.json --a2ui-version 0.9.1 --out out && tsx src/cli.ts --in input/shadcn-ui.dspack.json --a2ui-version 1.0 --out out","test:json-render":"bash scripts/json-render-gate.sh"},"_npmUser":{"name":"ryandmonk","email":"rdombrowski@gmail.com"},"_npmVersion":"11.6.2","description":"dspack emitters: compile a dspack design-system contract and dspack surfaces into protocol targets — an A2UI catalog + surface messages (gates A1-A3) and json-render catalog/registry modules + specs (gates J1-J3).","directories":{},"_nodeVersion":"25.2.1","dependencies":{"ajv":"^8.17.1","ajv-formats":"^3.0.1"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.2","zod":"3.25.76","vitest":"^2.1.8","typescript":"^5.7.2","@types/node":"^22.10.2","@a2ui/web_core":"0.10.3"},"_npmOperationalInternal":{"tmp":"tmp/dspack-emit_0.3.1_1783196277970_0.7486238829557166","host":"s3://npm-registry-packages-npm-production"}},"0.3.2":{"name":"@aestheticfunction/dspack-emit","version":"0.3.2","license":"Apache-2.0","_id":"@aestheticfunction/dspack-emit@0.3.2","maintainers":[{"name":"ryandmonk","email":"rdombrowski@gmail.com"}],"dist":{"shasum":"e7451bea752ecc47685caa2f1f22c72a606a0d07","tarball":"https://registry.npmjs.org/@aestheticfunction/dspack-emit/-/dspack-emit-0.3.2.tgz","fileCount":63,"integrity":"sha512-jkygjjByRJWeUbfGygcz7fkYQ7mTx9lRswCwE/zWNj/ChOiBhjvoEEQGOvrFbOw/J0m4o2REvKQKIhXV55ytdA==","signatures":[{"sig":"MEUCIBYqQkoaHsVmdD4cLoWzUzbh2mEx//FGCBNvZEJ0o+GaAiEAq/JxZ83a/VmqAmWSLH7WCPAT2Zc5C/KWWhdKQa9SLBU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":313194},"type":"module","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"16d2194cf977b740cb36b99668f61ecd1895716c","scripts":{"test":"vitest run","build":"tsc -p tsconfig.json && mkdir -p dist/validate/meta && cp src/validate/meta/*.json dist/validate/meta/","prepare":"npm run build","test:pack":"bash scripts/pack-test.sh","transform":"tsx src/cli.ts","check:sync":"node scripts/check-sync.mjs","build:catalogs":"tsx src/cli.ts --in input/shadcn-ui.dspack.json --a2ui-version 0.9.1 --out out && tsx src/cli.ts --in input/shadcn-ui.dspack.json --a2ui-version 1.0 --out out","test:json-render":"bash scripts/json-render-gate.sh"},"_npmUser":{"name":"ryandmonk","email":"rdombrowski@gmail.com"},"_npmVersion":"11.6.2","description":"dspack emitters: compile a dspack design-system contract and dspack surfaces into protocol targets — an A2UI catalog + surface messages (gates A1-A3) and json-render catalog/registry modules + specs (gates J1-J3).","directories":{},"_nodeVersion":"25.2.1","dependencies":{"ajv":"^8.17.1","ajv-formats":"^3.0.1"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.2","zod":"3.25.76","vitest":"^2.1.8","typescript":"^5.7.2","@types/node":"^22.10.2","@a2ui/web_core":"0.10.3"},"_npmOperationalInternal":{"tmp":"tmp/dspack-emit_0.3.2_1784737706813_0.0715346867200537","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@aestheticfunction/dspack-emit","version":"0.4.0","license":"Apache-2.0","_id":"@aestheticfunction/dspack-emit@0.4.0","maintainers":[{"name":"ryandmonk","email":"rdombrowski@gmail.com"}],"bin":{"dspack-emit":"dist/cli.js"},"dist":{"shasum":"ee45967f2b6ae0f9888224cf049eedfd36d8e5b5","tarball":"https://registry.npmjs.org/@aestheticfunction/dspack-emit/-/dspack-emit-0.4.0.tgz","fileCount":72,"integrity":"sha512-KNX8DUqcm6VS3sMNqqaXRWtFIHGoLwVRrwu93BANJaHrc67IAQYVx8hJWpG40OHGVC8GrqBztLm9Iqxy6TKrSw==","signatures":[{"sig":"MEUCIA2hrzJHw2gtogDQL96xQdO2ha0r+loZODG5ry2FEYVhAiEA8faaPwwYRhzAnla6FOSZ923/yqRDiEkC4w0YSoYFTio=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":363969},"type":"module","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"156235da3fa2d86de97bfd62e75638b83d8b7985","scripts":{"test":"vitest run","build":"tsc -p tsconfig.json && mkdir -p dist/validate/meta && cp src/validate/meta/*.json dist/validate/meta/ && cp src/transform/profile.v1.schema.json dist/transform/","prepare":"npm run build","test:pack":"bash scripts/pack-test.sh","transform":"tsx src/cli.ts","check:sync":"node scripts/check-sync.mjs","build:catalogs":"tsx src/cli.ts --in input/shadcn-ui.dspack.json --a2ui-version 0.9.1 --out out && tsx src/cli.ts --in input/shadcn-ui.dspack.json --a2ui-version 1.0 --out out","test:json-render":"bash scripts/json-render-gate.sh"},"_npmUser":{"name":"ryandmonk","email":"rdombrowski@gmail.com"},"_npmVersion":"11.6.2","description":"dspack emitters: compile a dspack design-system contract and dspack surfaces into protocol targets — an A2UI catalog + surface messages (gates A1-A3) and json-render catalog/registry modules + specs (gates J1-J3).","directories":{},"_nodeVersion":"25.2.1","dependencies":{"ajv":"^8.17.1","ajv-formats":"^3.0.1"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.2","zod":"3.25.76","vitest":"^2.1.8","typescript":"^5.7.2","@types/node":"^22.10.2","@a2ui/web_core":"0.10.3"},"_npmOperationalInternal":{"tmp":"tmp/dspack-emit_0.4.0_1785786139228_0.9829782238654932","host":"s3://npm-registry-packages-npm-production"}},"0.4.1":{"name":"@aestheticfunction/dspack-emit","version":"0.4.1","license":"Apache-2.0","_id":"@aestheticfunction/dspack-emit@0.4.1","maintainers":[{"name":"ryandmonk","email":"rdombrowski@gmail.com"}],"bin":{"dspack-emit":"dist/cli.js"},"dist":{"shasum":"53ba383658d1e79ad1eca8f79d20af522f3d0fd6","tarball":"https://registry.npmjs.org/@aestheticfunction/dspack-emit/-/dspack-emit-0.4.1.tgz","fileCount":77,"integrity":"sha512-/p1Y4dAWlcwtPcfM81t2EjPChifCb9VvnIQCZ9A1dkbU13mSVYk+AQquxvY51PV9naxFAktFYLdx1mFjIOZqrQ==","signatures":[{"sig":"MEUCID3+MnIoedlWjooU6hcIuH3KxVJWZK3wdAZbb+cl5PfOAiEAoLLlMSV7bmodbOsooAlxQ6BWKMUwg1cwUIIXHqIUN9E=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":390705},"type":"module","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"10d330dce8505362f6afcee486854a62e4c72c70","scripts":{"test":"vitest run","build":"tsc -p tsconfig.json","prepare":"npm run build","test:pack":"bash scripts/pack-test.sh","transform":"tsx src/cli.ts","check:sync":"node scripts/check-sync.mjs","build:catalogs":"tsx src/cli.ts --in input/shadcn-ui.dspack.json --a2ui-version 0.9.1 --out out && tsx src/cli.ts --in input/shadcn-ui.dspack.json --a2ui-version 1.0 --out out","test:json-render":"bash scripts/json-render-gate.sh"},"_npmUser":{"name":"ryandmonk","email":"rdombrowski@gmail.com"},"_npmVersion":"11.6.2","description":"dspack emitters: compile a dspack design-system contract and dspack surfaces into protocol targets — an A2UI catalog + surface messages (gates A1-A3) and json-render catalog/registry modules + specs (gates J1-J3).","directories":{},"_nodeVersion":"25.2.1","dependencies":{"ajv":"^8.17.1","ajv-formats":"^3.0.1"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.2","zod":"3.25.76","vitest":"^2.1.8","typescript":"^5.7.2","@types/node":"^22.10.2","@a2ui/web_core":"0.10.3"},"_npmOperationalInternal":{"tmp":"tmp/dspack-emit_0.4.1_1785799258212_0.00017113385352174326","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@aestheticfunction/dspack-emit","version":"0.5.0","license":"Apache-2.0","_id":"@aestheticfunction/dspack-emit@0.5.0","maintainers":[{"name":"ryandmonk","email":"rdombrowski@gmail.com"}],"bin":{"dspack-emit":"dist/cli.js"},"dist":{"shasum":"61f0b6e0d0902332490454330b6210c13c76e097","tarball":"https://registry.npmjs.org/@aestheticfunction/dspack-emit/-/dspack-emit-0.5.0.tgz","fileCount":110,"integrity":"sha512-PYGTyAV7tuKN9H5TkQbei5CamRBDHtHUZIX2xiWoxVqvDoziGvyXMOasOppar2JrE7m0XXa4a7pcpCC3l66cIw==","signatures":[{"sig":"MEQCIHUQtdMbp1j5fTMxiYuyMnC+J/i1mASp5kGlIMAOJJBOAiBrsDUYLTY0cFrAlIECJX2dxmqUSQR+ImpUVFOk+9VAqQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":734176},"type":"module","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"84031a5518b017d80357f9719d1614a06cb112af","scripts":{"test":"vitest run","build":"tsc -p tsconfig.json","prepare":"npm run build","test:pack":"bash scripts/pack-test.sh","transform":"tsx src/cli.ts","check:sync":"node scripts/check-sync.mjs","build:catalogs":"tsx src/cli.ts --in input/shadcn-ui.dspack.json --a2ui-version 0.9.1 --out out && tsx src/cli.ts --in input/shadcn-ui.dspack.json --a2ui-version 1.0 --out out","test:json-render":"bash scripts/json-render-gate.sh"},"_npmUser":{"name":"ryandmonk","email":"rdombrowski@gmail.com"},"_npmVersion":"11.6.2","description":"dspack emitters: compile a dspack design-system contract and dspack surfaces into protocol targets — an A2UI catalog + surface messages (gates A1-A3) and json-render catalog/registry modules + specs (gates J1-J3).","directories":{},"_nodeVersion":"25.2.1","dependencies":{"ajv":"^8.17.1","ajv-formats":"^3.0.1"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.2","zod":"3.25.76","vitest":"^2.1.8","typescript":"^5.7.2","@types/node":"^22.10.2","@a2ui/web_core":"0.10.3"},"_npmOperationalInternal":{"tmp":"tmp/dspack-emit_0.5.0_1786065126937_0.2345457398075319","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@aestheticfunction/dspack-emit","version":"0.6.0","license":"Apache-2.0","_id":"@aestheticfunction/dspack-emit@0.6.0","maintainers":[{"name":"ryandmonk","email":"rdombrowski@gmail.com"}],"bin":{"dspack-emit":"dist/cli.js"},"dist":{"shasum":"2a895ed909bafe80a0b8cf5fa2b12e29297a2441","tarball":"https://registry.npmjs.org/@aestheticfunction/dspack-emit/-/dspack-emit-0.6.0.tgz","fileCount":118,"integrity":"sha512-tgAQy6XPUf7R+YMco8ZYqkP3xMrxzgE8BjgmW5kIpF1n31bQRbr0WjFRJiPEYMWbjrcsTVxme34uBbg3VCgwnw==","signatures":[{"sig":"MEUCIQDURD5BiBJslTB+ExgIsMrqnIlj3K1lDQuSDfID6g6wTQIgfKFgIQRipHR9UaaC9Yl1OUYURmsvn3SuPldA9RdycTA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":974811},"type":"module","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"6d2d6d01c460d1e76a68bef77ea842eb3c3c461b","scripts":{"test":"vitest run","build":"tsc -p tsconfig.json","prepare":"npm run build","test:pack":"bash scripts/pack-test.sh","transform":"tsx src/cli.ts","check:sync":"node scripts/check-sync.mjs","build:catalogs":"tsx src/cli.ts --in input/shadcn-ui.dspack.json --a2ui-version 0.9.1 --out out && tsx src/cli.ts --in input/shadcn-ui.dspack.json --a2ui-version 1.0 --out out","test:json-render":"bash scripts/json-render-gate.sh"},"_npmUser":{"name":"ryandmonk","email":"rdombrowski@gmail.com"},"_npmVersion":"11.6.2","description":"dspack emitters: compile a dspack design-system contract and dspack surfaces into protocol targets — an A2UI catalog + surface messages (gates A1-A3) and json-render catalog/registry modules + specs (gates J1-J3).","directories":{},"_nodeVersion":"25.2.1","dependencies":{"ajv":"^8.17.1","ajv-formats":"^3.0.1"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.2","zod":"3.25.76","vitest":"^2.1.8","typescript":"^5.7.2","@types/node":"^22.10.2","@a2ui/web_core":"0.10.3"},"_npmOperationalInternal":{"tmp":"tmp/dspack-emit_0.6.0_1786205635273_0.415090924281595","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"@aestheticfunction/dspack-emit","version":"0.7.0","type":"module","description":"dspack emitters: compile a dspack design-system contract and dspack surfaces into protocol targets — an A2UI catalog + surface messages (gates A1-A3) and json-render catalog/registry modules + specs (gates J1-J3).","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/aestheticfunction/dspack-emit.git"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"transform":"tsx src/cli.ts","build":"tsc -p tsconfig.json","prepare":"npm run build","build:catalogs":"tsx src/cli.ts --in input/shadcn-ui.dspack.json --a2ui-version 0.9.1 --out out && tsx src/cli.ts --in input/shadcn-ui.dspack.json --a2ui-version 1.0 --out out","test":"vitest run","test:pack":"bash scripts/pack-test.sh","test:json-render":"bash scripts/json-render-gate.sh","check:sync":"node scripts/check-sync.mjs"},"dependencies":{"ajv":"^8.17.1","ajv-formats":"^3.0.1"},"devDependencies":{"@a2ui/web_core":"0.10.3","@types/node":"^22.10.2","tsx":"^4.19.2","typescript":"^5.7.2","vitest":"^2.1.8","zod":"3.25.76"},"bin":{"dspack-emit":"dist/cli.js"},"gitHead":"3b152ae6a16b75e0164f0218a6a88cda98334594","_id":"@aestheticfunction/dspack-emit@0.7.0","bugs":{"url":"https://github.com/aestheticfunction/dspack-emit/issues"},"homepage":"https://github.com/aestheticfunction/dspack-emit#readme","_nodeVersion":"24.18.0","_npmVersion":"11.16.0","dist":{"integrity":"sha512-uD61qcAo/kNeYP5OMVKDfV6gI79cP9HNz4B0aQJ5cSDcsMdDDT2GZv8syLFeYfYH9ED14ZbC2i7p52S03NJeDw==","shasum":"fb21c695342bb63ff2dd892bb98ff381c648a09c","tarball":"https://registry.npmjs.org/@aestheticfunction/dspack-emit/-/dspack-emit-0.7.0.tgz","fileCount":117,"unpackedSize":1004639,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aestheticfunction%2fdspack-emit@0.7.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIFTC4ISivrsT57bo2a6NtyCbhF203++IllhStg3PF2OGAiBqchnnkVfuQbj61DHteP6ZPQ0gOEmCkwWUBiHvXYUkNg=="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:077eb8eb-b643-4f0c-975a-8d367faa9b42"}},"directories":{},"maintainers":[{"name":"ryandmonk","email":"rdombrowski@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/dspack-emit_0.7.0_1786411948467_0.16709621336761105"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-03T05:00:33.986Z","modified":"2026-08-11T01:32:29.004Z","0.3.0":"2026-07-03T05:00:34.248Z","0.3.1":"2026-07-04T20:17:58.141Z","0.3.2":"2026-07-22T16:28:27.025Z","0.4.0":"2026-08-03T19:42:19.387Z","0.4.1":"2026-08-03T23:20:58.383Z","0.5.0":"2026-08-07T01:12:07.256Z","0.6.0":"2026-08-08T16:13:55.457Z","0.7.0":"2026-08-11T01:32:28.664Z"},"license":"Apache-2.0","description":"dspack emitters: compile a dspack design-system contract and dspack surfaces into protocol targets — an A2UI catalog + surface messages (gates A1-A3) and json-render catalog/registry modules + specs (gates J1-J3).","maintainers":[{"name":"ryandmonk","email":"rdombrowski@gmail.com"}],"readme":"# dspack-emit\n\ndspack's multi-target emitter: compiles a **dspack** design-system contract and\ngoverned dspack surfaces into protocol targets — an\n**[A2UI](https://github.com/a2ui-project/a2ui) catalog + surface messages**\n(rendered through the published React A2UI renderer) and\n**[json-render](https://github.com/vercel-labs/json-render) catalog/registry\nmodules + specs**.\n\n> Part of the [dspack ecosystem](https://github.com/aestheticfunction) — the organization profile has the full map of how the repositories fit together.\n>\n> **Kind:** library (npm `@aestheticfunction/dspack-emit`) · **Audience:** engineers wiring dspack contracts and surfaces to rendering protocols · **Neighbors:** consumes [dspack](https://github.com/aestheticfunction/dspack) contracts; consumed by [dspack-gen](https://github.com/aestheticfunction/dspack-gen) and [dspack-studio](https://github.com/aestheticfunction/dspack-studio) ([hosted replay](https://studio.aesthetic-function.com)); pairs with [ds-mcp](https://github.com/aestheticfunction/ds-mcp) in the demo\n>\n> **Mapping your own design system?** Profiles are pure data you author in your own codebase against this package — the walkthrough is [docs/PROFILES.md](docs/PROFILES.md); the broader adoption journey starts at [ADOPTING.md](https://github.com/aestheticfunction/dspack/blob/main/ADOPTING.md).\n\n> **Naming note:** this repo was renamed from `dspack-to-a2ui` to `dspack-emit`\n> when the second target landed (ADR-D2; the old GitHub URL redirects). The\n> npm package is **`@aestheticfunction/dspack-emit`** from `0.3.0`; the last\n> release under the old name is `@aestheticfunction/dspack-to-a2ui@0.2.0`,\n> deprecated with a pointer here.\n\nThe project began as a proof-of-concept that compiles a dspack contract into a\nvalid A2UI catalog and renders a sample surface through the published React\nA2UI renderer.\n\n> **The question this answers:** *Can dspack function as a portable interchange contract\n> for agent UI systems by compiling into an A2UI catalog with acceptable fidelity and\n> minimal custom logic?*\n>\n> **Short answer (from this experiment):** **Yes for the renderable component surface;\n> no for the design-intent layer — by design.** Component shapes, variant enums, and\n> design tokens project onto an A2UI catalog cleanly enough to validate and render. The\n> mapper is a generic engine plus a small *data-only* profile (no per-component code).\n> dspack's *governance* layer (usage patterns, anti-patterns, accessibility contracts,\n> compound composition, framework bindings) has no A2UI representation — A2UI catalogs\n> describe renderable shape, not design intent. Those are documented as deliberate\n> casualties, not gaps to be closed.\n\nThis is an experiment. It proves **contract portability only**. It does not implement\nreconciliation, drift detection, Figma/AF integration, MCP tooling, bidirectional sync,\nor runtime governance.\n\n## Demo\n\nThe full chain: an example `dspack.json` queried via `ds-mcp`, compiled by this transformer, and rendered through the published A2UI renderer.\n\nhttps://github.com/user-attachments/assets/510a781b-4214-49b3-b997-9cbecdc36961\n\n## What's here\n\n| Path | What |\n| --- | --- |\n| `input/shadcn-ui.dspack.json` | Example input: a dspack v0.4 contract from a React+Tailwind system (shadcn/ui). **Pinned to v2.3.0 (8 components) — not current shadcn coverage;** see [`docs/CONTRACT-PIN.md`](docs/CONTRACT-PIN.md). |\n| `src/` | The transformer: source-agnostic engine + data-only profile + versioned emitter + validator. |\n| `surface/settings-card.surface.json` | Hand-authored A2UI v0.9.1 surface instantiating the compiled components. |\n| `out/catalog.v0_9_1.json`, `out/catalog.v1_0.json` | Generated catalogs (no external `$ref`, versioned `catalogId`). |\n| `out/validation-report.*` | Validation + fidelity reports (Markdown + JSON). |\n| `docs/MAPPING.md` | Per-field fidelity narrative and the deliberate casualties. |\n| `demo/` | Standalone Vite + React 19 app rendering the surface via `@a2ui/react`. |\n| `fixtures/a2ui/` | Checked-in A2UI schema fixtures used as ground truth. |\n\n## The transformer\n\nThe mapper reads a **dspack JSON contract, not framework code** — React/Tailwind is\nmerely where this example's dspack happened to come from. The engine (`src/transform/`)\nis generic; the only source-specific part is a declarative **profile**\n(`src/transform/profiles.ts`) describing the dspack→A2UI component/prop/token\ncorrespondence. Retargeting another design system means writing another profile, not\nnew engine code.\n\n```\nload dspack → map (engine + profile) → emit (versioned) → validate (ajv) → report\n```\n\nRun it:\n\n```bash\nnpm install\nnpm run build:catalogs      # emits v0.9.1 and v1.0 catalogs + reports into out/\nnpm test                    # vitest: color math, mapping, and the validation gates\n```\n\nOr directly:\n\n```bash\nnpm run transform -- --in input/shadcn-ui.dspack.json --a2ui-version 1.0 --out out\n```\n\n### Profiles as JSON (`--profile`, `loadProfile`, `scaffoldProfile`)\n\nThe `Profile` has always been pure data; it is now also *reachable* as data,\nin two languages dispatched explicitly on `profileVersion`:\n\n- **v2 — the primitive language** (schema:\n  [`src/transform/profile.v2.schema.json`](src/transform/profile.v2.schema.json))\n  authors the transformation model directly: Identity / Route / Collect in a\n  closed string syntax, plus declared catalog `functions`. New profiles should\n  be v2 — [docs/PROFILES.md](docs/PROFILES.md) teaches it.\n- **v1 — compatibility syntax** (schema:\n  [`src/transform/profile.v1.schema.json`](src/transform/profile.v1.schema.json)),\n  the original surface-plan directives. Frozen: v1 documents keep loading and\n  emitting byte-identically, indefinitely, desugaring into the same internal\n  model the engine reads for both languages.\n\nEither drives the engine byte-identically to a TypeScript profile. The package\ninstalls a `dspack-emit` bin, so out-of-repo contracts emit from any CI:\n\n```bash\ndspack-emit --in acme-ui.dspack.json --a2ui-version 0.9.1 --out out \\\n  --profile acme.profile.json --emit-surface surfaces/status-report.dsurface.json\n```\n\nA malformed profile is refused before the engine runs (`ProfileLoadError`\nwith pathed findings; CLI exit 2). `scaffoldProfile(doc, { catalogIdBase })`\nproduces a mechanical 1:1 starting draft plus `notes` naming every judgment\ncall it deliberately did not make — see\n[docs/PROFILES.md](docs/PROFILES.md). With `--profile` and no `--surface`,\nthe repo-relative sample-surface default is skipped (gate A3 then covers\n`--emit-surface` output only).\n\n### Versioned emitter (`--a2ui-version 0.9.1 | 1.0`)\n\nThe mapper targets and validates the **v1.0** catalog schema as the primary line, and\nalso emits **v0.9.1** for the renderer demo (maintained React renderers are stable on\nv0.9.1). Confirmed against the checked-in fixtures, the only catalog-facing delta is:\n\n- **v0.9.1** → `$defs.theme` (carries `primaryColor`, `#rrggbb`).\n- **v1.0** → `$defs.surfaceProperties` + a top-level `instructions`.\n\n(See `docs/MAPPING.md` for the full confirmation, including the dropped\n`CatalogComponentCommon` def in v1.0, which washes out because we inline all defs.)\n\n## Validation (the hard gate)\n\n\"Passes A2UI catalog schema validation\" is operationalized as three ajv gates\n(draft 2020-12, `strict:false`, `ajv-formats` — the same toolchain A2UI itself uses):\n\n1. **schema-compile + no-external-ref** — ajv compiles the catalog *as a schema*;\n   fails on any unresolved `$ref`, proving it is a valid, fully self-contained schema.\n2. **catalog-shape** — validates against a version-specific catalog-shape meta-schema\n   (`src/validate/meta/`), the check that makes v0.9.1 vs v1.0 conformance distinct.\n3. **instance** — every component instance in the sample surface validates against the\n   catalog's own `#/$defs/anyComponent`.\n\nThe CLI exits non-zero if any gate fails. Both emitted versions currently pass all\nthree. The instance gate is proven non-vacuous in the test suite (it rejects a\nmalformed Button).\n\nIn the AF governance-pipeline naming these three checks are the **emitter gates\nA1/A2/A3** (schema-compile, catalog-shape, instance); the protocol-neutral\n**surface gates S1/S2/S3** (surface schema, contract vocabulary, governance lint)\nrun upstream in [dspack-gen](https://github.com/aestheticfunction/dspack-gen),\nbefore anything reaches this emitter.\n\n## Surface emission (dspack surface → A2UI)\n\nThe input contract is now **dspack v0.4**, whose `examples[]` embed *dspack\nsurface* documents — a protocol-neutral component tree in dspack vocabulary\n(schema: `dspack.surface.v0_1.schema.json` in the dspack repo). This repo\ncompiles those surfaces to A2UI v0.9.1 messages:\n\n```bash\nnpm run transform -- --in input/shadcn-ui.dspack.json --a2ui-version 0.9.1 --out out \\\n  --emit-surface surface/delete-account.dsurface.json\n```\n\nemits `out/delete-account.surface.json` (createSurface with dspack-token theme +\nupdateComponents) and instance-validates it against the freshly generated catalog\n(gate A3). Exit codes: `1` catalog gates failed, `2` usage or profile-load error,\n`3` strict-coverage, `4` the surface could not be emitted (unknown component /\nstructure the profile cannot project), `5` `--strict-surface` (a surface emitted,\nbut with fidelity losses you asked to treat as failures — bare, or scoped as\n`--strict-surface=lossy,synthesis-defaults`). The projection is data in the profile (`surfacePlan` directives in\n`src/transform/profiles.ts`); the engine has no component-specific code.\n\n**Honest scope:** compound composition flattens per the documented casualties in\nMAPPING.md (e.g. an `alert-dialog` subtree collapses onto\n`triggerLabel/title/description/cancelLabel/confirmLabel`); A2UI's required\ndeclarative actions are *synthesized* (deterministic event-name slug) and every\nsynthesis/drop is emitted as a warning — nothing is silent.\n\nThe package is also consumable as a library (`transform`, `emitSurface`,\n`validateCatalog`, `extractInstances` via the exports map — verified by\n`npm run test:pack`); dspack-gen consumes it from npm\n(`@aestheticfunction/dspack-emit`).\n\n## Second target: json-render (protocol neutrality, tested)\n\nThe same governed surfaces compile to a second protocol,\n[json-render](https://github.com/vercel-labs/json-render) (Vercel Labs):\n\n```bash\nnpm run transform -- --target json-render --in input/shadcn-ui.dspack.json --out out/json-render \\\n  --emit-surface surface/delete-account.dsurface.json\n```\n\ngenerates `catalog.ts` (a `defineCatalog` module whose Zod prop schemas are\ncompiled from the contract's vocabulary — enums verbatim) and `registry.tsx`\n(typed stub renderers, so the catalog's inferred prop typing is *compiled*,\nnot assumed), and emits the CSR as a json-render spec (`root` + flat\n`elements` map). Unlike the a2ui projection, nothing flattens: every dspack\ncomponent **and sub-component** is a catalog component 1:1, so compound\ncomposition survives as real nesting — the json-render profile\n(`src/targets/json-render/profile.ts`) is near-empty, and that emptiness is\nthe point. The recorded projections that do exist: `text` leaves become a\nuniversal `text` prop; slot *names* flatten into child order; function-typed\nhandler props are excluded from the declarative catalog — each one warned,\nnothing silent.\n\nTarget gates, in the json-render idiom (`npm run test:json-render`, CI-run):\n**J1** the generated modules compile (`tsc --noEmit`); **J2** spec structural\nintegrity (json-render's `validateSpec`); **J3** instance acceptance\n(`catalog.validate()` — the generated Zod schemas parse the emitted tree).\nJ1–J3 run in `gates/json-render/`, a separate pinned package: json-render\nrequires zod v4 while this repo's root tree is pinned to zod v3 by\n`@a2ui/web_core`'s peer range, so the two frameworks cannot share a\ndependency tree. json-render is pre-1.0; its version is pinned there and\nchurn stays contained to `src/targets/json-render/` + that gate package.\n\n**What the thesis test claims, precisely** (`src/json-render-emit.test.ts`):\ngovernance runs pre-emission on the CSR, so governed/violating status is\nidentical across emitters *by construction*; the test demonstrates that every\ngoverned CSR in this repo is **accepted by both emitters**. It does **not**\nclaim the two protocols are equally expressive.\n\n## The render demo (headline deliverable)\n\n```bash\ncd demo\nnpm install\nnpm run dev      # open the printed localhost URL\n```\n\nThe demo loads `surface/settings-card.surface.json` and the generated\n`out/catalog.v0_9_1.json`, **ingests that catalog** into a renderable\n`Catalog<ReactComponentImplementation>` (see [Phase 2](#phase-2-rendering-off-the-generated-catalog)),\nruns the surface through `MessageProcessor([ingestedCatalog])` from `@a2ui/web_core/v0_9`,\nand renders it with `<A2uiSurface>` from `@a2ui/react/v0_9`. A side panel shows what survived\nthe transform (component provenance, the lossy Button variant projection, the primary token).\n\n**What this demonstrates — and its honest scope:**\n\n- The compiled surface **renders** through the maintained React renderer: a `Card`\n  containing a `Column` with `Text`, a `TextField`, and a primary `Button`.\n- The dspack **design tokens drive the rendered theme** via A2UI's `--a2ui-*` CSS\n  variables: the primary button paints in `#0f172a` (dspack `color.primary`) and the\n  card border is `#e2e8f0` (dspack `color.border`).\n- **Variants/enums survive** in the catalog; the panel shows the 6→3 lossy projection\n  with the original shadcn enum preserved in `x-dspack-source`.\n\n**Framing caveats (not overstated):**\n\n- The surface renders **off the generated catalog**: the accepted component vocabulary and\n  each component's schema are built from `out/catalog.v0_9_1.json` at load time (Phase 2).\n  The catalog governs names, props, and accept/refuse; the per-component **visual** is either\n  reused from the Basic Catalog (Button, Card, Text, TextField, Column) or hand-authored. See\n  the Phase 2 section for exactly where ingestion ends and hand-authoring begins.\n- A2UI's model puts **component theming/presentation on the host**. The published\n  `@a2ui/react@0.10.1` ships empty CSS-module maps for its interactive components\n  (`Button_default = {}`), so the host (`demo/src/host-theme.css`) supplies the button/\n  input styling — driven entirely by the same dspack-token CSS variables.\n- **v1.0 is validated, not rendered** — maintained React renderers are stable on\n  v0.9.1; a v1.0 catalog must pass schema validation but is not required to render until\n  renderers ship v1.0 support.\n\n## Phase 2: rendering off the generated catalog\n\nPhase 1 closed the loop at validation. Phase 2 makes the renderer **ingest** the generated\ncatalog: the accepted component vocabulary and each component's accepted schema are\nconstructed from `out/catalog.v*.json`, not from a hand-maintained list.\n\nHow it works (`demo/src/ingest/`, a generic, dspack-agnostic adapter):\n\n- `buildComponentApi` turns one catalog component (JSON Schema) into a renderer\n  `ComponentApi` (`{ name, schema: Zod }`). It classifies each property from the catalog\n  itself, mapping the standard A2UI common-type `$ref` names (`DynamicString`, `Action`,\n  `ChildList`, `ComponentId`, ...) to the canonical Zod schemas exported by\n  `@a2ui/web_core/v0_9`, so the renderer's `scrapeSchemaBehavior` recognizes binding. This\n  is **generic A2UI ingestion**: it works on any conformant catalog, inlined or not. An\n  optional `x-a2ui` hint can disambiguate, but the adapter works with it entirely absent.\n- `buildCatalog` iterates `catalog.components` (no hardcoded names) and pairs each with a\n  React visual from the `registry`: either delegated to the Basic Catalog, hand-authored, or\n  a visible \"unimplemented\" placeholder. It constructs `new Catalog(catalog.catalogId, ...)`.\n\n**Where ingestion ends and hand-authoring begins (the honest split):** for every emitted\ncomponent the catalog governs the name, props, enums, defaults, and accept/refuse (true\ningestion). The per-component **visual** is reused (Button, Card, Text, TextField, Column) or\nhand-authored. The renderer code (`demo/src/ingest/`) contains no component-name list; the\n`registry` is the one hand-authored boundary.\n\n**The acceptance gates** (`src/ingestion.test.ts`, run by `npm test`) prove this: recompiling\na changed contract changes the renderer's accepted vocabulary (Gate A, +`Table`) and accepted\nprops (Gate B, a new Button variant) with **no edit to the adapter or registry**; a catalog\nname without a visual is a distinct, visible \"unimplemented\" state vs an absent name's\n\"Unknown component\" (Gate C); `scrapeSchemaBehavior` recognizes the ingested dynamic/action/\nchild-list/checkable props (binding fidelity); Tier 1 works with `x-a2ui` stripped (tier\nindependence); and a static check enforces the no-hardcoded-names rule (negative control).\n\n**No silent drops:** the transform now classifies **every** input dspack component as\nmapped / adapted / omitted / unsupported and reports it (the `## Component coverage` section\nof each validation report). An unclassified component emits a warning and, under\n`--strict-coverage`, fails the CLI (exit 3).\n\n**Access-management demo (P4/P5).** The updated dspack adds a `table` component and a\n`data-table-with-row-actions` pattern, so the demo now includes a second surface,\n`surface/access-management.surface.json`, for the prompt *\"Build an access-management page\nwith a revoke action.\"* It renders off the generated catalog using ingested `Table` and\n`Badge` components plus an `AlertDialog`. The **revoke** action is a destructive,\n**non-dismissible** confirmation (the dspack `destructive-action-confirmation` pattern, and\nthe AlertDialog-vs-Dialog distinction): clicking the overlay does not dismiss it, and\nconfirming dispatches a `revoke_access` event through the A2UI action mechanism. As before,\nthe catalog governs names/props/accept-refuse; the `Table`/`Badge`/`AlertDialog` **visuals**\nare hand-authored React in `demo/src/ingest/components/`.\n\n**Honest scope / not yet done:** surfaces are hand-authored (the demo does **not** yet\ngenerate surfaces from dspack patterns); `Table`/`Badge`/`AlertDialog` are synthesized A2UI\ncomponent *shapes* (the dspack sub-component composition is a documented casualty, not a\nfaithful compound contract); `dialog` and `dropdown-menu` remain unsupported casualties; and\nv1.0 remains validated, not rendered.\n\n## Pinned versions\n\n`@a2ui/react@0.10.1`, `@a2ui/web_core@0.10.3` (both expose a `/v0_9` entry),\n`@a2ui/markdown-it@0.0.4`, `react@19.2.7`. `demo/.npmrc` sets `legacy-peer-deps=true`\nbecause `@a2ui/markdown-it` declares a stale peer; the mismatch is benign.\n","readmeFilename":"README.md","homepage":"https://github.com/aestheticfunction/dspack-emit#readme","repository":{"type":"git","url":"git+https://github.com/aestheticfunction/dspack-emit.git"},"bugs":{"url":"https://github.com/aestheticfunction/dspack-emit/issues"}}