@kanonak-protocol/cli 3.27.1 → 3.27.3

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.
Files changed (2) hide show
  1. package/dist/index.js +31 -31
  2. package/package.json +3 -3
package/dist/index.js CHANGED
@@ -1,25 +1,25 @@
1
1
  #!/usr/bin/env node
2
- import{Command as ki}from"commander";import{readFileSync as yi}from"fs";import{fileURLToPath as bi}from"url";import{dirname as wi,join as $i}from"path";import{KanonakParser as vi,PublisherIndex as Si,CredentialStore as Pi,createAuthenticatedFetch as Ri}from"@kanonak-protocol/sdk";import{readFileSync as no,statSync as to}from"fs";import{resolve as oo,dirname as ro}from"path";import{KanonakParser as so,KanonakObjectValidator as ao,ValidationSeverity as an}from"@kanonak-protocol/sdk";import{readFileSync as qt,readdirSync as Gt}from"fs";import{join as Jt,dirname as Yt,basename as sn}from"path";import{InMemoryKanonakDocumentRepository as Xt,FileSystemKanonakDocumentRepository as Zt,HttpKanonakDocumentRepository as Qt,getGlobalCachePath as eo}from"@kanonak-protocol/sdk";import{mkdirSync as Ht,readFileSync as on,writeFileSync as rn,existsSync as _e,appendFileSync as Mt}from"fs";import{join as Vt,dirname as Bt,isAbsolute as zt}from"path";import{getGlobalCachePath as Wt}from"@kanonak-protocol/sdk";var D=class{constructor(e=Wt()){this.cacheDir=e;this.isProjectLocal=!zt(e)}cacheDir;gitignoreChecked=!1;isProjectLocal;get(e,t,o){let r=this.getPath(e,t,o);return _e(r)?on(r,"utf-8"):null}put(e,t,o,r){let a=this.getPath(e,t,o);Ht(Bt(a),{recursive:!0}),rn(a,r,"utf-8"),this.isProjectLocal&&this.ensureGitignore()}has(e,t,o){return _e(this.getPath(e,t,o))}ensureGitignore(){if(this.gitignoreChecked)return;this.gitignoreChecked=!0;let e=".gitignore",t=this.cacheDir;if(_e(e)){if(on(e,"utf-8").split(`
3
- `).some(r=>r.trim()===t||r.trim()===t+"/"))return;Mt(e,`
2
+ import{Command as yi}from"commander";import{readFileSync as bi}from"fs";import{fileURLToPath as wi}from"url";import{dirname as $i,join as vi}from"path";import{KanonakParser as Si,PublisherIndex as Pi,CredentialStore as Ri,createAuthenticatedFetch as _i}from"@kanonak-protocol/sdk";import{readFileSync as to,statSync as oo}from"fs";import{resolve as ro,dirname as so}from"path";import{KanonakParser as ao,KanonakObjectValidator as io,ValidationSeverity as an}from"@kanonak-protocol/sdk";import{readFileSync as Gt,readdirSync as Jt}from"fs";import{join as Yt,dirname as Xt,basename as sn}from"path";import{InMemoryKanonakDocumentRepository as Zt,FileSystemKanonakDocumentRepository as Qt,HttpKanonakDocumentRepository as eo,getGlobalCachePath as no}from"@kanonak-protocol/sdk";import{mkdirSync as Mt,readFileSync as on,writeFileSync as rn,existsSync as _e,appendFileSync as Vt}from"fs";import{join as Bt,dirname as zt,isAbsolute as Wt}from"path";import{getGlobalCachePath as qt}from"@kanonak-protocol/sdk";var D=class{constructor(e=qt()){this.cacheDir=e;this.isProjectLocal=!Wt(e)}cacheDir;gitignoreChecked=!1;isProjectLocal;get(e,t,o){let r=this.getPath(e,t,o);return _e(r)?on(r,"utf-8"):null}put(e,t,o,r){let a=this.getPath(e,t,o);Mt(zt(a),{recursive:!0}),rn(a,r,"utf-8"),this.isProjectLocal&&this.ensureGitignore()}has(e,t,o){return _e(this.getPath(e,t,o))}ensureGitignore(){if(this.gitignoreChecked)return;this.gitignoreChecked=!0;let e=".gitignore",t=this.cacheDir;if(_e(e)){if(on(e,"utf-8").split(`
3
+ `).some(r=>r.trim()===t||r.trim()===t+"/"))return;Vt(e,`
4
4
  ${t}/
5
5
  `)}else rn(e,`${t}/
6
- `)}getPath(e,t,o){return Vt(this.cacheDir,e,`${t}@${o}.kan.yml`)}};function U(n){let e=n;for(;;){let t=Yt(e);if(t===e)break;if(sn(e).includes(".")||sn(t).includes(".")){e=t;continue}break}return e}function W(n,e){for(let t of Gt(n,{withFileTypes:!0})){let o=Jt(n,t.name);t.isDirectory()&&t.name!=="node_modules"&&t.name!==".kanonak"?W(o,e):t.name.endsWith(".kan.yml")&&e.push(o)}}var Ce=class{repos;constructor(...e){this.repos=e}async getHighestCompatibleVersionAsync(e,t){for(let o of this.repos)try{let r=await o.getHighestCompatibleVersionAsync(e,t);if(r)return r}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 o=await t.getDocumentAsync(e);if(o)return o}catch{}return null}async getDocumentsByNamespaceAsync(e,t){for(let o of this.repos)try{let r=await o.getDocumentsByNamespaceAsync(e,t);if(r.length>0)return r}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 o=await t.getDocumentContentAsync(e);if(o)return o}catch{}return null}async getDocumentUriAsync(e){for(let t of this.repos)try{let o=await t.getDocumentUriAsync(e);if(o)return o}catch{}return null}};async function S(n,e){let t=[];W(n,t);let o=new Xt(e);for(let i of t)try{let c=qt(i,"utf-8"),l=e.parse(c),m=l.metadata.namespace_;if(m){let u=`${m.publisher}/${m.package_}@${m.version}`;await o.saveDocumentAsync(l,u)}}catch{}let r=new Zt(eo(),!0,e),a=new D,s=new Qt({getFromCache:(i,c,l)=>a.get(i,c,l),onFetch:(i,c,l,m)=>a.put(i,c,l,m)});return new Ce(o,r,s)}async function cn(n){let e=oo(n),t=to(e),o=t.isDirectory()?U(e):U(ro(e)),r=new so,a=new ao(r),s=await S(o,r),i=[];if(t.isDirectory()?W(e,i):i.push(e),i.length===0){console.log("No .kan.yml files found.");return}let c=0,l=0;for(let m of i){let u=no(m,"utf-8"),d=r.parseWithErrors(u);if(d.errors&&d.errors.length>0){console.log(`
6
+ `)}getPath(e,t,o){return Bt(this.cacheDir,e,`${t}@${o}.kan.yml`)}};function H(n){let e=n;for(;;){let t=Xt(e);if(t===e)break;if(sn(e).includes(".")||sn(t).includes(".")){e=t;continue}break}return e}function q(n,e){for(let t of Jt(n,{withFileTypes:!0})){let o=Yt(n,t.name);t.isDirectory()&&t.name!=="node_modules"&&t.name!==".kanonak"?q(o,e):t.name.endsWith(".kan.yml")&&e.push(o)}}var Ce=class{repos;constructor(...e){this.repos=e}async getHighestCompatibleVersionAsync(e,t){for(let o of this.repos)try{let r=await o.getHighestCompatibleVersionAsync(e,t);if(r)return r}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 o=await t.getDocumentAsync(e);if(o)return o}catch{}return null}async getDocumentsByNamespaceAsync(e,t){for(let o of this.repos)try{let r=await o.getDocumentsByNamespaceAsync(e,t);if(r.length>0)return r}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 o=await t.getDocumentContentAsync(e);if(o)return o}catch{}return null}async getDocumentUriAsync(e){for(let t of this.repos)try{let o=await t.getDocumentUriAsync(e);if(o)return o}catch{}return null}};async function S(n,e){let t=[];q(n,t);let o=new Zt(e);for(let i of t)try{let c=Gt(i,"utf-8"),l=e.parse(c),m=l.metadata.namespace_;if(m){let u=`${m.publisher}/${m.package_}@${m.version}`;await o.saveDocumentAsync(l,u)}}catch{}let r=new Qt(no(),!0,e),a=new D,s=new eo({getFromCache:(i,c,l)=>a.get(i,c,l),onFetch:(i,c,l,m)=>a.put(i,c,l,m)});return new Ce(o,r,s)}async function cn(n){let e=ro(n),t=oo(e),o=t.isDirectory()?H(e):H(so(e)),r=new ao,a=new io(r),s=await S(o,r),i=[];if(t.isDirectory()?q(e,i):i.push(e),i.length===0){console.log("No .kan.yml files found.");return}let c=0,l=0;for(let m of i){let u=to(m,"utf-8"),d=r.parseWithErrors(u);if(d.errors&&d.errors.length>0){console.log(`
7
7
  ${m}:`);for(let f of d.errors)console.log(` ERROR (parse): ${f.message} [line ${f.line}:${f.column}]`),c++;continue}let h=d.document;if(!h){console.log(`
8
8
  ${m}:`),console.log(" ERROR: Failed to parse document"),c++;continue}let y=await a.validateAsync(h,s),p=y.errors.filter(f=>f.severity===an.Error),g=y.warnings.filter(f=>f.severity===an.Warning);if(p.length>0||g.length>0){let f=h.metadata.namespace_,k=f?`${f.publisher}/${f.package_}@${f.version}`:m;console.log(`
9
9
  ${k}:`);for(let b of p)console.log(` ERROR: ${b.message}`),b.suggestion&&console.log(` -> ${b.suggestion}`);for(let b of g)console.log(` WARN: ${b.message}`)}c+=p.length,l+=g.length}console.log(`
10
- ${i.length} file(s) validated. ${c} error(s), ${l} warning(s).`),c>0&&process.exit(1)}import{KanonakParser as io,PublisherIndex as co,CredentialStore as lo,createAuthenticatedFetch as uo}from"@kanonak-protocol/sdk";import{loadLockFile as po,saveLockFile as mo,computeIntegrity as fo}from"@kanonak-protocol/sdk";function x(n){if(!n)return null;let e=n.indexOf("/");if(e===-1)return null;let t=n.substring(0,e),o=n.substring(e+1);if(!t||!o)return null;let r,a=null,s=null,i=o.indexOf("@");if(i!==-1){r=o.substring(0,i);let c=o.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=o.indexOf("/");c===-1?r=o:(r=o.substring(0,c),s=o.substring(c+1)||null)}return!r||s&&s.includes("/")||a&&a.includes("@")?null:{publisher:t,packageName:r,version:a,instanceName:s}}async function ln(n){let e=new D,t=new io,o=new lo,r=uo(o),a=new co({fetchFn:r}),s=po()??{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[y,p]of Object.entries(s.packages)){let g=y.indexOf("/"),f=y.substring(0,g),k=y.substring(g+1),b=e.get(f,k,p.version);if(b)console.log(` ${y}@${p.version} (cached)`);else{let w=p.resolved,$=await r(w,f);if(!$.ok)throw new Error(`Failed to fetch ${w} (${$.status} ${$.statusText})`);b=await $.text(),e.put(f,k,p.version,b),console.log(` ${y}@${p.version}`)}}console.log(`
11
- Installed ${Object.keys(s.packages).length} package(s) from lock file.`);return}let i=x(n);i||(console.error(`Invalid package reference: "${n}"`),console.error("Expected format: {publisher}/{package}[@{version}]"),process.exit(1));let{publisher:c,packageName:l,version:m,instanceName:u}=i;u&&(console.error(`\`kanonak install\` works on whole packages \u2014 got an instance suffix "/${u}".`),console.error(`Try: kanonak install ${c}/${l}${m?"@"+m:""}`),console.error("(Use `kanonak <capability> add` if you want to install one named instance.)"),process.exit(1));let d=m??await a.getHighestVersion(c,l);d||(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}@${d}...`);let h=new Set;await un(c,l,d,e,t,a,r,h,s),mo(s),console.log(`
12
- Installed ${h.size} package(s).`)}async function un(n,e,t,o,r,a,s,i,c){let l=`${n}/${e}@${t}`;if(i.has(l))return;i.add(l);let m=`${n}/${e}`,u=o.get(n,e,t),d;if(u)console.log(` ${l} (cached)`),d=await a.getPackageUrl(n,e,t);else{d=await a.getPackageUrl(n,e,t);let p=await s(d,n);if(!p.ok)throw new Error(`Failed to fetch ${d} (${p.status} ${p.statusText})`);u=await p.text(),o.put(n,e,t,u),console.log(` ${l}`)}let h={},y=r.parse(u);if(y.metadata.imports)for(let[p,g]of Object.entries(y.metadata.imports))for(let f of g){let k=await a.resolveVersion(p,f);k?(h[`${p}/${f.packageName}`]=k,await un(p,f.packageName,k,o,r,a,s,i,c)):console.error(` WARNING: Could not resolve ${p}/${f.packageName} ${f.package_}`)}c.packages[m]={version:t,resolved:d,integrity:fo(u),dependencies:h}}import{readFileSync as go}from"fs";import{resolve as ho,dirname as ko}from"path";import{KanonakParser as yo}from"@kanonak-protocol/sdk";async function pn(n){let e=ho(n),t=go(e,"utf-8"),o=new yo,r=o.parse(t),a=r.metadata.namespace_,s=a?`${a.publisher}/${a.package_}@${a.version}`:n;if(console.log(s),!r.metadata.imports){console.log(" (no imports)");return}let i=U(ko(e)),c=await S(i,o),l=new Set;for(let[m,u]of Object.entries(r.metadata.imports))for(let d of u)await mn(m,d,c,l," ")}async function mn(n,e,t,o,r){let a=`${n}/${e.packageName}`;if(o.has(a)){console.log(`${r}${a} (${e.package_}) [circular]`);return}o.add(a);let s;try{s=await t.getHighestCompatibleVersionAsync(n,e)}catch{console.log(`${r}${a} (${e.package_}) [fetch failed]`);return}if(!s){console.log(`${r}${a} (${e.package_}) [not found]`);return}let i=s.metadata.namespace_?.version?.toString()??"?";if(console.log(`${r}${n}/${e.packageName}@${i}`),s.metadata.imports)for(let[c,l]of Object.entries(s.metadata.imports))for(let m of l)await mn(c,m,t,o,r+" ")}import{createHash as wo,randomBytes as gn}from"crypto";import{createServer as $o}from"http";import{execFile as Ke}from"child_process";import{CredentialStore as vo,generateDPoPKeyPair as So,createDPoPProof as dn,serverSupportsDPoP as Po}from"@kanonak-protocol/sdk";import{normalizeHost as bo}from"@kanonak-protocol/sdk";var j=class{cache=new Map;async discover(e){let t=bo(e);if(this.cache.has(t))return this.cache.get(t);let o=`https://${t}/.well-known/oauth-authorization-server`,r=await this.tryEndpoint(o);if(!r){let a=`https://${t}/.well-known/openid-configuration`;r=await this.tryEndpoint(a)}return this.cache.set(t,r),r}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(r){let a=r instanceof Error?r.message:String(r);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 o;try{o=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:ne(o.issuer),authorizationEndpoint:ne(o.authorization_endpoint),tokenEndpoint:ne(o.token_endpoint),registrationEndpoint:ne(o.registration_endpoint),revocationEndpoint:ne(o.revocation_endpoint),scopesSupported:q(o.scopes_supported),responseTypesSupported:q(o.response_types_supported),grantTypesSupported:q(o.grant_types_supported),codeChallengeMethodsSupported:q(o.code_challenge_methods_supported),tokenEndpointAuthMethodsSupported:q(o.token_endpoint_auth_methods_supported),dpopSigningAlgValuesSupported:q(o.dpop_signing_alg_values_supported)}}};function ne(n){return typeof n=="string"?n:null}function q(n){return Array.isArray(n)?n.filter(e=>typeof e=="string"):null}var J=class{discovery;credentialStore;constructor(e,t){this.discovery=e??new j,this.credentialStore=t??new vo}async authorize(e,t=[]){console.log(`Starting OAuth flow for ${e}...`);let o=await this.discovery.discover(e);if(!o)return _(`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 co,PublisherIndex as lo,CredentialStore as uo,createAuthenticatedFetch as po}from"@kanonak-protocol/sdk";import{loadLockFile as mo,saveLockFile as fo,computeIntegrity as go}from"@kanonak-protocol/sdk";function I(n){if(!n)return null;let e=n.indexOf("/");if(e===-1)return null;let t=n.substring(0,e),o=n.substring(e+1);if(!t||!o)return null;let r,a=null,s=null,i=o.indexOf("@");if(i!==-1){r=o.substring(0,i);let c=o.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=o.indexOf("/");c===-1?r=o:(r=o.substring(0,c),s=o.substring(c+1)||null)}return!r||s&&s.includes("/")||a&&a.includes("@")?null:{publisher:t,packageName:r,version:a,instanceName:s}}async function ln(n){let e=new D,t=new co,o=new uo,r=po(o),a=new lo({fetchFn:r}),s=mo()??{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[y,p]of Object.entries(s.packages)){let g=y.indexOf("/"),f=y.substring(0,g),k=y.substring(g+1),b=e.get(f,k,p.version);if(b)console.log(` ${y}@${p.version} (cached)`);else{let w=p.resolved,$=await r(w,f);if(!$.ok)throw new Error(`Failed to fetch ${w} (${$.status} ${$.statusText})`);b=await $.text(),e.put(f,k,p.version,b),console.log(` ${y}@${p.version}`)}}console.log(`
11
+ Installed ${Object.keys(s.packages).length} package(s) from lock file.`);return}let i=I(n);i||(console.error(`Invalid package reference: "${n}"`),console.error("Expected format: {publisher}/{package}[@{version}]"),process.exit(1));let{publisher:c,packageName:l,version:m,instanceName:u}=i;u&&(console.error(`\`kanonak install\` works on whole packages \u2014 got an instance suffix "/${u}".`),console.error(`Try: kanonak install ${c}/${l}${m?"@"+m:""}`),console.error("(Use `kanonak <capability> add` if you want to install one named instance.)"),process.exit(1));let d=m??await a.getHighestVersion(c,l);d||(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}@${d}...`);let h=new Set;await un(c,l,d,e,t,a,r,h,s),fo(s),console.log(`
12
+ Installed ${h.size} package(s).`)}async function un(n,e,t,o,r,a,s,i,c){let l=`${n}/${e}@${t}`;if(i.has(l))return;i.add(l);let m=`${n}/${e}`,u=o.get(n,e,t),d;if(u)console.log(` ${l} (cached)`),d=await a.getPackageUrl(n,e,t);else{d=await a.getPackageUrl(n,e,t);let p=await s(d,n);if(!p.ok)throw new Error(`Failed to fetch ${d} (${p.status} ${p.statusText})`);u=await p.text(),o.put(n,e,t,u),console.log(` ${l}`)}let h={},y=r.parse(u);if(y.metadata.imports)for(let[p,g]of Object.entries(y.metadata.imports))for(let f of g){let k=await a.resolveVersion(p,f);k?(h[`${p}/${f.packageName}`]=k,await un(p,f.packageName,k,o,r,a,s,i,c)):console.error(` WARNING: Could not resolve ${p}/${f.packageName} ${f.package_}`)}c.packages[m]={version:t,resolved:d,integrity:go(u),dependencies:h}}import{readFileSync as ho}from"fs";import{resolve as ko,dirname as yo}from"path";import{KanonakParser as bo}from"@kanonak-protocol/sdk";async function pn(n){let e=ko(n),t=ho(e,"utf-8"),o=new bo,r=o.parse(t),a=r.metadata.namespace_,s=a?`${a.publisher}/${a.package_}@${a.version}`:n;if(console.log(s),!r.metadata.imports){console.log(" (no imports)");return}let i=H(yo(e)),c=await S(i,o),l=new Set;for(let[m,u]of Object.entries(r.metadata.imports))for(let d of u)await mn(m,d,c,l," ")}async function mn(n,e,t,o,r){let a=`${n}/${e.packageName}`;if(o.has(a)){console.log(`${r}${a} (${e.package_}) [circular]`);return}o.add(a);let s;try{s=await t.getHighestCompatibleVersionAsync(n,e)}catch{console.log(`${r}${a} (${e.package_}) [fetch failed]`);return}if(!s){console.log(`${r}${a} (${e.package_}) [not found]`);return}let i=s.metadata.namespace_?.version?.toString()??"?";if(console.log(`${r}${n}/${e.packageName}@${i}`),s.metadata.imports)for(let[c,l]of Object.entries(s.metadata.imports))for(let m of l)await mn(c,m,t,o,r+" ")}import{createHash as $o,randomBytes as gn}from"crypto";import{createServer as vo}from"http";import{execFile as Ke}from"child_process";import{CredentialStore as So,generateDPoPKeyPair as Po,createDPoPProof as dn,serverSupportsDPoP as Ro}from"@kanonak-protocol/sdk";import{normalizeHost as wo}from"@kanonak-protocol/sdk";var O=class{cache=new Map;async discover(e){let t=wo(e);if(this.cache.has(t))return this.cache.get(t);let o=`https://${t}/.well-known/oauth-authorization-server`,r=await this.tryEndpoint(o);if(!r){let a=`https://${t}/.well-known/openid-configuration`;r=await this.tryEndpoint(a)}return this.cache.set(t,r),r}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(r){let a=r instanceof Error?r.message:String(r);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 o;try{o=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:ne(o.issuer),authorizationEndpoint:ne(o.authorization_endpoint),tokenEndpoint:ne(o.token_endpoint),registrationEndpoint:ne(o.registration_endpoint),revocationEndpoint:ne(o.revocation_endpoint),scopesSupported:G(o.scopes_supported),responseTypesSupported:G(o.response_types_supported),grantTypesSupported:G(o.grant_types_supported),codeChallengeMethodsSupported:G(o.code_challenge_methods_supported),tokenEndpointAuthMethodsSupported:G(o.token_endpoint_auth_methods_supported),dpopSigningAlgValuesSupported:G(o.dpop_signing_alg_values_supported)}}};function ne(n){return typeof n=="string"?n:null}function G(n){return Array.isArray(n)?n.filter(e=>typeof e=="string"):null}var Y=class{discovery;credentialStore;constructor(e,t){this.discovery=e??new O,this.credentialStore=t??new So}async authorize(e,t=[]){console.log(`Starting OAuth flow for ${e}...`);let o=await this.discovery.discover(e);if(!o)return _(`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 r=[];if(o.authorizationEndpoint||r.push("authorization_endpoint"),o.tokenEndpoint||r.push("token_endpoint"),r.length>0)return _(`OAuth metadata for '${e}' is missing required fields: ${r.join(", ")}.
18
- Contact the IDP administrator to ensure these are included in the discovery document.`);let a=Po(o.dpopSigningAlgValuesSupported),s=null;if(a){console.log(" Server supports DPoP (RFC 9449) \u2014 generating key pair...");try{s=So()}catch($){return _(`Failed to generate DPoP key pair: ${G($)}
19
- Ensure your Node.js installation supports EC P-256 curves.`)}}let{redirectUri:i,port:c,waitForCallback:l,close:m}=await xo(),u=await this.credentialStore.getCredential(e),d=u?.clientId??null,h=u?.clientSecret??null;if(!d&&o.registrationEndpoint){console.log(" Registering dynamic OAuth client (RFC 7591)...");let $=await this.registerClient(o.registrationEndpoint,i);if(!$.success)return m(),_($.error);d=$.clientId,h=$.clientSecret??null}if(!d)return m(),_(`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=Ro(o.dpopSigningAlgValuesSupported),s=null;if(a){console.log(" Server supports DPoP (RFC 9449) \u2014 generating key pair...");try{s=Po()}catch($){return _(`Failed to generate DPoP key pair: ${J($)}
19
+ Ensure your Node.js installation supports EC P-256 curves.`)}}let{redirectUri:i,port:c,waitForCallback:l,close:m}=await To(),u=await this.credentialStore.getCredential(e),d=u?.clientId??null,h=u?.clientSecret??null;if(!d&&o.registrationEndpoint){console.log(" Registering dynamic OAuth client (RFC 7591)...");let $=await this.registerClient(o.registrationEndpoint,i);if(!$.success)return m(),_($.error);d=$.clientId,h=$.clientSecret??null}if(!d)return m(),_(`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 y=_o(),p=Co(y),g=Ko(),f=Do(o.authorizationEndpoint,d,i,t,g,p);console.log(` Opening browser for authorization on port ${c}...`),console.log(" If the browser doesn't open, navigate to:"),console.log(` ${f}`),Ao(f);let k=await l();if(m(),!k)return _(`Authorization timed out after 5 minutes.
22
+ or add a registration_endpoint to the OAuth metadata.`);let y=Co(),p=Ko(y),g=Do(),f=Io(o.authorizationEndpoint,d,i,t,g,p);console.log(` Opening browser for authorization on port ${c}...`),console.log(" If the browser doesn't open, navigate to:"),console.log(` ${f}`),Eo(f);let k=await l();if(m(),!k)return _(`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(!k.code){let $=k.error?`: ${k.error}`:"";return _(`No authorization code received${$}.
25
25
  The IDP may have rejected the authorization request.
@@ -32,32 +32,32 @@ Installed ${h.size} package(s).`)}async function un(n,e,t,o,r,a,s,i,c){let l=`${
32
32
  The OAuth discovery endpoint may be unreachable.
33
33
  Check network connectivity and run 'kanonak login ${e}' to re-authenticate.`);o=a.tokenEndpoint}let r=await this.refreshTokenRequest(o,t.clientId,t.clientSecret,t.refreshToken,t.dpopKeyPair);return r.success?(t.accessToken=r.tokens.accessToken,r.tokens.refreshToken&&(t.refreshToken=r.tokens.refreshToken),t.expiresAt=r.tokens.expiresIn?new Date(Date.now()+r.tokens.expiresIn*1e3).toISOString():null,t.tokenEndpoint=o,await this.credentialStore.store(e,t),{success:!0,host:e}):_(`${r.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 _(`No stored credentials for '${e}'.
35
- You may not be logged in, or credentials may be stored in a different backend.`);let o=await this.discovery.discover(e);if(o?.revocationEndpoint&&t.accessToken&&t.clientId)try{await this.revokeToken(o.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 o;try{o=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: ${G(s)}
35
+ You may not be logged in, or credentials may be stored in a different backend.`);let o=await this.discovery.discover(e);if(o?.revocationEndpoint&&t.accessToken&&t.clientId)try{await this.revokeToken(o.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 o;try{o=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: ${J(s)}
36
36
  Ensure the IDP is reachable and HTTPS is properly configured.
37
37
  If using a corporate proxy or custom CA, set NODE_EXTRA_CA_CERTS.`}}if(!o.ok){let s=await De(o);return{success:!1,error:`Dynamic client registration (RFC 7591) failed.
38
38
  Endpoint: ${e}
39
39
  HTTP ${o.status}: ${s}
40
40
  The IDP may not support dynamic registration for public clients.
41
41
  Ask your IDP administrator to enable RFC 7591 support, or pre-register a client manually.`}}let r=await o.json(),a=r.client_id;return a?{success:!0,clientId:a,clientSecret:r.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,o,r,a,s,i){let c=new URLSearchParams({grant_type:"authorization_code",client_id:t,code:r,redirect_uri:a,code_verifier:s});o&&c.set("client_secret",o);let l={"Content-Type":"application/x-www-form-urlencoded"};if(i)try{l.DPoP=dn(i.privateKey,i.publicKey,"POST",e)}catch(u){return{success:!1,error:`Failed to create DPoP proof for token exchange: ${G(u)}
43
- The stored key pair may be corrupted. Run 'kanonak login' to re-authenticate.`}}let m;try{m=await fetch(e,{method:"POST",headers:l,body:c.toString()})}catch(u){return{success:!1,error:`Token exchange request to ${e} failed: ${G(u)}
44
- Ensure the token endpoint is reachable.`}}if(!m.ok){let u=await De(m),d=Ro(u);return{success:!1,error:`Token exchange failed.
42
+ The IDP response may be malformed. Contact your IDP administrator.`}}async exchangeCode(e,t,o,r,a,s,i){let c=new URLSearchParams({grant_type:"authorization_code",client_id:t,code:r,redirect_uri:a,code_verifier:s});o&&c.set("client_secret",o);let l={"Content-Type":"application/x-www-form-urlencoded"};if(i)try{l.DPoP=dn(i.privateKey,i.publicKey,"POST",e)}catch(u){return{success:!1,error:`Failed to create DPoP proof for token exchange: ${J(u)}
43
+ The stored key pair may be corrupted. Run 'kanonak login' to re-authenticate.`}}let m;try{m=await fetch(e,{method:"POST",headers:l,body:c.toString()})}catch(u){return{success:!1,error:`Token exchange request to ${e} failed: ${J(u)}
44
+ Ensure the token endpoint is reachable.`}}if(!m.ok){let u=await De(m),d=_o(u);return{success:!1,error:`Token exchange failed.
45
45
  Endpoint: ${e}
46
46
  HTTP ${m.status}: ${u}`+(d?`
47
- ${d}`:"")}}return{success:!0,tokens:fn(await m.json())}}async refreshTokenRequest(e,t,o,r,a){let s=new URLSearchParams({grant_type:"refresh_token",client_id:t,refresh_token:r});o&&s.set("client_secret",o);let i={"Content-Type":"application/x-www-form-urlencoded"};if(a)try{i.DPoP=dn(a.privateKey,a.publicKey,"POST",e)}catch(l){return{success:!1,error:`Failed to create DPoP proof for token refresh: ${G(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: ${G(l)}`}}if(!c.ok){let l=await De(c);return{success:!1,error:`Token refresh failed \u2014 HTTP ${c.status}: ${l}`}}return{success:!0,tokens:fn(await c.json())}}async revokeToken(e,t,o){await fetch(e,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({token:t,client_id:o}).toString()})}};function _(n){return{success:!1,error:n}}function fn(n){return{accessToken:n.access_token,refreshToken:n.refresh_token,expiresIn:typeof n.expires_in=="number"?n.expires_in:void 0}}function G(n){return n instanceof Error?n.message:String(n)}async function De(n){try{return await n.text()}catch{return"(could not read response body)"}}function Ro(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 _o(){return gn(32).toString("base64url")}function Co(n){return wo("sha256").update(n).digest("base64url")}function Ko(){return gn(16).toString("base64url")}function Do(n,e,t,o,r,a){let s=new URLSearchParams({client_id:e,response_type:"code",redirect_uri:t,scope:o.join(" "),state:r,code_challenge:a,code_challenge_method:"S256"});return`${n}?${s}`}var Io=300*1e3;async function xo(){return new Promise(n=>{let e=$o((r,a)=>{let s=new URL(r.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,m=l?To(l):null,u=m?`<html><body><h1>Authorization failed</h1><p>${m}</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(u),t({code:i,state:c,error:l})}),t,o=new Promise(r=>{t=r,setTimeout(()=>{r(null),e.close()},Io)});e.listen(0,"127.0.0.1",()=>{let r=e.address();n({redirectUri:`http://localhost:${r.port}/callback`,port:r.port,waitForCallback:()=>o,close:()=>e.close()})})})}function To(n){return n.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")}function Ao(n){try{process.platform==="win32"?Ke("cmd",["/c","start","",n]):process.platform==="darwin"?Ke("open",[n]):Ke("xdg-open",[n])}catch{console.log(" Could not open browser automatically. Please navigate to the URL above manually.")}}import{CredentialStore as Eo}from"@kanonak-protocol/sdk";async function hn(n){try{let e=new j,t=new Eo,r=await new J(e,t).authorize(n);r.success?console.log(`
47
+ ${d}`:"")}}return{success:!0,tokens:fn(await m.json())}}async refreshTokenRequest(e,t,o,r,a){let s=new URLSearchParams({grant_type:"refresh_token",client_id:t,refresh_token:r});o&&s.set("client_secret",o);let i={"Content-Type":"application/x-www-form-urlencoded"};if(a)try{i.DPoP=dn(a.privateKey,a.publicKey,"POST",e)}catch(l){return{success:!1,error:`Failed to create DPoP proof for token refresh: ${J(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: ${J(l)}`}}if(!c.ok){let l=await De(c);return{success:!1,error:`Token refresh failed \u2014 HTTP ${c.status}: ${l}`}}return{success:!0,tokens:fn(await c.json())}}async revokeToken(e,t,o){await fetch(e,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({token:t,client_id:o}).toString()})}};function _(n){return{success:!1,error:n}}function fn(n){return{accessToken:n.access_token,refreshToken:n.refresh_token,expiresIn:typeof n.expires_in=="number"?n.expires_in:void 0}}function J(n){return n instanceof Error?n.message:String(n)}async function De(n){try{return await n.text()}catch{return"(could not read response body)"}}function _o(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 Co(){return gn(32).toString("base64url")}function Ko(n){return $o("sha256").update(n).digest("base64url")}function Do(){return gn(16).toString("base64url")}function Io(n,e,t,o,r,a){let s=new URLSearchParams({client_id:e,response_type:"code",redirect_uri:t,scope:o.join(" "),state:r,code_challenge:a,code_challenge_method:"S256"});return`${n}?${s}`}var xo=300*1e3;async function To(){return new Promise(n=>{let e=vo((r,a)=>{let s=new URL(r.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,m=l?Ao(l):null,u=m?`<html><body><h1>Authorization failed</h1><p>${m}</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(u),t({code:i,state:c,error:l})}),t,o=new Promise(r=>{t=r,setTimeout(()=>{r(null),e.close()},xo)});e.listen(0,"127.0.0.1",()=>{let r=e.address();n({redirectUri:`http://localhost:${r.port}/callback`,port:r.port,waitForCallback:()=>o,close:()=>e.close()})})})}function Ao(n){return n.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")}function Eo(n){try{process.platform==="win32"?Ke("cmd",["/c","start","",n]):process.platform==="darwin"?Ke("open",[n]):Ke("xdg-open",[n])}catch{console.log(" Could not open browser automatically. Please navigate to the URL above manually.")}}import{CredentialStore as jo}from"@kanonak-protocol/sdk";async function hn(n){try{let e=new O,t=new jo,r=await new Y(e,t).authorize(n);r.success?console.log(`
48
48
  Authenticated with ${n}.`):(console.error(`
49
49
  Authentication failed:
50
50
  ${r.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 jo}from"@kanonak-protocol/sdk";async function kn(n){try{let e=new j,t=new jo,r=await new J(e,t).logout(n);r.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 Oo}from"@kanonak-protocol/sdk";async function kn(n){try{let e=new O,t=new Oo,r=await new Y(e,t).logout(n);r.success?console.log(`Logged out from ${n}.`):(console.error(`
54
54
  Logout failed:
55
55
  ${r.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 ar}from"commander";import{KanonakParser as ir,KanonakObjectParser as cr,PublisherIndex as lr,CredentialStore as ur,createAuthenticatedFetch as pr,computeIntegrity as mr}from"@kanonak-protocol/sdk";import{readFileSync as Oo,writeFileSync as No,existsSync as Lo}from"fs";import{join as Uo}from"path";import yn from"js-yaml";import{getGlobalCachePath as Fo}from"@kanonak-protocol/sdk";var Ho=`# This file is generated by Kanonak CLI. Do not edit manually.
58
- `;function bn(){let n=Fo();return Uo(n,"..","capabilities.lock")}function Y(){let n=bn();if(!Lo(n))return{version:"1",lastUpdated:new Date().toISOString(),capabilities:{}};let e=Oo(n,"utf-8"),t=yn.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 te(n){n.lastUpdated=new Date().toISOString();let e={};for(let o of Object.keys(n.capabilities).sort())e[o]=n.capabilities[o];n.capabilities=e;let t=yn.dump(n,{lineWidth:-1,sortKeys:!1,quotingType:'"'});No(bn(),Ho+t,"utf-8")}import{SingleDocumentRepository as dr}from"@kanonak-protocol/sdk/uri-helpers";import{existsSync as Mo,readdirSync as Vo,readFileSync as Bo}from"fs";import{join as wn}from"path";import{KanonakObjectParser as zo,EmbeddedKanonak as Pn,ReferenceKanonak as Rn,getGlobalCachePath as Wo}from"@kanonak-protocol/sdk";import{SingleDocumentRepository as _n}from"@kanonak-protocol/sdk/uri-helpers";import{uriKey as Ie,findSubjectsByType as qo,getStringValue as O,getReferenceUri as xe,getListValues as Cn}from"@kanonak-protocol/sdk/uri-helpers";var P="kanonak.org",R="capabilities",Te={publisher:P,package_:R,name:"Capability"},Go={publisher:P,package_:R,name:"commandName"},Kn={publisher:P,package_:R,name:"description"},Jo={publisher:P,package_:R,name:"managesType"},Yo={publisher:P,package_:R,name:"deploymentTarget"},Xo={publisher:P,package_:R,name:"hasCommand"},Zo={publisher:P,package_:R,name:"subcommandName"},Qo={publisher:P,package_:R,name:"performs"},er={publisher:P,package_:R,name:"hasArgument"},nr={publisher:P,package_:R,name:"argumentName"},$n={publisher:P,package_:R,name:"isRequired"},vn={publisher:P,package_:R,name:"isOption"},tr={publisher:P,package_:R,name:"defaultValue"};async function Dn(n,e,t){let o=Y(),r=new zo,a=[],s=!1;for(let[i,c]of Object.entries(o.capabilities)){let l=c,m=n.get(l.publisher,l.package_,l.version);if(!m){let u=await or(i,l,e,r,t);if(u)console.error(` Healed capability "${i}": ${l.publisher}/${l.package_}@${l.version} \u2192 ${u.entry.publisher}/${u.entry.package_}@${u.entry.version} (package was renamed)`),o.capabilities[i]=u.entry,l=u.entry,m=u.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 u=e.parse(m),d=new _n(u,t),h=await r.parseKanonaks(d),y=In(h,l.publisher,l.package_,l.version);y?a.push(y):console.error(` WARNING: No Capability instance found in "${i}" (${l.publisher}/${l.package_}@${l.version})`)}catch(u){console.error(` WARNING: Failed to parse capability "${i}": ${u}`)}}return s&&te(o),a}async function or(n,e,t,o,r){let a=wn(Wo(),e.publisher);if(!Mo(a))return;let s=[];for(let i of Vo(a)){if(!i.endsWith(".kan.yml"))continue;let c=i.slice(0,-8),l=c.lastIndexOf("@");if(l===-1)continue;let m=c.substring(0,l),u=c.substring(l+1);if(m===e.package_&&u===e.version)continue;let d;try{d=Bo(wn(a,i),"utf-8")}catch{continue}let h;try{let y=t.parse(d),p=new _n(y,r),g=await o.parseKanonaks(p);h=In(g,e.publisher,m,u)?.commandName}catch{continue}h===n&&s.push({entry:{publisher:e.publisher,package_:m,version:u,resolved:`kanonak://${e.publisher}/${m}@${u}`,integrity:""},content:d})}if(s.length===1)return s[0]}function In(n,e,t,o){let r=qo(n,Te);if(r.length===0)return;let a=r[0],s=O(a,Go)??"",i=O(a,Kn)??"",c=xe(a,Jo),l=xe(a,Yo),m=[];for(let u of Cn(a,Xo)){let d=rr(u,n);d&&m.push(d)}return{commandName:s,description:i,managesTypeKey:c?Ie(c):"",deploymentTargetKey:l?Ie(l):"",commands:m,publisher:e,package_:t,version:o}}function rr(n,e){let t;if(n instanceof Pn)t=n;else if(n instanceof Rn){let c=xn(e,n.subject.publisher,n.subject.package_,n.subject.name);c&&(t=c)}if(!t)return;let o=O(t,Zo)??"",r=O(t,Kn)??"",a=xe(t,Qo),s=Cn(t,er),i=[];for(let c of s){let l=sr(c,e);l&&i.push(l)}return{subcommandName:o,description:r,arguments:i,actionKey:a?Ie(a):""}}function sr(n,e){let t;if(n instanceof Pn)t=n;else if(n instanceof Rn){let c=xn(e,n.subject.publisher,n.subject.package_,n.subject.name);c&&(t=c)}if(!t)return;let o=O(t,nr)??"",r=O(t,$n)==="true"||Sn(t,$n)===!0,a=O(t,vn)==="true"||Sn(t,vn)===!0,s=O(t,tr),i={argumentName:o,required:r,isOption:a};return s!==void 0&&(i.defaultValue=s),i}function Sn(n,e){for(let t of n.statement){let o=t,r=o.predicate;if(r?.subject&&r.subject.publisher===e.publisher&&r.subject.package_===e.package_&&r.subject.name===e.name)return typeof o.object=="boolean"?o.object:void 0}}function xn(n,e,t,o){for(let r of n){if(!("name"in r)||!("namespace"in r))continue;let a=r;if(a.name===o&&!(!a.namespace||typeof a.namespace!="string")&&a.namespace.startsWith(`${e}/${t}@`))return r}}import{findSubjectsByType as fr,getStringValue as gr}from"@kanonak-protocol/sdk/uri-helpers";var hr={publisher:P,package_:R,name:"commandName"};function Tn(){let n=new ar("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 kr(e)}),n.command("remove <name>").description("Remove an installed capability").action(async e=>{await yr(e)}),n.command("list").description("List installed capabilities").action(async()=>{await br()}),n}async function kr(n){let e=x(n);e||(console.error(`Invalid package reference: "${n}"`),console.error("Expected format: {publisher}/{package}[@{version}]"),process.exit(1));let{publisher:t,packageName:o,version:r,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}/${o}${r?"@"+r:""}`),process.exit(1));let s=new D,i=new ir,c=new cr,l=new ur,m=pr(l),u=new lr({fetchFn:m}),d=r??await u.getHighestVersion(t,o);d||(console.error(`Could not resolve version for "${t}/${o}".`),process.exit(1)),console.log(`Installing capability ${t}/${o}@${d}...`);let h=s.get(t,o,d);if(!h){let v=await u.getPackageUrl(t,o,d),K=await m(v,t);if(!K.ok)throw new Error(`Failed to fetch ${v} (${K.status} ${K.statusText})`);h=await K.text(),s.put(t,o,d,h)}let y=i.parse(h),p=await S(process.cwd(),i),g=new dr(y,p),f=await c.parseKanonaks(g),k=fr(f,Te);k.length===0&&(console.error(`Package ${t}/${o}@${d} does not contain a ${P}/${R}/Capability instance.`),process.exit(1));let b=k[0],w=gr(b,hr);w||(console.error(`Capability instance in ${t}/${o}@${d} has no commandName property.`),process.exit(1));let $=Y();$.capabilities[w]={publisher:t,package_:o,version:d,resolved:await u.getPackageUrl(t,o,d),integrity:mr(h)},te($),console.log(`
59
- Installed capability "${w}".`),console.log(`Run "kanonak ${w} --help" to get started.`)}async function yr(n){let e=Y();e.capabilities[n]||(console.error(`Capability "${n}" is not installed.`),process.exit(1));let t=e.capabilities[n];delete e.capabilities[n],te(e),console.log(`Removed capability "${n}" (${t.publisher}/${t.package_}@${t.version}).`)}async function br(){let n=Y(),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,o]of e)console.log(` ${t} ${o.publisher}/${o.package_}@${o.version}`)}import{Command as re}from"commander";import{readFileSync as wr,writeFileSync as $r,mkdirSync as vr,existsSync as An,statSync as Sr}from"fs";import{join as Pr,resolve as Rr}from"path";import{KanonakParser as je,KanonakObjectParser as Oe,SubjectKanonak as _r,Reasoner as Cr,KanonakVocabulary as Kr,makeUriKey as On,pickHighestDocument as Ne,formatVersion as Nn}from"@kanonak-protocol/sdk";import{SingleDocumentRepository as oe}from"@kanonak-protocol/sdk/uri-helpers";import{findSubjectsByType as Ae,findSubjectByUri as Dr}from"@kanonak-protocol/sdk/uri-helpers";import{TX_V3 as En}from"@kanonak-protocol/sdk/transformations";import{TransformationRunnerV3 as Ir,SUPPORTED_FORMATS_V3 as Ln}from"@kanonak-protocol/sdk/transformations";import{compileTransformationV3 as Le}from"@kanonak-protocol/sdk/transformations";function Ee(n){return[...Ae(n,En.InstanceTransformation),...Ae(n,En.SetTransformation)]}function Un(){let n=new re("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",`
57
+ ${t}`),process.exit(1)}}import{Command as ir}from"commander";import{KanonakParser as cr,KanonakObjectParser as lr,PublisherIndex as ur,CredentialStore as pr,createAuthenticatedFetch as mr,computeIntegrity as dr}from"@kanonak-protocol/sdk";import{readFileSync as No,writeFileSync as Lo,existsSync as Uo}from"fs";import{join as Fo}from"path";import yn from"js-yaml";import{getGlobalCachePath as Ho}from"@kanonak-protocol/sdk";var Mo=`# This file is generated by Kanonak CLI. Do not edit manually.
58
+ `;function bn(){let n=Ho();return Fo(n,"..","capabilities.lock")}function X(){let n=bn();if(!Uo(n))return{version:"1",lastUpdated:new Date().toISOString(),capabilities:{}};let e=No(n,"utf-8"),t=yn.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 te(n){n.lastUpdated=new Date().toISOString();let e={};for(let o of Object.keys(n.capabilities).sort())e[o]=n.capabilities[o];n.capabilities=e;let t=yn.dump(n,{lineWidth:-1,sortKeys:!1,quotingType:'"'});Lo(bn(),Mo+t,"utf-8")}import{SingleDocumentRepository as fr}from"@kanonak-protocol/sdk/uri-helpers";import{existsSync as Vo,readdirSync as Bo,readFileSync as zo}from"fs";import{join as wn}from"path";import{KanonakObjectParser as Wo,EmbeddedKanonak as Pn,ReferenceKanonak as Rn,getGlobalCachePath as qo}from"@kanonak-protocol/sdk";import{SingleDocumentRepository as _n}from"@kanonak-protocol/sdk/uri-helpers";import{uriKey as Ie,findSubjectsByType as Go,getStringValue as N,getReferenceUri as xe,getListValues as Cn}from"@kanonak-protocol/sdk/uri-helpers";var P="kanonak.org",R="capabilities",Te={publisher:P,package_:R,name:"Capability"},Jo={publisher:P,package_:R,name:"commandName"},Kn={publisher:P,package_:R,name:"description"},Yo={publisher:P,package_:R,name:"managesType"},Xo={publisher:P,package_:R,name:"deploymentTarget"},Zo={publisher:P,package_:R,name:"hasCommand"},Qo={publisher:P,package_:R,name:"subcommandName"},er={publisher:P,package_:R,name:"performs"},nr={publisher:P,package_:R,name:"hasArgument"},tr={publisher:P,package_:R,name:"argumentName"},$n={publisher:P,package_:R,name:"isRequired"},vn={publisher:P,package_:R,name:"isOption"},or={publisher:P,package_:R,name:"defaultValue"};async function Dn(n,e,t){let o=X(),r=new Wo,a=[],s=!1;for(let[i,c]of Object.entries(o.capabilities)){let l=c,m=n.get(l.publisher,l.package_,l.version);if(!m){let u=await rr(i,l,e,r,t);if(u)console.error(` Healed capability "${i}": ${l.publisher}/${l.package_}@${l.version} \u2192 ${u.entry.publisher}/${u.entry.package_}@${u.entry.version} (package was renamed)`),o.capabilities[i]=u.entry,l=u.entry,m=u.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 u=e.parse(m),d=new _n(u,t),h=await r.parseKanonaks(d),y=In(h,l.publisher,l.package_,l.version);y?a.push(y):console.error(` WARNING: No Capability instance found in "${i}" (${l.publisher}/${l.package_}@${l.version})`)}catch(u){console.error(` WARNING: Failed to parse capability "${i}": ${u}`)}}return s&&te(o),a}async function rr(n,e,t,o,r){let a=wn(qo(),e.publisher);if(!Vo(a))return;let s=[];for(let i of Bo(a)){if(!i.endsWith(".kan.yml"))continue;let c=i.slice(0,-8),l=c.lastIndexOf("@");if(l===-1)continue;let m=c.substring(0,l),u=c.substring(l+1);if(m===e.package_&&u===e.version)continue;let d;try{d=zo(wn(a,i),"utf-8")}catch{continue}let h;try{let y=t.parse(d),p=new _n(y,r),g=await o.parseKanonaks(p);h=In(g,e.publisher,m,u)?.commandName}catch{continue}h===n&&s.push({entry:{publisher:e.publisher,package_:m,version:u,resolved:`kanonak://${e.publisher}/${m}@${u}`,integrity:""},content:d})}if(s.length===1)return s[0]}function In(n,e,t,o){let r=Go(n,Te);if(r.length===0)return;let a=r[0],s=N(a,Jo)??"",i=N(a,Kn)??"",c=xe(a,Yo),l=xe(a,Xo),m=[];for(let u of Cn(a,Zo)){let d=sr(u,n);d&&m.push(d)}return{commandName:s,description:i,managesTypeKey:c?Ie(c):"",deploymentTargetKey:l?Ie(l):"",commands:m,publisher:e,package_:t,version:o}}function sr(n,e){let t;if(n instanceof Pn)t=n;else if(n instanceof Rn){let c=xn(e,n.subject.publisher,n.subject.package_,n.subject.name);c&&(t=c)}if(!t)return;let o=N(t,Qo)??"",r=N(t,Kn)??"",a=xe(t,er),s=Cn(t,nr),i=[];for(let c of s){let l=ar(c,e);l&&i.push(l)}return{subcommandName:o,description:r,arguments:i,actionKey:a?Ie(a):""}}function ar(n,e){let t;if(n instanceof Pn)t=n;else if(n instanceof Rn){let c=xn(e,n.subject.publisher,n.subject.package_,n.subject.name);c&&(t=c)}if(!t)return;let o=N(t,tr)??"",r=N(t,$n)==="true"||Sn(t,$n)===!0,a=N(t,vn)==="true"||Sn(t,vn)===!0,s=N(t,or),i={argumentName:o,required:r,isOption:a};return s!==void 0&&(i.defaultValue=s),i}function Sn(n,e){for(let t of n.statement){let o=t,r=o.predicate;if(r?.subject&&r.subject.publisher===e.publisher&&r.subject.package_===e.package_&&r.subject.name===e.name)return typeof o.object=="boolean"?o.object:void 0}}function xn(n,e,t,o){for(let r of n){if(!("name"in r)||!("namespace"in r))continue;let a=r;if(a.name===o&&!(!a.namespace||typeof a.namespace!="string")&&a.namespace.startsWith(`${e}/${t}@`))return r}}import{findSubjectsByType as gr,getStringValue as hr}from"@kanonak-protocol/sdk/uri-helpers";var kr={publisher:P,package_:R,name:"commandName"};function Tn(){let n=new ir("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 yr(e)}),n.command("remove <name>").description("Remove an installed capability").action(async e=>{await br(e)}),n.command("list").description("List installed capabilities").action(async()=>{await wr()}),n}async function yr(n){let e=I(n);e||(console.error(`Invalid package reference: "${n}"`),console.error("Expected format: {publisher}/{package}[@{version}]"),process.exit(1));let{publisher:t,packageName:o,version:r,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}/${o}${r?"@"+r:""}`),process.exit(1));let s=new D,i=new cr,c=new lr,l=new pr,m=mr(l),u=new ur({fetchFn:m}),d=r??await u.getHighestVersion(t,o);d||(console.error(`Could not resolve version for "${t}/${o}".`),process.exit(1)),console.log(`Installing capability ${t}/${o}@${d}...`);let h=s.get(t,o,d);if(!h){let v=await u.getPackageUrl(t,o,d),K=await m(v,t);if(!K.ok)throw new Error(`Failed to fetch ${v} (${K.status} ${K.statusText})`);h=await K.text(),s.put(t,o,d,h)}let y=i.parse(h),p=await S(process.cwd(),i),g=new fr(y,p),f=await c.parseKanonaks(g),k=gr(f,Te);k.length===0&&(console.error(`Package ${t}/${o}@${d} does not contain a ${P}/${R}/Capability instance.`),process.exit(1));let b=k[0],w=hr(b,kr);w||(console.error(`Capability instance in ${t}/${o}@${d} has no commandName property.`),process.exit(1));let $=X();$.capabilities[w]={publisher:t,package_:o,version:d,resolved:await u.getPackageUrl(t,o,d),integrity:dr(h)},te($),console.log(`
59
+ Installed capability "${w}".`),console.log(`Run "kanonak ${w} --help" to get started.`)}async function br(n){let e=X();e.capabilities[n]||(console.error(`Capability "${n}" is not installed.`),process.exit(1));let t=e.capabilities[n];delete e.capabilities[n],te(e),console.log(`Removed capability "${n}" (${t.publisher}/${t.package_}@${t.version}).`)}async function wr(){let n=X(),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,o]of e)console.log(` ${t} ${o.publisher}/${o.package_}@${o.version}`)}import{Command as re}from"commander";import{readFileSync as $r,writeFileSync as vr,mkdirSync as Sr,existsSync as An,statSync as Pr}from"fs";import{join as Rr,resolve as _r}from"path";import{KanonakParser as je,KanonakObjectParser as Oe,SubjectKanonak as Cr,Reasoner as Kr,KanonakVocabulary as Dr,makeUriKey as On,pickHighestDocument as Ne,formatVersion as Nn}from"@kanonak-protocol/sdk";import{SingleDocumentRepository as oe}from"@kanonak-protocol/sdk/uri-helpers";import{findSubjectsByType as Ae,findSubjectByUri as Ir}from"@kanonak-protocol/sdk/uri-helpers";import{TX_V3 as En}from"@kanonak-protocol/sdk/transformations";import{TransformationRunnerV3 as xr,SUPPORTED_FORMATS_V3 as Ln}from"@kanonak-protocol/sdk/transformations";import{compileTransformationV3 as Le}from"@kanonak-protocol/sdk/transformations";function Ee(n){return[...Ae(n,En.InstanceTransformation),...Ae(n,En.SetTransformation)]}function Un(){let n=new re("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",`
61
61
  Examples:
62
62
 
63
63
  # List every Transformation available in the local workspace
@@ -95,9 +95,9 @@ Examples:
95
95
 
96
96
  # List the registered format backends
97
97
  $ kanonak transform formats
98
- `);return n.addCommand(xr()),n.addCommand(jr()),n.addCommand(Nr()),n.addCommand(Ur()),n}function xr(){return new re("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.",Tr,[]).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 Ar(n,e)}catch(t){console.error(`Error: ${t.message}`),process.exit(1)}})}function Tr(n,e){return[...e,n]}async function Ar(n,e){let t=new je,o=new Oe,r=await S(process.cwd(),t),a=await Fn(n,r,o),{transformation:s,transformationKanonaks:i}=a;console.log(`Transformation: ${le(s)}`);let c=Le(s,i);e.scope.length===0&&(console.error("At least one --scope is required."),process.exit(1));let l=[],m=new Map;for(let k of e.scope){let b=await Fr(k,r,t,o);l.push(...b);let w=await Vr(b,c.inputPattern.matchesClass,r);for(let $ of w){let v=Br($);v&&!m.has(v)&&m.set(v,$)}console.log(`Scope: ${k} \u2014 found ${w.length} instance(s) of ${c.inputPattern.matchesClass.publisher}/${c.inputPattern.matchesClass.package_}/${c.inputPattern.matchesClass.name}`)}let u=[...m.values()],d=l;e.scope.length>1&&console.log(`Total across ${e.scope.length} scope(s): ${u.length} unique instance(s)`),u.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 h=Er(c.outputs,e.format);console.log(`Output format: ${h}`);let y=Ln[h];if(!y)throw new Error(`Unknown format "${h}". Run \`kanonak transform formats\` to see what the runner supports.`);let g=await new Ir().run({transformation:s,instances:u,allKanonaks:d,transformationKanonaks:i,repository:r,parser:t,objectParser:o,outputFormat:h}),f=Rr(e.out);vr(f,{recursive:!0});for(let k of g){let b=Mr(k.fileName),w=Pr(f,`${b}${y.extension}`);$r(w,k.content,"utf-8"),console.log(` wrote ${w}`)}console.log(`Done. ${g.length} artifact(s) written to ${f}`)}function Er(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 jr(){return new re("list").description("Scan the local workspace + cache for every Transformation instance and print a one-line summary per hit.").action(async()=>{try{await Or()}catch(n){console.error(`Error: ${n.message}`),process.exit(1)}})}async function Or(){let n=new je,e=new Oe,t=await S(process.cwd(),n),o=await t.getAllDocumentsAsync(),r=new Map;for(let s of o)try{let i=new oe(s,t),c=await e.parseKanonaks(i),l=Ee(c);for(let m of l){let u=Ue(m);if(!u)continue;let d=r.get(u)??[];d.push({tx:m,kanonaks:c,doc:s}),r.set(u,d)}}catch{}let a=[];for(let s of r.values()){if(s.length===1){a.push(jn(s[0].tx,s[0].kanonaks));continue}let i=Ne(s.map(l=>l.doc));if(!i.chosen)continue;let c=s.find(l=>l.doc===i.chosen);c&&a.push(jn(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 Nr(){return new re("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 Lr(n)}catch(e){console.error(`Error: ${e.message}`),process.exit(1)}})}async function Lr(n){let e=new je,t=new Oe,o=await S(process.cwd(),e),{transformation:r,transformationKanonaks:a}=await Fn(n,o,t),s=Le(r,a);if(console.log(`Transformation: ${le(r)}`),console.log(),console.log("Input pattern:"),console.log(` Matches class: ${ce(s.inputPattern.matchesClass)}`),s.inputPattern.requires.length>0){console.log(" Required properties:");for(let i of s.inputPattern.requires)console.log(` - ${ce(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[m,u]of c.metadataRenames)l.push(`${m} \u2192 ${u}`);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: ${ce(s.rule.astClass)}`),console.log(`Rule root bindings: ${s.rule.set.length} field(s)`)),console.log(`Artifact name root kind: ${s.artifactName.kind}`)}function Ur(){return new re("formats").description("List the OutputFormat names the runner can serialize to.").action(()=>{console.log("Registered format backends:");let n=Object.entries(Ln).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 Fn(n,e,t){let o,r,a;if(n.includes("/")){let d=n.indexOf("@"),h=n;if(d!==-1){let p=n.indexOf("/",d);if(p===-1)throw new Error(`Transformation URI "${n}" has @version but no trailing /<name>`);h=n.substring(0,d)+n.substring(p)}let y=h.split("/");if(y.length<3)throw new Error(`Invalid transformation URI "${n}" \u2014 expected publisher/package/name or publisher/package@version/name`);o=y[0],r=y[1],a=y.slice(2).join("/")}else a=n;if(o&&r){let d=await e.getDocumentsByNamespaceAsync(o,r);if(d.length===0)throw new Error(`Package ${o}/${r} not found in the local workspace or cache.`);let h=Hr(n),y=Hn(d,h,`${o}/${r}`),p=new oe(y,e),g=await t.parseKanonaks(p),f=Dr(g,{publisher:o,package_:r,name:a,version:""});if(!f){let k=Ee(g),b=k.find(w=>w.name===a);if(!b)throw new Error(`Transformation "${a}" not found in package ${o}/${r}. Package contains ${k.length} Transformation(s): ${k.map(w=>w.name).join(", ")||"(none)"}`);return{transformation:b,transformationKanonaks:g}}return{transformation:f,transformationKanonaks:g}}let s=await e.getAllDocumentsAsync(),i=new Map;for(let d of s)try{let h=new oe(d,e),y=await t.parseKanonaks(h),p=Ee(y);for(let g of p){if(g.name!==a)continue;let f=Ue(g);if(!f)continue;let k=i.get(f)??[];k.push({tx:g,kanonaks:y,doc:d}),i.set(f,k)}}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 d=Array.from(i.keys()).sort().join(`
98
+ `);return n.addCommand(Tr()),n.addCommand(Or()),n.addCommand(Lr()),n.addCommand(Fr()),n}function Tr(){return new re("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.",Ar,[]).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 Er(n,e)}catch(t){console.error(`Error: ${t.message}`),process.exit(1)}})}function Ar(n,e){return[...e,n]}async function Er(n,e){let t=new je,o=new Oe,r=await S(process.cwd(),t),a=await Fn(n,r,o),{transformation:s,transformationKanonaks:i}=a;console.log(`Transformation: ${ue(s)}`);let c=Le(s,i);e.scope.length===0&&(console.error("At least one --scope is required."),process.exit(1));let l=[],m=new Map;for(let k of e.scope){let b=await Hr(k,r,t,o);l.push(...b);let w=await Br(b,c.inputPattern.matchesClass,r);for(let $ of w){let v=zr($);v&&!m.has(v)&&m.set(v,$)}console.log(`Scope: ${k} \u2014 found ${w.length} instance(s) of ${c.inputPattern.matchesClass.publisher}/${c.inputPattern.matchesClass.package_}/${c.inputPattern.matchesClass.name}`)}let u=[...m.values()],d=l;e.scope.length>1&&console.log(`Total across ${e.scope.length} scope(s): ${u.length} unique instance(s)`),u.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 h=jr(c.outputs,e.format);console.log(`Output format: ${h}`);let y=Ln[h];if(!y)throw new Error(`Unknown format "${h}". Run \`kanonak transform formats\` to see what the runner supports.`);let g=await new xr().run({transformation:s,instances:u,allKanonaks:d,transformationKanonaks:i,repository:r,parser:t,objectParser:o,outputFormat:h}),f=_r(e.out);Sr(f,{recursive:!0});for(let k of g){let b=Vr(k.fileName),w=Rr(f,`${b}${y.extension}`);vr(w,k.content,"utf-8"),console.log(` wrote ${w}`)}console.log(`Done. ${g.length} artifact(s) written to ${f}`)}function jr(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 Or(){return new re("list").description("Scan the local workspace + cache for every Transformation instance and print a one-line summary per hit.").action(async()=>{try{await Nr()}catch(n){console.error(`Error: ${n.message}`),process.exit(1)}})}async function Nr(){let n=new je,e=new Oe,t=await S(process.cwd(),n),o=await t.getAllDocumentsAsync(),r=new Map;for(let s of o)try{let i=new oe(s,t),c=await e.parseKanonaks(i),l=Ee(c);for(let m of l){let u=Ue(m);if(!u)continue;let d=r.get(u)??[];d.push({tx:m,kanonaks:c,doc:s}),r.set(u,d)}}catch{}let a=[];for(let s of r.values()){if(s.length===1){a.push(jn(s[0].tx,s[0].kanonaks));continue}let i=Ne(s.map(l=>l.doc));if(!i.chosen)continue;let c=s.find(l=>l.doc===i.chosen);c&&a.push(jn(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 Lr(){return new re("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 Ur(n)}catch(e){console.error(`Error: ${e.message}`),process.exit(1)}})}async function Ur(n){let e=new je,t=new Oe,o=await S(process.cwd(),e),{transformation:r,transformationKanonaks:a}=await Fn(n,o,t),s=Le(r,a);if(console.log(`Transformation: ${ue(r)}`),console.log(),console.log("Input pattern:"),console.log(` Matches class: ${le(s.inputPattern.matchesClass)}`),s.inputPattern.requires.length>0){console.log(" Required properties:");for(let i of s.inputPattern.requires)console.log(` - ${le(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[m,u]of c.metadataRenames)l.push(`${m} \u2192 ${u}`);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: ${le(s.rule.astClass)}`),console.log(`Rule root bindings: ${s.rule.set.length} field(s)`)),console.log(`Artifact name root kind: ${s.artifactName.kind}`)}function Fr(){return new re("formats").description("List the OutputFormat names the runner can serialize to.").action(()=>{console.log("Registered format backends:");let n=Object.entries(Ln).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 Fn(n,e,t){let o,r,a;if(n.includes("/")){let d=n.indexOf("@"),h=n;if(d!==-1){let p=n.indexOf("/",d);if(p===-1)throw new Error(`Transformation URI "${n}" has @version but no trailing /<name>`);h=n.substring(0,d)+n.substring(p)}let y=h.split("/");if(y.length<3)throw new Error(`Invalid transformation URI "${n}" \u2014 expected publisher/package/name or publisher/package@version/name`);o=y[0],r=y[1],a=y.slice(2).join("/")}else a=n;if(o&&r){let d=await e.getDocumentsByNamespaceAsync(o,r);if(d.length===0)throw new Error(`Package ${o}/${r} not found in the local workspace or cache.`);let h=Mr(n),y=Hn(d,h,`${o}/${r}`),p=new oe(y,e),g=await t.parseKanonaks(p),f=Ir(g,{publisher:o,package_:r,name:a,version:""});if(!f){let k=Ee(g),b=k.find(w=>w.name===a);if(!b)throw new Error(`Transformation "${a}" not found in package ${o}/${r}. Package contains ${k.length} Transformation(s): ${k.map(w=>w.name).join(", ")||"(none)"}`);return{transformation:b,transformationKanonaks:g}}return{transformation:f,transformationKanonaks:g}}let s=await e.getAllDocumentsAsync(),i=new Map;for(let d of s)try{let h=new oe(d,e),y=await t.parseKanonaks(h),p=Ee(y);for(let g of p){if(g.name!==a)continue;let f=Ue(g);if(!f)continue;let k=i.get(f)??[];k.push({tx:g,kanonaks:y,doc:d}),i.set(f,k)}}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 d=Array.from(i.keys()).sort().join(`
99
99
  `);throw new Error(`Multiple Transformations named "${a}" in the workspace \u2014 disambiguate with a full publisher/package/name URI:
100
- ${d}`)}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(d=>[d.doc,d])),m=Ne(c.map(d=>d.doc));if(!m.chosen)throw new Error(`Could not select a Transformation version for "${a}".`);let u=l.get(m.chosen);if(m.multipleVersionsPresent){let d=p=>{let g=p.metadata.namespace_?.version;return g?Nn(g):""},h=u.tx.namespace??"",y=h.includes("@")?h.substring(0,h.indexOf("@")):h;console.warn(`Warning: Transformation "${a}" has ${c.length} versions present (${c.map(p=>d(p.doc)).filter(Boolean).join(", ")}); using @${d(m.chosen)}. Pin with ${y}@<version>/${a} to suppress this warning.`)}return{transformation:u.tx,transformationKanonaks:u.kanonaks}}async function Fr(n,e,t,o){if(/^[.\/\\]/.test(n)||/^[A-Za-z]:/.test(n)||n.endsWith(".kan.yml")||An(n)&&Sr(n).isFile()){if(!An(n))throw new Error(`Scope file not found: ${n}`);let y=wr(n,"utf-8"),p=t.parse(y),g=new oe(p,e);return o.parseKanonaks(g)}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),m=s.substring(c+1),u=await e.getDocumentsByNamespaceAsync(l,m);if(u.length===0)throw new Error(`Scope package ${l}/${m} not found in the local workspace or cache.`);let d=Hn(u,i,`${l}/${m}`),h=new oe(d,e);return o.parseKanonaks(h)}function Hr(n){let e=n.indexOf("@");if(e===-1)return;let t=n.substring(e+1),o=t.indexOf("/");return o===-1?t:t.substring(0,o)}function Hn(n,e,t){let o=a=>{let s=a.metadata.namespace_?.version;return s?Nn(s):""},r=Ne(n,{requestedVersion:e});if(r.exactRequestedVersionMissing){let a=n.map(o).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(!r.chosen)throw new Error(`${t} not found in the local workspace or cache.`);return!e&&r.multipleVersionsPresent&&console.warn(`Warning: ${t} has ${n.length} versions present (${n.map(o).filter(Boolean).join(", ")}); using @${o(r.chosen)}. Pin with ${t}@<version> to suppress this warning.`),r.chosen}function jn(n,e){try{let t=Le(n,e);return{uri:le(n),matchesClass:ce(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 ce(n){return`${n.publisher}/${n.package_}/${n.name}`}function Mr(n){return n.replace(/[\\/:*?"<>|\s]+/g,"_").replace(/^_+|_+$/g,"")}async function Vr(n,e,t){let o=new Map;for(let s of n){if(!(s instanceof _r))continue;let i=Ue(s);i&&o.set(i,s)}let r=[];try{r=(await new Cr({vocabulary:new Kr}).reason(t)).getInstancesOfClass(On(e.publisher,e.package_,e.name))}catch{}let a=[];for(let s of r){let i=o.get(s);i&&a.push(i)}return a.length>0?a:Ae(n,e)}function Ue(n){let e=n.namespace??"",t=e.indexOf("@"),o=t===-1?e:e.substring(0,t),r=o.indexOf("/");return r===-1||!n.name?null:On(o.substring(0,r),o.substring(r+1),n.name)}function Br(n){let e=n.namespace??"";return!e||!n.name?null:`${e}/${n.name}`}import{Command as zr}from"commander";import{writeFileSync as Wr,mkdirSync as qr}from"fs";import{join as Gr,resolve as Jr}from"path";import{KanonakParser as Yr,KanonakObjectParser as Xr,SubjectKanonak as Bn,findDerivation as Zr}from"@kanonak-protocol/sdk";import{TransformationRunnerV3 as Qr}from"@kanonak-protocol/sdk/transformations";var es={publisher:"kanonak.org",package_:"formats",name:"html"},ns={publisher:"kanonak.org",package_:"derivation",name:"default"},ts={html:".html",markdown:".md",json:".json",yaml:".yaml",xml:".xml",svg:".svg",typescript:".ts","c-sharp":".cs",rust:".rs",python:".py"};function os(n){return n==="markdown"?"markdown-with-frontmatter":n}function zn(){return new zr("derive").description("Materialize a derived artifact from a Kanonak resource by walking the polymorphic derivation discovery: instance overrides \u2192 class hierarchy \u2192 universal defaults. The result is written to disk.").argument("<resource>","Resource URI in the form publisher/package[@version]/name. Identifies the specific instance to derive.").option("--format <name>","Format instance name (e.g. html, markdown, json). Defaults to html.","html").option("--variant <name>","Variant instance name (e.g. default, compact, summary). Defaults to default.","default").option("--out <dir>","Directory to write the artifact into.",".").addHelpText("after",`
100
+ ${d}`)}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(d=>[d.doc,d])),m=Ne(c.map(d=>d.doc));if(!m.chosen)throw new Error(`Could not select a Transformation version for "${a}".`);let u=l.get(m.chosen);if(m.multipleVersionsPresent){let d=p=>{let g=p.metadata.namespace_?.version;return g?Nn(g):""},h=u.tx.namespace??"",y=h.includes("@")?h.substring(0,h.indexOf("@")):h;console.warn(`Warning: Transformation "${a}" has ${c.length} versions present (${c.map(p=>d(p.doc)).filter(Boolean).join(", ")}); using @${d(m.chosen)}. Pin with ${y}@<version>/${a} to suppress this warning.`)}return{transformation:u.tx,transformationKanonaks:u.kanonaks}}async function Hr(n,e,t,o){if(/^[.\/\\]/.test(n)||/^[A-Za-z]:/.test(n)||n.endsWith(".kan.yml")||An(n)&&Pr(n).isFile()){if(!An(n))throw new Error(`Scope file not found: ${n}`);let y=$r(n,"utf-8"),p=t.parse(y),g=new oe(p,e);return o.parseKanonaks(g)}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),m=s.substring(c+1),u=await e.getDocumentsByNamespaceAsync(l,m);if(u.length===0)throw new Error(`Scope package ${l}/${m} not found in the local workspace or cache.`);let d=Hn(u,i,`${l}/${m}`),h=new oe(d,e);return o.parseKanonaks(h)}function Mr(n){let e=n.indexOf("@");if(e===-1)return;let t=n.substring(e+1),o=t.indexOf("/");return o===-1?t:t.substring(0,o)}function Hn(n,e,t){let o=a=>{let s=a.metadata.namespace_?.version;return s?Nn(s):""},r=Ne(n,{requestedVersion:e});if(r.exactRequestedVersionMissing){let a=n.map(o).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(!r.chosen)throw new Error(`${t} not found in the local workspace or cache.`);return!e&&r.multipleVersionsPresent&&console.warn(`Warning: ${t} has ${n.length} versions present (${n.map(o).filter(Boolean).join(", ")}); using @${o(r.chosen)}. Pin with ${t}@<version> to suppress this warning.`),r.chosen}function jn(n,e){try{let t=Le(n,e);return{uri:ue(n),matchesClass:le(t.inputPattern.matchesClass),outputs:Array.from(t.outputs).sort()}}catch(t){return{uri:ue(n),matchesClass:`(compile error: ${t.message})`,outputs:[]}}}function ue(n){let e=n.namespace||"",t=e.indexOf("@");return`${t===-1?e:e.substring(0,t)}/${n.name}`}function le(n){return`${n.publisher}/${n.package_}/${n.name}`}function Vr(n){return n.replace(/[\\/:*?"<>|\s]+/g,"_").replace(/^_+|_+$/g,"")}async function Br(n,e,t){let o=new Map;for(let s of n){if(!(s instanceof Cr))continue;let i=Ue(s);i&&o.set(i,s)}let r=[];try{r=(await new Kr({vocabulary:new Dr}).reason(t)).getInstancesOfClass(On(e.publisher,e.package_,e.name))}catch{}let a=[];for(let s of r){let i=o.get(s);i&&a.push(i)}return a.length>0?a:Ae(n,e)}function Ue(n){let e=n.namespace??"",t=e.indexOf("@"),o=t===-1?e:e.substring(0,t),r=o.indexOf("/");return r===-1||!n.name?null:On(o.substring(0,r),o.substring(r+1),n.name)}function zr(n){let e=n.namespace??"";return!e||!n.name?null:`${e}/${n.name}`}import{Command as Wr}from"commander";import{writeFileSync as qr,mkdirSync as Gr}from"fs";import{join as Jr,resolve as Yr}from"path";import{KanonakParser as Xr,KanonakObjectParser as Zr,SubjectKanonak as Bn,findDerivation as Qr}from"@kanonak-protocol/sdk";import{TransformationRunnerV3 as es}from"@kanonak-protocol/sdk/transformations";var ns={publisher:"kanonak.org",package_:"formats",name:"html"},ts={publisher:"kanonak.org",package_:"derivation",name:"default"},os={html:".html",markdown:".md",json:".json",yaml:".yaml",xml:".xml",svg:".svg",typescript:".ts","c-sharp":".cs",rust:".rs",python:".py"};function rs(n){return n==="markdown"?"markdown-with-frontmatter":n}function zn(){return new Wr("derive").description("Materialize a derived artifact from a Kanonak resource by walking the polymorphic derivation discovery: instance overrides \u2192 class hierarchy \u2192 universal defaults. The result is written to disk.").argument("<resource>","Resource URI in the form publisher/package[@version]/name. Identifies the specific instance to derive.").option("--format <name>","Format instance name (e.g. html, markdown, json). Defaults to html.","html").option("--variant <name>","Variant instance name (e.g. default, compact, summary). Defaults to default.","default").option("--out <dir>","Directory to write the artifact into.",".").addHelpText("after",`
101
101
  Examples:
102
102
 
103
103
  # Render a resource as HTML using whatever derivation the discovery
@@ -108,20 +108,20 @@ Examples:
108
108
 
109
109
  # Materialize the JSON view (universal default unless overridden).
110
110
  $ kanonak derive my-publisher.com/my-package/my-resource --format json
111
- `).action(async(n,e)=>{try{await rs(n,e)}catch(t){console.error(`Error: ${t.message}`),process.exit(1)}})}async function rs(n,e){let t=x(n);if(!t||!t.instanceName)throw new Error(`Invalid resource URI "${n}". Expected publisher/package[@version]/instance.`);let o=new Yr,r=new Xr,a=await S(process.cwd(),o),s=await r.parseKanonaks(a),i=ss(s,t);if(!i)throw new Error(`Resource ${t.publisher}/${t.packageName}${t.version?`@${t.version}`:""}/${t.instanceName} not found in the workspace or cache.`);console.log(`Resource: ${Mn(i)}`);let c=is(e.format),l=cs(e.variant),m=Zr(i,c,l,s);if(!m)throw new Error(`No derivation found for resource ${Mn(i)} at (format=${e.format}, variant=${e.variant}). The class hierarchy declares no binding and no universal default applies.`);console.log(`Derivation: ${ls(m)} \u2192 ${Vn(m.transformation)}`);let u=as(s,m.transformation);if(!u)throw new Error(`Transformation ${Vn(m.transformation)} not found in the workspace or cache. The binding pointed at a transformation the resolver cannot locate.`);let d=os(e.format),y=await new Qr().run({transformation:u,instances:[i],allKanonaks:s,repository:a,parser:o,objectParser:r,outputFormat:d}),p=Jr(e.out);qr(p,{recursive:!0});let g=ts[e.format]??"";for(let f of y){let k=us(f.fileName),b=Gr(p,`${k}${g}`);Wr(b,f.content,"utf-8"),console.log(` wrote ${b}`)}console.log(`Done. ${y.length} artifact(s) written to ${p}`)}function ss(n,e){for(let t of n){if(!(t instanceof Bn)||t.name!==e.instanceName)continue;let o=t.namespace||"",r=`${e.publisher}/${e.packageName}@`;if(o.startsWith(r))if(e.version){if(o===`${e.publisher}/${e.packageName}@${e.version}`)return t}else return t}}function as(n,e){let t=`${e.publisher}/${e.package_}@${e.version}`;for(let o of n)if(o instanceof Bn&&o.name===e.name&&o.namespace===t)return o}function is(n){if(n.includes("/")){let e=x(n);if(!e||!e.instanceName)throw new Error(`Invalid --format URI "${n}".`);return{publisher:e.publisher,package_:e.packageName,name:e.instanceName}}return{...es,name:n}}function cs(n){if(n.includes("/")){let e=x(n);if(!e||!e.instanceName)throw new Error(`Invalid --variant URI "${n}".`);return{publisher:e.publisher,package_:e.packageName,name:e.instanceName}}return{...ns,name:n}}function Mn(n){return`${n.namespace}/${n.name}`}function Vn(n){return`${n.publisher}/${n.package_}@${n.version}/${n.name}`}function ls(n){return n.source==="instance"?"instance override":`class ${n.source.publisher}/${n.source.package_}/${n.source.name}`}function us(n){return n.replace(/[^a-zA-Z0-9._@-]+/g,"_")}import{Command as ps}from"commander";import{writeFileSync as ue,mkdirSync as He}from"fs";import{join as F,resolve as Wn}from"path";import{KanonakParser as ms,KanonakObjectParser as ds,SubjectKanonak as fs,LookRenderer as gs}from"@kanonak-protocol/sdk";import{TransformationEngine as hs}from"@kanonak-protocol/sdk/transformations";import{readFileSync as ks}from"fs";var ys=[{format:{publisher:"kanonak.org",package_:"formats",name:"html"},fileExtension:".html"},{format:{publisher:"kanonak.org",package_:"formats",name:"stylesheet"},fileExtension:".css"},{format:{publisher:"kanonak.org",package_:"formats",name:"svg"},fileExtension:".svg"}];function qn(){return new ps("publish").description("Generate a static Kanonak site from the local workspace. Walks every resource and renders HTML + stylesheet via the engine. Writes to --out in the canonical Kanonak URL hierarchy.").option("--workspace <dir>","Workspace directory containing .kan.yml package files. Defaults to current directory.",process.cwd()).option("--out <dir>","Output directory for the generated site. Defaults to _site.","_site").action(async n=>{await bs(n)})}async function bs(n){let e=Wn(n.workspace),t=Wn(n.out),o=new ms,r=new ds,a=[];W(e,a),a.length===0&&(console.error(`No .kan.yml files found under ${e}`),process.exit(1)),console.log(`Found ${a.length} local package file(s) under ${e}`);let s=new Set;for(let p of a)try{let g=ks(p,"utf-8"),k=o.parse(g).metadata?.namespace_;if(!k)continue;let b=k.version;s.add(`${k.publisher}/${k.package_}@${b.major}.${b.minor}.${b.patch}`)}catch(g){console.warn(` warning: failed to parse ${p}: ${g.message}`)}console.log(`Local namespaces: ${[...s].join(", ")}`);let i=await S(e,o),c=await r.parseKanonaks(i),l=c.filter(p=>{if(!(p instanceof fs)||!s.has(p.namespace||""))return!1;let f=(p.namespace||"").split("/")[1]?.split("@")[0];return p.name!==f});console.log(`Publishing ${l.length} resource(s) to ${t}`);let m=new hs(i,o,r),u=new gs(c),d=0,h=0;for(let p of l){let g=p.namespace||"",[f,k]=g.split("/");if(!f||!k)continue;let[b,w]=k.split("@");if(!b||!w)continue;let $=F(t,b,w);He($,{recursive:!0});let v=u.findCascadedLook(p),K=v&&!(v.sourceClass.publisher==="kanonak.org"&&v.sourceClass.package_==="core-rdf"&&v.sourceClass.name==="Resource"),E=w.split(".").map(Number),Q=E.length===3&&E.every(I=>!Number.isNaN(I))?{major:E[0],minor:E[1],patch:E[2]}:void 0;for(let I of ys){let N=I.format.name;try{let L,z;if(K&&(N==="html"||N==="stylesheet"))L=N==="html"?u.renderHtml(p):u.renderStylesheet(p),z=`${p.name}${I.fileExtension}`;else{let ae={publisher:f,package_:b,name:p.name,...Q?{version:Q}:{}},ie=await m.render({resource:ae,format:I.format});L=ie.content,N==="html"?z=`${p.name}${I.fileExtension}`:z=ie.filename.includes(".")?ie.filename:`${ie.filename}${I.fileExtension}`}let ee=F($,z);ue(ee,L,"utf-8"),d+=1}catch(L){console.warn(` ${f}/${b}@${w}/${p.name} [${N}]: ${L.message}`),h+=1}}}console.log(`Done. ${d} artifact(s) written, ${h} skipped.`),h>0&&console.log("Skipped artifacts are typically resources with no derivation binding for the requested format (e.g. an instance class without an html transformation). This is expected for vocabulary-only packages \u2014 they have no instances to render.");let y=ws(t,l);console.log(`Wrote ${y} version-form redirect stub(s).`)}function ws(n,e){let t=new Map;for(let r of e){let a=r.namespace||"",[,s]=a.split("/");if(!s)continue;let[i,c]=s.split("@");if(!i||!c)continue;let l=c.split(".").map(Number);if(l.length!==3||l.some(u=>Number.isNaN(u)))continue;let m=`${i}/${r.name}`;t.has(m)||t.set(m,[]),t.get(m).push({verStr:c,major:l[0],minor:l[1],patch:l[2]})}let o=0;for(let[r,a]of t){let[s,i]=r.split("/");a.sort((u,d)=>d.major-u.major||d.minor-u.minor||d.patch-u.patch);let c=a[0];ue(F(n,s,`${i}.html`),Fe(`/${s}/${c.verStr}/${i}`),"utf-8"),o+=1;let l=new Set;for(let u of a){if(l.has(u.major))continue;l.add(u.major);let d=F(n,s,String(u.major));He(d,{recursive:!0}),ue(F(d,`${i}.html`),Fe(`/${s}/${u.verStr}/${i}`),"utf-8"),o+=1}let m=new Set;for(let u of a){let d=`${u.major}.${u.minor}`;if(m.has(d))continue;m.add(d);let h=F(n,s,d);He(h,{recursive:!0}),ue(F(h,`${i}.html`),Fe(`/${s}/${u.verStr}/${i}`),"utf-8"),o+=1}}return o}function Fe(n){let e=n.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;");return`<!doctype html>
111
+ `).action(async(n,e)=>{try{await ss(n,e)}catch(t){console.error(`Error: ${t.message}`),process.exit(1)}})}async function ss(n,e){let t=I(n);if(!t||!t.instanceName)throw new Error(`Invalid resource URI "${n}". Expected publisher/package[@version]/instance.`);let o=new Xr,r=new Zr,a=await S(process.cwd(),o),s=await r.parseKanonaks(a),i=as(s,t);if(!i)throw new Error(`Resource ${t.publisher}/${t.packageName}${t.version?`@${t.version}`:""}/${t.instanceName} not found in the workspace or cache.`);console.log(`Resource: ${Mn(i)}`);let c=cs(e.format),l=ls(e.variant),m=Qr(i,c,l,s);if(!m)throw new Error(`No derivation found for resource ${Mn(i)} at (format=${e.format}, variant=${e.variant}). The class hierarchy declares no binding and no universal default applies.`);console.log(`Derivation: ${us(m)} \u2192 ${Vn(m.transformation)}`);let u=is(s,m.transformation);if(!u)throw new Error(`Transformation ${Vn(m.transformation)} not found in the workspace or cache. The binding pointed at a transformation the resolver cannot locate.`);let d=rs(e.format),y=await new es().run({transformation:u,instances:[i],allKanonaks:s,repository:a,parser:o,objectParser:r,outputFormat:d}),p=Yr(e.out);Gr(p,{recursive:!0});let g=os[e.format]??"";for(let f of y){let k=ps(f.fileName),b=Jr(p,`${k}${g}`);qr(b,f.content,"utf-8"),console.log(` wrote ${b}`)}console.log(`Done. ${y.length} artifact(s) written to ${p}`)}function as(n,e){for(let t of n){if(!(t instanceof Bn)||t.name!==e.instanceName)continue;let o=t.namespace||"",r=`${e.publisher}/${e.packageName}@`;if(o.startsWith(r))if(e.version){if(o===`${e.publisher}/${e.packageName}@${e.version}`)return t}else return t}}function is(n,e){let t=`${e.publisher}/${e.package_}@${e.version}`;for(let o of n)if(o instanceof Bn&&o.name===e.name&&o.namespace===t)return o}function cs(n){if(n.includes("/")){let e=I(n);if(!e||!e.instanceName)throw new Error(`Invalid --format URI "${n}".`);return{publisher:e.publisher,package_:e.packageName,name:e.instanceName}}return{...ns,name:n}}function ls(n){if(n.includes("/")){let e=I(n);if(!e||!e.instanceName)throw new Error(`Invalid --variant URI "${n}".`);return{publisher:e.publisher,package_:e.packageName,name:e.instanceName}}return{...ts,name:n}}function Mn(n){return`${n.namespace}/${n.name}`}function Vn(n){return`${n.publisher}/${n.package_}@${n.version}/${n.name}`}function us(n){return n.source==="instance"?"instance override":`class ${n.source.publisher}/${n.source.package_}/${n.source.name}`}function ps(n){return n.replace(/[^a-zA-Z0-9._@-]+/g,"_")}import{Command as ms}from"commander";import{writeFileSync as se,mkdirSync as He}from"fs";import{join as L,resolve as Wn}from"path";import{KanonakParser as ds,KanonakObjectParser as fs,SubjectKanonak as gs,LookRenderer as hs}from"@kanonak-protocol/sdk";import{TransformationEngine as ks}from"@kanonak-protocol/sdk/transformations";import{readFileSync as ys}from"fs";var bs=[{format:{publisher:"kanonak.org",package_:"formats",name:"html"},fileExtension:".html"},{format:{publisher:"kanonak.org",package_:"formats",name:"stylesheet"},fileExtension:".css"},{format:{publisher:"kanonak.org",package_:"formats",name:"svg"},fileExtension:".svg"}];function qn(){return new ms("publish").description("Generate a static Kanonak site from the local workspace. Walks every resource and renders HTML + stylesheet via the engine. Writes to --out in the canonical Kanonak URL hierarchy.").option("--workspace <dir>","Workspace directory containing .kan.yml package files. Defaults to current directory.",process.cwd()).option("--out <dir>","Output directory for the generated site. Defaults to _site.","_site").action(async n=>{await ws(n)})}async function ws(n){let e=Wn(n.workspace),t=Wn(n.out),o=new ds,r=new fs,a=[];q(e,a),a.length===0&&(console.error(`No .kan.yml files found under ${e}`),process.exit(1)),console.log(`Found ${a.length} local package file(s) under ${e}`);let s=new Set;for(let p of a)try{let g=ys(p,"utf-8"),k=o.parse(g).metadata?.namespace_;if(!k)continue;let b=k.version;s.add(`${k.publisher}/${k.package_}@${b.major}.${b.minor}.${b.patch}`)}catch(g){console.warn(` warning: failed to parse ${p}: ${g.message}`)}console.log(`Local namespaces: ${[...s].join(", ")}`);let i=await S(e,o),c=await r.parseKanonaks(i),l=c.filter(p=>{if(!(p instanceof gs)||!s.has(p.namespace||""))return!1;let f=(p.namespace||"").split("/")[1]?.split("@")[0];return p.name!==f});console.log(`Publishing ${l.length} resource(s) to ${t}`);let m=new ks(i,o,r),u=new hs(c),d=0,h=0;for(let p of l){let g=p.namespace||"",[f,k]=g.split("/");if(!f||!k)continue;let[b,w]=k.split("@");if(!b||!w)continue;let $=L(t,b,w);He($,{recursive:!0});let v=u.findCascadedLook(p),K=v&&!(v.sourceClass.publisher==="kanonak.org"&&v.sourceClass.package_==="core-rdf"&&v.sourceClass.name==="Resource"),E=w.split(".").map(Number),ee=E.length===3&&E.every(A=>!Number.isNaN(A))?{major:E[0],minor:E[1],patch:E[2]}:void 0,W=u.renderRawMarkdown(p);W!==void 0&&(se(L($,`${p.name}.md`),W,"utf-8"),d+=1);for(let A of bs){let U=A.format.name;try{let F,j;if(K&&(U==="html"||U==="stylesheet"))F=U==="html"?u.renderDocument(p):u.renderStylesheet(p),j=`${p.name}${A.fileExtension}`;else{let Ht={publisher:f,package_:b,name:p.name,...ee?{version:ee}:{}},ce=await m.render({resource:Ht,format:A.format});F=ce.content,U==="html"?j=`${p.name}${A.fileExtension}`:j=ce.filename.includes(".")?ce.filename:`${ce.filename}${A.fileExtension}`}let ie=L($,j);se(ie,F,"utf-8"),d+=1}catch(F){console.warn(` ${f}/${b}@${w}/${p.name} [${U}]: ${F.message}`),h+=1}}}console.log(`Done. ${d} artifact(s) written, ${h} skipped.`),h>0&&console.log("Skipped artifacts are typically resources with no derivation binding for the requested format (e.g. an instance class without an html transformation). This is expected for vocabulary-only packages \u2014 they have no instances to render.");let y=$s(t,l);console.log(`Wrote ${y} version-form redirect stub(s).`)}function $s(n,e){let t=new Map;for(let r of e){let a=r.namespace||"",[,s]=a.split("/");if(!s)continue;let[i,c]=s.split("@");if(!i||!c)continue;let l=c.split(".").map(Number);if(l.length!==3||l.some(u=>Number.isNaN(u)))continue;let m=`${i}/${r.name}`;t.has(m)||t.set(m,[]),t.get(m).push({verStr:c,major:l[0],minor:l[1],patch:l[2]})}let o=0;for(let[r,a]of t){let[s,i]=r.split("/");a.sort((u,d)=>d.major-u.major||d.minor-u.minor||d.patch-u.patch);let c=a[0];se(L(n,s,`${i}.html`),Fe(`/${s}/${c.verStr}/${i}`),"utf-8"),o+=1;let l=new Set;for(let u of a){if(l.has(u.major))continue;l.add(u.major);let d=L(n,s,String(u.major));He(d,{recursive:!0}),se(L(d,`${i}.html`),Fe(`/${s}/${u.verStr}/${i}`),"utf-8"),o+=1}let m=new Set;for(let u of a){let d=`${u.major}.${u.minor}`;if(m.has(d))continue;m.add(d);let h=L(n,s,d);He(h,{recursive:!0}),se(L(h,`${i}.html`),Fe(`/${s}/${u.verStr}/${i}`),"utf-8"),o+=1}}return o}function Fe(n){let e=n.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;");return`<!doctype html>
112
112
  <meta charset="utf-8">
113
113
  <title>Redirecting\u2026</title>
114
114
  <meta http-equiv="refresh" content="0; url=${e}">
115
115
  <link rel="canonical" href="${e}">
116
116
  <p>If you are not redirected automatically, follow this <a href="${e}">link</a>.</p>
117
- `}import{Command as Zn}from"commander";import{writeFileSync as Me,mkdirSync as pe}from"fs";import{join as Ve,resolve as $s,dirname as Be}from"path";import{KanonakParser as vs,KanonakObjectParser as Ss,SubjectKanonak as Qn,ReferenceStatement as Ps,ReferenceKanonak as Rs,ListStatement as _s,StringStatement as et,EmbeddedStatement as Cs,findDerivation as Gn}from"@kanonak-protocol/sdk";import{SingleDocumentRepository as Ks}from"@kanonak-protocol/sdk/uri-helpers";import{TransformationRunnerV3 as Ds}from"@kanonak-protocol/sdk/transformations";import{findSubjectsByType as me}from"@kanonak-protocol/sdk/uri-helpers";var T="kanonak.org",A="site",Jn={publisher:"kanonak.org",package_:"formats",name:"html"},Yn={publisher:"kanonak.org",package_:"derivation",name:"default"};function nt(){let n=new Zn("site").description("Materialize a publisher's site \u2014 every StaticPage and AggregateView in the workspace gets rendered to its declared output path under the --out directory.");return n.addCommand(Is()),n}function Is(){return new Zn("build").description("Walk the workspace, find every StaticPage and AggregateView, and write each materialized artifact to its declared output path under the --out directory.").option("--out <dir>","Output base directory.","./_site").action(async n=>{try{await xs(n)}catch(e){console.error(`Error: ${e.message}`),process.exit(1)}})}async function xs(n){let e=new vs,t=new Ss,o=await S(process.cwd(),e),r=await t.parseKanonaks(o),a=$s(n.out);pe(a,{recursive:!0});let s=await o.getAllDocumentsAsync(),i=new Set;for(let p of s){let g=p.metadata.namespace_?.toString();g&&i.add(g)}let c={publisher:T,package_:A,name:"StaticPage"},l={publisher:T,package_:A,name:"ResourcePage"},m={publisher:T,package_:A,name:"AggregateView"},u=me(r,c).filter(p=>i.has(p.namespace||"")),d=me(r,l).filter(p=>i.has(p.namespace||"")),h=me(r,m).filter(p=>i.has(p.namespace||""));console.log(`Found ${u.length} StaticPage(s), ${d.length} ResourcePage(s), and ${h.length} AggregateView(s) in the workspace.`);let y=new Ds;for(let p of u){let g=ze(p,T,A,"outputPath")??`${p.name}.html`,f=Gn(p,Jn,Yn,r);if(!f){console.warn(` [skip] ${p.name}: no HTML/default derivation found (check class hierarchy or universal-derivations is loaded)`);continue}let k=We(r,f.transformation);if(!k){console.warn(` [skip] ${p.name}: transformation ${qe(f.transformation)} not found`);continue}let b=await y.run({transformation:k,instances:[p],allKanonaks:r,repository:o,parser:e,objectParser:t,outputFormat:"html"});if(b.length===0){console.warn(` [skip] ${p.name}: transformation produced no artifacts`);continue}let w=Ve(a,g);pe(Be(w),{recursive:!0}),Me(w,b[0].content,"utf-8"),console.log(` wrote ${w} (StaticPage ${p.name})`)}for(let p of d){let g=ze(p,T,A,"outputPath")??`${p.name}.html`,f=Xn(p,T,A,"pageOf");if(!f){console.warn(` [skip] ${p.name}: no pageOf declared`);continue}let k=r.find(K=>K instanceof Qn&&K.name===f.name&&(K.namespace||"").startsWith(`${f.publisher}/${f.package_}@`));if(!k){console.warn(` [skip] ${p.name}: pageOf target ${f.publisher}/${f.package_}/${f.name} not found`);continue}let b=Gn(k,Jn,Yn,r);if(!b){console.warn(` [skip] ${p.name}: no derivation for target ${k.name}`);continue}let w=We(r,b.transformation);if(!w){console.warn(` [skip] ${p.name}: transformation ${qe(b.transformation)} not found`);continue}let $=await y.run({transformation:w,instances:[k],allKanonaks:r,repository:o,parser:e,objectParser:t,outputFormat:"html"});if($.length===0){console.warn(` [skip] ${p.name}: transformation produced no artifacts`);continue}let v=Ve(a,g);pe(Be(v),{recursive:!0}),Me(v,$[0].content,"utf-8"),console.log(` wrote ${v} (ResourcePage ${p.name} \u2192 ${k.name})`)}for(let p of h){let g=ze(p,T,A,"outputPath");if(!g){console.warn(` [skip] ${p.name}: no outputPath declared`);continue}let f=Xn(p,T,A,"scopeClass");if(!f){console.warn(` [skip] ${p.name}: no scopeClass declared`);continue}let k={publisher:f.publisher,package_:f.package_,name:f.name},b=Ts(p,T,A,"scopeSources"),w=As(p);if(!w){console.warn(` [skip] ${p.name}: no transformation declared`);continue}let $=We(r,w);if(!$){console.warn(` [skip] ${p.name}: transformation ${qe(w)} not found`);continue}let v=await js(b,o),K=[],E=new Set;for(let N of v){let L=await Os(N,o,e,t),z=me(L,k);for(let ee of z){let ae=`${ee.namespace}/${ee.name}`;E.has(ae)||(E.add(ae),K.push(ee))}}console.log(` ${p.name}: ${K.length} instance(s) of ${k.publisher}/${k.package_}/${k.name} across ${v.length} scope(s)`);let Q=await y.run({transformation:$,instances:K,allKanonaks:r,repository:o,parser:e,objectParser:t,outputFormat:"html"});if(Q.length===0){console.warn(` [skip] ${p.name}: transformation produced no artifacts`);continue}let I=Ve(a,g);pe(Be(I),{recursive:!0}),Me(I,Q[0].content,"utf-8"),console.log(` wrote ${I} (AggregateView ${p.name})`)}console.log("Site build complete.")}function ze(n,e,t,o){for(let r of n.statement)if(r instanceof et&&de(r,e,t,o))return r.object}function Ts(n,e,t,o){for(let r of n.statement){if(!(r instanceof _s)||!de(r,e,t,o))continue;let a=[];for(let s of r.object??[]){let i=s.value;typeof i=="string"&&a.push(i)}return a}return[]}function Xn(n,e,t,o){for(let r of n.statement)if(r instanceof Ps&&de(r,e,t,o)&&r.object instanceof Rs)return{publisher:r.object.subject.publisher,package_:r.object.subject.package_,name:r.object.subject.name}}function As(n){for(let e of n.statement)if(e instanceof Cs&&de(e,T,A,"transformation"))return Es(e.object)}function Es(n){let e,t,o,r;for(let a of n.statement){if(!(a instanceof et))continue;let s=a.predicate?.subject?.name;s==="publisher"?e=a.object:s==="package"?t=a.object:s==="version"?o=a.object:s==="name"&&(r=a.object)}if(!(!e||!t||!o||!r))return{publisher:e,package_:t,version:o,name:r}}function de(n,e,t,o){let r=n.predicate?.subject;return r?r.publisher===e&&r.package_===t&&r.name===o:!1}function We(n,e){let t=`${e.publisher}/${e.package_}@${e.version}`;for(let o of n)if(o instanceof Qn&&o.name===e.name&&o.namespace===t)return o}function qe(n){return`${n.publisher}/${n.package_}@${n.version}/${n.name}`}async function js(n,e){let t=[];for(let o of n){let r=o.indexOf("@*");if(r===-1){t.push(o);continue}let a=o.substring(0,r),s=a.indexOf("/");if(s===-1){t.push(o);continue}let i=a.substring(0,s),c=a.substring(s+1),l=await e.getDocumentsByNamespaceAsync(i,c);for(let m of l){let u=m.metadata.namespace_;if(!u)continue;let d=u.version;t.push(`${u.publisher}/${u.package_}@${d.major}.${d.minor}.${d.patch}`)}}return t}async function Os(n,e,t,o){let r=n.indexOf("/"),a=n.indexOf("@");if(r===-1||a===-1)return[];let s=n.substring(0,r),i=n.substring(r+1,a),c=n.substring(a+1),l=await e.getDocumentsByNamespaceAsync(s,i);for(let m of l){let u=m.metadata.namespace_?.version;if(u&&`${u.major}.${u.minor}.${u.patch}`===c){let d=new Ks(m,e);return o.parseKanonaks(d)}}return[]}import{Command as Ns}from"commander";import{KanonakParser as Ls,PublisherIndex as tt,CredentialStore as ot,createAuthenticatedFetch as rt,FileSystemKanonakDocumentRepository as Us,Reasoner as Fs,KanonakVocabulary as Hs,getGlobalCachePath as Ms,makeUriKey as Vs}from"@kanonak-protocol/sdk";function Bs(n){let e=n.split("/");if(e.length!==3)return null;let[t,o,r]=e;return!t||!o||!r?null:{publisher:t,package_:o,name:r}}function st(){return new Ns("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 Ws(n,e.type):await zs(n)})}async function zs(n){let e=new ot,t=rt(e),o=new tt({fetchFn:t}),r;try{r=await o.listLatestPackages(n)}catch(s){console.error(`Failed to fetch publisher index for ${n}: ${s.message}`),process.exit(1)}if(r.length===0){console.log(`No packages found at ${n}.`);return}console.log(`Packages published by ${n}:
118
- `);let a=r.reduce((s,i)=>Math.max(s,i.packageName.length),0);for(let{packageName:s,version:i}of r)console.log(` ${s.padEnd(a)} @${i}`)}async function Ws(n,e){let t=Bs(e);t||(console.error(`Invalid --type value: ${e}`),console.error("Expected: publisher/package/Name (e.g. kanonak.org/capabilities/Capability)"),process.exit(1));let o=new Ls,r=new ot,a=rt(r),s=new tt({fetchFn:a}),i=new D,c=new Set,l=[];try{l=await s.listLatestPackages(n)}catch(g){console.error(`Failed to fetch publisher index for ${n}: ${g.message}`),process.exit(1)}for(let{packageName:g,version:f}of l)c.add(`${n}|${g}|${f}`);await Ge(s,i,a,"kanonak.org","core-rdf",c),await Ge(s,i,a,"kanonak.org","core-owl",c),await Ge(s,i,a,t.publisher,t.package_,c);for(let g of c){let[f,k,b]=g.split("|");if(!i.has(f,k,b))try{let w=await s.getPackageUrl(f,k,b),$=await a(w,f);if(!$.ok){console.error(`Warning: failed to fetch ${f}/${k}@${b}: ${$.status} ${$.statusText}`);continue}let v=await $.text();i.put(f,k,b,v)}catch(w){console.error(`Warning: failed to fetch ${f}/${k}@${b}: ${w.message}`)}}let m=new Us(Ms(),!0,o),d=await new Fs({vocabulary:new Hs}).reason(m),h=Vs(t.publisher,t.package_,t.name),p=d.getInstancesOfClass(h).filter(g=>g!==h);if(p.length===0){console.log(`No instances of ${h} found in ${n}'s catalogue.`);return}console.log(`Instances of ${h} in ${n}'s catalogue:
119
- `),p.sort();for(let g of p)console.log(` ${g}`)}async function Ge(n,e,t,o,r,a){try{let s=await n.getHighestVersion(o,r);if(!s)return;a.add(`${o}|${r}|${s}`)}catch{}}import{existsSync as qs,readFileSync as Gs}from"fs";import{dirname as Js,resolve as Ys}from"path";import{KanonakObjectParser as Xs,KanonakParser as Zs,canonicalForm as Qs,canonicalHash as ea,parseKanonakAddress as na,pickHighestDocument as ta}from"@kanonak-protocol/sdk";import{SingleDocumentRepository as oa}from"@kanonak-protocol/sdk/uri-helpers";async function at(n,e={}){let t=new Zs,o=new Xs,{document:r,source:a}=await ra(n,t),s=await S(sa(a),t),i=new oa(r,s),c=await o.parseKanonaks(i),l=ea(c);if(console.log(l),e.verbose){let m=Qs(c);process.stderr.write(`# canonical form for ${a}
117
+ `}import{Command as Zn}from"commander";import{writeFileSync as Me,mkdirSync as pe}from"fs";import{join as Ve,resolve as vs,dirname as Be}from"path";import{KanonakParser as Ss,KanonakObjectParser as Ps,SubjectKanonak as Qn,ReferenceStatement as Rs,ReferenceKanonak as _s,ListStatement as Cs,StringStatement as et,EmbeddedStatement as Ks,findDerivation as Gn}from"@kanonak-protocol/sdk";import{SingleDocumentRepository as Ds}from"@kanonak-protocol/sdk/uri-helpers";import{TransformationRunnerV3 as Is}from"@kanonak-protocol/sdk/transformations";import{findSubjectsByType as me}from"@kanonak-protocol/sdk/uri-helpers";var x="kanonak.org",T="site",Jn={publisher:"kanonak.org",package_:"formats",name:"html"},Yn={publisher:"kanonak.org",package_:"derivation",name:"default"};function nt(){let n=new Zn("site").description("Materialize a publisher's site \u2014 every StaticPage and AggregateView in the workspace gets rendered to its declared output path under the --out directory.");return n.addCommand(xs()),n}function xs(){return new Zn("build").description("Walk the workspace, find every StaticPage and AggregateView, and write each materialized artifact to its declared output path under the --out directory.").option("--out <dir>","Output base directory.","./_site").action(async n=>{try{await Ts(n)}catch(e){console.error(`Error: ${e.message}`),process.exit(1)}})}async function Ts(n){let e=new Ss,t=new Ps,o=await S(process.cwd(),e),r=await t.parseKanonaks(o),a=vs(n.out);pe(a,{recursive:!0});let s=await o.getAllDocumentsAsync(),i=new Set;for(let p of s){let g=p.metadata.namespace_?.toString();g&&i.add(g)}let c={publisher:x,package_:T,name:"StaticPage"},l={publisher:x,package_:T,name:"ResourcePage"},m={publisher:x,package_:T,name:"AggregateView"},u=me(r,c).filter(p=>i.has(p.namespace||"")),d=me(r,l).filter(p=>i.has(p.namespace||"")),h=me(r,m).filter(p=>i.has(p.namespace||""));console.log(`Found ${u.length} StaticPage(s), ${d.length} ResourcePage(s), and ${h.length} AggregateView(s) in the workspace.`);let y=new Is;for(let p of u){let g=ze(p,x,T,"outputPath")??`${p.name}.html`,f=Gn(p,Jn,Yn,r);if(!f){console.warn(` [skip] ${p.name}: no HTML/default derivation found (check class hierarchy or universal-derivations is loaded)`);continue}let k=We(r,f.transformation);if(!k){console.warn(` [skip] ${p.name}: transformation ${qe(f.transformation)} not found`);continue}let b=await y.run({transformation:k,instances:[p],allKanonaks:r,repository:o,parser:e,objectParser:t,outputFormat:"html"});if(b.length===0){console.warn(` [skip] ${p.name}: transformation produced no artifacts`);continue}let w=Ve(a,g);pe(Be(w),{recursive:!0}),Me(w,b[0].content,"utf-8"),console.log(` wrote ${w} (StaticPage ${p.name})`)}for(let p of d){let g=ze(p,x,T,"outputPath")??`${p.name}.html`,f=Xn(p,x,T,"pageOf");if(!f){console.warn(` [skip] ${p.name}: no pageOf declared`);continue}let k=r.find(K=>K instanceof Qn&&K.name===f.name&&(K.namespace||"").startsWith(`${f.publisher}/${f.package_}@`));if(!k){console.warn(` [skip] ${p.name}: pageOf target ${f.publisher}/${f.package_}/${f.name} not found`);continue}let b=Gn(k,Jn,Yn,r);if(!b){console.warn(` [skip] ${p.name}: no derivation for target ${k.name}`);continue}let w=We(r,b.transformation);if(!w){console.warn(` [skip] ${p.name}: transformation ${qe(b.transformation)} not found`);continue}let $=await y.run({transformation:w,instances:[k],allKanonaks:r,repository:o,parser:e,objectParser:t,outputFormat:"html"});if($.length===0){console.warn(` [skip] ${p.name}: transformation produced no artifacts`);continue}let v=Ve(a,g);pe(Be(v),{recursive:!0}),Me(v,$[0].content,"utf-8"),console.log(` wrote ${v} (ResourcePage ${p.name} \u2192 ${k.name})`)}for(let p of h){let g=ze(p,x,T,"outputPath");if(!g){console.warn(` [skip] ${p.name}: no outputPath declared`);continue}let f=Xn(p,x,T,"scopeClass");if(!f){console.warn(` [skip] ${p.name}: no scopeClass declared`);continue}let k={publisher:f.publisher,package_:f.package_,name:f.name},b=As(p,x,T,"scopeSources"),w=Es(p);if(!w){console.warn(` [skip] ${p.name}: no transformation declared`);continue}let $=We(r,w);if(!$){console.warn(` [skip] ${p.name}: transformation ${qe(w)} not found`);continue}let v=await Os(b,o),K=[],E=new Set;for(let A of v){let U=await Ns(A,o,e,t),F=me(U,k);for(let j of F){let ie=`${j.namespace}/${j.name}`;E.has(ie)||(E.add(ie),K.push(j))}}console.log(` ${p.name}: ${K.length} instance(s) of ${k.publisher}/${k.package_}/${k.name} across ${v.length} scope(s)`);let ee=await y.run({transformation:$,instances:K,allKanonaks:r,repository:o,parser:e,objectParser:t,outputFormat:"html"});if(ee.length===0){console.warn(` [skip] ${p.name}: transformation produced no artifacts`);continue}let W=Ve(a,g);pe(Be(W),{recursive:!0}),Me(W,ee[0].content,"utf-8"),console.log(` wrote ${W} (AggregateView ${p.name})`)}console.log("Site build complete.")}function ze(n,e,t,o){for(let r of n.statement)if(r instanceof et&&de(r,e,t,o))return r.object}function As(n,e,t,o){for(let r of n.statement){if(!(r instanceof Cs)||!de(r,e,t,o))continue;let a=[];for(let s of r.object??[]){let i=s.value;typeof i=="string"&&a.push(i)}return a}return[]}function Xn(n,e,t,o){for(let r of n.statement)if(r instanceof Rs&&de(r,e,t,o)&&r.object instanceof _s)return{publisher:r.object.subject.publisher,package_:r.object.subject.package_,name:r.object.subject.name}}function Es(n){for(let e of n.statement)if(e instanceof Ks&&de(e,x,T,"transformation"))return js(e.object)}function js(n){let e,t,o,r;for(let a of n.statement){if(!(a instanceof et))continue;let s=a.predicate?.subject?.name;s==="publisher"?e=a.object:s==="package"?t=a.object:s==="version"?o=a.object:s==="name"&&(r=a.object)}if(!(!e||!t||!o||!r))return{publisher:e,package_:t,version:o,name:r}}function de(n,e,t,o){let r=n.predicate?.subject;return r?r.publisher===e&&r.package_===t&&r.name===o:!1}function We(n,e){let t=`${e.publisher}/${e.package_}@${e.version}`;for(let o of n)if(o instanceof Qn&&o.name===e.name&&o.namespace===t)return o}function qe(n){return`${n.publisher}/${n.package_}@${n.version}/${n.name}`}async function Os(n,e){let t=[];for(let o of n){let r=o.indexOf("@*");if(r===-1){t.push(o);continue}let a=o.substring(0,r),s=a.indexOf("/");if(s===-1){t.push(o);continue}let i=a.substring(0,s),c=a.substring(s+1),l=await e.getDocumentsByNamespaceAsync(i,c);for(let m of l){let u=m.metadata.namespace_;if(!u)continue;let d=u.version;t.push(`${u.publisher}/${u.package_}@${d.major}.${d.minor}.${d.patch}`)}}return t}async function Ns(n,e,t,o){let r=n.indexOf("/"),a=n.indexOf("@");if(r===-1||a===-1)return[];let s=n.substring(0,r),i=n.substring(r+1,a),c=n.substring(a+1),l=await e.getDocumentsByNamespaceAsync(s,i);for(let m of l){let u=m.metadata.namespace_?.version;if(u&&`${u.major}.${u.minor}.${u.patch}`===c){let d=new Ds(m,e);return o.parseKanonaks(d)}}return[]}import{Command as Ls}from"commander";import{KanonakParser as Us,PublisherIndex as tt,CredentialStore as ot,createAuthenticatedFetch as rt,FileSystemKanonakDocumentRepository as Fs,Reasoner as Hs,KanonakVocabulary as Ms,getGlobalCachePath as Vs,makeUriKey as Bs}from"@kanonak-protocol/sdk";function zs(n){let e=n.split("/");if(e.length!==3)return null;let[t,o,r]=e;return!t||!o||!r?null:{publisher:t,package_:o,name:r}}function st(){return new Ls("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 qs(n,e.type):await Ws(n)})}async function Ws(n){let e=new ot,t=rt(e),o=new tt({fetchFn:t}),r;try{r=await o.listLatestPackages(n)}catch(s){console.error(`Failed to fetch publisher index for ${n}: ${s.message}`),process.exit(1)}if(r.length===0){console.log(`No packages found at ${n}.`);return}console.log(`Packages published by ${n}:
118
+ `);let a=r.reduce((s,i)=>Math.max(s,i.packageName.length),0);for(let{packageName:s,version:i}of r)console.log(` ${s.padEnd(a)} @${i}`)}async function qs(n,e){let t=zs(e);t||(console.error(`Invalid --type value: ${e}`),console.error("Expected: publisher/package/Name (e.g. kanonak.org/capabilities/Capability)"),process.exit(1));let o=new Us,r=new ot,a=rt(r),s=new tt({fetchFn:a}),i=new D,c=new Set,l=[];try{l=await s.listLatestPackages(n)}catch(g){console.error(`Failed to fetch publisher index for ${n}: ${g.message}`),process.exit(1)}for(let{packageName:g,version:f}of l)c.add(`${n}|${g}|${f}`);await Ge(s,i,a,"kanonak.org","core-rdf",c),await Ge(s,i,a,"kanonak.org","core-owl",c),await Ge(s,i,a,t.publisher,t.package_,c);for(let g of c){let[f,k,b]=g.split("|");if(!i.has(f,k,b))try{let w=await s.getPackageUrl(f,k,b),$=await a(w,f);if(!$.ok){console.error(`Warning: failed to fetch ${f}/${k}@${b}: ${$.status} ${$.statusText}`);continue}let v=await $.text();i.put(f,k,b,v)}catch(w){console.error(`Warning: failed to fetch ${f}/${k}@${b}: ${w.message}`)}}let m=new Fs(Vs(),!0,o),d=await new Hs({vocabulary:new Ms}).reason(m),h=Bs(t.publisher,t.package_,t.name),p=d.getInstancesOfClass(h).filter(g=>g!==h);if(p.length===0){console.log(`No instances of ${h} found in ${n}'s catalogue.`);return}console.log(`Instances of ${h} in ${n}'s catalogue:
119
+ `),p.sort();for(let g of p)console.log(` ${g}`)}async function Ge(n,e,t,o,r,a){try{let s=await n.getHighestVersion(o,r);if(!s)return;a.add(`${o}|${r}|${s}`)}catch{}}import{existsSync as Gs,readFileSync as Js}from"fs";import{dirname as Ys,resolve as Xs}from"path";import{KanonakObjectParser as Zs,KanonakParser as Qs,canonicalForm as ea,canonicalHash as na,parseKanonakAddress as ta,pickHighestDocument as oa}from"@kanonak-protocol/sdk";import{SingleDocumentRepository as ra}from"@kanonak-protocol/sdk/uri-helpers";async function at(n,e={}){let t=new Qs,o=new Zs,{document:r,source:a}=await sa(n,t),s=await S(aa(a),t),i=new ra(r,s),c=await o.parseKanonaks(i),l=na(c);if(console.log(l),e.verbose){let m=ea(c);process.stderr.write(`# canonical form for ${a}
120
120
  `),process.stderr.write(m),process.stderr.write(`
121
- `)}}async function ra(n,e){if(n.endsWith(".kan.yml")){let i=Ys(n);if(!qs(i))throw new Error(`kanonak hash: file not found: ${i}`);let c=Gs(i,"utf-8");return{document:e.parse(c),source:i}}let t=na(n);if(t.kind!=="package")throw new Error(`kanonak hash: expected a package address (publisher/package[@version]) or a path ending in .kan.yml; got ${t.kind} address "${n}"`);let r=await(await S(process.cwd(),e)).getDocumentsByNamespaceAsync(t.publisher,t.package_);if(r.length===0)throw new Error(`kanonak hash: could not find ${n} in local workspace, global cache, or publisher HTTP`);let a=t.version?`${t.version.major}.${t.version.minor}.${t.version.patch}`:void 0,s=ta(r,a?{requestedVersion:a}:{});if(!s.chosen){let i=a?`@${a}`:"";throw new Error(`kanonak hash: no version of ${t.publisher}/${t.package_}${i} available across local/cache/HTTP`)}return{document:s.chosen,source:n}}function sa(n){return n.endsWith(".kan.yml")?U(Js(n)):process.cwd()}import{Command as it}from"commander";function X(n){return`${P}/${R}/${n}`}var Je={[X("fetch-and-deploy")]:(n,e,t,o)=>n.add(e,t[0],o),[X("remove-deployed")]:(n,e,t,o)=>n.remove(e,t[0],o),[X("list-deployed")]:(n,e,t,o)=>n.list(e,o),[X("update-deployed")]:(n,e,t,o)=>n.update(e,t[0],o),[X("search-available")]:(n,e,t,o)=>n.search(e,o),[X("show-info")]:(n,e,t,o)=>n.info(e,t[0],o)};function ct(n,e,t){for(let o of e){let r=new it(o.commandName).description(o.description.trim());for(let a of o.commands){let s=r.command(aa(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=ia(i);await ca(t,o,a,i,c)})}n.addCommand(r)}}function aa(n){let e=n.arguments.filter(t=>!t.isOption).map(t=>t.required?`<${t.argumentName}>`:`[${t.argumentName}]`);return[n.subcommandName,...e].join(" ")}function ia(n){for(let e=n.length-1;e>=0;e--)if(n[e]&&typeof n[e]=="object"&&!(n[e]instanceof it))return n[e];return{}}async function ca(n,e,t,o,r){let a=[];for(let i of o)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(Je).join(", ")}.`),process.exit(1));let s=Je[t.actionKey];s||(console.error(`Capability subcommand '${t.subcommandName}' references unknown Action '${t.actionKey}'. Known actions: ${Object.keys(Je).join(", ")}.`),process.exit(1)),await s(n,e,a,r)}import{existsSync as lt,readFileSync as la,statSync as ut}from"fs";import{resolve as ua}from"path";import{KanonakObjectParser as pa,PublisherIndex as Ye,PublisherConfigResolver as ma,formatVersion as pt,pickHighestDocument as da}from"@kanonak-protocol/sdk";import{SingleDocumentRepository as mt}from"@kanonak-protocol/sdk/uri-helpers";import{uriKey as Z,findSubjectsByType as dt}from"@kanonak-protocol/sdk/uri-helpers";var fe=class{constructor(e,t,o,r,a,s){this.fileCache=e;this.parser=t;this.publisherIndex=o;this.fetchFn=r;this.handlerRegistry=a;this.repository=s}fileCache;parser;publisherIndex;fetchFn;handlerRegistry;repository;objectParser=new pa;async add(e,t,o){let r=this.tryLoadFromLocalFile(t);if(r){this.fileCache.put(r.publisher,r.packageName,r.version,r.content),await this.deployFromDoc(e,r.doc,r.publisher,r.packageName,r.version,void 0,`local file ${t}`,o);return}let a=x(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,m=await this.repository.getDocumentsByNamespaceAsync(s,i);if(m.length>0){let h=da(m,{requestedVersion:c??void 0});if(h.chosen){let y=h.chosen.metadata.namespace_;(!y||!y.version)&&(console.error(`Document for ${s}/${i} is missing namespace metadata.`),process.exit(1));let p=pt(y.version);this.fileCache.put(s,i,p,this.parser.save(h.chosen)),await this.deployFromDoc(e,h.chosen,s,i,p,l??void 0,`${s}/${i}@${p}`,o);return}}let u=c??await this.publisherIndex.getHighestVersion(s,i);u||(console.error(`Could not resolve version for "${s}/${i}".`),await this.printPackageSuggestions(s,i,e.commandName),process.exit(1));let d=this.fileCache.get(s,i,u);if(!d){let h=await this.publisherIndex.getPackageUrl(s,i,u),y=await this.fetchFn(h,s);y.ok||(y.status===404?(console.error(`Package ${s}/${i}@${u} not found at ${h}.`),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 ${h} (${y.status} ${y.statusText}).`),process.exit(1)),d=await y.text(),this.fileCache.put(s,i,u,d)}await this.deployFromDoc(e,this.parser.parse(d),s,i,u,l??void 0,`${s}/${i}@${u}`,o)}tryLoadFromLocalFile(e){if(!(/^[.\/\\]/.test(e)||/^[A-Za-z]:[\\/]/.test(e)||e.endsWith(".kan.yml")||lt(e)&&ut(e).isFile()))return;let o=ua(e);(!lt(o)||!ut(o).isFile())&&(console.error(`Local file not found: ${e}`),process.exit(1));let r=la(o,"utf-8"),a=this.parser.parse(r),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:r,publisher:s.publisher,packageName:s.package_,version:pt(s.version)}}async deployFromDoc(e,t,o,r,a,s,i,c){let l=new mt(t,this.repository),m=await this.objectParser.parseKanonaks(l),u=ft(e.managesTypeKey);u||(console.error(`Capability "${e.commandName}" has no resolved managesType.`),process.exit(1));let d=dt(m,u);d.length===0&&(console.error(`${i} does not contain any ${Z(u)} instances.`),process.exit(1));let h=d;if(s&&(h=d.filter(g=>g.name===s),h.length===0)){console.error(`Instance "${s}" not found in ${i}.`),console.error(""),console.error(`Available ${Z(u)} instance(s):`);for(let g of d)console.error(` - ${g.name}`);console.error(""),console.error("To install all of them, drop the instance suffix:"),console.error(` kanonak ${e.commandName} add ${o}/${r}`),process.exit(1)}let y=s?`${s} from ${i}`:`${h.length} ${Z(u)} instance(s) from ${i}`;console.log(`Installing ${y}...`);let p=this.handlerRegistry.get(e.deploymentTargetKey);p?await p.deploy({instances:h,allKanonaks:m,repository:this.repository,options:c}):console.log(`Cached ${o}/${r}@${a} (no deployment handler for "${e.deploymentTargetKey}")`)}async printPackageSuggestions(e,t,o){let r;try{r=await this.publisherIndex.listLatestPackages(e)}catch{return}let a=r.map(s=>({name:s.packageName,version:s.version,score:fa(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 ${o} add ${e}/${s.name}`)}}async remove(e,t,o){await this.requireHandler(e).undeploy(t,{repository:this.repository,options:o})}async list(e,t){let r=await this.requireHandler(e).list({repository:this.repository,options:t}),a=e.managesTypeKey||"managed";if(r.length===0){console.log(`No ${a} instances installed.`);return}console.log(`Installed ${a} instances:
121
+ `)}}async function sa(n,e){if(n.endsWith(".kan.yml")){let i=Xs(n);if(!Gs(i))throw new Error(`kanonak hash: file not found: ${i}`);let c=Js(i,"utf-8");return{document:e.parse(c),source:i}}let t=ta(n);if(t.kind!=="package")throw new Error(`kanonak hash: expected a package address (publisher/package[@version]) or a path ending in .kan.yml; got ${t.kind} address "${n}"`);let r=await(await S(process.cwd(),e)).getDocumentsByNamespaceAsync(t.publisher,t.package_);if(r.length===0)throw new Error(`kanonak hash: could not find ${n} in local workspace, global cache, or publisher HTTP`);let a=t.version?`${t.version.major}.${t.version.minor}.${t.version.patch}`:void 0,s=oa(r,a?{requestedVersion:a}:{});if(!s.chosen){let i=a?`@${a}`:"";throw new Error(`kanonak hash: no version of ${t.publisher}/${t.package_}${i} available across local/cache/HTTP`)}return{document:s.chosen,source:n}}function aa(n){return n.endsWith(".kan.yml")?H(Ys(n)):process.cwd()}import{Command as it}from"commander";function Z(n){return`${P}/${R}/${n}`}var Je={[Z("fetch-and-deploy")]:(n,e,t,o)=>n.add(e,t[0],o),[Z("remove-deployed")]:(n,e,t,o)=>n.remove(e,t[0],o),[Z("list-deployed")]:(n,e,t,o)=>n.list(e,o),[Z("update-deployed")]:(n,e,t,o)=>n.update(e,t[0],o),[Z("search-available")]:(n,e,t,o)=>n.search(e,o),[Z("show-info")]:(n,e,t,o)=>n.info(e,t[0],o)};function ct(n,e,t){for(let o of e){let r=new it(o.commandName).description(o.description.trim());for(let a of o.commands){let s=r.command(ia(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=ca(i);await la(t,o,a,i,c)})}n.addCommand(r)}}function ia(n){let e=n.arguments.filter(t=>!t.isOption).map(t=>t.required?`<${t.argumentName}>`:`[${t.argumentName}]`);return[n.subcommandName,...e].join(" ")}function ca(n){for(let e=n.length-1;e>=0;e--)if(n[e]&&typeof n[e]=="object"&&!(n[e]instanceof it))return n[e];return{}}async function la(n,e,t,o,r){let a=[];for(let i of o)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(Je).join(", ")}.`),process.exit(1));let s=Je[t.actionKey];s||(console.error(`Capability subcommand '${t.subcommandName}' references unknown Action '${t.actionKey}'. Known actions: ${Object.keys(Je).join(", ")}.`),process.exit(1)),await s(n,e,a,r)}import{existsSync as lt,readFileSync as ua,statSync as ut}from"fs";import{resolve as pa}from"path";import{KanonakObjectParser as ma,PublisherIndex as Ye,PublisherConfigResolver as da,formatVersion as pt,pickHighestDocument as fa}from"@kanonak-protocol/sdk";import{SingleDocumentRepository as mt}from"@kanonak-protocol/sdk/uri-helpers";import{uriKey as Q,findSubjectsByType as dt}from"@kanonak-protocol/sdk/uri-helpers";var fe=class{constructor(e,t,o,r,a,s){this.fileCache=e;this.parser=t;this.publisherIndex=o;this.fetchFn=r;this.handlerRegistry=a;this.repository=s}fileCache;parser;publisherIndex;fetchFn;handlerRegistry;repository;objectParser=new ma;async add(e,t,o){let r=this.tryLoadFromLocalFile(t);if(r){this.fileCache.put(r.publisher,r.packageName,r.version,r.content),await this.deployFromDoc(e,r.doc,r.publisher,r.packageName,r.version,void 0,`local file ${t}`,o);return}let a=I(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,m=await this.repository.getDocumentsByNamespaceAsync(s,i);if(m.length>0){let h=fa(m,{requestedVersion:c??void 0});if(h.chosen){let y=h.chosen.metadata.namespace_;(!y||!y.version)&&(console.error(`Document for ${s}/${i} is missing namespace metadata.`),process.exit(1));let p=pt(y.version);this.fileCache.put(s,i,p,this.parser.save(h.chosen)),await this.deployFromDoc(e,h.chosen,s,i,p,l??void 0,`${s}/${i}@${p}`,o);return}}let u=c??await this.publisherIndex.getHighestVersion(s,i);u||(console.error(`Could not resolve version for "${s}/${i}".`),await this.printPackageSuggestions(s,i,e.commandName),process.exit(1));let d=this.fileCache.get(s,i,u);if(!d){let h=await this.publisherIndex.getPackageUrl(s,i,u),y=await this.fetchFn(h,s);y.ok||(y.status===404?(console.error(`Package ${s}/${i}@${u} not found at ${h}.`),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 ${h} (${y.status} ${y.statusText}).`),process.exit(1)),d=await y.text(),this.fileCache.put(s,i,u,d)}await this.deployFromDoc(e,this.parser.parse(d),s,i,u,l??void 0,`${s}/${i}@${u}`,o)}tryLoadFromLocalFile(e){if(!(/^[.\/\\]/.test(e)||/^[A-Za-z]:[\\/]/.test(e)||e.endsWith(".kan.yml")||lt(e)&&ut(e).isFile()))return;let o=pa(e);(!lt(o)||!ut(o).isFile())&&(console.error(`Local file not found: ${e}`),process.exit(1));let r=ua(o,"utf-8"),a=this.parser.parse(r),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:r,publisher:s.publisher,packageName:s.package_,version:pt(s.version)}}async deployFromDoc(e,t,o,r,a,s,i,c){let l=new mt(t,this.repository),m=await this.objectParser.parseKanonaks(l),u=ft(e.managesTypeKey);u||(console.error(`Capability "${e.commandName}" has no resolved managesType.`),process.exit(1));let d=dt(m,u);d.length===0&&(console.error(`${i} does not contain any ${Q(u)} instances.`),process.exit(1));let h=d;if(s&&(h=d.filter(g=>g.name===s),h.length===0)){console.error(`Instance "${s}" not found in ${i}.`),console.error(""),console.error(`Available ${Q(u)} instance(s):`);for(let g of d)console.error(` - ${g.name}`);console.error(""),console.error("To install all of them, drop the instance suffix:"),console.error(` kanonak ${e.commandName} add ${o}/${r}`),process.exit(1)}let y=s?`${s} from ${i}`:`${h.length} ${Q(u)} instance(s) from ${i}`;console.log(`Installing ${y}...`);let p=this.handlerRegistry.get(e.deploymentTargetKey);p?await p.deploy({instances:h,allKanonaks:m,repository:this.repository,options:c}):console.log(`Cached ${o}/${r}@${a} (no deployment handler for "${e.deploymentTargetKey}")`)}async printPackageSuggestions(e,t,o){let r;try{r=await this.publisherIndex.listLatestPackages(e)}catch{return}let a=r.map(s=>({name:s.packageName,version:s.version,score:ga(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 ${o} add ${e}/${s.name}`)}}async remove(e,t,o){await this.requireHandler(e).undeploy(t,{repository:this.repository,options:o})}async list(e,t){let r=await this.requireHandler(e).list({repository:this.repository,options:t}),a=e.managesTypeKey||"managed";if(r.length===0){console.log(`No ${a} instances installed.`);return}console.log(`Installed ${a} instances:
122
122
  `);for(let s of r){let i=s.publisher?`${s.publisher}/${s.package_}@${s.version}`:"unmanaged";console.log(` ${s.name} (${i}) ${s.path}`)}}async update(e,t,o){let a=await this.requireHandler(e).list({repository:this.repository,options:o}),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}`,o),i++)}console.log(i===0?"All instances are up to date.":`
123
- Updated ${i} instance(s).`)}async search(e,t){let o=t.publisher??"kanonak.org",r=ft(e.managesTypeKey);if(!r){console.error("Capability has no resolved managesType; nothing to search for.");return}console.log(`Searching ${o} for ${Z(r)} instances...
124
- `);let a=new ma,s=await a.getConfig(o),i=a.resolveIndexUrl(o,s),c=await this.fetchFn(i,o);if(!c.ok){console.error(`Failed to fetch package index from ${o}.`);return}let l=await c.text(),m=Ye.parseIndex(l);if(m.size===0){console.error(`No packages found for publisher "${o}".`);return}let u=new Map;for(let[p,g]of m){let f=[...g].sort((k,b)=>{let w=Ye.parseVersion(k),$=Ye.parseVersion(b);return!w||!$?0:w.major!==$.major?$.major-w.major:w.minor!==$.minor?$.minor-w.minor:$.patch-w.patch});u.set(p,f[0])}let d=[],h=0;for(let[p,g]of u){let f=this.fileCache.get(o,p,g);if(!f)try{let k=await this.publisherIndex.getPackageUrl(o,p,g),b=await this.fetchFn(k,o);if(!b.ok)continue;f=await b.text(),this.fileCache.put(o,p,g,f)}catch{continue}try{let k=this.parser.parse(f),b=new mt(k,this.repository),w=await this.objectParser.parseKanonaks(b),$=dt(w,r);for(let v of $)d.push({publisher:o,package_:p,version:g,subject:v});h++}catch{continue}}if(d.length===0){console.log(`No ${Z(r)} instances found across ${h} package(s).`);return}console.log(`Found ${d.length} ${Z(r)} instance(s) in ${h} package(s):
125
- `);let y=new Map;for(let p of d){let g=`${p.publisher}/${p.package_}@${p.version}`,f=y.get(g);f?f.push(p):y.set(g,[p])}for(let[p,g]of y){let f=g[0],k=`${f.publisher}/${f.package_}`,b=g.length===1;console.log(` ${p}`),console.log(` ${g.length} skill${b?"":"s"}:`);for(let w of g)console.log(` - ${w.subject.name}`);if(console.log(""),b)console.log(" install:"),console.log(` kanonak ${e.commandName} add ${k}/${f.subject.name}`);else{console.log(" install one of them:");for(let w of g)console.log(` kanonak ${e.commandName} add ${k}/${w.subject.name}`);console.log(" install all of them:"),console.log(` kanonak ${e.commandName} add ${k}`)}console.log("")}}async info(e,t,o){let s=(await this.requireHandler(e).list({repository:this.repository,options:o})).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 ft(n){if(!n)return;let e=n.split("/");if(e.length===3)return{publisher:e[0],package_:e[1],name:e[2]}}function fa(n,e){let t=n.toLowerCase(),o=e.toLowerCase();if(t===o)return 100;if(o.includes(t)||t.includes(o))return 50;let r=new Set(t.split("-").filter(Boolean)),a=new Set(o.split("-").filter(Boolean)),s=0;for(let c of r)a.has(c)&&s++;if(s>0)return s*10;let i=ga(t,o);return i===0?100:i<=2?Math.max(1,20-i*5):0}function ga(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),o=new Array(e.length+1);for(let r=0;r<=e.length;r++)t[r]=r;for(let r=0;r<n.length;r++){o[0]=r+1;for(let a=0;a<e.length;a++){let s=n[r]===e[a]?0:1;o[a+1]=Math.min(o[a]+1,t[a+1]+1,t[a]+s)}for(let a=0;a<=e.length;a++)t[a]=o[a]}return t[e.length]}var ge=class{handlers=new Map;register(e,t){this.handlers.set(e,t)}get(e){return this.handlers.get(e)??null}};import{mkdirSync as Ca,rmSync as Ka,existsSync as be,readdirSync as Da,writeFileSync as Ia}from"fs";import{join as we}from"path";import{KanonakObjectParser as xa,KanonakParser as Ta,computeIntegrity as Aa,compareVersions as Ea}from"@kanonak-protocol/sdk";import{findSubjectsByType as ja}from"@kanonak-protocol/sdk/uri-helpers";import{SingleDocumentRepository as Oa}from"@kanonak-protocol/sdk/uri-helpers";import{TransformationRunnerV3 as Na}from"@kanonak-protocol/sdk/transformations";import{TX_V3 as La}from"@kanonak-protocol/sdk/transformations";import{join as Xe}from"path";import{homedir as gt}from"os";import{KanonakObjectParser as ha}from"@kanonak-protocol/sdk";import{SingleDocumentRepository as ka}from"@kanonak-protocol/sdk/uri-helpers";import{findSubjectsByType as kt,getStringValue as he}from"@kanonak-protocol/sdk/uri-helpers";var H="kanonak.org",M="agent-skills",yt={publisher:H,package_:M,name:"Client"},bt={publisher:H,package_:M,name:"clientId"},ya={publisher:H,package_:M,name:"projectSkillDir"},ba={publisher:H,package_:M,name:"userSkillDir"},wa={publisher:H,package_:M,name:"skillFileName"},wt="agents";async function se(n,e){let t=(n.client??$t()??wt).toLowerCase(),o=n.scope??"project",r=await St(t,e);if(!r){let i=await $a(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=he(r,o==="user"?ba:ya);if(!s)throw new Error(`Client "${t}" has no ${o==="user"?"userSkillDir":"projectSkillDir"} declared.`);return va(s)}async function ke(n,e,t){let o=await se(e,t);return Xe(o,n)}async function Ze(n,e){let t=(n.client??$t()??wt).toLowerCase(),o=await St(t,e);return o?he(o,wa)??"SKILL.md":"SKILL.md"}function $t(){if(process.env.CLAUDE_CODE||process.env.CLAUDE_PROJECT_DIR)return"claude-code"}var ht=new WeakMap;async function vt(n){let e=ht.get(n);if(e)return e;let t=await n.getDocumentsByNamespaceAsync(H,M);if(t.length===0)throw new Error(`Could not find ${H}/${M} in the repository. Install a skill capability (which transitively imports agent-skills) or fetch agent-skills directly to populate the cache.`);let r=[...t].sort((c,l)=>{let m=c.metadata.namespace_?.version,u=l.metadata.namespace_?.version;return!m||!u?0:m.major!==u.major?u.major-m.major:m.minor!==u.minor?u.minor-m.minor:u.patch-m.patch})[0],a=new ha,s=new ka(r,n),i=await a.parseKanonaks(s);return ht.set(n,i),i}async function St(n,e){let t=await vt(e),o=kt(t,yt);for(let r of o)if(he(r,bt)===n)return r}async function $a(n){let e=await vt(n),t=kt(e,yt),o=[];for(let r of t){let a=he(r,bt);a&&o.push(a)}return o}function va(n){return n.startsWith("~/")?Xe(gt(),n.slice(2)):n==="~"?gt():n.startsWith("/")||/^[A-Za-z]:[\\/]/.test(n)?n:Xe(process.cwd(),n)}import{readFileSync as Sa,writeFileSync as Pa,existsSync as Ra}from"fs";import{join as Pt}from"path";import Rt from"js-yaml";var _t="skills.lock",_a=`# This file is generated by Kanonak CLI. Do not edit manually.
126
- `;function ye(n){let e=Pt(n,_t);if(!Ra(e))return{version:"1",lastUpdated:new Date().toISOString(),skills:{}};let t=Sa(e,"utf-8"),o=Rt.load(t);return!o||typeof o!="object"||o.version!=="1"?{version:"1",lastUpdated:new Date().toISOString(),skills:{}}:{version:"1",lastUpdated:o.lastUpdated??new Date().toISOString(),skills:o.skills??{}}}function Qe(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 o=Pt(n,_t),r=Rt.dump(e,{lineWidth:-1,sortKeys:!1,quotingType:'"'});Pa(o,_a+r,"utf-8")}var Ct="kanonak.org",Kt="skill-to-skill-md",$e=class{parser=new Ta;objectParser=new xa;runner=new Na;async deploy(e){let{instances:t,allKanonaks:o,repository:r,options:a}=e;if(t.length===0){console.error("No Skill instances to deploy.");return}let s=await Ua(r,this.objectParser);if(!s){console.error(`Cannot deploy: ${Ct}/${Kt}@3.0.0 is not installed in the workspace or cache.`);return}let i=await this.runner.run({transformation:s,instances:t,allKanonaks:o,repository:r,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(a,r),l=await Ze(a,r),m=ye(c),u=t[0].namespace,{publisher:d,package_:h,version:y}=Fa(u);for(let p of i){let g=await ke(p.fileName,a,r),f=be(we(g,l));Ca(g,{recursive:!0}),Ia(we(g,l),p.content,"utf-8"),m.skills[p.fileName]={publisher:d,package_:h,version:y,resolved:d?`kanonak://${d}/${h}@${y}`:"",integrity:Aa(p.content)},console.log(` ${f?"Updated":"Installed"} skill "${p.fileName}" \u2192 ${g}`)}Qe(c,m)}async undeploy(e,t){let{repository:o,options:r}=t,a=await ke(e,r,o);be(a)||(console.error(`Skill "${e}" is not installed at ${a}`),process.exit(1)),Ka(a,{recursive:!0,force:!0});let s=await se(r,o),i=ye(s);delete i.skills[e],Qe(s,i),console.log(`Removed skill "${e}" from ${a}`)}async list(e){let{repository:t,options:o}=e,r=await se(o,t),a=ye(r),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 ke(c,o,t)});let i=await Ze(o,t);if(be(r))try{let c=Da(r,{withFileTypes:!0});for(let l of c){if(!l.isDirectory()||a.skills[l.name])continue;let m=we(r,l.name,i);be(m)&&s.push({name:l.name,publisher:"",package_:"",version:"",path:we(r,l.name)})}}catch{}return s}};async function Ua(n,e){let t=await n.getDocumentsByNamespaceAsync(Ct,Kt);if(t.length===0)return;let o=[...t].sort((r,a)=>{let s=r.metadata.namespace_?.version,i=a.metadata.namespace_?.version;return!s||!i?0:Ea(i,s)});for(let r of o){let a=new Oa(r,n),s=await e.parseKanonaks(a),i=ja(s,La.InstanceTransformation);if(i[0])return i[0]}}function Fa(n){if(!n)return{publisher:"",package_:"",version:""};let e=n.indexOf("@");if(e===-1)return{publisher:"",package_:"",version:""};let t=n.substring(0,e),o=n.substring(e+1),r=t.indexOf("/");return r===-1?{publisher:"",package_:"",version:""}:{publisher:t.substring(0,r),package_:t.substring(r+1),version:o}}import{mkdirSync as ti,rmSync as oi,existsSync as tn,readdirSync as ri,writeFileSync as si,statSync as ai}from"fs";import{join as Pe}from"path";import{KanonakObjectParser as ii,KanonakParser as ci,computeIntegrity as li}from"@kanonak-protocol/sdk";import{findSubjectsByType as ui}from"@kanonak-protocol/sdk/uri-helpers";import{SingleDocumentRepository as pi}from"@kanonak-protocol/sdk/uri-helpers";import{TransformationRunnerV3 as mi}from"@kanonak-protocol/sdk/transformations";import{TX_V3 as di}from"@kanonak-protocol/sdk/transformations";import{join as Dt}from"path";import{homedir as It}from"os";import{KanonakObjectParser as Ha}from"@kanonak-protocol/sdk";import{SingleDocumentRepository as Ma}from"@kanonak-protocol/sdk/uri-helpers";import{findSubjectsByType as Tt,getStringValue as en,getReferenceUri as Va}from"@kanonak-protocol/sdk/uri-helpers";var V="kanonak.org",B="agent-skills",At={publisher:V,package_:B,name:"Client"},Et={publisher:V,package_:B,name:"clientId"},Ba={publisher:V,package_:B,name:"projectAgentDir"},za={publisher:V,package_:B,name:"userAgentDir"},Wa={publisher:V,package_:B,name:"agentFileFormat"},qa="agents";function Ga(){if(process.env.CLAUDE_CODE||process.env.CLAUDE_PROJECT_DIR)return"claude-code"}async function ve(n,e){let t=(n.client??Ga()??qa).toLowerCase(),o=n.scope??"project",r=await Ja(t,e);if(!r){let m=await Ya(e);throw new Error(`Unknown client "${t}". Known clients: ${m.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=en(r,o==="user"?za:Ba);if(!s)throw new Error(`Client "${t}" has no ${o==="user"?"userAgentDir":"projectAgentDir"} declared.`);let c=Va(r,Wa)?.name==="toml"?"toml":"markdown-frontmatter",l=c==="toml"?".toml":".md";return{agentsDir:Xa(s),format:c,fileExtension:l}}var xt=new WeakMap;async function jt(n){let e=xt.get(n);if(e)return e;let t=await n.getDocumentsByNamespaceAsync(V,B);if(t.length===0)throw new Error(`Could not find ${V}/${B} in the repository. Install a capability that imports agent-skills to populate the cache.`);let r=[...t].sort((c,l)=>{let m=c.metadata.namespace_?.version,u=l.metadata.namespace_?.version;return!m||!u?0:m.major!==u.major?u.major-m.major:m.minor!==u.minor?u.minor-m.minor:u.patch-m.patch})[0],a=new Ha,s=new Ma(r,n),i=await a.parseKanonaks(s);return xt.set(n,i),i}async function Ja(n,e){let t=await jt(e),o=Tt(t,At);for(let r of o)if(en(r,Et)===n)return r}async function Ya(n){let e=await jt(n),t=Tt(e,At),o=[];for(let r of t){let a=en(r,Et);a&&o.push(a)}return o}function Xa(n){return n.startsWith("~/")?Dt(It(),n.slice(2)):n==="~"?It():n.startsWith("/")||/^[A-Za-z]:[\\/]/.test(n)?n:Dt(process.cwd(),n)}import{readFileSync as Za,writeFileSync as Qa,existsSync as ei}from"fs";import{join as Ot}from"path";import Nt from"js-yaml";var Lt="agents.lock",ni=`# This file is generated by Kanonak CLI. Do not edit manually.
127
- `;function Se(n){let e=Ot(n,Lt);if(!ei(e))return{version:"1",lastUpdated:new Date().toISOString(),agents:{}};let t=Za(e,"utf-8"),o=Nt.load(t);return!o||typeof o!="object"||o.version!=="1"?{version:"1",lastUpdated:new Date().toISOString(),agents:{}}:{version:"1",lastUpdated:o.lastUpdated??new Date().toISOString(),agents:o.agents??{}}}function nn(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 o=Ot(n,Lt),r=Nt.dump(e,{lineWidth:-1,sortKeys:!1,quotingType:'"'});Qa(o,ni+r,"utf-8")}var Ut="kanonak.org",Ft="agent-to-agent-file",Re=class{parser=new ci;objectParser=new ii;runner=new mi;async deploy(e){let{instances:t,allKanonaks:o,repository:r,options:a}=e;if(t.length===0){console.error("No Agent instances to deploy.");return}let{agentsDir:s,format:i,fileExtension:c}=await ve(a,r),l=await fi(r,this.objectParser);if(!l){console.error(`Cannot deploy: ${Ut}/${Ft}@3.0.0 is not installed in the workspace or cache.`);return}let m=i==="toml"?"toml":"markdown-with-frontmatter",u=await this.runner.run({transformation:l,instances:t,allKanonaks:o,repository:r,parser:this.parser,objectParser:this.objectParser,outputFormat:m});if(u.length===0){console.error("No agents could be transformed from the package.");return}ti(s,{recursive:!0});let d=Se(s),h=t[0].namespace,{publisher:y,package_:p,version:g}=hi(h);for(let f of u){let k=`${f.fileName}${c}`,b=Pe(s,k),w=tn(b);si(b,f.content,"utf-8"),d.agents[f.fileName]={publisher:y,package_:p,version:g,resolved:y?`kanonak://${y}/${p}@${g}`:"",integrity:li(f.content),fileName:k},console.log(` ${w?"Updated":"Installed"} agent "${f.fileName}" \u2192 ${b}`)}nn(s,d)}async undeploy(e,t){let{repository:o,options:r}=t,{agentsDir:a}=await ve(r,o),s=Se(a),i=s.agents[e];i||(console.error(`Agent "${e}" is not installed at ${a}`),process.exit(1));let c=Pe(a,i.fileName);tn(c)&&oi(c,{force:!0}),delete s.agents[e],nn(a,s),console.log(`Removed agent "${e}" from ${c}`)}async list(e){let{repository:t,options:o}=e,{agentsDir:r}=await ve(o,t),a=Se(r),s=[];for(let[i,c]of Object.entries(a.agents))s.push({name:i,publisher:c.publisher,package_:c.package_,version:c.version,path:Pe(r,c.fileName)});if(tn(r))try{let i=ri(r,{withFileTypes:!0});for(let c of i){if(!c.isFile()||c.name==="agents.lock")continue;let l=Pe(r,c.name),m=gi(c.name);if(!a.agents[m]){try{if(!ai(l).isFile())continue}catch{continue}s.push({name:m,publisher:"",package_:"",version:"",path:l})}}}catch{}return s}};async function fi(n,e){let t=await n.getDocumentsByNamespaceAsync(Ut,Ft);if(t.length===0)return;let o=new pi(t[0],n),r=await e.parseKanonaks(o);return ui(r,di.InstanceTransformation)[0]}function gi(n){let e=n.lastIndexOf(".");return e===-1?n:n.substring(0,e)}function hi(n){if(!n)return{publisher:"",package_:"",version:""};let e=n.indexOf("@");if(e===-1)return{publisher:"",package_:"",version:""};let t=n.substring(0,e),o=n.substring(e+1),r=t.indexOf("/");return r===-1?{publisher:"",package_:"",version:""}:{publisher:t.substring(0,r),package_:t.substring(r+1),version:o}}var _i=wi(bi(import.meta.url)),Ci=JSON.parse(yi($i(_i,"..","package.json"),"utf-8")),C=new ki;C.name("kanonak").description("Kanonak Protocol CLI - Validate and resolve Kanonak ontology packages").version(Ci.version);C.command("validate <path>").description("Validate .kan.yml file(s). Resolves imports via HTTP from publisher domains.").action(async n=>{await cn(n)});C.command("install [package]").description("Install a package and its dependencies, or install all from kanonak.lock.").action(async n=>{await ln(n)});C.command("deps <path>").description("Show resolved dependency tree for a .kan.yml file.").action(async n=>{await pn(n)});C.command("login <publisher>").description("Authenticate with a package publisher using OAuth 2.0.").action(async n=>{await hn(n)});C.command("logout <publisher>").description("Revoke tokens and remove stored credentials for a publisher.").action(async n=>{await kn(n)});C.command("hash <target>").description("Print the canonical structural hash (sha256:\u2026) of a Kanonak package.").option("-v, --verbose","Also print the canonical form on stderr.").action(async(n,e)=>{await at(n,e)});C.addCommand(Tn());C.addCommand(Un());C.addCommand(zn());C.addCommand(qn());C.addCommand(nt());C.addCommand(st());async function Ki(){try{let n=new D,e=new vi,t=new Pi,o=Ri(t),r=new Si({fetchFn:o}),a=await S(process.cwd(),e),s=new ge;s.register("kanonak.org/capabilities/agent-skill-deployment",new $e),s.register("kanonak.org/agent-capabilities/agent-instance-deployment",new Re);let i=await Dn(n,e,a),c=new fe(n,e,r,o,s,a);ct(C,i,c)}catch{}}await Ki();C.parse();
123
+ Updated ${i} instance(s).`)}async search(e,t){let o=t.publisher??"kanonak.org",r=ft(e.managesTypeKey);if(!r){console.error("Capability has no resolved managesType; nothing to search for.");return}console.log(`Searching ${o} for ${Q(r)} instances...
124
+ `);let a=new da,s=await a.getConfig(o),i=a.resolveIndexUrl(o,s),c=await this.fetchFn(i,o);if(!c.ok){console.error(`Failed to fetch package index from ${o}.`);return}let l=await c.text(),m=Ye.parseIndex(l);if(m.size===0){console.error(`No packages found for publisher "${o}".`);return}let u=new Map;for(let[p,g]of m){let f=[...g].sort((k,b)=>{let w=Ye.parseVersion(k),$=Ye.parseVersion(b);return!w||!$?0:w.major!==$.major?$.major-w.major:w.minor!==$.minor?$.minor-w.minor:$.patch-w.patch});u.set(p,f[0])}let d=[],h=0;for(let[p,g]of u){let f=this.fileCache.get(o,p,g);if(!f)try{let k=await this.publisherIndex.getPackageUrl(o,p,g),b=await this.fetchFn(k,o);if(!b.ok)continue;f=await b.text(),this.fileCache.put(o,p,g,f)}catch{continue}try{let k=this.parser.parse(f),b=new mt(k,this.repository),w=await this.objectParser.parseKanonaks(b),$=dt(w,r);for(let v of $)d.push({publisher:o,package_:p,version:g,subject:v});h++}catch{continue}}if(d.length===0){console.log(`No ${Q(r)} instances found across ${h} package(s).`);return}console.log(`Found ${d.length} ${Q(r)} instance(s) in ${h} package(s):
125
+ `);let y=new Map;for(let p of d){let g=`${p.publisher}/${p.package_}@${p.version}`,f=y.get(g);f?f.push(p):y.set(g,[p])}for(let[p,g]of y){let f=g[0],k=`${f.publisher}/${f.package_}`,b=g.length===1;console.log(` ${p}`),console.log(` ${g.length} skill${b?"":"s"}:`);for(let w of g)console.log(` - ${w.subject.name}`);if(console.log(""),b)console.log(" install:"),console.log(` kanonak ${e.commandName} add ${k}/${f.subject.name}`);else{console.log(" install one of them:");for(let w of g)console.log(` kanonak ${e.commandName} add ${k}/${w.subject.name}`);console.log(" install all of them:"),console.log(` kanonak ${e.commandName} add ${k}`)}console.log("")}}async info(e,t,o){let s=(await this.requireHandler(e).list({repository:this.repository,options:o})).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 ft(n){if(!n)return;let e=n.split("/");if(e.length===3)return{publisher:e[0],package_:e[1],name:e[2]}}function ga(n,e){let t=n.toLowerCase(),o=e.toLowerCase();if(t===o)return 100;if(o.includes(t)||t.includes(o))return 50;let r=new Set(t.split("-").filter(Boolean)),a=new Set(o.split("-").filter(Boolean)),s=0;for(let c of r)a.has(c)&&s++;if(s>0)return s*10;let i=ha(t,o);return i===0?100:i<=2?Math.max(1,20-i*5):0}function ha(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),o=new Array(e.length+1);for(let r=0;r<=e.length;r++)t[r]=r;for(let r=0;r<n.length;r++){o[0]=r+1;for(let a=0;a<e.length;a++){let s=n[r]===e[a]?0:1;o[a+1]=Math.min(o[a]+1,t[a+1]+1,t[a]+s)}for(let a=0;a<=e.length;a++)t[a]=o[a]}return t[e.length]}var ge=class{handlers=new Map;register(e,t){this.handlers.set(e,t)}get(e){return this.handlers.get(e)??null}};import{mkdirSync as Ka,rmSync as Da,existsSync as be,readdirSync as Ia,writeFileSync as xa}from"fs";import{join as we}from"path";import{KanonakObjectParser as Ta,KanonakParser as Aa,computeIntegrity as Ea,compareVersions as ja}from"@kanonak-protocol/sdk";import{findSubjectsByType as Oa}from"@kanonak-protocol/sdk/uri-helpers";import{SingleDocumentRepository as Na}from"@kanonak-protocol/sdk/uri-helpers";import{TransformationRunnerV3 as La}from"@kanonak-protocol/sdk/transformations";import{TX_V3 as Ua}from"@kanonak-protocol/sdk/transformations";import{join as Xe}from"path";import{homedir as gt}from"os";import{KanonakObjectParser as ka}from"@kanonak-protocol/sdk";import{SingleDocumentRepository as ya}from"@kanonak-protocol/sdk/uri-helpers";import{findSubjectsByType as kt,getStringValue as he}from"@kanonak-protocol/sdk/uri-helpers";var M="kanonak.org",V="agent-skills",yt={publisher:M,package_:V,name:"Client"},bt={publisher:M,package_:V,name:"clientId"},ba={publisher:M,package_:V,name:"projectSkillDir"},wa={publisher:M,package_:V,name:"userSkillDir"},$a={publisher:M,package_:V,name:"skillFileName"},wt="agents";async function ae(n,e){let t=(n.client??$t()??wt).toLowerCase(),o=n.scope??"project",r=await St(t,e);if(!r){let i=await va(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=he(r,o==="user"?wa:ba);if(!s)throw new Error(`Client "${t}" has no ${o==="user"?"userSkillDir":"projectSkillDir"} declared.`);return Sa(s)}async function ke(n,e,t){let o=await ae(e,t);return Xe(o,n)}async function Ze(n,e){let t=(n.client??$t()??wt).toLowerCase(),o=await St(t,e);return o?he(o,$a)??"SKILL.md":"SKILL.md"}function $t(){if(process.env.CLAUDE_CODE||process.env.CLAUDE_PROJECT_DIR)return"claude-code"}var ht=new WeakMap;async function vt(n){let e=ht.get(n);if(e)return e;let t=await n.getDocumentsByNamespaceAsync(M,V);if(t.length===0)throw new Error(`Could not find ${M}/${V} in the repository. Install a skill capability (which transitively imports agent-skills) or fetch agent-skills directly to populate the cache.`);let r=[...t].sort((c,l)=>{let m=c.metadata.namespace_?.version,u=l.metadata.namespace_?.version;return!m||!u?0:m.major!==u.major?u.major-m.major:m.minor!==u.minor?u.minor-m.minor:u.patch-m.patch})[0],a=new ka,s=new ya(r,n),i=await a.parseKanonaks(s);return ht.set(n,i),i}async function St(n,e){let t=await vt(e),o=kt(t,yt);for(let r of o)if(he(r,bt)===n)return r}async function va(n){let e=await vt(n),t=kt(e,yt),o=[];for(let r of t){let a=he(r,bt);a&&o.push(a)}return o}function Sa(n){return n.startsWith("~/")?Xe(gt(),n.slice(2)):n==="~"?gt():n.startsWith("/")||/^[A-Za-z]:[\\/]/.test(n)?n:Xe(process.cwd(),n)}import{readFileSync as Pa,writeFileSync as Ra,existsSync as _a}from"fs";import{join as Pt}from"path";import Rt from"js-yaml";var _t="skills.lock",Ca=`# This file is generated by Kanonak CLI. Do not edit manually.
126
+ `;function ye(n){let e=Pt(n,_t);if(!_a(e))return{version:"1",lastUpdated:new Date().toISOString(),skills:{}};let t=Pa(e,"utf-8"),o=Rt.load(t);return!o||typeof o!="object"||o.version!=="1"?{version:"1",lastUpdated:new Date().toISOString(),skills:{}}:{version:"1",lastUpdated:o.lastUpdated??new Date().toISOString(),skills:o.skills??{}}}function Qe(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 o=Pt(n,_t),r=Rt.dump(e,{lineWidth:-1,sortKeys:!1,quotingType:'"'});Ra(o,Ca+r,"utf-8")}var Ct="kanonak.org",Kt="skill-to-skill-md",$e=class{parser=new Aa;objectParser=new Ta;runner=new La;async deploy(e){let{instances:t,allKanonaks:o,repository:r,options:a}=e;if(t.length===0){console.error("No Skill instances to deploy.");return}let s=await Fa(r,this.objectParser);if(!s){console.error(`Cannot deploy: ${Ct}/${Kt}@3.0.0 is not installed in the workspace or cache.`);return}let i=await this.runner.run({transformation:s,instances:t,allKanonaks:o,repository:r,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 ae(a,r),l=await Ze(a,r),m=ye(c),u=t[0].namespace,{publisher:d,package_:h,version:y}=Ha(u);for(let p of i){let g=await ke(p.fileName,a,r),f=be(we(g,l));Ka(g,{recursive:!0}),xa(we(g,l),p.content,"utf-8"),m.skills[p.fileName]={publisher:d,package_:h,version:y,resolved:d?`kanonak://${d}/${h}@${y}`:"",integrity:Ea(p.content)},console.log(` ${f?"Updated":"Installed"} skill "${p.fileName}" \u2192 ${g}`)}Qe(c,m)}async undeploy(e,t){let{repository:o,options:r}=t,a=await ke(e,r,o);be(a)||(console.error(`Skill "${e}" is not installed at ${a}`),process.exit(1)),Da(a,{recursive:!0,force:!0});let s=await ae(r,o),i=ye(s);delete i.skills[e],Qe(s,i),console.log(`Removed skill "${e}" from ${a}`)}async list(e){let{repository:t,options:o}=e,r=await ae(o,t),a=ye(r),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 ke(c,o,t)});let i=await Ze(o,t);if(be(r))try{let c=Ia(r,{withFileTypes:!0});for(let l of c){if(!l.isDirectory()||a.skills[l.name])continue;let m=we(r,l.name,i);be(m)&&s.push({name:l.name,publisher:"",package_:"",version:"",path:we(r,l.name)})}}catch{}return s}};async function Fa(n,e){let t=await n.getDocumentsByNamespaceAsync(Ct,Kt);if(t.length===0)return;let o=[...t].sort((r,a)=>{let s=r.metadata.namespace_?.version,i=a.metadata.namespace_?.version;return!s||!i?0:ja(i,s)});for(let r of o){let a=new Na(r,n),s=await e.parseKanonaks(a),i=Oa(s,Ua.InstanceTransformation);if(i[0])return i[0]}}function Ha(n){if(!n)return{publisher:"",package_:"",version:""};let e=n.indexOf("@");if(e===-1)return{publisher:"",package_:"",version:""};let t=n.substring(0,e),o=n.substring(e+1),r=t.indexOf("/");return r===-1?{publisher:"",package_:"",version:""}:{publisher:t.substring(0,r),package_:t.substring(r+1),version:o}}import{mkdirSync as oi,rmSync as ri,existsSync as tn,readdirSync as si,writeFileSync as ai,statSync as ii}from"fs";import{join as Pe}from"path";import{KanonakObjectParser as ci,KanonakParser as li,computeIntegrity as ui}from"@kanonak-protocol/sdk";import{findSubjectsByType as pi}from"@kanonak-protocol/sdk/uri-helpers";import{SingleDocumentRepository as mi}from"@kanonak-protocol/sdk/uri-helpers";import{TransformationRunnerV3 as di}from"@kanonak-protocol/sdk/transformations";import{TX_V3 as fi}from"@kanonak-protocol/sdk/transformations";import{join as Dt}from"path";import{homedir as It}from"os";import{KanonakObjectParser as Ma}from"@kanonak-protocol/sdk";import{SingleDocumentRepository as Va}from"@kanonak-protocol/sdk/uri-helpers";import{findSubjectsByType as Tt,getStringValue as en,getReferenceUri as Ba}from"@kanonak-protocol/sdk/uri-helpers";var B="kanonak.org",z="agent-skills",At={publisher:B,package_:z,name:"Client"},Et={publisher:B,package_:z,name:"clientId"},za={publisher:B,package_:z,name:"projectAgentDir"},Wa={publisher:B,package_:z,name:"userAgentDir"},qa={publisher:B,package_:z,name:"agentFileFormat"},Ga="agents";function Ja(){if(process.env.CLAUDE_CODE||process.env.CLAUDE_PROJECT_DIR)return"claude-code"}async function ve(n,e){let t=(n.client??Ja()??Ga).toLowerCase(),o=n.scope??"project",r=await Ya(t,e);if(!r){let m=await Xa(e);throw new Error(`Unknown client "${t}". Known clients: ${m.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=en(r,o==="user"?Wa:za);if(!s)throw new Error(`Client "${t}" has no ${o==="user"?"userAgentDir":"projectAgentDir"} declared.`);let c=Ba(r,qa)?.name==="toml"?"toml":"markdown-frontmatter",l=c==="toml"?".toml":".md";return{agentsDir:Za(s),format:c,fileExtension:l}}var xt=new WeakMap;async function jt(n){let e=xt.get(n);if(e)return e;let t=await n.getDocumentsByNamespaceAsync(B,z);if(t.length===0)throw new Error(`Could not find ${B}/${z} in the repository. Install a capability that imports agent-skills to populate the cache.`);let r=[...t].sort((c,l)=>{let m=c.metadata.namespace_?.version,u=l.metadata.namespace_?.version;return!m||!u?0:m.major!==u.major?u.major-m.major:m.minor!==u.minor?u.minor-m.minor:u.patch-m.patch})[0],a=new Ma,s=new Va(r,n),i=await a.parseKanonaks(s);return xt.set(n,i),i}async function Ya(n,e){let t=await jt(e),o=Tt(t,At);for(let r of o)if(en(r,Et)===n)return r}async function Xa(n){let e=await jt(n),t=Tt(e,At),o=[];for(let r of t){let a=en(r,Et);a&&o.push(a)}return o}function Za(n){return n.startsWith("~/")?Dt(It(),n.slice(2)):n==="~"?It():n.startsWith("/")||/^[A-Za-z]:[\\/]/.test(n)?n:Dt(process.cwd(),n)}import{readFileSync as Qa,writeFileSync as ei,existsSync as ni}from"fs";import{join as Ot}from"path";import Nt from"js-yaml";var Lt="agents.lock",ti=`# This file is generated by Kanonak CLI. Do not edit manually.
127
+ `;function Se(n){let e=Ot(n,Lt);if(!ni(e))return{version:"1",lastUpdated:new Date().toISOString(),agents:{}};let t=Qa(e,"utf-8"),o=Nt.load(t);return!o||typeof o!="object"||o.version!=="1"?{version:"1",lastUpdated:new Date().toISOString(),agents:{}}:{version:"1",lastUpdated:o.lastUpdated??new Date().toISOString(),agents:o.agents??{}}}function nn(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 o=Ot(n,Lt),r=Nt.dump(e,{lineWidth:-1,sortKeys:!1,quotingType:'"'});ei(o,ti+r,"utf-8")}var Ut="kanonak.org",Ft="agent-to-agent-file",Re=class{parser=new li;objectParser=new ci;runner=new di;async deploy(e){let{instances:t,allKanonaks:o,repository:r,options:a}=e;if(t.length===0){console.error("No Agent instances to deploy.");return}let{agentsDir:s,format:i,fileExtension:c}=await ve(a,r),l=await gi(r,this.objectParser);if(!l){console.error(`Cannot deploy: ${Ut}/${Ft}@3.0.0 is not installed in the workspace or cache.`);return}let m=i==="toml"?"toml":"markdown-with-frontmatter",u=await this.runner.run({transformation:l,instances:t,allKanonaks:o,repository:r,parser:this.parser,objectParser:this.objectParser,outputFormat:m});if(u.length===0){console.error("No agents could be transformed from the package.");return}oi(s,{recursive:!0});let d=Se(s),h=t[0].namespace,{publisher:y,package_:p,version:g}=ki(h);for(let f of u){let k=`${f.fileName}${c}`,b=Pe(s,k),w=tn(b);ai(b,f.content,"utf-8"),d.agents[f.fileName]={publisher:y,package_:p,version:g,resolved:y?`kanonak://${y}/${p}@${g}`:"",integrity:ui(f.content),fileName:k},console.log(` ${w?"Updated":"Installed"} agent "${f.fileName}" \u2192 ${b}`)}nn(s,d)}async undeploy(e,t){let{repository:o,options:r}=t,{agentsDir:a}=await ve(r,o),s=Se(a),i=s.agents[e];i||(console.error(`Agent "${e}" is not installed at ${a}`),process.exit(1));let c=Pe(a,i.fileName);tn(c)&&ri(c,{force:!0}),delete s.agents[e],nn(a,s),console.log(`Removed agent "${e}" from ${c}`)}async list(e){let{repository:t,options:o}=e,{agentsDir:r}=await ve(o,t),a=Se(r),s=[];for(let[i,c]of Object.entries(a.agents))s.push({name:i,publisher:c.publisher,package_:c.package_,version:c.version,path:Pe(r,c.fileName)});if(tn(r))try{let i=si(r,{withFileTypes:!0});for(let c of i){if(!c.isFile()||c.name==="agents.lock")continue;let l=Pe(r,c.name),m=hi(c.name);if(!a.agents[m]){try{if(!ii(l).isFile())continue}catch{continue}s.push({name:m,publisher:"",package_:"",version:"",path:l})}}}catch{}return s}};async function gi(n,e){let t=await n.getDocumentsByNamespaceAsync(Ut,Ft);if(t.length===0)return;let o=new mi(t[0],n),r=await e.parseKanonaks(o);return pi(r,fi.InstanceTransformation)[0]}function hi(n){let e=n.lastIndexOf(".");return e===-1?n:n.substring(0,e)}function ki(n){if(!n)return{publisher:"",package_:"",version:""};let e=n.indexOf("@");if(e===-1)return{publisher:"",package_:"",version:""};let t=n.substring(0,e),o=n.substring(e+1),r=t.indexOf("/");return r===-1?{publisher:"",package_:"",version:""}:{publisher:t.substring(0,r),package_:t.substring(r+1),version:o}}var Ci=$i(wi(import.meta.url)),Ki=JSON.parse(bi(vi(Ci,"..","package.json"),"utf-8")),C=new yi;C.name("kanonak").description("Kanonak Protocol CLI - Validate and resolve Kanonak ontology packages").version(Ki.version);C.command("validate <path>").description("Validate .kan.yml file(s). Resolves imports via HTTP from publisher domains.").action(async n=>{await cn(n)});C.command("install [package]").description("Install a package and its dependencies, or install all from kanonak.lock.").action(async n=>{await ln(n)});C.command("deps <path>").description("Show resolved dependency tree for a .kan.yml file.").action(async n=>{await pn(n)});C.command("login <publisher>").description("Authenticate with a package publisher using OAuth 2.0.").action(async n=>{await hn(n)});C.command("logout <publisher>").description("Revoke tokens and remove stored credentials for a publisher.").action(async n=>{await kn(n)});C.command("hash <target>").description("Print the canonical structural hash (sha256:\u2026) of a Kanonak package.").option("-v, --verbose","Also print the canonical form on stderr.").action(async(n,e)=>{await at(n,e)});C.addCommand(Tn());C.addCommand(Un());C.addCommand(zn());C.addCommand(qn());C.addCommand(nt());C.addCommand(st());async function Di(){try{let n=new D,e=new Si,t=new Ri,o=_i(t),r=new Pi({fetchFn:o}),a=await S(process.cwd(),e),s=new ge;s.register("kanonak.org/capabilities/agent-skill-deployment",new $e),s.register("kanonak.org/agent-capabilities/agent-instance-deployment",new Re);let i=await Dn(n,e,a),c=new fe(n,e,r,o,s,a);ct(C,i,c)}catch{}}await Di();C.parse();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kanonak-protocol/cli",
3
- "version": "3.27.1",
3
+ "version": "3.27.3",
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.27.1",
38
- "@kanonak-protocol/types": "^3.27.1",
37
+ "@kanonak-protocol/sdk": "^3.27.3",
38
+ "@kanonak-protocol/types": "^3.27.3",
39
39
  "commander": "^13.0.0",
40
40
  "js-yaml": "^4.1.1"
41
41
  },