@kanonak-protocol/cli 3.4.0 → 3.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -37,6 +37,25 @@ export declare function findSubjectsByType(kanonaks: Kanonak[], target: EntityUr
37
37
  * Look up a `SubjectKanonak` by full URI across a list of kanonaks.
38
38
  * Used for following a reference to its definition (e.g. to read a
39
39
  * `License`'s `spdxId` or a `Tool`'s `label`).
40
+ *
41
+ * Version handling:
42
+ *
43
+ * - When `uri.version` is present (concrete `M.m.p`), the match
44
+ * is STRICT — only a subject whose `namespace` is exactly
45
+ * `<publisher>/<package>@<M.m.p>` qualifies. This is what
46
+ * `tx.ResolveRef` needs when walking inner references in a
47
+ * multi-scope SetTransformation: a reference to
48
+ * `pkg@1.0.1/foo` must resolve to the 1.0.1 instance, not
49
+ * collapse to whichever same-named instance was loaded first
50
+ * across versions (kanonak-protocol/typescript#12).
51
+ *
52
+ * - When `uri.version` is absent (an unversioned reference, e.g.
53
+ * authored as `pkg/foo` with no `@version` qualifier or coming
54
+ * from an `EntityUri` that carries no version), the match is
55
+ * LENIENT — any version of `<publisher>/<package>/<name>`
56
+ * qualifies. This preserves the historical behavior for
57
+ * callers that pass version-less URIs (UriLiteral, parsed
58
+ * bare-name references in single-version workspaces, etc).
40
59
  */
41
60
  export declare function findSubjectByUri(kanonaks: Kanonak[], uri: KanonakUri): SubjectKanonak | undefined;
42
61
  /**
package/dist/index.js CHANGED
@@ -1,98 +1,98 @@
1
1
  #!/usr/bin/env node
2
- import{Command as Bi}from"commander";import{readFileSync as Mi}from"fs";import{fileURLToPath as Hi}from"url";import{dirname as qi,join as zi}from"path";import{KanonakParser as Wi,PublisherIndex as Gi,CredentialStore as Xi,createAuthenticatedFetch as Ji}from"@kanonak-protocol/sdk";import{readFileSync as Br,statSync as Mr}from"fs";import{resolve as Hr,dirname as qr}from"path";import{KanonakParser as zr,KanonakObjectValidator as Wr,ValidationSeverity as _n}from"@kanonak-protocol/sdk";import{readFileSync as jr,readdirSync as xr}from"fs";import{join as Ur,dirname as Or,basename as An}from"path";import{InMemoryKanonakDocumentRepository as Lr,FileSystemKanonakDocumentRepository as Nr,HttpKanonakDocumentRepository as Vr,getGlobalCachePath as Fr}from"@kanonak-protocol/sdk";import{mkdirSync as Cr,readFileSync as En,writeFileSync as Cn,existsSync as Je,appendFileSync as Ar}from"fs";import{join as _r,dirname as Rr,isAbsolute as Ir}from"path";import{getGlobalCachePath as Tr}from"@kanonak-protocol/sdk";var U=class{constructor(e=Tr()){this.cacheDir=e;this.isProjectLocal=!Ir(e)}cacheDir;gitignoreChecked=!1;isProjectLocal;get(e,t,r){let o=this.getPath(e,t,r);return Je(o)?En(o,"utf-8"):null}put(e,t,r,o){let s=this.getPath(e,t,r);Cr(Rr(s),{recursive:!0}),Cn(s,o,"utf-8"),this.isProjectLocal&&this.ensureGitignore()}has(e,t,r){return Je(this.getPath(e,t,r))}ensureGitignore(){if(this.gitignoreChecked)return;this.gitignoreChecked=!0;let e=".gitignore",t=this.cacheDir;if(Je(e)){if(En(e,"utf-8").split(`
3
- `).some(o=>o.trim()===t||o.trim()===t+"/"))return;Ar(e,`
2
+ import{Command as Bi}from"commander";import{readFileSync as Mi}from"fs";import{fileURLToPath as Hi}from"url";import{dirname as qi,join as zi}from"path";import{KanonakParser as Wi,PublisherIndex as Gi,CredentialStore as Xi,createAuthenticatedFetch as Ji}from"@kanonak-protocol/sdk";import{readFileSync as Fr,statSync as Br}from"fs";import{resolve as Mr,dirname as Hr}from"path";import{KanonakParser as qr,KanonakObjectValidator as zr,ValidationSeverity as _n}from"@kanonak-protocol/sdk";import{readFileSync as Tr,readdirSync as jr}from"fs";import{join as xr,dirname as Ur,basename as An}from"path";import{InMemoryKanonakDocumentRepository as Or,FileSystemKanonakDocumentRepository as Nr,HttpKanonakDocumentRepository as Lr,getGlobalCachePath as Vr}from"@kanonak-protocol/sdk";import{mkdirSync as Er,readFileSync as En,writeFileSync as Cn,existsSync as Je,appendFileSync as Cr}from"fs";import{join as Ar,dirname as _r,isAbsolute as Rr}from"path";import{getGlobalCachePath as Ir}from"@kanonak-protocol/sdk";var U=class{constructor(e=Ir()){this.cacheDir=e;this.isProjectLocal=!Rr(e)}cacheDir;gitignoreChecked=!1;isProjectLocal;get(e,t,r){let o=this.getPath(e,t,r);return Je(o)?En(o,"utf-8"):null}put(e,t,r,o){let a=this.getPath(e,t,r);Er(_r(a),{recursive:!0}),Cn(a,o,"utf-8"),this.isProjectLocal&&this.ensureGitignore()}has(e,t,r){return Je(this.getPath(e,t,r))}ensureGitignore(){if(this.gitignoreChecked)return;this.gitignoreChecked=!0;let e=".gitignore",t=this.cacheDir;if(Je(e)){if(En(e,"utf-8").split(`
3
+ `).some(o=>o.trim()===t||o.trim()===t+"/"))return;Cr(e,`
4
4
  ${t}/
5
5
  `)}else Cn(e,`${t}/
6
- `)}getPath(e,t,r){return _r(this.cacheDir,e,`${t}@${r}.kan.yml`)}};function pe(n){let e=n;for(;;){let t=Or(e);if(t===e)break;if(An(e).includes(".")||An(t).includes(".")){e=t;continue}break}return e}function Pe(n,e){for(let t of xr(n,{withFileTypes:!0})){let r=Ur(n,t.name);t.isDirectory()&&t.name!=="node_modules"&&t.name!==".kanonak"?Pe(r,e):t.name.endsWith(".kan.yml")&&e.push(r)}}var Ye=class{repos;constructor(...e){this.repos=e}async getHighestCompatibleVersionAsync(e,t){for(let r of this.repos)try{let o=await r.getHighestCompatibleVersionAsync(e,t);if(o)return o}catch{}return null}async getAllDocumentsAsync(){let e=[];for(let t of this.repos)try{e.push(...await t.getAllDocumentsAsync())}catch{}return e}async getDocumentAsync(e){for(let t of this.repos)try{let r=await t.getDocumentAsync(e);if(r)return r}catch{}return null}async getDocumentsByNamespaceAsync(e,t){for(let r of this.repos)try{let o=await r.getDocumentsByNamespaceAsync(e,t);if(o.length>0)return o}catch{}return[]}async saveDocumentAsync(e,t){await this.repos[0].saveDocumentAsync(e,t)}async deleteDocumentAsync(e){await this.repos[0].deleteDocumentAsync(e)}async clearNamespaceAsync(e,t){await this.repos[0].clearNamespaceAsync(e,t)}async getAllDocumentReferencesAsync(){return this.repos[0].getAllDocumentReferencesAsync()}async getDocumentContentAsync(e){for(let t of this.repos)try{let r=await t.getDocumentContentAsync(e);if(r)return r}catch{}return null}async getDocumentUriAsync(e){for(let t of this.repos)try{let r=await t.getDocumentUriAsync(e);if(r)return r}catch{}return null}};async function O(n,e){let t=[];Pe(n,t);let r=new Lr(e);for(let i of t)try{let c=jr(i,"utf-8"),l=e.parse(c),d=l.metadata.namespace_;if(d){let f=`${d.publisher}/${d.package_}@${d.version}`;await r.saveDocumentAsync(l,f)}}catch{}let o=new Nr(Fr(),!0,e),s=new U,a=new Vr({getFromCache:(i,c,l)=>s.get(i,c,l),onFetch:(i,c,l,d)=>s.put(i,c,l,d)});return new Ye(r,o,a)}async function Rn(n){let e=Hr(n),t=Mr(e),r=t.isDirectory()?pe(e):pe(qr(e)),o=new zr,s=new Wr(o),a=await O(r,o),i=[];if(t.isDirectory()?Pe(e,i):i.push(e),i.length===0){console.log("No .kan.yml files found.");return}let c=0,l=0;for(let d of i){let f=Br(d,"utf-8"),m=o.parseWithErrors(f);if(m.errors&&m.errors.length>0){console.log(`
7
- ${d}:`);for(let h of m.errors)console.log(` ERROR (parse): ${h.message} [line ${h.line}:${h.column}]`),c++;continue}let g=m.document;if(!g){console.log(`
8
- ${d}:`),console.log(" ERROR: Failed to parse document"),c++;continue}let b=await s.validateAsync(g,a),k=b.errors.filter(h=>h.severity===_n.Error),y=b.errors.filter(h=>h.severity===_n.Warning);if(k.length>0||y.length>0){let h=g.metadata.namespace_,w=h?`${h.publisher}/${h.package_}@${h.version}`:d;console.log(`
6
+ `)}getPath(e,t,r){return Ar(this.cacheDir,e,`${t}@${r}.kan.yml`)}};function me(n){let e=n;for(;;){let t=Ur(e);if(t===e)break;if(An(e).includes(".")||An(t).includes(".")){e=t;continue}break}return e}function Ke(n,e){for(let t of jr(n,{withFileTypes:!0})){let r=xr(n,t.name);t.isDirectory()&&t.name!=="node_modules"&&t.name!==".kanonak"?Ke(r,e):t.name.endsWith(".kan.yml")&&e.push(r)}}var Ye=class{repos;constructor(...e){this.repos=e}async getHighestCompatibleVersionAsync(e,t){for(let r of this.repos)try{let o=await r.getHighestCompatibleVersionAsync(e,t);if(o)return o}catch{}return null}async getAllDocumentsAsync(){let e=[];for(let t of this.repos)try{e.push(...await t.getAllDocumentsAsync())}catch{}return e}async getDocumentAsync(e){for(let t of this.repos)try{let r=await t.getDocumentAsync(e);if(r)return r}catch{}return null}async getDocumentsByNamespaceAsync(e,t){for(let r of this.repos)try{let o=await r.getDocumentsByNamespaceAsync(e,t);if(o.length>0)return o}catch{}return[]}async saveDocumentAsync(e,t){await this.repos[0].saveDocumentAsync(e,t)}async deleteDocumentAsync(e){await this.repos[0].deleteDocumentAsync(e)}async clearNamespaceAsync(e,t){await this.repos[0].clearNamespaceAsync(e,t)}async getAllDocumentReferencesAsync(){return this.repos[0].getAllDocumentReferencesAsync()}async getDocumentContentAsync(e){for(let t of this.repos)try{let r=await t.getDocumentContentAsync(e);if(r)return r}catch{}return null}async getDocumentUriAsync(e){for(let t of this.repos)try{let r=await t.getDocumentUriAsync(e);if(r)return r}catch{}return null}};async function O(n,e){let t=[];Ke(n,t);let r=new Or(e);for(let i of t)try{let c=Tr(i,"utf-8"),l=e.parse(c),u=l.metadata.namespace_;if(u){let f=`${u.publisher}/${u.package_}@${u.version}`;await r.saveDocumentAsync(l,f)}}catch{}let o=new Nr(Vr(),!0,e),a=new U,s=new Lr({getFromCache:(i,c,l)=>a.get(i,c,l),onFetch:(i,c,l,u)=>a.put(i,c,l,u)});return new Ye(r,o,s)}async function Rn(n){let e=Mr(n),t=Br(e),r=t.isDirectory()?me(e):me(Hr(e)),o=new qr,a=new zr(o),s=await O(r,o),i=[];if(t.isDirectory()?Ke(e,i):i.push(e),i.length===0){console.log("No .kan.yml files found.");return}let c=0,l=0;for(let u of i){let f=Fr(u,"utf-8"),p=o.parseWithErrors(f);if(p.errors&&p.errors.length>0){console.log(`
7
+ ${u}:`);for(let h of p.errors)console.log(` ERROR (parse): ${h.message} [line ${h.line}:${h.column}]`),c++;continue}let g=p.document;if(!g){console.log(`
8
+ ${u}:`),console.log(" ERROR: Failed to parse document"),c++;continue}let b=await a.validateAsync(g,s),k=b.errors.filter(h=>h.severity===_n.Error),y=b.errors.filter(h=>h.severity===_n.Warning);if(k.length>0||y.length>0){let h=g.metadata.namespace_,w=h?`${h.publisher}/${h.package_}@${h.version}`:u;console.log(`
9
9
  ${w}:`);for(let $ of k)console.log(` ERROR: ${$.message}`),$.suggestion&&console.log(` -> ${$.suggestion}`);for(let $ of y)console.log(` WARN: ${$.message}`)}c+=k.length,l+=y.length}console.log(`
10
- ${i.length} file(s) validated. ${c} error(s), ${l} warning(s).`),c>0&&process.exit(1)}import{KanonakParser as Gr,PublisherIndex as Xr,CredentialStore as Jr,createAuthenticatedFetch as Yr}from"@kanonak-protocol/sdk";import{loadLockFile as Zr,saveLockFile as Qr,computeIntegrity as eo}from"@kanonak-protocol/sdk";function ne(n){if(!n)return null;let e=n.indexOf("/");if(e===-1)return null;let t=n.substring(0,e),r=n.substring(e+1);if(!t||!r)return null;let o,s=null,a=null,i=r.indexOf("@");if(i!==-1){o=r.substring(0,i);let c=r.substring(i+1),l=c.indexOf("/");l===-1?s=c||null:(s=c.substring(0,l)||null,a=c.substring(l+1)||null)}else{let c=r.indexOf("/");c===-1?o=r:(o=r.substring(0,c),a=r.substring(c+1)||null)}return!o||a&&a.includes("/")||s&&s.includes("@")?null:{publisher:t,packageName:o,version:s,instanceName:a}}async function In(n){let e=new U,t=new Gr,r=new Jr,o=Yr(r),s=new Xr({fetchFn:o}),a=Zr()??{version:"1",lastUpdated:new Date().toISOString(),packages:{}};if(!n){Object.keys(a.packages).length===0&&(console.error("No kanonak.lock file found or lock file is empty."),console.error("Usage: kanonak install {publisher}/{package}[@{version}]"),process.exit(1)),console.log(`Installing ${Object.keys(a.packages).length} package(s) from kanonak.lock...`);for(let[b,k]of Object.entries(a.packages)){let y=b.indexOf("/"),h=b.substring(0,y),w=b.substring(y+1),$=e.get(h,w,k.version);if($)console.log(` ${b}@${k.version} (cached)`);else{let v=k.resolved,K=await o(v,h);if(!K.ok)throw new Error(`Failed to fetch ${v} (${K.status} ${K.statusText})`);$=await K.text(),e.put(h,w,k.version,$),console.log(` ${b}@${k.version}`)}}console.log(`
11
- Installed ${Object.keys(a.packages).length} package(s) from lock file.`);return}let i=ne(n);i||(console.error(`Invalid package reference: "${n}"`),console.error("Expected format: {publisher}/{package}[@{version}]"),process.exit(1));let{publisher:c,packageName:l,version:d,instanceName:f}=i;f&&(console.error(`\`kanonak install\` works on whole packages \u2014 got an instance suffix "/${f}".`),console.error(`Try: kanonak install ${c}/${l}${d?"@"+d:""}`),console.error("(Use `kanonak <capability> add` if you want to install one named instance.)"),process.exit(1));let m=d??await s.getHighestVersion(c,l);m||(console.error(`Could not resolve version for "${c}/${l}".`),console.error("Check the spelling, or run a search to see what the publisher offers."),process.exit(1)),console.log(`Installing ${c}/${l}@${m}...`);let g=new Set;await Tn(c,l,m,e,t,s,o,g,a),Qr(a),console.log(`
12
- Installed ${g.size} package(s).`)}async function Tn(n,e,t,r,o,s,a,i,c){let l=`${n}/${e}@${t}`;if(i.has(l))return;i.add(l);let d=`${n}/${e}`,f=r.get(n,e,t),m;if(f)console.log(` ${l} (cached)`),m=await s.getPackageUrl(n,e,t);else{m=await s.getPackageUrl(n,e,t);let k=await a(m,n);if(!k.ok)throw new Error(`Failed to fetch ${m} (${k.status} ${k.statusText})`);f=await k.text(),r.put(n,e,t,f),console.log(` ${l}`)}let g={},b=o.parse(f);if(b.metadata.imports)for(let[k,y]of Object.entries(b.metadata.imports))for(let h of y){let w=await s.resolveVersion(k,h);w?(g[`${k}/${h.packageName}`]=w,await Tn(k,h.packageName,w,r,o,s,a,i,c)):console.error(` WARNING: Could not resolve ${k}/${h.packageName} ${h.package_}`)}c.packages[d]={version:t,resolved:m,integrity:eo(f),dependencies:g}}import{readFileSync as no}from"fs";import{resolve as to,dirname as ro}from"path";import{KanonakParser as oo}from"@kanonak-protocol/sdk";async function jn(n){let e=to(n),t=no(e,"utf-8"),r=new oo,o=r.parse(t),s=o.metadata.namespace_,a=s?`${s.publisher}/${s.package_}@${s.version}`:n;if(console.log(a),!o.metadata.imports){console.log(" (no imports)");return}let i=pe(ro(e)),c=await O(i,r),l=new Set;for(let[d,f]of Object.entries(o.metadata.imports))for(let m of f)await xn(d,m,c,l," ")}async function xn(n,e,t,r,o){let s=`${n}/${e.packageName}`;if(r.has(s)){console.log(`${o}${s} (${e.package_}) [circular]`);return}r.add(s);let a;try{a=await t.getHighestCompatibleVersionAsync(n,e)}catch{console.log(`${o}${s} (${e.package_}) [fetch failed]`);return}if(!a){console.log(`${o}${s} (${e.package_}) [not found]`);return}let i=a.metadata.namespace_?.version?.toString()??"?";if(console.log(`${o}${n}/${e.packageName}@${i}`),a.metadata.imports)for(let[c,l]of Object.entries(a.metadata.imports))for(let d of l)await xn(c,d,t,r,o+" ")}import{createHash as so,randomBytes as Ln}from"crypto";import{createServer as io}from"http";import{execFile as Ze}from"child_process";import{CredentialStore as co,generateDPoPKeyPair as lo,createDPoPProof as Un,serverSupportsDPoP as uo}from"@kanonak-protocol/sdk";import{normalizeHost as ao}from"@kanonak-protocol/sdk";var B=class{cache=new Map;async discover(e){let t=ao(e);if(this.cache.has(t))return this.cache.get(t);let r=`https://${t}/.well-known/oauth-authorization-server`,o=await this.tryEndpoint(r);if(!o){let s=`https://${t}/.well-known/openid-configuration`;o=await this.tryEndpoint(s)}return this.cache.set(t,o),o}async supportsOAuth(e){return await this.discover(e)!==null}static supportsPkceS256(e){return e.codeChallengeMethodsSupported?.some(t=>t.toUpperCase()==="S256")??!1}static supportsDynamicRegistration(e){return!!e.registrationEndpoint}static supportsAuthorizationCode(e){return e.responseTypesSupported?.some(t=>t.toLowerCase()==="code")??!1}async tryEndpoint(e){let t;try{t=await fetch(e)}catch(o){let s=o instanceof Error?o.message:String(o);return s.includes("ENOTFOUND")||s.includes("ECONNREFUSED")?(console.error(` OAuth discovery: ${e} \u2014 host unreachable (${s})`),console.error(" If the server is behind a VPN, ensure you are connected.")):s.includes("CERT")||s.includes("SSL")||s.includes("TLS")?(console.error(` OAuth discovery: ${e} \u2014 TLS error (${s})`),console.error(" If using a custom CA certificate, set NODE_EXTRA_CA_CERTS=/path/to/ca.pem")):console.error(` OAuth discovery: ${e} \u2014 network error: ${s}`),null}if(!t.ok)return t.status===404||(t.status===403?(console.error(` OAuth discovery: ${e} \u2014 HTTP 403 Forbidden`),console.error(" Access may be blocked by a firewall, proxy, or WAF.")):t.status>=500&&(console.error(` OAuth discovery: ${e} \u2014 HTTP ${t.status} server error`),console.error(" The authorization server returned an internal error. Contact your IDP administrator."))),null;let r;try{r=await t.json()}catch{return console.error(` OAuth discovery: ${e} \u2014 response is not valid JSON`),console.error(" The endpoint may be returning HTML instead of JSON. Check IDP configuration."),null}return{issuer:me(r.issuer),authorizationEndpoint:me(r.authorization_endpoint),tokenEndpoint:me(r.token_endpoint),registrationEndpoint:me(r.registration_endpoint),revocationEndpoint:me(r.revocation_endpoint),scopesSupported:te(r.scopes_supported),responseTypesSupported:te(r.response_types_supported),grantTypesSupported:te(r.grant_types_supported),codeChallengeMethodsSupported:te(r.code_challenge_methods_supported),tokenEndpointAuthMethodsSupported:te(r.token_endpoint_auth_methods_supported),dpopSigningAlgValuesSupported:te(r.dpop_signing_alg_values_supported)}}};function me(n){return typeof n=="string"?n:null}function te(n){return Array.isArray(n)?n.filter(e=>typeof e=="string"):null}var oe=class{discovery;credentialStore;constructor(e,t){this.discovery=e??new B,this.credentialStore=t??new co}async authorize(e,t=[]){console.log(`Starting OAuth flow for ${e}...`);let r=await this.discovery.discover(e);if(!r)return j(`No OAuth discovery endpoint found for '${e}'.
10
+ ${i.length} file(s) validated. ${c} error(s), ${l} warning(s).`),c>0&&process.exit(1)}import{KanonakParser as Wr,PublisherIndex as Gr,CredentialStore as Xr,createAuthenticatedFetch as Jr}from"@kanonak-protocol/sdk";import{loadLockFile as Yr,saveLockFile as Zr,computeIntegrity as Qr}from"@kanonak-protocol/sdk";function ne(n){if(!n)return null;let e=n.indexOf("/");if(e===-1)return null;let t=n.substring(0,e),r=n.substring(e+1);if(!t||!r)return null;let o,a=null,s=null,i=r.indexOf("@");if(i!==-1){o=r.substring(0,i);let c=r.substring(i+1),l=c.indexOf("/");l===-1?a=c||null:(a=c.substring(0,l)||null,s=c.substring(l+1)||null)}else{let c=r.indexOf("/");c===-1?o=r:(o=r.substring(0,c),s=r.substring(c+1)||null)}return!o||s&&s.includes("/")||a&&a.includes("@")?null:{publisher:t,packageName:o,version:a,instanceName:s}}async function In(n){let e=new U,t=new Wr,r=new Xr,o=Jr(r),a=new Gr({fetchFn:o}),s=Yr()??{version:"1",lastUpdated:new Date().toISOString(),packages:{}};if(!n){Object.keys(s.packages).length===0&&(console.error("No kanonak.lock file found or lock file is empty."),console.error("Usage: kanonak install {publisher}/{package}[@{version}]"),process.exit(1)),console.log(`Installing ${Object.keys(s.packages).length} package(s) from kanonak.lock...`);for(let[b,k]of Object.entries(s.packages)){let y=b.indexOf("/"),h=b.substring(0,y),w=b.substring(y+1),$=e.get(h,w,k.version);if($)console.log(` ${b}@${k.version} (cached)`);else{let v=k.resolved,K=await o(v,h);if(!K.ok)throw new Error(`Failed to fetch ${v} (${K.status} ${K.statusText})`);$=await K.text(),e.put(h,w,k.version,$),console.log(` ${b}@${k.version}`)}}console.log(`
11
+ Installed ${Object.keys(s.packages).length} package(s) from lock file.`);return}let i=ne(n);i||(console.error(`Invalid package reference: "${n}"`),console.error("Expected format: {publisher}/{package}[@{version}]"),process.exit(1));let{publisher:c,packageName:l,version:u,instanceName:f}=i;f&&(console.error(`\`kanonak install\` works on whole packages \u2014 got an instance suffix "/${f}".`),console.error(`Try: kanonak install ${c}/${l}${u?"@"+u:""}`),console.error("(Use `kanonak <capability> add` if you want to install one named instance.)"),process.exit(1));let p=u??await a.getHighestVersion(c,l);p||(console.error(`Could not resolve version for "${c}/${l}".`),console.error("Check the spelling, or run a search to see what the publisher offers."),process.exit(1)),console.log(`Installing ${c}/${l}@${p}...`);let g=new Set;await Tn(c,l,p,e,t,a,o,g,s),Zr(s),console.log(`
12
+ Installed ${g.size} package(s).`)}async function Tn(n,e,t,r,o,a,s,i,c){let l=`${n}/${e}@${t}`;if(i.has(l))return;i.add(l);let u=`${n}/${e}`,f=r.get(n,e,t),p;if(f)console.log(` ${l} (cached)`),p=await a.getPackageUrl(n,e,t);else{p=await a.getPackageUrl(n,e,t);let k=await s(p,n);if(!k.ok)throw new Error(`Failed to fetch ${p} (${k.status} ${k.statusText})`);f=await k.text(),r.put(n,e,t,f),console.log(` ${l}`)}let g={},b=o.parse(f);if(b.metadata.imports)for(let[k,y]of Object.entries(b.metadata.imports))for(let h of y){let w=await a.resolveVersion(k,h);w?(g[`${k}/${h.packageName}`]=w,await Tn(k,h.packageName,w,r,o,a,s,i,c)):console.error(` WARNING: Could not resolve ${k}/${h.packageName} ${h.package_}`)}c.packages[u]={version:t,resolved:p,integrity:Qr(f),dependencies:g}}import{readFileSync as eo}from"fs";import{resolve as no,dirname as to}from"path";import{KanonakParser as ro}from"@kanonak-protocol/sdk";async function jn(n){let e=no(n),t=eo(e,"utf-8"),r=new ro,o=r.parse(t),a=o.metadata.namespace_,s=a?`${a.publisher}/${a.package_}@${a.version}`:n;if(console.log(s),!o.metadata.imports){console.log(" (no imports)");return}let i=me(to(e)),c=await O(i,r),l=new Set;for(let[u,f]of Object.entries(o.metadata.imports))for(let p of f)await xn(u,p,c,l," ")}async function xn(n,e,t,r,o){let a=`${n}/${e.packageName}`;if(r.has(a)){console.log(`${o}${a} (${e.package_}) [circular]`);return}r.add(a);let s;try{s=await t.getHighestCompatibleVersionAsync(n,e)}catch{console.log(`${o}${a} (${e.package_}) [fetch failed]`);return}if(!s){console.log(`${o}${a} (${e.package_}) [not found]`);return}let i=s.metadata.namespace_?.version?.toString()??"?";if(console.log(`${o}${n}/${e.packageName}@${i}`),s.metadata.imports)for(let[c,l]of Object.entries(s.metadata.imports))for(let u of l)await xn(c,u,t,r,o+" ")}import{createHash as ao,randomBytes as Nn}from"crypto";import{createServer as so}from"http";import{execFile as Ze}from"child_process";import{CredentialStore as io,generateDPoPKeyPair as co,createDPoPProof as Un,serverSupportsDPoP as lo}from"@kanonak-protocol/sdk";import{normalizeHost as oo}from"@kanonak-protocol/sdk";var B=class{cache=new Map;async discover(e){let t=oo(e);if(this.cache.has(t))return this.cache.get(t);let r=`https://${t}/.well-known/oauth-authorization-server`,o=await this.tryEndpoint(r);if(!o){let a=`https://${t}/.well-known/openid-configuration`;o=await this.tryEndpoint(a)}return this.cache.set(t,o),o}async supportsOAuth(e){return await this.discover(e)!==null}static supportsPkceS256(e){return e.codeChallengeMethodsSupported?.some(t=>t.toUpperCase()==="S256")??!1}static supportsDynamicRegistration(e){return!!e.registrationEndpoint}static supportsAuthorizationCode(e){return e.responseTypesSupported?.some(t=>t.toLowerCase()==="code")??!1}async tryEndpoint(e){let t;try{t=await fetch(e)}catch(o){let a=o instanceof Error?o.message:String(o);return a.includes("ENOTFOUND")||a.includes("ECONNREFUSED")?(console.error(` OAuth discovery: ${e} \u2014 host unreachable (${a})`),console.error(" If the server is behind a VPN, ensure you are connected.")):a.includes("CERT")||a.includes("SSL")||a.includes("TLS")?(console.error(` OAuth discovery: ${e} \u2014 TLS error (${a})`),console.error(" If using a custom CA certificate, set NODE_EXTRA_CA_CERTS=/path/to/ca.pem")):console.error(` OAuth discovery: ${e} \u2014 network error: ${a}`),null}if(!t.ok)return t.status===404||(t.status===403?(console.error(` OAuth discovery: ${e} \u2014 HTTP 403 Forbidden`),console.error(" Access may be blocked by a firewall, proxy, or WAF.")):t.status>=500&&(console.error(` OAuth discovery: ${e} \u2014 HTTP ${t.status} server error`),console.error(" The authorization server returned an internal error. Contact your IDP administrator."))),null;let r;try{r=await t.json()}catch{return console.error(` OAuth discovery: ${e} \u2014 response is not valid JSON`),console.error(" The endpoint may be returning HTML instead of JSON. Check IDP configuration."),null}return{issuer:pe(r.issuer),authorizationEndpoint:pe(r.authorization_endpoint),tokenEndpoint:pe(r.token_endpoint),registrationEndpoint:pe(r.registration_endpoint),revocationEndpoint:pe(r.revocation_endpoint),scopesSupported:te(r.scopes_supported),responseTypesSupported:te(r.response_types_supported),grantTypesSupported:te(r.grant_types_supported),codeChallengeMethodsSupported:te(r.code_challenge_methods_supported),tokenEndpointAuthMethodsSupported:te(r.token_endpoint_auth_methods_supported),dpopSigningAlgValuesSupported:te(r.dpop_signing_alg_values_supported)}}};function pe(n){return typeof n=="string"?n:null}function te(n){return Array.isArray(n)?n.filter(e=>typeof e=="string"):null}var oe=class{discovery;credentialStore;constructor(e,t){this.discovery=e??new B,this.credentialStore=t??new io}async authorize(e,t=[]){console.log(`Starting OAuth flow for ${e}...`);let r=await this.discovery.discover(e);if(!r)return j(`No OAuth discovery endpoint found for '${e}'.
13
13
  The server must expose one of:
14
14
  - https://${e}/.well-known/oauth-authorization-server (RFC 8414)
15
15
  - https://${e}/.well-known/openid-configuration (OpenID Connect)
16
16
  Verify the hostname is correct and HTTPS is configured.
17
17
  If using a corporate proxy, ensure it is not blocking the discovery request.`);let o=[];if(r.authorizationEndpoint||o.push("authorization_endpoint"),r.tokenEndpoint||o.push("token_endpoint"),o.length>0)return j(`OAuth metadata for '${e}' is missing required fields: ${o.join(", ")}.
18
- Contact the IDP administrator to ensure these are included in the discovery document.`);let s=uo(r.dpopSigningAlgValuesSupported),a=null;if(s){console.log(" Server supports DPoP (RFC 9449) \u2014 generating key pair...");try{a=lo()}catch(K){return j(`Failed to generate DPoP key pair: ${re(K)}
19
- Ensure your Node.js installation supports EC P-256 curves.`)}}let{redirectUri:i,port:c,waitForCallback:l,close:d}=await ho(),f=await this.credentialStore.getCredential(e),m=f?.clientId??null,g=f?.clientSecret??null;if(!m&&r.registrationEndpoint){console.log(" Registering dynamic OAuth client (RFC 7591)...");let K=await this.registerClient(r.registrationEndpoint,i);if(!K.success)return d(),j(K.error);m=K.clientId,g=K.clientSecret??null}if(!m)return d(),j(`No OAuth client credentials for '${e}' and the server does not support dynamic client registration (no registration_endpoint in metadata).
18
+ Contact the IDP administrator to ensure these are included in the discovery document.`);let a=lo(r.dpopSigningAlgValuesSupported),s=null;if(a){console.log(" Server supports DPoP (RFC 9449) \u2014 generating key pair...");try{s=co()}catch(K){return j(`Failed to generate DPoP key pair: ${re(K)}
19
+ Ensure your Node.js installation supports EC P-256 curves.`)}}let{redirectUri:i,port:c,waitForCallback:l,close:u}=await yo(),f=await this.credentialStore.getCredential(e),p=f?.clientId??null,g=f?.clientSecret??null;if(!p&&r.registrationEndpoint){console.log(" Registering dynamic OAuth client (RFC 7591)...");let K=await this.registerClient(r.registrationEndpoint,i);if(!K.success)return u(),j(K.error);p=K.clientId,g=K.clientSecret??null}if(!p)return u(),j(`No OAuth client credentials for '${e}' and the server does not support dynamic client registration (no registration_endpoint in metadata).
20
20
  You must pre-register a client with your IDP and configure the client_id.
21
21
  Ask your IDP administrator to enable dynamic client registration (RFC 7591),
22
- or add a registration_endpoint to the OAuth metadata.`);let b=po(),k=mo(b),y=go(),h=ko(r.authorizationEndpoint,m,i,t,y,k);console.log(` Opening browser for authorization on port ${c}...`),console.log(" If the browser doesn't open, navigate to:"),console.log(` ${h}`),wo(h);let w=await l();if(d(),!w)return j(`Authorization timed out after 5 minutes.
22
+ or add a registration_endpoint to the OAuth metadata.`);let b=fo(),k=mo(b),y=po(),h=go(r.authorizationEndpoint,p,i,t,y,k);console.log(` Opening browser for authorization on port ${c}...`),console.log(" If the browser doesn't open, navigate to:"),console.log(` ${h}`),bo(h);let w=await l();if(u(),!w)return j(`Authorization timed out after 5 minutes.
23
23
  The browser authorization was not completed in time.
24
24
  Re-run 'kanonak login ${e}' and complete the browser authorization promptly.`);if(!w.code){let K=w.error?`: ${w.error}`:"";return j(`No authorization code received${K}.
25
25
  The IDP may have rejected the authorization request.
26
26
  Check the IDP admin console for error details.`)}if(w.state!==y)return j(`Authorization state mismatch \u2014 possible CSRF attack.
27
27
  The response did not match the expected session.
28
- Re-run 'kanonak login ${e}' to start a fresh authorization flow.`);console.log(" Exchanging authorization code for tokens...");let $=await this.exchangeCode(r.tokenEndpoint,m,g,w.code,i,b,a);if(!$.success)return j($.error);let v={clientId:m,clientSecret:g,accessToken:$.tokens.accessToken,refreshToken:$.tokens.refreshToken,expiresAt:$.tokens.expiresIn?new Date(Date.now()+$.tokens.expiresIn*1e3).toISOString():null,tokenEndpoint:r.tokenEndpoint,dpopKeyPair:a};return await this.credentialStore.store(e,v),console.log(` Successfully authenticated with ${e}`),s&&console.log(" DPoP proof-of-possession is active"),{success:!0,host:e}}async refresh(e){let t=await this.credentialStore.getCredential(e);if(!t)return j(`No stored credentials for '${e}'. Run 'kanonak login ${e}' to authenticate first.`);if(!t.refreshToken)return j(`No refresh token available for '${e}'.
28
+ Re-run 'kanonak login ${e}' to start a fresh authorization flow.`);console.log(" Exchanging authorization code for tokens...");let $=await this.exchangeCode(r.tokenEndpoint,p,g,w.code,i,b,s);if(!$.success)return j($.error);let v={clientId:p,clientSecret:g,accessToken:$.tokens.accessToken,refreshToken:$.tokens.refreshToken,expiresAt:$.tokens.expiresIn?new Date(Date.now()+$.tokens.expiresIn*1e3).toISOString():null,tokenEndpoint:r.tokenEndpoint,dpopKeyPair:s};return await this.credentialStore.store(e,v),console.log(` Successfully authenticated with ${e}`),a&&console.log(" DPoP proof-of-possession is active"),{success:!0,host:e}}async refresh(e){let t=await this.credentialStore.getCredential(e);if(!t)return j(`No stored credentials for '${e}'. Run 'kanonak login ${e}' to authenticate first.`);if(!t.refreshToken)return j(`No refresh token available for '${e}'.
29
29
  The authorization server may not issue refresh tokens for this client.
30
30
  Run 'kanonak login ${e}' to re-authenticate.`);if(!t.clientId)return j(`No client ID in stored credentials for '${e}'.
31
- The stored credential may be corrupted. Run 'kanonak logout ${e}' then 'kanonak login ${e}'.`);let r=t.tokenEndpoint;if(!r){let s=await this.discovery.discover(e);if(!s?.tokenEndpoint)return j(`Cannot find token endpoint for '${e}'.
31
+ The stored credential may be corrupted. Run 'kanonak logout ${e}' then 'kanonak login ${e}'.`);let r=t.tokenEndpoint;if(!r){let a=await this.discovery.discover(e);if(!a?.tokenEndpoint)return j(`Cannot find token endpoint for '${e}'.
32
32
  The OAuth discovery endpoint may be unreachable.
33
- Check network connectivity and run 'kanonak login ${e}' to re-authenticate.`);r=s.tokenEndpoint}let o=await this.refreshTokenRequest(r,t.clientId,t.clientSecret,t.refreshToken,t.dpopKeyPair);return o.success?(t.accessToken=o.tokens.accessToken,o.tokens.refreshToken&&(t.refreshToken=o.tokens.refreshToken),t.expiresAt=o.tokens.expiresIn?new Date(Date.now()+o.tokens.expiresIn*1e3).toISOString():null,t.tokenEndpoint=r,await this.credentialStore.store(e,t),{success:!0,host:e}):j(`${o.error}
33
+ Check network connectivity and run 'kanonak login ${e}' to re-authenticate.`);r=a.tokenEndpoint}let o=await this.refreshTokenRequest(r,t.clientId,t.clientSecret,t.refreshToken,t.dpopKeyPair);return o.success?(t.accessToken=o.tokens.accessToken,o.tokens.refreshToken&&(t.refreshToken=o.tokens.refreshToken),t.expiresAt=o.tokens.expiresIn?new Date(Date.now()+o.tokens.expiresIn*1e3).toISOString():null,t.tokenEndpoint=r,await this.credentialStore.store(e,t),{success:!0,host:e}):j(`${o.error}
34
34
  The refresh token may have expired. Run 'kanonak login ${e}' to re-authenticate.`)}async logout(e){let t=await this.credentialStore.getCredential(e);if(!t)return j(`No stored credentials for '${e}'.
35
- You may not be logged in, or credentials may be stored in a different backend.`);let r=await this.discovery.discover(e);if(r?.revocationEndpoint&&t.accessToken&&t.clientId)try{await this.revokeToken(r.revocationEndpoint,t.accessToken,t.clientId)}catch{console.warn(` Warning: Token revocation failed for '${e}'. The token has been removed locally but may still be valid on the server until it expires.`)}return await this.credentialStore.remove(e),{success:!0,host:e}}async registerClient(e,t){let r;try{r=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({client_name:"Kanonak CLI",redirect_uris:[t],grant_types:["authorization_code","refresh_token"],response_types:["code"],token_endpoint_auth_method:"none"})})}catch(a){return{success:!1,error:`Dynamic client registration request to ${e} failed: ${re(a)}
35
+ You may not be logged in, or credentials may be stored in a different backend.`);let r=await this.discovery.discover(e);if(r?.revocationEndpoint&&t.accessToken&&t.clientId)try{await this.revokeToken(r.revocationEndpoint,t.accessToken,t.clientId)}catch{console.warn(` Warning: Token revocation failed for '${e}'. The token has been removed locally but may still be valid on the server until it expires.`)}return await this.credentialStore.remove(e),{success:!0,host:e}}async registerClient(e,t){let r;try{r=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({client_name:"Kanonak CLI",redirect_uris:[t],grant_types:["authorization_code","refresh_token"],response_types:["code"],token_endpoint_auth_method:"none"})})}catch(s){return{success:!1,error:`Dynamic client registration request to ${e} failed: ${re(s)}
36
36
  Ensure the IDP is reachable and HTTPS is properly configured.
37
- If using a corporate proxy or custom CA, set NODE_EXTRA_CA_CERTS.`}}if(!r.ok){let a=await Qe(r);return{success:!1,error:`Dynamic client registration (RFC 7591) failed.
37
+ If using a corporate proxy or custom CA, set NODE_EXTRA_CA_CERTS.`}}if(!r.ok){let s=await Qe(r);return{success:!1,error:`Dynamic client registration (RFC 7591) failed.
38
38
  Endpoint: ${e}
39
- HTTP ${r.status}: ${a}
39
+ HTTP ${r.status}: ${s}
40
40
  The IDP may not support dynamic registration for public clients.
41
- Ask your IDP administrator to enable RFC 7591 support, or pre-register a client manually.`}}let o=await r.json(),s=o.client_id;return s?{success:!0,clientId:s,clientSecret:o.client_secret}:{success:!1,error:`Dynamic client registration response from ${e} did not contain a client_id.
42
- The IDP response may be malformed. Contact your IDP administrator.`}}async exchangeCode(e,t,r,o,s,a,i){let c=new URLSearchParams({grant_type:"authorization_code",client_id:t,code:o,redirect_uri:s,code_verifier:a});r&&c.set("client_secret",r);let l={"Content-Type":"application/x-www-form-urlencoded"};if(i)try{l.DPoP=Un(i.privateKey,i.publicKey,"POST",e)}catch(f){return{success:!1,error:`Failed to create DPoP proof for token exchange: ${re(f)}
43
- The stored key pair may be corrupted. Run 'kanonak login' to re-authenticate.`}}let d;try{d=await fetch(e,{method:"POST",headers:l,body:c.toString()})}catch(f){return{success:!1,error:`Token exchange request to ${e} failed: ${re(f)}
44
- Ensure the token endpoint is reachable.`}}if(!d.ok){let f=await Qe(d),m=fo(f);return{success:!1,error:`Token exchange failed.
41
+ Ask your IDP administrator to enable RFC 7591 support, or pre-register a client manually.`}}let o=await r.json(),a=o.client_id;return a?{success:!0,clientId:a,clientSecret:o.client_secret}:{success:!1,error:`Dynamic client registration response from ${e} did not contain a client_id.
42
+ The IDP response may be malformed. Contact your IDP administrator.`}}async exchangeCode(e,t,r,o,a,s,i){let c=new URLSearchParams({grant_type:"authorization_code",client_id:t,code:o,redirect_uri:a,code_verifier:s});r&&c.set("client_secret",r);let l={"Content-Type":"application/x-www-form-urlencoded"};if(i)try{l.DPoP=Un(i.privateKey,i.publicKey,"POST",e)}catch(f){return{success:!1,error:`Failed to create DPoP proof for token exchange: ${re(f)}
43
+ The stored key pair may be corrupted. Run 'kanonak login' to re-authenticate.`}}let u;try{u=await fetch(e,{method:"POST",headers:l,body:c.toString()})}catch(f){return{success:!1,error:`Token exchange request to ${e} failed: ${re(f)}
44
+ Ensure the token endpoint is reachable.`}}if(!u.ok){let f=await Qe(u),p=uo(f);return{success:!1,error:`Token exchange failed.
45
45
  Endpoint: ${e}
46
- HTTP ${d.status}: ${f}`+(m?`
47
- ${m}`:"")}}return{success:!0,tokens:On(await d.json())}}async refreshTokenRequest(e,t,r,o,s){let a=new URLSearchParams({grant_type:"refresh_token",client_id:t,refresh_token:o});r&&a.set("client_secret",r);let i={"Content-Type":"application/x-www-form-urlencoded"};if(s)try{i.DPoP=Un(s.privateKey,s.publicKey,"POST",e)}catch(l){return{success:!1,error:`Failed to create DPoP proof for token refresh: ${re(l)}`}}let c;try{c=await fetch(e,{method:"POST",headers:i,body:a.toString()})}catch(l){return{success:!1,error:`Token refresh request to ${e} failed: ${re(l)}`}}if(!c.ok){let l=await Qe(c);return{success:!1,error:`Token refresh failed \u2014 HTTP ${c.status}: ${l}`}}return{success:!0,tokens:On(await c.json())}}async revokeToken(e,t,r){await fetch(e,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({token:t,client_id:r}).toString()})}};function j(n){return{success:!1,error:n}}function On(n){return{accessToken:n.access_token,refreshToken:n.refresh_token,expiresIn:typeof n.expires_in=="number"?n.expires_in:void 0}}function re(n){return n instanceof Error?n.message:String(n)}async function Qe(n){try{return await n.text()}catch{return"(could not read response body)"}}function fo(n){try{let e=JSON.parse(n);switch(e.error){case"invalid_grant":return"Hint: The authorization code may have expired or already been used. Re-run the login flow.";case"invalid_client":return"Hint: The client credentials were rejected. The client_id may be invalid or the client_secret may be wrong.";case"redirect_uri_mismatch":return"Hint: The redirect_uri does not match what was registered with the IDP.";case"unsupported_grant_type":return"Hint: The IDP does not support authorization_code grants. Contact your IDP administrator.";case"invalid_scope":return"Hint: One or more requested scopes are not allowed. Check the scopes configured on the IDP.";case"use_dpop_nonce":return"Hint: The server requires a DPoP nonce. This should be handled automatically \u2014 please report this as a bug.";default:return e.error_description?`IDP says: ${e.error_description}`:null}}catch{return null}}function po(){return Ln(32).toString("base64url")}function mo(n){return so("sha256").update(n).digest("base64url")}function go(){return Ln(16).toString("base64url")}function ko(n,e,t,r,o,s){let a=new URLSearchParams({client_id:e,response_type:"code",redirect_uri:t,scope:r.join(" "),state:o,code_challenge:s,code_challenge_method:"S256"});return`${n}?${a}`}var yo=300*1e3;async function ho(){return new Promise(n=>{let e=io((o,s)=>{let a=new URL(o.url,"http://localhost"),i=a.searchParams.get("code")??void 0,c=a.searchParams.get("state")??void 0,l=a.searchParams.get("error")??a.searchParams.get("error_description")??void 0,d=l?bo(l):null,f=d?`<html><body><h1>Authorization failed</h1><p>${d}</p></body></html>`:"<html><body><h1>Authorization successful!</h1><p>You can close this window.</p></body></html>";s.writeHead(200,{"Content-Type":"text/html"}),s.end(f),t({code:i,state:c,error:l})}),t,r=new Promise(o=>{t=o,setTimeout(()=>{o(null),e.close()},yo)});e.listen(0,"127.0.0.1",()=>{let o=e.address();n({redirectUri:`http://localhost:${o.port}/callback`,port:o.port,waitForCallback:()=>r,close:()=>e.close()})})})}function bo(n){return n.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")}function wo(n){try{process.platform==="win32"?Ze("cmd",["/c","start","",n]):process.platform==="darwin"?Ze("open",[n]):Ze("xdg-open",[n])}catch{console.log(" Could not open browser automatically. Please navigate to the URL above manually.")}}import{CredentialStore as $o}from"@kanonak-protocol/sdk";async function Nn(n){try{let e=new B,t=new $o,o=await new oe(e,t).authorize(n);o.success?console.log(`
46
+ HTTP ${u.status}: ${f}`+(p?`
47
+ ${p}`:"")}}return{success:!0,tokens:On(await u.json())}}async refreshTokenRequest(e,t,r,o,a){let s=new URLSearchParams({grant_type:"refresh_token",client_id:t,refresh_token:o});r&&s.set("client_secret",r);let i={"Content-Type":"application/x-www-form-urlencoded"};if(a)try{i.DPoP=Un(a.privateKey,a.publicKey,"POST",e)}catch(l){return{success:!1,error:`Failed to create DPoP proof for token refresh: ${re(l)}`}}let c;try{c=await fetch(e,{method:"POST",headers:i,body:s.toString()})}catch(l){return{success:!1,error:`Token refresh request to ${e} failed: ${re(l)}`}}if(!c.ok){let l=await Qe(c);return{success:!1,error:`Token refresh failed \u2014 HTTP ${c.status}: ${l}`}}return{success:!0,tokens:On(await c.json())}}async revokeToken(e,t,r){await fetch(e,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({token:t,client_id:r}).toString()})}};function j(n){return{success:!1,error:n}}function On(n){return{accessToken:n.access_token,refreshToken:n.refresh_token,expiresIn:typeof n.expires_in=="number"?n.expires_in:void 0}}function re(n){return n instanceof Error?n.message:String(n)}async function Qe(n){try{return await n.text()}catch{return"(could not read response body)"}}function uo(n){try{let e=JSON.parse(n);switch(e.error){case"invalid_grant":return"Hint: The authorization code may have expired or already been used. Re-run the login flow.";case"invalid_client":return"Hint: The client credentials were rejected. The client_id may be invalid or the client_secret may be wrong.";case"redirect_uri_mismatch":return"Hint: The redirect_uri does not match what was registered with the IDP.";case"unsupported_grant_type":return"Hint: The IDP does not support authorization_code grants. Contact your IDP administrator.";case"invalid_scope":return"Hint: One or more requested scopes are not allowed. Check the scopes configured on the IDP.";case"use_dpop_nonce":return"Hint: The server requires a DPoP nonce. This should be handled automatically \u2014 please report this as a bug.";default:return e.error_description?`IDP says: ${e.error_description}`:null}}catch{return null}}function fo(){return Nn(32).toString("base64url")}function mo(n){return ao("sha256").update(n).digest("base64url")}function po(){return Nn(16).toString("base64url")}function go(n,e,t,r,o,a){let s=new URLSearchParams({client_id:e,response_type:"code",redirect_uri:t,scope:r.join(" "),state:o,code_challenge:a,code_challenge_method:"S256"});return`${n}?${s}`}var ko=300*1e3;async function yo(){return new Promise(n=>{let e=so((o,a)=>{let s=new URL(o.url,"http://localhost"),i=s.searchParams.get("code")??void 0,c=s.searchParams.get("state")??void 0,l=s.searchParams.get("error")??s.searchParams.get("error_description")??void 0,u=l?ho(l):null,f=u?`<html><body><h1>Authorization failed</h1><p>${u}</p></body></html>`:"<html><body><h1>Authorization successful!</h1><p>You can close this window.</p></body></html>";a.writeHead(200,{"Content-Type":"text/html"}),a.end(f),t({code:i,state:c,error:l})}),t,r=new Promise(o=>{t=o,setTimeout(()=>{o(null),e.close()},ko)});e.listen(0,"127.0.0.1",()=>{let o=e.address();n({redirectUri:`http://localhost:${o.port}/callback`,port:o.port,waitForCallback:()=>r,close:()=>e.close()})})})}function ho(n){return n.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")}function bo(n){try{process.platform==="win32"?Ze("cmd",["/c","start","",n]):process.platform==="darwin"?Ze("open",[n]):Ze("xdg-open",[n])}catch{console.log(" Could not open browser automatically. Please navigate to the URL above manually.")}}import{CredentialStore as wo}from"@kanonak-protocol/sdk";async function Ln(n){try{let e=new B,t=new wo,o=await new oe(e,t).authorize(n);o.success?console.log(`
48
48
  Authenticated with ${n}.`):(console.error(`
49
49
  Authentication failed:
50
50
  ${o.error}`),process.exit(1))}catch(e){let t=e instanceof Error?e.message:String(e);console.error(`
51
51
  Authentication failed unexpectedly:
52
52
  ${t}`),console.error(`
53
- If this persists, see https://github.com/kanonak-protocol for support channels.`),process.exit(1)}}import{CredentialStore as So}from"@kanonak-protocol/sdk";async function Vn(n){try{let e=new B,t=new So,o=await new oe(e,t).logout(n);o.success?console.log(`Logged out from ${n}.`):(console.error(`
53
+ If this persists, see https://github.com/kanonak-protocol for support channels.`),process.exit(1)}}import{CredentialStore as $o}from"@kanonak-protocol/sdk";async function Vn(n){try{let e=new B,t=new $o,o=await new oe(e,t).logout(n);o.success?console.log(`Logged out from ${n}.`):(console.error(`
54
54
  Logout failed:
55
55
  ${o.error}`),process.exit(1))}catch(e){let t=e instanceof Error?e.message:String(e);console.error(`
56
56
  Logout failed unexpectedly:
57
- ${t}`),process.exit(1)}}import{Command as Zo}from"commander";import{KanonakParser as Qo,KanonakObjectParser as ea,PublisherIndex as na,CredentialStore as ta,createAuthenticatedFetch as ra,computeIntegrity as oa}from"@kanonak-protocol/sdk";import{readFileSync as vo,writeFileSync as Po,existsSync as Ko}from"fs";import{join as Do}from"path";import Fn from"js-yaml";import{getGlobalCachePath as Eo}from"@kanonak-protocol/sdk";var Co=`# This file is generated by Kanonak CLI. Do not edit manually.
58
- `;function Bn(){let n=Eo();return Do(n,"..","capabilities.lock")}function ae(){let n=Bn();if(!Ko(n))return{version:"1",lastUpdated:new Date().toISOString(),capabilities:{}};let e=vo(n,"utf-8"),t=Fn.load(e);return!t||typeof t!="object"||t.version!=="1"?{version:"1",lastUpdated:new Date().toISOString(),capabilities:{}}:{version:"1",lastUpdated:t.lastUpdated??new Date().toISOString(),capabilities:t.capabilities??{}}}function ge(n){n.lastUpdated=new Date().toISOString();let e={};for(let r of Object.keys(n.capabilities).sort())e[r]=n.capabilities[r];n.capabilities=e;let t=Fn.dump(n,{lineWidth:-1,sortKeys:!1,quotingType:'"'});Po(Bn(),Co+t,"utf-8")}var E=class{constructor(e,t){this.doc=e;this.broader=t}doc;broader;async getAllDocumentsAsync(){return[this.doc]}async getDocumentAsync(e){return this.broader.getDocumentAsync(e)}async getDocumentsByNamespaceAsync(e,t){return this.broader.getDocumentsByNamespaceAsync(e,t)}async getHighestCompatibleVersionAsync(e,t){return this.broader.getHighestCompatibleVersionAsync(e,t)}async saveDocumentAsync(){throw new Error("SingleDocumentRepository is read-only")}async deleteDocumentAsync(){throw new Error("SingleDocumentRepository is read-only")}async clearNamespaceAsync(){throw new Error("SingleDocumentRepository is read-only")}async getAllDocumentReferencesAsync(){return[]}async getDocumentContentAsync(e){return this.broader.getDocumentContentAsync(e)}async getDocumentUriAsync(e){return this.broader.getDocumentUriAsync(e)}};import{existsSync as xo,readdirSync as Uo,readFileSync as Oo}from"fs";import{join as qn}from"path";import{KanonakObjectParser as Lo,EmbeddedKanonak as Xn,ReferenceKanonak as Jn,getGlobalCachePath as No}from"@kanonak-protocol/sdk";import{SubjectKanonak as Mn,DefinedKanonak as Ao,StringStatement as _o,NumberStatement as Ro,BooleanStatement as Io,ReferenceStatement as Hn,EmbeddedStatement as el,ListStatement as To}from"@kanonak-protocol/sdk";function L(n){return`${n.publisher}/${n.package_}/${n.name}`}function T(n,e){return n.publisher===e.publisher&&n.package_===e.package_&&n.name===e.name}function P(n,e){if(!(n instanceof Ao))return!1;for(let t of n.statement)if(t.predicate?.subject?.name==="type"&&t instanceof Hn){let o=t.object;if(T(o.subject,e))return!0}return!1}function A(n,e){let t=[];for(let r of n)r instanceof Mn&&P(r,e)&&t.push(r);return t}function Ke(n,e){for(let t of n){if(!(t instanceof Mn)||t.name!==e.name)continue;if((t.namespace||"").startsWith(`${e.publisher}/${e.package_}@`))return t}}function en(n,e){for(let t of n.statement){let r=t.predicate;if(r?.subject&&T(r.subject,e))return t}}function jo(n,e){let t=en(n,e);if(t&&(t instanceof _o||t instanceof Ro||t instanceof Io))return t.object}function _(n,e){let t=jo(n,e);return typeof t=="string"?t:void 0}function se(n,e){let t=en(n,e);if(t instanceof Hn)return t.object.subject}function nn(n,e){let t=en(n,e);return t instanceof To?t.object??[]:[]}var R="kanonak.org",I="capabilities",tn={publisher:R,package_:I,name:"Capability"},Vo={publisher:R,package_:I,name:"commandName"},Yn={publisher:R,package_:I,name:"description"},Fo={publisher:R,package_:I,name:"managesType"},Bo={publisher:R,package_:I,name:"deploymentTarget"},Mo={publisher:R,package_:I,name:"hasCommand"},Ho={publisher:R,package_:I,name:"subcommandName"},qo={publisher:R,package_:I,name:"performs"},zo={publisher:R,package_:I,name:"hasArgument"},Wo={publisher:R,package_:I,name:"argumentName"},zn={publisher:R,package_:I,name:"isRequired"},Wn={publisher:R,package_:I,name:"isOption"},Go={publisher:R,package_:I,name:"defaultValue"};async function Zn(n,e,t){let r=ae(),o=new Lo,s=[],a=!1;for(let[i,c]of Object.entries(r.capabilities)){let l=c,d=n.get(l.publisher,l.package_,l.version);if(!d){let f=await Xo(i,l,e,o,t);if(f)console.error(` Healed capability "${i}": ${l.publisher}/${l.package_}@${l.version} \u2192 ${f.entry.publisher}/${f.entry.package_}@${f.entry.version} (package was renamed)`),r.capabilities[i]=f.entry,l=f.entry,d=f.content,a=!0;else{console.error(` WARNING: Cached content missing for capability "${i}" (${l.publisher}/${l.package_}@${l.version}). Reinstall it with: kanonak capability remove ${i} && kanonak capability add ${l.publisher}/${l.package_}`);continue}}try{let f=e.parse(d),m=new E(f,t),g=await o.parseKanonaks(m),b=Qn(g,l.publisher,l.package_,l.version);b?s.push(b):console.error(` WARNING: No Capability instance found in "${i}" (${l.publisher}/${l.package_}@${l.version})`)}catch(f){console.error(` WARNING: Failed to parse capability "${i}": ${f}`)}}return a&&ge(r),s}async function Xo(n,e,t,r,o){let s=qn(No(),e.publisher);if(!xo(s))return;let a=[];for(let i of Uo(s)){if(!i.endsWith(".kan.yml"))continue;let c=i.slice(0,-8),l=c.lastIndexOf("@");if(l===-1)continue;let d=c.substring(0,l),f=c.substring(l+1);if(d===e.package_&&f===e.version)continue;let m;try{m=Oo(qn(s,i),"utf-8")}catch{continue}let g;try{let b=t.parse(m),k=new E(b,o),y=await r.parseKanonaks(k);g=Qn(y,e.publisher,d,f)?.commandName}catch{continue}g===n&&a.push({entry:{publisher:e.publisher,package_:d,version:f,resolved:`kanonak://${e.publisher}/${d}@${f}`,integrity:""},content:m})}if(a.length===1)return a[0]}function Qn(n,e,t,r){let o=A(n,tn);if(o.length===0)return;let s=o[0],a=_(s,Vo)??"",i=_(s,Yn)??"",c=se(s,Fo),l=se(s,Bo),d=[];for(let f of nn(s,Mo)){let m=Jo(f,n);m&&d.push(m)}return{commandName:a,description:i,managesTypeKey:c?L(c):"",deploymentTargetKey:l?L(l):"",commands:d,publisher:e,package_:t,version:r}}function Jo(n,e){let t;if(n instanceof Xn)t=n;else if(n instanceof Jn){let c=et(e,n.subject.publisher,n.subject.package_,n.subject.name);c&&(t=c)}if(!t)return;let r=_(t,Ho)??"",o=_(t,Yn)??"",s=se(t,qo),a=nn(t,zo),i=[];for(let c of a){let l=Yo(c,e);l&&i.push(l)}return{subcommandName:r,description:o,arguments:i,actionKey:s?L(s):""}}function Yo(n,e){let t;if(n instanceof Xn)t=n;else if(n instanceof Jn){let c=et(e,n.subject.publisher,n.subject.package_,n.subject.name);c&&(t=c)}if(!t)return;let r=_(t,Wo)??"",o=_(t,zn)==="true"||Gn(t,zn)===!0,s=_(t,Wn)==="true"||Gn(t,Wn)===!0,a=_(t,Go),i={argumentName:r,required:o,isOption:s};return a!==void 0&&(i.defaultValue=a),i}function Gn(n,e){for(let t of n.statement){let r=t,o=r.predicate;if(o?.subject&&o.subject.publisher===e.publisher&&o.subject.package_===e.package_&&o.subject.name===e.name)return typeof r.object=="boolean"?r.object:void 0}}function et(n,e,t,r){for(let o of n){if(!("name"in o)||!("namespace"in o))continue;let s=o;if(s.name===r&&!(!s.namespace||typeof s.namespace!="string")&&s.namespace.startsWith(`${e}/${t}@`))return o}}var aa={publisher:R,package_:I,name:"commandName"};function nt(){let n=new Zo("capability").description("Manage Kanonak CLI capabilities (pluggable command groups)");return n.command("add <package>").description("Install a capability from a Kanonak publisher").action(async e=>{await sa(e)}),n.command("remove <name>").description("Remove an installed capability").action(async e=>{await ia(e)}),n.command("list").description("List installed capabilities").action(async()=>{await ca()}),n}async function sa(n){let e=ne(n);e||(console.error(`Invalid package reference: "${n}"`),console.error("Expected format: {publisher}/{package}[@{version}]"),process.exit(1));let{publisher:t,packageName:r,version:o,instanceName:s}=e;s&&(console.error(`\`kanonak capability add\` installs whole packages \u2014 got an instance suffix "/${s}".`),console.error(`Try: kanonak capability add ${t}/${r}${o?"@"+o:""}`),process.exit(1));let a=new U,i=new Qo,c=new ea,l=new ta,d=ra(l),f=new na({fetchFn:d}),m=o??await f.getHighestVersion(t,r);m||(console.error(`Could not resolve version for "${t}/${r}".`),process.exit(1)),console.log(`Installing capability ${t}/${r}@${m}...`);let g=a.get(t,r,m);if(!g){let F=await f.getPackageUrl(t,r,m),ve=await d(F,t);if(!ve.ok)throw new Error(`Failed to fetch ${F} (${ve.status} ${ve.statusText})`);g=await ve.text(),a.put(t,r,m,g)}let b=i.parse(g),k=await O(process.cwd(),i),y=new E(b,k),h=await c.parseKanonaks(y),w=A(h,tn);w.length===0&&(console.error(`Package ${t}/${r}@${m} does not contain a ${R}/${I}/Capability instance.`),process.exit(1));let $=w[0],v=_($,aa);v||(console.error(`Capability instance in ${t}/${r}@${m} has no commandName property.`),process.exit(1));let K=ae();K.capabilities[v]={publisher:t,package_:r,version:m,resolved:await f.getPackageUrl(t,r,m),integrity:oa(g)},ge(K),console.log(`
59
- Installed capability "${v}".`),console.log(`Run "kanonak ${v} --help" to get started.`)}async function ia(n){let e=ae();e.capabilities[n]||(console.error(`Capability "${n}" is not installed.`),process.exit(1));let t=e.capabilities[n];delete e.capabilities[n],ge(e),console.log(`Removed capability "${n}" (${t.publisher}/${t.package_}@${t.version}).`)}async function ca(){let n=ae(),e=Object.entries(n.capabilities);if(e.length===0){console.log("No capabilities installed."),console.log("Install one with: kanonak capability add {publisher}/{package}");return}console.log(`Installed capabilities:
60
- `);for(let[t,r]of e)console.log(` ${t} ${r.publisher}/${r.package_}@${r.version}`)}import{Command as $e}from"commander";import{readFileSync as us,writeFileSync as ds,mkdirSync as fs,existsSync as Ft,statSync as ps}from"fs";import{join as ms,resolve as gs}from"path";import{KanonakParser as gn,KanonakObjectParser as kn,SubjectKanonak as ks,Reasoner as ys,KanonakVocabulary as hs,makeUriKey as Mt,pickHighestDocument as yn,formatVersion as Ht}from"@kanonak-protocol/sdk";var la="kanonak.org",ua="transformations";var p=n=>({publisher:la,package_:ua,name:n}),u={Transformation:p("Transformation"),InstanceTransformation:p("InstanceTransformation"),SetTransformation:p("SetTransformation"),inputPattern:p("inputPattern"),rule:p("rule"),artifactName:p("artifactName"),outputs:p("outputs"),formatOverrides:p("formatOverrides"),partitionBy:p("partitionBy"),InputPattern:p("InputPattern"),matchesClass:p("matchesClass"),requires:p("requires"),sortBy:p("sortBy"),SortKey:p("SortKey"),byProperty:p("byProperty"),order:p("order"),SortOrder:p("SortOrder"),ascending:p("ascending"),descending:p("descending"),OutputFormat:p("OutputFormat"),backendUri:p("backendUri"),FormatOverride:p("FormatOverride"),formatTarget:p("formatTarget"),metadataKeys:p("metadataKeys"),metadataRenames:p("metadataRenames"),trailingNewline:p("trailingNewline"),RenameEntry:p("RenameEntry"),fromKey:p("fromKey"),toKey:p("toKey"),FMT_MARKDOWN_FRONTMATTER:p("markdown-with-frontmatter"),FMT_PLAIN_MARKDOWN:p("plain-markdown"),FMT_TOML:p("toml"),FMT_JSON:p("json"),FMT_HTML:p("html"),FMT_SVG:p("svg"),Expression:p("Expression"),ListSourcedExpression:p("ListSourcedExpression"),ListAggregate:p("ListAggregate"),IteratingExpression:p("IteratingExpression"),BuildAstNode:p("BuildAstNode"),astClass:p("astClass"),set:p("set"),AstFieldBinding:p("AstFieldBinding"),field:p("field"),bindValue:p("bindValue"),When:p("When"),condition:p("condition"),thenBuild:p("thenBuild"),elseBuild:p("elseBuild"),Concat:p("Concat"),parts:p("parts"),Fallback:p("Fallback"),primary:p("primary"),alternate:p("alternate"),StringLiteral:p("StringLiteral"),stringLiteral:p("stringLiteral"),IntegerLiteral:p("IntegerLiteral"),integerLiteral:p("integerLiteral"),DecimalLiteral:p("DecimalLiteral"),decimalLiteral:p("decimalLiteral"),BooleanLiteral:p("BooleanLiteral"),booleanLiteral:p("booleanLiteral"),VarRef:p("VarRef"),varName:p("varName"),PropertyRead:p("PropertyRead"),readSource:p("readSource"),readProp:p("readProp"),Traverse:p("Traverse"),traverseSource:p("traverseSource"),through:p("through"),step:p("step"),UriName:p("UriName"),uriNameOf:p("uriNameOf"),UriPublisher:p("UriPublisher"),uriPublisherOf:p("uriPublisherOf"),UriPackage:p("UriPackage"),uriPackageOf:p("uriPackageOf"),UriVersion:p("UriVersion"),uriVersionOf:p("uriVersionOf"),SubjectUri:p("SubjectUri"),subjectOf:p("subjectOf"),UriLiteral:p("UriLiteral"),refTo:p("refTo"),DisplayLabel:p("DisplayLabel"),labelTarget:p("labelTarget"),labelSource:p("labelSource"),ResolveRef:p("ResolveRef"),resolveSource:p("resolveSource"),Normalize:p("Normalize"),normSource:p("normSource"),normKind:p("normKind"),NormalizeKind:p("NormalizeKind"),NORM_TRIM_END:p("trim-end"),IsSet:p("IsSet"),checkExpr:p("checkExpr"),ExpressionFragment:p("ExpressionFragment"),body:p("body"),CallFragment:p("CallFragment"),fragmentRef:p("fragmentRef"),source:p("source"),Join:p("Join"),separator:p("separator"),Count:p("Count"),Sum:p("Sum"),Min:p("Min"),Max:p("Max"),Average:p("Average"),loopVar:p("loopVar"),ForEach:p("ForEach"),emit:p("emit"),ListMap:p("ListMap"),mapBody:p("mapBody"),Filter:p("Filter"),predicate:p("predicate"),PartitionBy:p("PartitionBy"),partitionKey:p("partitionKey"),DistinctBy:p("DistinctBy"),distinctKey:p("distinctKey"),Partition:p("Partition"),key:p("key"),members:p("members")};import{DefinedKanonak as Tt,ReferenceKanonak as jt,StringStatement as xt,NumberStatement as Ut,BooleanStatement as Ot,ReferenceStatement as Lt,ListStatement as Nt}from"@kanonak-protocol/sdk";var da="kanonak.org",fa="document-ast",S=n=>({publisher:da,package_:fa,name:n}),N={Document:S("Document"),Block:S("Block"),Inline:S("Inline"),StructuredValue:S("StructuredValue"),Heading:S("Heading"),Paragraph:S("Paragraph"),RawBlock:S("RawBlock"),Text:S("Text"),StructuredMap:S("StructuredMap"),StructuredEntry:S("StructuredEntry"),StructuredList:S("StructuredList"),StringScalar:S("StringScalar"),IntegerScalar:S("IntegerScalar"),EscapeHint:S("EscapeHint"),MediaType:S("MediaType"),metadata:S("metadata"),children:S("children"),level:S("level"),inlines:S("inlines"),text:S("text"),entries:S("entries"),key:S("key"),value:S("value"),escapeHint:S("escapeHint"),items:S("items"),stringValue:S("stringValue"),integerValue:S("integerValue"),rawContent:S("rawContent"),mediaType:S("mediaType"),mimeType:S("mimeType"),ESC_RAW:S("esc-raw"),ESC_YAML_SAFE:S("esc-yaml-safe"),ESC_TOML_STRING:S("esc-toml-string"),ESC_TOML_MULTILINE:S("esc-toml-multiline"),ESC_JSON:S("esc-json"),TEXT_PLAIN:S("text-plain"),TEXT_MARKDOWN:S("text-markdown"),TEXT_HTML:S("text-html"),APPLICATION_JSON:S("application-json"),TEXT_YAML:S("text-yaml"),IMAGE_SVG_XML:S("image-svg-xml")};function tt(n,e){return n.publisher===e.publisher&&n.package_===e.package_&&n.name===e.name}var Ee=class{backendUri="kanonak.org/transformations/markdown-with-frontmatter";render(e,t){let r=pa(e.metadata,t),o=ka(e.children),a=["---",...r,"---","",o].join(`
61
- `);return t?.trailingNewline&&(a.endsWith(`
62
- `)||(a+=`
63
- `)),a}};function pa(n,e){if(!n)return[];let t=new Map;for(let i of n.entries)t.set(De(i.key),i);let r=new Map;if(e?.metadataRenames)for(let[i,c]of e.metadataRenames)r.set(De(i),c);let s=(e?.metadataKeys??n.entries.map(i=>i.key)).map(De),a=[];for(let i of s){let c=t.get(i);if(!c)continue;let l=r.get(i),d=De(l??i),f=ot(c.value,c.escapeHint);f!==void 0&&a.push(`${d}: ${f}`)}return a}function De(n){let e=n.lastIndexOf(".");return e===-1?n:n.substring(e+1)||n}function ot(n,e){switch(n.kind){case"StringScalar":return ma(n.stringValue,e);case"IntegerScalar":return String(n.integerValue);case"StructuredList":{let t=[];for(let r of n.items){let o=ot(r,e);o!==void 0&&t.push(o)}return t.join(", ")}case"StructuredMap":return;default:return}}function ma(n,e){return!e||tt(e,N.ESC_RAW)?n:tt(e,N.ESC_YAML_SAFE)?ga(n):n}function ga(n){return n.includes(`
57
+ ${t}`),process.exit(1)}}import{Command as Yo}from"commander";import{KanonakParser as Zo,KanonakObjectParser as Qo,PublisherIndex as ea,CredentialStore as na,createAuthenticatedFetch as ta,computeIntegrity as ra}from"@kanonak-protocol/sdk";import{readFileSync as So,writeFileSync as vo,existsSync as Po}from"fs";import{join as Ko}from"path";import Fn from"js-yaml";import{getGlobalCachePath as Do}from"@kanonak-protocol/sdk";var Eo=`# This file is generated by Kanonak CLI. Do not edit manually.
58
+ `;function Bn(){let n=Do();return Ko(n,"..","capabilities.lock")}function ae(){let n=Bn();if(!Po(n))return{version:"1",lastUpdated:new Date().toISOString(),capabilities:{}};let e=So(n,"utf-8"),t=Fn.load(e);return!t||typeof t!="object"||t.version!=="1"?{version:"1",lastUpdated:new Date().toISOString(),capabilities:{}}:{version:"1",lastUpdated:t.lastUpdated??new Date().toISOString(),capabilities:t.capabilities??{}}}function ge(n){n.lastUpdated=new Date().toISOString();let e={};for(let r of Object.keys(n.capabilities).sort())e[r]=n.capabilities[r];n.capabilities=e;let t=Fn.dump(n,{lineWidth:-1,sortKeys:!1,quotingType:'"'});vo(Bn(),Eo+t,"utf-8")}var E=class{constructor(e,t){this.doc=e;this.broader=t}doc;broader;async getAllDocumentsAsync(){return[this.doc]}async getDocumentAsync(e){return this.broader.getDocumentAsync(e)}async getDocumentsByNamespaceAsync(e,t){return this.broader.getDocumentsByNamespaceAsync(e,t)}async getHighestCompatibleVersionAsync(e,t){return this.broader.getHighestCompatibleVersionAsync(e,t)}async saveDocumentAsync(){throw new Error("SingleDocumentRepository is read-only")}async deleteDocumentAsync(){throw new Error("SingleDocumentRepository is read-only")}async clearNamespaceAsync(){throw new Error("SingleDocumentRepository is read-only")}async getAllDocumentReferencesAsync(){return[]}async getDocumentContentAsync(e){return this.broader.getDocumentContentAsync(e)}async getDocumentUriAsync(e){return this.broader.getDocumentUriAsync(e)}};import{existsSync as jo,readdirSync as xo,readFileSync as Uo}from"fs";import{join as qn}from"path";import{KanonakObjectParser as Oo,EmbeddedKanonak as Xn,ReferenceKanonak as Jn,getGlobalCachePath as No}from"@kanonak-protocol/sdk";import{SubjectKanonak as Mn,DefinedKanonak as Co,StringStatement as Ao,NumberStatement as _o,BooleanStatement as Ro,ReferenceStatement as Hn,EmbeddedStatement as el,ListStatement as Io}from"@kanonak-protocol/sdk";function N(n){return`${n.publisher}/${n.package_}/${n.name}`}function T(n,e){return n.publisher===e.publisher&&n.package_===e.package_&&n.name===e.name}function P(n,e){if(!(n instanceof Co))return!1;for(let t of n.statement)if(t.predicate?.subject?.name==="type"&&t instanceof Hn){let o=t.object;if(T(o.subject,e))return!0}return!1}function A(n,e){let t=[];for(let r of n)r instanceof Mn&&P(r,e)&&t.push(r);return t}function ke(n,e){let t=e.version,r=t&&typeof t.major=="number"?`${e.publisher}/${e.package_}@${t.major}.${t.minor}.${t.patch}`:void 0;for(let o of n){if(!(o instanceof Mn)||o.name!==e.name)continue;let a=o.namespace||"";if(r!==void 0){if(a===r)return o}else if(a.startsWith(`${e.publisher}/${e.package_}@`))return o}}function en(n,e){for(let t of n.statement){let r=t.predicate;if(r?.subject&&T(r.subject,e))return t}}function To(n,e){let t=en(n,e);if(t&&(t instanceof Ao||t instanceof _o||t instanceof Ro))return t.object}function _(n,e){let t=To(n,e);return typeof t=="string"?t:void 0}function se(n,e){let t=en(n,e);if(t instanceof Hn)return t.object.subject}function nn(n,e){let t=en(n,e);return t instanceof Io?t.object??[]:[]}var R="kanonak.org",I="capabilities",tn={publisher:R,package_:I,name:"Capability"},Lo={publisher:R,package_:I,name:"commandName"},Yn={publisher:R,package_:I,name:"description"},Vo={publisher:R,package_:I,name:"managesType"},Fo={publisher:R,package_:I,name:"deploymentTarget"},Bo={publisher:R,package_:I,name:"hasCommand"},Mo={publisher:R,package_:I,name:"subcommandName"},Ho={publisher:R,package_:I,name:"performs"},qo={publisher:R,package_:I,name:"hasArgument"},zo={publisher:R,package_:I,name:"argumentName"},zn={publisher:R,package_:I,name:"isRequired"},Wn={publisher:R,package_:I,name:"isOption"},Wo={publisher:R,package_:I,name:"defaultValue"};async function Zn(n,e,t){let r=ae(),o=new Oo,a=[],s=!1;for(let[i,c]of Object.entries(r.capabilities)){let l=c,u=n.get(l.publisher,l.package_,l.version);if(!u){let f=await Go(i,l,e,o,t);if(f)console.error(` Healed capability "${i}": ${l.publisher}/${l.package_}@${l.version} \u2192 ${f.entry.publisher}/${f.entry.package_}@${f.entry.version} (package was renamed)`),r.capabilities[i]=f.entry,l=f.entry,u=f.content,s=!0;else{console.error(` WARNING: Cached content missing for capability "${i}" (${l.publisher}/${l.package_}@${l.version}). Reinstall it with: kanonak capability remove ${i} && kanonak capability add ${l.publisher}/${l.package_}`);continue}}try{let f=e.parse(u),p=new E(f,t),g=await o.parseKanonaks(p),b=Qn(g,l.publisher,l.package_,l.version);b?a.push(b):console.error(` WARNING: No Capability instance found in "${i}" (${l.publisher}/${l.package_}@${l.version})`)}catch(f){console.error(` WARNING: Failed to parse capability "${i}": ${f}`)}}return s&&ge(r),a}async function Go(n,e,t,r,o){let a=qn(No(),e.publisher);if(!jo(a))return;let s=[];for(let i of xo(a)){if(!i.endsWith(".kan.yml"))continue;let c=i.slice(0,-8),l=c.lastIndexOf("@");if(l===-1)continue;let u=c.substring(0,l),f=c.substring(l+1);if(u===e.package_&&f===e.version)continue;let p;try{p=Uo(qn(a,i),"utf-8")}catch{continue}let g;try{let b=t.parse(p),k=new E(b,o),y=await r.parseKanonaks(k);g=Qn(y,e.publisher,u,f)?.commandName}catch{continue}g===n&&s.push({entry:{publisher:e.publisher,package_:u,version:f,resolved:`kanonak://${e.publisher}/${u}@${f}`,integrity:""},content:p})}if(s.length===1)return s[0]}function Qn(n,e,t,r){let o=A(n,tn);if(o.length===0)return;let a=o[0],s=_(a,Lo)??"",i=_(a,Yn)??"",c=se(a,Vo),l=se(a,Fo),u=[];for(let f of nn(a,Bo)){let p=Xo(f,n);p&&u.push(p)}return{commandName:s,description:i,managesTypeKey:c?N(c):"",deploymentTargetKey:l?N(l):"",commands:u,publisher:e,package_:t,version:r}}function Xo(n,e){let t;if(n instanceof Xn)t=n;else if(n instanceof Jn){let c=et(e,n.subject.publisher,n.subject.package_,n.subject.name);c&&(t=c)}if(!t)return;let r=_(t,Mo)??"",o=_(t,Yn)??"",a=se(t,Ho),s=nn(t,qo),i=[];for(let c of s){let l=Jo(c,e);l&&i.push(l)}return{subcommandName:r,description:o,arguments:i,actionKey:a?N(a):""}}function Jo(n,e){let t;if(n instanceof Xn)t=n;else if(n instanceof Jn){let c=et(e,n.subject.publisher,n.subject.package_,n.subject.name);c&&(t=c)}if(!t)return;let r=_(t,zo)??"",o=_(t,zn)==="true"||Gn(t,zn)===!0,a=_(t,Wn)==="true"||Gn(t,Wn)===!0,s=_(t,Wo),i={argumentName:r,required:o,isOption:a};return s!==void 0&&(i.defaultValue=s),i}function Gn(n,e){for(let t of n.statement){let r=t,o=r.predicate;if(o?.subject&&o.subject.publisher===e.publisher&&o.subject.package_===e.package_&&o.subject.name===e.name)return typeof r.object=="boolean"?r.object:void 0}}function et(n,e,t,r){for(let o of n){if(!("name"in o)||!("namespace"in o))continue;let a=o;if(a.name===r&&!(!a.namespace||typeof a.namespace!="string")&&a.namespace.startsWith(`${e}/${t}@`))return o}}var oa={publisher:R,package_:I,name:"commandName"};function nt(){let n=new Yo("capability").description("Manage Kanonak CLI capabilities (pluggable command groups)");return n.command("add <package>").description("Install a capability from a Kanonak publisher").action(async e=>{await aa(e)}),n.command("remove <name>").description("Remove an installed capability").action(async e=>{await sa(e)}),n.command("list").description("List installed capabilities").action(async()=>{await ia()}),n}async function aa(n){let e=ne(n);e||(console.error(`Invalid package reference: "${n}"`),console.error("Expected format: {publisher}/{package}[@{version}]"),process.exit(1));let{publisher:t,packageName:r,version:o,instanceName:a}=e;a&&(console.error(`\`kanonak capability add\` installs whole packages \u2014 got an instance suffix "/${a}".`),console.error(`Try: kanonak capability add ${t}/${r}${o?"@"+o:""}`),process.exit(1));let s=new U,i=new Zo,c=new Qo,l=new na,u=ta(l),f=new ea({fetchFn:u}),p=o??await f.getHighestVersion(t,r);p||(console.error(`Could not resolve version for "${t}/${r}".`),process.exit(1)),console.log(`Installing capability ${t}/${r}@${p}...`);let g=s.get(t,r,p);if(!g){let F=await f.getPackageUrl(t,r,p),Pe=await u(F,t);if(!Pe.ok)throw new Error(`Failed to fetch ${F} (${Pe.status} ${Pe.statusText})`);g=await Pe.text(),s.put(t,r,p,g)}let b=i.parse(g),k=await O(process.cwd(),i),y=new E(b,k),h=await c.parseKanonaks(y),w=A(h,tn);w.length===0&&(console.error(`Package ${t}/${r}@${p} does not contain a ${R}/${I}/Capability instance.`),process.exit(1));let $=w[0],v=_($,oa);v||(console.error(`Capability instance in ${t}/${r}@${p} has no commandName property.`),process.exit(1));let K=ae();K.capabilities[v]={publisher:t,package_:r,version:p,resolved:await f.getPackageUrl(t,r,p),integrity:ra(g)},ge(K),console.log(`
59
+ Installed capability "${v}".`),console.log(`Run "kanonak ${v} --help" to get started.`)}async function sa(n){let e=ae();e.capabilities[n]||(console.error(`Capability "${n}" is not installed.`),process.exit(1));let t=e.capabilities[n];delete e.capabilities[n],ge(e),console.log(`Removed capability "${n}" (${t.publisher}/${t.package_}@${t.version}).`)}async function ia(){let n=ae(),e=Object.entries(n.capabilities);if(e.length===0){console.log("No capabilities installed."),console.log("Install one with: kanonak capability add {publisher}/{package}");return}console.log(`Installed capabilities:
60
+ `);for(let[t,r]of e)console.log(` ${t} ${r.publisher}/${r.package_}@${r.version}`)}import{Command as Se}from"commander";import{readFileSync as us,writeFileSync as ds,mkdirSync as fs,existsSync as Vt,statSync as ms}from"fs";import{join as ps,resolve as gs}from"path";import{KanonakParser as gn,KanonakObjectParser as kn,SubjectKanonak as ks,Reasoner as ys,KanonakVocabulary as hs,makeUriKey as Bt,pickHighestDocument as yn,formatVersion as Mt}from"@kanonak-protocol/sdk";var ca="kanonak.org",la="transformations";var m=n=>({publisher:ca,package_:la,name:n}),d={Transformation:m("Transformation"),InstanceTransformation:m("InstanceTransformation"),SetTransformation:m("SetTransformation"),inputPattern:m("inputPattern"),rule:m("rule"),artifactName:m("artifactName"),outputs:m("outputs"),formatOverrides:m("formatOverrides"),partitionBy:m("partitionBy"),InputPattern:m("InputPattern"),matchesClass:m("matchesClass"),requires:m("requires"),sortBy:m("sortBy"),SortKey:m("SortKey"),byProperty:m("byProperty"),order:m("order"),SortOrder:m("SortOrder"),ascending:m("ascending"),descending:m("descending"),OutputFormat:m("OutputFormat"),backendUri:m("backendUri"),FormatOverride:m("FormatOverride"),formatTarget:m("formatTarget"),metadataKeys:m("metadataKeys"),metadataRenames:m("metadataRenames"),trailingNewline:m("trailingNewline"),RenameEntry:m("RenameEntry"),fromKey:m("fromKey"),toKey:m("toKey"),FMT_MARKDOWN_FRONTMATTER:m("markdown-with-frontmatter"),FMT_PLAIN_MARKDOWN:m("plain-markdown"),FMT_TOML:m("toml"),FMT_JSON:m("json"),FMT_HTML:m("html"),FMT_SVG:m("svg"),Expression:m("Expression"),ListSourcedExpression:m("ListSourcedExpression"),ListAggregate:m("ListAggregate"),IteratingExpression:m("IteratingExpression"),BuildAstNode:m("BuildAstNode"),astClass:m("astClass"),set:m("set"),AstFieldBinding:m("AstFieldBinding"),field:m("field"),bindValue:m("bindValue"),When:m("When"),condition:m("condition"),thenBuild:m("thenBuild"),elseBuild:m("elseBuild"),Concat:m("Concat"),parts:m("parts"),Fallback:m("Fallback"),primary:m("primary"),alternate:m("alternate"),StringLiteral:m("StringLiteral"),stringLiteral:m("stringLiteral"),IntegerLiteral:m("IntegerLiteral"),integerLiteral:m("integerLiteral"),DecimalLiteral:m("DecimalLiteral"),decimalLiteral:m("decimalLiteral"),BooleanLiteral:m("BooleanLiteral"),booleanLiteral:m("booleanLiteral"),VarRef:m("VarRef"),varName:m("varName"),PropertyRead:m("PropertyRead"),readSource:m("readSource"),readProp:m("readProp"),Traverse:m("Traverse"),traverseSource:m("traverseSource"),through:m("through"),step:m("step"),UriName:m("UriName"),uriNameOf:m("uriNameOf"),UriPublisher:m("UriPublisher"),uriPublisherOf:m("uriPublisherOf"),UriPackage:m("UriPackage"),uriPackageOf:m("uriPackageOf"),UriVersion:m("UriVersion"),uriVersionOf:m("uriVersionOf"),SubjectUri:m("SubjectUri"),subjectOf:m("subjectOf"),UriLiteral:m("UriLiteral"),refTo:m("refTo"),DisplayLabel:m("DisplayLabel"),labelTarget:m("labelTarget"),labelSource:m("labelSource"),ResolveRef:m("ResolveRef"),resolveSource:m("resolveSource"),Normalize:m("Normalize"),normSource:m("normSource"),normKind:m("normKind"),NormalizeKind:m("NormalizeKind"),NORM_TRIM_END:m("trim-end"),IsSet:m("IsSet"),checkExpr:m("checkExpr"),ExpressionFragment:m("ExpressionFragment"),body:m("body"),CallFragment:m("CallFragment"),fragmentRef:m("fragmentRef"),source:m("source"),Join:m("Join"),separator:m("separator"),Count:m("Count"),Sum:m("Sum"),Min:m("Min"),Max:m("Max"),Average:m("Average"),loopVar:m("loopVar"),ForEach:m("ForEach"),emit:m("emit"),ListMap:m("ListMap"),mapBody:m("mapBody"),Filter:m("Filter"),predicate:m("predicate"),PartitionBy:m("PartitionBy"),partitionKey:m("partitionKey"),DistinctBy:m("DistinctBy"),distinctKey:m("distinctKey"),Partition:m("Partition"),key:m("key"),members:m("members")};import{DefinedKanonak as It,ReferenceKanonak as Tt,StringStatement as jt,NumberStatement as xt,BooleanStatement as Ut,ReferenceStatement as Ot,ListStatement as Nt}from"@kanonak-protocol/sdk";var ua="kanonak.org",da="document-ast",S=n=>({publisher:ua,package_:da,name:n}),L={Document:S("Document"),Block:S("Block"),Inline:S("Inline"),StructuredValue:S("StructuredValue"),Heading:S("Heading"),Paragraph:S("Paragraph"),RawBlock:S("RawBlock"),Text:S("Text"),StructuredMap:S("StructuredMap"),StructuredEntry:S("StructuredEntry"),StructuredList:S("StructuredList"),StringScalar:S("StringScalar"),IntegerScalar:S("IntegerScalar"),EscapeHint:S("EscapeHint"),MediaType:S("MediaType"),metadata:S("metadata"),children:S("children"),level:S("level"),inlines:S("inlines"),text:S("text"),entries:S("entries"),key:S("key"),value:S("value"),escapeHint:S("escapeHint"),items:S("items"),stringValue:S("stringValue"),integerValue:S("integerValue"),rawContent:S("rawContent"),mediaType:S("mediaType"),mimeType:S("mimeType"),ESC_RAW:S("esc-raw"),ESC_YAML_SAFE:S("esc-yaml-safe"),ESC_TOML_STRING:S("esc-toml-string"),ESC_TOML_MULTILINE:S("esc-toml-multiline"),ESC_JSON:S("esc-json"),TEXT_PLAIN:S("text-plain"),TEXT_MARKDOWN:S("text-markdown"),TEXT_HTML:S("text-html"),APPLICATION_JSON:S("application-json"),TEXT_YAML:S("text-yaml"),IMAGE_SVG_XML:S("image-svg-xml")};function tt(n,e){return n.publisher===e.publisher&&n.package_===e.package_&&n.name===e.name}var Ee=class{backendUri="kanonak.org/transformations/markdown-with-frontmatter";render(e,t){let r=fa(e.metadata,t),o=ga(e.children),s=["---",...r,"---","",o].join(`
61
+ `);return t?.trailingNewline&&(s.endsWith(`
62
+ `)||(s+=`
63
+ `)),s}};function fa(n,e){if(!n)return[];let t=new Map;for(let i of n.entries)t.set(De(i.key),i);let r=new Map;if(e?.metadataRenames)for(let[i,c]of e.metadataRenames)r.set(De(i),c);let a=(e?.metadataKeys??n.entries.map(i=>i.key)).map(De),s=[];for(let i of a){let c=t.get(i);if(!c)continue;let l=r.get(i),u=De(l??i),f=ot(c.value,c.escapeHint);f!==void 0&&s.push(`${u}: ${f}`)}return s}function De(n){let e=n.lastIndexOf(".");return e===-1?n:n.substring(e+1)||n}function ot(n,e){switch(n.kind){case"StringScalar":return ma(n.stringValue,e);case"IntegerScalar":return String(n.integerValue);case"StructuredList":{let t=[];for(let r of n.items){let o=ot(r,e);o!==void 0&&t.push(o)}return t.join(", ")}case"StructuredMap":return;default:return}}function ma(n,e){return!e||tt(e,L.ESC_RAW)?n:tt(e,L.ESC_YAML_SAFE)?pa(n):n}function pa(n){return n.includes(`
64
64
  `)?`|-
65
65
  ${n.replace(/\n/g,`
66
- `).trimEnd()}`:/[:#\[\]{}&*!|>'"%@`,]/.test(n)?`"${n.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}"`:n}function ka(n){let e=[];for(let t of n){let r=ya(t);r&&e.push(r)}return e.join(`
66
+ `).trimEnd()}`:/[:#\[\]{}&*!|>'"%@`,]/.test(n)?`"${n.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}"`:n}function ga(n){let e=[];for(let t of n){let r=ka(t);r&&e.push(r)}return e.join(`
67
67
 
68
- `)}function ya(n){switch(n.kind){case"Heading":return`${"#".repeat(n.level)} ${rt(n.inlines)}`;case"Paragraph":return rt(n.inlines);case"RawBlock":return n.rawContent;default:return""}}function rt(n){let e=[];for(let t of n)t.kind==="Text"&&e.push(t.text);return e.join("")}function ha(n,e){return n.publisher===e.publisher&&n.package_===e.package_&&n.name===e.name}var Ce=class{backendUri="kanonak.org/transformations/toml";render(e,t){let o=ba(e.metadata,t).join(`
68
+ `)}function ka(n){switch(n.kind){case"Heading":return`${"#".repeat(n.level)} ${rt(n.inlines)}`;case"Paragraph":return rt(n.inlines);case"RawBlock":return n.rawContent;default:return""}}function rt(n){let e=[];for(let t of n)t.kind==="Text"&&e.push(t.text);return e.join("")}function ya(n,e){return n.publisher===e.publisher&&n.package_===e.package_&&n.name===e.name}var Ce=class{backendUri="kanonak.org/transformations/toml";render(e,t){let o=ha(e.metadata,t).join(`
69
69
  `);return t?.trailingNewline&&(o.endsWith(`
70
70
  `)||(o+=`
71
- `)),o}};function ba(n,e){if(!n)return[];let t=new Map;for(let s of n.entries)t.set(s.key,s);let r=e?.metadataKeys??n.entries.map(s=>s.key),o=[];for(let s of r){let a=t.get(s);if(!a)continue;let i=e?.metadataRenames.get(s)??s,c=at(a.value,a.escapeHint);c!==void 0&&o.push(`${i} = ${c}`)}return o}function at(n,e){switch(n.kind){case"StringScalar":return wa(n.stringValue,e);case"IntegerScalar":return String(n.integerValue);case"StructuredList":{let t=[];for(let r of n.items){let o=at(r,e);o!==void 0&&t.push(o)}return`[${t.join(", ")}]`}case"StructuredMap":return;default:return}}function wa(n,e){return e&&ha(e,N.ESC_TOML_MULTILINE)?Sa(n):$a(n)}function $a(n){return`"${n.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/\n/g,"\\n")}"`}function Sa(n){return`"""
71
+ `)),o}};function ha(n,e){if(!n)return[];let t=new Map;for(let a of n.entries)t.set(a.key,a);let r=e?.metadataKeys??n.entries.map(a=>a.key),o=[];for(let a of r){let s=t.get(a);if(!s)continue;let i=e?.metadataRenames.get(a)??a,c=at(s.value,s.escapeHint);c!==void 0&&o.push(`${i} = ${c}`)}return o}function at(n,e){switch(n.kind){case"StringScalar":return ba(n.stringValue,e);case"IntegerScalar":return String(n.integerValue);case"StructuredList":{let t=[];for(let r of n.items){let o=at(r,e);o!==void 0&&t.push(o)}return`[${t.join(", ")}]`}case"StructuredMap":return;default:return}}function ba(n,e){return e&&ya(e,L.ESC_TOML_MULTILINE)?$a(n):wa(n)}function wa(n){return`"${n.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/\n/g,"\\n")}"`}function $a(n){return`"""
72
72
  ${n.replace(/"""/g,'\\"\\"\\"')}
73
73
  """`}var Ae=class{backendUri="kanonak.org/transformations/json";render(e,t){let r=JSON.stringify(e,null,2);return t?.trailingNewline&&!r.endsWith(`
74
74
  `)?r+`
75
75
  `:r}};function it(n){let e=n.replace(/\r\n/g,`
76
76
  `).split(`
77
- `),t=[],r=0;for(;r<e.length;){let o=e[r];if(o.trim()===""){r++;continue}let s=/^(\s*)```(\S*)\s*$/.exec(o);if(s){let c=s[2],l=[];for(r++;r<e.length&&!/^(\s*)```\s*$/.test(e[r]);)l.push(e[r]),r++;r++;let d=ct(l.join(`
78
- `)),f=c?` class="language-${lt(c)}"`:"";t.push(`<pre><code${f}>${d}</code></pre>`);continue}let a=/^(#{1,6})\s+(.*)$/.exec(o);if(a){let c=a[1].length,l=ie(a[2].trim());t.push(`<h${c}>${l}</h${c}>`),r++;continue}if(o.includes("|")&&r+1<e.length&&st(e[r+1])){let c=rn(o),l=va(e[r+1]);r+=2;let d=[];for(;r<e.length&&e[r].trim()!==""&&e[r].includes("|");)d.push(rn(e[r])),r++;t.push(Pa(c,l,d));continue}if(/^\s*[-*]\s+/.test(o)){let c=[];for(;r<e.length&&/^\s*[-*]\s+/.test(e[r]);){let l=[e[r].replace(/^\s*[-*]\s+/,"")];for(r++;r<e.length&&e[r].trim()!==""&&!/^\s*[-*]\s+/.test(e[r])&&!/^\s*\d+\.\s+/.test(e[r]);)l.push(e[r]),r++;r<e.length&&e[r].trim()===""&&r++,c.push(`<li>${ie(l.join(" ").trim())}</li>`)}t.push(`<ul>
77
+ `),t=[],r=0;for(;r<e.length;){let o=e[r];if(o.trim()===""){r++;continue}let a=/^(\s*)```(\S*)\s*$/.exec(o);if(a){let c=a[2],l=[];for(r++;r<e.length&&!/^(\s*)```\s*$/.test(e[r]);)l.push(e[r]),r++;r++;let u=ct(l.join(`
78
+ `)),f=c?` class="language-${lt(c)}"`:"";t.push(`<pre><code${f}>${u}</code></pre>`);continue}let s=/^(#{1,6})\s+(.*)$/.exec(o);if(s){let c=s[1].length,l=ie(s[2].trim());t.push(`<h${c}>${l}</h${c}>`),r++;continue}if(o.includes("|")&&r+1<e.length&&st(e[r+1])){let c=rn(o),l=Sa(e[r+1]);r+=2;let u=[];for(;r<e.length&&e[r].trim()!==""&&e[r].includes("|");)u.push(rn(e[r])),r++;t.push(va(c,l,u));continue}if(/^\s*[-*]\s+/.test(o)){let c=[];for(;r<e.length&&/^\s*[-*]\s+/.test(e[r]);){let l=[e[r].replace(/^\s*[-*]\s+/,"")];for(r++;r<e.length&&e[r].trim()!==""&&!/^\s*[-*]\s+/.test(e[r])&&!/^\s*\d+\.\s+/.test(e[r]);)l.push(e[r]),r++;r<e.length&&e[r].trim()===""&&r++,c.push(`<li>${ie(l.join(" ").trim())}</li>`)}t.push(`<ul>
79
79
  ${c.join(`
80
80
  `)}
81
81
  </ul>`);continue}if(/^\s*\d+\.\s+/.test(o)){let c=[];for(;r<e.length&&/^\s*\d+\.\s+/.test(e[r]);){let l=[e[r].replace(/^\s*\d+\.\s+/,"")];for(r++;r<e.length&&e[r].trim()!==""&&!/^\s*\d+\.\s+/.test(e[r])&&!/^\s*[-*]\s+/.test(e[r]);)l.push(e[r]),r++;r<e.length&&e[r].trim()===""&&r++,c.push(`<li>${ie(l.join(" ").trim())}</li>`)}t.push(`<ol>
82
82
  ${c.join(`
83
83
  `)}
84
84
  </ol>`);continue}let i=[o];for(r++;r<e.length&&e[r].trim()!==""&&!/^(#{1,6})\s+/.test(e[r])&&!/^(\s*)```/.test(e[r])&&!/^\s*[-*]\s+/.test(e[r])&&!/^\s*\d+\.\s+/.test(e[r])&&!(e[r].includes("|")&&r+1<e.length&&st(e[r+1]));)i.push(e[r]),r++;t.push(`<p>${ie(i.join(" "))}</p>`)}return t.join(`
85
- `)}function st(n){return n.includes("-")?/^[\s|:-]+$/.test(n):!1}function rn(n){let e=n.trim();return e.startsWith("|")&&(e=e.slice(1)),e.endsWith("|")&&(e=e.slice(0,-1)),e.split("|").map(t=>t.trim())}function va(n){return rn(n).map(e=>{let t=e.startsWith(":"),r=e.endsWith(":");return t&&r?"center":r?"right":t?"left":null})}function Pa(n,e,t){let r=a=>{let i=e[a];return i?` style="text-align:${i}"`:""},o=n.map((a,i)=>`<th${r(i)}>${ie(a)}</th>`).join(""),s=t.map(a=>`<tr>${a.map((c,l)=>`<td${r(l)}>${ie(c)}</td>`).join("")}</tr>`).join(`
85
+ `)}function st(n){return n.includes("-")?/^[\s|:-]+$/.test(n):!1}function rn(n){let e=n.trim();return e.startsWith("|")&&(e=e.slice(1)),e.endsWith("|")&&(e=e.slice(0,-1)),e.split("|").map(t=>t.trim())}function Sa(n){return rn(n).map(e=>{let t=e.startsWith(":"),r=e.endsWith(":");return t&&r?"center":r?"right":t?"left":null})}function va(n,e,t){let r=s=>{let i=e[s];return i?` style="text-align:${i}"`:""},o=n.map((s,i)=>`<th${r(i)}>${ie(s)}</th>`).join(""),a=t.map(s=>`<tr>${s.map((c,l)=>`<td${r(l)}>${ie(c)}</td>`).join("")}</tr>`).join(`
86
86
  `);return`<table>
87
87
  <thead><tr>${o}</tr></thead>
88
88
  <tbody>
89
- ${s}
89
+ ${a}
90
90
  </tbody>
91
- </table>`}function ie(n){let e=ct(n);return e=e.replace(/`([^`\n]+)`/g,(t,r)=>`<code>${r}</code>`),e=e.replace(/\[([^\]]+)\]\(([^)\s]+)\)/g,(t,r,o)=>`<a href="${lt(o)}">${r}</a>`),e=e.replace(/\*\*([^*\n]+)\*\*/g,(t,r)=>`<strong>${r}</strong>`),e=e.replace(/(^|[^*])\*([^*\n]+)\*(?!\*)/g,(t,r,o)=>`${r}<em>${o}</em>`),e=e.replace(/(^|[\s(])_([^_\n]+)_(?=[\s).,;:!?]|$)/g,(t,r,o)=>`${r}<em>${o}</em>`),e}function ct(n){return n.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}function lt(n){return n.replace(/"/g,"&quot;").replace(/&/g,"&amp;")}function on(n,e){return n.publisher===e.publisher&&n.package_===e.package_&&n.name===e.name}var _e=class{backendUri="kanonak.org/transformations/html";render(e,t){let r=Ka(e.metadata)??"Untitled",o=Da(e.metadata,t),s=Ea(e.children),a=`<!DOCTYPE html>
91
+ </table>`}function ie(n){let e=ct(n);return e=e.replace(/`([^`\n]+)`/g,(t,r)=>`<code>${r}</code>`),e=e.replace(/\[([^\]]+)\]\(([^)\s]+)\)/g,(t,r,o)=>`<a href="${lt(o)}">${r}</a>`),e=e.replace(/\*\*([^*\n]+)\*\*/g,(t,r)=>`<strong>${r}</strong>`),e=e.replace(/(^|[^*])\*([^*\n]+)\*(?!\*)/g,(t,r,o)=>`${r}<em>${o}</em>`),e=e.replace(/(^|[\s(])_([^_\n]+)_(?=[\s).,;:!?]|$)/g,(t,r,o)=>`${r}<em>${o}</em>`),e}function ct(n){return n.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}function lt(n){return n.replace(/"/g,"&quot;").replace(/&/g,"&amp;")}function on(n,e){return n.publisher===e.publisher&&n.package_===e.package_&&n.name===e.name}var _e=class{backendUri="kanonak.org/transformations/html";render(e,t){let r=Pa(e.metadata)??"Untitled",o=Ka(e.metadata,t),a=Da(e.children),s=`<!DOCTYPE html>
92
92
  <html lang="en">
93
93
  <head>
94
94
  <meta charset="utf-8">
95
- <title>${ke(r)}</title>
95
+ <title>${ye(r)}</title>
96
96
  <style>
97
97
  body { font-family: -apple-system, Segoe UI, Helvetica, Arial, sans-serif; max-width: 860px; margin: 2rem auto; padding: 0 1rem; color: #222; line-height: 1.55; }
98
98
  h1, h2, h3, h4 { line-height: 1.2; }
@@ -114,21 +114,21 @@ figure.svg-figure svg { max-width: 100%; height: auto; }
114
114
  </style>
115
115
  </head>
116
116
  <body>
117
- ${o}${s}
117
+ ${o}${a}
118
118
  </body>
119
119
  </html>
120
- `;return t?.trailingNewline===!1&&a.endsWith(`
121
- `)?a.slice(0,-1):a}};function Ka(n){if(n){for(let e of n.entries)if((e.key==="title"||e.key==="name")&&e.value.kind==="StringScalar")return e.value.stringValue}}function Da(n,e){if(!n||n.entries.length===0)return"";let t=e?.metadataKeys??n.entries.map(s=>s.key),r=new Map(n.entries.map(s=>[s.key,s])),o=[];for(let s of t){let a=r.get(s);if(!a)continue;let i=e?.metadataRenames.get(s)??s,c=dt(a.value);c!==void 0&&o.push(` <dt>${ke(i)}</dt>
120
+ `;return t?.trailingNewline===!1&&s.endsWith(`
121
+ `)?s.slice(0,-1):s}};function Pa(n){if(n){for(let e of n.entries)if((e.key==="title"||e.key==="name")&&e.value.kind==="StringScalar")return e.value.stringValue}}function Ka(n,e){if(!n||n.entries.length===0)return"";let t=e?.metadataKeys??n.entries.map(a=>a.key),r=new Map(n.entries.map(a=>[a.key,a])),o=[];for(let a of t){let s=r.get(a);if(!s)continue;let i=e?.metadataRenames.get(a)??a,c=dt(s.value);c!==void 0&&o.push(` <dt>${ye(i)}</dt>
122
122
  <dd>${c}</dd>`)}return o.length===0?"":`<dl class="metadata">
123
123
  ${o.join(`
124
124
  `)}
125
125
  </dl>
126
- `}function dt(n){switch(n.kind){case"StringScalar":return ke(n.stringValue);case"IntegerScalar":return String(n.integerValue);case"StructuredList":{let e=[];for(let t of n.items){let r=dt(t);r!==void 0&&e.push(`<code>${r}</code>`)}return e.join(", ")}case"StructuredMap":return;default:return}}function Ea(n){let e=[];for(let t of n){let r=Ca(t);r&&e.push(r)}return e.join(`
127
- `)}function Ca(n){switch(n.kind){case"Heading":{let e=Math.max(1,Math.min(6,n.level));return`<h${e}>${ut(n.inlines)}</h${e}>`}case"Paragraph":return`<p>${ut(n.inlines)}</p>`;case"RawBlock":return Aa(n);default:return""}}function Aa(n){let e=n.mediaType;return e&&on(e,N.TEXT_MARKDOWN)?it(n.rawContent):e&&on(e,N.TEXT_HTML)?n.rawContent:e&&on(e,N.IMAGE_SVG_XML)?`<figure class="svg-figure">
126
+ `}function dt(n){switch(n.kind){case"StringScalar":return ye(n.stringValue);case"IntegerScalar":return String(n.integerValue);case"StructuredList":{let e=[];for(let t of n.items){let r=dt(t);r!==void 0&&e.push(`<code>${r}</code>`)}return e.join(", ")}case"StructuredMap":return;default:return}}function Da(n){let e=[];for(let t of n){let r=Ea(t);r&&e.push(r)}return e.join(`
127
+ `)}function Ea(n){switch(n.kind){case"Heading":{let e=Math.max(1,Math.min(6,n.level));return`<h${e}>${ut(n.inlines)}</h${e}>`}case"Paragraph":return`<p>${ut(n.inlines)}</p>`;case"RawBlock":return Ca(n);default:return""}}function Ca(n){let e=n.mediaType;return e&&on(e,L.TEXT_MARKDOWN)?it(n.rawContent):e&&on(e,L.TEXT_HTML)?n.rawContent:e&&on(e,L.IMAGE_SVG_XML)?`<figure class="svg-figure">
128
128
  ${n.rawContent}
129
- </figure>`:`<pre${e?` class="media-${_a(e.name)}"`:""}><code>${ke(n.rawContent)}</code></pre>`}function ut(n){let e=[];for(let t of n)t.kind==="Text"&&e.push(ke(t.text));return e.join("")}function ke(n){return n.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}function _a(n){return n.replace(/"/g,"&quot;").replace(/&/g,"&amp;")}function Ra(n,e){return n.publisher===e.publisher&&n.package_===e.package_&&n.name===e.name}var Re=class{backendUri="kanonak.org/transformations/svg";render(e,t){for(let r of e.children)if(r.kind==="RawBlock"&&r.mediaType&&Ra(r.mediaType,N.IMAGE_SVG_XML)){let o=r.rawContent;return t?.trailingNewline&&!o.endsWith(`
129
+ </figure>`:`<pre${e?` class="media-${Aa(e.name)}"`:""}><code>${ye(n.rawContent)}</code></pre>`}function ut(n){let e=[];for(let t of n)t.kind==="Text"&&e.push(ye(t.text));return e.join("")}function ye(n){return n.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}function Aa(n){return n.replace(/"/g,"&quot;").replace(/&/g,"&amp;")}function _a(n,e){return n.publisher===e.publisher&&n.package_===e.package_&&n.name===e.name}var Re=class{backendUri="kanonak.org/transformations/svg";render(e,t){for(let r of e.children)if(r.kind==="RawBlock"&&r.mediaType&&_a(r.mediaType,L.IMAGE_SVG_XML)){let o=r.rawContent;return t?.trailingNewline&&!o.endsWith(`
130
130
  `)&&(o+=`
131
- `),o}return'<svg xmlns="http://www.w3.org/2000/svg" width="1" height="1"/>'}};import{SubjectKanonak as ft}from"@kanonak-protocol/sdk";var Ie=class{constructor(e,t,r){this.repository=e;this.parser=t;this.objectParser=r}repository;parser;objectParser;cache=new Map;async resolveSubject(e,t){let r=Ke(t,e);if(r)return r;let o=`${e.publisher}/${e.package_}`,s=this.cache.get(o);if(!s){let a=await this.repository.getDocumentsByNamespaceAsync(e.publisher,e.package_);if(a.length===0)return;let i=a[0],c=new E(i,this.repository);s=await this.objectParser.parseKanonaks(c),this.cache.set(o,s)}for(let a of s)if(a instanceof ft&&a.name===e.name&&a.namespace&&a.namespace.startsWith(`${e.publisher}/${e.package_}@`))return a;for(let a of s)if(a instanceof ft&&a.name===e.name)return a}};import{EmbeddedKanonak as he,ReferenceKanonak as ht,SubjectKanonak as Ia,ListStatement as H,ReferenceStatement as sn,EmbeddedStatement as le,StringStatement as bt,NumberStatement as Ta,BooleanStatement as ja}from"@kanonak-protocol/sdk";var C=class extends Error{constructor(t,r){super(`${t} (at ${r})`);this.path=r}path},pt=16;function ue(n,e){let t=n.name,r={catalog:e,depth:0};if(P(n,u.InstanceTransformation))return xa(n,t,r);if(P(n,u.SetTransformation))return Ua(n,t,r);throw new C("Subject is not a recognized v3 transformation type \u2014 expected InstanceTransformation or SetTransformation",t)}function xa(n,e,t){return{kind:"instance",name:n.name,inputPattern:wt(n,e),rule:Te(n,u.rule,`${e}.rule`,t),artifactName:Te(n,u.artifactName,`${e}.artifactName`,t),outputs:$t(n,`${e}.outputs`),overrides:St(n,`${e}.formatOverrides`,t)}}function Ua(n,e,t){let r=q(n,u.partitionBy);return{kind:"set",name:n.name,inputPattern:wt(n,e),rule:Te(n,u.rule,`${e}.rule`,t),artifactName:Te(n,u.artifactName,`${e}.artifactName`,t),outputs:$t(n,`${e}.outputs`),overrides:St(n,`${e}.formatOverrides`,t),partitionBy:r}}function wt(n,e){let t=be(n,u.inputPattern);if(!t)throw new C("inputPattern is required",e);return Oa(t,`${e}.inputPattern`)}function Oa(n,e){let t=q(n,u.matchesClass);if(!t)throw new C("matchesClass is required",e);let r=[];for(let a of x(n,u.requires))if(a instanceof sn)r.push(an(a.object.subject));else if(a instanceof H)for(let i of a.object)i instanceof ht&&r.push(an(i.subject));let o=[],s=0;for(let a of x(n,u.sortBy))if(a instanceof H)for(let i of a.object)i instanceof he&&o.push(mt(i,`${e}.sortBy[${s++}]`));else a instanceof le&&o.push(mt(a.object,`${e}.sortBy[${s++}]`));return{matchesClass:t,requires:r,sortBy:o}}function mt(n,e){let t=q(n,u.byProperty);if(!t)throw new C("SortKey.byProperty is required",e);let r=q(n,u.order);if(!r)throw new C("SortKey.order is required",e);if(T(r,u.ascending))return{byProperty:t,order:"ascending"};if(T(r,u.descending))return{byProperty:t,order:"descending"};throw new C(`SortKey.order must reference tx.ascending or tx.descending; got ${r.publisher}/${r.package_}/${r.name}`,e)}function Te(n,e,t,r){let o=be(n,e);if(!o)throw new C("expression is required",t);return ce(o,t,r)}function ce(n,e,t){if(P(n,u.StringLiteral))return{kind:"string-literal",value:M(n,u.stringLiteral,e)};if(P(n,u.IntegerLiteral))return{kind:"integer-literal",value:yt(n,u.integerLiteral,e)};if(P(n,u.DecimalLiteral))return{kind:"decimal-literal",value:yt(n,u.decimalLiteral,e)};if(P(n,u.BooleanLiteral))return{kind:"boolean-literal",value:za(n,u.booleanLiteral,e)};if(P(n,u.VarRef))return{kind:"var-ref",varName:M(n,u.varName,e)};if(P(n,u.PropertyRead))return{kind:"property-read",source:D(n,u.readSource,`${e}.readSource`,t),readProp:X(n,u.readProp,e,"readProp")};if(P(n,u.Traverse))return{kind:"traverse",source:D(n,u.traverseSource,`${e}.traverseSource`,t),through:X(n,u.through,e,"through"),step:D(n,u.step,`${e}.step`,t)};if(P(n,u.BuildAstNode))return{kind:"build-ast-node",astClass:X(n,u.astClass,e,"astClass"),set:Va(n,`${e}.set`,t)};if(P(n,u.When))return{kind:"when",condition:D(n,u.condition,`${e}.condition`,t),thenBuild:D(n,u.thenBuild,`${e}.thenBuild`,t),elseBuild:La(n,u.elseBuild,`${e}.elseBuild`,t)};if(P(n,u.Concat))return{kind:"concat",parts:Na(n,u.parts,`${e}.parts`,t)};if(P(n,u.Fallback))return{kind:"fallback",primary:D(n,u.primary,`${e}.primary`,t),alternate:D(n,u.alternate,`${e}.alternate`,t)};if(P(n,u.UriName))return{kind:"uri-name",source:D(n,u.uriNameOf,`${e}.uriNameOf`,t)};if(P(n,u.UriPublisher))return{kind:"uri-publisher",source:D(n,u.uriPublisherOf,`${e}.uriPublisherOf`,t)};if(P(n,u.UriPackage))return{kind:"uri-package",source:D(n,u.uriPackageOf,`${e}.uriPackageOf`,t)};if(P(n,u.UriVersion))return{kind:"uri-version",source:D(n,u.uriVersionOf,`${e}.uriVersionOf`,t)};if(P(n,u.SubjectUri))return{kind:"subject-uri",source:D(n,u.subjectOf,`${e}.subjectOf`,t)};if(P(n,u.UriLiteral))return{kind:"uri-literal",refTo:X(n,u.refTo,e,"refTo")};if(P(n,u.DisplayLabel))return{kind:"display-label",labelTarget:X(n,u.labelTarget,e,"labelTarget"),labelSource:X(n,u.labelSource,e,"labelSource")};if(P(n,u.ResolveRef))return{kind:"resolve-ref",source:D(n,u.resolveSource,`${e}.resolveSource`,t)};if(P(n,u.Normalize))return{kind:"normalize",source:D(n,u.normSource,`${e}.normSource`,t),normKind:Fa(n,e)};if(P(n,u.IsSet))return{kind:"is-set",check:D(n,u.checkExpr,`${e}.checkExpr`,t)};if(P(n,u.CallFragment))return Ba(n,e,t);if(P(n,u.Join))return{kind:"join",source:D(n,u.source,`${e}.source`,t),separator:M(n,u.separator,e)};if(P(n,u.Count))return{kind:"count",source:D(n,u.source,`${e}.source`,t)};if(P(n,u.Sum))return{kind:"sum",source:D(n,u.source,`${e}.source`,t)};if(P(n,u.Min))return{kind:"min",source:D(n,u.source,`${e}.source`,t)};if(P(n,u.Max))return{kind:"max",source:D(n,u.source,`${e}.source`,t)};if(P(n,u.Average))return{kind:"average",source:D(n,u.source,`${e}.source`,t)};if(P(n,u.ForEach))return{kind:"for-each",source:D(n,u.source,`${e}.source`,t),loopVar:M(n,u.loopVar,e),emit:D(n,u.emit,`${e}.emit`,t)};if(P(n,u.ListMap))return{kind:"list-map",source:D(n,u.source,`${e}.source`,t),loopVar:M(n,u.loopVar,e),mapBody:D(n,u.mapBody,`${e}.mapBody`,t)};if(P(n,u.Filter))return{kind:"filter",source:D(n,u.source,`${e}.source`,t),loopVar:M(n,u.loopVar,e),predicate:D(n,u.predicate,`${e}.predicate`,t)};if(P(n,u.PartitionBy))return{kind:"partition-by",source:D(n,u.source,`${e}.source`,t),loopVar:M(n,u.loopVar,e),partitionKey:D(n,u.partitionKey,`${e}.partitionKey`,t)};if(P(n,u.DistinctBy))return{kind:"distinct-by",source:D(n,u.source,`${e}.source`,t),loopVar:M(n,u.loopVar,e),distinctKey:D(n,u.distinctKey,`${e}.distinctKey`,t)};throw new C("Expression is not of a recognized v3 type \u2014 embedded has no matching subclass of tx.Expression",e)}function D(n,e,t,r){let o=be(n,e);if(!o)throw new C("child expression is required",t);return ce(o,t,r)}function La(n,e,t,r){let o=be(n,e);if(o)return ce(o,t,r)}function Na(n,e,t,r){let o=[],s=0;for(let a of x(n,e))if(a instanceof H)for(let i of a.object)i instanceof he&&o.push(ce(i,`${t}[${s++}]`,r));else a instanceof le&&o.push(ce(a.object,`${t}[${s++}]`,r));return o}function Va(n,e,t){let r=[],o=0;for(let s of x(n,u.set))if(s instanceof H)for(let a of s.object)a instanceof he&&r.push(gt(a,`${e}[${o++}]`,t));else s instanceof le&&r.push(gt(s.object,`${e}[${o++}]`,t));return r}function gt(n,e,t){return{field:X(n,u.field,e,"field"),value:D(n,u.bindValue,`${e}.bindValue`,t)}}function Fa(n,e){let t=q(n,u.normKind);if(!t)throw new C("normKind is required",e);if(T(t,u.NORM_TRIM_END))return"trim-end";throw new C(`Unknown NormalizeKind: ${t.publisher}/${t.package_}/${t.name}`,e)}function Ba(n,e,t){if(t.depth>=pt)throw new C(`Fragment recursion exceeded MAX_FRAGMENT_DEPTH (${pt})`,e);let r=q(n,u.fragmentRef);if(!r)throw new C("fragmentRef is required",e);let o=Ma(t.catalog,r);if(!o)throw new C(`ExpressionFragment not found: ${r.publisher}/${r.package_}/${r.name}`,e);let s=be(o,u.body);if(!s)throw new C(`ExpressionFragment ${r.name} has no body`,e);return{kind:"call-fragment",body:ce(s,`${e}.fragment(${r.name})`,{catalog:t.catalog,depth:t.depth+1})}}function Ma(n,e){for(let t of n)if(!(!(t instanceof Ia)||t.name!==e.name||!(t.namespace||"").startsWith(`${e.publisher}/${e.package_}@`))&&P(t,u.ExpressionFragment))return t}function $t(n,e){let t=new Set;for(let r of x(n,u.outputs))if(r instanceof sn)t.add(r.object.subject.name);else if(r instanceof H)for(let o of r.object)o instanceof ht&&t.add(o.subject.name);if(t.size===0)throw new C("outputs is required (at least one OutputFormat)",e);return t}function St(n,e,t){let r=new Map,o=0;for(let s of x(n,u.formatOverrides))if(s instanceof H){for(let a of s.object)if(a instanceof he){let[i,c]=kt(a,`${e}[${o++}]`);r.set(i,c)}}else if(s instanceof le){let[a,i]=kt(s.object,`${e}[${o++}]`);r.set(a,i)}return r}function kt(n,e){let t=q(n,u.formatTarget);if(!t)throw new C("formatTarget is required",e);let r=[];for(let a of x(n,u.metadataKeys))if(a instanceof bt)r.push(a.object);else if(a instanceof H)for(let i of a.object){let c=i.value;typeof c=="string"&&r.push(c)}let o=new Map;for(let a of x(n,u.metadataRenames))if(a instanceof H){for(let i of a.object)if(i instanceof he){let c=ye(i,u.fromKey),l=ye(i,u.toKey);c&&l&&o.set(c,l)}}else if(a instanceof le){let i=a.object,c=ye(i,u.fromKey),l=ye(i,u.toKey);c&&l&&o.set(c,l)}let s=vt(n,u.trailingNewline);return[t.name,{metadataKeys:r.length>0?r:void 0,metadataRenames:o,trailingNewline:s}]}function Ha(n){return n.predicate?.subject}function x(n,e){let t=[];for(let r of n.statement){let o=Ha(r);o&&T(o,e)&&t.push(r)}return t}function be(n,e){for(let t of x(n,e))if(t instanceof le)return t.object}function q(n,e){for(let t of x(n,e))if(t instanceof sn)return an(t.object.subject)}function ye(n,e){for(let t of x(n,e))if(t instanceof bt)return t.object}function qa(n,e){for(let t of x(n,e))if(t instanceof Ta)return t.object}function vt(n,e){for(let t of x(n,e))if(t instanceof ja)return t.object}function M(n,e,t){let r=ye(n,e);if(r===void 0)throw new C(`${e.name} (string) is required`,t);return r}function yt(n,e,t){let r=qa(n,e);if(r===void 0)throw new C(`${e.name} (number) is required`,t);return r}function za(n,e,t){let r=vt(n,e);if(r===void 0)throw new C(`${e.name} (boolean) is required`,t);return r}function X(n,e,t,r){let o=q(n,e);if(!o)throw new C(`${r} (URI reference) is required`,t);return o}function an(n){return{publisher:n.publisher,package_:n.package_,name:n.name}}import{DefinedKanonak as xe,EmbeddedKanonak as Wa,ReferenceKanonak as J,SubjectKanonak as un,StringStatement as Ga,NumberStatement as Xa,BooleanStatement as Ja,ReferenceStatement as Et,EmbeddedStatement as Ya,ListStatement as Ct}from"@kanonak-protocol/sdk";var z=class extends Error{},je=class{constructor(e,t){this.resolver=e;this.catalog=t}resolver;catalog;async evaluate(e,t){switch(e.kind){case"string-literal":return e.value;case"integer-literal":return e.value;case"decimal-literal":return e.value;case"boolean-literal":return e.value;case"uri-literal":return{...e.refTo};case"var-ref":{if(!t.has(e.varName))throw new z(`Unbound variable "${e.varName}"`);return t.get(e.varName)}case"concat":{let r=[];for(let o of e.parts){let s=await this.evaluate(o,t);if(s!=null)if(Array.isArray(s))for(let a of s)r.push(a);else r.push(s)}return r}case"fallback":{let r=await this.evaluate(e.primary,t);return Kt(r)?r:this.evaluate(e.alternate,t)}case"when":return await this.evaluate(e.condition,t)===!0?this.evaluate(e.thenBuild,t):e.elseBuild?this.evaluate(e.elseBuild,t):void 0;case"is-set":{let r=await this.evaluate(e.check,t);return Kt(r)}case"property-read":{let r=await this.evaluate(e.source,t);return Pt(r,e.readProp)}case"traverse":{let r=await this.evaluate(e.source,t);if(!(r instanceof xe))return;let o=Qa(r,e.through),s=[];for(let a of o){let i=await this.resolver.resolveSubject(a,this.catalog);if(!i)continue;let c=new Map(t);c.set("input",i);let l=await this.evaluate(e.step,c);l!=null&&s.push(cn(l))}return s.join("")}case"uri-name":{let r=await this.evaluate(e.source,t);return we(r)?r.name:r instanceof J?r.subject.name:r instanceof un?r.name:r instanceof Wa?r.name??"":void 0}case"uri-publisher":{let r=await this.evaluate(e.source,t);return ln(r)?.publisher}case"uri-package":{let r=await this.evaluate(e.source,t);return ln(r)?.package_}case"uri-version":{let r=await this.evaluate(e.source,t);return ln(r)?.version}case"subject-uri":{let r=await this.evaluate(e.source,t);if(r instanceof un){let o=r.namespace??"",s=r.name??"";return!o||!s?void 0:`${o}/${s}`}if(r instanceof J){let o=r.subject,s=o.version;return s&&typeof s.major=="number"?`${o.publisher}/${o.package_}@${s.major}.${s.minor}.${s.patch}/${o.name}`:`${o.publisher}/${o.package_}/${o.name}`}return}case"display-label":{let r=await this.resolver.resolveSubject({...e.labelTarget},this.catalog);return r?Pt(r,e.labelSource):void 0}case"resolve-ref":{let r=await this.evaluate(e.source,t);return r instanceof J?await this.resolver.resolveSubject(r.subject,this.catalog):we(r)?await this.resolver.resolveSubject(r,this.catalog):void 0}case"normalize":{let r=await this.evaluate(e.source,t),o=r==null?"":cn(r);return e.normKind==="trim-end"?o.replace(/[\s\r\n]+$/u,""):o}case"build-ast-node":{let r={kind:e.astClass.name};for(let o of e.set){let s=await this.evaluate(o.value,t);if(s==null||Array.isArray(s)&&s.length===0)continue;let a=o.field.name;Array.isArray(s)&&ns.has(a)&&s.every(i=>ts(i))&&(s=s.map(i=>String(i)).join("")),r[a]=s}return r}case"call-fragment":return this.evaluate(e.body,t);case"join":return(await this.evaluateList(e.source,t)).map(o=>o==null?"":cn(o)).join(e.separator);case"count":return(await this.evaluateList(e.source,t)).length;case"sum":{let r=await this.evaluateList(e.source,t),o=0;for(let s of r)o+=de(s,"Sum");return o}case"min":{let r=await this.evaluateList(e.source,t);if(r.length===0)throw new z("Min on an empty list is undefined; guard with IsSet");let o=de(r[0],"Min");for(let s=1;s<r.length;s++){let a=de(r[s],"Min");a<o&&(o=a)}return o}case"max":{let r=await this.evaluateList(e.source,t);if(r.length===0)throw new z("Max on an empty list is undefined; guard with IsSet");let o=de(r[0],"Max");for(let s=1;s<r.length;s++){let a=de(r[s],"Max");a>o&&(o=a)}return o}case"average":{let r=await this.evaluateList(e.source,t);if(r.length===0)throw new z("Average on an empty list is undefined; guard with IsSet");let o=0;for(let s of r)o+=de(s,"Average");return o/r.length}case"for-each":{let r=await this.evaluateList(e.source,t),o=[];for(let s of r){let a=new Map(t);a.set(e.loopVar,s);let i=await this.evaluate(e.emit,a);if(i!=null)if(Array.isArray(i))for(let c of i)o.push(c);else o.push(i)}return o}case"list-map":{let r=await this.evaluateList(e.source,t),o=[];for(let s of r){let a=new Map(t);a.set(e.loopVar,s),o.push(await this.evaluate(e.mapBody,a))}return o}case"filter":{let r=await this.evaluateList(e.source,t),o=[];for(let s of r){let a=new Map(t);a.set(e.loopVar,s),await this.evaluate(e.predicate,a)===!0&&o.push(s)}return o}case"partition-by":{let r=await this.evaluateList(e.source,t),o=new Map,s=[];for(let a of r){let i=new Map(t);i.set(e.loopVar,a);let c=await this.evaluate(e.partitionKey,i),l=Dt(c),d=o.get(l);d||(d={kind:"Partition",key:c,members:[]},o.set(l,d),s.push(l)),d.members.push(a)}return s.map(a=>o.get(a))}case"distinct-by":{let r=await this.evaluateList(e.source,t),o=new Set,s=[];for(let a of r){let i=new Map(t);i.set(e.loopVar,a);let c=await this.evaluate(e.distinctKey,i),l=Dt(c);o.has(l)||(o.add(l),s.push(a))}return s}default:{let r=e;throw new z("Unknown expression kind")}}}async evaluateList(e,t){let r=await this.evaluate(e,t);return r==null?[]:Array.isArray(r)?r:[r]}};function Pt(n,e){if(n instanceof xe)return Za(n,e);if(es(n))return T(e,u.key)?n.key:T(e,u.members)?n.members:void 0}function Za(n,e){for(let t of n.statement){let r=At(t);if(!(!r||!T(r,e))&&(t instanceof Ga||t instanceof Xa||t instanceof Ja||t instanceof Et||t instanceof Ya||t instanceof Ct))return t.object}}function Qa(n,e){let t=[];for(let r of n.statement){let o=At(r);if(!(!o||!T(o,e))){if(r instanceof Et)t.push(r.object.subject);else if(r instanceof Ct)for(let s of r.object)s instanceof J&&t.push(s.subject)}}return t}function At(n){return n.predicate?.subject}function cn(n){return n==null?"":typeof n=="string"?n:typeof n=="number"||typeof n=="boolean"?String(n):n instanceof xe?n.name??"":n instanceof J?n.subject.name:we(n)?n.name:""}function Kt(n){return n==null?!1:typeof n=="string"||Array.isArray(n)?n.length>0:typeof n=="boolean"?n===!0:!0}function we(n){return typeof n=="object"&&n!==null&&typeof n.publisher=="string"&&typeof n.package_=="string"&&typeof n.name=="string"}function es(n){return typeof n=="object"&&n!==null&&n.kind==="Partition"&&Array.isArray(n.members)}function de(n,e){if(typeof n=="number"&&Number.isFinite(n))return n;throw new z(`${e} requires numeric elements; got ${rs(n)}`)}function ln(n){if(n instanceof un){let e=n.namespace??"",t=e.indexOf("/"),r=e.indexOf("@",t+1);return t<0||r<0?void 0:{publisher:e.substring(0,t),package_:e.substring(t+1,r),version:e.substring(r+1),name:n.name??""}}if(n instanceof J){let e=n.subject,t=e.version;return{publisher:e.publisher,package_:e.package_,version:t&&typeof t.major=="number"?`${t.major}.${t.minor}.${t.patch}`:"",name:e.name}}if(we(n))return{publisher:n.publisher,package_:n.package_,version:"",name:n.name}}var ns=new Set(["stringValue","text","rawContent","key"]);function ts(n){return typeof n=="string"||typeof n=="number"||typeof n=="boolean"}function rs(n){return n===void 0?"undefined":n===null?"null":Array.isArray(n)?`array(${n.length})`:typeof n}function Dt(n){if(n===void 0)return"\0undef";if(n===null)return"\0null";if(typeof n=="string")return`s:${n}`;if(typeof n=="number")return`n:${n}`;if(typeof n=="boolean")return`b:${n}`;if(n instanceof J){let e=n.subject;return`r:${e.publisher}/${e.package_}/${e.name}`}if(n instanceof xe){let e=n.name??"";return`k:${n.namespace??""}/${e}`}return we(n)?`u:${n.publisher}/${n.package_}/${n.name}`:`o:${JSON.stringify(n)}`}var Ue={"markdown-with-frontmatter":{formatUri:"kanonak.org/transformations/markdown-with-frontmatter",extension:".md"},"plain-markdown":{formatUri:"kanonak.org/transformations/plain-markdown",extension:".md"},toml:{formatUri:"kanonak.org/transformations/toml",extension:".toml"},json:{formatUri:"kanonak.org/transformations/json",extension:".json"},html:{formatUri:"kanonak.org/transformations/html",extension:".html"},svg:{formatUri:"kanonak.org/transformations/svg",extension:".svg"}},W=class extends Error{},G=class{backends=new Map;constructor(){this.register(new Ee),this.register(new Ce),this.register(new Ae),this.register(new _e),this.register(new Re)}register(e){this.backends.set(e.backendUri,e)}async run(e){let t=e.transformationKanonaks??e.allKanonaks,r=ue(e.transformation,t);if(!r.outputs.has(e.outputFormat))throw new W(`Transformation "${r.name}" does not declare output format "${e.outputFormat}". Declared: ${Array.from(r.outputs).join(", ")}`);let o=this.findBackend(e.outputFormat);if(!o)throw new W(`No backend registered for OutputFormat "${e.outputFormat}".`);let s=new Ie(e.repository,e.parser,e.objectParser),a=new je(s,e.allKanonaks);return r.kind==="instance"?this.runInstance(r,e,o,a):this.runSet(r,e,o,a)}async runInstance(e,t,r,o){let s=_t(t.instances,e.inputPattern.requires),a=Rt(s,e.inputPattern.sortBy),i=[];for(let c of a){let l=new Map;l.set("input",c);let d=await o.evaluate(e.rule,l);dn(d,e.name,`input "${c.name}"`);let f=fn(await o.evaluate(e.artifactName,l),e.name,`input "${c.name}"`),m=e.overrides.get(t.outputFormat),g=r.render(d,m);i.push({fileName:f,format:t.outputFormat,content:g,source:{kind:"instance",sourceName:c.name}})}return i}async runSet(e,t,r,o){let s=_t(t.instances,e.inputPattern.requires),a=Rt(s,e.inputPattern.sortBy);return e.partitionBy?this.runSetWithPartition(e,a,t,r,o):this.runSetSingle(e,a,t,r,o)}async runSetSingle(e,t,r,o,s){let a=new Map;a.set("inputs",t);let i=await s.evaluate(e.rule,a);dn(i,e.name,"set");let c=fn(await s.evaluate(e.artifactName,a),e.name,"set"),l=e.overrides.get(r.outputFormat),d=o.render(i,l);return[{fileName:c,format:r.outputFormat,content:d,source:{kind:"set",memberCount:t.length}}]}async runSetWithPartition(e,t,r,o,s){let a=e.partitionBy,i=new Map,c=[];for(let d of t){let f=ss(d,a);if(f==null)continue;let m=is(f),g=i.get(m);g||(g={keyValue:f,keyDisplay:cs(f),members:[]},i.set(m,g),c.push(m)),g.members.push(d)}let l=[];for(let d of c){let f=i.get(d),m=new Map;m.set("inputs",f.members),m.set("key",f.keyValue);let g=await s.evaluate(e.rule,m);dn(g,e.name,`partition "${f.keyDisplay}"`);let b=fn(await s.evaluate(e.artifactName,m),e.name,`partition "${f.keyDisplay}"`),k=e.overrides.get(r.outputFormat),y=o.render(g,k);l.push({fileName:b,format:r.outputFormat,content:y,source:{kind:"set",memberCount:f.members.length,partitionKey:f.keyDisplay}})}return l}findBackend(e){let t=Ue[e];if(t)return this.backends.get(t.formatUri)}};function _t(n,e){return e.length===0?n:n.filter(t=>{for(let r of e)if(!as(t,r))return!1;return!0})}function Rt(n,e){if(e.length===0)return n;let t=[...n];return t.sort((r,o)=>{for(let s of e){let a=It(r,s.byProperty),i=It(o,s.byProperty),c=os(a,i,s.order);if(c!==0)return c}return 0}),t}function It(n,e){for(let t of n.statement){let r=pn(t);if(!(!r||!T(r,e))){if(t instanceof xt||t instanceof Ut||t instanceof Ot)return t.object;if(t instanceof Nt)throw new W(`Sort property "${e.name}" on instance "${n.name??"?"}" resolves to a list \u2014 list-typed properties are not sortable. Use a scalar property.`);if(t instanceof Lt)throw new W(`Sort property "${e.name}" on instance "${n.name??"?"}" resolves to a reference \u2014 reference-typed properties don't have a natural total order. Use a scalar property.`)}}}function os(n,e,t){if(n===void 0&&e===void 0)return 0;if(n===void 0)return t==="ascending"?1:-1;if(e===void 0)return t==="ascending"?-1:1;let r;return typeof n=="number"&&typeof e=="number"?r=n-e:r=String(n).localeCompare(String(e)),t==="ascending"?r:-r}function as(n,e){for(let t of n.statement){let r=pn(t);if(!r||!T(r,e))continue;let o=t.object;if(o!=null&&!(typeof o=="string"&&o.length===0)&&!(Array.isArray(o)&&o.length===0))return!0}return!1}function ss(n,e){for(let t of n.statement){let r=pn(t);if(!(!r||!T(r,e))&&(t instanceof xt||t instanceof Ut||t instanceof Ot||t instanceof Lt||t instanceof Nt))return t.object}}function pn(n){return n.predicate?.subject}function is(n){if(n===void 0)return" undef";if(n===null)return" null";if(typeof n=="string")return`s:${n}`;if(typeof n=="number")return`n:${n}`;if(typeof n=="boolean")return`b:${n}`;if(n instanceof jt){let e=n.subject;return`r:${e.publisher}/${e.package_}/${e.name}`}if(n instanceof Tt){let e=n.name??"";return`k:${n.namespace??""}/${e}`}if(typeof n=="object"&&n!==null&&typeof n.name=="string"&&typeof n.publisher=="string"){let e=n;return`u:${e.publisher}/${e.package_}/${e.name}`}return`o:${JSON.stringify(n)}`}function cs(n){return n==null?"":typeof n=="string"?n:typeof n=="number"||typeof n=="boolean"?String(n):n instanceof jt?n.subject.name:n instanceof Tt?n.name??"":typeof n=="object"&&n!==null&&typeof n.name=="string"?n.name:""}function dn(n,e,t){if(typeof n!="object"||n===null||n.kind!=="Document")throw new W(`Transformation "${e}" rule did not yield a Document for ${t}. Got: ${Vt(n)}`)}function fn(n,e,t){if(typeof n=="string")return n;if(Array.isArray(n)&&n.every(ls))return n.map(r=>String(r)).join("");throw new W(`Transformation "${e}" artifactName did not yield a string for ${t}. Got: ${Vt(n)}`)}function ls(n){return typeof n=="string"||typeof n=="number"||typeof n=="boolean"}function Vt(n){if(n===void 0)return"undefined";if(n===null)return"null";if(Array.isArray(n))return`array(${n.length})`;if(typeof n=="object"){let e=n.kind;return e?`object(kind=${e})`:"object"}return typeof n}function mn(n){return[...A(n,u.InstanceTransformation),...A(n,u.SetTransformation)]}function qt(){let n=new $e("transform").description("Run ontology-driven transformations against Kanonak packages. Transformations are declarative YAML rules (instances of `kanonak.org/transformations/Transformation`) that convert ontology instances into output files. The runner produces one or more Artifacts per matched input; format backends serialize them to Markdown, HTML, SVG, TOML, JSON, or (with post-processing) PDF.").addHelpText("after",`
131
+ `),o}return'<svg xmlns="http://www.w3.org/2000/svg" width="1" height="1"/>'}};import{SubjectKanonak as Ra}from"@kanonak-protocol/sdk";var Ie=class{constructor(e,t,r){this.repository=e;this.parser=t;this.objectParser=r}repository;parser;objectParser;cache=new Map;async resolveSubject(e,t){let r=ke(t,e);if(r)return r;let o=e.version,a=o&&typeof o.major=="number"?`@${o.major}.${o.minor}.${o.patch}`:"",s=`${e.publisher}/${e.package_}${a}`,i=this.cache.get(s);if(!i){let l=await this.repository.getDocumentsByNamespaceAsync(e.publisher,e.package_);if(l.length===0)return;let u=o&&typeof o.major=="number"?l.find(p=>{let g=p.metadata?.namespace_?.version;return g&&g.major===o.major&&g.minor===o.minor&&g.patch===o.patch})??l[0]:l[0],f=new E(u,this.repository);i=await this.objectParser.parseKanonaks(f),this.cache.set(s,i)}let c=ke(i,e);if(c)return c;for(let l of i)if(l instanceof Ra&&l.name===e.name)return l}};import{EmbeddedKanonak as be,ReferenceKanonak as yt,SubjectKanonak as Ia,ListStatement as H,ReferenceStatement as sn,EmbeddedStatement as le,StringStatement as ht,NumberStatement as Ta,BooleanStatement as ja}from"@kanonak-protocol/sdk";var C=class extends Error{constructor(t,r){super(`${t} (at ${r})`);this.path=r}path},ft=16;function ue(n,e){let t=n.name,r={catalog:e,depth:0};if(P(n,d.InstanceTransformation))return xa(n,t,r);if(P(n,d.SetTransformation))return Ua(n,t,r);throw new C("Subject is not a recognized v3 transformation type \u2014 expected InstanceTransformation or SetTransformation",t)}function xa(n,e,t){return{kind:"instance",name:n.name,inputPattern:bt(n,e),rule:Te(n,d.rule,`${e}.rule`,t),artifactName:Te(n,d.artifactName,`${e}.artifactName`,t),outputs:wt(n,`${e}.outputs`),overrides:$t(n,`${e}.formatOverrides`,t)}}function Ua(n,e,t){let r=q(n,d.partitionBy);return{kind:"set",name:n.name,inputPattern:bt(n,e),rule:Te(n,d.rule,`${e}.rule`,t),artifactName:Te(n,d.artifactName,`${e}.artifactName`,t),outputs:wt(n,`${e}.outputs`),overrides:$t(n,`${e}.formatOverrides`,t),partitionBy:r}}function bt(n,e){let t=we(n,d.inputPattern);if(!t)throw new C("inputPattern is required",e);return Oa(t,`${e}.inputPattern`)}function Oa(n,e){let t=q(n,d.matchesClass);if(!t)throw new C("matchesClass is required",e);let r=[];for(let s of x(n,d.requires))if(s instanceof sn)r.push(an(s.object.subject));else if(s instanceof H)for(let i of s.object)i instanceof yt&&r.push(an(i.subject));let o=[],a=0;for(let s of x(n,d.sortBy))if(s instanceof H)for(let i of s.object)i instanceof be&&o.push(mt(i,`${e}.sortBy[${a++}]`));else s instanceof le&&o.push(mt(s.object,`${e}.sortBy[${a++}]`));return{matchesClass:t,requires:r,sortBy:o}}function mt(n,e){let t=q(n,d.byProperty);if(!t)throw new C("SortKey.byProperty is required",e);let r=q(n,d.order);if(!r)throw new C("SortKey.order is required",e);if(T(r,d.ascending))return{byProperty:t,order:"ascending"};if(T(r,d.descending))return{byProperty:t,order:"descending"};throw new C(`SortKey.order must reference tx.ascending or tx.descending; got ${r.publisher}/${r.package_}/${r.name}`,e)}function Te(n,e,t,r){let o=we(n,e);if(!o)throw new C("expression is required",t);return ce(o,t,r)}function ce(n,e,t){if(P(n,d.StringLiteral))return{kind:"string-literal",value:M(n,d.stringLiteral,e)};if(P(n,d.IntegerLiteral))return{kind:"integer-literal",value:kt(n,d.integerLiteral,e)};if(P(n,d.DecimalLiteral))return{kind:"decimal-literal",value:kt(n,d.decimalLiteral,e)};if(P(n,d.BooleanLiteral))return{kind:"boolean-literal",value:za(n,d.booleanLiteral,e)};if(P(n,d.VarRef))return{kind:"var-ref",varName:M(n,d.varName,e)};if(P(n,d.PropertyRead))return{kind:"property-read",source:D(n,d.readSource,`${e}.readSource`,t),readProp:X(n,d.readProp,e,"readProp")};if(P(n,d.Traverse))return{kind:"traverse",source:D(n,d.traverseSource,`${e}.traverseSource`,t),through:X(n,d.through,e,"through"),step:D(n,d.step,`${e}.step`,t)};if(P(n,d.BuildAstNode))return{kind:"build-ast-node",astClass:X(n,d.astClass,e,"astClass"),set:Va(n,`${e}.set`,t)};if(P(n,d.When))return{kind:"when",condition:D(n,d.condition,`${e}.condition`,t),thenBuild:D(n,d.thenBuild,`${e}.thenBuild`,t),elseBuild:Na(n,d.elseBuild,`${e}.elseBuild`,t)};if(P(n,d.Concat))return{kind:"concat",parts:La(n,d.parts,`${e}.parts`,t)};if(P(n,d.Fallback))return{kind:"fallback",primary:D(n,d.primary,`${e}.primary`,t),alternate:D(n,d.alternate,`${e}.alternate`,t)};if(P(n,d.UriName))return{kind:"uri-name",source:D(n,d.uriNameOf,`${e}.uriNameOf`,t)};if(P(n,d.UriPublisher))return{kind:"uri-publisher",source:D(n,d.uriPublisherOf,`${e}.uriPublisherOf`,t)};if(P(n,d.UriPackage))return{kind:"uri-package",source:D(n,d.uriPackageOf,`${e}.uriPackageOf`,t)};if(P(n,d.UriVersion))return{kind:"uri-version",source:D(n,d.uriVersionOf,`${e}.uriVersionOf`,t)};if(P(n,d.SubjectUri))return{kind:"subject-uri",source:D(n,d.subjectOf,`${e}.subjectOf`,t)};if(P(n,d.UriLiteral))return{kind:"uri-literal",refTo:X(n,d.refTo,e,"refTo")};if(P(n,d.DisplayLabel))return{kind:"display-label",labelTarget:X(n,d.labelTarget,e,"labelTarget"),labelSource:X(n,d.labelSource,e,"labelSource")};if(P(n,d.ResolveRef))return{kind:"resolve-ref",source:D(n,d.resolveSource,`${e}.resolveSource`,t)};if(P(n,d.Normalize))return{kind:"normalize",source:D(n,d.normSource,`${e}.normSource`,t),normKind:Fa(n,e)};if(P(n,d.IsSet))return{kind:"is-set",check:D(n,d.checkExpr,`${e}.checkExpr`,t)};if(P(n,d.CallFragment))return Ba(n,e,t);if(P(n,d.Join))return{kind:"join",source:D(n,d.source,`${e}.source`,t),separator:M(n,d.separator,e)};if(P(n,d.Count))return{kind:"count",source:D(n,d.source,`${e}.source`,t)};if(P(n,d.Sum))return{kind:"sum",source:D(n,d.source,`${e}.source`,t)};if(P(n,d.Min))return{kind:"min",source:D(n,d.source,`${e}.source`,t)};if(P(n,d.Max))return{kind:"max",source:D(n,d.source,`${e}.source`,t)};if(P(n,d.Average))return{kind:"average",source:D(n,d.source,`${e}.source`,t)};if(P(n,d.ForEach))return{kind:"for-each",source:D(n,d.source,`${e}.source`,t),loopVar:M(n,d.loopVar,e),emit:D(n,d.emit,`${e}.emit`,t)};if(P(n,d.ListMap))return{kind:"list-map",source:D(n,d.source,`${e}.source`,t),loopVar:M(n,d.loopVar,e),mapBody:D(n,d.mapBody,`${e}.mapBody`,t)};if(P(n,d.Filter))return{kind:"filter",source:D(n,d.source,`${e}.source`,t),loopVar:M(n,d.loopVar,e),predicate:D(n,d.predicate,`${e}.predicate`,t)};if(P(n,d.PartitionBy))return{kind:"partition-by",source:D(n,d.source,`${e}.source`,t),loopVar:M(n,d.loopVar,e),partitionKey:D(n,d.partitionKey,`${e}.partitionKey`,t)};if(P(n,d.DistinctBy))return{kind:"distinct-by",source:D(n,d.source,`${e}.source`,t),loopVar:M(n,d.loopVar,e),distinctKey:D(n,d.distinctKey,`${e}.distinctKey`,t)};throw new C("Expression is not of a recognized v3 type \u2014 embedded has no matching subclass of tx.Expression",e)}function D(n,e,t,r){let o=we(n,e);if(!o)throw new C("child expression is required",t);return ce(o,t,r)}function Na(n,e,t,r){let o=we(n,e);if(o)return ce(o,t,r)}function La(n,e,t,r){let o=[],a=0;for(let s of x(n,e))if(s instanceof H)for(let i of s.object)i instanceof be&&o.push(ce(i,`${t}[${a++}]`,r));else s instanceof le&&o.push(ce(s.object,`${t}[${a++}]`,r));return o}function Va(n,e,t){let r=[],o=0;for(let a of x(n,d.set))if(a instanceof H)for(let s of a.object)s instanceof be&&r.push(pt(s,`${e}[${o++}]`,t));else a instanceof le&&r.push(pt(a.object,`${e}[${o++}]`,t));return r}function pt(n,e,t){return{field:X(n,d.field,e,"field"),value:D(n,d.bindValue,`${e}.bindValue`,t)}}function Fa(n,e){let t=q(n,d.normKind);if(!t)throw new C("normKind is required",e);if(T(t,d.NORM_TRIM_END))return"trim-end";throw new C(`Unknown NormalizeKind: ${t.publisher}/${t.package_}/${t.name}`,e)}function Ba(n,e,t){if(t.depth>=ft)throw new C(`Fragment recursion exceeded MAX_FRAGMENT_DEPTH (${ft})`,e);let r=q(n,d.fragmentRef);if(!r)throw new C("fragmentRef is required",e);let o=Ma(t.catalog,r);if(!o)throw new C(`ExpressionFragment not found: ${r.publisher}/${r.package_}/${r.name}`,e);let a=we(o,d.body);if(!a)throw new C(`ExpressionFragment ${r.name} has no body`,e);return{kind:"call-fragment",body:ce(a,`${e}.fragment(${r.name})`,{catalog:t.catalog,depth:t.depth+1})}}function Ma(n,e){for(let t of n)if(!(!(t instanceof Ia)||t.name!==e.name||!(t.namespace||"").startsWith(`${e.publisher}/${e.package_}@`))&&P(t,d.ExpressionFragment))return t}function wt(n,e){let t=new Set;for(let r of x(n,d.outputs))if(r instanceof sn)t.add(r.object.subject.name);else if(r instanceof H)for(let o of r.object)o instanceof yt&&t.add(o.subject.name);if(t.size===0)throw new C("outputs is required (at least one OutputFormat)",e);return t}function $t(n,e,t){let r=new Map,o=0;for(let a of x(n,d.formatOverrides))if(a instanceof H){for(let s of a.object)if(s instanceof be){let[i,c]=gt(s,`${e}[${o++}]`);r.set(i,c)}}else if(a instanceof le){let[s,i]=gt(a.object,`${e}[${o++}]`);r.set(s,i)}return r}function gt(n,e){let t=q(n,d.formatTarget);if(!t)throw new C("formatTarget is required",e);let r=[];for(let s of x(n,d.metadataKeys))if(s instanceof ht)r.push(s.object);else if(s instanceof H)for(let i of s.object){let c=i.value;typeof c=="string"&&r.push(c)}let o=new Map;for(let s of x(n,d.metadataRenames))if(s instanceof H){for(let i of s.object)if(i instanceof be){let c=he(i,d.fromKey),l=he(i,d.toKey);c&&l&&o.set(c,l)}}else if(s instanceof le){let i=s.object,c=he(i,d.fromKey),l=he(i,d.toKey);c&&l&&o.set(c,l)}let a=St(n,d.trailingNewline);return[t.name,{metadataKeys:r.length>0?r:void 0,metadataRenames:o,trailingNewline:a}]}function Ha(n){return n.predicate?.subject}function x(n,e){let t=[];for(let r of n.statement){let o=Ha(r);o&&T(o,e)&&t.push(r)}return t}function we(n,e){for(let t of x(n,e))if(t instanceof le)return t.object}function q(n,e){for(let t of x(n,e))if(t instanceof sn)return an(t.object.subject)}function he(n,e){for(let t of x(n,e))if(t instanceof ht)return t.object}function qa(n,e){for(let t of x(n,e))if(t instanceof Ta)return t.object}function St(n,e){for(let t of x(n,e))if(t instanceof ja)return t.object}function M(n,e,t){let r=he(n,e);if(r===void 0)throw new C(`${e.name} (string) is required`,t);return r}function kt(n,e,t){let r=qa(n,e);if(r===void 0)throw new C(`${e.name} (number) is required`,t);return r}function za(n,e,t){let r=St(n,e);if(r===void 0)throw new C(`${e.name} (boolean) is required`,t);return r}function X(n,e,t,r){let o=q(n,e);if(!o)throw new C(`${r} (URI reference) is required`,t);return o}function an(n){return{publisher:n.publisher,package_:n.package_,name:n.name}}import{DefinedKanonak as xe,EmbeddedKanonak as Wa,ReferenceKanonak as J,SubjectKanonak as un,StringStatement as Ga,NumberStatement as Xa,BooleanStatement as Ja,ReferenceStatement as Dt,EmbeddedStatement as Ya,ListStatement as Et}from"@kanonak-protocol/sdk";var z=class extends Error{},je=class{constructor(e,t){this.resolver=e;this.catalog=t}resolver;catalog;async evaluate(e,t){switch(e.kind){case"string-literal":return e.value;case"integer-literal":return e.value;case"decimal-literal":return e.value;case"boolean-literal":return e.value;case"uri-literal":return{...e.refTo};case"var-ref":{if(!t.has(e.varName))throw new z(`Unbound variable "${e.varName}"`);return t.get(e.varName)}case"concat":{let r=[];for(let o of e.parts){let a=await this.evaluate(o,t);if(a!=null)if(Array.isArray(a))for(let s of a)r.push(s);else r.push(a)}return r}case"fallback":{let r=await this.evaluate(e.primary,t);return Pt(r)?r:this.evaluate(e.alternate,t)}case"when":return await this.evaluate(e.condition,t)===!0?this.evaluate(e.thenBuild,t):e.elseBuild?this.evaluate(e.elseBuild,t):void 0;case"is-set":{let r=await this.evaluate(e.check,t);return Pt(r)}case"property-read":{let r=await this.evaluate(e.source,t);return vt(r,e.readProp)}case"traverse":{let r=await this.evaluate(e.source,t);if(!(r instanceof xe))return;let o=Qa(r,e.through),a=[];for(let s of o){let i=await this.resolver.resolveSubject(s,this.catalog);if(!i)continue;let c=new Map(t);c.set("input",i);let l=await this.evaluate(e.step,c);l!=null&&a.push(cn(l))}return a.join("")}case"uri-name":{let r=await this.evaluate(e.source,t);return $e(r)?r.name:r instanceof J?r.subject.name:r instanceof un?r.name:r instanceof Wa?r.name??"":void 0}case"uri-publisher":{let r=await this.evaluate(e.source,t);return ln(r)?.publisher}case"uri-package":{let r=await this.evaluate(e.source,t);return ln(r)?.package_}case"uri-version":{let r=await this.evaluate(e.source,t);return ln(r)?.version}case"subject-uri":{let r=await this.evaluate(e.source,t);if(r instanceof un){let o=r.namespace??"",a=r.name??"";return!o||!a?void 0:`${o}/${a}`}if(r instanceof J){let o=r.subject,a=o.version;return a&&typeof a.major=="number"?`${o.publisher}/${o.package_}@${a.major}.${a.minor}.${a.patch}/${o.name}`:`${o.publisher}/${o.package_}/${o.name}`}return}case"display-label":{let r=await this.resolver.resolveSubject({...e.labelTarget},this.catalog);return r?vt(r,e.labelSource):void 0}case"resolve-ref":{let r=await this.evaluate(e.source,t);return r instanceof J?await this.resolver.resolveSubject(r.subject,this.catalog):$e(r)?await this.resolver.resolveSubject(r,this.catalog):void 0}case"normalize":{let r=await this.evaluate(e.source,t),o=r==null?"":cn(r);return e.normKind==="trim-end"?o.replace(/[\s\r\n]+$/u,""):o}case"build-ast-node":{let r={kind:e.astClass.name};for(let o of e.set){let a=await this.evaluate(o.value,t);if(a==null||Array.isArray(a)&&a.length===0)continue;let s=o.field.name;Array.isArray(a)&&ns.has(s)&&a.every(i=>ts(i))&&(a=a.map(i=>String(i)).join("")),r[s]=a}return r}case"call-fragment":return this.evaluate(e.body,t);case"join":return(await this.evaluateList(e.source,t)).map(o=>o==null?"":cn(o)).join(e.separator);case"count":return(await this.evaluateList(e.source,t)).length;case"sum":{let r=await this.evaluateList(e.source,t),o=0;for(let a of r)o+=de(a,"Sum");return o}case"min":{let r=await this.evaluateList(e.source,t);if(r.length===0)throw new z("Min on an empty list is undefined; guard with IsSet");let o=de(r[0],"Min");for(let a=1;a<r.length;a++){let s=de(r[a],"Min");s<o&&(o=s)}return o}case"max":{let r=await this.evaluateList(e.source,t);if(r.length===0)throw new z("Max on an empty list is undefined; guard with IsSet");let o=de(r[0],"Max");for(let a=1;a<r.length;a++){let s=de(r[a],"Max");s>o&&(o=s)}return o}case"average":{let r=await this.evaluateList(e.source,t);if(r.length===0)throw new z("Average on an empty list is undefined; guard with IsSet");let o=0;for(let a of r)o+=de(a,"Average");return o/r.length}case"for-each":{let r=await this.evaluateList(e.source,t),o=[];for(let a of r){let s=new Map(t);s.set(e.loopVar,a);let i=await this.evaluate(e.emit,s);if(i!=null)if(Array.isArray(i))for(let c of i)o.push(c);else o.push(i)}return o}case"list-map":{let r=await this.evaluateList(e.source,t),o=[];for(let a of r){let s=new Map(t);s.set(e.loopVar,a),o.push(await this.evaluate(e.mapBody,s))}return o}case"filter":{let r=await this.evaluateList(e.source,t),o=[];for(let a of r){let s=new Map(t);s.set(e.loopVar,a),await this.evaluate(e.predicate,s)===!0&&o.push(a)}return o}case"partition-by":{let r=await this.evaluateList(e.source,t),o=new Map,a=[];for(let s of r){let i=new Map(t);i.set(e.loopVar,s);let c=await this.evaluate(e.partitionKey,i),l=Kt(c),u=o.get(l);u||(u={kind:"Partition",key:c,members:[]},o.set(l,u),a.push(l)),u.members.push(s)}return a.map(s=>o.get(s))}case"distinct-by":{let r=await this.evaluateList(e.source,t),o=new Set,a=[];for(let s of r){let i=new Map(t);i.set(e.loopVar,s);let c=await this.evaluate(e.distinctKey,i),l=Kt(c);o.has(l)||(o.add(l),a.push(s))}return a}default:{let r=e;throw new z("Unknown expression kind")}}}async evaluateList(e,t){let r=await this.evaluate(e,t);return r==null?[]:Array.isArray(r)?r:[r]}};function vt(n,e){if(n instanceof xe)return Za(n,e);if(es(n))return T(e,d.key)?n.key:T(e,d.members)?n.members:void 0}function Za(n,e){for(let t of n.statement){let r=Ct(t);if(!(!r||!T(r,e))&&(t instanceof Ga||t instanceof Xa||t instanceof Ja||t instanceof Dt||t instanceof Ya||t instanceof Et))return t.object}}function Qa(n,e){let t=[];for(let r of n.statement){let o=Ct(r);if(!(!o||!T(o,e))){if(r instanceof Dt)t.push(r.object.subject);else if(r instanceof Et)for(let a of r.object)a instanceof J&&t.push(a.subject)}}return t}function Ct(n){return n.predicate?.subject}function cn(n){return n==null?"":typeof n=="string"?n:typeof n=="number"||typeof n=="boolean"?String(n):n instanceof xe?n.name??"":n instanceof J?n.subject.name:$e(n)?n.name:""}function Pt(n){return n==null?!1:typeof n=="string"||Array.isArray(n)?n.length>0:typeof n=="boolean"?n===!0:!0}function $e(n){return typeof n=="object"&&n!==null&&typeof n.publisher=="string"&&typeof n.package_=="string"&&typeof n.name=="string"}function es(n){return typeof n=="object"&&n!==null&&n.kind==="Partition"&&Array.isArray(n.members)}function de(n,e){if(typeof n=="number"&&Number.isFinite(n))return n;throw new z(`${e} requires numeric elements; got ${rs(n)}`)}function ln(n){if(n instanceof un){let e=n.namespace??"",t=e.indexOf("/"),r=e.indexOf("@",t+1);return t<0||r<0?void 0:{publisher:e.substring(0,t),package_:e.substring(t+1,r),version:e.substring(r+1),name:n.name??""}}if(n instanceof J){let e=n.subject,t=e.version;return{publisher:e.publisher,package_:e.package_,version:t&&typeof t.major=="number"?`${t.major}.${t.minor}.${t.patch}`:"",name:e.name}}if($e(n))return{publisher:n.publisher,package_:n.package_,version:"",name:n.name}}var ns=new Set(["stringValue","text","rawContent","key"]);function ts(n){return typeof n=="string"||typeof n=="number"||typeof n=="boolean"}function rs(n){return n===void 0?"undefined":n===null?"null":Array.isArray(n)?`array(${n.length})`:typeof n}function Kt(n){if(n===void 0)return"\0undef";if(n===null)return"\0null";if(typeof n=="string")return`s:${n}`;if(typeof n=="number")return`n:${n}`;if(typeof n=="boolean")return`b:${n}`;if(n instanceof J){let e=n.subject;return`r:${e.publisher}/${e.package_}/${e.name}`}if(n instanceof xe){let e=n.name??"";return`k:${n.namespace??""}/${e}`}return $e(n)?`u:${n.publisher}/${n.package_}/${n.name}`:`o:${JSON.stringify(n)}`}var Ue={"markdown-with-frontmatter":{formatUri:"kanonak.org/transformations/markdown-with-frontmatter",extension:".md"},"plain-markdown":{formatUri:"kanonak.org/transformations/plain-markdown",extension:".md"},toml:{formatUri:"kanonak.org/transformations/toml",extension:".toml"},json:{formatUri:"kanonak.org/transformations/json",extension:".json"},html:{formatUri:"kanonak.org/transformations/html",extension:".html"},svg:{formatUri:"kanonak.org/transformations/svg",extension:".svg"}},W=class extends Error{},G=class{backends=new Map;constructor(){this.register(new Ee),this.register(new Ce),this.register(new Ae),this.register(new _e),this.register(new Re)}register(e){this.backends.set(e.backendUri,e)}async run(e){let t=e.transformationKanonaks??e.allKanonaks,r=ue(e.transformation,t);if(!r.outputs.has(e.outputFormat))throw new W(`Transformation "${r.name}" does not declare output format "${e.outputFormat}". Declared: ${Array.from(r.outputs).join(", ")}`);let o=this.findBackend(e.outputFormat);if(!o)throw new W(`No backend registered for OutputFormat "${e.outputFormat}".`);let a=new Ie(e.repository,e.parser,e.objectParser),s=new je(a,e.allKanonaks);return r.kind==="instance"?this.runInstance(r,e,o,s):this.runSet(r,e,o,s)}async runInstance(e,t,r,o){let a=At(t.instances,e.inputPattern.requires),s=_t(a,e.inputPattern.sortBy),i=[];for(let c of s){let l=new Map;l.set("input",c);let u=await o.evaluate(e.rule,l);dn(u,e.name,`input "${c.name}"`);let f=fn(await o.evaluate(e.artifactName,l),e.name,`input "${c.name}"`),p=e.overrides.get(t.outputFormat),g=r.render(u,p);i.push({fileName:f,format:t.outputFormat,content:g,source:{kind:"instance",sourceName:c.name}})}return i}async runSet(e,t,r,o){let a=At(t.instances,e.inputPattern.requires),s=_t(a,e.inputPattern.sortBy);return e.partitionBy?this.runSetWithPartition(e,s,t,r,o):this.runSetSingle(e,s,t,r,o)}async runSetSingle(e,t,r,o,a){let s=new Map;s.set("inputs",t);let i=await a.evaluate(e.rule,s);dn(i,e.name,"set");let c=fn(await a.evaluate(e.artifactName,s),e.name,"set"),l=e.overrides.get(r.outputFormat),u=o.render(i,l);return[{fileName:c,format:r.outputFormat,content:u,source:{kind:"set",memberCount:t.length}}]}async runSetWithPartition(e,t,r,o,a){let s=e.partitionBy,i=new Map,c=[];for(let u of t){let f=ss(u,s);if(f==null)continue;let p=is(f),g=i.get(p);g||(g={keyValue:f,keyDisplay:cs(f),members:[]},i.set(p,g),c.push(p)),g.members.push(u)}let l=[];for(let u of c){let f=i.get(u),p=new Map;p.set("inputs",f.members),p.set("key",f.keyValue);let g=await a.evaluate(e.rule,p);dn(g,e.name,`partition "${f.keyDisplay}"`);let b=fn(await a.evaluate(e.artifactName,p),e.name,`partition "${f.keyDisplay}"`),k=e.overrides.get(r.outputFormat),y=o.render(g,k);l.push({fileName:b,format:r.outputFormat,content:y,source:{kind:"set",memberCount:f.members.length,partitionKey:f.keyDisplay}})}return l}findBackend(e){let t=Ue[e];if(t)return this.backends.get(t.formatUri)}};function At(n,e){return e.length===0?n:n.filter(t=>{for(let r of e)if(!as(t,r))return!1;return!0})}function _t(n,e){if(e.length===0)return n;let t=[...n];return t.sort((r,o)=>{for(let a of e){let s=Rt(r,a.byProperty),i=Rt(o,a.byProperty),c=os(s,i,a.order);if(c!==0)return c}return 0}),t}function Rt(n,e){for(let t of n.statement){let r=mn(t);if(!(!r||!T(r,e))){if(t instanceof jt||t instanceof xt||t instanceof Ut)return t.object;if(t instanceof Nt)throw new W(`Sort property "${e.name}" on instance "${n.name??"?"}" resolves to a list \u2014 list-typed properties are not sortable. Use a scalar property.`);if(t instanceof Ot)throw new W(`Sort property "${e.name}" on instance "${n.name??"?"}" resolves to a reference \u2014 reference-typed properties don't have a natural total order. Use a scalar property.`)}}}function os(n,e,t){if(n===void 0&&e===void 0)return 0;if(n===void 0)return t==="ascending"?1:-1;if(e===void 0)return t==="ascending"?-1:1;let r;return typeof n=="number"&&typeof e=="number"?r=n-e:r=String(n).localeCompare(String(e)),t==="ascending"?r:-r}function as(n,e){for(let t of n.statement){let r=mn(t);if(!r||!T(r,e))continue;let o=t.object;if(o!=null&&!(typeof o=="string"&&o.length===0)&&!(Array.isArray(o)&&o.length===0))return!0}return!1}function ss(n,e){for(let t of n.statement){let r=mn(t);if(!(!r||!T(r,e))&&(t instanceof jt||t instanceof xt||t instanceof Ut||t instanceof Ot||t instanceof Nt))return t.object}}function mn(n){return n.predicate?.subject}function is(n){if(n===void 0)return" undef";if(n===null)return" null";if(typeof n=="string")return`s:${n}`;if(typeof n=="number")return`n:${n}`;if(typeof n=="boolean")return`b:${n}`;if(n instanceof Tt){let e=n.subject;return`r:${e.publisher}/${e.package_}/${e.name}`}if(n instanceof It){let e=n.name??"";return`k:${n.namespace??""}/${e}`}if(typeof n=="object"&&n!==null&&typeof n.name=="string"&&typeof n.publisher=="string"){let e=n;return`u:${e.publisher}/${e.package_}/${e.name}`}return`o:${JSON.stringify(n)}`}function cs(n){return n==null?"":typeof n=="string"?n:typeof n=="number"||typeof n=="boolean"?String(n):n instanceof Tt?n.subject.name:n instanceof It?n.name??"":typeof n=="object"&&n!==null&&typeof n.name=="string"?n.name:""}function dn(n,e,t){if(typeof n!="object"||n===null||n.kind!=="Document")throw new W(`Transformation "${e}" rule did not yield a Document for ${t}. Got: ${Lt(n)}`)}function fn(n,e,t){if(typeof n=="string")return n;if(Array.isArray(n)&&n.every(ls))return n.map(r=>String(r)).join("");throw new W(`Transformation "${e}" artifactName did not yield a string for ${t}. Got: ${Lt(n)}`)}function ls(n){return typeof n=="string"||typeof n=="number"||typeof n=="boolean"}function Lt(n){if(n===void 0)return"undefined";if(n===null)return"null";if(Array.isArray(n))return`array(${n.length})`;if(typeof n=="object"){let e=n.kind;return e?`object(kind=${e})`:"object"}return typeof n}function pn(n){return[...A(n,d.InstanceTransformation),...A(n,d.SetTransformation)]}function Ht(){let n=new Se("transform").description("Run ontology-driven transformations against Kanonak packages. Transformations are declarative YAML rules (instances of `kanonak.org/transformations/Transformation`) that convert ontology instances into output files. The runner produces one or more Artifacts per matched input; format backends serialize them to Markdown, HTML, SVG, TOML, JSON, or (with post-processing) PDF.").addHelpText("after",`
132
132
  Examples:
133
133
 
134
134
  # List every Transformation available in the local workspace
@@ -166,14 +166,14 @@ Examples:
166
166
 
167
167
  # List the registered format backends
168
168
  $ kanonak transform formats
169
- `);return n.addCommand(bs()),n.addCommand(vs()),n.addCommand(Ks()),n.addCommand(Es()),n}function bs(){return new $e("run").description("Run a transformation against an input scope and write the resulting Artifacts to disk.").argument("<transformation>","Transformation URI (`publisher/package/name`, optional `@version`) or just the local name if unique in the workspace.").requiredOption("--scope <scope>","Input source \u2014 either a package URI `publisher/package[@version]` (resolved via the local workspace + cache + HTTP tiers) or a file path to a `.kan.yml` document. Repeatable: pass `--scope X --scope Y` to aggregate matching instances across multiple packages, useful for index pages and other cross-package SetTransformations.",ws,[]).option("--format <name>","OutputFormat name to target (e.g. `markdown-with-frontmatter`, `html`, `svg`, `json`). If omitted and the transformation declares exactly one output, that single format is used.").option("--out <dir>","Directory to write artifacts into.",".").action(async(n,e)=>{try{await $s(n,e)}catch(t){console.error(`Error: ${t.message}`),process.exit(1)}})}function ws(n,e){return[...e,n]}async function $s(n,e){let t=new gn,r=new kn,o=await O(process.cwd(),t),s=await zt(n,o,r),{transformation:a,transformationKanonaks:i}=s;console.log(`Transformation: ${Le(a)}`);let c=ue(a,i);e.scope.length===0&&(console.error("At least one --scope is required."),process.exit(1));let l=[],d=new Map;for(let w of e.scope){let $=await Cs(w,o,t,r);l.push(...$);let v=await Rs($,c.inputPattern.matchesClass,o);for(let K of v){let F=Is(K);F&&!d.has(F)&&d.set(F,K)}console.log(`Scope: ${w} \u2014 found ${v.length} instance(s) of ${c.inputPattern.matchesClass.publisher}/${c.inputPattern.matchesClass.package_}/${c.inputPattern.matchesClass.name}`)}let f=[...d.values()],m=l;e.scope.length>1&&console.log(`Total across ${e.scope.length} scope(s): ${f.length} unique instance(s)`),f.length===0&&c.kind==="instance"&&(console.error("No matching input instances across the supplied scope(s). Check the transformation's inputPattern.matchesClass vs. the scope package(s)."),process.exit(1));let g=Ss(c.outputs,e.format);console.log(`Output format: ${g}`);let b=Ue[g];if(!b)throw new Error(`Unknown format "${g}". Run \`kanonak transform formats\` to see what the runner supports.`);let y=await new G().run({transformation:a,instances:f,allKanonaks:m,transformationKanonaks:i,repository:o,parser:t,objectParser:r,outputFormat:g}),h=gs(e.out);fs(h,{recursive:!0});for(let w of y){let $=_s(w.fileName),v=ms(h,`${$}${b.extension}`);ds(v,w.content,"utf-8"),console.log(` wrote ${v}`)}console.log(`Done. ${y.length} artifact(s) written to ${h}`)}function Ss(n,e){if(e){if(!n.has(e))throw new Error(`Transformation does not declare --format "${e}" in its outputs. Declared outputs: ${Array.from(n).sort().join(", ")}`);return e}if(n.size===1)return Array.from(n)[0];throw new Error(`Transformation supports multiple output formats (${Array.from(n).sort().join(", ")}); pass --format <name> to select one.`)}function vs(){return new $e("list").description("Scan the local workspace + cache for every Transformation instance and print a one-line summary per hit.").action(async()=>{try{await Ps()}catch(n){console.error(`Error: ${n.message}`),process.exit(1)}})}async function Ps(){let n=new gn,e=new kn,t=await O(process.cwd(),n),r=await t.getAllDocumentsAsync(),o=new Map;for(let a of r)try{let i=new E(a,t),c=await e.parseKanonaks(i),l=mn(c);for(let d of l){let f=hn(d);if(!f)continue;let m=o.get(f)??[];m.push({tx:d,kanonaks:c,doc:a}),o.set(f,m)}}catch{}let s=[];for(let a of o.values()){if(a.length===1){s.push(Bt(a[0].tx,a[0].kanonaks));continue}let i=yn(a.map(l=>l.doc));if(!i.chosen)continue;let c=a.find(l=>l.doc===i.chosen);c&&s.push(Bt(c.tx,c.kanonaks))}if(s.length===0){console.log("No Transformation instances found in the current workspace.");return}s.sort((a,i)=>a.uri.localeCompare(i.uri));for(let a of s)console.log(`${a.uri}`),console.log(` matches: ${a.matchesClass}`),console.log(` outputs: ${a.outputs.join(", ")}`)}function Ks(){return new $e("show").description("Compile a transformation and print a human-readable summary (input pattern, outputs, format overrides, rule shape).").argument("<transformation>","Transformation URI or local name").action(async n=>{try{await Ds(n)}catch(e){console.error(`Error: ${e.message}`),process.exit(1)}})}async function Ds(n){let e=new gn,t=new kn,r=await O(process.cwd(),e),{transformation:o,transformationKanonaks:s}=await zt(n,r,t),a=ue(o,s);if(console.log(`Transformation: ${Le(o)}`),console.log(),console.log("Input pattern:"),console.log(` Matches class: ${Oe(a.inputPattern.matchesClass)}`),a.inputPattern.requires.length>0){console.log(" Required properties:");for(let i of a.inputPattern.requires)console.log(` - ${Oe(i)}`)}else console.log(" Required properties: (none)");if(console.log(),console.log(`Outputs: ${Array.from(a.outputs).sort().join(", ")}`),console.log(),a.overrides.size>0){console.log("Format overrides:");for(let[i,c]of a.overrides){if(console.log(` ${i}:`),c.metadataKeys&&console.log(` metadata keys: ${c.metadataKeys.join(", ")}`),c.metadataRenames.size>0){let l=[];for(let[d,f]of c.metadataRenames)l.push(`${d} \u2192 ${f}`);console.log(` metadata renames: ${l.join(", ")}`)}c.trailingNewline!==void 0&&console.log(` trailing newline: ${c.trailingNewline}`)}console.log()}console.log(`Rule root kind: ${a.rule.kind}`),a.rule.kind==="build-ast-node"&&(console.log(`Rule root AST class: ${Oe(a.rule.astClass)}`),console.log(`Rule root bindings: ${a.rule.set.length} field(s)`)),console.log(`Artifact name root kind: ${a.artifactName.kind}`)}function Es(){return new $e("formats").description("List the OutputFormat names the runner can serialize to.").action(()=>{console.log("Registered format backends:");let n=Object.entries(Ue).sort(([e],[t])=>e.localeCompare(t));for(let[e,t]of n)console.log(` ${e.padEnd(28)} ${t.extension.padEnd(6)} ${t.formatUri}`)})}async function zt(n,e,t){let r,o,s;if(n.includes("/")){let m=n.indexOf("@"),g=n;if(m!==-1){let k=n.indexOf("/",m);if(k===-1)throw new Error(`Transformation URI "${n}" has @version but no trailing /<name>`);g=n.substring(0,m)+n.substring(k)}let b=g.split("/");if(b.length<3)throw new Error(`Invalid transformation URI "${n}" \u2014 expected publisher/package/name or publisher/package@version/name`);r=b[0],o=b[1],s=b.slice(2).join("/")}else s=n;if(r&&o){let m=await e.getDocumentsByNamespaceAsync(r,o);if(m.length===0)throw new Error(`Package ${r}/${o} not found in the local workspace or cache.`);let g=As(n),b=Wt(m,g,`${r}/${o}`),k=new E(b,e),y=await t.parseKanonaks(k),h=Ke(y,{publisher:r,package_:o,name:s,version:""});if(!h){let w=mn(y),$=w.find(v=>v.name===s);if(!$)throw new Error(`Transformation "${s}" not found in package ${r}/${o}. Package contains ${w.length} Transformation(s): ${w.map(v=>v.name).join(", ")||"(none)"}`);return{transformation:$,transformationKanonaks:y}}return{transformation:h,transformationKanonaks:y}}let a=await e.getAllDocumentsAsync(),i=new Map;for(let m of a)try{let g=new E(m,e),b=await t.parseKanonaks(g),k=mn(b);for(let y of k){if(y.name!==s)continue;let h=hn(y);if(!h)continue;let w=i.get(h)??[];w.push({tx:y,kanonaks:b,doc:m}),i.set(h,w)}}catch{}if(i.size===0)throw new Error(`No Transformation named "${s}" found in the workspace. Try \`kanonak transform list\` to see available transformations.`);if(i.size>1){let m=Array.from(i.keys()).sort().join(`
170
- `);throw new Error(`Multiple Transformations named "${s}" in the workspace \u2014 disambiguate with a full publisher/package/name URI:
171
- ${m}`)}let c=Array.from(i.values())[0];if(c.length===1)return{transformation:c[0].tx,transformationKanonaks:c[0].kanonaks};let l=new Map(c.map(m=>[m.doc,m])),d=yn(c.map(m=>m.doc));if(!d.chosen)throw new Error(`Could not select a Transformation version for "${s}".`);let f=l.get(d.chosen);if(d.multipleVersionsPresent){let m=k=>{let y=k.metadata.namespace_?.version;return y?Ht(y):""},g=f.tx.namespace??"",b=g.includes("@")?g.substring(0,g.indexOf("@")):g;console.warn(`Warning: Transformation "${s}" has ${c.length} versions present (${c.map(k=>m(k.doc)).filter(Boolean).join(", ")}); using @${m(d.chosen)}. Pin with ${b}@<version>/${s} to suppress this warning.`)}return{transformation:f.tx,transformationKanonaks:f.kanonaks}}async function Cs(n,e,t,r){if(/^[.\/\\]/.test(n)||/^[A-Za-z]:/.test(n)||n.endsWith(".kan.yml")||Ft(n)&&ps(n).isFile()){if(!Ft(n))throw new Error(`Scope file not found: ${n}`);let b=us(n,"utf-8"),k=t.parse(b),y=new E(k,e);return r.parseKanonaks(y)}let s=n.indexOf("@"),a=s===-1?n:n.substring(0,s),i=s===-1?void 0:n.substring(s+1),c=a.indexOf("/");if(c===-1)throw new Error(`Invalid scope "${n}" \u2014 expected a file path or publisher/package[@version] URI`);let l=a.substring(0,c),d=a.substring(c+1),f=await e.getDocumentsByNamespaceAsync(l,d);if(f.length===0)throw new Error(`Scope package ${l}/${d} not found in the local workspace or cache.`);let m=Wt(f,i,`${l}/${d}`),g=new E(m,e);return r.parseKanonaks(g)}function As(n){let e=n.indexOf("@");if(e===-1)return;let t=n.substring(e+1),r=t.indexOf("/");return r===-1?t:t.substring(0,r)}function Wt(n,e,t){let r=s=>{let a=s.metadata.namespace_?.version;return a?Ht(a):""},o=yn(n,{requestedVersion:e});if(o.exactRequestedVersionMissing){let s=n.map(r).filter(Boolean).sort().join(", ");throw new Error(`${t}@${e} not found in the local workspace or cache. Available versions: ${s||"(none with parseable namespace)"}`)}if(!o.chosen)throw new Error(`${t} not found in the local workspace or cache.`);return!e&&o.multipleVersionsPresent&&console.warn(`Warning: ${t} has ${n.length} versions present (${n.map(r).filter(Boolean).join(", ")}); using @${r(o.chosen)}. Pin with ${t}@<version> to suppress this warning.`),o.chosen}function Bt(n,e){try{let t=ue(n,e);return{uri:Le(n),matchesClass:Oe(t.inputPattern.matchesClass),outputs:Array.from(t.outputs).sort()}}catch(t){return{uri:Le(n),matchesClass:`(compile error: ${t.message})`,outputs:[]}}}function Le(n){let e=n.namespace||"",t=e.indexOf("@");return`${t===-1?e:e.substring(0,t)}/${n.name}`}function Oe(n){return`${n.publisher}/${n.package_}/${n.name}`}function _s(n){return n.replace(/[\\/:*?"<>|\s]+/g,"_").replace(/^_+|_+$/g,"")}async function Rs(n,e,t){let r=new Map;for(let a of n){if(!(a instanceof ks))continue;let i=hn(a);i&&r.set(i,a)}let o=[];try{o=(await new ys({vocabulary:new hs}).reason(t)).getInstancesOfClass(Mt(e.publisher,e.package_,e.name))}catch{}let s=[];for(let a of o){let i=r.get(a);i&&s.push(i)}return s.length>0?s:A(n,e)}function hn(n){let e=n.namespace??"",t=e.indexOf("@"),r=t===-1?e:e.substring(0,t),o=r.indexOf("/");return o===-1||!n.name?null:Mt(r.substring(0,o),r.substring(o+1),n.name)}function Is(n){let e=n.namespace??"";return!e||!n.name?null:`${e}/${n.name}`}import{Command as Ts}from"commander";import{KanonakParser as js,PublisherIndex as Gt,CredentialStore as Xt,createAuthenticatedFetch as Jt,FileSystemKanonakDocumentRepository as xs,Reasoner as Us,KanonakVocabulary as Os,getGlobalCachePath as Ls,makeUriKey as Ns}from"@kanonak-protocol/sdk";function Vs(n){let e=n.split("/");if(e.length!==3)return null;let[t,r,o]=e;return!t||!r||!o?null:{publisher:t,package_:r,name:o}}function Yt(){return new Ts("search").description("Browse a publisher's catalogue or find instances of a class via the SDK reasoner").argument("<publisher>","Publisher domain (e.g. kanonak.org)").option("--type <uri>","Class URI to search for, in publisher/package/Name form").action(async(n,e)=>{e.type?await Bs(n,e.type):await Fs(n)})}async function Fs(n){let e=new Xt,t=Jt(e),r=new Gt({fetchFn:t}),o;try{o=await r.listLatestPackages(n)}catch(a){console.error(`Failed to fetch publisher index for ${n}: ${a.message}`),process.exit(1)}if(o.length===0){console.log(`No packages found at ${n}.`);return}console.log(`Packages published by ${n}:
172
- `);let s=o.reduce((a,i)=>Math.max(a,i.packageName.length),0);for(let{packageName:a,version:i}of o)console.log(` ${a.padEnd(s)} @${i}`)}async function Bs(n,e){let t=Vs(e);t||(console.error(`Invalid --type value: ${e}`),console.error("Expected: publisher/package/Name (e.g. kanonak.org/capabilities/Capability)"),process.exit(1));let r=new js,o=new Xt,s=Jt(o),a=new Gt({fetchFn:s}),i=new U,c=new Set,l=[];try{l=await a.listLatestPackages(n)}catch(y){console.error(`Failed to fetch publisher index for ${n}: ${y.message}`),process.exit(1)}for(let{packageName:y,version:h}of l)c.add(`${n}|${y}|${h}`);await bn(a,i,s,"kanonak.org","core-rdf",c),await bn(a,i,s,"kanonak.org","core-owl",c),await bn(a,i,s,t.publisher,t.package_,c);for(let y of c){let[h,w,$]=y.split("|");if(!i.has(h,w,$))try{let v=await a.getPackageUrl(h,w,$),K=await s(v,h);if(!K.ok){console.error(`Warning: failed to fetch ${h}/${w}@${$}: ${K.status} ${K.statusText}`);continue}let F=await K.text();i.put(h,w,$,F)}catch(v){console.error(`Warning: failed to fetch ${h}/${w}@${$}: ${v.message}`)}}let d=new xs(Ls(),!0,r),m=await new Us({vocabulary:new Os}).reason(d),g=Ns(t.publisher,t.package_,t.name),k=m.getInstancesOfClass(g).filter(y=>y!==g);if(k.length===0){console.log(`No instances of ${g} found in ${n}'s catalogue.`);return}console.log(`Instances of ${g} in ${n}'s catalogue:
173
- `),k.sort();for(let y of k)console.log(` ${y}`)}async function bn(n,e,t,r,o,s){try{let a=await n.getHighestVersion(r,o);if(!a)return;s.add(`${r}|${o}|${a}`)}catch{}}import{Command as Zt}from"commander";function fe(n){return`${R}/${I}/${n}`}var wn={[fe("fetch-and-deploy")]:(n,e,t,r)=>n.add(e,t[0],r),[fe("remove-deployed")]:(n,e,t,r)=>n.remove(e,t[0],r),[fe("list-deployed")]:(n,e,t,r)=>n.list(e,r),[fe("update-deployed")]:(n,e,t,r)=>n.update(e,t[0],r),[fe("search-available")]:(n,e,t,r)=>n.search(e,r),[fe("show-info")]:(n,e,t,r)=>n.info(e,t[0],r)};function Qt(n,e,t){for(let r of e){let o=new Zt(r.commandName).description(r.description.trim());for(let s of r.commands){let a=o.command(Ms(s));a.description(s.description);for(let i of s.arguments)if(i.isOption){let c=i.defaultValue!=null?`--${i.argumentName} [value]`:`--${i.argumentName} <value>`;a.option(c,"",i.defaultValue)}a.action(async(...i)=>{let c=Hs(i);await qs(t,r,s,i,c)})}n.addCommand(o)}}function Ms(n){let e=n.arguments.filter(t=>!t.isOption).map(t=>t.required?`<${t.argumentName}>`:`[${t.argumentName}]`);return[n.subcommandName,...e].join(" ")}function Hs(n){for(let e=n.length-1;e>=0;e--)if(n[e]&&typeof n[e]=="object"&&!(n[e]instanceof Zt))return n[e];return{}}async function qs(n,e,t,r,o){let s=[];for(let i of r)if(typeof i=="string")s.push(i);else break;t.actionKey||(console.error(`Capability subcommand '${t.subcommandName}' has no resolved \`performs:\` Action. Every CapabilityCommand must declare a performs value pointing at a named Action instance from the capabilities ontology. Known actions: ${Object.keys(wn).join(", ")}.`),process.exit(1));let a=wn[t.actionKey];a||(console.error(`Capability subcommand '${t.subcommandName}' references unknown Action '${t.actionKey}'. Known actions: ${Object.keys(wn).join(", ")}.`),process.exit(1)),await a(n,e,s,o)}import{existsSync as er,readFileSync as zs,statSync as nr}from"fs";import{resolve as Ws}from"path";import{KanonakObjectParser as Gs,PublisherIndex as $n,PublisherConfigResolver as Xs,formatVersion as tr,pickHighestDocument as Js}from"@kanonak-protocol/sdk";var Ne=class{constructor(e,t,r,o,s,a){this.fileCache=e;this.parser=t;this.publisherIndex=r;this.fetchFn=o;this.handlerRegistry=s;this.repository=a}fileCache;parser;publisherIndex;fetchFn;handlerRegistry;repository;objectParser=new Gs;async add(e,t,r){let o=this.tryLoadFromLocalFile(t);if(o){this.fileCache.put(o.publisher,o.packageName,o.version,o.content),await this.deployFromDoc(e,o.doc,o.publisher,o.packageName,o.version,void 0,`local file ${t}`,r);return}let s=ne(t);s||(console.error(`Invalid package reference: "${t}"`),console.error(""),console.error("Accepted forms:"),console.error(" publisher/package (install all instances, latest version)"),console.error(" publisher/package@version (install all instances, pinned)"),console.error(" publisher/package/instance (install one instance, latest version)"),console.error(" publisher/package@version/instance (install one instance, pinned)"),console.error(" ./path/to/file.kan.yml (install all instances from a local document)"),console.error(""),console.error("Tip: copy a URI directly from `kanonak "+e.commandName+" search`."),process.exit(1));let{publisher:a,packageName:i,version:c,instanceName:l}=s,d=await this.repository.getDocumentsByNamespaceAsync(a,i);if(d.length>0){let g=Js(d,{requestedVersion:c??void 0});if(g.chosen){let b=g.chosen.metadata.namespace_;(!b||!b.version)&&(console.error(`Document for ${a}/${i} is missing namespace metadata.`),process.exit(1));let k=tr(b.version);this.fileCache.put(a,i,k,this.parser.save(g.chosen)),await this.deployFromDoc(e,g.chosen,a,i,k,l??void 0,`${a}/${i}@${k}`,r);return}}let f=c??await this.publisherIndex.getHighestVersion(a,i);f||(console.error(`Could not resolve version for "${a}/${i}".`),await this.printPackageSuggestions(a,i,e.commandName),process.exit(1));let m=this.fileCache.get(a,i,f);if(!m){let g=await this.publisherIndex.getPackageUrl(a,i,f),b=await this.fetchFn(g,a);b.ok||(b.status===404?(console.error(`Package ${a}/${i}@${f} not found at ${g}.`),console.error(`The publisher index lists this version but the file is missing \u2014 it may have been unpublished. Try \`kanonak ${e.commandName} search\` to see the current catalogue.`)):console.error(`Failed to fetch ${g} (${b.status} ${b.statusText}).`),process.exit(1)),m=await b.text(),this.fileCache.put(a,i,f,m)}await this.deployFromDoc(e,this.parser.parse(m),a,i,f,l??void 0,`${a}/${i}@${f}`,r)}tryLoadFromLocalFile(e){if(!(/^[.\/\\]/.test(e)||/^[A-Za-z]:[\\/]/.test(e)||e.endsWith(".kan.yml")||er(e)&&nr(e).isFile()))return;let r=Ws(e);(!er(r)||!nr(r).isFile())&&(console.error(`Local file not found: ${e}`),process.exit(1));let o=zs(r,"utf-8"),s=this.parser.parse(o),a=s.metadata.namespace_;return(!a||!a.version)&&(console.error(`${e} has no namespace metadata; cannot determine publisher/package/version. A Kanonak document must declare \`type: Package\` with publisher and version.`),process.exit(1)),{doc:s,content:o,publisher:a.publisher,packageName:a.package_,version:tr(a.version)}}async deployFromDoc(e,t,r,o,s,a,i,c){let l=new E(t,this.repository),d=await this.objectParser.parseKanonaks(l),f=rr(e.managesTypeKey);f||(console.error(`Capability "${e.commandName}" has no resolved managesType.`),process.exit(1));let m=A(d,f);m.length===0&&(console.error(`${i} does not contain any ${L(f)} instances.`),process.exit(1));let g=m;if(a&&(g=m.filter(y=>y.name===a),g.length===0)){console.error(`Instance "${a}" not found in ${i}.`),console.error(""),console.error(`Available ${L(f)} instance(s):`);for(let y of m)console.error(` - ${y.name}`);console.error(""),console.error("To install all of them, drop the instance suffix:"),console.error(` kanonak ${e.commandName} add ${r}/${o}`),process.exit(1)}let b=a?`${a} from ${i}`:`${g.length} ${L(f)} instance(s) from ${i}`;console.log(`Installing ${b}...`);let k=this.handlerRegistry.get(e.deploymentTargetKey);k?await k.deploy({instances:g,allKanonaks:d,repository:this.repository,options:c}):console.log(`Cached ${r}/${o}@${s} (no deployment handler for "${e.deploymentTargetKey}")`)}async printPackageSuggestions(e,t,r){let o;try{o=await this.publisherIndex.listLatestPackages(e)}catch{return}let s=o.map(a=>({name:a.packageName,version:a.version,score:Ys(t,a.packageName)})).filter(a=>a.score>0).sort((a,i)=>i.score-a.score).slice(0,5);if(s.length!==0){console.error(""),console.error("Did you mean one of:");for(let a of s)console.error(` kanonak ${r} add ${e}/${a.name}`)}}async remove(e,t,r){await this.requireHandler(e).undeploy(t,{repository:this.repository,options:r})}async list(e,t){let o=await this.requireHandler(e).list({repository:this.repository,options:t}),s=e.managesTypeKey||"managed";if(o.length===0){console.log(`No ${s} instances installed.`);return}console.log(`Installed ${s} instances:
174
- `);for(let a of o){let i=a.publisher?`${a.publisher}/${a.package_}@${a.version}`:"unmanaged";console.log(` ${a.name} (${i}) ${a.path}`)}}async update(e,t,r){let s=await this.requireHandler(e).list({repository:this.repository,options:r}),a=t?s.filter(c=>c.name===t):s.filter(c=>c.publisher);if(a.length===0){console.log(t?`"${t}" not found.`:"No managed instances to update.");return}let i=0;for(let c of a){let l=await this.publisherIndex.getHighestVersion(c.publisher,c.package_);!l||l===c.version||(console.log(`Updating ${c.name}: ${c.version} \u2192 ${l}`),await this.add(e,`${c.publisher}/${c.package_}@${l}`,r),i++)}console.log(i===0?"All instances are up to date.":`
175
- Updated ${i} instance(s).`)}async search(e,t){let r=t.publisher??"kanonak.org",o=rr(e.managesTypeKey);if(!o){console.error("Capability has no resolved managesType; nothing to search for.");return}console.log(`Searching ${r} for ${L(o)} instances...
176
- `);let s=new Xs,a=await s.getConfig(r),i=s.resolveIndexUrl(r,a),c=await this.fetchFn(i,r);if(!c.ok){console.error(`Failed to fetch package index from ${r}.`);return}let l=await c.text(),d=$n.parseIndex(l);if(d.size===0){console.error(`No packages found for publisher "${r}".`);return}let f=new Map;for(let[k,y]of d){let h=[...y].sort((w,$)=>{let v=$n.parseVersion(w),K=$n.parseVersion($);return!v||!K?0:v.major!==K.major?K.major-v.major:v.minor!==K.minor?K.minor-v.minor:K.patch-v.patch});f.set(k,h[0])}let m=[],g=0;for(let[k,y]of f){let h=this.fileCache.get(r,k,y);if(!h)try{let w=await this.publisherIndex.getPackageUrl(r,k,y),$=await this.fetchFn(w,r);if(!$.ok)continue;h=await $.text(),this.fileCache.put(r,k,y,h)}catch{continue}try{let w=this.parser.parse(h),$=new E(w,this.repository),v=await this.objectParser.parseKanonaks($),K=A(v,o);for(let F of K)m.push({publisher:r,package_:k,version:y,subject:F});g++}catch{continue}}if(m.length===0){console.log(`No ${L(o)} instances found across ${g} package(s).`);return}console.log(`Found ${m.length} ${L(o)} instance(s) in ${g} package(s):
177
- `);let b=new Map;for(let k of m){let y=`${k.publisher}/${k.package_}@${k.version}`,h=b.get(y);h?h.push(k):b.set(y,[k])}for(let[k,y]of b){let h=y[0],w=`${h.publisher}/${h.package_}`,$=y.length===1;console.log(` ${k}`),console.log(` ${y.length} skill${$?"":"s"}:`);for(let v of y)console.log(` - ${v.subject.name}`);if(console.log(""),$)console.log(" install:"),console.log(` kanonak ${e.commandName} add ${w}/${h.subject.name}`);else{console.log(" install one of them:");for(let v of y)console.log(` kanonak ${e.commandName} add ${w}/${v.subject.name}`);console.log(" install all of them:"),console.log(` kanonak ${e.commandName} add ${w}`)}console.log("")}}async info(e,t,r){let a=(await this.requireHandler(e).list({repository:this.repository,options:r})).find(i=>i.name===t);a||(console.error(`"${t}" is not installed.`),process.exit(1)),console.log(`Name: ${a.name}`),console.log(`Type: ${e.managesTypeKey||"n/a"}`),console.log(`Publisher: ${a.publisher||"unmanaged"}`),console.log(`Package: ${a.package_||"n/a"}`),console.log(`Version: ${a.version||"n/a"}`),console.log(`Path: ${a.path}`)}requireHandler(e){let t=this.handlerRegistry.get(e.deploymentTargetKey);return t||(console.error(`No deployment handler registered for "${e.deploymentTargetKey}". Ensure the capability's deploymentTarget resolves to a DeploymentTarget instance whose URI is registered in the CLI at startup.`),process.exit(1)),t}};function rr(n){if(!n)return;let e=n.split("/");if(e.length===3)return{publisher:e[0],package_:e[1],name:e[2]}}function Ys(n,e){let t=n.toLowerCase(),r=e.toLowerCase();if(t===r)return 100;if(r.includes(t)||t.includes(r))return 50;let o=new Set(t.split("-").filter(Boolean)),s=new Set(r.split("-").filter(Boolean)),a=0;for(let c of o)s.has(c)&&a++;if(a>0)return a*10;let i=Zs(t,r);return i===0?100:i<=2?Math.max(1,20-i*5):0}function Zs(n,e){if(n===e)return 0;if(n.length===0)return e.length;if(e.length===0)return n.length;let t=new Array(e.length+1),r=new Array(e.length+1);for(let o=0;o<=e.length;o++)t[o]=o;for(let o=0;o<n.length;o++){r[0]=o+1;for(let s=0;s<e.length;s++){let a=n[o]===e[s]?0:1;r[s+1]=Math.min(r[s]+1,t[s+1]+1,t[s]+a)}for(let s=0;s<=e.length;s++)t[s]=r[s]}return t[e.length]}var Ve=class{handlers=new Map;register(e,t){this.handlers.set(e,t)}get(e){return this.handlers.get(e)??null}};import{mkdirSync as li,rmSync as ui,existsSync as Me,readdirSync as di,writeFileSync as fi}from"fs";import{join as He}from"path";import{KanonakObjectParser as pi,KanonakParser as mi,computeIntegrity as gi}from"@kanonak-protocol/sdk";import{join as Sn}from"path";import{homedir as or}from"os";import{KanonakObjectParser as Qs}from"@kanonak-protocol/sdk";var Y="kanonak.org",Z="agent-skills",sr={publisher:Y,package_:Z,name:"Client"},ir={publisher:Y,package_:Z,name:"clientId"},ei={publisher:Y,package_:Z,name:"projectSkillDir"},ni={publisher:Y,package_:Z,name:"userSkillDir"},ti={publisher:Y,package_:Z,name:"skillFileName"},cr="agents";async function Se(n,e){let t=(n.client??lr()??cr).toLowerCase(),r=n.scope??"project",o=await dr(t,e);if(!o){let i=await ri(e);throw new Error(`Unknown client "${t}". Known clients: ${i.join(", ")||"(none)"}. Add a Client instance to a package that imports kanonak.org/agent-skills and install that package to make it available.`)}let a=_(o,r==="user"?ni:ei);if(!a)throw new Error(`Client "${t}" has no ${r==="user"?"userSkillDir":"projectSkillDir"} declared.`);return oi(a)}async function Fe(n,e,t){let r=await Se(e,t);return Sn(r,n)}async function vn(n,e){let t=(n.client??lr()??cr).toLowerCase(),r=await dr(t,e);return r?_(r,ti)??"SKILL.md":"SKILL.md"}function lr(){if(process.env.CLAUDE_CODE||process.env.CLAUDE_PROJECT_DIR)return"claude-code"}var ar=new WeakMap;async function ur(n){let e=ar.get(n);if(e)return e;let t=await n.getDocumentsByNamespaceAsync(Y,Z);if(t.length===0)throw new Error(`Could not find ${Y}/${Z} in the repository. Install a skill capability (which transitively imports agent-skills) or fetch agent-skills directly to populate the cache.`);let o=[...t].sort((c,l)=>{let d=c.metadata.namespace_?.version,f=l.metadata.namespace_?.version;return!d||!f?0:d.major!==f.major?f.major-d.major:d.minor!==f.minor?f.minor-d.minor:f.patch-d.patch})[0],s=new Qs,a=new E(o,n),i=await s.parseKanonaks(a);return ar.set(n,i),i}async function dr(n,e){let t=await ur(e),r=A(t,sr);for(let o of r)if(_(o,ir)===n)return o}async function ri(n){let e=await ur(n),t=A(e,sr),r=[];for(let o of t){let s=_(o,ir);s&&r.push(s)}return r}function oi(n){return n.startsWith("~/")?Sn(or(),n.slice(2)):n==="~"?or():n.startsWith("/")||/^[A-Za-z]:[\\/]/.test(n)?n:Sn(process.cwd(),n)}import{readFileSync as ai,writeFileSync as si,existsSync as ii}from"fs";import{join as fr}from"path";import pr from"js-yaml";var mr="skills.lock",ci=`# This file is generated by Kanonak CLI. Do not edit manually.
178
- `;function Be(n){let e=fr(n,mr);if(!ii(e))return{version:"1",lastUpdated:new Date().toISOString(),skills:{}};let t=ai(e,"utf-8"),r=pr.load(t);return!r||typeof r!="object"||r.version!=="1"?{version:"1",lastUpdated:new Date().toISOString(),skills:{}}:{version:"1",lastUpdated:r.lastUpdated??new Date().toISOString(),skills:r.skills??{}}}function Pn(n,e){e.lastUpdated=new Date().toISOString();let t={};for(let s of Object.keys(e.skills).sort())t[s]=e.skills[s];e.skills=t;let r=fr(n,mr),o=pr.dump(e,{lineWidth:-1,sortKeys:!1,quotingType:'"'});si(r,ci+o,"utf-8")}var gr="kanonak.org",kr="skill-to-skill-md",qe=class{parser=new mi;objectParser=new pi;runner=new G;async deploy(e){let{instances:t,allKanonaks:r,repository:o,options:s}=e;if(t.length===0){console.error("No Skill instances to deploy.");return}let a=await ki(o,this.objectParser);if(!a){console.error(`Cannot deploy: ${gr}/${kr}@3.0.0 is not installed in the workspace or cache.`);return}let i=await this.runner.run({transformation:a,instances:t,allKanonaks:r,repository:o,parser:this.parser,objectParser:this.objectParser,outputFormat:"markdown-with-frontmatter"});if(i.length===0){console.error("No skills could be transformed from the package.");return}let c=await Se(s,o),l=await vn(s,o),d=Be(c),f=t[0].namespace,{publisher:m,package_:g,version:b}=yi(f);for(let k of i){let y=await Fe(k.fileName,s,o),h=Me(He(y,l));li(y,{recursive:!0}),fi(He(y,l),k.content,"utf-8"),d.skills[k.fileName]={publisher:m,package_:g,version:b,resolved:m?`kanonak://${m}/${g}@${b}`:"",integrity:gi(k.content)},console.log(` ${h?"Updated":"Installed"} skill "${k.fileName}" \u2192 ${y}`)}Pn(c,d)}async undeploy(e,t){let{repository:r,options:o}=t,s=await Fe(e,o,r);Me(s)||(console.error(`Skill "${e}" is not installed at ${s}`),process.exit(1)),ui(s,{recursive:!0,force:!0});let a=await Se(o,r),i=Be(a);delete i.skills[e],Pn(a,i),console.log(`Removed skill "${e}" from ${s}`)}async list(e){let{repository:t,options:r}=e,o=await Se(r,t),s=Be(o),a=[];for(let[c,l]of Object.entries(s.skills))a.push({name:c,publisher:l.publisher,package_:l.package_,version:l.version,path:await Fe(c,r,t)});let i=await vn(r,t);if(Me(o))try{let c=di(o,{withFileTypes:!0});for(let l of c){if(!l.isDirectory()||s.skills[l.name])continue;let d=He(o,l.name,i);Me(d)&&a.push({name:l.name,publisher:"",package_:"",version:"",path:He(o,l.name)})}}catch{}return a}};async function ki(n,e){let t=await n.getDocumentsByNamespaceAsync(gr,kr);if(t.length===0)return;let r=new E(t[0],n),o=await e.parseKanonaks(r);return A(o,u.InstanceTransformation)[0]}function yi(n){if(!n)return{publisher:"",package_:"",version:""};let e=n.indexOf("@");if(e===-1)return{publisher:"",package_:"",version:""};let t=n.substring(0,e),r=n.substring(e+1),o=t.indexOf("/");return o===-1?{publisher:"",package_:"",version:""}:{publisher:t.substring(0,o),package_:t.substring(o+1),version:r}}import{mkdirSync as Ri,rmSync as Ii,existsSync as Dn,readdirSync as Ti,writeFileSync as ji,statSync as xi}from"fs";import{join as Ge}from"path";import{KanonakObjectParser as Ui,KanonakParser as Oi,computeIntegrity as Li}from"@kanonak-protocol/sdk";import{join as yr}from"path";import{homedir as hr}from"os";import{KanonakObjectParser as hi}from"@kanonak-protocol/sdk";var Q="kanonak.org",ee="agent-skills",wr={publisher:Q,package_:ee,name:"Client"},$r={publisher:Q,package_:ee,name:"clientId"},bi={publisher:Q,package_:ee,name:"projectAgentDir"},wi={publisher:Q,package_:ee,name:"userAgentDir"},$i={publisher:Q,package_:ee,name:"agentFileFormat"},Si="agents";function vi(){if(process.env.CLAUDE_CODE||process.env.CLAUDE_PROJECT_DIR)return"claude-code"}async function ze(n,e){let t=(n.client??vi()??Si).toLowerCase(),r=n.scope??"project",o=await Pi(t,e);if(!o){let d=await Ki(e);throw new Error(`Unknown client "${t}". Known clients: ${d.join(", ")||"(none)"}. Add a Client instance to a package that imports kanonak.org/agent-skills and install that package to make it available.`)}let a=_(o,r==="user"?wi:bi);if(!a)throw new Error(`Client "${t}" has no ${r==="user"?"userAgentDir":"projectAgentDir"} declared.`);let c=se(o,$i)?.name==="toml"?"toml":"markdown-frontmatter",l=c==="toml"?".toml":".md";return{agentsDir:Di(a),format:c,fileExtension:l}}var br=new WeakMap;async function Sr(n){let e=br.get(n);if(e)return e;let t=await n.getDocumentsByNamespaceAsync(Q,ee);if(t.length===0)throw new Error(`Could not find ${Q}/${ee} in the repository. Install a capability that imports agent-skills to populate the cache.`);let o=[...t].sort((c,l)=>{let d=c.metadata.namespace_?.version,f=l.metadata.namespace_?.version;return!d||!f?0:d.major!==f.major?f.major-d.major:d.minor!==f.minor?f.minor-d.minor:f.patch-d.patch})[0],s=new hi,a=new E(o,n),i=await s.parseKanonaks(a);return br.set(n,i),i}async function Pi(n,e){let t=await Sr(e),r=A(t,wr);for(let o of r)if(_(o,$r)===n)return o}async function Ki(n){let e=await Sr(n),t=A(e,wr),r=[];for(let o of t){let s=_(o,$r);s&&r.push(s)}return r}function Di(n){return n.startsWith("~/")?yr(hr(),n.slice(2)):n==="~"?hr():n.startsWith("/")||/^[A-Za-z]:[\\/]/.test(n)?n:yr(process.cwd(),n)}import{readFileSync as Ei,writeFileSync as Ci,existsSync as Ai}from"fs";import{join as vr}from"path";import Pr from"js-yaml";var Kr="agents.lock",_i=`# This file is generated by Kanonak CLI. Do not edit manually.
179
- `;function We(n){let e=vr(n,Kr);if(!Ai(e))return{version:"1",lastUpdated:new Date().toISOString(),agents:{}};let t=Ei(e,"utf-8"),r=Pr.load(t);return!r||typeof r!="object"||r.version!=="1"?{version:"1",lastUpdated:new Date().toISOString(),agents:{}}:{version:"1",lastUpdated:r.lastUpdated??new Date().toISOString(),agents:r.agents??{}}}function Kn(n,e){e.lastUpdated=new Date().toISOString();let t={};for(let s of Object.keys(e.agents).sort())t[s]=e.agents[s];e.agents=t;let r=vr(n,Kr),o=Pr.dump(e,{lineWidth:-1,sortKeys:!1,quotingType:'"'});Ci(r,_i+o,"utf-8")}var Dr="kanonak.org",Er="agent-to-agent-file",Xe=class{parser=new Oi;objectParser=new Ui;runner=new G;async deploy(e){let{instances:t,allKanonaks:r,repository:o,options:s}=e;if(t.length===0){console.error("No Agent instances to deploy.");return}let{agentsDir:a,format:i,fileExtension:c}=await ze(s,o),l=await Ni(o,this.objectParser);if(!l){console.error(`Cannot deploy: ${Dr}/${Er}@3.0.0 is not installed in the workspace or cache.`);return}let d=i==="toml"?"toml":"markdown-with-frontmatter",f=await this.runner.run({transformation:l,instances:t,allKanonaks:r,repository:o,parser:this.parser,objectParser:this.objectParser,outputFormat:d});if(f.length===0){console.error("No agents could be transformed from the package.");return}Ri(a,{recursive:!0});let m=We(a),g=t[0].namespace,{publisher:b,package_:k,version:y}=Fi(g);for(let h of f){let w=`${h.fileName}${c}`,$=Ge(a,w),v=Dn($);ji($,h.content,"utf-8"),m.agents[h.fileName]={publisher:b,package_:k,version:y,resolved:b?`kanonak://${b}/${k}@${y}`:"",integrity:Li(h.content),fileName:w},console.log(` ${v?"Updated":"Installed"} agent "${h.fileName}" \u2192 ${$}`)}Kn(a,m)}async undeploy(e,t){let{repository:r,options:o}=t,{agentsDir:s}=await ze(o,r),a=We(s),i=a.agents[e];i||(console.error(`Agent "${e}" is not installed at ${s}`),process.exit(1));let c=Ge(s,i.fileName);Dn(c)&&Ii(c,{force:!0}),delete a.agents[e],Kn(s,a),console.log(`Removed agent "${e}" from ${c}`)}async list(e){let{repository:t,options:r}=e,{agentsDir:o}=await ze(r,t),s=We(o),a=[];for(let[i,c]of Object.entries(s.agents))a.push({name:i,publisher:c.publisher,package_:c.package_,version:c.version,path:Ge(o,c.fileName)});if(Dn(o))try{let i=Ti(o,{withFileTypes:!0});for(let c of i){if(!c.isFile()||c.name==="agents.lock")continue;let l=Ge(o,c.name),d=Vi(c.name);if(!s.agents[d]){try{if(!xi(l).isFile())continue}catch{continue}a.push({name:d,publisher:"",package_:"",version:"",path:l})}}}catch{}return a}};async function Ni(n,e){let t=await n.getDocumentsByNamespaceAsync(Dr,Er);if(t.length===0)return;let r=new E(t[0],n),o=await e.parseKanonaks(r);return A(o,u.InstanceTransformation)[0]}function Vi(n){let e=n.lastIndexOf(".");return e===-1?n:n.substring(0,e)}function Fi(n){if(!n)return{publisher:"",package_:"",version:""};let e=n.indexOf("@");if(e===-1)return{publisher:"",package_:"",version:""};let t=n.substring(0,e),r=n.substring(e+1),o=t.indexOf("/");return o===-1?{publisher:"",package_:"",version:""}:{publisher:t.substring(0,o),package_:t.substring(o+1),version:r}}var Yi=qi(Hi(import.meta.url)),Zi=JSON.parse(Mi(zi(Yi,"..","package.json"),"utf-8")),V=new Bi;V.name("kanonak").description("Kanonak Protocol CLI - Validate and resolve Kanonak ontology packages").version(Zi.version);V.command("validate <path>").description("Validate .kan.yml file(s). Resolves imports via HTTP from publisher domains.").action(async n=>{await Rn(n)});V.command("install [package]").description("Install a package and its dependencies, or install all from kanonak.lock.").action(async n=>{await In(n)});V.command("deps <path>").description("Show resolved dependency tree for a .kan.yml file.").action(async n=>{await jn(n)});V.command("login <publisher>").description("Authenticate with a package publisher using OAuth 2.0.").action(async n=>{await Nn(n)});V.command("logout <publisher>").description("Revoke tokens and remove stored credentials for a publisher.").action(async n=>{await Vn(n)});V.addCommand(nt());V.addCommand(qt());V.addCommand(Yt());async function Qi(){try{let n=new U,e=new Wi,t=new Xi,r=Ji(t),o=new Gi({fetchFn:r}),s=await O(process.cwd(),e),a=new Ve;a.register("kanonak.org/capabilities/agent-skill-deployment",new qe),a.register("kanonak.org/agent-capabilities/agent-instance-deployment",new Xe);let i=await Zn(n,e,s),c=new Ne(n,e,o,r,a,s);Qt(V,i,c)}catch{}}await Qi();V.parse();
169
+ `);return n.addCommand(bs()),n.addCommand(vs()),n.addCommand(Ks()),n.addCommand(Es()),n}function bs(){return new Se("run").description("Run a transformation against an input scope and write the resulting Artifacts to disk.").argument("<transformation>","Transformation URI (`publisher/package/name`, optional `@version`) or just the local name if unique in the workspace.").requiredOption("--scope <scope>","Input source \u2014 either a package URI `publisher/package[@version]` (resolved via the local workspace + cache + HTTP tiers) or a file path to a `.kan.yml` document. Repeatable: pass `--scope X --scope Y` to aggregate matching instances across multiple packages, useful for index pages and other cross-package SetTransformations.",ws,[]).option("--format <name>","OutputFormat name to target (e.g. `markdown-with-frontmatter`, `html`, `svg`, `json`). If omitted and the transformation declares exactly one output, that single format is used.").option("--out <dir>","Directory to write artifacts into.",".").action(async(n,e)=>{try{await $s(n,e)}catch(t){console.error(`Error: ${t.message}`),process.exit(1)}})}function ws(n,e){return[...e,n]}async function $s(n,e){let t=new gn,r=new kn,o=await O(process.cwd(),t),a=await qt(n,o,r),{transformation:s,transformationKanonaks:i}=a;console.log(`Transformation: ${Ne(s)}`);let c=ue(s,i);e.scope.length===0&&(console.error("At least one --scope is required."),process.exit(1));let l=[],u=new Map;for(let w of e.scope){let $=await Cs(w,o,t,r);l.push(...$);let v=await Rs($,c.inputPattern.matchesClass,o);for(let K of v){let F=Is(K);F&&!u.has(F)&&u.set(F,K)}console.log(`Scope: ${w} \u2014 found ${v.length} instance(s) of ${c.inputPattern.matchesClass.publisher}/${c.inputPattern.matchesClass.package_}/${c.inputPattern.matchesClass.name}`)}let f=[...u.values()],p=l;e.scope.length>1&&console.log(`Total across ${e.scope.length} scope(s): ${f.length} unique instance(s)`),f.length===0&&c.kind==="instance"&&(console.error("No matching input instances across the supplied scope(s). Check the transformation's inputPattern.matchesClass vs. the scope package(s)."),process.exit(1));let g=Ss(c.outputs,e.format);console.log(`Output format: ${g}`);let b=Ue[g];if(!b)throw new Error(`Unknown format "${g}". Run \`kanonak transform formats\` to see what the runner supports.`);let y=await new G().run({transformation:s,instances:f,allKanonaks:p,transformationKanonaks:i,repository:o,parser:t,objectParser:r,outputFormat:g}),h=gs(e.out);fs(h,{recursive:!0});for(let w of y){let $=_s(w.fileName),v=ps(h,`${$}${b.extension}`);ds(v,w.content,"utf-8"),console.log(` wrote ${v}`)}console.log(`Done. ${y.length} artifact(s) written to ${h}`)}function Ss(n,e){if(e){if(!n.has(e))throw new Error(`Transformation does not declare --format "${e}" in its outputs. Declared outputs: ${Array.from(n).sort().join(", ")}`);return e}if(n.size===1)return Array.from(n)[0];throw new Error(`Transformation supports multiple output formats (${Array.from(n).sort().join(", ")}); pass --format <name> to select one.`)}function vs(){return new Se("list").description("Scan the local workspace + cache for every Transformation instance and print a one-line summary per hit.").action(async()=>{try{await Ps()}catch(n){console.error(`Error: ${n.message}`),process.exit(1)}})}async function Ps(){let n=new gn,e=new kn,t=await O(process.cwd(),n),r=await t.getAllDocumentsAsync(),o=new Map;for(let s of r)try{let i=new E(s,t),c=await e.parseKanonaks(i),l=pn(c);for(let u of l){let f=hn(u);if(!f)continue;let p=o.get(f)??[];p.push({tx:u,kanonaks:c,doc:s}),o.set(f,p)}}catch{}let a=[];for(let s of o.values()){if(s.length===1){a.push(Ft(s[0].tx,s[0].kanonaks));continue}let i=yn(s.map(l=>l.doc));if(!i.chosen)continue;let c=s.find(l=>l.doc===i.chosen);c&&a.push(Ft(c.tx,c.kanonaks))}if(a.length===0){console.log("No Transformation instances found in the current workspace.");return}a.sort((s,i)=>s.uri.localeCompare(i.uri));for(let s of a)console.log(`${s.uri}`),console.log(` matches: ${s.matchesClass}`),console.log(` outputs: ${s.outputs.join(", ")}`)}function Ks(){return new Se("show").description("Compile a transformation and print a human-readable summary (input pattern, outputs, format overrides, rule shape).").argument("<transformation>","Transformation URI or local name").action(async n=>{try{await Ds(n)}catch(e){console.error(`Error: ${e.message}`),process.exit(1)}})}async function Ds(n){let e=new gn,t=new kn,r=await O(process.cwd(),e),{transformation:o,transformationKanonaks:a}=await qt(n,r,t),s=ue(o,a);if(console.log(`Transformation: ${Ne(o)}`),console.log(),console.log("Input pattern:"),console.log(` Matches class: ${Oe(s.inputPattern.matchesClass)}`),s.inputPattern.requires.length>0){console.log(" Required properties:");for(let i of s.inputPattern.requires)console.log(` - ${Oe(i)}`)}else console.log(" Required properties: (none)");if(console.log(),console.log(`Outputs: ${Array.from(s.outputs).sort().join(", ")}`),console.log(),s.overrides.size>0){console.log("Format overrides:");for(let[i,c]of s.overrides){if(console.log(` ${i}:`),c.metadataKeys&&console.log(` metadata keys: ${c.metadataKeys.join(", ")}`),c.metadataRenames.size>0){let l=[];for(let[u,f]of c.metadataRenames)l.push(`${u} \u2192 ${f}`);console.log(` metadata renames: ${l.join(", ")}`)}c.trailingNewline!==void 0&&console.log(` trailing newline: ${c.trailingNewline}`)}console.log()}console.log(`Rule root kind: ${s.rule.kind}`),s.rule.kind==="build-ast-node"&&(console.log(`Rule root AST class: ${Oe(s.rule.astClass)}`),console.log(`Rule root bindings: ${s.rule.set.length} field(s)`)),console.log(`Artifact name root kind: ${s.artifactName.kind}`)}function Es(){return new Se("formats").description("List the OutputFormat names the runner can serialize to.").action(()=>{console.log("Registered format backends:");let n=Object.entries(Ue).sort(([e],[t])=>e.localeCompare(t));for(let[e,t]of n)console.log(` ${e.padEnd(28)} ${t.extension.padEnd(6)} ${t.formatUri}`)})}async function qt(n,e,t){let r,o,a;if(n.includes("/")){let p=n.indexOf("@"),g=n;if(p!==-1){let k=n.indexOf("/",p);if(k===-1)throw new Error(`Transformation URI "${n}" has @version but no trailing /<name>`);g=n.substring(0,p)+n.substring(k)}let b=g.split("/");if(b.length<3)throw new Error(`Invalid transformation URI "${n}" \u2014 expected publisher/package/name or publisher/package@version/name`);r=b[0],o=b[1],a=b.slice(2).join("/")}else a=n;if(r&&o){let p=await e.getDocumentsByNamespaceAsync(r,o);if(p.length===0)throw new Error(`Package ${r}/${o} not found in the local workspace or cache.`);let g=As(n),b=zt(p,g,`${r}/${o}`),k=new E(b,e),y=await t.parseKanonaks(k),h=ke(y,{publisher:r,package_:o,name:a,version:""});if(!h){let w=pn(y),$=w.find(v=>v.name===a);if(!$)throw new Error(`Transformation "${a}" not found in package ${r}/${o}. Package contains ${w.length} Transformation(s): ${w.map(v=>v.name).join(", ")||"(none)"}`);return{transformation:$,transformationKanonaks:y}}return{transformation:h,transformationKanonaks:y}}let s=await e.getAllDocumentsAsync(),i=new Map;for(let p of s)try{let g=new E(p,e),b=await t.parseKanonaks(g),k=pn(b);for(let y of k){if(y.name!==a)continue;let h=hn(y);if(!h)continue;let w=i.get(h)??[];w.push({tx:y,kanonaks:b,doc:p}),i.set(h,w)}}catch{}if(i.size===0)throw new Error(`No Transformation named "${a}" found in the workspace. Try \`kanonak transform list\` to see available transformations.`);if(i.size>1){let p=Array.from(i.keys()).sort().join(`
170
+ `);throw new Error(`Multiple Transformations named "${a}" in the workspace \u2014 disambiguate with a full publisher/package/name URI:
171
+ ${p}`)}let c=Array.from(i.values())[0];if(c.length===1)return{transformation:c[0].tx,transformationKanonaks:c[0].kanonaks};let l=new Map(c.map(p=>[p.doc,p])),u=yn(c.map(p=>p.doc));if(!u.chosen)throw new Error(`Could not select a Transformation version for "${a}".`);let f=l.get(u.chosen);if(u.multipleVersionsPresent){let p=k=>{let y=k.metadata.namespace_?.version;return y?Mt(y):""},g=f.tx.namespace??"",b=g.includes("@")?g.substring(0,g.indexOf("@")):g;console.warn(`Warning: Transformation "${a}" has ${c.length} versions present (${c.map(k=>p(k.doc)).filter(Boolean).join(", ")}); using @${p(u.chosen)}. Pin with ${b}@<version>/${a} to suppress this warning.`)}return{transformation:f.tx,transformationKanonaks:f.kanonaks}}async function Cs(n,e,t,r){if(/^[.\/\\]/.test(n)||/^[A-Za-z]:/.test(n)||n.endsWith(".kan.yml")||Vt(n)&&ms(n).isFile()){if(!Vt(n))throw new Error(`Scope file not found: ${n}`);let b=us(n,"utf-8"),k=t.parse(b),y=new E(k,e);return r.parseKanonaks(y)}let a=n.indexOf("@"),s=a===-1?n:n.substring(0,a),i=a===-1?void 0:n.substring(a+1),c=s.indexOf("/");if(c===-1)throw new Error(`Invalid scope "${n}" \u2014 expected a file path or publisher/package[@version] URI`);let l=s.substring(0,c),u=s.substring(c+1),f=await e.getDocumentsByNamespaceAsync(l,u);if(f.length===0)throw new Error(`Scope package ${l}/${u} not found in the local workspace or cache.`);let p=zt(f,i,`${l}/${u}`),g=new E(p,e);return r.parseKanonaks(g)}function As(n){let e=n.indexOf("@");if(e===-1)return;let t=n.substring(e+1),r=t.indexOf("/");return r===-1?t:t.substring(0,r)}function zt(n,e,t){let r=a=>{let s=a.metadata.namespace_?.version;return s?Mt(s):""},o=yn(n,{requestedVersion:e});if(o.exactRequestedVersionMissing){let a=n.map(r).filter(Boolean).sort().join(", ");throw new Error(`${t}@${e} not found in the local workspace or cache. Available versions: ${a||"(none with parseable namespace)"}`)}if(!o.chosen)throw new Error(`${t} not found in the local workspace or cache.`);return!e&&o.multipleVersionsPresent&&console.warn(`Warning: ${t} has ${n.length} versions present (${n.map(r).filter(Boolean).join(", ")}); using @${r(o.chosen)}. Pin with ${t}@<version> to suppress this warning.`),o.chosen}function Ft(n,e){try{let t=ue(n,e);return{uri:Ne(n),matchesClass:Oe(t.inputPattern.matchesClass),outputs:Array.from(t.outputs).sort()}}catch(t){return{uri:Ne(n),matchesClass:`(compile error: ${t.message})`,outputs:[]}}}function Ne(n){let e=n.namespace||"",t=e.indexOf("@");return`${t===-1?e:e.substring(0,t)}/${n.name}`}function Oe(n){return`${n.publisher}/${n.package_}/${n.name}`}function _s(n){return n.replace(/[\\/:*?"<>|\s]+/g,"_").replace(/^_+|_+$/g,"")}async function Rs(n,e,t){let r=new Map;for(let s of n){if(!(s instanceof ks))continue;let i=hn(s);i&&r.set(i,s)}let o=[];try{o=(await new ys({vocabulary:new hs}).reason(t)).getInstancesOfClass(Bt(e.publisher,e.package_,e.name))}catch{}let a=[];for(let s of o){let i=r.get(s);i&&a.push(i)}return a.length>0?a:A(n,e)}function hn(n){let e=n.namespace??"",t=e.indexOf("@"),r=t===-1?e:e.substring(0,t),o=r.indexOf("/");return o===-1||!n.name?null:Bt(r.substring(0,o),r.substring(o+1),n.name)}function Is(n){let e=n.namespace??"";return!e||!n.name?null:`${e}/${n.name}`}import{Command as Ts}from"commander";import{KanonakParser as js,PublisherIndex as Wt,CredentialStore as Gt,createAuthenticatedFetch as Xt,FileSystemKanonakDocumentRepository as xs,Reasoner as Us,KanonakVocabulary as Os,getGlobalCachePath as Ns,makeUriKey as Ls}from"@kanonak-protocol/sdk";function Vs(n){let e=n.split("/");if(e.length!==3)return null;let[t,r,o]=e;return!t||!r||!o?null:{publisher:t,package_:r,name:o}}function Jt(){return new Ts("search").description("Browse a publisher's catalogue or find instances of a class via the SDK reasoner").argument("<publisher>","Publisher domain (e.g. kanonak.org)").option("--type <uri>","Class URI to search for, in publisher/package/Name form").action(async(n,e)=>{e.type?await Bs(n,e.type):await Fs(n)})}async function Fs(n){let e=new Gt,t=Xt(e),r=new Wt({fetchFn:t}),o;try{o=await r.listLatestPackages(n)}catch(s){console.error(`Failed to fetch publisher index for ${n}: ${s.message}`),process.exit(1)}if(o.length===0){console.log(`No packages found at ${n}.`);return}console.log(`Packages published by ${n}:
172
+ `);let a=o.reduce((s,i)=>Math.max(s,i.packageName.length),0);for(let{packageName:s,version:i}of o)console.log(` ${s.padEnd(a)} @${i}`)}async function Bs(n,e){let t=Vs(e);t||(console.error(`Invalid --type value: ${e}`),console.error("Expected: publisher/package/Name (e.g. kanonak.org/capabilities/Capability)"),process.exit(1));let r=new js,o=new Gt,a=Xt(o),s=new Wt({fetchFn:a}),i=new U,c=new Set,l=[];try{l=await s.listLatestPackages(n)}catch(y){console.error(`Failed to fetch publisher index for ${n}: ${y.message}`),process.exit(1)}for(let{packageName:y,version:h}of l)c.add(`${n}|${y}|${h}`);await bn(s,i,a,"kanonak.org","core-rdf",c),await bn(s,i,a,"kanonak.org","core-owl",c),await bn(s,i,a,t.publisher,t.package_,c);for(let y of c){let[h,w,$]=y.split("|");if(!i.has(h,w,$))try{let v=await s.getPackageUrl(h,w,$),K=await a(v,h);if(!K.ok){console.error(`Warning: failed to fetch ${h}/${w}@${$}: ${K.status} ${K.statusText}`);continue}let F=await K.text();i.put(h,w,$,F)}catch(v){console.error(`Warning: failed to fetch ${h}/${w}@${$}: ${v.message}`)}}let u=new xs(Ns(),!0,r),p=await new Us({vocabulary:new Os}).reason(u),g=Ls(t.publisher,t.package_,t.name),k=p.getInstancesOfClass(g).filter(y=>y!==g);if(k.length===0){console.log(`No instances of ${g} found in ${n}'s catalogue.`);return}console.log(`Instances of ${g} in ${n}'s catalogue:
173
+ `),k.sort();for(let y of k)console.log(` ${y}`)}async function bn(n,e,t,r,o,a){try{let s=await n.getHighestVersion(r,o);if(!s)return;a.add(`${r}|${o}|${s}`)}catch{}}import{Command as Yt}from"commander";function fe(n){return`${R}/${I}/${n}`}var wn={[fe("fetch-and-deploy")]:(n,e,t,r)=>n.add(e,t[0],r),[fe("remove-deployed")]:(n,e,t,r)=>n.remove(e,t[0],r),[fe("list-deployed")]:(n,e,t,r)=>n.list(e,r),[fe("update-deployed")]:(n,e,t,r)=>n.update(e,t[0],r),[fe("search-available")]:(n,e,t,r)=>n.search(e,r),[fe("show-info")]:(n,e,t,r)=>n.info(e,t[0],r)};function Zt(n,e,t){for(let r of e){let o=new Yt(r.commandName).description(r.description.trim());for(let a of r.commands){let s=o.command(Ms(a));s.description(a.description);for(let i of a.arguments)if(i.isOption){let c=i.defaultValue!=null?`--${i.argumentName} [value]`:`--${i.argumentName} <value>`;s.option(c,"",i.defaultValue)}s.action(async(...i)=>{let c=Hs(i);await qs(t,r,a,i,c)})}n.addCommand(o)}}function Ms(n){let e=n.arguments.filter(t=>!t.isOption).map(t=>t.required?`<${t.argumentName}>`:`[${t.argumentName}]`);return[n.subcommandName,...e].join(" ")}function Hs(n){for(let e=n.length-1;e>=0;e--)if(n[e]&&typeof n[e]=="object"&&!(n[e]instanceof Yt))return n[e];return{}}async function qs(n,e,t,r,o){let a=[];for(let i of r)if(typeof i=="string")a.push(i);else break;t.actionKey||(console.error(`Capability subcommand '${t.subcommandName}' has no resolved \`performs:\` Action. Every CapabilityCommand must declare a performs value pointing at a named Action instance from the capabilities ontology. Known actions: ${Object.keys(wn).join(", ")}.`),process.exit(1));let s=wn[t.actionKey];s||(console.error(`Capability subcommand '${t.subcommandName}' references unknown Action '${t.actionKey}'. Known actions: ${Object.keys(wn).join(", ")}.`),process.exit(1)),await s(n,e,a,o)}import{existsSync as Qt,readFileSync as zs,statSync as er}from"fs";import{resolve as Ws}from"path";import{KanonakObjectParser as Gs,PublisherIndex as $n,PublisherConfigResolver as Xs,formatVersion as nr,pickHighestDocument as Js}from"@kanonak-protocol/sdk";var Le=class{constructor(e,t,r,o,a,s){this.fileCache=e;this.parser=t;this.publisherIndex=r;this.fetchFn=o;this.handlerRegistry=a;this.repository=s}fileCache;parser;publisherIndex;fetchFn;handlerRegistry;repository;objectParser=new Gs;async add(e,t,r){let o=this.tryLoadFromLocalFile(t);if(o){this.fileCache.put(o.publisher,o.packageName,o.version,o.content),await this.deployFromDoc(e,o.doc,o.publisher,o.packageName,o.version,void 0,`local file ${t}`,r);return}let a=ne(t);a||(console.error(`Invalid package reference: "${t}"`),console.error(""),console.error("Accepted forms:"),console.error(" publisher/package (install all instances, latest version)"),console.error(" publisher/package@version (install all instances, pinned)"),console.error(" publisher/package/instance (install one instance, latest version)"),console.error(" publisher/package@version/instance (install one instance, pinned)"),console.error(" ./path/to/file.kan.yml (install all instances from a local document)"),console.error(""),console.error("Tip: copy a URI directly from `kanonak "+e.commandName+" search`."),process.exit(1));let{publisher:s,packageName:i,version:c,instanceName:l}=a,u=await this.repository.getDocumentsByNamespaceAsync(s,i);if(u.length>0){let g=Js(u,{requestedVersion:c??void 0});if(g.chosen){let b=g.chosen.metadata.namespace_;(!b||!b.version)&&(console.error(`Document for ${s}/${i} is missing namespace metadata.`),process.exit(1));let k=nr(b.version);this.fileCache.put(s,i,k,this.parser.save(g.chosen)),await this.deployFromDoc(e,g.chosen,s,i,k,l??void 0,`${s}/${i}@${k}`,r);return}}let f=c??await this.publisherIndex.getHighestVersion(s,i);f||(console.error(`Could not resolve version for "${s}/${i}".`),await this.printPackageSuggestions(s,i,e.commandName),process.exit(1));let p=this.fileCache.get(s,i,f);if(!p){let g=await this.publisherIndex.getPackageUrl(s,i,f),b=await this.fetchFn(g,s);b.ok||(b.status===404?(console.error(`Package ${s}/${i}@${f} not found at ${g}.`),console.error(`The publisher index lists this version but the file is missing \u2014 it may have been unpublished. Try \`kanonak ${e.commandName} search\` to see the current catalogue.`)):console.error(`Failed to fetch ${g} (${b.status} ${b.statusText}).`),process.exit(1)),p=await b.text(),this.fileCache.put(s,i,f,p)}await this.deployFromDoc(e,this.parser.parse(p),s,i,f,l??void 0,`${s}/${i}@${f}`,r)}tryLoadFromLocalFile(e){if(!(/^[.\/\\]/.test(e)||/^[A-Za-z]:[\\/]/.test(e)||e.endsWith(".kan.yml")||Qt(e)&&er(e).isFile()))return;let r=Ws(e);(!Qt(r)||!er(r).isFile())&&(console.error(`Local file not found: ${e}`),process.exit(1));let o=zs(r,"utf-8"),a=this.parser.parse(o),s=a.metadata.namespace_;return(!s||!s.version)&&(console.error(`${e} has no namespace metadata; cannot determine publisher/package/version. A Kanonak document must declare \`type: Package\` with publisher and version.`),process.exit(1)),{doc:a,content:o,publisher:s.publisher,packageName:s.package_,version:nr(s.version)}}async deployFromDoc(e,t,r,o,a,s,i,c){let l=new E(t,this.repository),u=await this.objectParser.parseKanonaks(l),f=tr(e.managesTypeKey);f||(console.error(`Capability "${e.commandName}" has no resolved managesType.`),process.exit(1));let p=A(u,f);p.length===0&&(console.error(`${i} does not contain any ${N(f)} instances.`),process.exit(1));let g=p;if(s&&(g=p.filter(y=>y.name===s),g.length===0)){console.error(`Instance "${s}" not found in ${i}.`),console.error(""),console.error(`Available ${N(f)} instance(s):`);for(let y of p)console.error(` - ${y.name}`);console.error(""),console.error("To install all of them, drop the instance suffix:"),console.error(` kanonak ${e.commandName} add ${r}/${o}`),process.exit(1)}let b=s?`${s} from ${i}`:`${g.length} ${N(f)} instance(s) from ${i}`;console.log(`Installing ${b}...`);let k=this.handlerRegistry.get(e.deploymentTargetKey);k?await k.deploy({instances:g,allKanonaks:u,repository:this.repository,options:c}):console.log(`Cached ${r}/${o}@${a} (no deployment handler for "${e.deploymentTargetKey}")`)}async printPackageSuggestions(e,t,r){let o;try{o=await this.publisherIndex.listLatestPackages(e)}catch{return}let a=o.map(s=>({name:s.packageName,version:s.version,score:Ys(t,s.packageName)})).filter(s=>s.score>0).sort((s,i)=>i.score-s.score).slice(0,5);if(a.length!==0){console.error(""),console.error("Did you mean one of:");for(let s of a)console.error(` kanonak ${r} add ${e}/${s.name}`)}}async remove(e,t,r){await this.requireHandler(e).undeploy(t,{repository:this.repository,options:r})}async list(e,t){let o=await this.requireHandler(e).list({repository:this.repository,options:t}),a=e.managesTypeKey||"managed";if(o.length===0){console.log(`No ${a} instances installed.`);return}console.log(`Installed ${a} instances:
174
+ `);for(let s of o){let i=s.publisher?`${s.publisher}/${s.package_}@${s.version}`:"unmanaged";console.log(` ${s.name} (${i}) ${s.path}`)}}async update(e,t,r){let a=await this.requireHandler(e).list({repository:this.repository,options:r}),s=t?a.filter(c=>c.name===t):a.filter(c=>c.publisher);if(s.length===0){console.log(t?`"${t}" not found.`:"No managed instances to update.");return}let i=0;for(let c of s){let l=await this.publisherIndex.getHighestVersion(c.publisher,c.package_);!l||l===c.version||(console.log(`Updating ${c.name}: ${c.version} \u2192 ${l}`),await this.add(e,`${c.publisher}/${c.package_}@${l}`,r),i++)}console.log(i===0?"All instances are up to date.":`
175
+ Updated ${i} instance(s).`)}async search(e,t){let r=t.publisher??"kanonak.org",o=tr(e.managesTypeKey);if(!o){console.error("Capability has no resolved managesType; nothing to search for.");return}console.log(`Searching ${r} for ${N(o)} instances...
176
+ `);let a=new Xs,s=await a.getConfig(r),i=a.resolveIndexUrl(r,s),c=await this.fetchFn(i,r);if(!c.ok){console.error(`Failed to fetch package index from ${r}.`);return}let l=await c.text(),u=$n.parseIndex(l);if(u.size===0){console.error(`No packages found for publisher "${r}".`);return}let f=new Map;for(let[k,y]of u){let h=[...y].sort((w,$)=>{let v=$n.parseVersion(w),K=$n.parseVersion($);return!v||!K?0:v.major!==K.major?K.major-v.major:v.minor!==K.minor?K.minor-v.minor:K.patch-v.patch});f.set(k,h[0])}let p=[],g=0;for(let[k,y]of f){let h=this.fileCache.get(r,k,y);if(!h)try{let w=await this.publisherIndex.getPackageUrl(r,k,y),$=await this.fetchFn(w,r);if(!$.ok)continue;h=await $.text(),this.fileCache.put(r,k,y,h)}catch{continue}try{let w=this.parser.parse(h),$=new E(w,this.repository),v=await this.objectParser.parseKanonaks($),K=A(v,o);for(let F of K)p.push({publisher:r,package_:k,version:y,subject:F});g++}catch{continue}}if(p.length===0){console.log(`No ${N(o)} instances found across ${g} package(s).`);return}console.log(`Found ${p.length} ${N(o)} instance(s) in ${g} package(s):
177
+ `);let b=new Map;for(let k of p){let y=`${k.publisher}/${k.package_}@${k.version}`,h=b.get(y);h?h.push(k):b.set(y,[k])}for(let[k,y]of b){let h=y[0],w=`${h.publisher}/${h.package_}`,$=y.length===1;console.log(` ${k}`),console.log(` ${y.length} skill${$?"":"s"}:`);for(let v of y)console.log(` - ${v.subject.name}`);if(console.log(""),$)console.log(" install:"),console.log(` kanonak ${e.commandName} add ${w}/${h.subject.name}`);else{console.log(" install one of them:");for(let v of y)console.log(` kanonak ${e.commandName} add ${w}/${v.subject.name}`);console.log(" install all of them:"),console.log(` kanonak ${e.commandName} add ${w}`)}console.log("")}}async info(e,t,r){let s=(await this.requireHandler(e).list({repository:this.repository,options:r})).find(i=>i.name===t);s||(console.error(`"${t}" is not installed.`),process.exit(1)),console.log(`Name: ${s.name}`),console.log(`Type: ${e.managesTypeKey||"n/a"}`),console.log(`Publisher: ${s.publisher||"unmanaged"}`),console.log(`Package: ${s.package_||"n/a"}`),console.log(`Version: ${s.version||"n/a"}`),console.log(`Path: ${s.path}`)}requireHandler(e){let t=this.handlerRegistry.get(e.deploymentTargetKey);return t||(console.error(`No deployment handler registered for "${e.deploymentTargetKey}". Ensure the capability's deploymentTarget resolves to a DeploymentTarget instance whose URI is registered in the CLI at startup.`),process.exit(1)),t}};function tr(n){if(!n)return;let e=n.split("/");if(e.length===3)return{publisher:e[0],package_:e[1],name:e[2]}}function Ys(n,e){let t=n.toLowerCase(),r=e.toLowerCase();if(t===r)return 100;if(r.includes(t)||t.includes(r))return 50;let o=new Set(t.split("-").filter(Boolean)),a=new Set(r.split("-").filter(Boolean)),s=0;for(let c of o)a.has(c)&&s++;if(s>0)return s*10;let i=Zs(t,r);return i===0?100:i<=2?Math.max(1,20-i*5):0}function Zs(n,e){if(n===e)return 0;if(n.length===0)return e.length;if(e.length===0)return n.length;let t=new Array(e.length+1),r=new Array(e.length+1);for(let o=0;o<=e.length;o++)t[o]=o;for(let o=0;o<n.length;o++){r[0]=o+1;for(let a=0;a<e.length;a++){let s=n[o]===e[a]?0:1;r[a+1]=Math.min(r[a]+1,t[a+1]+1,t[a]+s)}for(let a=0;a<=e.length;a++)t[a]=r[a]}return t[e.length]}var Ve=class{handlers=new Map;register(e,t){this.handlers.set(e,t)}get(e){return this.handlers.get(e)??null}};import{mkdirSync as li,rmSync as ui,existsSync as Me,readdirSync as di,writeFileSync as fi}from"fs";import{join as He}from"path";import{KanonakObjectParser as mi,KanonakParser as pi,computeIntegrity as gi}from"@kanonak-protocol/sdk";import{join as Sn}from"path";import{homedir as rr}from"os";import{KanonakObjectParser as Qs}from"@kanonak-protocol/sdk";var Y="kanonak.org",Z="agent-skills",ar={publisher:Y,package_:Z,name:"Client"},sr={publisher:Y,package_:Z,name:"clientId"},ei={publisher:Y,package_:Z,name:"projectSkillDir"},ni={publisher:Y,package_:Z,name:"userSkillDir"},ti={publisher:Y,package_:Z,name:"skillFileName"},ir="agents";async function ve(n,e){let t=(n.client??cr()??ir).toLowerCase(),r=n.scope??"project",o=await ur(t,e);if(!o){let i=await ri(e);throw new Error(`Unknown client "${t}". Known clients: ${i.join(", ")||"(none)"}. Add a Client instance to a package that imports kanonak.org/agent-skills and install that package to make it available.`)}let s=_(o,r==="user"?ni:ei);if(!s)throw new Error(`Client "${t}" has no ${r==="user"?"userSkillDir":"projectSkillDir"} declared.`);return oi(s)}async function Fe(n,e,t){let r=await ve(e,t);return Sn(r,n)}async function vn(n,e){let t=(n.client??cr()??ir).toLowerCase(),r=await ur(t,e);return r?_(r,ti)??"SKILL.md":"SKILL.md"}function cr(){if(process.env.CLAUDE_CODE||process.env.CLAUDE_PROJECT_DIR)return"claude-code"}var or=new WeakMap;async function lr(n){let e=or.get(n);if(e)return e;let t=await n.getDocumentsByNamespaceAsync(Y,Z);if(t.length===0)throw new Error(`Could not find ${Y}/${Z} in the repository. Install a skill capability (which transitively imports agent-skills) or fetch agent-skills directly to populate the cache.`);let o=[...t].sort((c,l)=>{let u=c.metadata.namespace_?.version,f=l.metadata.namespace_?.version;return!u||!f?0:u.major!==f.major?f.major-u.major:u.minor!==f.minor?f.minor-u.minor:f.patch-u.patch})[0],a=new Qs,s=new E(o,n),i=await a.parseKanonaks(s);return or.set(n,i),i}async function ur(n,e){let t=await lr(e),r=A(t,ar);for(let o of r)if(_(o,sr)===n)return o}async function ri(n){let e=await lr(n),t=A(e,ar),r=[];for(let o of t){let a=_(o,sr);a&&r.push(a)}return r}function oi(n){return n.startsWith("~/")?Sn(rr(),n.slice(2)):n==="~"?rr():n.startsWith("/")||/^[A-Za-z]:[\\/]/.test(n)?n:Sn(process.cwd(),n)}import{readFileSync as ai,writeFileSync as si,existsSync as ii}from"fs";import{join as dr}from"path";import fr from"js-yaml";var mr="skills.lock",ci=`# This file is generated by Kanonak CLI. Do not edit manually.
178
+ `;function Be(n){let e=dr(n,mr);if(!ii(e))return{version:"1",lastUpdated:new Date().toISOString(),skills:{}};let t=ai(e,"utf-8"),r=fr.load(t);return!r||typeof r!="object"||r.version!=="1"?{version:"1",lastUpdated:new Date().toISOString(),skills:{}}:{version:"1",lastUpdated:r.lastUpdated??new Date().toISOString(),skills:r.skills??{}}}function Pn(n,e){e.lastUpdated=new Date().toISOString();let t={};for(let a of Object.keys(e.skills).sort())t[a]=e.skills[a];e.skills=t;let r=dr(n,mr),o=fr.dump(e,{lineWidth:-1,sortKeys:!1,quotingType:'"'});si(r,ci+o,"utf-8")}var pr="kanonak.org",gr="skill-to-skill-md",qe=class{parser=new pi;objectParser=new mi;runner=new G;async deploy(e){let{instances:t,allKanonaks:r,repository:o,options:a}=e;if(t.length===0){console.error("No Skill instances to deploy.");return}let s=await ki(o,this.objectParser);if(!s){console.error(`Cannot deploy: ${pr}/${gr}@3.0.0 is not installed in the workspace or cache.`);return}let i=await this.runner.run({transformation:s,instances:t,allKanonaks:r,repository:o,parser:this.parser,objectParser:this.objectParser,outputFormat:"markdown-with-frontmatter"});if(i.length===0){console.error("No skills could be transformed from the package.");return}let c=await ve(a,o),l=await vn(a,o),u=Be(c),f=t[0].namespace,{publisher:p,package_:g,version:b}=yi(f);for(let k of i){let y=await Fe(k.fileName,a,o),h=Me(He(y,l));li(y,{recursive:!0}),fi(He(y,l),k.content,"utf-8"),u.skills[k.fileName]={publisher:p,package_:g,version:b,resolved:p?`kanonak://${p}/${g}@${b}`:"",integrity:gi(k.content)},console.log(` ${h?"Updated":"Installed"} skill "${k.fileName}" \u2192 ${y}`)}Pn(c,u)}async undeploy(e,t){let{repository:r,options:o}=t,a=await Fe(e,o,r);Me(a)||(console.error(`Skill "${e}" is not installed at ${a}`),process.exit(1)),ui(a,{recursive:!0,force:!0});let s=await ve(o,r),i=Be(s);delete i.skills[e],Pn(s,i),console.log(`Removed skill "${e}" from ${a}`)}async list(e){let{repository:t,options:r}=e,o=await ve(r,t),a=Be(o),s=[];for(let[c,l]of Object.entries(a.skills))s.push({name:c,publisher:l.publisher,package_:l.package_,version:l.version,path:await Fe(c,r,t)});let i=await vn(r,t);if(Me(o))try{let c=di(o,{withFileTypes:!0});for(let l of c){if(!l.isDirectory()||a.skills[l.name])continue;let u=He(o,l.name,i);Me(u)&&s.push({name:l.name,publisher:"",package_:"",version:"",path:He(o,l.name)})}}catch{}return s}};async function ki(n,e){let t=await n.getDocumentsByNamespaceAsync(pr,gr);if(t.length===0)return;let r=new E(t[0],n),o=await e.parseKanonaks(r);return A(o,d.InstanceTransformation)[0]}function yi(n){if(!n)return{publisher:"",package_:"",version:""};let e=n.indexOf("@");if(e===-1)return{publisher:"",package_:"",version:""};let t=n.substring(0,e),r=n.substring(e+1),o=t.indexOf("/");return o===-1?{publisher:"",package_:"",version:""}:{publisher:t.substring(0,o),package_:t.substring(o+1),version:r}}import{mkdirSync as Ri,rmSync as Ii,existsSync as Dn,readdirSync as Ti,writeFileSync as ji,statSync as xi}from"fs";import{join as Ge}from"path";import{KanonakObjectParser as Ui,KanonakParser as Oi,computeIntegrity as Ni}from"@kanonak-protocol/sdk";import{join as kr}from"path";import{homedir as yr}from"os";import{KanonakObjectParser as hi}from"@kanonak-protocol/sdk";var Q="kanonak.org",ee="agent-skills",br={publisher:Q,package_:ee,name:"Client"},wr={publisher:Q,package_:ee,name:"clientId"},bi={publisher:Q,package_:ee,name:"projectAgentDir"},wi={publisher:Q,package_:ee,name:"userAgentDir"},$i={publisher:Q,package_:ee,name:"agentFileFormat"},Si="agents";function vi(){if(process.env.CLAUDE_CODE||process.env.CLAUDE_PROJECT_DIR)return"claude-code"}async function ze(n,e){let t=(n.client??vi()??Si).toLowerCase(),r=n.scope??"project",o=await Pi(t,e);if(!o){let u=await Ki(e);throw new Error(`Unknown client "${t}". Known clients: ${u.join(", ")||"(none)"}. Add a Client instance to a package that imports kanonak.org/agent-skills and install that package to make it available.`)}let s=_(o,r==="user"?wi:bi);if(!s)throw new Error(`Client "${t}" has no ${r==="user"?"userAgentDir":"projectAgentDir"} declared.`);let c=se(o,$i)?.name==="toml"?"toml":"markdown-frontmatter",l=c==="toml"?".toml":".md";return{agentsDir:Di(s),format:c,fileExtension:l}}var hr=new WeakMap;async function $r(n){let e=hr.get(n);if(e)return e;let t=await n.getDocumentsByNamespaceAsync(Q,ee);if(t.length===0)throw new Error(`Could not find ${Q}/${ee} in the repository. Install a capability that imports agent-skills to populate the cache.`);let o=[...t].sort((c,l)=>{let u=c.metadata.namespace_?.version,f=l.metadata.namespace_?.version;return!u||!f?0:u.major!==f.major?f.major-u.major:u.minor!==f.minor?f.minor-u.minor:f.patch-u.patch})[0],a=new hi,s=new E(o,n),i=await a.parseKanonaks(s);return hr.set(n,i),i}async function Pi(n,e){let t=await $r(e),r=A(t,br);for(let o of r)if(_(o,wr)===n)return o}async function Ki(n){let e=await $r(n),t=A(e,br),r=[];for(let o of t){let a=_(o,wr);a&&r.push(a)}return r}function Di(n){return n.startsWith("~/")?kr(yr(),n.slice(2)):n==="~"?yr():n.startsWith("/")||/^[A-Za-z]:[\\/]/.test(n)?n:kr(process.cwd(),n)}import{readFileSync as Ei,writeFileSync as Ci,existsSync as Ai}from"fs";import{join as Sr}from"path";import vr from"js-yaml";var Pr="agents.lock",_i=`# This file is generated by Kanonak CLI. Do not edit manually.
179
+ `;function We(n){let e=Sr(n,Pr);if(!Ai(e))return{version:"1",lastUpdated:new Date().toISOString(),agents:{}};let t=Ei(e,"utf-8"),r=vr.load(t);return!r||typeof r!="object"||r.version!=="1"?{version:"1",lastUpdated:new Date().toISOString(),agents:{}}:{version:"1",lastUpdated:r.lastUpdated??new Date().toISOString(),agents:r.agents??{}}}function Kn(n,e){e.lastUpdated=new Date().toISOString();let t={};for(let a of Object.keys(e.agents).sort())t[a]=e.agents[a];e.agents=t;let r=Sr(n,Pr),o=vr.dump(e,{lineWidth:-1,sortKeys:!1,quotingType:'"'});Ci(r,_i+o,"utf-8")}var Kr="kanonak.org",Dr="agent-to-agent-file",Xe=class{parser=new Oi;objectParser=new Ui;runner=new G;async deploy(e){let{instances:t,allKanonaks:r,repository:o,options:a}=e;if(t.length===0){console.error("No Agent instances to deploy.");return}let{agentsDir:s,format:i,fileExtension:c}=await ze(a,o),l=await Li(o,this.objectParser);if(!l){console.error(`Cannot deploy: ${Kr}/${Dr}@3.0.0 is not installed in the workspace or cache.`);return}let u=i==="toml"?"toml":"markdown-with-frontmatter",f=await this.runner.run({transformation:l,instances:t,allKanonaks:r,repository:o,parser:this.parser,objectParser:this.objectParser,outputFormat:u});if(f.length===0){console.error("No agents could be transformed from the package.");return}Ri(s,{recursive:!0});let p=We(s),g=t[0].namespace,{publisher:b,package_:k,version:y}=Fi(g);for(let h of f){let w=`${h.fileName}${c}`,$=Ge(s,w),v=Dn($);ji($,h.content,"utf-8"),p.agents[h.fileName]={publisher:b,package_:k,version:y,resolved:b?`kanonak://${b}/${k}@${y}`:"",integrity:Ni(h.content),fileName:w},console.log(` ${v?"Updated":"Installed"} agent "${h.fileName}" \u2192 ${$}`)}Kn(s,p)}async undeploy(e,t){let{repository:r,options:o}=t,{agentsDir:a}=await ze(o,r),s=We(a),i=s.agents[e];i||(console.error(`Agent "${e}" is not installed at ${a}`),process.exit(1));let c=Ge(a,i.fileName);Dn(c)&&Ii(c,{force:!0}),delete s.agents[e],Kn(a,s),console.log(`Removed agent "${e}" from ${c}`)}async list(e){let{repository:t,options:r}=e,{agentsDir:o}=await ze(r,t),a=We(o),s=[];for(let[i,c]of Object.entries(a.agents))s.push({name:i,publisher:c.publisher,package_:c.package_,version:c.version,path:Ge(o,c.fileName)});if(Dn(o))try{let i=Ti(o,{withFileTypes:!0});for(let c of i){if(!c.isFile()||c.name==="agents.lock")continue;let l=Ge(o,c.name),u=Vi(c.name);if(!a.agents[u]){try{if(!xi(l).isFile())continue}catch{continue}s.push({name:u,publisher:"",package_:"",version:"",path:l})}}}catch{}return s}};async function Li(n,e){let t=await n.getDocumentsByNamespaceAsync(Kr,Dr);if(t.length===0)return;let r=new E(t[0],n),o=await e.parseKanonaks(r);return A(o,d.InstanceTransformation)[0]}function Vi(n){let e=n.lastIndexOf(".");return e===-1?n:n.substring(0,e)}function Fi(n){if(!n)return{publisher:"",package_:"",version:""};let e=n.indexOf("@");if(e===-1)return{publisher:"",package_:"",version:""};let t=n.substring(0,e),r=n.substring(e+1),o=t.indexOf("/");return o===-1?{publisher:"",package_:"",version:""}:{publisher:t.substring(0,o),package_:t.substring(o+1),version:r}}var Yi=qi(Hi(import.meta.url)),Zi=JSON.parse(Mi(zi(Yi,"..","package.json"),"utf-8")),V=new Bi;V.name("kanonak").description("Kanonak Protocol CLI - Validate and resolve Kanonak ontology packages").version(Zi.version);V.command("validate <path>").description("Validate .kan.yml file(s). Resolves imports via HTTP from publisher domains.").action(async n=>{await Rn(n)});V.command("install [package]").description("Install a package and its dependencies, or install all from kanonak.lock.").action(async n=>{await In(n)});V.command("deps <path>").description("Show resolved dependency tree for a .kan.yml file.").action(async n=>{await jn(n)});V.command("login <publisher>").description("Authenticate with a package publisher using OAuth 2.0.").action(async n=>{await Ln(n)});V.command("logout <publisher>").description("Revoke tokens and remove stored credentials for a publisher.").action(async n=>{await Vn(n)});V.addCommand(nt());V.addCommand(Ht());V.addCommand(Jt());async function Qi(){try{let n=new U,e=new Wi,t=new Xi,r=Ji(t),o=new Gi({fetchFn:r}),a=await O(process.cwd(),e),s=new Ve;s.register("kanonak.org/capabilities/agent-skill-deployment",new qe),s.register("kanonak.org/agent-capabilities/agent-instance-deployment",new Xe);let i=await Zn(n,e,a),c=new Le(n,e,o,r,s,a);Zt(V,i,c)}catch{}}await Qi();V.parse();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kanonak-protocol/cli",
3
- "version": "3.4.0",
3
+ "version": "3.5.0",
4
4
  "description": "Kanonak Protocol CLI - Validate and resolve Kanonak ontology packages",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -34,8 +34,8 @@
34
34
  "semantic-web"
35
35
  ],
36
36
  "dependencies": {
37
- "@kanonak-protocol/sdk": "^3.4.0",
38
- "@kanonak-protocol/types": "^3.4.0",
37
+ "@kanonak-protocol/sdk": "^3.5.0",
38
+ "@kanonak-protocol/types": "^3.5.0",
39
39
  "commander": "^13.0.0",
40
40
  "js-yaml": "^4.1.1"
41
41
  },