{"_id":"@canonical/anatomy-dsl","_rev":"15-0fbd3729c9e44d300598ffe0dba131f1","name":"@canonical/anatomy-dsl","dist-tags":{"latest":"0.43.0","experimental":"0.43.0-experimental.1"},"versions":{"0.2.0":{"name":"@canonical/anatomy-dsl","version":"0.2.0","license":"LGPL-3.0","_id":"@canonical/anatomy-dsl@0.2.0","maintainers":[{"name":"ilayda21","email":"ilayda.cavusoglupars@canonical.com"},{"name":"frankban","email":"frankban@gmail.com"},{"name":"huwshimi","email":"huw@ikmail.com"},{"name":"anthonydillon","email":"me@anthonydillon.com"},{"name":"steverydz","email":"steverydz@gmail.com"},{"name":"amylily1011","email":"amy.lily@canonical.com"},{"name":"bartaz","email":"bartek.szopka@canonical.com"},{"name":"jpmartinspt","email":"joao.figueiredo.martins@canonical.com"},{"name":"petesfrench","email":"peterfrench94@gmail.com"},{"name":"mariadias143","email":"marianovadias@gmail.com"},{"name":"jmuzina","email":"jmuzina@pm.me"},{"name":"mtruj","email":"mariapaula.trujillo@canonical.com"},{"name":"edlerd","email":"david.edler@canonical.com"},{"name":"canonical-organization","email":"is-admin@canonical.com"},{"name":"edisile-canonical","email":"eduard.manta@canonical.com"},{"name":"steciuk-canonical","email":"adam.steciuk@canonical.com"},{"name":"ad.vl","email":"adrian.villa.g@gmail.com"},{"name":"engr-ali","email":"its.muhammad.ali.mughal@gmail.com"},{"name":"ando.gq","email":"tom@ando.sh"},{"name":"ninfa_jeon","email":"urvashi.sharma271099@gmail.com"},{"name":"ndv99","email":"n.devilliers1999@gmail.com"},{"name":"goulin-canonical","email":"goulin.khoge@canonical.com"},{"name":"immortalcodes","email":"21112002mj@gmail.com"},{"name":"alvaromateo","email":"alvaro.mateoalvarez@canonical.com"},{"name":"onibenjo-canonical","email":"benjaminaderopo.oni@canonical.com"}],"dist":{"shasum":"0ce8cfe8d57e307416e94e1483aec090d4fd8420","tarball":"https://registry.npmjs.org/@canonical/anatomy-dsl/-/anatomy-dsl-0.2.0.tgz","fileCount":18,"integrity":"sha512-wmUTGyynfG2qcuIxIhq2H7w3AsNXrwaDk7C0W2hb9y2ooKdjNWjTd8BoDV+KcFrLGgCiNJYhTSVfF+Y7eWQUyg==","signatures":[{"sig":"MEUCIFf08SRjPTKtRAxYs3axDX1TbYNkWlaPWkOu0tkc1p0TAiEA9T4rQGScx55DlUm3gtA2yj9JyWVRqClx9/W6rpj9HEk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":20043},"type":"module","types":"dist/types/index.d.ts","module":"dist/esm/index.js","exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/esm/index.js"}},"gitHead":"c1562df8a753f703b133ef97233f4fb6d852b92a","scripts":{"test":"vitest run","build":"tsc -p tsconfig.build.json","check":"biome check && tsc --noEmit","check:ts":"tsc --noEmit","check:fix":"biome check --write","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"ad.vl","email":"adrian.villa.g@gmail.com"},"_npmVersion":"11.6.2","description":"Anatomy DSL meta-model: TypeScript types mirroring the OWL ontology, and a YAML-to-Turtle transform","directories":{},"_nodeVersion":"24.13.0","_hasShrinkwrap":false,"devDependencies":{"yaml":"^2.7.1","vitest":"^4.0.18","typescript":"^5.9.3","expect-type":"^1.3.0","@biomejs/biome":"^2.4.6","@canonical/biome-config":"^0.17.1","@canonical/typescript-config":"^0.17.1"},"_npmOperationalInternal":{"tmp":"tmp/anatomy-dsl_0.2.0_1774045023250_0.4873268030665918","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@canonical/anatomy-dsl","version":"0.2.1","license":"LGPL-3.0","_id":"@canonical/anatomy-dsl@0.2.1","maintainers":[{"name":"ilayda21","email":"ilayda.cavusoglupars@canonical.com"},{"name":"frankban","email":"frankban@gmail.com"},{"name":"huwshimi","email":"huw@ikmail.com"},{"name":"anthonydillon","email":"me@anthonydillon.com"},{"name":"steverydz","email":"steverydz@gmail.com"},{"name":"amylily1011","email":"amy.lily@canonical.com"},{"name":"bartaz","email":"bartek.szopka@canonical.com"},{"name":"jpmartinspt","email":"joao.figueiredo.martins@canonical.com"},{"name":"petesfrench","email":"peterfrench94@gmail.com"},{"name":"mariadias143","email":"marianovadias@gmail.com"},{"name":"jmuzina","email":"jmuzina@pm.me"},{"name":"mtruj","email":"mariapaula.trujillo@canonical.com"},{"name":"edlerd","email":"david.edler@canonical.com"},{"name":"canonical-organization","email":"is-admin@canonical.com"},{"name":"edisile-canonical","email":"eduard.manta@canonical.com"},{"name":"steciuk-canonical","email":"adam.steciuk@canonical.com"},{"name":"ad.vl","email":"adrian.villa.g@gmail.com"},{"name":"engr-ali","email":"its.muhammad.ali.mughal@gmail.com"},{"name":"ando.gq","email":"tom@ando.sh"},{"name":"ninfa_jeon","email":"urvashi.sharma271099@gmail.com"},{"name":"ndv99","email":"n.devilliers1999@gmail.com"},{"name":"goulin-canonical","email":"goulin.khoge@canonical.com"},{"name":"immortalcodes","email":"21112002mj@gmail.com"},{"name":"alvaromateo","email":"alvaro.mateoalvarez@canonical.com"},{"name":"onibenjo-canonical","email":"benjaminaderopo.oni@canonical.com"}],"dist":{"shasum":"e42187d2d539e65d11a63f9e56e031d1620b3bc1","tarball":"https://registry.npmjs.org/@canonical/anatomy-dsl/-/anatomy-dsl-0.2.1.tgz","fileCount":20,"integrity":"sha512-oAYumzhG8MYOqF337UjInwWVJG2tiSSb6eysz3AI4V/bk8WMS0Ii90Ot6XHnWFjFMjUbFSwua8wwOcDkSyTXYg==","signatures":[{"sig":"MEUCIQDt/Y/sqWArGGGzFUl9ydaKl6nRRJly7LE8dX/lSMW4xQIgVgP03eSTRWpbf/vpXPaixEOJ6D7rCEZIrBRoArWy9Yo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":38043},"type":"module","types":"dist/types/index.d.ts","module":"dist/esm/index.js","exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/esm/index.js"}},"gitHead":"61f30a516c92e69e9dd57bd942aa6964bf4cd1d1","scripts":{"test":"vitest run","build":"tsc -p tsconfig.build.json","check":"biome check && tsc --noEmit","check:ts":"tsc --noEmit","check:fix":"biome check --write","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"ad.vl","email":"adrian.villa.g@gmail.com"},"_npmVersion":"11.6.2","description":"Anatomy DSL meta-model: TypeScript types mirroring the OWL ontology, and a YAML-to-Turtle transform","directories":{},"_nodeVersion":"24.13.0","_hasShrinkwrap":false,"devDependencies":{"yaml":"^2.7.1","vitest":"^4.0.18","typescript":"^5.9.3","expect-type":"^1.3.0","@biomejs/biome":"^2.4.6","@canonical/biome-config":"^0.17.1","@canonical/typescript-config":"^0.17.1"},"_npmOperationalInternal":{"tmp":"tmp/anatomy-dsl_0.2.1_1774046588547_0.696824560417941","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"@canonical/anatomy-dsl","version":"0.2.2","license":"LGPL-3.0","_id":"@canonical/anatomy-dsl@0.2.2","maintainers":[{"name":"ilayda21","email":"ilayda.cavusoglupars@canonical.com"},{"name":"frankban","email":"frankban@gmail.com"},{"name":"huwshimi","email":"huw@ikmail.com"},{"name":"anthonydillon","email":"me@anthonydillon.com"},{"name":"steverydz","email":"steverydz@gmail.com"},{"name":"amylily1011","email":"amy.lily@canonical.com"},{"name":"bartaz","email":"bartek.szopka@canonical.com"},{"name":"jpmartinspt","email":"joao.figueiredo.martins@canonical.com"},{"name":"petesfrench","email":"peterfrench94@gmail.com"},{"name":"mariadias143","email":"marianovadias@gmail.com"},{"name":"jmuzina","email":"jmuzina@pm.me"},{"name":"mtruj","email":"mariapaula.trujillo@canonical.com"},{"name":"edlerd","email":"david.edler@canonical.com"},{"name":"canonical-organization","email":"is-admin@canonical.com"},{"name":"edisile-canonical","email":"eduard.manta@canonical.com"},{"name":"steciuk-canonical","email":"adam.steciuk@canonical.com"},{"name":"ad.vl","email":"adrian.villa.g@gmail.com"},{"name":"engr-ali","email":"its.muhammad.ali.mughal@gmail.com"},{"name":"ando.gq","email":"tom@ando.sh"},{"name":"ninfa_jeon","email":"urvashi.sharma271099@gmail.com"},{"name":"ndv99","email":"n.devilliers1999@gmail.com"},{"name":"goulin-canonical","email":"goulin.khoge@canonical.com"},{"name":"immortalcodes","email":"21112002mj@gmail.com"},{"name":"alvaromateo","email":"alvaro.mateoalvarez@canonical.com"},{"name":"onibenjo-canonical","email":"benjaminaderopo.oni@canonical.com"}],"dist":{"shasum":"82a9430a048aa3705ef9ec424960bfccdc3a28d6","tarball":"https://registry.npmjs.org/@canonical/anatomy-dsl/-/anatomy-dsl-0.2.2.tgz","fileCount":20,"integrity":"sha512-3zK1WLw95QtlXQIJKXVxjqGItxnTWjE3b5DMfb/L6msAAFqeRJXgu4g4+SQPZM7MBygtzS2rMDlw+EQUFGWx4w==","signatures":[{"sig":"MEUCIQD0V9R7nqVvTOHXipSFzRF3rBq0DO+PP9ITNqTnQkSSlAIgCQOoHGclCCCFd22iVqF0JykR7tirEjQGyDIk19ztyK0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":38043},"type":"module","types":"dist/types/index.d.ts","module":"dist/esm/index.js","exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/esm/index.js"}},"gitHead":"820dacce6e892da8f7910033f6decf980f1da385","scripts":{"test":"vitest run","build":"tsc -p tsconfig.build.json","check":"biome check && tsc --noEmit","check:ts":"tsc --noEmit","check:fix":"biome check --write","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"ad.vl","email":"adrian.villa.g@gmail.com"},"_npmVersion":"11.6.2","description":"Anatomy DSL meta-model: TypeScript types mirroring the OWL ontology, and a YAML-to-Turtle transform","directories":{},"_nodeVersion":"24.13.0","_hasShrinkwrap":false,"devDependencies":{"yaml":"^2.7.1","vitest":"^4.0.18","typescript":"^5.9.3","expect-type":"^1.3.0","@biomejs/biome":"^2.4.6","@canonical/biome-config":"^0.17.1","@canonical/typescript-config":"^0.17.1"},"_npmOperationalInternal":{"tmp":"tmp/anatomy-dsl_0.2.2_1774202579029_0.24664625931294593","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@canonical/anatomy-dsl","version":"0.3.0","license":"LGPL-3.0","_id":"@canonical/anatomy-dsl@0.3.0","maintainers":[{"name":"ilayda21","email":"ilayda.cavusoglupars@canonical.com"},{"name":"frankban","email":"frankban@gmail.com"},{"name":"huwshimi","email":"huw@ikmail.com"},{"name":"anthonydillon","email":"me@anthonydillon.com"},{"name":"steverydz","email":"steverydz@gmail.com"},{"name":"bartaz","email":"bartek.szopka@canonical.com"},{"name":"jpmartinspt","email":"joao.figueiredo.martins@canonical.com"},{"name":"petesfrench","email":"peterfrench94@gmail.com"},{"name":"jmuzina","email":"jmuzina@pm.me"},{"name":"mtruj","email":"mariapaula.trujillo@canonical.com"},{"name":"edlerd","email":"david.edler@canonical.com"},{"name":"abehnia","email":"ardavan.behnia@canonical.com"},{"name":"canonical-organization","email":"is-admin@canonical.com"},{"name":"edisile-canonical","email":"eduard.manta@canonical.com"},{"name":"steciuk-canonical","email":"adam.steciuk@canonical.com"},{"name":"ad.vl","email":"adrian.villa.g@gmail.com"},{"name":"engr-ali","email":"its.muhammad.ali.mughal@gmail.com"},{"name":"ando.gq","email":"tom@ando.sh"},{"name":"ninfa_jeon","email":"urvashi.sharma271099@gmail.com"},{"name":"ndv99","email":"n.devilliers1999@gmail.com"},{"name":"goulin-canonical","email":"goulin.khoge@canonical.com"},{"name":"immortalcodes","email":"21112002mj@gmail.com"},{"name":"alvaromateo","email":"alvaro.mateoalvarez@canonical.com"},{"name":"onibenjo-canonical","email":"benjaminaderopo.oni@canonical.com"}],"dist":{"shasum":"e740ffd2333fd90a314f01d98956523f4e58490a","tarball":"https://registry.npmjs.org/@canonical/anatomy-dsl/-/anatomy-dsl-0.3.0.tgz","fileCount":4,"integrity":"sha512-9jPkepRinrJ1X/fpNIgseuBcVy0lk06g4RySjgv3sXrhmr1iqSavlGTw68oKZddIMBG0Axg/RVyQZ8LyCEO+Tg==","signatures":[{"sig":"MEYCIQCwdgY3+IGv5P+UyeWGqwv9PhdLWpMPVGkodaOIY7vgdgIhAMyFC2CLn/wg9aWzpzQafM9RHXoY/yLnzE4gFAMe0aCJ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":43293},"type":"module","types":"dist/types/index.d.ts","module":"dist/esm/index.js","exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/esm/index.js"}},"gitHead":"8b4d5b43a3dc3475533d737c66c2db4018b873b1","scripts":{"test":"vitest run","build":"tsc -p tsconfig.build.json","check":"biome check && tsc --noEmit","check:ts":"tsc --noEmit","check:fix":"biome check --write","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"ad.vl","email":"adrian.villa.g@gmail.com"},"_npmVersion":"11.16.0","description":"Anatomy DSL meta-model: TypeScript types mirroring the OWL ontology, and a YAML-to-Turtle transform","directories":{},"_nodeVersion":"24.18.1","_hasShrinkwrap":false,"devDependencies":{"yaml":"^2.7.1","vitest":"^4.0.18","typescript":"^5.9.3","@types/node":"^26.4.0","expect-type":"^1.3.0","@biomejs/biome":"^2.4.6","@canonical/biome-config":"^0.17.1","@canonical/typescript-config":"^0.17.1"},"_npmOperationalInternal":{"tmp":"tmp/anatomy-dsl_0.3.0_1788125817277_0.2506585443739746","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@canonical/anatomy-dsl","version":"0.5.0","license":"LGPL-3.0","_id":"@canonical/anatomy-dsl@0.5.0","maintainers":[{"name":"ilayda21","email":"ilayda.cavusoglupars@canonical.com"},{"name":"frankban","email":"frankban@gmail.com"},{"name":"huwshimi","email":"huw@ikmail.com"},{"name":"anthonydillon","email":"me@anthonydillon.com"},{"name":"steverydz","email":"steverydz@gmail.com"},{"name":"bartaz","email":"bartek.szopka@canonical.com"},{"name":"jpmartinspt","email":"joao.figueiredo.martins@canonical.com"},{"name":"petesfrench","email":"peterfrench94@gmail.com"},{"name":"jmuzina","email":"jmuzina@pm.me"},{"name":"mtruj","email":"mariapaula.trujillo@canonical.com"},{"name":"edlerd","email":"david.edler@canonical.com"},{"name":"abehnia","email":"ardavan.behnia@canonical.com"},{"name":"canonical-organization","email":"is-admin@canonical.com"},{"name":"edisile-canonical","email":"eduard.manta@canonical.com"},{"name":"steciuk-canonical","email":"adam.steciuk@canonical.com"},{"name":"abbiesims","email":"abbie.sims@canonical.com"},{"name":"ataku_b","email":"atakan99saglam@gmail.com"},{"name":"ad.vl","email":"adrian.villa.g@gmail.com"},{"name":"engr-ali","email":"its.muhammad.ali.mughal@gmail.com"},{"name":"ninfa_jeon","email":"urvashi.sharma271099@gmail.com"},{"name":"ndv99","email":"n.devilliers1999@gmail.com"},{"name":"goulin-canonical","email":"goulin.khoge@canonical.com"},{"name":"immortalcodes","email":"21112002mj@gmail.com"},{"name":"alvaromateo","email":"alvaro.mateoalvarez@canonical.com"},{"name":"onibenjo-canonical","email":"benjaminaderopo.oni@canonical.com"}],"dist":{"shasum":"4afa09a88619467aad0fab6d9cf82b103b9fbe12","tarball":"https://registry.npmjs.org/@canonical/anatomy-dsl/-/anatomy-dsl-0.5.0.tgz","fileCount":7,"integrity":"sha512-KTQ56sbj+l90DTWQtPO+KWkMYbPXFpwIVT/KAqHbxSAZnYiS8YUQGKj8rj7XE9vn6g/YC+Y0QQD6QorqpC2nCg==","signatures":[{"sig":"MEYCIQDNJanFU9kLlwk9dXt249EBSBM+bnZ8RJ1wqsEQimrGwAIhAP5jLVPW+PCJLHeczV447Sb73zrW7D32EY14rv1zWbNq","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":116746},"type":"module","types":"dist/types/index.d.ts","module":"dist/esm/index.js","exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/esm/index.js"},"./definitions/*":"./definitions/*"},"gitHead":"7f20a77e59a429aa16a9ad3f6aa726d45099bc4e","scripts":{"test":"vitest run","build":"tsc -p tsconfig.build.json","check":"biome check && tsc --noEmit","check:ts":"tsc --noEmit","generate":"bun run src/generate.ts","check:fix":"biome check --write","test:watch":"vitest","test:coverage":"vitest run --coverage","generate:shapes":"bun run src/generate.ts shapes","generate:registry":"bun run src/generate.ts registry"},"_npmUser":{"name":"ad.vl","email":"adrian.villa.g@gmail.com"},"_npmVersion":"11.16.0","description":"Anatomy DSL meta-model: TypeScript types mirroring the OWL ontology, and a YAML-to-Turtle transform","directories":{},"_nodeVersion":"24.18.1","dependencies":{"yaml":"^2.7.1"},"_hasShrinkwrap":false,"devDependencies":{"n3":"^1.26.0","vitest":"^4.0.18","@types/n3":"^1.26.3","typescript":"^5.9.3","@types/node":"^26.4.0","expect-type":"^1.3.0","@biomejs/biome":"^2.4.6","rdf-validate-shacl":"^0.6.5","@canonical/biome-config":"^0.17.1","@canonical/token-ontology":"^0.10.1","@canonical/typescript-config":"^0.17.1"},"_npmOperationalInternal":{"tmp":"tmp/anatomy-dsl_0.5.0_1789075524863_0.47433557552003625","host":"s3://npm-registry-packages-npm-production"}},"0.5.1":{"name":"@canonical/anatomy-dsl","version":"0.5.1","license":"LGPL-3.0","_id":"@canonical/anatomy-dsl@0.5.1","maintainers":[{"name":"ilayda21","email":"ilayda.cavusoglupars@canonical.com"},{"name":"frankban","email":"frankban@gmail.com"},{"name":"huwshimi","email":"huw@ikmail.com"},{"name":"anthonydillon","email":"me@anthonydillon.com"},{"name":"steverydz","email":"steverydz@gmail.com"},{"name":"bartaz","email":"bartek.szopka@canonical.com"},{"name":"jpmartinspt","email":"joao.figueiredo.martins@canonical.com"},{"name":"petesfrench","email":"peterfrench94@gmail.com"},{"name":"jmuzina","email":"jmuzina@pm.me"},{"name":"mtruj","email":"mariapaula.trujillo@canonical.com"},{"name":"edlerd","email":"david.edler@canonical.com"},{"name":"abehnia","email":"ardavan.behnia@canonical.com"},{"name":"canonical-organization","email":"is-admin@canonical.com"},{"name":"edisile-canonical","email":"eduard.manta@canonical.com"},{"name":"steciuk-canonical","email":"adam.steciuk@canonical.com"},{"name":"abbiesims","email":"abbie.sims@canonical.com"},{"name":"ataku_b","email":"atakan99saglam@gmail.com"},{"name":"ad.vl","email":"adrian.villa.g@gmail.com"},{"name":"engr-ali","email":"its.muhammad.ali.mughal@gmail.com"},{"name":"ninfa_jeon","email":"urvashi.sharma271099@gmail.com"},{"name":"ndv99","email":"n.devilliers1999@gmail.com"},{"name":"goulin-canonical","email":"goulin.khoge@canonical.com"},{"name":"immortalcodes","email":"21112002mj@gmail.com"},{"name":"alvaromateo","email":"alvaro.mateoalvarez@canonical.com"},{"name":"onibenjo-canonical","email":"benjaminaderopo.oni@canonical.com"}],"dist":{"shasum":"b4b20bbe3272aad9a3bfe84e548acd408ce663ff","tarball":"https://registry.npmjs.org/@canonical/anatomy-dsl/-/anatomy-dsl-0.5.1.tgz","fileCount":19,"integrity":"sha512-tZ5nSo4UahDxeBDzlPzkTwO2PYhUbcLv2ROnZdyhQYM9VaKPVnweVqmG0A993W9DhA+obJw6RF2gNuwZm6MrEw==","signatures":[{"sig":"MEUCIQDK8ZAyxK2UnHSVLqBnRuqiXmUYjGZRyEdx3deZkql4ewIgBaMrBBksm2GqJis6ygaZ221nsdVDgPueniQ6ZzavfyE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":159976},"type":"module","types":"dist/types/index.d.ts","module":"dist/esm/index.js","exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/esm/index.js"},"./definitions/*":"./definitions/*"},"gitHead":"7dd27c280d0f3426c5649ffa0eb305ff59cedfc1","scripts":{"test":"vitest run","build":"tsc -p tsconfig.build.json","check":"biome check && tsc --noEmit","prepack":"bun run build","check:ts":"tsc --noEmit","generate":"bun run src/generate.ts","check:fix":"biome check --write","test:watch":"vitest","test:coverage":"vitest run --coverage","generate:shapes":"bun run src/generate.ts shapes","generate:registry":"bun run src/generate.ts registry"},"_npmUser":{"name":"ad.vl","email":"adrian.villa.g@gmail.com"},"_npmVersion":"11.16.0","description":"Anatomy DSL meta-model: TypeScript types mirroring the OWL ontology, and a YAML-to-Turtle transform","directories":{},"_nodeVersion":"24.18.1","dependencies":{"yaml":"^2.7.1"},"_hasShrinkwrap":false,"devDependencies":{"n3":"^1.26.0","vitest":"^4.0.18","@types/n3":"^1.26.3","typescript":"^5.9.3","@types/node":"^26.4.0","expect-type":"^1.3.0","@biomejs/biome":"^2.4.6","rdf-validate-shacl":"^0.6.5","@canonical/biome-config":"^0.17.1","@canonical/token-ontology":"^0.10.1","@canonical/typescript-config":"^0.17.1"},"_npmOperationalInternal":{"tmp":"tmp/anatomy-dsl_0.5.1_1789317631209_0.4060368888664916","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@canonical/anatomy-dsl","version":"0.6.0","license":"LGPL-3.0","_id":"@canonical/anatomy-dsl@0.6.0","maintainers":[{"name":"ilayda21","email":"ilayda.cavusoglupars@canonical.com"},{"name":"frankban","email":"frankban@gmail.com"},{"name":"huwshimi","email":"huw@ikmail.com"},{"name":"anthonydillon","email":"me@anthonydillon.com"},{"name":"steverydz","email":"steverydz@gmail.com"},{"name":"bartaz","email":"bartek.szopka@canonical.com"},{"name":"jpmartinspt","email":"joao.figueiredo.martins@canonical.com"},{"name":"petesfrench","email":"peterfrench94@gmail.com"},{"name":"jmuzina","email":"jmuzina@pm.me"},{"name":"mtruj","email":"mariapaula.trujillo@canonical.com"},{"name":"edlerd","email":"david.edler@canonical.com"},{"name":"abehnia","email":"ardavan.behnia@canonical.com"},{"name":"canonical-organization","email":"is-admin@canonical.com"},{"name":"edisile-canonical","email":"eduard.manta@canonical.com"},{"name":"steciuk-canonical","email":"adam.steciuk@canonical.com"},{"name":"abbiesims","email":"abbie.sims@canonical.com"},{"name":"ataku_b","email":"atakan99saglam@gmail.com"},{"name":"ad.vl","email":"adrian.villa.g@gmail.com"},{"name":"engr-ali","email":"its.muhammad.ali.mughal@gmail.com"},{"name":"ninfa_jeon","email":"urvashi.sharma271099@gmail.com"},{"name":"ndv99","email":"n.devilliers1999@gmail.com"},{"name":"goulin-canonical","email":"goulin.khoge@canonical.com"},{"name":"immortalcodes","email":"21112002mj@gmail.com"},{"name":"alvaromateo","email":"alvaro.mateoalvarez@canonical.com"},{"name":"onibenjo-canonical","email":"benjaminaderopo.oni@canonical.com"}],"dist":{"shasum":"e841a6485311ca0505351040801cbd84fa696955","tarball":"https://registry.npmjs.org/@canonical/anatomy-dsl/-/anatomy-dsl-0.6.0.tgz","fileCount":19,"integrity":"sha512-y2LmtdbGEAlDrqDVrn0E0L1IwovC+pKD+1xEQtT9YqUkKhF8WSArR6LkGULNzfuy37IjubBU7khKdTGVAEUK+w==","signatures":[{"sig":"MEUCIQCHSuR7vOigFnAZ3UYHQu+TEFzEqXOzFZSw98d7u0J8/QIgC8NYktfP93qFoMDAcrRViIUHf2LFRmbRFZPrQY+0jbs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQD3lI3Ih1jVWUvf8fY6KZb5sPBgngCieQpD3HPCFSHutwIhAIoJ6p7vbrbtCIoOiEQXHEhc87cESEcnKXaATSnmEErk","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":164726},"type":"module","types":"dist/types/index.d.ts","module":"dist/esm/index.js","exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/esm/index.js"},"./definitions/*":"./definitions/*"},"gitHead":"b206d3cfc73cfe53177b967ce23dec2c68549e59","scripts":{"test":"vitest run","build":"tsc -p tsconfig.build.json","check":"biome check && tsc --noEmit","prepack":"bun run build","check:ts":"tsc --noEmit","generate":"bun run src/generate.ts","check:fix":"biome check --write","test:watch":"vitest","test:coverage":"vitest run --coverage","generate:shapes":"bun run src/generate.ts shapes","generate:registry":"bun run src/generate.ts registry"},"_npmUser":{"name":"ad.vl","email":"adrian.villa.g@gmail.com"},"_npmVersion":"11.16.0","description":"Anatomy DSL meta-model: TypeScript types mirroring the OWL ontology, and a YAML-to-Turtle transform","directories":{},"_nodeVersion":"24.18.1","dependencies":{"yaml":"^2.7.1"},"_hasShrinkwrap":false,"devDependencies":{"n3":"^1.26.0","vitest":"^4.0.18","@types/n3":"^1.26.3","typescript":"^5.9.3","@types/node":"^26.4.0","expect-type":"^1.3.0","@biomejs/biome":"^2.4.6","rdf-validate-shacl":"^0.6.5","@canonical/biome-config":"^0.17.1","@canonical/token-ontology":"^0.10.1","@canonical/typescript-config":"^0.17.1"},"_npmOperationalInternal":{"tmp":"tmp/anatomy-dsl_0.6.0_1789504509294_0.7635320473741596","host":"s3://npm-registry-packages-npm-production"}},"0.43.0-experimental.1":{"name":"@canonical/anatomy-dsl","version":"0.43.0-experimental.1","license":"LGPL-3.0","_id":"@canonical/anatomy-dsl@0.43.0-experimental.1","maintainers":[{"name":"ilayda21","email":"ilayda.cavusoglupars@canonical.com"},{"name":"frankban","email":"frankban@gmail.com"},{"name":"huwshimi","email":"huw@ikmail.com"},{"name":"anthonydillon","email":"me@anthonydillon.com"},{"name":"steverydz","email":"steverydz@gmail.com"},{"name":"bartaz","email":"bartek.szopka@canonical.com"},{"name":"jpmartinspt","email":"joao.figueiredo.martins@canonical.com"},{"name":"petesfrench","email":"peterfrench94@gmail.com"},{"name":"jmuzina","email":"jmuzina@pm.me"},{"name":"mtruj","email":"mariapaula.trujillo@canonical.com"},{"name":"edlerd","email":"david.edler@canonical.com"},{"name":"abehnia","email":"ardavan.behnia@canonical.com"},{"name":"canonical-organization","email":"is-admin@canonical.com"},{"name":"edisile-canonical","email":"eduard.manta@canonical.com"},{"name":"steciuk-canonical","email":"adam.steciuk@canonical.com"},{"name":"abbiesims","email":"abbie.sims@canonical.com"},{"name":"ataku_b","email":"atakan99saglam@gmail.com"},{"name":"ad.vl","email":"adrian.villa.g@gmail.com"},{"name":"engr-ali","email":"its.muhammad.ali.mughal@gmail.com"},{"name":"ninfa_jeon","email":"urvashi.sharma271099@gmail.com"},{"name":"ndv99","email":"n.devilliers1999@gmail.com"},{"name":"goulin-canonical","email":"goulin.khoge@canonical.com"},{"name":"immortalcodes","email":"21112002mj@gmail.com"},{"name":"alvaromateo","email":"alvaro.mateoalvarez@canonical.com"},{"name":"onibenjo-canonical","email":"benjaminaderopo.oni@canonical.com"}],"homepage":"https://github.com/canonical/pragma-core#readme","bugs":{"url":"https://github.com/canonical/pragma-core/issues"},"dist":{"shasum":"978e6cf1344bea2982e8fe96f6d65332ab85252c","tarball":"https://registry.npmjs.org/@canonical/anatomy-dsl/-/anatomy-dsl-0.43.0-experimental.1.tgz","fileCount":20,"integrity":"sha512-eb3HxXgfxJiZtLHtieeBT+LL4AxS5BSjXM2KbX9IFoFskF6tTQbmlKu/9EyN5zG/62MVGsOuYiknMp4vd+Eikw==","signatures":[{"sig":"MEUCIQDMWYu4XcgMP3jSLEVW3TNVXcx6/bcrFo6qLEzYq/oUdwIgYNLA9C9ZpPP4yAyWJtZoIB4R4WVe//oQYxPf7KzS+SY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCcz4YnWkSub13NjPxcvkHY7QIzSW01ykzcBFQJZl0D3QIgPwBfMFkmhiKdTGi788EUcyjzcj+iskr/nrEmJqquPIE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@canonical%2fanatomy-dsl@0.43.0-experimental.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":172884},"type":"module","types":"dist/types/index.d.ts","module":"dist/esm/index.js","exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/esm/index.js"},"./definitions/*":"./definitions/*"},"gitHead":"5c1b1bdbb95844fac6211f1fe6ba10c29238d6ee","scripts":{"test":"vitest run","build":"tsc -p tsconfig.build.json","check":"biome check && tsc --noEmit","prepack":"bun run build","check:ts":"tsc --noEmit","generate":"bun run src/generate.ts","check:fix":"biome check --write","test:watch":"vitest","test:coverage":"vitest run --coverage","generate:shapes":"bun run src/generate.ts shapes","generate:registry":"bun run src/generate.ts registry"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"984480e4-cf95-47fc-954c-58ce93734baf"}},"repository":{"url":"git+https://github.com/canonical/pragma-core.git","type":"git"},"_npmVersion":"lerna/10.0.1/node@v24.21.0+x64 (linux)","description":"Anatomy DSL meta-model: TypeScript types mirroring the OWL ontology, and a YAML-to-Turtle transform","directories":{},"_nodeVersion":"24.21.0","dependencies":{"yaml":"^2.7.1"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"n3":"^1.26.0","vitest":"^4.0.18","@types/n3":"^1.26.3","typescript":"^7.0.2","@types/node":"^26.4.0","expect-type":"^1.3.0","@biomejs/biome":"^2.4.6","rdf-validate-shacl":"^0.6.5","@canonical/biome-config":"^0.43.0-experimental.0","@canonical/token-ontology":"^0.43.0-experimental.1","@canonical/typescript-config":"^0.43.0-experimental.0"},"_npmOperationalInternal":{"tmp":"tmp/anatomy-dsl_0.43.0-experimental.1_1790649858247_0.03418848507490879","host":"s3://npm-registry-packages-npm-production"}},"0.43.0":{"_id":"@canonical/anatomy-dsl@0.43.0","bugs":{"url":"https://github.com/canonical/pragma-core/issues"},"dist":{"shasum":"7bcfa601b4b19409c418c75c82f5aa440948a225","tarball":"https://registry.npmjs.org/@canonical/anatomy-dsl/-/anatomy-dsl-0.43.0.tgz","fileCount":20,"integrity":"sha512-Ohg7SQEHR298OchYuMV1lCdByBBnJWE8ejmoGGi25T9I0XsKEhkMi8JF5Mi0XGUmuGO/6yKK879US1b66w29aA==","signatures":[{"sig":"MEUCIB9m8qAytX/Qay9UHwSsArh09Go0fV++yTa4NsMoI5jJAiEAkAUFu9yO0QQa7p4ZEoyDabM+TQ50BhRt00gKzRqQHg0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDETWy68wR2Hl4D0GxR7UW17rRe8fF6teEjfH+wwPn3HwIhANN4U5ZnfnE1GRJCsUkuK+ReqbPbQZFOSnZ6mhlX9d/T"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@canonical%2fanatomy-dsl@0.43.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":172824},"name":"@canonical/anatomy-dsl","type":"module","types":"dist/types/index.d.ts","module":"dist/esm/index.js","exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/esm/index.js"},"./definitions/*":"./definitions/*"},"gitHead":"79f70779057238803359b820183de972b4a1220c","license":"LGPL-3.0","scripts":{"test":"vitest run","build":"tsc -p tsconfig.build.json","check":"biome check && tsc --noEmit","prepack":"bun run build","check:ts":"tsc --noEmit","generate":"bun run src/generate.ts","check:fix":"biome check --write","test:watch":"vitest","test:coverage":"vitest run --coverage","generate:shapes":"bun run src/generate.ts shapes","generate:registry":"bun run src/generate.ts registry"},"version":"0.43.0","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"984480e4-cf95-47fc-954c-58ce93734baf"}},"homepage":"https://github.com/canonical/pragma-core#readme","repository":{"url":"git+https://github.com/canonical/pragma-core.git","type":"git"},"_npmVersion":"lerna/10.0.1/node@v24.21.0+x64 (linux)","description":"Anatomy DSL meta-model: TypeScript types mirroring the OWL ontology, and a YAML-to-Turtle transform","directories":{},"maintainers":[{"name":"ilayda21","email":"ilayda.cavusoglupars@canonical.com"},{"name":"frankban","email":"frankban@gmail.com"},{"name":"huwshimi","email":"huw@ikmail.com"},{"name":"anthonydillon","email":"me@anthonydillon.com"},{"name":"steverydz","email":"steverydz@gmail.com"},{"name":"bartaz","email":"bartek.szopka@canonical.com"},{"name":"jpmartinspt","email":"joao.figueiredo.martins@canonical.com"},{"name":"petesfrench","email":"peterfrench94@gmail.com"},{"name":"jmuzina","email":"jmuzina@pm.me"},{"name":"mtruj","email":"mariapaula.trujillo@canonical.com"},{"name":"edlerd","email":"david.edler@canonical.com"},{"name":"abehnia","email":"ardavan.behnia@canonical.com"},{"name":"canonical-organization","email":"is-admin@canonical.com"},{"name":"edisile-canonical","email":"eduard.manta@canonical.com"},{"name":"steciuk-canonical","email":"adam.steciuk@canonical.com"},{"name":"abbiesims","email":"abbie.sims@canonical.com"},{"name":"ataku_b","email":"atakan99saglam@gmail.com"},{"name":"ad.vl","email":"adrian.villa.g@gmail.com"},{"name":"engr-ali","email":"its.muhammad.ali.mughal@gmail.com"},{"name":"ninfa_jeon","email":"urvashi.sharma271099@gmail.com"},{"name":"ndv99","email":"n.devilliers1999@gmail.com"},{"name":"goulin-canonical","email":"goulin.khoge@canonical.com"},{"name":"immortalcodes","email":"21112002mj@gmail.com"},{"name":"alvaromateo","email":"alvaro.mateoalvarez@canonical.com"},{"name":"onibenjo-canonical","email":"benjaminaderopo.oni@canonical.com"}],"_nodeVersion":"24.21.0","dependencies":{"yaml":"^2.7.1"},"_hasShrinkwrap":false,"devDependencies":{"n3":"^1.26.0","vitest":"^4.0.18","@types/n3":"^1.26.3","typescript":"^7.0.2","@types/node":"^26.4.0","expect-type":"^1.3.0","@biomejs/biome":"^2.4.6","rdf-validate-shacl":"^0.6.5","@canonical/biome-config":"^0.43.0","@canonical/token-ontology":"^0.43.0","@canonical/typescript-config":"^0.43.0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/anatomy-dsl_0.43.0_1790797689745_0.026773573230638004"}}},"time":{"created":"2026-03-20T22:17:03.138Z","modified":"2026-09-30T19:48:10.330Z","0.2.0":"2026-03-20T22:17:03.383Z","0.2.1":"2026-03-20T22:43:08.706Z","0.2.2":"2026-03-22T18:02:59.172Z","0.3.0":"2026-08-30T21:36:57.427Z","0.5.0":"2026-09-10T21:25:25.326Z","0.5.1":"2026-09-13T16:40:31.339Z","0.6.0":"2026-09-15T20:35:09.394Z","0.43.0-experimental.1":"2026-09-29T02:44:18.336Z","0.43.0":"2026-09-30T19:48:09.876Z"},"license":"LGPL-3.0","description":"Anatomy DSL meta-model: TypeScript types mirroring the OWL ontology, and a YAML-to-Turtle transform","maintainers":[{"name":"ilayda21","email":"ilayda.cavusoglupars@canonical.com"},{"name":"frankban","email":"frankban@gmail.com"},{"name":"huwshimi","email":"huw@ikmail.com"},{"name":"anthonydillon","email":"me@anthonydillon.com"},{"name":"steverydz","email":"steverydz@gmail.com"},{"name":"bartaz","email":"bartek.szopka@canonical.com"},{"name":"jpmartinspt","email":"joao.figueiredo.martins@canonical.com"},{"name":"petesfrench","email":"peterfrench94@gmail.com"},{"name":"jmuzina","email":"jmuzina@pm.me"},{"name":"mtruj","email":"mariapaula.trujillo@canonical.com"},{"name":"edlerd","email":"david.edler@canonical.com"},{"name":"abehnia","email":"ardavan.behnia@canonical.com"},{"name":"canonical-organization","email":"is-admin@canonical.com"},{"name":"edisile-canonical","email":"eduard.manta@canonical.com"},{"name":"steciuk-canonical","email":"adam.steciuk@canonical.com"},{"name":"abbiesims","email":"abbie.sims@canonical.com"},{"name":"ataku_b","email":"atakan99saglam@gmail.com"},{"name":"ad.vl","email":"adrian.villa.g@gmail.com"},{"name":"engr-ali","email":"its.muhammad.ali.mughal@gmail.com"},{"name":"ninfa_jeon","email":"urvashi.sharma271099@gmail.com"},{"name":"ndv99","email":"n.devilliers1999@gmail.com"},{"name":"goulin-canonical","email":"goulin.khoge@canonical.com"},{"name":"immortalcodes","email":"21112002mj@gmail.com"},{"name":"alvaromateo","email":"alvaro.mateoalvarez@canonical.com"},{"name":"onibenjo-canonical","email":"benjaminaderopo.oni@canonical.com"}],"readme":"# Anatomy DSL\n\nA YAML-based DSL for representing design system component anatomies — platform-agnostic structural primitives that precede implementation.\n\n## Quick Example\n\n```yaml\n---\nnode:\n  uri: global.component.button\n  styles:\n    layout.type: inline-flex\n    layout.align: center\n    spacing.internal.inline.start: spacing.inset.action.inline\n    appearance.background: [modifier.color.foreground.primary, color.foreground.primary]\n    appearance.radius: dimension.radius.medium\n  edges:\n    - node:\n        uri: global.subcomponent.button-icon\n      relation:\n        cardinality: \"0..1\"\n        slotName: icon\n    - node:\n        role: label text\n      relation:\n        cardinality: \"1\"\n        slotName: default\n```\n\nStyle values are **token symbols**, written in the symbol's own dotted\nspelling: `dimension.radius.medium`, `color.foreground.primary`. A list is\nthe **fallback order** — a one-to-one transcription of the implementation's\nown `var()` chain, so `[modifier.color.foreground.primary,\ncolor.foreground.primary]` says \"read the primary-foreground channel, and\nfall back to the primary foreground token\", which is what the reference CSS\ndoes. A **channel** (`modifier.*`, `surface.*`) is a symbol like any other:\nthe anatomy consumes it by name where the implementation reads the channel,\nand the semantic token by name where it reads the token — nothing is\ninferred. Primitives like `inline-flex` and `center` are used for layout\nsemantics that do not vary across themes, and one may end a list where the\nimplementation's chain ends in a literal\n(`[modifier.color.icon, modifier.color.text, currentColor]`).\n\nKeys come from a **closed roster** — `definitions/style-keys.yaml`, from\nwhich `definitions/registry.ttl` is generated. The roster is measured, not\ndesigned: its 111 keys are the right-hand column of a table whose left-hand\ncolumn was every CSS property bound on a component selector across 89\npublished component stylesheets, so a key exists because an implementation\nbinds the property. That measurement lives in `canonical/design-system`,\nwhere the reference stylesheets are an input; this package reads no CSS and\nholds the roster, with its provenance stated in both files. The\nslash-delimited path and the trailing `?` marker of earlier versions are\nretired — see `docs/api-reference.md` §5, §11 and §12.\n\n## Projections\n\nProjections bind the anatomy tree directly to graph data, after the Relay\nfragment-colocation pattern: the tree carries its data requirements the way a\nlens component carries its fragment.\n\n```yaml\n---\nnode:\n  uri: global.component.entity-card\n  projection:\n    on: Component            # type condition — the tree is a view over one Component\n  edges:\n    - node:\n        uri: global.subcomponent.entity-card-header\n        projection:\n          field: _meta.title # this node renders the entity's title\n      relation:\n        cardinality: \"1\"\n        slotName: header\n    - node:\n        uri: global.component.chip\n        projection:\n          field: _meta.title # relative to the traversed Tag\n      relation:\n        cardinality: \"0..*\"\n        slotName: tags\n        projection:\n          field: documentationStages  # traversal populating the slot\n```\n\nSemantics:\n\n- The **root node's** `projection.on` establishes the data context — the anatomy\n  is a parameterized view over one entity of that GraphQL type, like\n  `fragment EntityCard on Component`. Children inherit the context.\n- `projection.field` on a **relation** is a traversal: the slot is populated\n  from that field of the current context. The DSL names the field only —\n  never `edges.node`. Anatomy cardinality ↔ graph multiplicity is the Relay\n  pattern taken one level further.\n- **Cardinality decomposes against the schema.** The upper bound claims\n  multiplicity: `..1` maps to an object or scalar field, `..*` to a\n  connection or list. The lower bound claims nullability: `0..` tolerates\n  `null`, `1..` requires the provider to always have the value. So\n  `field: _meta.title` may sit under `cardinality: \"1\"` (title is total in\n  the contract), but a nullable field like `summary` must sit under `0..1`.\n  `1..*` asserts a non-empty list — deliberately stronger than GraphQL can\n  express, and checkable only at runtime.\n- **Mechanism-blindness.** Whether a plural field is a Relay connection\n  (`subcomponents`) or a plain list (`properties`) is a provider mechanism,\n  not an anatomy fact. Consumers discover the shape from the SDL and unwrap\n  `edges { node }` when needed; an anatomy survives a provider promoting a\n  list to a connection unchanged.\n- `projection.on` on a **child node** narrows the traversed entity's type — the\n  analog of an inline fragment. Switch cases carrying different `on` values\n  mirror an interface resolved through inline fragments.\n- `projection.field` on a **node** means the node renders that field's value,\n  as a dot-delimited path relative to the enclosing context (`_meta.title`).\n- A node projection needs at least one of `on` / `field`; a relation projection\n  requires `field` and admits no type condition (narrowing belongs on the\n  child node).\n\nField names are anchored to the provider schema the docsite runs against\n(compiled with `prefixing: \"none\"`); the committed SDL is the naming authority.\n\nA fully projected anatomy **derives a GraphQL fragment** mechanically — the\nexample above reads as:\n\n```graphql\nfragment EntityCardAnatomy on Component {\n  _meta { title }                        # header node\n  documentationStages {                  # tags relation (connection per SDL)\n    edges { node { _meta { title } } }   #   each chip\n  }\n}\n```\n\nThe derivation rules (type conditions, dot-path expansion, connection\nunwrapping, inline fragments) are specified in the API reference §3.10\n*Derived fragment*; a worked gallery of every projection form is in §13, and\n`examples/yaml/entity-card.anatomy.yaml` is the golden example.\n\n## Props (pinned values)\n\nA named node can **pin** props of the component it references — fixing a prop\nvalue at one tree position:\n\n```yaml\nnode:\n  uri: global.component.icon\n  props:\n    icon: chevron-down\n```\n\nThis is how icons become idiomatic with zero icon-specific machinery. The\ndesign system models the icon as a component whose glyph is a required prop\n(`ds:global.component.icon` › `ds:hasProperty [ ds:name \"icon\" ]`), so icon\nusage in anatomies splits into exactly two cases:\n\n- **Consumer-filled icon slot** — an icon-component edge with a slot and no\n  pin. The consumer chooses the glyph; the anatomy correctly says nothing.\n- **Component-intrinsic icon** — the accordion chevron, the modal close ×, a\n  status glyph: the component's own spec fixes the glyph, and the anatomy\n  pins it.\n\nSemantics:\n\n- Pins live on **named nodes only** — anonymous nodes have no prop surface.\n  This is enforced in the types, the parser, and SHACL.\n- The DSL **never defines a prop surface** (names, types, optionality live in\n  the design system ontology); it only asserts values. Whether a pinned prop\n  exists on the component, and whether a value is admissible (e.g. a glyph\n  name in the icon set), are consumer-side checks against the DS graph — the\n  same posture as projection checking against the provider SDL.\n- Values are scalars, coerced to strings — no symbols and no fallback lists: a pin is a value, not a style.\n  Pins are *values with meaning*, not styles: a theme may reskin what\n  `chevron-down` looks like (asset layer), but never remap which glyph an\n  anatomy means.\n- A **data-driven** value is a projection (`projection: { field: … }`), and a\n  **state-driven** one is a `switch` — pinned props are static by design.\n\nIn TTL, pins reify like styles do: `hasProp [ a :Prop ; propName \"…\" ;\npropValue \"…\" ]`. See `examples/yaml/status-header.anatomy.yaml` for\nintrinsic icons, a status-glyph switch, and an unpinned consumer slot in one\nanatomy.\n\n## Interaction states\n\nInteraction states re-value style channels — they never add structure. A\nstyle key takes an `@state` suffix scoping its value to a state; the unmarked\nkey is the default state:\n\n```yaml\nstyles:\n  interaction.cursor: pointer\n  interaction.cursor@disabled: not-allowed\n  appearance.background: [modifier.color.foreground.primary, color.foreground.primary]\n  appearance.background@hover: color.foreground.primary.hover\n  appearance.background@disabled: color.foreground.primary.disabled\n  # A slot may read a channel only in one state.\n  appearance.outline.color@focus: [modifier.color.focusRing, color.focusRing, currentColor]\n```\n\nThe state vocabulary is **closed and registry-governed**: `hover`, `active`,\n`focus`, `disabled`, `selected`, `expanded`, `indeterminate`, `invalid`.\nNaming follows the industry consensus where systems diverge — `active`\nsubsumes Material's *pressed* and Spectrum's *down* (and matches Canonical's\nown token tree); `focus` maps to CSS `:focus-visible` (Spectrum's\n*key-focus*); `expanded` is a disclosure's open state (`[open]`,\n`aria-expanded`); `indeterminate` is a mixed checkbox or progress bar, on\nneither setting; `invalid` is a failed validation (`:invalid`,\n`aria-invalid`). `@default` is not admitted — absence is the default.\nCandidate additions (`checked`, `visited`, `dragged`, `pending`, `error`,\n`read-only`) go through the registry, never by loosening the schema.\n\nThe boundaries that keep \"state machines out of scope\" true:\n\n- **States hold style values only.** A state that changes the tree is not a\n  state — it is a `switch on: internal` case (async-button's\n  idle/loading/success/error). The DSL declares appearance *per* state, never\n  transitions, triggers, or logic.\n- **Gate vs appearance**: `props: { disabled: true }` (or the consumer) puts\n  a node in the disabled state; `…@disabled` styles say how it looks there.\n- A state-scoped value that differs from its base state's is a **lint, not a\n  constraint**: it is reported with the ranks at which they differ and never\n  rejected, because the reference does it — Button's `:disabled` reads\n  `color.text.disabled`, a different symbol from its resting `color.text`.\n- The grammar reserves repeatable markers for compound states\n  (`@selected@hover`, canonical order: value/control state before user-action\n  state); v1 permits a single `@`.\n\nIn TTL, the Style tuple gains one optional dimension:\n`[ a :Style ; :styleKey \"appearance.background\" ; :styleState \"hover\" ; :styleValue \"…\" ]`.\nSee `examples/yaml/stateful-button.anatomy.yaml`.\n\n## Install\n\n```sh\nbun add -D @canonical/anatomy-dsl\n```\n\n## Usage\n\n```typescript\nimport { parse } from \"yaml\";\nimport { parseAnatomyYAML, anatomyToTTL } from \"@canonical/anatomy-dsl\";\n\nconst raw = parse(readFileSync(\"Button.anatomy.yaml\", \"utf8\"));\nconst spec = parseAnatomyYAML(raw);\nconst ttl = anatomyToTTL(spec);\n```\n\nThe button example above produces:\n\n```turtle\n@prefix : <https://anatomy.canonical.com/> .\n@prefix dt: <https://dt.canonical.com/> .\n\n[] a :Specification ;\n    :rootNode [\n        a :NamedNode ;\n        :uri \"global.component.button\" ;\n        :hasStyle\n            [ a :Style ; :styleKey \"layout.type\" ; :styleValue \"inline-flex\" ] ,\n            [ a :Style ; :styleKey \"layout.align\" ; :styleValue \"center\" ] ,\n            [ a :Style ; :styleKey \"spacing.internal.inline.start\" ; :styleValue \"spacing.inset.action.inline\" ; :consumes ( dt:spacing.inset.action.inline ) ] ,\n            [ a :Style ; :styleKey \"appearance.background\" ; :styleValue \"[modifier.color.foreground.primary, color.foreground.primary]\" ; :consumes ( dt:modifier.color.foreground.primary dt:color.foreground.primary ) ] ,\n            [ a :Style ; :styleKey \"appearance.radius\" ; :styleValue \"dimension.radius.medium\" ; :consumes ( dt:dimension.radius.medium ) ] ;\n        :hasEdge [\n            a :Edge ;\n            :edgeTarget [\n                a :NamedNode ;\n                :uri \"global.subcomponent.button-icon\"\n            ] ;\n            :hasRelation [\n                a :Relation ;\n                :cardinality \"0..1\" ;\n                :slotName \"icon\"\n            ]\n        ] , [\n            a :Edge ;\n            :edgeTarget [\n                a :AnonymousNode ;\n                :role \"label text\"\n            ] ;\n            :hasRelation [\n                a :Relation ;\n                :cardinality \"1\" ;\n                :slotName \"default\"\n            ]\n        ]\n    ] .\n```\n\n## API\n\n### `parseAnatomyYAML(raw: unknown): Specification`\n\nConverts a parsed YAML object (from any YAML library) into the typed `Specification` structure. Handles field mapping between the YAML format and the TypeScript types.\n\n### `anatomyToTTL(spec: Specification): string`\n\nPure function. Takes a `Specification`, returns a Turtle (RDF) string. No I/O, no side effects.\n\n### Types\n\nAll types mirror the [OWL ontology](definitions/ontology.ttl) exactly:\n\n| Type | Description |\n|------|-------------|\n| `Specification` | Root — contains exactly one `NamedNode` |\n| `NamedNode` | Design system entity with a `uri` |\n| `AnonymousNode` | Structural element with a `role` |\n| `Node` | `NamedNode \\| AnonymousNode` (discriminated on `type`) |\n| `Edge` | Reified parent→child relationship |\n| `Relation` | Cardinality and optional slot name |\n| `Style` | Reified key-value tuple, with an optional interaction `state` dimension |\n| `Switch` | Polymorphic position (discriminator: `props \\| internal \\| override`) |\n| `SwitchCase` | One alternative within a switch |\n| `Projection` | Fragment-style graph binding on a node (`on` type condition and/or `field` path) |\n| `RelationProjection` | Traversal populating a slot (`field` required) |\n| `Prop` | Pinned prop value on a named node (reified name-value tuple) |\n\n## Repository Structure\n\n```\ndefinitions/   Turtle ontology (OWL) + SHACL shapes, the style-key roster and\n               the registry generated from it, and the lift fixture — all of\n               it public API, since exports lists it\ndocs/          API reference (WD404 + WD404.1 + WD404.2 + WD404.3)\nexamples/      Example anatomy files (YAML + Turtle pairs), the corpus the\n               round-trip and SHACL tests read\nsrc/           TypeScript types, parser, value grammar, transform and the\n               generators\n```\n\n## Scope\n\nThe Anatomy DSL describes **structure**, **graph-data bindings** (projections\n— what data each position renders), **pinned prop values** (props — fixed\ncomponent configuration at a position), and **state-scoped styles**\n(interaction states — how channels re-value per state). It does not handle:\n\n- **Prop surface definition** — which props a component accepts, their types\n  and optionality live in the design system ontology; the DSL only pins values\n- **State machines** — transitions, triggers, and interaction logic; the DSL\n  declares appearance per state only, and structural state variation is the\n  switch construct's job\n- **Modifier descriptions** — only design token references are supported, not semantic modifier definitions\n\n## Design Notes\n\nStyles are modelled as reified key-value tuples\n(`hasStyle [ a :Style ; :styleKey \"…\" ; :styleValue \"…\" ]`), which stays\nlossless whatever the key roster becomes. Since 0.4.0 a tuple whose key takes\na token also carries `:consumes`, an ordered `rdf:List` of the `dt:` symbols\nit reads: `:styleValue` is the authored spelling kept verbatim as evidence —\nit is where a terminal literal lives, since a literal is not a symbol — and\n`:consumes` is the form a query can walk. The key vocabulary is no longer\nopen: `anatomy:styleKey`'s `sh:in` is projected from the registry, so a key\noutside the roster is a SHACL violation rather than a silent addition.\n\nProjections and pinned props reuse the same reification idiom (`hasProjection [ projectionType \"…\" ; projectionField \"…\" ]`, `hasProp [ propName \"…\" ; propValue \"…\" ]`). Projections attach to both nodes and relations — the reified `Relation` is precisely what makes slot-level traversal annotations possible without changing the `Edge` class; pins attach to named nodes only.\n\n## Specification Status\n\n| Index   | Title                    | Status         |\n|---------|--------------------------|----------------|\n| [WD404](https://docs.google.com/document/d/1eFr-SNsAZyidnZzpWp1Jeegiat_SSM7mOW_G8p3nXo8/edit?tab=t.pndvuecem8cf)   | Anatomy DSL              | Approved       |\n| [WD404.1](https://docs.google.com/document/d/1eFr-SNsAZyidnZzpWp1Jeegiat_SSM7mOW_G8p3nXo8/edit?tab=t.pndvuecem8cf) | Anatomy DSL — Addendum 1 | Pending Review |\n| WD404.2 | Anatomy DSL — Projections | Draft (this repository) |\n| WD404.3 | Anatomy DSL — Prop pinning | Draft (this repository) |\n","readmeFilename":"README.md","homepage":"https://github.com/canonical/pragma-core#readme","repository":{"url":"git+https://github.com/canonical/pragma-core.git","type":"git"},"bugs":{"url":"https://github.com/canonical/pragma-core/issues"}}