spec-ultra 19.9.0 → 19.11.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.
- package/LICENSE +1 -1
- package/dist/cli.js +1 -1
- package/package.json +1 -1
package/LICENSE
CHANGED
|
@@ -2,7 +2,7 @@ Spec Ultra Commercial Licence
|
|
|
2
2
|
|
|
3
3
|
Licensor: Dyego Maas Tecnologia e Inovação Ltda.
|
|
4
4
|
|
|
5
|
-
Licensed Work: Spec-Ultra v19.
|
|
5
|
+
Licensed Work: Spec-Ultra v19.11.0
|
|
6
6
|
|
|
7
7
|
Copyright (C) 2026 Dyego Maas Tecnologia e Inovação Ltda., CNPJ 60.611.422/0001-25,
|
|
8
8
|
Blumenau, Santa Catarina, Brazil. All rights reserved.
|
package/dist/cli.js
CHANGED
|
@@ -100,7 +100,7 @@ end
|
|
|
100
100
|
`)}}}return await i(e,""),t.digest("hex")}async function Sv(e){let t;try{t=await yp(sg(e,Sp),"utf8")}catch(r){let s=r instanceof Error&&"code"in r?r.code:void 0;if(s==="ENOENT"||s==="ENOTDIR"||s==="EISDIR")return!1;throw r}let i=/^digest=([0-9a-f]{64})$/m.exec(t)?.[1];return i===void 0||i===await Rv(e)}async function QL(e){try{return(await CL(e)).mode&511}catch(t){if(og(t))return 384;throw t}}async function yL(e,t){try{return await EL(e,t,{recursive:!0,errorOnExist:!0,force:!1}),await Dv(sg(t,Sp),hL(await Rv(t))),t}catch(i){throw await al(t,{recursive:!0,force:!0}),i}}async function SL(e,t,i){let r=Nv(t,"previous");try{i&&await rg(t,r);try{await rg(e,t)}catch(s){throw i&&await rg(r,t),s}}catch(s){throw await al(e,{recursive:!0,force:!0}),s}i&&await al(r,{recursive:!0,force:!0})}function gs(){return{exists:yv,ownedBy:Sv,async listDirs(e){try{return(await vv(e,{withFileTypes:!0})).filter(i=>i.isDirectory()).map(i=>i.name).sort()}catch(t){if(og(t))return[];throw t}},async copyDir(e,t){let i=await yv(t);if(i&&!await Sv(t))throw new Error(`refusing to overwrite ${t}: not written by the installer, or changed since`);await Qv(Qp(t),{recursive:!0});let r=await yL(e,Nv(t,"staging"));await SL(r,t,i)},async remove(e){await al(e,{recursive:!0,force:!0})},async readJson(e){let t;try{t=await yp(e,"utf8")}catch(i){if(og(i))return null;throw i}try{return JSON.parse(t)}catch{throw new Error(`${e} is not valid JSON`)}},async writeJson(e,t){await Qv(Qp(e),{recursive:!0});let i=await QL(e),r=`${e}.${wv(6).toString("hex")}.tmp`;try{await Dv(r,`${JSON.stringify(t,null,2)}
|
|
101
101
|
`,{mode:i}),await rg(r,e)}catch(s){throw await al(r,{force:!0}),s}}}}var Sp,hL,mL,og,Nv,ag=T(()=>{"use strict";I();Sp=".spec-ultra-owned",hL=e=>`plugin=spec-ultra
|
|
102
102
|
digest=${e}
|
|
103
|
-
`,mL=new Set([".DS_Store","Thumbs.db","desktop.ini"]),og=e=>e instanceof Error&&"code"in e&&e.code==="ENOENT";Nv=(e,t)=>sg(Qp(e),`.${BL(e)}.spec-ultra-${t}-${wv(6).toString("hex")}`)});import{createHash as wL,randomBytes as vL}from"node:crypto";import{createServer as DL}from"node:http";function xL(e,t,i){let r=new URL(e.url??"/","http://127.0.0.1");if(r.pathname!==Tv)return t.writeHead(404,{connection:"close"}).end(),{done:!1};let s=(f,d)=>t.writeHead(f,{"content-type":"text/html; charset=utf-8",connection:"close"}).end(NL(d)),l=r.searchParams.get("error");if(l)return s(400,"Sign-in was refused. You can close this tab and return to the terminal."),{done:!0,error:new Error(`sign-in refused by the authorization server: ${l}`)};if(r.searchParams.get("state")!==i)return s(400,"This sign-in link does not match the one the installer opened. Return to the terminal."),{done:!0,error:new Error("sign-in aborted: state mismatch in the authorization callback")};let u=r.searchParams.get("code");return u?(s(200,"Signed in. You can close this tab and return to the terminal."),{done:!0,code:u}):(s(400,"The sign-in answer carried no code. Return to the terminal."),{done:!0,error:new Error("sign-in aborted: the authorization callback carried no code")})}function bv(e){let t=e.fetch??globalThis.fetch;async function i(){let s=kv(32),l=kv(24),u=wL("sha256").update(s).digest("base64url"),f=DL();await new Promise((O,R)=>{f.once("error",R),f.listen(0,"127.0.0.1",O)});let{address:d,port:E}=f.address(),m=`http://${d}:${E}${Tv}`,h,Q=Date.now()+(e.timeoutMs??RL),w=()=>e.onTick?.(Math.max(0,Math.ceil((Q-Date.now())/xv)));w();let b=e.onTick?setInterval(w,xv):void 0;try{let O=new Promise((J,X)=>{h=setTimeout(()=>X(new wp),Q-Date.now()),f.on("request",(P,ue)=>{let oe=xL(P,ue,l);oe.done&&("error"in oe?X(oe.error):J(oe.code))})}),R=new URL(e.authorizeUrl),k={response_type:"code",client_id:e.clientId,redirect_uri:m,code_challenge:u,code_challenge_method:"S256",state:l,...e.scope?{scope:e.scope}:{}};for(let[J,X]of Object.entries(k))R.searchParams.set(J,X);return await Promise.all([O,Promise.resolve(e.openBrowser(R.toString()))]),{code:await O,redirectUri:m,verifier:s}}finally{clearTimeout(h),clearInterval(b),e.onTick?.(0),f.closeIdleConnections(),await new Promise(O=>f.close(()=>O()))}}async function r(s,l,u){let f=await t(e.tokenUrl,{method:"POST",headers:{"content-type":"application/x-www-form-urlencoded",accept:"application/json"},body:new URLSearchParams({grant_type:"authorization_code",code:s,redirect_uri:l,client_id:e.clientId,code_verifier:u}).toString()});if(!f.ok)throw new Error(`sign-in failed: the token endpoint answered HTTP ${f.status}`);let d=await f.json().catch(()=>null),E=typeof d=="object"&&d!==null&&"access_token"in d?d.access_token:void 0;if(typeof E!="string"||E==="")throw new Error("sign-in failed: the token endpoint answered no access token");return E}return{async accessToken(){let{code:s,redirectUri:l,verifier:u}=await i();return r(s,l,u)}}}var Tv,RL,xv,wp,NL,kv,Mv=T(()=>{"use strict";I();Tv="/callback",RL=5*6e4,xv=1e3,wp=class extends Error{constructor(){super("Sign-in timed out: the browser did not answer within 5 minutes. Run spec-ultra login to try again."),this.name="SignInTimedOut"}},NL=e=>`<!doctype html><meta charset="utf-8"><title>Spec Ultra</title><p style="font-family:sans-serif">${e}</p>`,kv=e=>vL(e).toString("base64url")});async function bL(e,t=globalThis.fetch){let i=await t(`${TL(e)}/.well-known/oauth-authorization-server`,{headers:{accept:"application/json"}});if(!i.ok)throw new Error(`sign-in unavailable: the authorization server answered HTTP ${i.status} to discovery`);let r=await i.json().catch(()=>null),{authorization_endpoint:s,token_endpoint:l}=kL(r)?r:{};if(typeof s!="string"||typeof l!="string")throw new Error("sign-in unavailable: the authorization server metadata lacks its endpoints");return{authorizeUrl:s,tokenUrl:l}}function Ov({frontendApi:e,fetch:t,signInWith:i}){return{async accessToken(){return i(await bL(e,t)).accessToken()}}}var kL,TL,_v=T(()=>{"use strict";I();kL=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),TL=e=>new URL(/^https?:\/\//.test(e)?e:`https://${e}`).origin});async function Gv(e){return e.json().catch(()=>null)}function lg({baseUrl:e,fetch:t=globalThis.fetch,rereadLicence:i}){let r=f=>new URL(f,e.endsWith("/")?e:`${e}/`).toString();async function s(f,d,E={}){try{return await t(r(f),{method:"POST",headers:{"content-type":"application/json",accept:"application/json",...E},body:JSON.stringify(d)})}catch{return null}}async function l(f,d){let E=await s("api/license/certificate",d===void 0?{}:{licenceId:d},{authorization:`Bearer ${f}`});if(E===null||E.status===503)return{kind:"offline"};if(E.status===401)return{kind:"unauthorized"};let m=await Gv(E);if(E.status===200){if(!ll(m)||!Mr(m.token)||!Mr(m.refresh))throw new Error("the site answered a certificate without a token and a renewal secret");return{kind:"issued",licence:{token:m.token,refresh:m.refresh}}}if(E.status===403&&vp(m)==="no-seat")return{kind:"no-seat"};if(E.status===409&&vp(m)==="ambiguous"&&ll(m)){let h=m.licences;if(Array.isArray(h)&&h.length>0&&h.every(ML))return{kind:"ambiguous",licences:h};throw new Error("the site answered an ambiguous certificate request without its licences")}throw new Error(`the site answered HTTP ${E.status} to the certificate request`)}async function u(f,d=!1){if(f.refresh===void 0)return{kind:"refused",reason:"login-required"};let E=await s("api/install/bundle",{token:f.token,refresh:f.refresh});if(E===null||E.status===503)return{kind:"offline"};if(E.status===410)return{kind:"refused",reason:"ended"};if(E.status===400)return{kind:"refused",reason:"bad-request"};let m=await Gv(E),h=vp(m);if(E.status===200){if(!ll(m)||!Mr(m.version)||!Mr(m.sha256)||!Mr(m.url)||!Mr(m.expiresAt))throw new Error("the site answered a bundle grant without its version, checksum, address or expiry");return{kind:"ready",version:m.version,sha256:m.sha256,url:m.url,expiresAt:m.expiresAt}}if(E.status===409&&h==="rotated"){let Q=d||i===void 0?null:await i();return Q===null?{kind:"refused",reason:"login-required"}:u(Q,!0)}if(E.status===401&&_L(h))return{kind:"refused",reason:h};if(E.status===403&&h==="seat-reassigned")return{kind:"refused",reason:"seat-reassigned"};throw new Error(`the site answered HTTP ${E.status} to the bundle request`)}return{certificate:l,bundle:f=>u(f)}}var ll,Mr,ML,OL,_L,vp,Dp=T(()=>{"use strict";I();ll=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),Mr=e=>typeof e=="string"&&e!=="",ML=e=>ll(e)&&Mr(e.id)&&(e.modality==="individual"||e.modality==="business")&&typeof e.organization=="string",OL=["chain-revoked","chain-closed","login-required"],_L=e=>OL.some(t=>t===e);vp=e=>ll(e)?e.reason:void 0});import{homedir as GL}from"node:os";function ul(e,t,i){let r=e[t]||UL[t]||i;if(!r)throw new Error(`${t} is not set: point it at the value for your Spec Ultra environment and run again`);return r}function Yi({view:e,env:t}){let i=d=>e.show({kind:"lines",lines:[d]}),r=process.platform,s={platform:r,home:GL(),env:t},l=process.cwd(),u=gs(),f=eg({files:u,claude:Hc({cwd:l}),machine:s});return{out:i,platform:r,machine:s,cwd:l,files:u,claudeCode:f}}function fs(e,t,i){let r=async()=>{let s=await t.readJson($n(i));return s===null?null:Zn(s)};return lg({baseUrl:ul(e,"SPEC_ULTRA_SITE_URL",LL),rereadLicence:r})}function ug({view:e,env:t},i){let r=ul(t,"SPEC_ULTRA_OAUTH_CLIENT_ID"),s=ul(t,"SPEC_ULTRA_CLERK_FRONTEND_API");return Ov({frontendApi:s,signInWith:l=>bv({...l,clientId:r,scope:HL,openBrowser:async u=>e.show({kind:"lines",lines:Bv(u,await Cv(u,i,t)),urgent:!0}),onTick:u=>e.show({kind:"countdown",secondsLeft:u})})})}var UL,LL,HL,ds=T(()=>{"use strict";I();hv();PI();ag();Mv();_n();_v();Dp();tg();Ki();UL=typeof D>"u"?{}:D,LL="https://specultra.dev",HL="profile email"});var Lv={};Ri(Lv,{parseInstallFlags:()=>Uv,run:()=>FL});function Uv(e){let t={},i;for(let r=0;r<e.length;r++){let s=e[r]??"",[l="",u]=s.startsWith("--")&&s.includes("=")?[s.slice(0,s.indexOf("=")),s.slice(s.indexOf("=")+1)]:[s,void 0],f=()=>{let d=u??e[++r];if(d===void 0||d===""||d.startsWith("-"))throw new Lt(`${l} needs a value`);return d};switch(l){case"--agents":t.agents=[...t.agents??[],...f().split(",").map(d=>d.trim()).filter(Boolean)];break;case"--project":t.project=!0;break;case"--yes":case"-y":t.yes=!0;break;case"--no-modify-path":t.modifyPath=!1;break;case"--license":i=f();break;default:throw new Lt(`unknown option '${s}' for install: it takes --agents, --project, --yes, --no-modify-path and --license`)}}return{answers:t,...i===void 0?{}:{licence:i}}}var FL,Hv=T(()=>{"use strict";I();jI();PI();Fc();qI();qc();Vc();tg();pv();xi();ig();ds();FL=async e=>{let{answers:t,licence:i}=Uv(e.args),{files:r,machine:s,platform:l,cwd:u,out:f}=Yi(e),d=fs(e.env,r,s),E={accessToken:()=>ug(e,l).accessToken()},m=is({platform:l,env:e.env}),h=l==="win32"?ls({machine:s,powershell:as()}):os({machine:s,executables:m});return{command:"install",outcome:await Iv({signIn:E,site:d,prompter:Ag(e.view),...i===void 0?{}:{licence:i},unattended:t.yes===!0,files:r,machine:s,out:f,view:e.view,bundles:Lc(),executables:m,claudeCode:eg({files:r,claude:Ev(e.view,Hc({cwd:u})),machine:s}),resident:h,agents:Xa,cwd:u,version:e.version,answers:t})}}});var Kv={};Ri(Kv,{licenceFlag:()=>Jv,run:()=>JL});function Jv(e){let t=e.find(r=>r.startsWith("--license="));if(t!==void 0)return Fv(t.slice(10));let i=e.indexOf("--license");return i===-1?void 0:Fv(e[i+1])}function Fv(e){if(!e||e.startsWith("-"))throw new Lt("--license needs the id of one of your licences: spec-ultra login --license <id>");return e}var JL,Yv=T(()=>{"use strict";I();hp();xi();ig();ds();JL=async e=>{let t=Jv(e.args),i=e.args.some(m=>m==="--yes"||m==="-y"),{files:r,machine:s,platform:l,out:u}=Yi(e),f=fs(e.env,r,s),E={signIn:ug(e,l),site:f,prompter:Ag(e.view),files:r,machine:s,out:u,unattended:i};return{command:"login",outcome:await sl(t===void 0?E:{...E,licence:t})}}});async function qv(e){let{files:t,machine:i,view:r}=e,s=b=>r.show({kind:"lines",lines:[b]}),l=await mA(t,i);if(l===null)return s(Pv),{kind:"nothing-recorded"};if(e.continued)return jv(e,e.continued.bundleDir,e.continued.version,!1);let u=b=>{for(let O of Ni(b))s(O);return{kind:"stopped",reason:b}},f=await t.readJson($n(i));if(f===null)return u("login-required");let d=await e.site.bundle(Zn(f));if(d.kind==="offline")return u("offline");if(d.kind==="refused")return u(d.reason);let E=d.version,m=OA(l).find(zv),h=m!==void 0&&oi(m.version,E),Q=BA(l).some(b=>oi(b.version,E));if(!h&&!Q){let b=await cg(e,BA(l),[]);return s(`Spec Ultra ${l.version} is already the latest version.`),{kind:"current",version:l.version,changed:b}}let w=await Gn(r,"download",`Download Spec Ultra ${E}`,()=>e.bundles.fetch(d.url,d.sha256));if(!h)return jv(e,w,E,!0);try{try{await Gn(r,"command","spec-ultra command",async()=>{let R=await e.resident.placeProgram(br(i).join(w,"cli","cli.js"),E),k=[...OA(l).filter(J=>!zv(J)&&J.kind!=="resident-file"),...R];await t.writeJson(Ji(i),Tr(BA(l),l.version,k))},()=>`${m.version} \u2192 ${E}`)}catch{return{kind:"swap-failed",version:E,failed:[m.path]}}if(!Q)return s(`Spec Ultra updated to ${E}`),{kind:"updated",version:E,changed:[],failed:[],skipped:[]};let b=r.mode==="json"?["--json"]:[],O=await e.resident.handOver(["update",fr,w,...b]);return{kind:"handed-over",version:E,exitCode:O}}finally{await t.remove(w)}}async function cg({files:e,view:t},i,r){let s=[...i.flatMap(l=>l.kind==="plugin"?[l.marketplace]:[]),...rl(i).flatMap(l=>l.paths)];for(let l of s)!await e.exists(l)||await e.ownedBy(l)||(r.push(l),t.show({kind:"lines",lines:[eA(l)]}));return r}async function jv(e,t,i,r){let{files:s,machine:l,view:u}=e,f=d=>u.show({kind:"lines",lines:[d]});try{let d=await mA(s,l);if(d===null)return f(Pv),{kind:"nothing-recorded"};let E=Y=>oi(Y,i),m=BA(d),h=OA(d),Q=[];if(!m.some(Y=>E(Y.version)))return await cg(e,m,Q),f(`Spec Ultra ${d.version} is already the latest version.`),{kind:"current",version:d.version,changed:Q};let{join:w,basename:b}=br(l),O=[],R=[],k=0,J=m,X=()=>s.writeJson(Ji(l),Tr(J,i,h)),P=Y=>`${Y} \u2192 ${i}`;async function ue(Y,ie,fe=Y.version){J=[...J.filter(ce=>!Cp(Y,ce)),...ol(Y,ie,fe)],await X()}async function oe(Y){let ie=w(t,"skills"),fe=await s.listDirs(ie),ce=[...Y.paths],At=me=>ce.splice(ce.indexOf(me),1),Ke=0;try{for(let me of Y.paths)await s.exists(me)?await s.ownedBy(me)?fe.includes(b(me))?(await s.copyDir(w(ie,b(me)),me),Ke++):(await s.remove(me),At(me),await ue(Y,ce)):(Q.push(me),f(eA(me))):At(me);for(let me of fe){let Ye=w(Y.root,me);Y.paths.includes(Ye)||await s.exists(Ye)&&!await s.ownedBy(Ye)||(ce.push(Ye),await ue(Y,ce),await s.copyDir(w(ie,me),Ye),Ke++)}}catch(me){let Ye=[];for(let It of ce)await s.exists(It)&&Ye.push(It);throw await ue(Y,Ye),me}return await ue(Y,ce,i),Ke}async function pe(Y){let ie=`plugin:${Y.marketplace}`,fe=`Claude Code plugin (${Y.scope} scope)`;u.show({kind:"step-start",id:ie,label:fe});try{let ce=await e.claudeCode.install({bundleDir:t,scope:Y.scope,...Y.project===void 0?{}:{project:Y.project},previous:Y});return ce.kind==="installed"?(k++,u.show({kind:"step-done",id:ie,label:fe,detail:P(Y.version)}),{...ce.entry,version:i}):ce.reason==="claude-missing"?(R.push(Y.marketplace),u.show({kind:"step-failed",id:ie,label:fe,reason:`skipped \u2014 ${ce.hint}`}),Y):(Q.push(Y.marketplace),u.show({kind:"step-done",id:ie,label:fe,detail:"left in place, changed since the install"}),f(eA(ce.reason==="foreign-directory"?ce.path:`${ce.path} (${ce.keys.join(", ")})`)),{...Y,version:i})}catch(ce){return O.push(Y.marketplace),u.show({kind:"step-failed",id:ie,label:fe,reason:cs(ce)}),Y}}for(let Y of m){if(Y.kind!=="plugin")continue;if(!E(Y.version)){await cg(e,[Y],Q);continue}let ie=await pe(Y);J=J.map(fe=>fe===Y?ie:fe),await X()}for(let Y of rl(m)){if(!E(Y.version)){await cg(e,m.filter(ie=>Cp(Y,ie)),Q);continue}try{await Gn(u,`skills:${Y.root}`,`Skills in ${Y.root}`,()=>oe(Y),ie=>`${P(Y.version)} \xB7 ${ie} skills`),k++}catch{O.push(Y.root)}}await X();let _e=O.length===0&&R.length===0;return f(_e?`Spec Ultra updated to ${i}`:`Spec Ultra ${i} reached only part of the install; run spec-ultra update again.`),k>0&&f(`Restart your coding agents so they load Spec Ultra ${i}.`),{kind:"updated",version:i,changed:Q,failed:O,skipped:R}}finally{r&&await s.remove(t)}}var Pv,zv,Vv=T(()=>{"use strict";I();_n();ru();Ki();gr();mp();ru();Pv="Nothing recorded to update. Run npx spec-ultra to install Spec Ultra first.",zv=e=>e.kind==="resident-program"});var Wv={};Ri(Wv,{run:()=>zL});function KL(e,t){let i=e.platform==="win32"?ls({machine:e,powershell:as()}):os({machine:e,executables:is({platform:e.platform,env:e.env})});return{...i,async handOver(r){return t.mode==="terminal"&&await t.close(),i.handOver(r)}}}function YL(e){let t=e.indexOf(fr);return t===-1?void 0:e[t+1]}var zL,Xv=T(()=>{"use strict";I();jI();Fc();qc();Vc();Vv();ds();zL=async e=>{let{files:t,claudeCode:i,machine:r}=Yi(e),s=fs(e.env,t,r),l=YL(e.args),u=await qv({site:s,bundles:Lc(),files:t,claudeCode:i,machine:r,view:e.view,resident:KL(r,e.view),...l===void 0?{}:{continued:{bundleDir:l,version:e.version}}});return u.kind==="handed-over"&&process.exit(u.exitCode),{command:"update",outcome:u}}});function jL(e){if(e.kind!=="resident-path")return[eA(e.path)];let{edit:t}=e;return t.kind==="rc-line"?[` left in place, edited since the install: ${t.file}`,` remove this line by hand: ${t.line}`]:[eA(t.kind==="fish-conf"?t.file:t.entry)]}async function Zv({files:e,claudeCode:t,resident:i,machine:r,out:s}){let l=await mA(e,r);if(l===null)return s("Nothing recorded to uninstall."),{kind:"nothing-recorded"};let u=[],f=[],d=[],E=BA(l),m=k=>k instanceof Error?k.message:String(k);async function h(k){let J=[],X=0;for(let P of k.paths)if(await e.exists(P)){if(await e.ownedBy(P)){await e.remove(P),X++;continue}u.push(P),s(eA(P)),J.push(P)}return s(`${k.root}: ${X} skills removed`),J}async function Q(k){if(await e.exists(k.marketplace)){if(await e.ownedBy(k.marketplace)){await e.remove(k.marketplace);return}u.push(k.marketplace),s(eA(k.marketplace)),d.push(k)}}for(let k of E)if(k.kind==="plugin")try{if(k.registered===!1){await Q(k);continue}let J=await t.uninstall(k),X=J.kind==="registration-left";s(X?`Claude Code: the plugin registration is still in place. ${J.hint}`:`Claude Code: plugin removed (${k.scope} scope)`);let P=await e.exists(k.marketplace);P&&(u.push(k.marketplace),s(eA(k.marketplace))),X?d.push(k):P&&d.push({...k,registered:!1})}catch(J){f.push(k.marketplace),s(`Claude Code: failed \u2014 ${m(J)}`),d.push(k)}for(let k of rl(E))try{d.push(...ol(k,await h(k)))}catch(J){f.push(k.root),s(`${k.root}: failed \u2014 ${m(J)}`);let X=[];for(let P of k.paths)await e.exists(P)&&X.push(P);d.push(...ol(k,X))}let w=OA(l),b=[],O=[];if(w.length>0)try{b=await i.remove(w);for(let k of b){u.push(PL(k));for(let J of jL(k))s(J)}b.length===0&&s("spec-ultra command removed"),O=b.filter(k=>!(k.kind==="resident-path"&&k.edit.kind==="rc-line"))}catch(k){f.push(yn(r)),s(`spec-ultra command: failed \u2014 ${m(k)}`),b=O=w}let R=Ji(r);return d.length===0&&O.length===0?await e.remove(R):await e.writeJson(R,Tr(d,l.version,O)),s(d.length===0&&b.length===0?"Spec Ultra uninstalled. Your licence certificate stays in the licence home.":"Spec Ultra uninstalled, except what is listed above. Your licence certificate stays in the licence home."),{kind:"uninstalled",changed:u,failed:f}}var PL,$v=T(()=>{"use strict";I();kr();_n();Ki();PL=e=>e.kind!=="resident-path"?e.path:e.edit.kind==="windows-user-path"?e.edit.entry:e.edit.file});var eD={};Ri(eD,{run:()=>qL});var qL,tD=T(()=>{"use strict";I();Fc();qc();Vc();$v();ds();qL=async e=>{let{files:t,claudeCode:i,machine:r,platform:s,out:l}=Yi(e),u=s==="win32"?ls({machine:r,powershell:as()}):os({machine:r,executables:is({platform:s,env:e.env})});return{command:"uninstall",outcome:await Zv({files:t,claudeCode:i,resident:u,machine:r,out:l})}}});async function nD(e){let t=await WL(e),i;if(t.kind==="signed-in"){let{licence:u,installs:f}=t;e.view.show({kind:"lines",lines:[...AH(u),...iH(f)]});let d=await t.latest;e.view.show({kind:"lines",lines:[rH(d)]}),i={kind:"shown",licence:u,installs:f,latest:d}}else i=t,e.view.show({kind:"lines",lines:nH(t)});let r=i.kind==="shown"?xe.ok:xe.licence,{kind:s,...l}=i;return e.view.show({kind:"report",data:{command:"status",exitCode:r,outcome:s,...l}}),{outcome:i,exitCode:r}}async function WL({files:e,machine:t,site:i,now:r,ownVersion:s,timeoutMs:l=Rp}){let u=await XL(e,t),f=u&&us(u.token);if(!u||!f)return{kind:"not-signed-in"};let d=f.expiresAt.toISOString(),E=fv(f.expiresAt,r());if(E===0)return{kind:"expired",expiresAt:d};let m=ZL(i.bundle(u),l),h=await mA(e,t);return{kind:"signed-in",licence:{serial:f.serial,email:f.email,expiresAt:d,daysLeft:E,renewal:"daily"},installs:h?tH(h):[],latest:m.then(Q=>$L(Q,h?.version??s))}}async function XL(e,t){let i=await e.readJson($n(t));if(i===null)return null;try{return Zn(i)}catch{return null}}async function ZL(e,t){let i,r=new Promise(s=>{i=setTimeout(()=>s({kind:"offline"}),t)});try{return await Promise.race([e.catch(()=>({kind:"offline"})),r])}finally{clearTimeout(i)}}function $L(e,t){return e.kind==="offline"?{kind:"unchecked",why:"specultra.dev did not answer"}:e.kind==="refused"?{kind:"unchecked",why:`the site refused this licence (${e.reason}); run spec-ultra login`}:oi(t,e.version)?{kind:"newer",version:e.version,command:VL}:{kind:"current",version:t}}function tH(e){let t=BA(e).map(r=>({agent:eH(r.agent),kind:r.kind,version:r.version,path:r.kind==="plugin"?r.marketplace:r.root,scope:r.scope})),i=OA(e).flatMap(r=>r.kind==="resident-program"?[{agent:"spec-ultra",kind:"command",version:r.version,path:r.path}]:[]);return[...t,...i]}function nH(e){switch(e.kind){case"not-signed-in":return["This machine is not signed in to Spec Ultra.","Run spec-ultra login to sign in."];case"expired":return[`This machine's licence certificate expired on ${e.expiresAt.slice(0,10)}.`,"Run spec-ultra login to renew it."]}}function AH(e){let t=`${e.daysLeft} ${e.daysLeft===1?"day":"days"}`;return[`${Es("Licence")}${e.serial} \xB7 ${e.email}`,`${iD}expires in ${t} \xB7 the plugin renews it daily`]}function iH(e){if(e.length===0)return[`${Es("Installs")}No install recorded on this machine.`];let t=e.map(r=>[r.agent,r.kind,r.version,r.scope??"",r.path]),i=t.reduce((r,s)=>r.map((l,u)=>Math.max(l,s[u]?.length??0)),[0,0,0,0]);return t.map((r,s)=>{let l=r.map((u,f)=>f<i.length?u.padEnd(i[f]??0):u);return`${s===0?Es("Installs"):iD}${l.join(" ")}`})}function rH(e){switch(e.kind){case"newer":return`${Es("Latest")}${e.version} is available \xB7 run ${e.command} to install it`;case"current":return`${Es("Latest")}${e.version} is the latest version`;case"unchecked":return`${Es("Latest")}the latest version could not be checked: ${e.why}`}}var Rp,VL,eH,AD,Es,iD,rD=T(()=>{"use strict";I();qI();ng();_n();Ki();gr();Rp=3e3,VL="spec-ultra update";eH=e=>Xa.find(t=>t.id===e)?.name??e;AD=10,Es=e=>e.padEnd(AD),iD=" ".repeat(AD)});var oD={};Ri(oD,{run:()=>lH});import{homedir as oH}from"node:os";async function lH(e){let{view:t,env:i,version:r}=e,s={platform:process.platform,home:oH(),env:i},l=gs(),u=lg({baseUrl:ul(i,"SPEC_ULTRA_SITE_URL",sH),fetch:aH(Rp),rereadLicence:async()=>{let d=await l.readJson($n(s));return d===null?null:Zn(d)}});return{command:"status",...await nD({files:l,machine:s,site:u,view:t,now:()=>new Date,ownVersion:r})}}var sH,aH,sD=T(()=>{"use strict";I();ag();_n();Dp();Ki();rD();ds();sH="https://specultra.dev",aH=e=>(t,i)=>globalThis.fetch(t,{...i,signal:AbortSignal.timeout(e)})});function cH(){let e=Np(kp.flatMap(s=>s.commands.map(({name:l})=>l))),t=Np(Tp.map(({flag:s})=>s)),i=Np(bp.map(({code:s})=>String(s))),r=kp.flatMap(s=>[s.title,...s.commands.map(({name:l,what:u})=>xp(e,l,u)),""]);return["",aD,"",...r,"Flags",...Tp.map(({flag:s,what:l})=>xp(t,s,l)),"",`Banner only on a terminal ${76}+ columns wide \xB7 NO_COLOR respected`,"","Exit codes",...bp.map(({code:s,meaning:l})=>xp(i,String(s),l))]}async function gH(e,t){try{let i=await mA(e,t),r=new Set(i?.entries.map(s=>s.agent));return r.size===0?"none yet":`${r.size} hold Spec Ultra`}catch{return"unreadable installs.json"}}async function fH(e,t){try{let i=await e.readJson($n(t));return i===null?"not signed in":(Zn(i),"signed in")}catch{return"unreadable license.json"}}async function lD({view:e,version:t,files:i,machine:r}){let[s,l]=await Promise.all([gH(i,r),fH(i,r)]),u={version:t,agents:s,licence:l};return e.show({kind:"banner",front:!0,command:"help",totals:u}),e.show({kind:"lines",lines:cH()}),e.show({kind:"report",data:{command:"help",exitCode:xe.ok,version:t,totals:u,usage:aD,groups:kp,flags:Tp,exitCodes:bp}}),xe.ok}var aD,kp,Tp,bp,Np,xp,uD=T(()=>{"use strict";I();lu();_n();Ki();gr();aD="Usage: spec-ultra <command> [flags]",kp=[{title:"Install",commands:[{name:"install",what:"Sign in and add Spec Ultra to your coding agents (the default)"},{name:"update",what:"Update this command and every install to the latest"},{name:"uninstall",what:"Remove everything Spec Ultra wrote, this command too"}]},{title:"Licence",commands:[{name:"status",what:"Licence, installs and whether an update is waiting"},{name:"login",what:"Sign this machine in again and renew its licence"}]},{title:"Help",commands:[{name:"help",what:"This screen; also -h or --help after any command"}]}],Tp=[{flag:"--agents <ids>",what:"install into these agents, comma-separated, without asking"},{flag:"--project",what:"act on this project instead of your user folders"},{flag:"-y, --yes",what:"accept the plan without asking"},{flag:"--license <id>",what:"sign in with this licence when your account holds several"},{flag:"--no-modify-path",what:"edit no shell file; print the PATH line to add"},{flag:"--json",what:"print one JSON document; no colour, no banner"},{flag:"-v, --version",what:"print the version"},{flag:"-h, --help",what:"print this help"}],bp=[{code:xe.ok,meaning:"ok"},{code:xe.error,meaning:"error"},{code:xe.usage,meaning:"usage error"},{code:xe.licence,meaning:"licence needs attention"},{code:xe.cancelled,meaning:"cancelled"}],Np=e=>Math.max(...e.map(t=>t.length))+2,xp=(e,t,i)=>` ${t.padEnd(e)}${i}`});var cD={};Ri(cD,{run:()=>EH});import{homedir as dH}from"node:os";async function EH({view:e,env:t,version:i}){let r={platform:process.platform,home:dH(),env:t};return lD({view:e,version:i,files:gs(),machine:r})}var gD=T(()=>{"use strict";I();ag();uD()});I();I();gr();ru();import{readFileSync as IH}from"node:fs";I();I();js();function rh({write:e,notice:t=()=>{},columns:i}){let r=[],s,l=!1;return{mode:"json",columns:i,show(u){if(u.kind==="report")s={data:u.data};else if(u.kind==="lines"&&(r.push(...u.lines),u.urgent))for(let f of u.lines)t(f)},...ou(),async close(){l||(l=!0,e(JSON.stringify(s?s.data:{lines:r},null,2)))}}}I();Of();js();function uh({write:e,columns:t}){let i=uu();return{mode:"plain",columns:t,show(r){let s=lh(r,{color:!1,wordmark:!1,columns:t}),l=ah(r);if(!(s.length===0||l===null)){i.next(l,r.kind==="lines"&&r.standalone===!0)&&e("");for(let u of s)e(u)}},...ou(),async close(){}}}async function C1(e,t,i){let{columns:r}=e;if(e.mode==="json")return rh({write:t,notice:i,columns:r});if(e.mode==="plain")return uh({write:t,columns:r});let{terminalView:s}=await p1().then(()=>I1);return s({write:t,columns:r,color:e.color})}I();function IG(e){return e.CI==="0"||e.CI==="false"?!1:"CI"in e||"CONTINUOUS_INTEGRATION"in e||Object.keys(e).some(t=>t.startsWith("CI_"))}function B1({stdoutIsTTY:e,stdinIsTTY:t,env:i,json:r,columns:s}){let l=r?"json":e&&t&&!IG(i)?"terminal":"plain",u=(i.NO_COLOR??"")!=="";return{mode:l,color:l==="terminal"&&!u,columns:s&&s>0?s:80}}xi();var pH=["install","login","update","uninstall","status"],Mp=22,fD="Usage: spec-ultra [install | login | update | uninstall | status | help] [--json]",ED=e=>pH.includes(e);function CH(e){let t=e.includes("--json"),i=e.filter(s=>s!=="--json"),[r="install"]=i;return r==="--version"||r==="-v"?{json:t,kind:"version"}:r==="help"||i.includes("--help")||i.includes("-h")?{json:t,kind:"help"}:r.startsWith("-")?{json:t,kind:"run",command:"install"}:ED(r)?{json:t,kind:"run",command:r}:{json:t,kind:"unknown",word:r}}function BH(e){let t=e.filter(i=>i!=="--json");return ED(t[0]??"")?t.slice(1):t}function hH(e){return Number.parseInt(e,10)>=Mp?null:`spec-ultra needs Node ${Mp} or newer; this is Node ${e}. Install Node ${Mp} and run again.`}function ID(){return"19.9.0"}function pD({command:e,outcome:t}){return t.kind==="stopped"?Ah(t.reason):e==="login"?xe.ok:e==="install"?t.results.some(i=>i.kind==="failed")?xe.error:xe.ok:t.kind!=="nothing-recorded"&&t.kind!=="current"&&t.failed.length>0?xe.error:xe.ok}function mH(e){let t=pD(e),{command:i,outcome:r}=e;if(r.kind==="stopped")return{command:i,exitCode:t,outcome:"stopped",reason:r.reason};if(i==="login"&&r.kind==="signed-in")return{command:i,exitCode:t,outcome:r.kind};let{kind:s,...l}=r;return{command:i,exitCode:t,outcome:s,...l}}function QH(e,t){return t instanceof Eo||t instanceof Error&&t.name==="PromptCancelled"?{exitCode:xe.cancelled,lines:Ni("cancelled")}:t instanceof Lt?{exitCode:xe.usage,lines:[`spec-ultra ${e}: ${t.message}`]}:{exitCode:xe.error,lines:[`spec-ultra ${e}: ${t instanceof Error?t.message:String(t)}`]}}var yH={install:async e=>(await Promise.resolve().then(()=>(Hv(),Lv))).run(e),login:async e=>(await Promise.resolve().then(()=>(Yv(),Kv))).run(e),update:async e=>(await Promise.resolve().then(()=>(Xv(),Wv))).run(e),uninstall:async e=>(await Promise.resolve().then(()=>(tD(),eD))).run(e),status:async e=>(await Promise.resolve().then(()=>(sD(),oD))).run(e),help:async e=>({command:"help",exitCode:await(await Promise.resolve().then(()=>(gD(),cD))).run(e)})};function SH(e,t,i,r,s){return yH[e]({view:t,env:i,args:s,version:r})}var wH=e=>e.command==="status"||e.command==="help";async function CD(e,t=SH){let i=hH(e.nodeVersion);if(i!==null)return e.stderr.write(`${i}
|
|
103
|
+
`,mL=new Set([".DS_Store","Thumbs.db","desktop.ini"]),og=e=>e instanceof Error&&"code"in e&&e.code==="ENOENT";Nv=(e,t)=>sg(Qp(e),`.${BL(e)}.spec-ultra-${t}-${wv(6).toString("hex")}`)});import{createHash as wL,randomBytes as vL}from"node:crypto";import{createServer as DL}from"node:http";function xL(e,t,i){let r=new URL(e.url??"/","http://127.0.0.1");if(r.pathname!==Tv)return t.writeHead(404,{connection:"close"}).end(),{done:!1};let s=(f,d)=>t.writeHead(f,{"content-type":"text/html; charset=utf-8",connection:"close"}).end(NL(d)),l=r.searchParams.get("error");if(l)return s(400,"Sign-in was refused. You can close this tab and return to the terminal."),{done:!0,error:new Error(`sign-in refused by the authorization server: ${l}`)};if(r.searchParams.get("state")!==i)return s(400,"This sign-in link does not match the one the installer opened. Return to the terminal."),{done:!0,error:new Error("sign-in aborted: state mismatch in the authorization callback")};let u=r.searchParams.get("code");return u?(s(200,"Signed in. You can close this tab and return to the terminal."),{done:!0,code:u}):(s(400,"The sign-in answer carried no code. Return to the terminal."),{done:!0,error:new Error("sign-in aborted: the authorization callback carried no code")})}function bv(e){let t=e.fetch??globalThis.fetch;async function i(){let s=kv(32),l=kv(24),u=wL("sha256").update(s).digest("base64url"),f=DL();await new Promise((O,R)=>{f.once("error",R),f.listen(0,"127.0.0.1",O)});let{address:d,port:E}=f.address(),m=`http://${d}:${E}${Tv}`,h,Q=Date.now()+(e.timeoutMs??RL),w=()=>e.onTick?.(Math.max(0,Math.ceil((Q-Date.now())/xv)));w();let b=e.onTick?setInterval(w,xv):void 0;try{let O=new Promise((J,X)=>{h=setTimeout(()=>X(new wp),Q-Date.now()),f.on("request",(P,ue)=>{let oe=xL(P,ue,l);oe.done&&("error"in oe?X(oe.error):J(oe.code))})}),R=new URL(e.authorizeUrl),k={response_type:"code",client_id:e.clientId,redirect_uri:m,code_challenge:u,code_challenge_method:"S256",state:l,...e.scope?{scope:e.scope}:{}};for(let[J,X]of Object.entries(k))R.searchParams.set(J,X);return await Promise.all([O,Promise.resolve(e.openBrowser(R.toString()))]),{code:await O,redirectUri:m,verifier:s}}finally{clearTimeout(h),clearInterval(b),e.onTick?.(0),f.closeIdleConnections(),await new Promise(O=>f.close(()=>O()))}}async function r(s,l,u){let f=await t(e.tokenUrl,{method:"POST",headers:{"content-type":"application/x-www-form-urlencoded",accept:"application/json"},body:new URLSearchParams({grant_type:"authorization_code",code:s,redirect_uri:l,client_id:e.clientId,code_verifier:u}).toString()});if(!f.ok)throw new Error(`sign-in failed: the token endpoint answered HTTP ${f.status}`);let d=await f.json().catch(()=>null),E=typeof d=="object"&&d!==null&&"access_token"in d?d.access_token:void 0;if(typeof E!="string"||E==="")throw new Error("sign-in failed: the token endpoint answered no access token");return E}return{async accessToken(){let{code:s,redirectUri:l,verifier:u}=await i();return r(s,l,u)}}}var Tv,RL,xv,wp,NL,kv,Mv=T(()=>{"use strict";I();Tv="/callback",RL=5*6e4,xv=1e3,wp=class extends Error{constructor(){super("Sign-in timed out: the browser did not answer within 5 minutes. Run spec-ultra login to try again."),this.name="SignInTimedOut"}},NL=e=>`<!doctype html><meta charset="utf-8"><title>Spec Ultra</title><p style="font-family:sans-serif">${e}</p>`,kv=e=>vL(e).toString("base64url")});async function bL(e,t=globalThis.fetch){let i=await t(`${TL(e)}/.well-known/oauth-authorization-server`,{headers:{accept:"application/json"}});if(!i.ok)throw new Error(`sign-in unavailable: the authorization server answered HTTP ${i.status} to discovery`);let r=await i.json().catch(()=>null),{authorization_endpoint:s,token_endpoint:l}=kL(r)?r:{};if(typeof s!="string"||typeof l!="string")throw new Error("sign-in unavailable: the authorization server metadata lacks its endpoints");return{authorizeUrl:s,tokenUrl:l}}function Ov({frontendApi:e,fetch:t,signInWith:i}){return{async accessToken(){return i(await bL(e,t)).accessToken()}}}var kL,TL,_v=T(()=>{"use strict";I();kL=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),TL=e=>new URL(/^https?:\/\//.test(e)?e:`https://${e}`).origin});async function Gv(e){return e.json().catch(()=>null)}function lg({baseUrl:e,fetch:t=globalThis.fetch,rereadLicence:i}){let r=f=>new URL(f,e.endsWith("/")?e:`${e}/`).toString();async function s(f,d,E={}){try{return await t(r(f),{method:"POST",headers:{"content-type":"application/json",accept:"application/json",...E},body:JSON.stringify(d)})}catch{return null}}async function l(f,d){let E=await s("api/license/certificate",d===void 0?{}:{licenceId:d},{authorization:`Bearer ${f}`});if(E===null||E.status===503)return{kind:"offline"};if(E.status===401)return{kind:"unauthorized"};let m=await Gv(E);if(E.status===200){if(!ll(m)||!Mr(m.token)||!Mr(m.refresh))throw new Error("the site answered a certificate without a token and a renewal secret");return{kind:"issued",licence:{token:m.token,refresh:m.refresh}}}if(E.status===403&&vp(m)==="no-seat")return{kind:"no-seat"};if(E.status===409&&vp(m)==="ambiguous"&&ll(m)){let h=m.licences;if(Array.isArray(h)&&h.length>0&&h.every(ML))return{kind:"ambiguous",licences:h};throw new Error("the site answered an ambiguous certificate request without its licences")}throw new Error(`the site answered HTTP ${E.status} to the certificate request`)}async function u(f,d=!1){if(f.refresh===void 0)return{kind:"refused",reason:"login-required"};let E=await s("api/install/bundle",{token:f.token,refresh:f.refresh});if(E===null||E.status===503)return{kind:"offline"};if(E.status===410)return{kind:"refused",reason:"ended"};if(E.status===400)return{kind:"refused",reason:"bad-request"};let m=await Gv(E),h=vp(m);if(E.status===200){if(!ll(m)||!Mr(m.version)||!Mr(m.sha256)||!Mr(m.url)||!Mr(m.expiresAt))throw new Error("the site answered a bundle grant without its version, checksum, address or expiry");return{kind:"ready",version:m.version,sha256:m.sha256,url:m.url,expiresAt:m.expiresAt}}if(E.status===409&&h==="rotated"){let Q=d||i===void 0?null:await i();return Q===null?{kind:"refused",reason:"login-required"}:u(Q,!0)}if(E.status===401&&_L(h))return{kind:"refused",reason:h};if(E.status===403&&h==="seat-reassigned")return{kind:"refused",reason:"seat-reassigned"};throw new Error(`the site answered HTTP ${E.status} to the bundle request`)}return{certificate:l,bundle:f=>u(f)}}var ll,Mr,ML,OL,_L,vp,Dp=T(()=>{"use strict";I();ll=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),Mr=e=>typeof e=="string"&&e!=="",ML=e=>ll(e)&&Mr(e.id)&&(e.modality==="individual"||e.modality==="business")&&typeof e.organization=="string",OL=["chain-revoked","chain-closed","login-required"],_L=e=>OL.some(t=>t===e);vp=e=>ll(e)?e.reason:void 0});import{homedir as GL}from"node:os";function ul(e,t,i){let r=e[t]||UL[t]||i;if(!r)throw new Error(`${t} is not set: point it at the value for your Spec Ultra environment and run again`);return r}function Yi({view:e,env:t}){let i=d=>e.show({kind:"lines",lines:[d]}),r=process.platform,s={platform:r,home:GL(),env:t},l=process.cwd(),u=gs(),f=eg({files:u,claude:Hc({cwd:l}),machine:s});return{out:i,platform:r,machine:s,cwd:l,files:u,claudeCode:f}}function fs(e,t,i){let r=async()=>{let s=await t.readJson($n(i));return s===null?null:Zn(s)};return lg({baseUrl:ul(e,"SPEC_ULTRA_SITE_URL",LL),rereadLicence:r})}function ug({view:e,env:t},i){let r=ul(t,"SPEC_ULTRA_OAUTH_CLIENT_ID"),s=ul(t,"SPEC_ULTRA_CLERK_FRONTEND_API");return Ov({frontendApi:s,signInWith:l=>bv({...l,clientId:r,scope:HL,openBrowser:async u=>e.show({kind:"lines",lines:Bv(u,await Cv(u,i,t)),urgent:!0}),onTick:u=>e.show({kind:"countdown",secondsLeft:u})})})}var UL,LL,HL,ds=T(()=>{"use strict";I();hv();PI();ag();Mv();_n();_v();Dp();tg();Ki();UL=typeof D>"u"?{}:D,LL="https://specultra.dev",HL="profile email"});var Lv={};Ri(Lv,{parseInstallFlags:()=>Uv,run:()=>FL});function Uv(e){let t={},i;for(let r=0;r<e.length;r++){let s=e[r]??"",[l="",u]=s.startsWith("--")&&s.includes("=")?[s.slice(0,s.indexOf("=")),s.slice(s.indexOf("=")+1)]:[s,void 0],f=()=>{let d=u??e[++r];if(d===void 0||d===""||d.startsWith("-"))throw new Lt(`${l} needs a value`);return d};switch(l){case"--agents":t.agents=[...t.agents??[],...f().split(",").map(d=>d.trim()).filter(Boolean)];break;case"--project":t.project=!0;break;case"--yes":case"-y":t.yes=!0;break;case"--no-modify-path":t.modifyPath=!1;break;case"--license":i=f();break;default:throw new Lt(`unknown option '${s}' for install: it takes --agents, --project, --yes, --no-modify-path and --license`)}}return{answers:t,...i===void 0?{}:{licence:i}}}var FL,Hv=T(()=>{"use strict";I();jI();PI();Fc();qI();qc();Vc();tg();pv();xi();ig();ds();FL=async e=>{let{answers:t,licence:i}=Uv(e.args),{files:r,machine:s,platform:l,cwd:u,out:f}=Yi(e),d=fs(e.env,r,s),E={accessToken:()=>ug(e,l).accessToken()},m=is({platform:l,env:e.env}),h=l==="win32"?ls({machine:s,powershell:as()}):os({machine:s,executables:m});return{command:"install",outcome:await Iv({signIn:E,site:d,prompter:Ag(e.view),...i===void 0?{}:{licence:i},unattended:t.yes===!0,files:r,machine:s,out:f,view:e.view,bundles:Lc(),executables:m,claudeCode:eg({files:r,claude:Ev(e.view,Hc({cwd:u})),machine:s}),resident:h,agents:Xa,cwd:u,version:e.version,answers:t})}}});var Kv={};Ri(Kv,{licenceFlag:()=>Jv,run:()=>JL});function Jv(e){let t=e.find(r=>r.startsWith("--license="));if(t!==void 0)return Fv(t.slice(10));let i=e.indexOf("--license");return i===-1?void 0:Fv(e[i+1])}function Fv(e){if(!e||e.startsWith("-"))throw new Lt("--license needs the id of one of your licences: spec-ultra login --license <id>");return e}var JL,Yv=T(()=>{"use strict";I();hp();xi();ig();ds();JL=async e=>{let t=Jv(e.args),i=e.args.some(m=>m==="--yes"||m==="-y"),{files:r,machine:s,platform:l,out:u}=Yi(e),f=fs(e.env,r,s),E={signIn:ug(e,l),site:f,prompter:Ag(e.view),files:r,machine:s,out:u,unattended:i};return{command:"login",outcome:await sl(t===void 0?E:{...E,licence:t})}}});async function qv(e){let{files:t,machine:i,view:r}=e,s=b=>r.show({kind:"lines",lines:[b]}),l=await mA(t,i);if(l===null)return s(Pv),{kind:"nothing-recorded"};if(e.continued)return jv(e,e.continued.bundleDir,e.continued.version,!1);let u=b=>{for(let O of Ni(b))s(O);return{kind:"stopped",reason:b}},f=await t.readJson($n(i));if(f===null)return u("login-required");let d=await e.site.bundle(Zn(f));if(d.kind==="offline")return u("offline");if(d.kind==="refused")return u(d.reason);let E=d.version,m=OA(l).find(zv),h=m!==void 0&&oi(m.version,E),Q=BA(l).some(b=>oi(b.version,E));if(!h&&!Q){let b=await cg(e,BA(l),[]);return s(`Spec Ultra ${l.version} is already the latest version.`),{kind:"current",version:l.version,changed:b}}let w=await Gn(r,"download",`Download Spec Ultra ${E}`,()=>e.bundles.fetch(d.url,d.sha256));if(!h)return jv(e,w,E,!0);try{try{await Gn(r,"command","spec-ultra command",async()=>{let R=await e.resident.placeProgram(br(i).join(w,"cli","cli.js"),E),k=[...OA(l).filter(J=>!zv(J)&&J.kind!=="resident-file"),...R];await t.writeJson(Ji(i),Tr(BA(l),l.version,k))},()=>`${m.version} \u2192 ${E}`)}catch{return{kind:"swap-failed",version:E,failed:[m.path]}}if(!Q)return s(`Spec Ultra updated to ${E}`),{kind:"updated",version:E,changed:[],failed:[],skipped:[]};let b=r.mode==="json"?["--json"]:[],O=await e.resident.handOver(["update",fr,w,...b]);return{kind:"handed-over",version:E,exitCode:O}}finally{await t.remove(w)}}async function cg({files:e,view:t},i,r){let s=[...i.flatMap(l=>l.kind==="plugin"?[l.marketplace]:[]),...rl(i).flatMap(l=>l.paths)];for(let l of s)!await e.exists(l)||await e.ownedBy(l)||(r.push(l),t.show({kind:"lines",lines:[eA(l)]}));return r}async function jv(e,t,i,r){let{files:s,machine:l,view:u}=e,f=d=>u.show({kind:"lines",lines:[d]});try{let d=await mA(s,l);if(d===null)return f(Pv),{kind:"nothing-recorded"};let E=Y=>oi(Y,i),m=BA(d),h=OA(d),Q=[];if(!m.some(Y=>E(Y.version)))return await cg(e,m,Q),f(`Spec Ultra ${d.version} is already the latest version.`),{kind:"current",version:d.version,changed:Q};let{join:w,basename:b}=br(l),O=[],R=[],k=0,J=m,X=()=>s.writeJson(Ji(l),Tr(J,i,h)),P=Y=>`${Y} \u2192 ${i}`;async function ue(Y,ie,fe=Y.version){J=[...J.filter(ce=>!Cp(Y,ce)),...ol(Y,ie,fe)],await X()}async function oe(Y){let ie=w(t,"skills"),fe=await s.listDirs(ie),ce=[...Y.paths],At=me=>ce.splice(ce.indexOf(me),1),Ke=0;try{for(let me of Y.paths)await s.exists(me)?await s.ownedBy(me)?fe.includes(b(me))?(await s.copyDir(w(ie,b(me)),me),Ke++):(await s.remove(me),At(me),await ue(Y,ce)):(Q.push(me),f(eA(me))):At(me);for(let me of fe){let Ye=w(Y.root,me);Y.paths.includes(Ye)||await s.exists(Ye)&&!await s.ownedBy(Ye)||(ce.push(Ye),await ue(Y,ce),await s.copyDir(w(ie,me),Ye),Ke++)}}catch(me){let Ye=[];for(let It of ce)await s.exists(It)&&Ye.push(It);throw await ue(Y,Ye),me}return await ue(Y,ce,i),Ke}async function pe(Y){let ie=`plugin:${Y.marketplace}`,fe=`Claude Code plugin (${Y.scope} scope)`;u.show({kind:"step-start",id:ie,label:fe});try{let ce=await e.claudeCode.install({bundleDir:t,scope:Y.scope,...Y.project===void 0?{}:{project:Y.project},previous:Y});return ce.kind==="installed"?(k++,u.show({kind:"step-done",id:ie,label:fe,detail:P(Y.version)}),{...ce.entry,version:i}):ce.reason==="claude-missing"?(R.push(Y.marketplace),u.show({kind:"step-failed",id:ie,label:fe,reason:`skipped \u2014 ${ce.hint}`}),Y):(Q.push(Y.marketplace),u.show({kind:"step-done",id:ie,label:fe,detail:"left in place, changed since the install"}),f(eA(ce.reason==="foreign-directory"?ce.path:`${ce.path} (${ce.keys.join(", ")})`)),{...Y,version:i})}catch(ce){return O.push(Y.marketplace),u.show({kind:"step-failed",id:ie,label:fe,reason:cs(ce)}),Y}}for(let Y of m){if(Y.kind!=="plugin")continue;if(!E(Y.version)){await cg(e,[Y],Q);continue}let ie=await pe(Y);J=J.map(fe=>fe===Y?ie:fe),await X()}for(let Y of rl(m)){if(!E(Y.version)){await cg(e,m.filter(ie=>Cp(Y,ie)),Q);continue}try{await Gn(u,`skills:${Y.root}`,`Skills in ${Y.root}`,()=>oe(Y),ie=>`${P(Y.version)} \xB7 ${ie} skills`),k++}catch{O.push(Y.root)}}await X();let _e=O.length===0&&R.length===0;return f(_e?`Spec Ultra updated to ${i}`:`Spec Ultra ${i} reached only part of the install; run spec-ultra update again.`),k>0&&f(`Restart your coding agents so they load Spec Ultra ${i}.`),{kind:"updated",version:i,changed:Q,failed:O,skipped:R}}finally{r&&await s.remove(t)}}var Pv,zv,Vv=T(()=>{"use strict";I();_n();ru();Ki();gr();mp();ru();Pv="Nothing recorded to update. Run npx spec-ultra to install Spec Ultra first.",zv=e=>e.kind==="resident-program"});var Wv={};Ri(Wv,{run:()=>zL});function KL(e,t){let i=e.platform==="win32"?ls({machine:e,powershell:as()}):os({machine:e,executables:is({platform:e.platform,env:e.env})});return{...i,async handOver(r){return t.mode==="terminal"&&await t.close(),i.handOver(r)}}}function YL(e){let t=e.indexOf(fr);return t===-1?void 0:e[t+1]}var zL,Xv=T(()=>{"use strict";I();jI();Fc();qc();Vc();Vv();ds();zL=async e=>{let{files:t,claudeCode:i,machine:r}=Yi(e),s=fs(e.env,t,r),l=YL(e.args),u=await qv({site:s,bundles:Lc(),files:t,claudeCode:i,machine:r,view:e.view,resident:KL(r,e.view),...l===void 0?{}:{continued:{bundleDir:l,version:e.version}}});return u.kind==="handed-over"&&process.exit(u.exitCode),{command:"update",outcome:u}}});function jL(e){if(e.kind!=="resident-path")return[eA(e.path)];let{edit:t}=e;return t.kind==="rc-line"?[` left in place, edited since the install: ${t.file}`,` remove this line by hand: ${t.line}`]:[eA(t.kind==="fish-conf"?t.file:t.entry)]}async function Zv({files:e,claudeCode:t,resident:i,machine:r,out:s}){let l=await mA(e,r);if(l===null)return s("Nothing recorded to uninstall."),{kind:"nothing-recorded"};let u=[],f=[],d=[],E=BA(l),m=k=>k instanceof Error?k.message:String(k);async function h(k){let J=[],X=0;for(let P of k.paths)if(await e.exists(P)){if(await e.ownedBy(P)){await e.remove(P),X++;continue}u.push(P),s(eA(P)),J.push(P)}return s(`${k.root}: ${X} skills removed`),J}async function Q(k){if(await e.exists(k.marketplace)){if(await e.ownedBy(k.marketplace)){await e.remove(k.marketplace);return}u.push(k.marketplace),s(eA(k.marketplace)),d.push(k)}}for(let k of E)if(k.kind==="plugin")try{if(k.registered===!1){await Q(k);continue}let J=await t.uninstall(k),X=J.kind==="registration-left";s(X?`Claude Code: the plugin registration is still in place. ${J.hint}`:`Claude Code: plugin removed (${k.scope} scope)`);let P=await e.exists(k.marketplace);P&&(u.push(k.marketplace),s(eA(k.marketplace))),X?d.push(k):P&&d.push({...k,registered:!1})}catch(J){f.push(k.marketplace),s(`Claude Code: failed \u2014 ${m(J)}`),d.push(k)}for(let k of rl(E))try{d.push(...ol(k,await h(k)))}catch(J){f.push(k.root),s(`${k.root}: failed \u2014 ${m(J)}`);let X=[];for(let P of k.paths)await e.exists(P)&&X.push(P);d.push(...ol(k,X))}let w=OA(l),b=[],O=[];if(w.length>0)try{b=await i.remove(w);for(let k of b){u.push(PL(k));for(let J of jL(k))s(J)}b.length===0&&s("spec-ultra command removed"),O=b.filter(k=>!(k.kind==="resident-path"&&k.edit.kind==="rc-line"))}catch(k){f.push(yn(r)),s(`spec-ultra command: failed \u2014 ${m(k)}`),b=O=w}let R=Ji(r);return d.length===0&&O.length===0?await e.remove(R):await e.writeJson(R,Tr(d,l.version,O)),s(d.length===0&&b.length===0?"Spec Ultra uninstalled. Your licence certificate stays in the licence home.":"Spec Ultra uninstalled, except what is listed above. Your licence certificate stays in the licence home."),{kind:"uninstalled",changed:u,failed:f}}var PL,$v=T(()=>{"use strict";I();kr();_n();Ki();PL=e=>e.kind!=="resident-path"?e.path:e.edit.kind==="windows-user-path"?e.edit.entry:e.edit.file});var eD={};Ri(eD,{run:()=>qL});var qL,tD=T(()=>{"use strict";I();Fc();qc();Vc();$v();ds();qL=async e=>{let{files:t,claudeCode:i,machine:r,platform:s,out:l}=Yi(e),u=s==="win32"?ls({machine:r,powershell:as()}):os({machine:r,executables:is({platform:s,env:e.env})});return{command:"uninstall",outcome:await Zv({files:t,claudeCode:i,resident:u,machine:r,out:l})}}});async function nD(e){let t=await WL(e),i;if(t.kind==="signed-in"){let{licence:u,installs:f}=t;e.view.show({kind:"lines",lines:[...AH(u),...iH(f)]});let d=await t.latest;e.view.show({kind:"lines",lines:[rH(d)]}),i={kind:"shown",licence:u,installs:f,latest:d}}else i=t,e.view.show({kind:"lines",lines:nH(t)});let r=i.kind==="shown"?xe.ok:xe.licence,{kind:s,...l}=i;return e.view.show({kind:"report",data:{command:"status",exitCode:r,outcome:s,...l}}),{outcome:i,exitCode:r}}async function WL({files:e,machine:t,site:i,now:r,ownVersion:s,timeoutMs:l=Rp}){let u=await XL(e,t),f=u&&us(u.token);if(!u||!f)return{kind:"not-signed-in"};let d=f.expiresAt.toISOString(),E=fv(f.expiresAt,r());if(E===0)return{kind:"expired",expiresAt:d};let m=ZL(i.bundle(u),l),h=await mA(e,t);return{kind:"signed-in",licence:{serial:f.serial,email:f.email,expiresAt:d,daysLeft:E,renewal:"daily"},installs:h?tH(h):[],latest:m.then(Q=>$L(Q,h?.version??s))}}async function XL(e,t){let i=await e.readJson($n(t));if(i===null)return null;try{return Zn(i)}catch{return null}}async function ZL(e,t){let i,r=new Promise(s=>{i=setTimeout(()=>s({kind:"offline"}),t)});try{return await Promise.race([e.catch(()=>({kind:"offline"})),r])}finally{clearTimeout(i)}}function $L(e,t){return e.kind==="offline"?{kind:"unchecked",why:"specultra.dev did not answer"}:e.kind==="refused"?{kind:"unchecked",why:`the site refused this licence (${e.reason}); run spec-ultra login`}:oi(t,e.version)?{kind:"newer",version:e.version,command:VL}:{kind:"current",version:t}}function tH(e){let t=BA(e).map(r=>({agent:eH(r.agent),kind:r.kind,version:r.version,path:r.kind==="plugin"?r.marketplace:r.root,scope:r.scope})),i=OA(e).flatMap(r=>r.kind==="resident-program"?[{agent:"spec-ultra",kind:"command",version:r.version,path:r.path}]:[]);return[...t,...i]}function nH(e){switch(e.kind){case"not-signed-in":return["This machine is not signed in to Spec Ultra.","Run spec-ultra login to sign in."];case"expired":return[`This machine's licence certificate expired on ${e.expiresAt.slice(0,10)}.`,"Run spec-ultra login to renew it."]}}function AH(e){let t=`${e.daysLeft} ${e.daysLeft===1?"day":"days"}`;return[`${Es("Licence")}${e.serial} \xB7 ${e.email}`,`${iD}expires in ${t} \xB7 the plugin renews it daily`]}function iH(e){if(e.length===0)return[`${Es("Installs")}No install recorded on this machine.`];let t=e.map(r=>[r.agent,r.kind,r.version,r.scope??"",r.path]),i=t.reduce((r,s)=>r.map((l,u)=>Math.max(l,s[u]?.length??0)),[0,0,0,0]);return t.map((r,s)=>{let l=r.map((u,f)=>f<i.length?u.padEnd(i[f]??0):u);return`${s===0?Es("Installs"):iD}${l.join(" ")}`})}function rH(e){switch(e.kind){case"newer":return`${Es("Latest")}${e.version} is available \xB7 run ${e.command} to install it`;case"current":return`${Es("Latest")}${e.version} is the latest version`;case"unchecked":return`${Es("Latest")}the latest version could not be checked: ${e.why}`}}var Rp,VL,eH,AD,Es,iD,rD=T(()=>{"use strict";I();qI();ng();_n();Ki();gr();Rp=3e3,VL="spec-ultra update";eH=e=>Xa.find(t=>t.id===e)?.name??e;AD=10,Es=e=>e.padEnd(AD),iD=" ".repeat(AD)});var oD={};Ri(oD,{run:()=>lH});import{homedir as oH}from"node:os";async function lH(e){let{view:t,env:i,version:r}=e,s={platform:process.platform,home:oH(),env:i},l=gs(),u=lg({baseUrl:ul(i,"SPEC_ULTRA_SITE_URL",sH),fetch:aH(Rp),rereadLicence:async()=>{let d=await l.readJson($n(s));return d===null?null:Zn(d)}});return{command:"status",...await nD({files:l,machine:s,site:u,view:t,now:()=>new Date,ownVersion:r})}}var sH,aH,sD=T(()=>{"use strict";I();ag();_n();Dp();Ki();rD();ds();sH="https://specultra.dev",aH=e=>(t,i)=>globalThis.fetch(t,{...i,signal:AbortSignal.timeout(e)})});function cH(){let e=Np(kp.flatMap(s=>s.commands.map(({name:l})=>l))),t=Np(Tp.map(({flag:s})=>s)),i=Np(bp.map(({code:s})=>String(s))),r=kp.flatMap(s=>[s.title,...s.commands.map(({name:l,what:u})=>xp(e,l,u)),""]);return["",aD,"",...r,"Flags",...Tp.map(({flag:s,what:l})=>xp(t,s,l)),"",`Banner only on a terminal ${76}+ columns wide \xB7 NO_COLOR respected`,"","Exit codes",...bp.map(({code:s,meaning:l})=>xp(i,String(s),l))]}async function gH(e,t){try{let i=await mA(e,t),r=new Set(i?.entries.map(s=>s.agent));return r.size===0?"none yet":`${r.size} hold Spec Ultra`}catch{return"unreadable installs.json"}}async function fH(e,t){try{let i=await e.readJson($n(t));return i===null?"not signed in":(Zn(i),"signed in")}catch{return"unreadable license.json"}}async function lD({view:e,version:t,files:i,machine:r}){let[s,l]=await Promise.all([gH(i,r),fH(i,r)]),u={version:t,agents:s,licence:l};return e.show({kind:"banner",front:!0,command:"help",totals:u}),e.show({kind:"lines",lines:cH()}),e.show({kind:"report",data:{command:"help",exitCode:xe.ok,version:t,totals:u,usage:aD,groups:kp,flags:Tp,exitCodes:bp}}),xe.ok}var aD,kp,Tp,bp,Np,xp,uD=T(()=>{"use strict";I();lu();_n();Ki();gr();aD="Usage: spec-ultra <command> [flags]",kp=[{title:"Install",commands:[{name:"install",what:"Sign in and add Spec Ultra to your coding agents (the default)"},{name:"update",what:"Update this command and every install to the latest"},{name:"uninstall",what:"Remove everything Spec Ultra wrote, this command too"}]},{title:"Licence",commands:[{name:"status",what:"Licence, installs and whether an update is waiting"},{name:"login",what:"Sign this machine in again and renew its licence"}]},{title:"Help",commands:[{name:"help",what:"This screen; also -h or --help after any command"}]}],Tp=[{flag:"--agents <ids>",what:"install into these agents, comma-separated, without asking"},{flag:"--project",what:"act on this project instead of your user folders"},{flag:"-y, --yes",what:"accept the plan without asking"},{flag:"--license <id>",what:"sign in with this licence when your account holds several"},{flag:"--no-modify-path",what:"edit no shell file; print the PATH line to add"},{flag:"--json",what:"print one JSON document; no colour, no banner"},{flag:"-v, --version",what:"print the version"},{flag:"-h, --help",what:"print this help"}],bp=[{code:xe.ok,meaning:"ok"},{code:xe.error,meaning:"error"},{code:xe.usage,meaning:"usage error"},{code:xe.licence,meaning:"licence needs attention"},{code:xe.cancelled,meaning:"cancelled"}],Np=e=>Math.max(...e.map(t=>t.length))+2,xp=(e,t,i)=>` ${t.padEnd(e)}${i}`});var cD={};Ri(cD,{run:()=>EH});import{homedir as dH}from"node:os";async function EH({view:e,env:t,version:i}){let r={platform:process.platform,home:dH(),env:t};return lD({view:e,version:i,files:gs(),machine:r})}var gD=T(()=>{"use strict";I();ag();uD()});I();I();gr();ru();import{readFileSync as IH}from"node:fs";I();I();js();function rh({write:e,notice:t=()=>{},columns:i}){let r=[],s,l=!1;return{mode:"json",columns:i,show(u){if(u.kind==="report")s={data:u.data};else if(u.kind==="lines"&&(r.push(...u.lines),u.urgent))for(let f of u.lines)t(f)},...ou(),async close(){l||(l=!0,e(JSON.stringify(s?s.data:{lines:r},null,2)))}}}I();Of();js();function uh({write:e,columns:t}){let i=uu();return{mode:"plain",columns:t,show(r){let s=lh(r,{color:!1,wordmark:!1,columns:t}),l=ah(r);if(!(s.length===0||l===null)){i.next(l,r.kind==="lines"&&r.standalone===!0)&&e("");for(let u of s)e(u)}},...ou(),async close(){}}}async function C1(e,t,i){let{columns:r}=e;if(e.mode==="json")return rh({write:t,notice:i,columns:r});if(e.mode==="plain")return uh({write:t,columns:r});let{terminalView:s}=await p1().then(()=>I1);return s({write:t,columns:r,color:e.color})}I();function IG(e){return e.CI==="0"||e.CI==="false"?!1:"CI"in e||"CONTINUOUS_INTEGRATION"in e||Object.keys(e).some(t=>t.startsWith("CI_"))}function B1({stdoutIsTTY:e,stdinIsTTY:t,env:i,json:r,columns:s}){let l=r?"json":e&&t&&!IG(i)?"terminal":"plain",u=(i.NO_COLOR??"")!=="";return{mode:l,color:l==="terminal"&&!u,columns:s&&s>0?s:80}}xi();var pH=["install","login","update","uninstall","status"],Mp=22,fD="Usage: spec-ultra [install | login | update | uninstall | status | help] [--json]",ED=e=>pH.includes(e);function CH(e){let t=e.includes("--json"),i=e.filter(s=>s!=="--json"),[r="install"]=i;return r==="--version"||r==="-v"?{json:t,kind:"version"}:r==="help"||i.includes("--help")||i.includes("-h")?{json:t,kind:"help"}:r.startsWith("-")?{json:t,kind:"run",command:"install"}:ED(r)?{json:t,kind:"run",command:r}:{json:t,kind:"unknown",word:r}}function BH(e){let t=e.filter(i=>i!=="--json");return ED(t[0]??"")?t.slice(1):t}function hH(e){return Number.parseInt(e,10)>=Mp?null:`spec-ultra needs Node ${Mp} or newer; this is Node ${e}. Install Node ${Mp} and run again.`}function ID(){return"19.11.0"}function pD({command:e,outcome:t}){return t.kind==="stopped"?Ah(t.reason):e==="login"?xe.ok:e==="install"?t.results.some(i=>i.kind==="failed")?xe.error:xe.ok:t.kind!=="nothing-recorded"&&t.kind!=="current"&&t.failed.length>0?xe.error:xe.ok}function mH(e){let t=pD(e),{command:i,outcome:r}=e;if(r.kind==="stopped")return{command:i,exitCode:t,outcome:"stopped",reason:r.reason};if(i==="login"&&r.kind==="signed-in")return{command:i,exitCode:t,outcome:r.kind};let{kind:s,...l}=r;return{command:i,exitCode:t,outcome:s,...l}}function QH(e,t){return t instanceof Eo||t instanceof Error&&t.name==="PromptCancelled"?{exitCode:xe.cancelled,lines:Ni("cancelled")}:t instanceof Lt?{exitCode:xe.usage,lines:[`spec-ultra ${e}: ${t.message}`]}:{exitCode:xe.error,lines:[`spec-ultra ${e}: ${t instanceof Error?t.message:String(t)}`]}}var yH={install:async e=>(await Promise.resolve().then(()=>(Hv(),Lv))).run(e),login:async e=>(await Promise.resolve().then(()=>(Yv(),Kv))).run(e),update:async e=>(await Promise.resolve().then(()=>(Xv(),Wv))).run(e),uninstall:async e=>(await Promise.resolve().then(()=>(tD(),eD))).run(e),status:async e=>(await Promise.resolve().then(()=>(sD(),oD))).run(e),help:async e=>({command:"help",exitCode:await(await Promise.resolve().then(()=>(gD(),cD))).run(e)})};function SH(e,t,i,r,s){return yH[e]({view:t,env:i,args:s,version:r})}var wH=e=>e.command==="status"||e.command==="help";async function CD(e,t=SH){let i=hH(e.nodeVersion);if(i!==null)return e.stderr.write(`${i}
|
|
104
104
|
`),xe.error;let r=CH(e.args);if(r.kind==="version"){let u=ID();return e.stdout.write(r.json?`${JSON.stringify({version:u},null,2)}
|
|
105
105
|
`:`${u}
|
|
106
106
|
`),xe.ok}let s=B1({stdoutIsTTY:e.stdout.isTTY===!0,stdinIsTTY:e.stdin.isTTY===!0,env:e.env,json:r.json,columns:e.stdout.columns}),l=await C1(s,u=>e.stdout.write(`${u}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "spec-ultra",
|
|
3
|
-
"version": "19.
|
|
3
|
+
"version": "19.11.0",
|
|
4
4
|
"description": "Installs Spec Ultra into your coding agents: signs you in, writes your licence certificate and copies the plugin.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"author": "Dyego Maas Tecnologia e Inovação Ltda.",
|