@kanonak-protocol/cli 3.28.4 → 3.28.6
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.
- package/dist/index.js +9 -9
- package/package.json +3 -3
package/dist/index.js
CHANGED
|
@@ -7,9 +7,9 @@ ${t}/
|
|
|
7
7
|
${m}:`);for(let f of d.errors)console.log(` ERROR (parse): ${f.message} [line ${f.line}:${f.column}]`),c++;continue}let h=d.document;if(!h){console.log(`
|
|
8
8
|
${m}:`),console.log(" ERROR: Failed to parse document"),c++;continue}let y=await a.validateAsync(h,s),p=y.errors.filter(f=>f.severity===an.Error),g=y.warnings.filter(f=>f.severity===an.Warning);if(p.length>0||g.length>0){let f=h.metadata.namespace_,k=f?`${f.publisher}/${f.package_}@${f.version}`:m;console.log(`
|
|
9
9
|
${k}:`);for(let b of p)console.log(` ERROR: ${b.message}`),b.suggestion&&console.log(` -> ${b.suggestion}`);for(let b of g)console.log(` WARN: ${b.message}`)}c+=p.length,l+=g.length}console.log(`
|
|
10
|
-
${i.length} file(s) validated. ${c} error(s), ${l} warning(s).`),c>0&&process.exit(1)}import{KanonakParser as co,PublisherIndex as lo,CredentialStore as uo,createAuthenticatedFetch as po}from"@kanonak-protocol/sdk";import{loadLockFile as mo,saveLockFile as fo,computeIntegrity as go}from"@kanonak-protocol/sdk";function
|
|
11
|
-
Installed ${Object.keys(s.packages).length} package(s) from lock file.`);return}let i=
|
|
12
|
-
Installed ${h.size} package(s).`)}async function un(n,e,t,o,r,a,s,i,c){let l=`${n}/${e}@${t}`;if(i.has(l))return;i.add(l);let m=`${n}/${e}`,u=o.get(n,e,t),d;if(u)console.log(` ${l} (cached)`),d=await a.getPackageUrl(n,e,t);else{d=await a.getPackageUrl(n,e,t);let p=await s(d,n);if(!p.ok)throw new Error(`Failed to fetch ${d} (${p.status} ${p.statusText})`);u=await p.text(),o.put(n,e,t,u),console.log(` ${l}`)}let h={},y=r.parse(u);if(y.metadata.imports)for(let[p,g]of Object.entries(y.metadata.imports))for(let f of g){let k=await a.resolveVersion(p,f);k?(h[`${p}/${f.packageName}`]=k,await un(p,f.packageName,k,o,r,a,s,i,c)):console.error(` WARNING: Could not resolve ${p}/${f.packageName} ${f.package_}`)}c.packages[m]={version:t,resolved:d,integrity:go(u),dependencies:h}}import{readFileSync as ho}from"fs";import{resolve as ko,dirname as yo}from"path";import{KanonakParser as bo}from"@kanonak-protocol/sdk";async function pn(n){let e=ko(n),t=ho(e,"utf-8"),o=new bo,r=o.parse(t),a=r.metadata.namespace_,s=a?`${a.publisher}/${a.package_}@${a.version}`:n;if(console.log(s),!r.metadata.imports){console.log(" (no imports)");return}let i=H(yo(e)),c=await S(i,o),l=new Set;for(let[m,u]of Object.entries(r.metadata.imports))for(let d of u)await mn(m,d,c,l," ")}async function mn(n,e,t,o,r){let a=`${n}/${e.packageName}`;if(o.has(a)){console.log(`${r}${a} (${e.package_}) [circular]`);return}o.add(a);let s;try{s=await t.getHighestCompatibleVersionAsync(n,e)}catch{console.log(`${r}${a} (${e.package_}) [fetch failed]`);return}if(!s){console.log(`${r}${a} (${e.package_}) [not found]`);return}let i=s.metadata.namespace_?.version?.toString()??"?";if(console.log(`${r}${n}/${e.packageName}@${i}`),s.metadata.imports)for(let[c,l]of Object.entries(s.metadata.imports))for(let m of l)await mn(c,m,t,o,r+" ")}import{createHash as $o,randomBytes as gn}from"crypto";import{createServer as vo}from"http";import{execFile as Ke}from"child_process";import{CredentialStore as So,generateDPoPKeyPair as Po,createDPoPProof as dn,serverSupportsDPoP as Ro}from"@kanonak-protocol/sdk";import{normalizeHost as wo}from"@kanonak-protocol/sdk";var
|
|
10
|
+
${i.length} file(s) validated. ${c} error(s), ${l} warning(s).`),c>0&&process.exit(1)}import{KanonakParser as co,PublisherIndex as lo,CredentialStore as uo,createAuthenticatedFetch as po}from"@kanonak-protocol/sdk";import{loadLockFile as mo,saveLockFile as fo,computeIntegrity as go}from"@kanonak-protocol/sdk";function x(n){if(!n)return null;let e=n.indexOf("/");if(e===-1)return null;let t=n.substring(0,e),o=n.substring(e+1);if(!t||!o)return null;let r,a=null,s=null,i=o.indexOf("@");if(i!==-1){r=o.substring(0,i);let c=o.substring(i+1),l=c.indexOf("/");l===-1?a=c||null:(a=c.substring(0,l)||null,s=c.substring(l+1)||null)}else{let c=o.indexOf("/");c===-1?r=o:(r=o.substring(0,c),s=o.substring(c+1)||null)}return!r||s&&s.includes("/")||a&&a.includes("@")?null:{publisher:t,packageName:r,version:a,instanceName:s}}async function ln(n){let e=new D,t=new co,o=new uo,r=po(o),a=new lo({fetchFn:r}),s=mo()??{version:"1",lastUpdated:new Date().toISOString(),packages:{}};if(!n){Object.keys(s.packages).length===0&&(console.error("No kanonak.lock file found or lock file is empty."),console.error("Usage: kanonak install {publisher}/{package}[@{version}]"),process.exit(1)),console.log(`Installing ${Object.keys(s.packages).length} package(s) from kanonak.lock...`);for(let[y,p]of Object.entries(s.packages)){let g=y.indexOf("/"),f=y.substring(0,g),k=y.substring(g+1),b=e.get(f,k,p.version);if(b)console.log(` ${y}@${p.version} (cached)`);else{let w=p.resolved,$=await r(w,f);if(!$.ok)throw new Error(`Failed to fetch ${w} (${$.status} ${$.statusText})`);b=await $.text(),e.put(f,k,p.version,b),console.log(` ${y}@${p.version}`)}}console.log(`
|
|
11
|
+
Installed ${Object.keys(s.packages).length} package(s) from lock file.`);return}let i=x(n);i||(console.error(`Invalid package reference: "${n}"`),console.error("Expected format: {publisher}/{package}[@{version}]"),process.exit(1));let{publisher:c,packageName:l,version:m,instanceName:u}=i;u&&(console.error(`\`kanonak install\` works on whole packages \u2014 got an instance suffix "/${u}".`),console.error(`Try: kanonak install ${c}/${l}${m?"@"+m:""}`),console.error("(Use `kanonak <capability> add` if you want to install one named instance.)"),process.exit(1));let d=m??await a.getHighestVersion(c,l);d||(console.error(`Could not resolve version for "${c}/${l}".`),console.error("Check the spelling, or run a search to see what the publisher offers."),process.exit(1)),console.log(`Installing ${c}/${l}@${d}...`);let h=new Set;await un(c,l,d,e,t,a,r,h,s),fo(s),console.log(`
|
|
12
|
+
Installed ${h.size} package(s).`)}async function un(n,e,t,o,r,a,s,i,c){let l=`${n}/${e}@${t}`;if(i.has(l))return;i.add(l);let m=`${n}/${e}`,u=o.get(n,e,t),d;if(u)console.log(` ${l} (cached)`),d=await a.getPackageUrl(n,e,t);else{d=await a.getPackageUrl(n,e,t);let p=await s(d,n);if(!p.ok)throw new Error(`Failed to fetch ${d} (${p.status} ${p.statusText})`);u=await p.text(),o.put(n,e,t,u),console.log(` ${l}`)}let h={},y=r.parse(u);if(y.metadata.imports)for(let[p,g]of Object.entries(y.metadata.imports))for(let f of g){let k=await a.resolveVersion(p,f);k?(h[`${p}/${f.packageName}`]=k,await un(p,f.packageName,k,o,r,a,s,i,c)):console.error(` WARNING: Could not resolve ${p}/${f.packageName} ${f.package_}`)}c.packages[m]={version:t,resolved:d,integrity:go(u),dependencies:h}}import{readFileSync as ho}from"fs";import{resolve as ko,dirname as yo}from"path";import{KanonakParser as bo}from"@kanonak-protocol/sdk";async function pn(n){let e=ko(n),t=ho(e,"utf-8"),o=new bo,r=o.parse(t),a=r.metadata.namespace_,s=a?`${a.publisher}/${a.package_}@${a.version}`:n;if(console.log(s),!r.metadata.imports){console.log(" (no imports)");return}let i=H(yo(e)),c=await S(i,o),l=new Set;for(let[m,u]of Object.entries(r.metadata.imports))for(let d of u)await mn(m,d,c,l," ")}async function mn(n,e,t,o,r){let a=`${n}/${e.packageName}`;if(o.has(a)){console.log(`${r}${a} (${e.package_}) [circular]`);return}o.add(a);let s;try{s=await t.getHighestCompatibleVersionAsync(n,e)}catch{console.log(`${r}${a} (${e.package_}) [fetch failed]`);return}if(!s){console.log(`${r}${a} (${e.package_}) [not found]`);return}let i=s.metadata.namespace_?.version?.toString()??"?";if(console.log(`${r}${n}/${e.packageName}@${i}`),s.metadata.imports)for(let[c,l]of Object.entries(s.metadata.imports))for(let m of l)await mn(c,m,t,o,r+" ")}import{createHash as $o,randomBytes as gn}from"crypto";import{createServer as vo}from"http";import{execFile as Ke}from"child_process";import{CredentialStore as So,generateDPoPKeyPair as Po,createDPoPProof as dn,serverSupportsDPoP as Ro}from"@kanonak-protocol/sdk";import{normalizeHost as wo}from"@kanonak-protocol/sdk";var L=class{cache=new Map;async discover(e){let t=wo(e);if(this.cache.has(t))return this.cache.get(t);let o=`https://${t}/.well-known/oauth-authorization-server`,r=await this.tryEndpoint(o);if(!r){let a=`https://${t}/.well-known/openid-configuration`;r=await this.tryEndpoint(a)}return this.cache.set(t,r),r}async supportsOAuth(e){return await this.discover(e)!==null}static supportsPkceS256(e){return e.codeChallengeMethodsSupported?.some(t=>t.toUpperCase()==="S256")??!1}static supportsDynamicRegistration(e){return!!e.registrationEndpoint}static supportsAuthorizationCode(e){return e.responseTypesSupported?.some(t=>t.toLowerCase()==="code")??!1}async tryEndpoint(e){let t;try{t=await fetch(e)}catch(r){let a=r instanceof Error?r.message:String(r);return a.includes("ENOTFOUND")||a.includes("ECONNREFUSED")?(console.error(` OAuth discovery: ${e} \u2014 host unreachable (${a})`),console.error(" If the server is behind a VPN, ensure you are connected.")):a.includes("CERT")||a.includes("SSL")||a.includes("TLS")?(console.error(` OAuth discovery: ${e} \u2014 TLS error (${a})`),console.error(" If using a custom CA certificate, set NODE_EXTRA_CA_CERTS=/path/to/ca.pem")):console.error(` OAuth discovery: ${e} \u2014 network error: ${a}`),null}if(!t.ok)return t.status===404||(t.status===403?(console.error(` OAuth discovery: ${e} \u2014 HTTP 403 Forbidden`),console.error(" Access may be blocked by a firewall, proxy, or WAF.")):t.status>=500&&(console.error(` OAuth discovery: ${e} \u2014 HTTP ${t.status} server error`),console.error(" The authorization server returned an internal error. Contact your IDP administrator."))),null;let o;try{o=await t.json()}catch{return console.error(` OAuth discovery: ${e} \u2014 response is not valid JSON`),console.error(" The endpoint may be returning HTML instead of JSON. Check IDP configuration."),null}return{issuer:ne(o.issuer),authorizationEndpoint:ne(o.authorization_endpoint),tokenEndpoint:ne(o.token_endpoint),registrationEndpoint:ne(o.registration_endpoint),revocationEndpoint:ne(o.revocation_endpoint),scopesSupported:G(o.scopes_supported),responseTypesSupported:G(o.response_types_supported),grantTypesSupported:G(o.grant_types_supported),codeChallengeMethodsSupported:G(o.code_challenge_methods_supported),tokenEndpointAuthMethodsSupported:G(o.token_endpoint_auth_methods_supported),dpopSigningAlgValuesSupported:G(o.dpop_signing_alg_values_supported)}}};function ne(n){return typeof n=="string"?n:null}function G(n){return Array.isArray(n)?n.filter(e=>typeof e=="string"):null}var Y=class{discovery;credentialStore;constructor(e,t){this.discovery=e??new L,this.credentialStore=t??new So}async authorize(e,t=[]){console.log(`Starting OAuth flow for ${e}...`);let o=await this.discovery.discover(e);if(!o)return _(`No OAuth discovery endpoint found for '${e}'.
|
|
13
13
|
The server must expose one of:
|
|
14
14
|
- https://${e}/.well-known/oauth-authorization-server (RFC 8414)
|
|
15
15
|
- https://${e}/.well-known/openid-configuration (OpenID Connect)
|
|
@@ -44,18 +44,18 @@ Installed ${h.size} package(s).`)}async function un(n,e,t,o,r,a,s,i,c){let l=`${
|
|
|
44
44
|
Ensure the token endpoint is reachable.`}}if(!m.ok){let u=await De(m),d=_o(u);return{success:!1,error:`Token exchange failed.
|
|
45
45
|
Endpoint: ${e}
|
|
46
46
|
HTTP ${m.status}: ${u}`+(d?`
|
|
47
|
-
${d}`:"")}}return{success:!0,tokens:fn(await m.json())}}async refreshTokenRequest(e,t,o,r,a){let s=new URLSearchParams({grant_type:"refresh_token",client_id:t,refresh_token:r});o&&s.set("client_secret",o);let i={"Content-Type":"application/x-www-form-urlencoded"};if(a)try{i.DPoP=dn(a.privateKey,a.publicKey,"POST",e)}catch(l){return{success:!1,error:`Failed to create DPoP proof for token refresh: ${J(l)}`}}let c;try{c=await fetch(e,{method:"POST",headers:i,body:s.toString()})}catch(l){return{success:!1,error:`Token refresh request to ${e} failed: ${J(l)}`}}if(!c.ok){let l=await De(c);return{success:!1,error:`Token refresh failed \u2014 HTTP ${c.status}: ${l}`}}return{success:!0,tokens:fn(await c.json())}}async revokeToken(e,t,o){await fetch(e,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({token:t,client_id:o}).toString()})}};function _(n){return{success:!1,error:n}}function fn(n){return{accessToken:n.access_token,refreshToken:n.refresh_token,expiresIn:typeof n.expires_in=="number"?n.expires_in:void 0}}function J(n){return n instanceof Error?n.message:String(n)}async function De(n){try{return await n.text()}catch{return"(could not read response body)"}}function _o(n){try{let e=JSON.parse(n);switch(e.error){case"invalid_grant":return"Hint: The authorization code may have expired or already been used. Re-run the login flow.";case"invalid_client":return"Hint: The client credentials were rejected. The client_id may be invalid or the client_secret may be wrong.";case"redirect_uri_mismatch":return"Hint: The redirect_uri does not match what was registered with the IDP.";case"unsupported_grant_type":return"Hint: The IDP does not support authorization_code grants. Contact your IDP administrator.";case"invalid_scope":return"Hint: One or more requested scopes are not allowed. Check the scopes configured on the IDP.";case"use_dpop_nonce":return"Hint: The server requires a DPoP nonce. This should be handled automatically \u2014 please report this as a bug.";default:return e.error_description?`IDP says: ${e.error_description}`:null}}catch{return null}}function Co(){return gn(32).toString("base64url")}function Ko(n){return $o("sha256").update(n).digest("base64url")}function Do(){return gn(16).toString("base64url")}function Io(n,e,t,o,r,a){let s=new URLSearchParams({client_id:e,response_type:"code",redirect_uri:t,scope:o.join(" "),state:r,code_challenge:a,code_challenge_method:"S256"});return`${n}?${s}`}var xo=300*1e3;async function To(){return new Promise(n=>{let e=vo((r,a)=>{let s=new URL(r.url,"http://localhost"),i=s.searchParams.get("code")??void 0,c=s.searchParams.get("state")??void 0,l=s.searchParams.get("error")??s.searchParams.get("error_description")??void 0,m=l?Ao(l):null,u=m?`<html><body><h1>Authorization failed</h1><p>${m}</p></body></html>`:"<html><body><h1>Authorization successful!</h1><p>You can close this window.</p></body></html>";a.writeHead(200,{"Content-Type":"text/html"}),a.end(u),t({code:i,state:c,error:l})}),t,o=new Promise(r=>{t=r,setTimeout(()=>{r(null),e.close()},xo)});e.listen(0,"127.0.0.1",()=>{let r=e.address();n({redirectUri:`http://localhost:${r.port}/callback`,port:r.port,waitForCallback:()=>o,close:()=>e.close()})})})}function Ao(n){return n.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""")}function Eo(n){try{process.platform==="win32"?Ke("cmd",["/c","start","",n]):process.platform==="darwin"?Ke("open",[n]):Ke("xdg-open",[n])}catch{console.log(" Could not open browser automatically. Please navigate to the URL above manually.")}}import{CredentialStore as jo}from"@kanonak-protocol/sdk";async function hn(n){try{let e=new
|
|
47
|
+
${d}`:"")}}return{success:!0,tokens:fn(await m.json())}}async refreshTokenRequest(e,t,o,r,a){let s=new URLSearchParams({grant_type:"refresh_token",client_id:t,refresh_token:r});o&&s.set("client_secret",o);let i={"Content-Type":"application/x-www-form-urlencoded"};if(a)try{i.DPoP=dn(a.privateKey,a.publicKey,"POST",e)}catch(l){return{success:!1,error:`Failed to create DPoP proof for token refresh: ${J(l)}`}}let c;try{c=await fetch(e,{method:"POST",headers:i,body:s.toString()})}catch(l){return{success:!1,error:`Token refresh request to ${e} failed: ${J(l)}`}}if(!c.ok){let l=await De(c);return{success:!1,error:`Token refresh failed \u2014 HTTP ${c.status}: ${l}`}}return{success:!0,tokens:fn(await c.json())}}async revokeToken(e,t,o){await fetch(e,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({token:t,client_id:o}).toString()})}};function _(n){return{success:!1,error:n}}function fn(n){return{accessToken:n.access_token,refreshToken:n.refresh_token,expiresIn:typeof n.expires_in=="number"?n.expires_in:void 0}}function J(n){return n instanceof Error?n.message:String(n)}async function De(n){try{return await n.text()}catch{return"(could not read response body)"}}function _o(n){try{let e=JSON.parse(n);switch(e.error){case"invalid_grant":return"Hint: The authorization code may have expired or already been used. Re-run the login flow.";case"invalid_client":return"Hint: The client credentials were rejected. The client_id may be invalid or the client_secret may be wrong.";case"redirect_uri_mismatch":return"Hint: The redirect_uri does not match what was registered with the IDP.";case"unsupported_grant_type":return"Hint: The IDP does not support authorization_code grants. Contact your IDP administrator.";case"invalid_scope":return"Hint: One or more requested scopes are not allowed. Check the scopes configured on the IDP.";case"use_dpop_nonce":return"Hint: The server requires a DPoP nonce. This should be handled automatically \u2014 please report this as a bug.";default:return e.error_description?`IDP says: ${e.error_description}`:null}}catch{return null}}function Co(){return gn(32).toString("base64url")}function Ko(n){return $o("sha256").update(n).digest("base64url")}function Do(){return gn(16).toString("base64url")}function Io(n,e,t,o,r,a){let s=new URLSearchParams({client_id:e,response_type:"code",redirect_uri:t,scope:o.join(" "),state:r,code_challenge:a,code_challenge_method:"S256"});return`${n}?${s}`}var xo=300*1e3;async function To(){return new Promise(n=>{let e=vo((r,a)=>{let s=new URL(r.url,"http://localhost"),i=s.searchParams.get("code")??void 0,c=s.searchParams.get("state")??void 0,l=s.searchParams.get("error")??s.searchParams.get("error_description")??void 0,m=l?Ao(l):null,u=m?`<html><body><h1>Authorization failed</h1><p>${m}</p></body></html>`:"<html><body><h1>Authorization successful!</h1><p>You can close this window.</p></body></html>";a.writeHead(200,{"Content-Type":"text/html"}),a.end(u),t({code:i,state:c,error:l})}),t,o=new Promise(r=>{t=r,setTimeout(()=>{r(null),e.close()},xo)});e.listen(0,"127.0.0.1",()=>{let r=e.address();n({redirectUri:`http://localhost:${r.port}/callback`,port:r.port,waitForCallback:()=>o,close:()=>e.close()})})})}function Ao(n){return n.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""")}function Eo(n){try{process.platform==="win32"?Ke("cmd",["/c","start","",n]):process.platform==="darwin"?Ke("open",[n]):Ke("xdg-open",[n])}catch{console.log(" Could not open browser automatically. Please navigate to the URL above manually.")}}import{CredentialStore as jo}from"@kanonak-protocol/sdk";async function hn(n){try{let e=new L,t=new jo,r=await new Y(e,t).authorize(n);r.success?console.log(`
|
|
48
48
|
Authenticated with ${n}.`):(console.error(`
|
|
49
49
|
Authentication failed:
|
|
50
50
|
${r.error}`),process.exit(1))}catch(e){let t=e instanceof Error?e.message:String(e);console.error(`
|
|
51
51
|
Authentication failed unexpectedly:
|
|
52
52
|
${t}`),console.error(`
|
|
53
|
-
If this persists, see https://github.com/kanonak-protocol for support channels.`),process.exit(1)}}import{CredentialStore as Oo}from"@kanonak-protocol/sdk";async function kn(n){try{let e=new
|
|
53
|
+
If this persists, see https://github.com/kanonak-protocol for support channels.`),process.exit(1)}}import{CredentialStore as Oo}from"@kanonak-protocol/sdk";async function kn(n){try{let e=new L,t=new Oo,r=await new Y(e,t).logout(n);r.success?console.log(`Logged out from ${n}.`):(console.error(`
|
|
54
54
|
Logout failed:
|
|
55
55
|
${r.error}`),process.exit(1))}catch(e){let t=e instanceof Error?e.message:String(e);console.error(`
|
|
56
56
|
Logout failed unexpectedly:
|
|
57
57
|
${t}`),process.exit(1)}}import{Command as ir}from"commander";import{KanonakParser as cr,KanonakObjectParser as lr,PublisherIndex as ur,CredentialStore as pr,createAuthenticatedFetch as mr,computeIntegrity as dr}from"@kanonak-protocol/sdk";import{readFileSync as No,writeFileSync as Lo,existsSync as Uo}from"fs";import{join as Fo}from"path";import yn from"js-yaml";import{getGlobalCachePath as Ho}from"@kanonak-protocol/sdk";var Mo=`# This file is generated by Kanonak CLI. Do not edit manually.
|
|
58
|
-
`;function bn(){let n=Ho();return Fo(n,"..","capabilities.lock")}function X(){let n=bn();if(!Uo(n))return{version:"1",lastUpdated:new Date().toISOString(),capabilities:{}};let e=No(n,"utf-8"),t=yn.load(e);return!t||typeof t!="object"||t.version!=="1"?{version:"1",lastUpdated:new Date().toISOString(),capabilities:{}}:{version:"1",lastUpdated:t.lastUpdated??new Date().toISOString(),capabilities:t.capabilities??{}}}function te(n){n.lastUpdated=new Date().toISOString();let e={};for(let o of Object.keys(n.capabilities).sort())e[o]=n.capabilities[o];n.capabilities=e;let t=yn.dump(n,{lineWidth:-1,sortKeys:!1,quotingType:'"'});Lo(bn(),Mo+t,"utf-8")}import{SingleDocumentRepository as fr}from"@kanonak-protocol/sdk/uri-helpers";import{existsSync as Vo,readdirSync as Bo,readFileSync as zo}from"fs";import{join as wn}from"path";import{KanonakObjectParser as Wo,EmbeddedKanonak as Pn,ReferenceKanonak as Rn,getGlobalCachePath as qo}from"@kanonak-protocol/sdk";import{SingleDocumentRepository as _n}from"@kanonak-protocol/sdk/uri-helpers";import{uriKey as Ie,findSubjectsByType as Go,getStringValue as
|
|
58
|
+
`;function bn(){let n=Ho();return Fo(n,"..","capabilities.lock")}function X(){let n=bn();if(!Uo(n))return{version:"1",lastUpdated:new Date().toISOString(),capabilities:{}};let e=No(n,"utf-8"),t=yn.load(e);return!t||typeof t!="object"||t.version!=="1"?{version:"1",lastUpdated:new Date().toISOString(),capabilities:{}}:{version:"1",lastUpdated:t.lastUpdated??new Date().toISOString(),capabilities:t.capabilities??{}}}function te(n){n.lastUpdated=new Date().toISOString();let e={};for(let o of Object.keys(n.capabilities).sort())e[o]=n.capabilities[o];n.capabilities=e;let t=yn.dump(n,{lineWidth:-1,sortKeys:!1,quotingType:'"'});Lo(bn(),Mo+t,"utf-8")}import{SingleDocumentRepository as fr}from"@kanonak-protocol/sdk/uri-helpers";import{existsSync as Vo,readdirSync as Bo,readFileSync as zo}from"fs";import{join as wn}from"path";import{KanonakObjectParser as Wo,EmbeddedKanonak as Pn,ReferenceKanonak as Rn,getGlobalCachePath as qo}from"@kanonak-protocol/sdk";import{SingleDocumentRepository as _n}from"@kanonak-protocol/sdk/uri-helpers";import{uriKey as Ie,findSubjectsByType as Go,getStringValue as U,getReferenceUri as xe,getListValues as Cn}from"@kanonak-protocol/sdk/uri-helpers";var P="kanonak.org",R="capabilities",Te={publisher:P,package_:R,name:"Capability"},Jo={publisher:P,package_:R,name:"commandName"},Kn={publisher:P,package_:R,name:"description"},Yo={publisher:P,package_:R,name:"managesType"},Xo={publisher:P,package_:R,name:"deploymentTarget"},Zo={publisher:P,package_:R,name:"hasCommand"},Qo={publisher:P,package_:R,name:"subcommandName"},er={publisher:P,package_:R,name:"performs"},nr={publisher:P,package_:R,name:"hasArgument"},tr={publisher:P,package_:R,name:"argumentName"},$n={publisher:P,package_:R,name:"isRequired"},vn={publisher:P,package_:R,name:"isOption"},or={publisher:P,package_:R,name:"defaultValue"};async function Dn(n,e,t){let o=X(),r=new Wo,a=[],s=!1;for(let[i,c]of Object.entries(o.capabilities)){let l=c,m=n.get(l.publisher,l.package_,l.version);if(!m){let u=await rr(i,l,e,r,t);if(u)console.error(` Healed capability "${i}": ${l.publisher}/${l.package_}@${l.version} \u2192 ${u.entry.publisher}/${u.entry.package_}@${u.entry.version} (package was renamed)`),o.capabilities[i]=u.entry,l=u.entry,m=u.content,s=!0;else{console.error(` WARNING: Cached content missing for capability "${i}" (${l.publisher}/${l.package_}@${l.version}). Reinstall it with: kanonak capability remove ${i} && kanonak capability add ${l.publisher}/${l.package_}`);continue}}try{let u=e.parse(m),d=new _n(u,t),h=await r.parseKanonaks(d),y=In(h,l.publisher,l.package_,l.version);y?a.push(y):console.error(` WARNING: No Capability instance found in "${i}" (${l.publisher}/${l.package_}@${l.version})`)}catch(u){console.error(` WARNING: Failed to parse capability "${i}": ${u}`)}}return s&&te(o),a}async function rr(n,e,t,o,r){let a=wn(qo(),e.publisher);if(!Vo(a))return;let s=[];for(let i of Bo(a)){if(!i.endsWith(".kan.yml"))continue;let c=i.slice(0,-8),l=c.lastIndexOf("@");if(l===-1)continue;let m=c.substring(0,l),u=c.substring(l+1);if(m===e.package_&&u===e.version)continue;let d;try{d=zo(wn(a,i),"utf-8")}catch{continue}let h;try{let y=t.parse(d),p=new _n(y,r),g=await o.parseKanonaks(p);h=In(g,e.publisher,m,u)?.commandName}catch{continue}h===n&&s.push({entry:{publisher:e.publisher,package_:m,version:u,resolved:`kanonak://${e.publisher}/${m}@${u}`,integrity:""},content:d})}if(s.length===1)return s[0]}function In(n,e,t,o){let r=Go(n,Te);if(r.length===0)return;let a=r[0],s=U(a,Jo)??"",i=U(a,Kn)??"",c=xe(a,Yo),l=xe(a,Xo),m=[];for(let u of Cn(a,Zo)){let d=sr(u,n);d&&m.push(d)}return{commandName:s,description:i,managesTypeKey:c?Ie(c):"",deploymentTargetKey:l?Ie(l):"",commands:m,publisher:e,package_:t,version:o}}function sr(n,e){let t;if(n instanceof Pn)t=n;else if(n instanceof Rn){let c=xn(e,n.subject.publisher,n.subject.package_,n.subject.name);c&&(t=c)}if(!t)return;let o=U(t,Qo)??"",r=U(t,Kn)??"",a=xe(t,er),s=Cn(t,nr),i=[];for(let c of s){let l=ar(c,e);l&&i.push(l)}return{subcommandName:o,description:r,arguments:i,actionKey:a?Ie(a):""}}function ar(n,e){let t;if(n instanceof Pn)t=n;else if(n instanceof Rn){let c=xn(e,n.subject.publisher,n.subject.package_,n.subject.name);c&&(t=c)}if(!t)return;let o=U(t,tr)??"",r=U(t,$n)==="true"||Sn(t,$n)===!0,a=U(t,vn)==="true"||Sn(t,vn)===!0,s=U(t,or),i={argumentName:o,required:r,isOption:a};return s!==void 0&&(i.defaultValue=s),i}function Sn(n,e){for(let t of n.statement){let o=t,r=o.predicate;if(r?.subject&&r.subject.publisher===e.publisher&&r.subject.package_===e.package_&&r.subject.name===e.name)return typeof o.object=="boolean"?o.object:void 0}}function xn(n,e,t,o){for(let r of n){if(!("name"in r)||!("namespace"in r))continue;let a=r;if(a.name===o&&!(!a.namespace||typeof a.namespace!="string")&&a.namespace.startsWith(`${e}/${t}@`))return r}}import{findSubjectsByType as gr,getStringValue as hr}from"@kanonak-protocol/sdk/uri-helpers";var kr={publisher:P,package_:R,name:"commandName"};function Tn(){let n=new ir("capability").description("Manage Kanonak CLI capabilities (pluggable command groups)");return n.command("add <package>").description("Install a capability from a Kanonak publisher").action(async e=>{await yr(e)}),n.command("remove <name>").description("Remove an installed capability").action(async e=>{await br(e)}),n.command("list").description("List installed capabilities").action(async()=>{await wr()}),n}async function yr(n){let e=x(n);e||(console.error(`Invalid package reference: "${n}"`),console.error("Expected format: {publisher}/{package}[@{version}]"),process.exit(1));let{publisher:t,packageName:o,version:r,instanceName:a}=e;a&&(console.error(`\`kanonak capability add\` installs whole packages \u2014 got an instance suffix "/${a}".`),console.error(`Try: kanonak capability add ${t}/${o}${r?"@"+r:""}`),process.exit(1));let s=new D,i=new cr,c=new lr,l=new pr,m=mr(l),u=new ur({fetchFn:m}),d=r??await u.getHighestVersion(t,o);d||(console.error(`Could not resolve version for "${t}/${o}".`),process.exit(1)),console.log(`Installing capability ${t}/${o}@${d}...`);let h=s.get(t,o,d);if(!h){let v=await u.getPackageUrl(t,o,d),K=await m(v,t);if(!K.ok)throw new Error(`Failed to fetch ${v} (${K.status} ${K.statusText})`);h=await K.text(),s.put(t,o,d,h)}let y=i.parse(h),p=await S(process.cwd(),i),g=new fr(y,p),f=await c.parseKanonaks(g),k=gr(f,Te);k.length===0&&(console.error(`Package ${t}/${o}@${d} does not contain a ${P}/${R}/Capability instance.`),process.exit(1));let b=k[0],w=hr(b,kr);w||(console.error(`Capability instance in ${t}/${o}@${d} has no commandName property.`),process.exit(1));let $=X();$.capabilities[w]={publisher:t,package_:o,version:d,resolved:await u.getPackageUrl(t,o,d),integrity:dr(h)},te($),console.log(`
|
|
59
59
|
Installed capability "${w}".`),console.log(`Run "kanonak ${w} --help" to get started.`)}async function br(n){let e=X();e.capabilities[n]||(console.error(`Capability "${n}" is not installed.`),process.exit(1));let t=e.capabilities[n];delete e.capabilities[n],te(e),console.log(`Removed capability "${n}" (${t.publisher}/${t.package_}@${t.version}).`)}async function wr(){let n=X(),e=Object.entries(n.capabilities);if(e.length===0){console.log("No capabilities installed."),console.log("Install one with: kanonak capability add {publisher}/{package}");return}console.log(`Installed capabilities:
|
|
60
60
|
`);for(let[t,o]of e)console.log(` ${t} ${o.publisher}/${o.package_}@${o.version}`)}import{Command as re}from"commander";import{readFileSync as $r,writeFileSync as vr,mkdirSync as Sr,existsSync as An,statSync as Pr}from"fs";import{join as Rr,resolve as _r}from"path";import{KanonakParser as je,KanonakObjectParser as Oe,SubjectKanonak as Cr,Reasoner as Kr,KanonakVocabulary as Dr,makeUriKey as On,pickHighestDocument as Ne,formatVersion as Nn}from"@kanonak-protocol/sdk";import{SingleDocumentRepository as oe}from"@kanonak-protocol/sdk/uri-helpers";import{findSubjectsByType as Ae,findSubjectByUri as Ir}from"@kanonak-protocol/sdk/uri-helpers";import{TX_V3 as En}from"@kanonak-protocol/sdk/transformations";import{TransformationRunnerV3 as xr,SUPPORTED_FORMATS_V3 as Ln}from"@kanonak-protocol/sdk/transformations";import{compileTransformationV3 as Le}from"@kanonak-protocol/sdk/transformations";function Ee(n){return[...Ae(n,En.InstanceTransformation),...Ae(n,En.SetTransformation)]}function Un(){let n=new re("transform").description("Run ontology-driven transformations against Kanonak packages. Transformations are declarative YAML rules (instances of `kanonak.org/transformations/Transformation`) that convert ontology instances into output files. The runner produces one or more Artifacts per matched input; format backends serialize them to Markdown, HTML, SVG, TOML, JSON, or (with post-processing) PDF.").addHelpText("after",`
|
|
61
61
|
Examples:
|
|
@@ -108,17 +108,17 @@ 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 ss(n,e)}catch(t){console.error(`Error: ${t.message}`),process.exit(1)}})}async function ss(n,e){let t=
|
|
111
|
+
`).action(async(n,e)=>{try{await ss(n,e)}catch(t){console.error(`Error: ${t.message}`),process.exit(1)}})}async function ss(n,e){let t=x(n);if(!t||!t.instanceName)throw new Error(`Invalid resource URI "${n}". Expected publisher/package[@version]/instance.`);let o=new Xr,r=new Zr,a=await S(process.cwd(),o),s=await r.parseKanonaks(a),i=as(s,t);if(!i)throw new Error(`Resource ${t.publisher}/${t.packageName}${t.version?`@${t.version}`:""}/${t.instanceName} not found in the workspace or cache.`);console.log(`Resource: ${Mn(i)}`);let c=cs(e.format),l=ls(e.variant),m=Qr(i,c,l,s);if(!m)throw new Error(`No derivation found for resource ${Mn(i)} at (format=${e.format}, variant=${e.variant}). The class hierarchy declares no binding and no universal default applies.`);console.log(`Derivation: ${us(m)} \u2192 ${Vn(m.transformation)}`);let u=is(s,m.transformation);if(!u)throw new Error(`Transformation ${Vn(m.transformation)} not found in the workspace or cache. The binding pointed at a transformation the resolver cannot locate.`);let d=rs(e.format),y=await new es().run({transformation:u,instances:[i],allKanonaks:s,repository:a,parser:o,objectParser:r,outputFormat:d}),p=Yr(e.out);Gr(p,{recursive:!0});let g=os[e.format]??"";for(let f of y){let k=ps(f.fileName),b=Jr(p,`${k}${g}`);qr(b,f.content,"utf-8"),console.log(` wrote ${b}`)}console.log(`Done. ${y.length} artifact(s) written to ${p}`)}function as(n,e){for(let t of n){if(!(t instanceof Bn)||t.name!==e.instanceName)continue;let o=t.namespace||"",r=`${e.publisher}/${e.packageName}@`;if(o.startsWith(r))if(e.version){if(o===`${e.publisher}/${e.packageName}@${e.version}`)return t}else return t}}function is(n,e){let t=`${e.publisher}/${e.package_}@${e.version}`;for(let o of n)if(o instanceof Bn&&o.name===e.name&&o.namespace===t)return o}function cs(n){if(n.includes("/")){let e=x(n);if(!e||!e.instanceName)throw new Error(`Invalid --format URI "${n}".`);return{publisher:e.publisher,package_:e.packageName,name:e.instanceName}}return{...ns,name:n}}function ls(n){if(n.includes("/")){let e=x(n);if(!e||!e.instanceName)throw new Error(`Invalid --variant URI "${n}".`);return{publisher:e.publisher,package_:e.packageName,name:e.instanceName}}return{...ts,name:n}}function Mn(n){return`${n.namespace}/${n.name}`}function Vn(n){return`${n.publisher}/${n.package_}@${n.version}/${n.name}`}function us(n){return n.source==="instance"?"instance override":`class ${n.source.publisher}/${n.source.package_}/${n.source.name}`}function ps(n){return n.replace(/[^a-zA-Z0-9._@-]+/g,"_")}import{Command as ms}from"commander";import{writeFileSync as se,mkdirSync as He}from"fs";import{join as F,resolve as Wn}from"path";import{KanonakParser as ds,KanonakObjectParser as fs,SubjectKanonak as gs,LookRenderer as hs}from"@kanonak-protocol/sdk";import{TransformationEngine as ks}from"@kanonak-protocol/sdk/transformations";import{readFileSync as ys}from"fs";var bs=[{format:{publisher:"kanonak.org",package_:"formats",name:"html"},fileExtension:".html"},{format:{publisher:"kanonak.org",package_:"formats",name:"stylesheet"},fileExtension:".css"},{format:{publisher:"kanonak.org",package_:"formats",name:"svg"},fileExtension:".svg"}];function qn(){return new ms("publish").description("Generate a static Kanonak site from the local workspace. Walks every resource and renders HTML + stylesheet via the engine. Writes to --out in the canonical Kanonak URL hierarchy.").option("--workspace <dir>","Workspace directory containing .kan.yml package files. Defaults to current directory.",process.cwd()).option("--out <dir>","Output directory for the generated site. Defaults to _site.","_site").action(async n=>{await ws(n)})}async function ws(n){let e=Wn(n.workspace),t=Wn(n.out),o=new ds,r=new fs,a=[];q(e,a),a.length===0&&(console.error(`No .kan.yml files found under ${e}`),process.exit(1)),console.log(`Found ${a.length} local package file(s) under ${e}`);let s=new Set;for(let p of a)try{let g=ys(p,"utf-8"),k=o.parse(g).metadata?.namespace_;if(!k)continue;let b=k.version;s.add(`${k.publisher}/${k.package_}@${b.major}.${b.minor}.${b.patch}`)}catch(g){console.warn(` warning: failed to parse ${p}: ${g.message}`)}console.log(`Local namespaces: ${[...s].join(", ")}`);let i=await S(e,o),c=await r.parseKanonaks(i),l=c.filter(p=>{if(!(p instanceof gs)||!s.has(p.namespace||""))return!1;let f=(p.namespace||"").split("/")[1]?.split("@")[0];return p.name!==f});console.log(`Publishing ${l.length} resource(s) to ${t}`);let m=new ks(i,o,r),u=new hs(c),d=0,h=0;for(let p of l){let g=p.namespace||"",[f,k]=g.split("/");if(!f||!k)continue;let[b,w]=k.split("@");if(!b||!w)continue;let $=F(t,b,w);He($,{recursive:!0});let v=u.findCascadedLook(p),K=v&&!(v.sourceClass.publisher==="kanonak.org"&&v.sourceClass.package_==="core-rdf"&&v.sourceClass.name==="Resource"),j=w.split(".").map(Number),ee=j.length===3&&j.every(I=>!Number.isNaN(I))?{major:j[0],minor:j[1],patch:j[2]}:void 0,W=u.renderRawMarkdown(p);W!==void 0&&(se(F($,`${p.name}.md`),W,"utf-8"),d+=1);for(let I of bs){let O=I.format.name;try{let N,E;if(K&&(O==="html"||O==="stylesheet"))N=O==="html"?u.renderDocument(p):u.renderStylesheet(p),E=`${p.name}${I.fileExtension}`;else if(O==="svg")N=u.renderSvg(p),E=`${p.name}${I.fileExtension}`;else{let Ht={publisher:f,package_:b,name:p.name,...ee?{version:ee}:{}},ce=await m.render({resource:Ht,format:I.format});N=ce.content,O==="html"?E=`${p.name}${I.fileExtension}`:E=ce.filename.includes(".")?ce.filename:`${ce.filename}${I.fileExtension}`}let ie=F($,E);se(ie,N,"utf-8"),d+=1}catch(N){console.warn(` ${f}/${b}@${w}/${p.name} [${O}]: ${N.message}`),h+=1}}}console.log(`Done. ${d} artifact(s) written, ${h} skipped.`),h>0&&console.log("Skipped artifacts are typically resources with no derivation binding for the requested format (e.g. an instance class without an html transformation). This is expected for vocabulary-only packages \u2014 they have no instances to render.");let y=$s(t,l);console.log(`Wrote ${y} version-form redirect stub(s).`)}function $s(n,e){let t=new Map;for(let r of e){let a=r.namespace||"",[,s]=a.split("/");if(!s)continue;let[i,c]=s.split("@");if(!i||!c)continue;let l=c.split(".").map(Number);if(l.length!==3||l.some(u=>Number.isNaN(u)))continue;let m=`${i}/${r.name}`;t.has(m)||t.set(m,[]),t.get(m).push({verStr:c,major:l[0],minor:l[1],patch:l[2]})}let o=0;for(let[r,a]of t){let[s,i]=r.split("/");a.sort((u,d)=>d.major-u.major||d.minor-u.minor||d.patch-u.patch);let c=a[0];se(F(n,s,`${i}.html`),Fe(`/${s}/${c.verStr}/${i}`),"utf-8"),o+=1;let l=new Set;for(let u of a){if(l.has(u.major))continue;l.add(u.major);let d=F(n,s,String(u.major));He(d,{recursive:!0}),se(F(d,`${i}.html`),Fe(`/${s}/${u.verStr}/${i}`),"utf-8"),o+=1}let m=new Set;for(let u of a){let d=`${u.major}.${u.minor}`;if(m.has(d))continue;m.add(d);let h=F(n,s,d);He(h,{recursive:!0}),se(F(h,`${i}.html`),Fe(`/${s}/${u.verStr}/${i}`),"utf-8"),o+=1}}return o}function Fe(n){let e=n.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""");return`<!doctype html>
|
|
112
112
|
<meta charset="utf-8">
|
|
113
113
|
<title>Redirecting\u2026</title>
|
|
114
114
|
<meta http-equiv="refresh" content="0; url=${e}">
|
|
115
115
|
<link rel="canonical" href="${e}">
|
|
116
116
|
<p>If you are not redirected automatically, follow this <a href="${e}">link</a>.</p>
|
|
117
|
-
`}import{Command as Zn}from"commander";import{writeFileSync as Me,mkdirSync as pe}from"fs";import{join as Ve,resolve as vs,dirname as Be}from"path";import{KanonakParser as Ss,KanonakObjectParser as Ps,SubjectKanonak as Qn,ReferenceStatement as Rs,ReferenceKanonak as _s,ListStatement as Cs,StringStatement as et,EmbeddedStatement as Ks,findDerivation as Gn}from"@kanonak-protocol/sdk";import{SingleDocumentRepository as Ds}from"@kanonak-protocol/sdk/uri-helpers";import{TransformationRunnerV3 as Is}from"@kanonak-protocol/sdk/transformations";import{findSubjectsByType as me}from"@kanonak-protocol/sdk/uri-helpers";var
|
|
117
|
+
`}import{Command as Zn}from"commander";import{writeFileSync as Me,mkdirSync as pe}from"fs";import{join as Ve,resolve as vs,dirname as Be}from"path";import{KanonakParser as Ss,KanonakObjectParser as Ps,SubjectKanonak as Qn,ReferenceStatement as Rs,ReferenceKanonak as _s,ListStatement as Cs,StringStatement as et,EmbeddedStatement as Ks,findDerivation as Gn}from"@kanonak-protocol/sdk";import{SingleDocumentRepository as Ds}from"@kanonak-protocol/sdk/uri-helpers";import{TransformationRunnerV3 as Is}from"@kanonak-protocol/sdk/transformations";import{findSubjectsByType as me}from"@kanonak-protocol/sdk/uri-helpers";var T="kanonak.org",A="site",Jn={publisher:"kanonak.org",package_:"formats",name:"html"},Yn={publisher:"kanonak.org",package_:"derivation",name:"default"};function nt(){let n=new Zn("site").description("Materialize a publisher's site \u2014 every StaticPage and AggregateView in the workspace gets rendered to its declared output path under the --out directory.");return n.addCommand(xs()),n}function xs(){return new Zn("build").description("Walk the workspace, find every StaticPage and AggregateView, and write each materialized artifact to its declared output path under the --out directory.").option("--out <dir>","Output base directory.","./_site").action(async n=>{try{await Ts(n)}catch(e){console.error(`Error: ${e.message}`),process.exit(1)}})}async function Ts(n){let e=new Ss,t=new Ps,o=await S(process.cwd(),e),r=await t.parseKanonaks(o),a=vs(n.out);pe(a,{recursive:!0});let s=await o.getAllDocumentsAsync(),i=new Set;for(let p of s){let g=p.metadata.namespace_?.toString();g&&i.add(g)}let c={publisher:T,package_:A,name:"StaticPage"},l={publisher:T,package_:A,name:"ResourcePage"},m={publisher:T,package_:A,name:"AggregateView"},u=me(r,c).filter(p=>i.has(p.namespace||"")),d=me(r,l).filter(p=>i.has(p.namespace||"")),h=me(r,m).filter(p=>i.has(p.namespace||""));console.log(`Found ${u.length} StaticPage(s), ${d.length} ResourcePage(s), and ${h.length} AggregateView(s) in the workspace.`);let y=new Is;for(let p of u){let g=ze(p,T,A,"outputPath")??`${p.name}.html`,f=Gn(p,Jn,Yn,r);if(!f){console.warn(` [skip] ${p.name}: no HTML/default derivation found (check class hierarchy or universal-derivations is loaded)`);continue}let k=We(r,f.transformation);if(!k){console.warn(` [skip] ${p.name}: transformation ${qe(f.transformation)} not found`);continue}let b=await y.run({transformation:k,instances:[p],allKanonaks:r,repository:o,parser:e,objectParser:t,outputFormat:"html"});if(b.length===0){console.warn(` [skip] ${p.name}: transformation produced no artifacts`);continue}let w=Ve(a,g);pe(Be(w),{recursive:!0}),Me(w,b[0].content,"utf-8"),console.log(` wrote ${w} (StaticPage ${p.name})`)}for(let p of d){let g=ze(p,T,A,"outputPath")??`${p.name}.html`,f=Xn(p,T,A,"pageOf");if(!f){console.warn(` [skip] ${p.name}: no pageOf declared`);continue}let k=r.find(K=>K instanceof Qn&&K.name===f.name&&(K.namespace||"").startsWith(`${f.publisher}/${f.package_}@`));if(!k){console.warn(` [skip] ${p.name}: pageOf target ${f.publisher}/${f.package_}/${f.name} not found`);continue}let b=Gn(k,Jn,Yn,r);if(!b){console.warn(` [skip] ${p.name}: no derivation for target ${k.name}`);continue}let w=We(r,b.transformation);if(!w){console.warn(` [skip] ${p.name}: transformation ${qe(b.transformation)} not found`);continue}let $=await y.run({transformation:w,instances:[k],allKanonaks:r,repository:o,parser:e,objectParser:t,outputFormat:"html"});if($.length===0){console.warn(` [skip] ${p.name}: transformation produced no artifacts`);continue}let v=Ve(a,g);pe(Be(v),{recursive:!0}),Me(v,$[0].content,"utf-8"),console.log(` wrote ${v} (ResourcePage ${p.name} \u2192 ${k.name})`)}for(let p of h){let g=ze(p,T,A,"outputPath");if(!g){console.warn(` [skip] ${p.name}: no outputPath declared`);continue}let f=Xn(p,T,A,"scopeClass");if(!f){console.warn(` [skip] ${p.name}: no scopeClass declared`);continue}let k={publisher:f.publisher,package_:f.package_,name:f.name},b=As(p,T,A,"scopeSources"),w=Es(p);if(!w){console.warn(` [skip] ${p.name}: no transformation declared`);continue}let $=We(r,w);if(!$){console.warn(` [skip] ${p.name}: transformation ${qe(w)} not found`);continue}let v=await Os(b,o),K=[],j=new Set;for(let I of v){let O=await Ns(I,o,e,t),N=me(O,k);for(let E of N){let ie=`${E.namespace}/${E.name}`;j.has(ie)||(j.add(ie),K.push(E))}}console.log(` ${p.name}: ${K.length} instance(s) of ${k.publisher}/${k.package_}/${k.name} across ${v.length} scope(s)`);let ee=await y.run({transformation:$,instances:K,allKanonaks:r,repository:o,parser:e,objectParser:t,outputFormat:"html"});if(ee.length===0){console.warn(` [skip] ${p.name}: transformation produced no artifacts`);continue}let W=Ve(a,g);pe(Be(W),{recursive:!0}),Me(W,ee[0].content,"utf-8"),console.log(` wrote ${W} (AggregateView ${p.name})`)}console.log("Site build complete.")}function ze(n,e,t,o){for(let r of n.statement)if(r instanceof et&&de(r,e,t,o))return r.object}function As(n,e,t,o){for(let r of n.statement){if(!(r instanceof Cs)||!de(r,e,t,o))continue;let a=[];for(let s of r.object??[]){let i=s.value;typeof i=="string"&&a.push(i)}return a}return[]}function Xn(n,e,t,o){for(let r of n.statement)if(r instanceof Rs&&de(r,e,t,o)&&r.object instanceof _s)return{publisher:r.object.subject.publisher,package_:r.object.subject.package_,name:r.object.subject.name}}function Es(n){for(let e of n.statement)if(e instanceof Ks&&de(e,T,A,"transformation"))return js(e.object)}function js(n){let e,t,o,r;for(let a of n.statement){if(!(a instanceof et))continue;let s=a.predicate?.subject?.name;s==="publisher"?e=a.object:s==="package"?t=a.object:s==="version"?o=a.object:s==="name"&&(r=a.object)}if(!(!e||!t||!o||!r))return{publisher:e,package_:t,version:o,name:r}}function de(n,e,t,o){let r=n.predicate?.subject;return r?r.publisher===e&&r.package_===t&&r.name===o:!1}function We(n,e){let t=`${e.publisher}/${e.package_}@${e.version}`;for(let o of n)if(o instanceof Qn&&o.name===e.name&&o.namespace===t)return o}function qe(n){return`${n.publisher}/${n.package_}@${n.version}/${n.name}`}async function Os(n,e){let t=[];for(let o of n){let r=o.indexOf("@*");if(r===-1){t.push(o);continue}let a=o.substring(0,r),s=a.indexOf("/");if(s===-1){t.push(o);continue}let i=a.substring(0,s),c=a.substring(s+1),l=await e.getDocumentsByNamespaceAsync(i,c);for(let m of l){let u=m.metadata.namespace_;if(!u)continue;let d=u.version;t.push(`${u.publisher}/${u.package_}@${d.major}.${d.minor}.${d.patch}`)}}return t}async function Ns(n,e,t,o){let r=n.indexOf("/"),a=n.indexOf("@");if(r===-1||a===-1)return[];let s=n.substring(0,r),i=n.substring(r+1,a),c=n.substring(a+1),l=await e.getDocumentsByNamespaceAsync(s,i);for(let m of l){let u=m.metadata.namespace_?.version;if(u&&`${u.major}.${u.minor}.${u.patch}`===c){let d=new Ds(m,e);return o.parseKanonaks(d)}}return[]}import{Command as Ls}from"commander";import{KanonakParser as Us,PublisherIndex as tt,CredentialStore as ot,createAuthenticatedFetch as rt,FileSystemKanonakDocumentRepository as Fs,Reasoner as Hs,KanonakVocabulary as Ms,getGlobalCachePath as Vs,makeUriKey as Bs}from"@kanonak-protocol/sdk";function zs(n){let e=n.split("/");if(e.length!==3)return null;let[t,o,r]=e;return!t||!o||!r?null:{publisher:t,package_:o,name:r}}function st(){return new Ls("search").description("Browse a publisher's catalogue or find instances of a class via the SDK reasoner").argument("<publisher>","Publisher domain (e.g. kanonak.org)").option("--type <uri>","Class URI to search for, in publisher/package/Name form").action(async(n,e)=>{e.type?await qs(n,e.type):await Ws(n)})}async function Ws(n){let e=new ot,t=rt(e),o=new tt({fetchFn:t}),r;try{r=await o.listLatestPackages(n)}catch(s){console.error(`Failed to fetch publisher index for ${n}: ${s.message}`),process.exit(1)}if(r.length===0){console.log(`No packages found at ${n}.`);return}console.log(`Packages published by ${n}:
|
|
118
118
|
`);let a=r.reduce((s,i)=>Math.max(s,i.packageName.length),0);for(let{packageName:s,version:i}of r)console.log(` ${s.padEnd(a)} @${i}`)}async function qs(n,e){let t=zs(e);t||(console.error(`Invalid --type value: ${e}`),console.error("Expected: publisher/package/Name (e.g. kanonak.org/capabilities/Capability)"),process.exit(1));let o=new Us,r=new ot,a=rt(r),s=new tt({fetchFn:a}),i=new D,c=new Set,l=[];try{l=await s.listLatestPackages(n)}catch(g){console.error(`Failed to fetch publisher index for ${n}: ${g.message}`),process.exit(1)}for(let{packageName:g,version:f}of l)c.add(`${n}|${g}|${f}`);await Ge(s,i,a,"kanonak.org","core-rdf",c),await Ge(s,i,a,"kanonak.org","core-owl",c),await Ge(s,i,a,t.publisher,t.package_,c);for(let g of c){let[f,k,b]=g.split("|");if(!i.has(f,k,b))try{let w=await s.getPackageUrl(f,k,b),$=await a(w,f);if(!$.ok){console.error(`Warning: failed to fetch ${f}/${k}@${b}: ${$.status} ${$.statusText}`);continue}let v=await $.text();i.put(f,k,b,v)}catch(w){console.error(`Warning: failed to fetch ${f}/${k}@${b}: ${w.message}`)}}let m=new Fs(Vs(),!0,o),d=await new Hs({vocabulary:new Ms}).reason(m),h=Bs(t.publisher,t.package_,t.name),p=d.getInstancesOfClass(h).filter(g=>g!==h);if(p.length===0){console.log(`No instances of ${h} found in ${n}'s catalogue.`);return}console.log(`Instances of ${h} in ${n}'s catalogue:
|
|
119
119
|
`),p.sort();for(let g of p)console.log(` ${g}`)}async function Ge(n,e,t,o,r,a){try{let s=await n.getHighestVersion(o,r);if(!s)return;a.add(`${o}|${r}|${s}`)}catch{}}import{existsSync as Gs,readFileSync as Js}from"fs";import{dirname as Ys,resolve as Xs}from"path";import{KanonakObjectParser as Zs,KanonakParser as Qs,canonicalForm as ea,canonicalHash as na,parseKanonakAddress as ta,pickHighestDocument as oa}from"@kanonak-protocol/sdk";import{SingleDocumentRepository as ra}from"@kanonak-protocol/sdk/uri-helpers";async function at(n,e={}){let t=new Qs,o=new Zs,{document:r,source:a}=await sa(n,t),s=await S(aa(a),t),i=new ra(r,s),c=await o.parseKanonaks(i),l=na(c);if(console.log(l),e.verbose){let m=ea(c);process.stderr.write(`# canonical form for ${a}
|
|
120
120
|
`),process.stderr.write(m),process.stderr.write(`
|
|
121
|
-
`)}}async function sa(n,e){if(n.endsWith(".kan.yml")){let i=Xs(n);if(!Gs(i))throw new Error(`kanonak hash: file not found: ${i}`);let c=Js(i,"utf-8");return{document:e.parse(c),source:i}}let t=ta(n);if(t.kind!=="package")throw new Error(`kanonak hash: expected a package address (publisher/package[@version]) or a path ending in .kan.yml; got ${t.kind} address "${n}"`);let r=await(await S(process.cwd(),e)).getDocumentsByNamespaceAsync(t.publisher,t.package_);if(r.length===0)throw new Error(`kanonak hash: could not find ${n} in local workspace, global cache, or publisher HTTP`);let a=t.version?`${t.version.major}.${t.version.minor}.${t.version.patch}`:void 0,s=oa(r,a?{requestedVersion:a}:{});if(!s.chosen){let i=a?`@${a}`:"";throw new Error(`kanonak hash: no version of ${t.publisher}/${t.package_}${i} available across local/cache/HTTP`)}return{document:s.chosen,source:n}}function aa(n){return n.endsWith(".kan.yml")?H(Ys(n)):process.cwd()}import{Command as it}from"commander";function Z(n){return`${P}/${R}/${n}`}var Je={[Z("fetch-and-deploy")]:(n,e,t,o)=>n.add(e,t[0],o),[Z("remove-deployed")]:(n,e,t,o)=>n.remove(e,t[0],o),[Z("list-deployed")]:(n,e,t,o)=>n.list(e,o),[Z("update-deployed")]:(n,e,t,o)=>n.update(e,t[0],o),[Z("search-available")]:(n,e,t,o)=>n.search(e,o),[Z("show-info")]:(n,e,t,o)=>n.info(e,t[0],o)};function ct(n,e,t){for(let o of e){let r=new it(o.commandName).description(o.description.trim());for(let a of o.commands){let s=r.command(ia(a));s.description(a.description);for(let i of a.arguments)if(i.isOption){let c=i.defaultValue!=null?`--${i.argumentName} [value]`:`--${i.argumentName} <value>`;s.option(c,"",i.defaultValue)}s.action(async(...i)=>{let c=ca(i);await la(t,o,a,i,c)})}n.addCommand(r)}}function ia(n){let e=n.arguments.filter(t=>!t.isOption).map(t=>t.required?`<${t.argumentName}>`:`[${t.argumentName}]`);return[n.subcommandName,...e].join(" ")}function ca(n){for(let e=n.length-1;e>=0;e--)if(n[e]&&typeof n[e]=="object"&&!(n[e]instanceof it))return n[e];return{}}async function la(n,e,t,o,r){let a=[];for(let i of o)if(typeof i=="string")a.push(i);else break;t.actionKey||(console.error(`Capability subcommand '${t.subcommandName}' has no resolved \`performs:\` Action. Every CapabilityCommand must declare a performs value pointing at a named Action instance from the capabilities ontology. Known actions: ${Object.keys(Je).join(", ")}.`),process.exit(1));let s=Je[t.actionKey];s||(console.error(`Capability subcommand '${t.subcommandName}' references unknown Action '${t.actionKey}'. Known actions: ${Object.keys(Je).join(", ")}.`),process.exit(1)),await s(n,e,a,r)}import{existsSync as lt,readFileSync as ua,statSync as ut}from"fs";import{resolve as pa}from"path";import{KanonakObjectParser as ma,PublisherIndex as Ye,PublisherConfigResolver as da,formatVersion as pt,pickHighestDocument as fa}from"@kanonak-protocol/sdk";import{SingleDocumentRepository as mt}from"@kanonak-protocol/sdk/uri-helpers";import{uriKey as Q,findSubjectsByType as dt}from"@kanonak-protocol/sdk/uri-helpers";var fe=class{constructor(e,t,o,r,a,s){this.fileCache=e;this.parser=t;this.publisherIndex=o;this.fetchFn=r;this.handlerRegistry=a;this.repository=s}fileCache;parser;publisherIndex;fetchFn;handlerRegistry;repository;objectParser=new ma;async add(e,t,o){let r=this.tryLoadFromLocalFile(t);if(r){this.fileCache.put(r.publisher,r.packageName,r.version,r.content),await this.deployFromDoc(e,r.doc,r.publisher,r.packageName,r.version,void 0,`local file ${t}`,o);return}let a=
|
|
121
|
+
`)}}async function sa(n,e){if(n.endsWith(".kan.yml")){let i=Xs(n);if(!Gs(i))throw new Error(`kanonak hash: file not found: ${i}`);let c=Js(i,"utf-8");return{document:e.parse(c),source:i}}let t=ta(n);if(t.kind!=="package")throw new Error(`kanonak hash: expected a package address (publisher/package[@version]) or a path ending in .kan.yml; got ${t.kind} address "${n}"`);let r=await(await S(process.cwd(),e)).getDocumentsByNamespaceAsync(t.publisher,t.package_);if(r.length===0)throw new Error(`kanonak hash: could not find ${n} in local workspace, global cache, or publisher HTTP`);let a=t.version?`${t.version.major}.${t.version.minor}.${t.version.patch}`:void 0,s=oa(r,a?{requestedVersion:a}:{});if(!s.chosen){let i=a?`@${a}`:"";throw new Error(`kanonak hash: no version of ${t.publisher}/${t.package_}${i} available across local/cache/HTTP`)}return{document:s.chosen,source:n}}function aa(n){return n.endsWith(".kan.yml")?H(Ys(n)):process.cwd()}import{Command as it}from"commander";function Z(n){return`${P}/${R}/${n}`}var Je={[Z("fetch-and-deploy")]:(n,e,t,o)=>n.add(e,t[0],o),[Z("remove-deployed")]:(n,e,t,o)=>n.remove(e,t[0],o),[Z("list-deployed")]:(n,e,t,o)=>n.list(e,o),[Z("update-deployed")]:(n,e,t,o)=>n.update(e,t[0],o),[Z("search-available")]:(n,e,t,o)=>n.search(e,o),[Z("show-info")]:(n,e,t,o)=>n.info(e,t[0],o)};function ct(n,e,t){for(let o of e){let r=new it(o.commandName).description(o.description.trim());for(let a of o.commands){let s=r.command(ia(a));s.description(a.description);for(let i of a.arguments)if(i.isOption){let c=i.defaultValue!=null?`--${i.argumentName} [value]`:`--${i.argumentName} <value>`;s.option(c,"",i.defaultValue)}s.action(async(...i)=>{let c=ca(i);await la(t,o,a,i,c)})}n.addCommand(r)}}function ia(n){let e=n.arguments.filter(t=>!t.isOption).map(t=>t.required?`<${t.argumentName}>`:`[${t.argumentName}]`);return[n.subcommandName,...e].join(" ")}function ca(n){for(let e=n.length-1;e>=0;e--)if(n[e]&&typeof n[e]=="object"&&!(n[e]instanceof it))return n[e];return{}}async function la(n,e,t,o,r){let a=[];for(let i of o)if(typeof i=="string")a.push(i);else break;t.actionKey||(console.error(`Capability subcommand '${t.subcommandName}' has no resolved \`performs:\` Action. Every CapabilityCommand must declare a performs value pointing at a named Action instance from the capabilities ontology. Known actions: ${Object.keys(Je).join(", ")}.`),process.exit(1));let s=Je[t.actionKey];s||(console.error(`Capability subcommand '${t.subcommandName}' references unknown Action '${t.actionKey}'. Known actions: ${Object.keys(Je).join(", ")}.`),process.exit(1)),await s(n,e,a,r)}import{existsSync as lt,readFileSync as ua,statSync as ut}from"fs";import{resolve as pa}from"path";import{KanonakObjectParser as ma,PublisherIndex as Ye,PublisherConfigResolver as da,formatVersion as pt,pickHighestDocument as fa}from"@kanonak-protocol/sdk";import{SingleDocumentRepository as mt}from"@kanonak-protocol/sdk/uri-helpers";import{uriKey as Q,findSubjectsByType as dt}from"@kanonak-protocol/sdk/uri-helpers";var fe=class{constructor(e,t,o,r,a,s){this.fileCache=e;this.parser=t;this.publisherIndex=o;this.fetchFn=r;this.handlerRegistry=a;this.repository=s}fileCache;parser;publisherIndex;fetchFn;handlerRegistry;repository;objectParser=new ma;async add(e,t,o){let r=this.tryLoadFromLocalFile(t);if(r){this.fileCache.put(r.publisher,r.packageName,r.version,r.content),await this.deployFromDoc(e,r.doc,r.publisher,r.packageName,r.version,void 0,`local file ${t}`,o);return}let a=x(t);a||(console.error(`Invalid package reference: "${t}"`),console.error(""),console.error("Accepted forms:"),console.error(" publisher/package (install all instances, latest version)"),console.error(" publisher/package@version (install all instances, pinned)"),console.error(" publisher/package/instance (install one instance, latest version)"),console.error(" publisher/package@version/instance (install one instance, pinned)"),console.error(" ./path/to/file.kan.yml (install all instances from a local document)"),console.error(""),console.error("Tip: copy a URI directly from `kanonak "+e.commandName+" search`."),process.exit(1));let{publisher:s,packageName:i,version:c,instanceName:l}=a,m=await this.repository.getDocumentsByNamespaceAsync(s,i);if(m.length>0){let h=fa(m,{requestedVersion:c??void 0});if(h.chosen){let y=h.chosen.metadata.namespace_;(!y||!y.version)&&(console.error(`Document for ${s}/${i} is missing namespace metadata.`),process.exit(1));let p=pt(y.version);this.fileCache.put(s,i,p,this.parser.save(h.chosen)),await this.deployFromDoc(e,h.chosen,s,i,p,l??void 0,`${s}/${i}@${p}`,o);return}}let u=c??await this.publisherIndex.getHighestVersion(s,i);u||(console.error(`Could not resolve version for "${s}/${i}".`),await this.printPackageSuggestions(s,i,e.commandName),process.exit(1));let d=this.fileCache.get(s,i,u);if(!d){let h=await this.publisherIndex.getPackageUrl(s,i,u),y=await this.fetchFn(h,s);y.ok||(y.status===404?(console.error(`Package ${s}/${i}@${u} not found at ${h}.`),console.error(`The publisher index lists this version but the file is missing \u2014 it may have been unpublished. Try \`kanonak ${e.commandName} search\` to see the current catalogue.`)):console.error(`Failed to fetch ${h} (${y.status} ${y.statusText}).`),process.exit(1)),d=await y.text(),this.fileCache.put(s,i,u,d)}await this.deployFromDoc(e,this.parser.parse(d),s,i,u,l??void 0,`${s}/${i}@${u}`,o)}tryLoadFromLocalFile(e){if(!(/^[.\/\\]/.test(e)||/^[A-Za-z]:[\\/]/.test(e)||e.endsWith(".kan.yml")||lt(e)&&ut(e).isFile()))return;let o=pa(e);(!lt(o)||!ut(o).isFile())&&(console.error(`Local file not found: ${e}`),process.exit(1));let r=ua(o,"utf-8"),a=this.parser.parse(r),s=a.metadata.namespace_;return(!s||!s.version)&&(console.error(`${e} has no namespace metadata; cannot determine publisher/package/version. A Kanonak document must declare \`type: Package\` with publisher and version.`),process.exit(1)),{doc:a,content:r,publisher:s.publisher,packageName:s.package_,version:pt(s.version)}}async deployFromDoc(e,t,o,r,a,s,i,c){let l=new mt(t,this.repository),m=await this.objectParser.parseKanonaks(l),u=ft(e.managesTypeKey);u||(console.error(`Capability "${e.commandName}" has no resolved managesType.`),process.exit(1));let d=dt(m,u);d.length===0&&(console.error(`${i} does not contain any ${Q(u)} instances.`),process.exit(1));let h=d;if(s&&(h=d.filter(g=>g.name===s),h.length===0)){console.error(`Instance "${s}" not found in ${i}.`),console.error(""),console.error(`Available ${Q(u)} instance(s):`);for(let g of d)console.error(` - ${g.name}`);console.error(""),console.error("To install all of them, drop the instance suffix:"),console.error(` kanonak ${e.commandName} add ${o}/${r}`),process.exit(1)}let y=s?`${s} from ${i}`:`${h.length} ${Q(u)} instance(s) from ${i}`;console.log(`Installing ${y}...`);let p=this.handlerRegistry.get(e.deploymentTargetKey);p?await p.deploy({instances:h,allKanonaks:m,repository:this.repository,options:c}):console.log(`Cached ${o}/${r}@${a} (no deployment handler for "${e.deploymentTargetKey}")`)}async printPackageSuggestions(e,t,o){let r;try{r=await this.publisherIndex.listLatestPackages(e)}catch{return}let a=r.map(s=>({name:s.packageName,version:s.version,score:ga(t,s.packageName)})).filter(s=>s.score>0).sort((s,i)=>i.score-s.score).slice(0,5);if(a.length!==0){console.error(""),console.error("Did you mean one of:");for(let s of a)console.error(` kanonak ${o} add ${e}/${s.name}`)}}async remove(e,t,o){await this.requireHandler(e).undeploy(t,{repository:this.repository,options:o})}async list(e,t){let r=await this.requireHandler(e).list({repository:this.repository,options:t}),a=e.managesTypeKey||"managed";if(r.length===0){console.log(`No ${a} instances installed.`);return}console.log(`Installed ${a} instances:
|
|
122
122
|
`);for(let s of r){let i=s.publisher?`${s.publisher}/${s.package_}@${s.version}`:"unmanaged";console.log(` ${s.name} (${i}) ${s.path}`)}}async update(e,t,o){let a=await this.requireHandler(e).list({repository:this.repository,options:o}),s=t?a.filter(c=>c.name===t):a.filter(c=>c.publisher);if(s.length===0){console.log(t?`"${t}" not found.`:"No managed instances to update.");return}let i=0;for(let c of s){let l=await this.publisherIndex.getHighestVersion(c.publisher,c.package_);!l||l===c.version||(console.log(`Updating ${c.name}: ${c.version} \u2192 ${l}`),await this.add(e,`${c.publisher}/${c.package_}@${l}`,o),i++)}console.log(i===0?"All instances are up to date.":`
|
|
123
123
|
Updated ${i} instance(s).`)}async search(e,t){let o=t.publisher??"kanonak.org",r=ft(e.managesTypeKey);if(!r){console.error("Capability has no resolved managesType; nothing to search for.");return}console.log(`Searching ${o} for ${Q(r)} instances...
|
|
124
124
|
`);let a=new da,s=await a.getConfig(o),i=a.resolveIndexUrl(o,s),c=await this.fetchFn(i,o);if(!c.ok){console.error(`Failed to fetch package index from ${o}.`);return}let l=await c.text(),m=Ye.parseIndex(l);if(m.size===0){console.error(`No packages found for publisher "${o}".`);return}let u=new Map;for(let[p,g]of m){let f=[...g].sort((k,b)=>{let w=Ye.parseVersion(k),$=Ye.parseVersion(b);return!w||!$?0:w.major!==$.major?$.major-w.major:w.minor!==$.minor?$.minor-w.minor:$.patch-w.patch});u.set(p,f[0])}let d=[],h=0;for(let[p,g]of u){let f=this.fileCache.get(o,p,g);if(!f)try{let k=await this.publisherIndex.getPackageUrl(o,p,g),b=await this.fetchFn(k,o);if(!b.ok)continue;f=await b.text(),this.fileCache.put(o,p,g,f)}catch{continue}try{let k=this.parser.parse(f),b=new mt(k,this.repository),w=await this.objectParser.parseKanonaks(b),$=dt(w,r);for(let v of $)d.push({publisher:o,package_:p,version:g,subject:v});h++}catch{continue}}if(d.length===0){console.log(`No ${Q(r)} instances found across ${h} package(s).`);return}console.log(`Found ${d.length} ${Q(r)} instance(s) in ${h} package(s):
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kanonak-protocol/cli",
|
|
3
|
-
"version": "3.28.
|
|
3
|
+
"version": "3.28.6",
|
|
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.28.
|
|
38
|
-
"@kanonak-protocol/types": "^3.28.
|
|
37
|
+
"@kanonak-protocol/sdk": "^3.28.6",
|
|
38
|
+
"@kanonak-protocol/types": "^3.28.6",
|
|
39
39
|
"commander": "^13.0.0",
|
|
40
40
|
"js-yaml": "^4.1.1"
|
|
41
41
|
},
|