@kanonak-protocol/cli 3.24.0 → 3.26.0

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