@manan_joshi/atelier 0.1.5 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/README.md +0 -14
  2. package/dist/index.js +22 -14
  3. package/package.json +5 -2
package/README.md CHANGED
@@ -38,20 +38,6 @@ atl saved show <stable-id>
38
38
  atl logout
39
39
  ```
40
40
 
41
- ## API
42
-
43
- The CLI defaults to the hosted Atelier API:
44
-
45
- ```text
46
- https://atelier.mananjoshi.me/api
47
- ```
48
-
49
- For local development, override it with:
50
-
51
- ```bash
52
- ATELIER_API_URL=http://127.0.0.1:8787 atl login
53
- ```
54
-
55
41
  ## Security
56
42
 
57
43
  Saved config contents are encrypted locally before upload. Atelier stores encrypted snapshots and metadata, not plaintext config contents.
package/dist/index.js CHANGED
@@ -1,18 +1,26 @@
1
1
  #!/usr/bin/env bun
2
2
  // @bun
3
- import{stdin as B,stdout as E}from"process";import{existsSync as Et,readFileSync as jt}from"fs";import{homedir as Gn,platform as Fn}from"os";import{join as j,resolve as qn}from"path";import{Command as Vn}from"commander";import{createDecipheriv as Or,createHash as Jr}from"crypto";import{existsSync as Xr,mkdirSync as it}from"fs";import{copyFile as Wr,readFile as Yr,writeFile as Qr}from"fs/promises";import{homedir as we,platform as Hr}from"os";import{basename as Nr,dirname as ct,join as S,resolve as Gr}from"path";import{createPatch as Fr}from"diff";import{execFileSync as ne}from"child_process";import{chmodSync as ze,existsSync as oe,mkdirSync as Ke,readFileSync as Re,rmSync as cr,writeFileSync as Ue}from"fs";import{homedir as lr,platform as sr}from"os";import{dirname as _e,join as ae}from"path";var Ie=ae(lr(),".config","atelier"),T=ae(Ie,"session.json"),R=ae(Ie,"config.json"),ie="dev.atelier.session",fr="https://atelier.mananjoshi.me/api",ur="Ov23liiscZlMXcJ2RLnd";function W(){return process.env.ATELIER_API_URL??fr}function gr(){return process.env.ATELIER_GITHUB_CLIENT_ID??ur}async function Pe(e){let t=e.apiUrl??W(),r=e.clientId??gr(),n=await br(r);await e.onPrompt({verificationUri:n.verification_uri,userCode:n.user_code,expiresIn:n.expires_in});let a=await wr(r,n,e.onPoll),i=await fetch(`${t}/auth/github/exchange`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({githubAccessToken:a})});if(!i.ok)throw new Error(`Atelier API rejected GitHub login (${i.status})`);let c=await i.json();return pr({apiUrl:t,user:c.user,token:c.token}),{apiUrl:t,user:c.user}}async function Ze(){let e=U();if(!e)return;let t=await fetch(`${e.apiUrl}/me`,{headers:{authorization:`Bearer ${e.token}`}});if(!t.ok)return;return{user:(await t.json()).user,apiUrl:e.apiUrl}}function U(){let e=Y();if(!e)return;let t=yr(e);if(!t)return;return{apiUrl:e.apiUrl,user:e.user,token:t}}function y(){return Oe().activeProfile??"personal"}function Me(e){dr({...Oe(),activeProfile:e})}function Le(){let e=Y();if(e?.tokenStorage==="keychain")Ar(e.user.id);if(oe(T))cr(T)}function Y(){if(!oe(T))return;return JSON.parse(Re(T,"utf-8"))}function Oe(){if(!oe(R))return{};return JSON.parse(Re(R,"utf-8"))}function dr(e){Ke(_e(R),{recursive:!0}),Ue(R,JSON.stringify(e,null,2)+`
4
- `,"utf-8"),ze(R,384)}function pr(e){Ke(_e(T),{recursive:!0});let t=sr()==="darwin",r={apiUrl:e.apiUrl,user:e.user,tokenStorage:t?"keychain":"file",createdAt:new Date().toISOString()};if(t)hr(e.user.id,e.token);else r.token=e.token;Ue(T,JSON.stringify(r,null,2)+`
5
- `,"utf-8"),ze(T,384)}function yr(e){if(e.tokenStorage==="file")return e.token;return vr(e.user.id)}async function br(e){let t=await fetch("https://github.com/login/device/code",{method:"POST",headers:{accept:"application/json","content-type":"application/json"},body:JSON.stringify({client_id:e,scope:"read:user user:email"})});if(!t.ok)throw new Error(`GitHub device-code request failed (${t.status})`);return t.json()}async function wr(e,t,r){let n=t.interval,a=Date.now()+t.expires_in*1000;while(Date.now()<a){await Br(n*1000),await r?.("Waiting for GitHub authorization\u2026");let i=await fetch("https://github.com/login/oauth/access_token",{method:"POST",headers:{accept:"application/json","content-type":"application/json"},body:JSON.stringify({client_id:e,device_code:t.device_code,grant_type:"urn:ietf:params:oauth:grant-type:device_code"})});if(!i.ok)throw new Error(`GitHub token polling failed (${i.status})`);let c=await i.json();if(c.access_token)return c.access_token;if(c.error==="authorization_pending")continue;if(c.error==="slow_down"){n+=5;continue}if(c.error==="access_denied")throw new Error("GitHub login was denied");if(c.error==="expired_token")throw new Error("GitHub login code expired");throw new Error(c.error_description??"GitHub login failed")}throw new Error("GitHub login timed out")}function hr(e,t){ne("security",["add-generic-password","-a",e,"-s",ie,"-w",t,"-U"],{stdio:"ignore"})}function vr(e){try{return ne("security",["find-generic-password","-a",e,"-s",ie,"-w"],{encoding:"utf-8",stdio:["ignore","pipe","ignore"]}).trim()}catch{return}}function Ar(e){try{ne("security",["delete-generic-password","-a",e,"-s",ie],{stdio:"ignore"})}catch{}}function Br(e){return new Promise((t)=>setTimeout(t,e))}async function Je(){return(await(await h("/profiles")).json()).profiles}async function Xe(e){return(await(await h("/profiles",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({name:e})})).json()).profile}async function Q(e){let t=await h(`/profiles/${encodeURIComponent(e)}`);if(t.status===404)return;return(await t.json()).profile}async function _(){return await(await h("/vault")).json()}async function We(e){await h("/vault",{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify(e)})}async function Ye(e){let t=await h(`/profiles/${encodeURIComponent(e)}/key`);if(t.status===404)return;return(await t.json()).profileKey}async function ce(e,t){return(await(await h(`/profiles/${encodeURIComponent(e)}/key`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify(t)})).json()).profileKey}async function I(e){return(await(await h(`/profiles/${encodeURIComponent(e)}/configs`)).json()).configs}async function H(e,t){let r=await h(`/profiles/${encodeURIComponent(e)}/configs/${encodeURIComponent(t)}`);if(r.status===404)return;return(await r.json()).config}async function Qe(e,t,r){return await(await h(`/profiles/${encodeURIComponent(e)}/configs/${encodeURIComponent(t)}/versions`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(r)})).json()}async function He(e,t,r){let n=await h(`/profiles/${encodeURIComponent(e)}/configs/${encodeURIComponent(t)}/versions/${encodeURIComponent(r)}/blob`);if(n.status===404)return;return await n.json()}async function h(e,t={}){let r=U();if(!r)throw new Error("Not logged in. Run `atl login`.");let n=await fetch(`${r.apiUrl}${e}`,{...t,headers:{...t.headers,authorization:`Bearer ${r.token}`}});if(!n.ok&&n.status!==404){let a=await n.json().catch(()=>{return});throw new Error(a?.error??`Atelier API request failed (${n.status})`)}return n}import{execFileSync as ue}from"child_process";import{createCipheriv as Tr,createDecipheriv as mr,randomBytes as P,scryptSync as kr}from"crypto";import{chmodSync as Cr,existsSync as Ge,mkdirSync as xr,readFileSync as $r,rmSync as Sr,writeFileSync as zr}from"fs";import{homedir as Kr,platform as ge}from"os";import{dirname as Rr,join as Fe}from"path";var de="dev.atelier.vault",Ur=Fe(Kr(),".config","atelier"),m=Fe(Ur,"vault-key.json"),Ne={N:32768,r:8,p:1},_r=67108864,le="aes-256-gcm";async function F(){let e=$();return{initialized:(await _()).initialized,unlocked:Boolean(fe(e.user.id)),activeProfile:y()}}async function pe(e,t=y()){Pr(e);let r=$();if((await _()).initialized)throw new Error("Atelier vault already exists. Run `atl vault unlock` if this machine is locked.");let a=await Q(t);if(!a)throw new Error(`Profile not found: ${t}`);let i=P(32),c=P(32),f=P(16),w=Ee(e,f,Ne),u=se(i,w),v=se(c,i);return await We({kdf:{algorithm:"scrypt",salt:N(f),params:Ne},encryptedVaultKey:u}),await ce(t,{version:1,algorithm:v.algorithm,nonce:v.nonce,encryptedKey:v.ciphertext}),ye(r.user.id,i),{profileName:a.name}}async function qe(e){let t=$(),r=await _();if(!r.initialized)throw new Error("Atelier vault is not initialized. Run `atl save <id>` or `atl vault init`.");let n=De(r,e);return ye(t.user.id,n),{activeProfile:y()}}function Ve(){let e=$();Zr(e.user.id)}async function Ir(e,t=y()){let r=$(),n=fe(r.user.id);if(n)return n;if(!e)throw new Error("Vault passphrase is required");let a=await _();if(!a.initialized){await pe(e,t);let i=fe(r.user.id);if(!i)throw new Error("Vault initialized but local key was not stored");return i}return De(a,e)}async function Z(e,t=y()){let r=await Ir(e,t),n=await Ye(t);if(n)return je(n.encryptedKey,n.nonce,r);let a=P(32),i=se(a,r);return await ce(t,{version:1,algorithm:i.algorithm,nonce:i.nonce,encryptedKey:i.ciphertext}),a}function De(e,t){if(!e.kdf||!e.encryptedVaultKey)throw new Error("Vault payload is incomplete");if(e.kdf.algorithm!=="scrypt")throw new Error(`Unsupported vault KDF: ${e.kdf.algorithm}`);let r=G(e.kdf.salt),n=Ee(t,r,e.kdf.params),a=je(e.encryptedVaultKey.ciphertext,e.encryptedVaultKey.nonce,n);return ye($().user.id,a),a}function Ee(e,t,r){return kr(e,t,32,{N:r.N,r:r.r,p:r.p,maxmem:_r})}function se(e,t){let r=P(12),n=Tr(le,t,r),a=Buffer.concat([n.update(e),n.final()]),i=n.getAuthTag();return{algorithm:le,nonce:N(r),ciphertext:N(Buffer.concat([a,i]))}}function je(e,t,r){let n=Buffer.from(G(e)),a=Buffer.from(G(t)),i=n.subarray(0,-16),c=n.subarray(-16),f=mr(le,r,a);return f.setAuthTag(c),Buffer.concat([f.update(i),f.final()])}function Pr(e){if(e.length<12)throw new Error("Vault passphrase must be at least 12 characters.")}function $(){let e=U();if(!e)throw new Error("Not logged in. Run `atl login`.");return e}function ye(e,t){let r=N(t);if(ge()==="darwin"){ue("security",["add-generic-password","-a",e,"-s",de,"-w",r,"-U"],{stdio:"ignore"});return}xr(Rr(m),{recursive:!0}),zr(m,JSON.stringify({userId:e,key:r},null,2)+`
6
- `,"utf-8"),Cr(m,384)}function fe(e){let t=ge()==="darwin"?Mr(e):Lr(e);return t?Buffer.from(G(t)):void 0}function Zr(e){if(ge()==="darwin"){try{ue("security",["delete-generic-password","-a",e,"-s",de],{stdio:"ignore"})}catch{}return}if(Ge(m))Sr(m)}function Mr(e){try{return ue("security",["find-generic-password","-a",e,"-s",de,"-w"],{encoding:"utf-8",stdio:["ignore","pipe","ignore"]}).trim()}catch{return}}function Lr(e){if(!Ge(m))return;let t=JSON.parse($r(m,"utf-8"));return t.userId===e?t.key:void 0}function N(e){return Buffer.from(e).toString("base64url")}function G(e){return new Uint8Array(Buffer.from(e,"base64url"))}var qr="aes-256-gcm",Vr=new TextDecoder("utf-8",{fatal:!0});async function lt(e,t={}){let r=t.profileName??y(),n=await Dr(r,e);if(!n)throw new Error(`Saved config not found: ${e}`);let a=await Z(t.passphrase,r),i=await ut(r,n,a,{preview:t.preview});return await ft(i,t)}async function st(e,t={}){let n=(await I(e)).filter((u)=>u.kind==="file"&&u.pathHint&&gt(u));if(n.length===0)return{profileName:e,results:[],blocked:!1,preview:Boolean(t.preview),backup:Boolean(t.backup)};let a=await Z(t.passphrase,e),i=await Promise.all(n.map((u)=>ut(e,u,a,{preview:t.preview})));if(t.preview)return{profileName:e,results:i.map((u)=>u.result),blocked:!1,preview:!0,backup:Boolean(t.backup)};if(i.some((u)=>u.result.status==="update")&&!t.backup)return{profileName:e,results:i.map((u)=>u.result.status==="update"?{...u.result,status:"blocked",reason:"local file differs; rerun with --preview to inspect or --backup to replace safely"}:u.result),blocked:!0,preview:!1,backup:!1};let f=pt(),w=[];for(let u of i)w.push(await ft(u,{...t,backupRunId:f}));return{profileName:e,results:w,blocked:!1,preview:!1,backup:Boolean(t.backup)}}async function ft(e,t){let{result:r,savedBytes:n}=e;if(r.status==="unchanged")return r;if(r.status==="create"){if(!t.preview)await et(r.targetPath,n);return{...r,reason:t.preview?"would create missing local file":"created missing local file"}}if(t.preview)return r;if(!t.backup)return{...r,status:"blocked",reason:"local file differs; rerun with --preview to inspect or --backup to replace safely"};let a=await jr(r.stableId,r.targetPath,t.backupRunId??pt());return await et(r.targetPath,n),{...r,reason:"replaced differing local file after creating backup",backupPath:a}}async function ut(e,t,r,n){if(t.kind!=="file")throw new Error(`Cannot apply non-file config: ${t.stableId}`);if(!t.pathHint)throw new Error(`Saved config has no target path: ${t.stableId}`);let a=gt(t);if(!a)throw new Error(`Saved config has no versions: ${t.stableId}`);let i=await He(e,t.stableId,a.id);if(!i)throw new Error(`Saved config blob not found: ${t.stableId}`);let c=Er(i.ciphertext,i.version.nonce,r),f=dt(t.pathHint),w=t.pathHint,u=Xr(f),v=u?await Yr(f):void 0,Se=ot(c);if(Se!==a.contentSha256)throw new Error(`Saved content hash mismatch for ${t.stableId}`);if(!u)return{savedBytes:c,result:{profileName:e,stableId:t.stableId,targetPath:f,displayPath:w,status:"create",reason:n.preview?"would create missing local file":"created missing local file",diff:tt("",c,w),version:be(a)}};if(ot(v)===Se)return{savedBytes:c,result:{profileName:e,stableId:t.stableId,targetPath:f,displayPath:w,status:"unchanged",reason:"local file already matches saved version",version:be(a)}};return{savedBytes:c,result:{profileName:e,stableId:t.stableId,targetPath:f,displayPath:w,status:"update",reason:n.preview?"would replace differing local file":"local file differs",diff:tt(v,c,w),version:be(a)}}}async function Dr(e,t){let r=await H(e,t);if(r)return r;let n=nt(t);return(await I(e)).find((i)=>i.pathHint&&nt(i.pathHint)===n)}function gt(e){return e.latestVersion??e.versions?.[0]}function Er(e,t,r){let n=Buffer.from(e,"base64url"),a=Buffer.from(t,"base64url"),i=n.subarray(0,-16),c=n.subarray(-16),f=Or(qr,r,a);return f.setAuthTag(c),Buffer.concat([f.update(i),f.final()])}async function et(e,t){it(ct(e),{recursive:!0}),await Qr(e,t)}async function jr(e,t,r){let n=S(en(),r,at(e),at(t));return it(ct(n),{recursive:!0}),await Wr(t,n),n}function en(){if(process.env.ATELIER_STATE_DIR)return S(process.env.ATELIER_STATE_DIR,"backups");if(process.env.XDG_STATE_HOME)return S(process.env.XDG_STATE_HOME,"atelier","backups");if(Hr()==="win32"&&process.env.LOCALAPPDATA)return S(process.env.LOCALAPPDATA,"Atelier","backups");return S(we(),".local","state","atelier","backups")}function tt(e,t,r){let n=typeof e==="string"?e:rt(e),a=rt(t);if(n===void 0||a===void 0)return;return Fr(`local ${r}`,n,a,"local","saved").split(`
3
+ import{stdin as P,stdout as q}from"process";import{existsSync as Ee,readFileSync as Vt,statSync as La}from"fs";import{homedir as Ma,platform as za}from"os";import{join as je,resolve as Zi}from"path";import{Command as Fa}from"commander";import{createDecipheriv as Mo,createHash as zo}from"crypto";import{existsSync as Fo,mkdirSync as Mn}from"fs";import{copyFile as Uo,readFile as _o,writeFile as Oo}from"fs/promises";import{homedir as ht,platform as Ho}from"os";import{basename as Go,dirname as zn,join as re,resolve as No}from"path";import{createPatch as Wo}from"diff";import{execFileSync as nt}from"child_process";import{chmodSync as nn,existsSync as rt,mkdirSync as rn,readFileSync as on,rmSync as eo,writeFileSync as sn}from"fs";import{homedir as to,platform as no}from"os";import{dirname as ln,join as it}from"path";var an=it(to(),".config","atelier"),Q=it(an,"session.json"),fe=it(an,"config.json"),ot="dev.atelier.session",ro="https://atelier.mananjoshi.me/api",io="Ov23liiscZlMXcJ2RLnd";function xe(){return process.env.ATELIER_API_URL??ro}function oo(){return process.env.ATELIER_GITHUB_CLIENT_ID??io}async function cn(e){let t=e.apiUrl??xe(),n=e.clientId??oo(),r=await co(n);await e.onPrompt({verificationUri:r.verification_uri,userCode:r.user_code,expiresIn:r.expires_in});let i=await uo(n,r,e.onPoll),s=await fetch(`${t}/auth/github/exchange`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({githubAccessToken:i})});if(!s.ok)throw Error(`Atelier API rejected GitHub login (${s.status})`);let l=await s.json();return lo({apiUrl:t,user:l.user,token:l.token}),{apiUrl:t,user:l.user}}async function un(){let e=ge();if(!e)return;let t=await fetch(`${e.apiUrl}/me`,{headers:{authorization:`Bearer ${e.token}`}});if(!t.ok)return;return{user:(await t.json()).user,apiUrl:e.apiUrl}}function ge(){let e=Re();if(!e)return;let t=ao(e);if(!t)return;return{apiUrl:e.apiUrl,user:e.user,token:t}}function $(){return gn().activeProfile??"personal"}function dn(e){so({...gn(),activeProfile:e})}function fn(){let e=Re();if(e?.tokenStorage==="keychain")ko(e.user.id);if(rt(Q))eo(Q)}function Re(){if(!rt(Q))return;return JSON.parse(on(Q,"utf-8"))}function gn(){if(!rt(fe))return{};return JSON.parse(on(fe,"utf-8"))}function so(e){rn(ln(fe),{recursive:!0}),sn(fe,JSON.stringify(e,null,2)+`
4
+ `,"utf-8"),nn(fe,384)}function lo(e){rn(ln(Q),{recursive:!0});let t=fo(),n={apiUrl:e.apiUrl,user:e.user,tokenStorage:t?"keychain":"file",createdAt:new Date().toISOString()};if(t)go(e.user.id,e.token);else n.token=e.token;sn(Q,JSON.stringify(n,null,2)+`
5
+ `,"utf-8"),nn(Q,384)}function ao(e){if(e.tokenStorage==="file")return e.token;return po(e.user.id)}async function co(e){let t=await fetch("https://github.com/login/device/code",{method:"POST",headers:{accept:"application/json","content-type":"application/json"},body:JSON.stringify({client_id:e,scope:"read:user user:email"})});if(!t.ok)throw Error(`GitHub device-code request failed (${t.status})`);return t.json()}async function uo(e,t,n){let r=t.interval,i=Date.now()+t.expires_in*1000;while(Date.now()<i){await yo(r*1000),await n?.("Waiting for GitHub authorization\u2026");let s=await fetch("https://github.com/login/oauth/access_token",{method:"POST",headers:{accept:"application/json","content-type":"application/json"},body:JSON.stringify({client_id:e,device_code:t.device_code,grant_type:"urn:ietf:params:oauth:grant-type:device_code"})});if(!s.ok)throw Error(`GitHub token polling failed (${s.status})`);let l=await s.json();if(l.access_token)return l.access_token;if(l.error==="authorization_pending")continue;if(l.error==="slow_down"){r+=5;continue}if(l.error==="access_denied")throw Error("GitHub login was denied");if(l.error==="expired_token")throw Error("GitHub login code expired");throw Error(l.error_description??"GitHub login failed")}throw Error("GitHub login timed out")}function fo(){return no()==="darwin"&&process.env.ATELIER_DISABLE_KEYCHAIN!=="1"}function go(e,t){nt("security",["add-generic-password","-a",e,"-s",ot,"-w",t,"-U"],{stdio:"ignore"})}function po(e){try{return nt("security",["find-generic-password","-a",e,"-s",ot,"-w"],{encoding:"utf-8",stdio:["ignore","pipe","ignore"]}).trim()}catch{return}}function ko(e){try{nt("security",["delete-generic-password","-a",e,"-s",ot],{stdio:"ignore"})}catch{}}function yo(e){return new Promise((t)=>setTimeout(t,e))}async function pn(){return(await(await U("/profiles")).json()).profiles}async function kn(e){return(await(await U("/profiles",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({name:e})})).json()).profile}async function $e(e){let t=await U(`/profiles/${encodeURIComponent(e)}`);if(t.status===404)return;return(await t.json()).profile}async function pe(){return await(await U("/vault")).json()}async function yn(e){await U("/vault",{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify(e)})}async function hn(e){let t=await U(`/profiles/${encodeURIComponent(e)}/key`);if(t.status===404)return;return(await t.json()).profileKey}async function st(e,t){return(await(await U(`/profiles/${encodeURIComponent(e)}/key`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify(t)})).json()).profileKey}async function ke(e,t={}){let r=await(await U(`/profiles/${encodeURIComponent(e)}/configs`)).json();return t.includeInternal?r.configs:r.configs.filter((i)=>i.kind!=="folder-file")}async function Pe(e,t){let n=await U(`/profiles/${encodeURIComponent(e)}/configs/${encodeURIComponent(t)}`);if(n.status===404)return;return(await n.json()).config}async function mn(e,t,n){return await(await U(`/profiles/${encodeURIComponent(e)}/configs/${encodeURIComponent(t)}/versions`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(n)})).json()}async function Ke(e,t,n){let r=await U(`/profiles/${encodeURIComponent(e)}/configs/${encodeURIComponent(t)}/versions/${encodeURIComponent(n)}/blob`);if(r.status===404)return;return await r.json()}async function Sn(e={}){let t=e.includeInternal?"?includeInternal=true":"";return(await(await U(`/skills${t}`)).json()).skills}async function bn(e,t){return await(await U(`/skills/${encodeURIComponent(e)}/versions`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(t)})).json()}async function lt(e,t){let n=await U(`/skills/${encodeURIComponent(e)}/versions/${encodeURIComponent(t)}/blob`);if(n.status===404)return;return await n.json()}async function U(e,t={}){let n=ge();if(!n)throw Error("Not logged in. Run `atl login`.");let r=await fetch(`${n.apiUrl}${e}`,{...t,headers:{...t.headers,authorization:`Bearer ${n.token}`}});if(!r.ok&&r.status!==404){let i=await r.json().catch(()=>{return});throw Error(i?.error??`Atelier API request failed (${r.status})`)}return r}import{execFileSync as dt}from"child_process";import{createCipheriv as ho,createDecipheriv as mo,randomBytes as ye,scryptSync as So}from"crypto";import{chmodSync as bo,existsSync as vn,mkdirSync as wo,readFileSync as vo,rmSync as Ao,writeFileSync as To}from"fs";import{homedir as Io,platform as Co}from"os";import{dirname as Bo,join as An}from"path";var ft="dev.atelier.vault",xo=An(Io(),".config","atelier"),D=An(xo,"vault-key.json"),wn={N:32768,r:8,p:1},Ro=67108864,at="aes-256-gcm";async function ze(){let e=ne();return{initialized:(await pe()).initialized,unlocked:Boolean(ut(e.user.id)),activeProfile:$()}}async function gt(e,t=$()){$o(e);let n=ne();if((await pe()).initialized)throw Error("Atelier vault already exists. Run `atl vault unlock` if this machine is locked.");let i=await $e(t);if(!i)throw Error(`Profile not found: ${t}`);let s=ye(32),l=ye(32),a=ye(16),u=Bn(e,a,wn),c=ct(s,u),y=ct(l,s);return await yn({kdf:{algorithm:"scrypt",salt:Le(a),params:wn},encryptedVaultKey:c}),await st(t,{version:1,algorithm:y.algorithm,nonce:y.nonce,encryptedKey:y.ciphertext}),pt(n.user.id,s),{profileName:i.name}}async function Tn(e){let t=ne(),n=await pe();if(!n.initialized)throw Error("Atelier vault is not initialized. Run `atl save <id>` or `atl vault init`.");let r=Cn(n,e);return pt(t.user.id,r),{activeProfile:$()}}function In(){let e=ne();Po(e.user.id)}async function ee(e,t=$()){let n=ne(),r=ut(n.user.id);if(r)return r;if(!e)throw Error("Vault passphrase is required");let i=await pe();if(!i.initialized){await gt(e,t);let s=ut(n.user.id);if(!s)throw Error("Vault initialized but local key was not stored");return s}return Cn(i,e)}async function te(e,t=$()){let n=await ee(e,t),r=await hn(t);if(r)return xn(r.encryptedKey,r.nonce,n);let i=ye(32),s=ct(i,n);return await st(t,{version:1,algorithm:s.algorithm,nonce:s.nonce,encryptedKey:s.ciphertext}),i}function Cn(e,t){if(!e.kdf||!e.encryptedVaultKey)throw Error("Vault payload is incomplete");if(e.kdf.algorithm!=="scrypt")throw Error(`Unsupported vault KDF: ${e.kdf.algorithm}`);let n=Me(e.kdf.salt),r=Bn(t,n,e.kdf.params),i=xn(e.encryptedVaultKey.ciphertext,e.encryptedVaultKey.nonce,r);return pt(ne().user.id,i),i}function Bn(e,t,n){return So(e,t,32,{N:n.N,r:n.r,p:n.p,maxmem:Ro})}function ct(e,t){let n=ye(12),r=ho(at,t,n),i=Buffer.concat([r.update(e),r.final()]),s=r.getAuthTag();return{algorithm:at,nonce:Le(n),ciphertext:Le(Buffer.concat([i,s]))}}function xn(e,t,n){let r=Buffer.from(Me(e)),i=Buffer.from(Me(t)),s=r.subarray(0,-16),l=r.subarray(-16),a=mo(at,n,i);return a.setAuthTag(l),Buffer.concat([a.update(s),a.final()])}function $o(e){if(e.length<12)throw Error("Vault passphrase must be at least 12 characters.")}function ne(){let e=ge();if(!e)throw Error("Not logged in. Run `atl login`.");return e}function pt(e,t){let n=Le(t);if(kt()){dt("security",["add-generic-password","-a",e,"-s",ft,"-w",n,"-U"],{stdio:"ignore"});return}wo(Bo(D),{recursive:!0}),To(D,JSON.stringify({userId:e,key:n},null,2)+`
6
+ `,"utf-8"),bo(D,384)}function ut(e){let t=kt()?Ko(e):Lo(e);return t?Buffer.from(Me(t)):void 0}function Po(e){if(kt()){try{dt("security",["delete-generic-password","-a",e,"-s",ft],{stdio:"ignore"})}catch{}return}if(vn(D))Ao(D)}function kt(){return Co()==="darwin"&&process.env.ATELIER_DISABLE_KEYCHAIN!=="1"}function Ko(e){try{return dt("security",["find-generic-password","-a",e,"-s",ft,"-w"],{encoding:"utf-8",stdio:["ignore","pipe","ignore"]}).trim()}catch{return}}function Lo(e){if(!vn(D))return;let t=JSON.parse(vo(D,"utf-8"));return t.userId===e?t.key:void 0}function Le(e){return Buffer.from(e).toString("base64url")}function Me(e){return new Uint8Array(Buffer.from(e,"base64url"))}var Jo="aes-256-gcm",Zo=new TextDecoder("utf-8",{fatal:!0});async function Fn(e,t={}){let n=t.profileName??$(),r=await Do(n,e);if(!r)throw Error(`Saved config not found: ${e}`);let i=await te(t.passphrase,n);if(r.kind==="folder-manifest")return await Xo(n,r,i,t);let s=await St(n,r,i,{preview:t.preview});return await Hn(s,t)}async function Un(e,t={}){let r=(await ke(e)).filter((l)=>(l.kind==="file"||l.kind==="folder-manifest")&&l.pathHint&&bt(l));if(r.length===0)return{profileName:e,results:[],blocked:!1,preview:Boolean(t.preview),backup:Boolean(t.backup)};let i=await te(t.passphrase,e),s=await Promise.all(r.map((l)=>qo(e,l,i,{preview:t.preview})));return await On(e,s.flat(),t)}async function Xo(e,t,n,r){if(!t.pathHint)throw Error(`Saved folder has no target path: ${t.stableId}`);let i=await _n(e,t,n,{preview:r.preview});return{...await On(e,i,r),stableId:t.stableId,displayPath:t.pathHint}}async function qo(e,t,n,r){if(t.kind==="folder-manifest")return await _n(e,t,n,r);return[await St(e,t,n,r)]}async function _n(e,t,n,r){let i=await Qo(e,t,n),s=[];for(let l of i.files)s.push(await Yo(e,l.stableId,l.pathHint,l.versionId,l.contentSha256,n,r));return s}async function On(e,t,n){if(n.preview)return{profileName:e,results:t.map((l)=>l.result),blocked:!1,preview:!0,backup:Boolean(n.backup)};if(t.some((l)=>l.result.status==="update")&&!n.backup)return{profileName:e,results:t.map((l)=>{if(l.result.status==="update")return{...l.result,status:"blocked",reason:"local file differs; rerun with --preview to inspect or --backup to replace safely"};if(l.result.status==="create")return{...l.result,reason:"would create missing local file after blocked changes are resolved"};return l.result}),blocked:!0,preview:!1,backup:!1};let i=Wn(),s=[];for(let l of t)s.push(await Hn(l,{...n,backupRunId:i}));return{profileName:e,results:s,blocked:!1,preview:!1,backup:Boolean(n.backup)}}async function Hn(e,t){let{result:n,savedBytes:r}=e;if(n.status==="unchanged")return n;if(n.status==="create"){if(!t.preview)await Rn(n.targetPath,r);return{...n,reason:t.preview?"would create missing local file":"created missing local file"}}if(t.preview)return n;if(!t.backup)return{...n,status:"blocked",reason:"local file differs; rerun with --preview to inspect or --backup to replace safely"};let i=await jo(n.stableId,n.targetPath,t.backupRunId??Wn());return await Rn(n.targetPath,r),{...n,reason:"replaced differing local file after creating backup",backupPath:i}}async function Yo(e,t,n,r,i,s,l){let a=await Ke(e,t,r);if(!a)throw Error(`Saved folder file blob not found: ${t}`);if(a.version.contentSha256!==i)throw Error(`Saved folder file hash mismatch for ${t}`);return await St(e,{id:t,stableId:t,kind:"file",pathHint:n,latestVersion:a.version},s,l,a.ciphertext)}async function St(e,t,n,r,i){if(t.kind!=="file")throw Error(`Cannot apply non-file config: ${t.stableId}`);if(!t.pathHint)throw Error(`Saved config has no target path: ${t.stableId}`);let s=bt(t);if(!s)throw Error(`Saved config has no versions: ${t.stableId}`);let l=i?{version:s,ciphertext:i}:await Ke(e,t.stableId,s.id);if(!l)throw Error(`Saved config blob not found: ${t.stableId}`);let a=Gn(l.ciphertext,l.version.nonce,n),u=Nn(t.pathHint),c=t.pathHint,y=Fo(u),k=y?await _o(u):void 0,p=mt(a);if(p!==s.contentSha256)throw Error(`Saved content hash mismatch for ${t.stableId}`);if(!y)return{savedBytes:a,result:{profileName:e,stableId:t.stableId,targetPath:u,displayPath:c,status:"create",reason:r.preview?"would create missing local file":"created missing local file",diff:$n("",a,c),version:yt(s)}};if(mt(k)===p)return{savedBytes:a,result:{profileName:e,stableId:t.stableId,targetPath:u,displayPath:c,status:"unchanged",reason:"local file already matches saved version",version:yt(s)}};return{savedBytes:a,result:{profileName:e,stableId:t.stableId,targetPath:u,displayPath:c,status:"update",reason:r.preview?"would replace differing local file":"local file differs",diff:$n(k,a,c),version:yt(s)}}}async function Qo(e,t,n){let r=bt(t);if(!r)throw Error(`Saved folder has no versions: ${t.stableId}`);let i=await Ke(e,t.stableId,r.id);if(!i)throw Error(`Saved folder manifest blob not found: ${t.stableId}`);let s=Gn(i.ciphertext,i.version.nonce,n);if(mt(s)!==r.contentSha256)throw Error(`Saved folder manifest hash mismatch for ${t.stableId}`);let a=JSON.parse(s.toString("utf-8"));if(a.version!==1||!Array.isArray(a.files))throw Error(`Invalid folder manifest: ${t.stableId}`);if(a.files.some((u)=>!u.stableId||!u.pathHint||!u.versionId||!u.contentSha256))throw Error(`Invalid folder manifest entries: ${t.stableId}`);return a}async function Do(e,t){let n=await Pe(e,t);if(n)return n;let r=Kn(t);return(await ke(e)).find((s)=>s.pathHint&&Kn(s.pathHint)===r)}function bt(e){return e.latestVersion??e.versions?.[0]}function Gn(e,t,n){let r=Buffer.from(e,"base64url"),i=Buffer.from(t,"base64url"),s=r.subarray(0,-16),l=r.subarray(-16),a=Mo(Jo,n,i);return a.setAuthTag(l),Buffer.concat([a.update(s),a.final()])}async function Rn(e,t){Mn(zn(e),{recursive:!0}),await Oo(e,t)}async function jo(e,t,n){let r=re(Eo(),n,Ln(e),Ln(t));return Mn(zn(r),{recursive:!0}),await Uo(t,r),r}function Eo(){if(process.env.ATELIER_STATE_DIR)return re(process.env.ATELIER_STATE_DIR,"backups");if(process.env.XDG_STATE_HOME)return re(process.env.XDG_STATE_HOME,"atelier","backups");if(Ho()==="win32"&&process.env.LOCALAPPDATA)return re(process.env.LOCALAPPDATA,"Atelier","backups");return re(ht(),".local","state","atelier","backups")}function $n(e,t,n){let r=typeof e==="string"?e:Pn(e),i=Pn(t);if(r===void 0||i===void 0)return;return Wo(`local ${n}`,r,i,"local","saved").split(`
7
7
  `).slice(2).join(`
8
- `)}function rt(e){if(e.includes(0))return;try{return Vr.decode(e)}catch{return}}function dt(e){if(e==="~")return we();if(e.startsWith("~/"))return S(we(),e.slice(2));return Gr(e)}function nt(e){return dt(e).toLowerCase()}function ot(e){return Jr("sha256").update(e).digest("hex")}function be(e){return{id:e.id,contentSha256:e.contentSha256,sizeBytes:e.sizeBytes,createdAt:e.createdAt}}function pt(){return new Date().toISOString().replaceAll(":","-").replaceAll(".","-")}function at(e){return e.replace(/[^a-zA-Z0-9._-]+/g,"_").replace(/^_+|_+$/g,"")||Nr(e)||"item"}import{createCipheriv as nn,createHash as on,randomBytes as an}from"crypto";import{readFile as cn}from"fs/promises";function yt(e){let t=[];if(!e.exists)t.push("file does not exist");if(e.isDirectory||e.kind==="directory"||e.format==="directory")t.push("directory saving is not supported yet");if(e.kind==="generated")t.push("generated/cache files are not saved");if(e.kind==="private"||e.shareability==="private")t.push("private/auth files are blocked");if(e.secretFindings.length>0)t.push("detected secret material");if(e.size!==void 0&&e.size>1048576)t.push(`file is larger than ${rn(1048576)}`);if(tn(e))t.push("binary files are not supported yet");return{ok:t.length===0,reasons:t}}function he(e){let t=yt(e);if(!t.ok)throw new Error(`Cannot save ${e.id}: ${t.reasons.join("; ")}`)}function tn(e){if(e.previewSuppressedReason?.toLowerCase().includes("binary"))return!0;return["binary","sqlite","db"].includes(e.format.toLowerCase())}function rn(e){if(e<1024)return`${e} B`;let t=e/1024;if(t<1024)return`${Math.round(t)} KiB`;return`${Math.round(t/1024)} MiB`}var bt="aes-256-gcm";async function vt(e,t={}){he(e);let r=y(),n=await Z(t.passphrase,r),a=await cn(e.path),i=ln(a,n),c=await Qe(r,e.id,{kind:"file",pathHint:e.displayPath,contentSha256:wt(a),ciphertextSha256:wt(i.ciphertextBytes),sizeBytes:a.byteLength,algorithm:i.algorithm,profileKeyVersion:1,nonce:i.nonce,ciphertext:i.ciphertext});return{profileName:r,stableId:e.id,version:c.version,reused:c.reused}}function ln(e,t){let r=an(12),n=nn(bt,t,r),a=Buffer.concat([n.update(e),n.final()]),i=n.getAuthTag(),c=Buffer.concat([a,i]);return{algorithm:bt,nonce:ht(r),ciphertext:ht(c),ciphertextBytes:c}}function wt(e){return on("sha256").update(e).digest("hex")}function ht(e){return Buffer.from(e).toString("base64url")}import{execFileSync as $t}from"child_process";import{existsSync as C,lstatSync as gn,mkdirSync as dn,readdirSync as Be,readFileSync as M,statSync as z,writeFileSync as pn}from"fs";import{homedir as yn,userInfo as bn}from"os";import{dirname as St,join as k,relative as zt,resolve as wn}from"path";var At=[{domain:"AI Tools",app:"Pi",items:[{id:"pi.dir",path:"~/.pi",kind:"directory",format:"directory",shareability:"machine-specific"}]},{domain:"Shell",app:"Starship",items:[{id:"starship.config",path:"~/.config/starship.toml",kind:"config",format:"toml",shareability:"shareable"}]},{domain:"Editors",app:"Zed",items:[{id:"zed.dir",path:"~/.config/zed",kind:"directory",format:"directory",shareability:"shareable"},{id:"zed.settings",path:"~/.config/zed/settings.json",kind:"config",format:"jsonc",shareability:"shareable"},{id:"zed.themes",path:"~/.config/zed/themes",kind:"config",format:"directory",shareability:"shareable"},{id:"zed.prompts",path:"~/.config/zed/prompts",kind:"generated",format:"directory",shareability:"machine-specific"}]},{domain:"Git",app:"Git",items:[{id:"git.config",path:"~/.gitconfig",kind:"config",format:"gitconfig",shareability:"machine-specific"},{id:"git.config-dir",path:"~/.config/git",kind:"directory",format:"directory",shareability:"machine-specific"},{id:"git.ignore",path:"~/.gitignore",kind:"config",format:"gitignore",shareability:"machine-specific"}]},{domain:"Private/Auth",app:"Credentials",privateByDefault:!0,items:[{id:"auth.ssh",path:"~/.ssh",kind:"private",format:"directory",shareability:"private"},{id:"auth.aws",path:"~/.aws",kind:"private",format:"directory",shareability:"private"},{id:"auth.gh",path:"~/.config/gh",kind:"private",format:"directory",shareability:"private"},{id:"auth.gcloud-adc",path:"~/.config/gcloud/application_default_credentials.json",kind:"private",format:"json",shareability:"private"},{id:"auth.docker",path:"~/.docker/config.json",kind:"private",format:"json",shareability:"private"},{id:"auth.pi",path:"~/.config/pi/auth.json",kind:"private",format:"json",shareability:"private"}]},{domain:"Shell",app:"Zsh",items:[{id:"zsh.home-rc",path:"~/.zshrc",kind:"config",format:"shell",shareability:"shareable"},{id:"zsh.home-env",path:"~/.zshenv",kind:"config",format:"shell",shareability:"private"},{id:"zsh.dir",path:"~/.config/zsh",kind:"directory",format:"directory",shareability:"machine-specific"},{id:"zsh.env",path:"~/.config/zsh/.zshenv",kind:"config",format:"shell",shareability:"private"},{id:"zsh.rc",path:"~/.config/zsh/.zshrc",kind:"config",format:"shell",shareability:"shareable"},{id:"zsh.conf",path:"~/.config/zsh/conf.d",kind:"directory",format:"directory",shareability:"shareable"},{id:"zsh.zcompdump",path:"~/.config/zsh/.zcompdump",kind:"generated",format:"text",shareability:"machine-specific"},{id:"zsh.sessions",path:"~/.config/zsh/.zsh_sessions",kind:"generated",format:"directory",shareability:"machine-specific"}]},{domain:"Terminals",app:"cmux",items:[{id:"cmux.dir",path:"~/.config/cmux",kind:"directory",format:"directory",shareability:"shareable"},{id:"cmux.config",path:"~/.config/cmux/cmux.json",kind:"config",format:"jsonc",shareability:"shareable"},{id:"cmux.ghostty",path:"~/Library/Application Support/com.cmuxterm.app/config.ghostty",kind:"config",format:"ghostty",shareability:"shareable"},{id:"cmux.browser-history",path:"~/Library/Application Support/com.cmuxterm.app/browser_history.json",kind:"generated",format:"json",shareability:"machine-specific"}]}];var ve=[["GitHub token",/gh[pousr]_[A-Za-z0-9_]{20,}/g],["Slack token",/xox[baprs]-[A-Za-z0-9-]{20,}/g],["AWS access key",/AKIA[0-9A-Z]{16}/g],["Private key",/-----BEGIN (?:RSA |OPENSSH |EC |DSA )?PRIVATE KEY-----/g],["Generic token assignment",/(?:token|api[_-]?key|secret|webhook|password)\s*[=:]\s*["']?[^"'\s]{12,}/gi]];function Bt(e){let t=[],r=e.split(/\r?\n/);for(let[n,a]of ve)for(let i of e.matchAll(a)){let c=i.index??0,f=e.slice(0,c).split(/\r?\n/).length;t.push({type:n,line:f,preview:q(i[0])})}return r.forEach((n,a)=>{for(let i of n.matchAll(/[A-Za-z0-9_+\/=.-]{32,}/g)){let c=i[0];if(!sn(c,n)&&mt(c,n))t.push({type:"High-entropy string",line:a+1,preview:q(c)})}}),un(t)}function q(e){if(e.length<=8)return"[redacted]";return`${e.slice(0,4)}\u2026${e.slice(-4)}`}function Tt(e){let t=e;for(let[,r]of ve)t=t.replace(r,(n)=>q(n));return t=t.replace(/[A-Za-z0-9_+\/=.-]{32,}/g,(r)=>{if(mt(r,e))return q(r);return r}),t}function sn(e,t){return ve.some(([,r])=>{return r.lastIndex=0,Array.from(t.matchAll(r)).some((n)=>n[0].includes(e)||e.includes(n[0]))})}function mt(e,t){if(e.startsWith("amazon."))return!1;if(e.includes("anthropic.claude"))return!1;if(/^[A-Za-z0-9.-]+@[A-Za-z0-9.-]+$/.test(e))return!1;if(/model/i.test(t)&&/^[A-Za-z0-9_.-]+$/.test(e))return!1;return fn(e)>4.2&&/[A-Za-z]/.test(e)&&/[0-9]/.test(e)}function fn(e){let t=new Map;for(let n of e)t.set(n,(t.get(n)??0)+1);let r=0;for(let n of t.values()){let a=n/e.length;r-=a*Math.log2(a)}return r}function un(e){let t=new Set;return e.filter((r)=>{let n=`${r.type}:${r.line}:${r.preview}`;if(t.has(n))return!1;return t.add(n),!0})}function kt(e){let n=e.replace(/\/\*[\s\S]*?\*\//g,"").replace(/(^|[^:])\/\/.*$/gm,"$1").replace(/,\s*([}\]])/g,"$1");return JSON.parse(n)}var x=yn(),hn=new Set([".zsh",".zshrc",".zshenv",".sh",".json",".jsonc",".toml",".md",".yml",".yaml",".gitconfig",".gitignore",".ghostty",""]),vn=[/cache/i,/history/i,/session/i,/state/i,/\.mdb$/i,/\.sqlite/i,/\.db$/i,/zcompdump/i,/logs?/i],An=[/credential/i,/secret/i,/token/i,/auth\.json$/i,/hosts\.yml$/i,/config\.json$/i],D;async function Kt(e){D=e.includeLegacyManagers?Un():void 0;let r=Bn(e.repoRoot).flatMap((i)=>i.items.map((c)=>({definition:i,item:c}))),n=new Set,a=[];for(let{definition:i,item:c}of r){let f=Ae(c.path);n.add(f),a.push(Tn(i,c,f))}for(let i of mn()){if(n.has(i.path))continue;n.add(i.path),a.push(Ct(i))}for(let i of e.manualPaths??[]){let c=Ae(i);if(n.has(c))continue;n.add(c),a.push(Ct({path:c,reason:"manual path"}))}return a.sort((i,c)=>`${i.domain}:${i.app}:${i.path}`.localeCompare(`${c.domain}:${c.app}:${c.path}`)),{version:1,generatedAt:new Date().toISOString(),repoRoot:e.repoRoot,home:x,items:a,summary:{total:a.length,existing:a.filter((i)=>i.exists).length,secrets:a.filter((i)=>i.secretFindings.length>0).length,drift:a.filter((i)=>i.mirrors.some((c)=>c.exists&&c.identical===!1)).length,generated:a.filter((i)=>i.kind==="generated").length,private:a.filter((i)=>i.shareability==="private").length}}}function Rt(e,t={}){let r=t.path??k(e.repoRoot,".atelier","state","inventory.json");return dn(St(r),{recursive:!0}),pn(r,JSON.stringify(e,null,2)+`
9
- `,"utf-8"),r}function Bn(e){let t=k(e,"packages","registry","definitions");if(!C(t))return At;return Be(t).filter((r)=>r.endsWith(".jsonc")).map((r)=>kt(M(k(t,r),"utf-8")))}function Tn(e,t,r){return Ut({path:r,domain:e.domain,app:e.app,kind:t.kind,format:t.format,shareability:t.shareability,reason:"registry match",mirrors:t.mirrors??[],privateByDefault:e.privateByDefault,id:t.id})}function Ct(e){let t=In(e.path),r=Zn(e.path),n=Mn(e.path,r);return Ut({path:e.path,domain:Pn(e.path),app:t,kind:r,format:Ln(e.path),shareability:n,reason:e.reason,mirrors:[],privateByDefault:n==="private"})}function Ut(e){let t=C(e.path),r=t?gn(e.path):void 0,n=t?z(e.path):void 0,a=!!n?.isDirectory(),i=!!r?.isSymbolicLink(),c=t&&!a&&_t(e.path)?Bt(M(e.path,"utf-8")):[],f=e.mirrors.map((v)=>Cn(e.path,Ae(v))),w=Sn(e.kind,e.shareability,c.length,f),u=$n(e.path,t,a,e.shareability,e.privateByDefault,e.kind);return{id:e.id??_n(e.path),domain:e.domain,app:e.app,path:e.path,displayPath:L(e.path),kind:e.kind,format:e.format,shareability:e.shareability,exists:t,isDirectory:a,isSymlink:i,mode:n?`0${(n.mode&511).toString(8)}`:void 0,owner:t?bn().username:void 0,size:n?.size,git:t?zn(e.path):void 0,legacyManagers:t?Kn(e.path):{},mirrors:f,secretFindings:c,...u,recommendation:w,reason:e.reason}}function mn(){let e=[],t=k(x,".config");if(!C(t))return e;for(let r of Be(t,{withFileTypes:!0})){if(r.name.startsWith("."))continue;let n=k(t,r.name);if(e.push({path:n,reason:"~/.config app directory"}),!r.isDirectory())continue;for(let a of kn(n).slice(0,80)){let i=k(n,a.name);if(Te(i)){e.push({path:i,reason:"generated/app-state candidate"});continue}if(a.isFile()&&me(a.name))e.push({path:i,reason:"shallow ~/.config config candidate"});if(a.isDirectory()&&["conf.d","themes","snippets","plugins"].includes(a.name))e.push({path:i,reason:"shallow ~/.config config directory"})}}return e}function kn(e){try{return Be(e,{withFileTypes:!0})}catch{return[]}}function Cn(e,t){let r=C(t);if(!r||!C(e)||z(e).isDirectory()||z(t).isDirectory())return{path:t,displayPath:L(t),exists:r};let n=M(e,"utf-8"),a=M(t,"utf-8");return{path:t,displayPath:L(t),exists:r,identical:n===a,diff:n===a?void 0:xn(a,n)}}function xn(e,t){let r=e.split(/\r?\n/),n=t.split(/\r?\n/),a=Math.max(r.length,n.length),i=[];for(let c=0;c<a;c++){if(r[c]===n[c])continue;if(r[c]!==void 0)i.push(`-${r[c]}`);if(n[c]!==void 0)i.push(`+${n[c]}`)}return i.slice(0,200).join(`
10
- `)}function $n(e,t,r,n,a,i){if(!t)return{previewSuppressedReason:"missing"};if(r)return{previewSuppressedReason:"directory"};if(n==="private"||a||i==="private")return{previewSuppressedReason:"private/auth metadata-only"};if(!_t(e))return{previewSuppressedReason:"binary or unsupported file type"};let c=M(e,"utf-8");return{preview:Tt(c).slice(0,20000)}}function Sn(e,t,r,n){if(r>0)return"rotate-secret";if(e==="generated")return"ignore-generated";if(t==="private")return"mark-private";if(n.some((a)=>a.exists&&a.identical===!1))return"resolve-drift";if(t==="machine-specific")return"review-machine-specific";if(e==="config"||e==="directory")return"adopt-candidate";return"none"}function zn(e){let t=z(e).isDirectory()?e:St(e),r=V(["rev-parse","--show-toplevel"],t);if(!r)return;let n=zt(r,e),a=!!V(["check-ignore","-q",n],r,!0),i=!!V(["ls-files","--error-unmatch",n],r,!0),c=i&&!!V(["status","--porcelain","--",n],r);return{root:r,tracked:i,modified:c,ignored:a}}function Kn(e){if(!D)return{};return{yadm:Rn(e)}}function Rn(e){let t=L(e).replace(/^~\//,"");if(D?.modified.has(t))return"modified";if(D?.tracked.has(t))return"tracked";return"unknown"}function Un(){let e=new Set((xt("yadm",["ls-files"])??"").split(`
11
- `).filter(Boolean)),t=new Set((xt("yadm",["status","--porcelain"])??"").split(`
12
- `).map((r)=>r.slice(3).trim()).filter(Boolean));return{tracked:e,modified:t}}function V(e,t,r=!1){try{return $t("git",e,{cwd:t,encoding:"utf-8",stdio:["ignore","pipe","ignore"]}).trim()||(r?"ok":void 0)}catch{return}}function xt(e,t){try{return $t(e,t,{cwd:x,encoding:"utf-8",stdio:["ignore","pipe","ignore"]})}catch{return}}function Ae(e){return wn(e.replace(/^~(?=\/|$)/,x))}function L(e){return e.startsWith(x)?`~${e.slice(x.length)}`:e}function _n(e){return L(e).replace(/[^A-Za-z0-9_.-]+/g,":")}function In(e){let t=zt(k(x,".config"),e);if(!t.startsWith(".."))return t.split(/[\\/]/)[0]||"Unknown";return"Unknown"}function Pn(e){if(e.includes("/.config/"))return"~/.config";if(e.includes("/.ssh")||e.includes("/.aws"))return"Private/Auth";return"Unknown"}function Zn(e){if(Te(e))return"generated";if(An.some((t)=>t.test(e)))return"private";if(C(e)&&z(e).isDirectory())return"directory";if(me(e))return"config";return"unknown"}function Mn(e,t){if(t==="private")return"private";if(t==="generated")return"machine-specific";if(e.includes("/credentials")||e.includes("/.ssh")||e.includes("/.aws"))return"private";return"machine-specific"}function Ln(e){if(C(e)&&z(e).isDirectory())return"directory";if(e.endsWith(".jsonc"))return"jsonc";if(e.endsWith(".json"))return"json";if(e.endsWith(".toml"))return"toml";if(e.endsWith(".zsh"))return"shell";if(e.endsWith(".md"))return"markdown";return"text"}function Te(e){return vn.some((t)=>t.test(e))}function me(e){return/(^config\.|settings\.|rc$|\.rc$|\.zshrc$|\.zshenv$|\.jsonc?$|\.toml$|\.ya?ml$|\.zsh$|\.conf$|\.ini$)/i.test(e)}function _t(e){let t=e.split("/").pop()??"";if(Te(e))return!1;if(t.includes("lock")||t.endsWith(".mdb")||t.endsWith(".sqlite")||t.endsWith(".db"))return!1;let r=t.includes(".")?t.slice(t.lastIndexOf(".")):"";return hn.has(r)||me(t)}import{Box as s,Text as l,render as On}from"ink";import{jsxDEV as o,Fragment as Nn}from"react/jsx-dev-runtime";function g(e){return On(o(Nn,{children:e},void 0,!1,void 0,this)).waitUntilExit()}function ke({inventory:e,path:t}){return o(s,{flexDirection:"column",gap:1,children:[o(b,{title:"Scan complete",subtitle:t},void 0,!1,void 0,this),o(s,{gap:2,children:[o(K,{label:"total",value:e.summary.total,color:"cyan"},void 0,!1,void 0,this),o(K,{label:"existing",value:e.summary.existing,color:"green"},void 0,!1,void 0,this),o(K,{label:"private",value:e.summary.private,color:"red"},void 0,!1,void 0,this),o(K,{label:"generated",value:e.summary.generated,color:"magenta"},void 0,!1,void 0,this),o(K,{label:"secrets",value:e.summary.secrets,color:"red"},void 0,!1,void 0,this),o(K,{label:"drift",value:e.summary.drift,color:"blue"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)}function Pt({items:e,title:t}){return o(s,{flexDirection:"column",children:[o(b,{title:t,subtitle:`${e.length} item${e.length===1?"":"s"}`},void 0,!1,void 0,this),o(s,{flexDirection:"column",marginTop:1,children:e.map((r)=>o(s,{gap:1,children:[o(l,{color:r.exists?"white":"gray",children:r.exists?"\u25CF":"\u25CB"},void 0,!1,void 0,this),o(l,{color:qt(r),children:r.domain},void 0,!1,void 0,this),o(l,{color:"gray",children:"/"},void 0,!1,void 0,this),o(l,{color:"cyan",children:r.app},void 0,!1,void 0,this),o(l,{children:r.displayPath},void 0,!1,void 0,this),o(A,{label:r.shareability,color:Vt(r.shareability)},void 0,!1,void 0,this),r.secretFindings.length>0?o(A,{label:"secret",color:"red"},void 0,!1,void 0,this):null,r.mirrors.some((n)=>n.exists&&n.identical===!1)?o(A,{label:"drift",color:"blue"},void 0,!1,void 0,this):null]},r.id,!0,void 0,this))},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}function Zt({item:e}){return o(s,{flexDirection:"column",gap:1,children:[o(b,{title:e.app,subtitle:e.displayPath},void 0,!1,void 0,this),o(s,{gap:1,children:[o(A,{label:e.domain,color:"cyan"},void 0,!1,void 0,this),o(A,{label:e.kind,color:qt(e)},void 0,!1,void 0,this),o(A,{label:e.shareability,color:Vt(e.shareability)},void 0,!1,void 0,this),o(A,{label:e.recommendation,color:"yellow"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),o(Jn,{rows:[["reason",e.reason],["exists",String(e.exists)],["mode",e.mode??"\u2014"],["symlink",String(e.isSymlink)],["git",Hn(e)],["legacy",Qn(e)]]},void 0,!1,void 0,this),e.secretFindings.length>0?o(s,{flexDirection:"column",children:[o(l,{color:"red",bold:!0,children:"Secret warnings"},void 0,!1,void 0,this),e.secretFindings.map((t,r)=>o(l,{color:"red",children:[" ",t.type,t.line?` line ${t.line}`:"",": ",t.preview]},`${t.type}-${r}`,!0,void 0,this))]},void 0,!0,void 0,this):null,e.mirrors.length>0?o(s,{flexDirection:"column",children:[o(l,{color:"blue",bold:!0,children:"Mirrors"},void 0,!1,void 0,this),e.mirrors.map((t)=>o(l,{children:[" ",t.displayPath," \u2014 ",t.exists?t.identical===!1?"differs":"identical":"missing"]},t.path,!0,void 0,this))]},void 0,!0,void 0,this):null,o(s,{flexDirection:"column",children:[o(l,{bold:!0,children:e.preview?"Safe preview":"Preview"},void 0,!1,void 0,this),o(l,{color:e.preview?"white":"gray",children:e.preview?e.preview.slice(0,3000):`Suppressed: ${e.previewSuppressedReason??"not available"}`},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)}function Mt({verificationUri:e,userCode:t,expiresIn:r}){return o(s,{flexDirection:"column",gap:1,children:[o(b,{title:"Login with GitHub",subtitle:`code expires in ${Math.round(r/60)} minutes`},void 0,!1,void 0,this),o(s,{flexDirection:"column",children:[o(l,{children:"Open:"},void 0,!1,void 0,this),o(l,{color:"blue",underline:!0,children:e},void 0,!1,void 0,this)]},void 0,!0,void 0,this),o(s,{gap:1,children:[o(l,{children:"Enter code:"},void 0,!1,void 0,this),o(l,{color:"green",bold:!0,children:t},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)}function Lt({login:e,apiUrl:t}){return o(s,{flexDirection:"column",children:[o(b,{title:"Logged in",subtitle:t},void 0,!1,void 0,this),o(l,{color:"green",children:["\u2713 ",e]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)}function Ot({login:e,apiUrl:t}){if(!e)return o(l,{color:"yellow",children:"Not logged in. Run `atl login`."},void 0,!1,void 0,this);return o(s,{flexDirection:"column",children:[o(b,{title:"Current account",subtitle:t},void 0,!1,void 0,this),o(l,{color:"green",children:e},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}function Jt(){return o(l,{color:"green",children:"\u2713 Logged out"},void 0,!1,void 0,this)}function Xt({profiles:e,activeProfile:t}){return o(s,{flexDirection:"column",children:[o(b,{title:"Profiles",subtitle:`active: ${t}`},void 0,!1,void 0,this),o(s,{flexDirection:"column",marginTop:1,children:e.map((r)=>o(s,{gap:1,children:[o(l,{color:r.name===t?"green":"gray",children:r.name===t?"\u25CF":"\u25CB"},void 0,!1,void 0,this),o(l,{bold:r.name===t,children:r.name},void 0,!1,void 0,this),o(l,{color:"gray",children:r.createdAt},void 0,!1,void 0,this)]},r.id,!0,void 0,this))},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}function Ce({title:e,name:t}){return o(s,{flexDirection:"column",children:[o(b,{title:e},void 0,!1,void 0,this),o(l,{color:"green",children:["\u2713 ",t]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)}function Wt({configs:e,profileName:t}){return o(s,{flexDirection:"column",children:[o(b,{title:"Saved configs",subtitle:t},void 0,!1,void 0,this),e.length===0?o(l,{color:"gray",children:"No saved configs yet."},void 0,!1,void 0,this):e.map((r)=>o(s,{flexDirection:"column",marginTop:1,children:[o(l,{bold:!0,children:r.stableId},void 0,!1,void 0,this),o(l,{color:"gray",children:r.pathHint??"no path hint"},void 0,!1,void 0,this),r.latestVersion?o(l,{color:"green",children:[r.latestVersion.contentSha256.slice(0,12)," \xB7 ",r.latestVersion.sizeBytes," bytes \xB7 ",r.latestVersion.createdAt]},void 0,!0,void 0,this):null]},r.id,!0,void 0,this))]},void 0,!0,void 0,this)}function Yt({config:e,profileName:t}){return o(s,{flexDirection:"column",children:[o(b,{title:e.stableId,subtitle:t},void 0,!1,void 0,this),o(l,{color:"gray",children:e.pathHint??"no path hint"},void 0,!1,void 0,this),o(s,{flexDirection:"column",marginTop:1,children:(e.versions??[]).map((r)=>o(l,{children:[r.contentSha256.slice(0,12)," \xB7 ",r.sizeBytes," bytes \xB7 ",r.createdAt]},r.id,!0,void 0,this))},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}function Qt({stableId:e,profileName:t,versionHash:r,sizeBytes:n,reused:a}){return o(s,{flexDirection:"column",children:[o(b,{title:a?"Config already saved":"Config saved",subtitle:t},void 0,!1,void 0,this),o(l,{color:"green",children:["\u2713 ",e]},void 0,!0,void 0,this),o(l,{color:"gray",children:["Version ",r.slice(0,12)," \xB7 ",n," bytes \xB7 encrypted"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)}function Ht({result:e,preview:t}){let r=t?"Apply preview":e.status==="blocked"?"Apply blocked":"Config applied";return o(s,{flexDirection:"column",children:[o(b,{title:r,subtitle:e.profileName},void 0,!1,void 0,this),o(Ft,{result:e},void 0,!1,void 0,this),o(l,{children:e.displayPath},void 0,!1,void 0,this),o(l,{color:"gray",children:e.reason},void 0,!1,void 0,this),e.backupPath?o(l,{color:"yellow",children:["Backup: ",e.backupPath]},void 0,!0,void 0,this):null,o(l,{color:"gray",children:["Version ",e.version.contentSha256.slice(0,12)," \xB7 ",e.version.sizeBytes," bytes \xB7 encrypted"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)}function Nt({result:e}){let t=e.preview?"Profile switch preview":e.blocked?"Profile switch blocked":"Profile switched",r=e.results.filter((a)=>a.status==="create"||a.status==="update").length,n=e.results.filter((a)=>a.status==="blocked").length;return o(s,{flexDirection:"column",children:[o(b,{title:t,subtitle:e.profileName},void 0,!1,void 0,this),e.results.length===0?o(l,{color:"gray",children:"No saved configs in this profile."},void 0,!1,void 0,this):null,e.results.length>0?o(l,{color:"gray",children:[r," change",r===1?"":"s"," \xB7 ",n," blocked \xB7 ",e.results.length," total"]},void 0,!0,void 0,this):null,o(s,{flexDirection:"column",marginTop:1,children:e.results.map((a)=>o(s,{flexDirection:"column",children:[o(Ft,{result:a},void 0,!1,void 0,this),o(l,{color:"gray",children:[" ",a.displayPath]},void 0,!0,void 0,this),o(l,{color:"gray",children:[" ",a.reason]},void 0,!0,void 0,this),a.backupPath?o(l,{color:"yellow",children:[" Backup: ",a.backupPath]},void 0,!0,void 0,this):null]},a.stableId,!0,void 0,this))},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}function Gt({checks:e}){let t=e.filter((n)=>n.status==="fail").length,r=e.filter((n)=>n.status==="warn").length;return o(s,{flexDirection:"column",gap:1,children:[o(b,{title:"Doctor",subtitle:t?`${t} failing`:r?`${r} warning${r===1?"":"s"}`:"all checks passed"},void 0,!1,void 0,this),o(s,{flexDirection:"column",children:e.map((n)=>o(s,{gap:1,children:[o(l,{color:Wn(n.status),children:Xn(n.status)},void 0,!1,void 0,this),o(l,{bold:!0,children:n.label},void 0,!1,void 0,this),o(l,{color:"gray",children:n.detail},void 0,!1,void 0,this)]},n.label,!0,void 0,this))},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}function xe({query:e}){return o(l,{color:"red",children:["No inventory item matched: ",e]},void 0,!0,void 0,this)}function b({title:e,subtitle:t}){return o(s,{flexDirection:"column",children:[o(l,{bold:!0,color:"cyan",children:"\u25C6 Atelier"},void 0,!1,void 0,this),o(s,{gap:1,children:[o(l,{bold:!0,children:e},void 0,!1,void 0,this),t?o(l,{color:"gray",children:t},void 0,!1,void 0,this):null]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)}function K({label:e,value:t,color:r}){return o(s,{flexDirection:"column",borderStyle:"round",borderColor:r,paddingX:1,children:[o(l,{color:r,bold:!0,children:t},void 0,!1,void 0,this),o(l,{color:"gray",children:e},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}function A({label:e,color:t}){return o(l,{color:t,children:["[",e,"]"]},void 0,!0,void 0,this)}function Ft({result:e}){return o(s,{gap:1,children:[o(l,{color:It(e.status),children:Yn(e.status)},void 0,!1,void 0,this),o(l,{bold:!0,children:e.stableId},void 0,!1,void 0,this),o(A,{label:e.status,color:It(e.status)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}function Jn({rows:e}){return o(s,{flexDirection:"column",children:e.map(([t,r])=>o(s,{gap:1,children:[o(l,{color:"gray",children:t.padEnd(10)},void 0,!1,void 0,this),o(l,{children:r},void 0,!1,void 0,this)]},t,!0,void 0,this))},void 0,!1,void 0,this)}function qt(e){let t=typeof e==="string"?e:e.kind;if(t==="private")return"red";if(t==="generated")return"magenta";if(t==="config")return"green";return"yellow"}function Vt(e){if(e==="private")return"red";if(e==="shareable")return"green";return"yellow"}function Xn(e){if(e==="pass")return"\u2713";if(e==="warn")return"!";return"\u2717"}function Wn(e){if(e==="pass")return"green";if(e==="warn")return"yellow";return"red"}function It(e){if(e==="unchanged")return"green";if(e==="create")return"cyan";if(e==="update")return"yellow";return"red"}function Yn(e){if(e==="unchanged")return"\u2713";if(e==="create")return"+";if(e==="update")return"\xB1";return"\u2717"}function Qn(e){let t=Object.entries(e.legacyManagers??{});if(t.length===0)return"not scanned";return t.map(([r,n])=>`${r}: ${n}`).join(", ")}function Hn(e){if(!e.git)return"not in repo";return`${e.git.tracked?"tracked":"untracked"}${e.git.modified?", modified":""} @ ${e.git.root}`}import{jsxDEV as d}from"react/jsx-dev-runtime";var Dn=qn(import.meta.dir,"../../.."),er=En(),O=j(er,"inventory.json"),Dt,p=new Vn;p.name("atl").description("Atelier config management CLI").version("0.1.5");p.command("login").description("Login to Atelier with GitHub device auth").option("--api-url <url>","Atelier API URL",W()).action(async(e)=>{let t=await Pe({apiUrl:e.apiUrl,onPrompt:async(r)=>{await g(d(Mt,{verificationUri:r.verificationUri,userCode:r.userCode,expiresIn:r.expiresIn},void 0,!1,void 0,this))}});await g(d(Lt,{login:t.user.login,apiUrl:t.apiUrl},void 0,!1,void 0,this))});p.command("whoami").description("Show the current Atelier account").action(async()=>{let e=await Ze();if(await g(d(Ot,{login:e?.user.login,apiUrl:e?.apiUrl},void 0,!1,void 0,this)),!e)process.exitCode=1});p.command("logout").description("Remove the local Atelier session").action(async()=>{Le(),await g(d(Jt,{},void 0,!1,void 0,this))});var ee=p.command("profile").description("Manage account-backed config profiles");ee.command("list").description("List remote profiles").action(async()=>{await g(d(Xt,{profiles:await Je(),activeProfile:y()},void 0,!1,void 0,this))});ee.command("create").description("Create a remote profile").argument("<name>").action(async(e)=>{let t=await Xe(e);await g(d(Ce,{title:"Profile created",name:t.name},void 0,!1,void 0,this))});ee.command("switch").description("Apply a remote profile to this machine and make it active").argument("<name>").option("--preview","show profile changes without writing files or switching").option("--backup","back up differing local files before replacing them").action(async(e,t)=>{await nr(e,t)});ee.command("current").description("Show the active local profile").action(async()=>{await g(d(Ce,{title:"Active profile",name:y()},void 0,!1,void 0,this))});p.command("checkout").description("Alias for `atl profile switch`").argument("<name>").option("--preview","show profile changes without writing files or switching").option("--backup","back up differing local files before replacing them").action(async(e,t)=>{await nr(e,t)});var te=p.command("vault").description("Advanced vault controls");te.command("status").description("Show vault initialization and local unlock state").action(async()=>{let e=await F();console.log(`Vault: ${e.initialized?"initialized":"not initialized"}`),console.log(`Local state: ${e.unlocked?"unlocked":"locked"}`),console.log(`Active profile: ${e.activeProfile}`)});te.command("init").description("Initialize the encrypted vault now instead of waiting for first save").action(async()=>{let e=await ar("Create an Atelier vault passphrase: "),t=await pe(e);console.log(`Vault initialized for profile ${t.profileName}`)});te.command("unlock").description("Unlock this machine with the vault passphrase").action(async()=>{let e=await J("Vault passphrase: "),t=await qe(e);console.log(`Vault unlocked for profile ${t.activeProfile}`)});te.command("lock").description("Remove local unlocked vault material from this machine").action(async()=>{Ve(),console.log("Vault locked")});p.command("save").description("Save a config snapshot to the active encrypted profile").argument("<id-or-path>").action(async(e)=>{await jn(e)});p.command("apply").description("Apply a saved config to this machine").argument("<id-or-path>").option("--preview","show the local changes without writing files").option("--backup","back up a differing local file before replacing it").action(async(e,t)=>{await eo(e,t)});var tr=p.command("saved").description("Inspect encrypted configs saved remotely");tr.command("list").description("List saved configs for the active profile").action(async()=>{let e=y();await g(d(Wt,{configs:await I(e),profileName:e},void 0,!1,void 0,this))});tr.command("show").description("Show saved metadata and version history").argument("<stable-id>").action(async(e)=>{let t=y(),r=await H(t,e);if(!r)throw new Error(`Saved config not found: ${e}`);await g(d(Yt,{config:r,profileName:t},void 0,!1,void 0,this))});p.command("scan").description("Scan this machine and write local inventory").option("--path <path...>","additional manual path(s) to scan").option("--legacy","include legacy manager signals like yadm").action(async(e)=>{let t=await Kt({repoRoot:Dn,manualPaths:e.path??[],includeLegacyManagers:e.legacy}),r=Rt(t,{path:O});await g(d(ke,{inventory:t,path:r},void 0,!1,void 0,this))});p.command("list").description("List inventory items with polished terminal output").option("--domain <domain>","filter by domain").option("--app <app>","filter by app").option("--secrets","only items with secret warnings").option("--drift","only items with mirror drift").option("--generated","only generated/app-state items").option("--private","only private items").option("--missing","only missing registry items").option("--json","print JSON instead of Ink output").action(async(e)=>{let t=X(),r=ro(t.items,e);if(e.json)return re(r);await g(d(Pt,{items:r,title:"Inventory"},void 0,!1,void 0,this))});p.command("inspect").description("Inspect one inventory item by id or path").argument("<id-or-path>").option("--json","print JSON instead of Ink output").action(async(e,t)=>{let r=X(),n=ir(r,e);if(t.json)return re(n??null);await g(n?d(Zt,{item:n},void 0,!1,void 0,this):d(xe,{query:e},void 0,!1,void 0,this))});p.command("summary").description("Print the last scan summary").option("--json","print JSON instead of Ink output").action(async(e)=>{let t=X();if(e.json)return re(t.summary);await g(d(ke,{inventory:t,path:O},void 0,!1,void 0,this))});p.command("doctor").description("Check Atelier CLI, account, inventory, and local environment health").option("--json","print JSON instead of Ink output").action(async(e)=>{let t=no();if(e.json)re(t);else await g(d(Gt,{checks:t},void 0,!1,void 0,this));if(t.some((r)=>r.status==="fail"))process.exitCode=1});p.parseAsync(process.argv).catch((e)=>{console.error(e instanceof Error?e.message:e),process.exit(1)});function re(e){console.log(JSON.stringify(e,null,2))}function rr(e){return e.split(`
8
+ `)}function Pn(e){if(e.includes(0))return;try{return Zo.decode(e)}catch{return}}function Nn(e){if(e==="~")return ht();if(e.startsWith("~/"))return re(ht(),e.slice(2));return No(e)}function Kn(e){return Nn(e).toLowerCase()}function mt(e){return zo("sha256").update(e).digest("hex")}function yt(e){return{id:e.id,contentSha256:e.contentSha256,sizeBytes:e.sizeBytes,createdAt:e.createdAt}}function Wn(){return new Date().toISOString().replaceAll(":","-").replaceAll(".","-")}function Ln(e){return e.replace(/[^a-zA-Z0-9._-]+/g,"_").replace(/^_+|_+$/g,"")||Go(e)||"item"}import{createCipheriv as Us,createHash as kr,randomBytes as yr}from"crypto";import{existsSync as hr}from"fs";import{lstat as mr,mkdir as Sr,readFile as X,readdir as $t,stat as Pt,unlink as _s,writeFile as br}from"fs/promises";import{homedir as me,platform as Os}from"os";import{basename as Kt,extname as Hs,join as G,relative as wr,resolve as Gs}from"path";var wt=[["GitHub token",/gh[pousr]_[A-Za-z0-9_]{20,}/g],["Slack token",/xox[baprs]-[A-Za-z0-9-]{20,}/g],["AWS access key",/AKIA[0-9A-Z]{16}/g],["Private key",/-----BEGIN (?:RSA |OPENSSH |EC |DSA )?PRIVATE KEY-----/g],["Generic token assignment",/(?:token|api[_-]?key|secret|webhook|password)\s*[=:]\s*["']?[^"'\s]{12,}/gi]];function ie(e){let t=[],n=e.split(/\r?\n/);for(let[r,i]of wt)for(let s of e.matchAll(i)){let l=s.index??0,a=e.slice(0,l).split(/\r?\n/).length;t.push({type:r,line:a,preview:Fe(s[0])})}return n.forEach((r,i)=>{for(let s of r.matchAll(/[A-Za-z0-9_+\/=.-]{32,}/g)){let l=s[0];if(!Vo(l,r)&&Zn(l,r))t.push({type:"High-entropy string",line:i+1,preview:Fe(l)})}}),ts(t)}function Fe(e){if(e.length<=8)return"[redacted]";return`${e.slice(0,4)}\u2026${e.slice(-4)}`}function Jn(e){let t=e;for(let[,n]of wt)t=t.replace(n,(r)=>Fe(r));return t=t.replace(/[A-Za-z0-9_+\/=.-]{32,}/g,(n)=>{if(Zn(n,e))return Fe(n);return n}),t}function Vo(e,t){return wt.some(([,n])=>{return n.lastIndex=0,Array.from(t.matchAll(n)).some((r)=>r[0].includes(e)||e.includes(r[0]))})}function Zn(e,t){if(e.startsWith("amazon."))return!1;if(e.includes("anthropic.claude"))return!1;if(/^[A-Za-z0-9.-]+@[A-Za-z0-9.-]+$/.test(e))return!1;if(/model/i.test(t)&&/^[A-Za-z0-9_.-]+$/.test(e))return!1;return es(e)>4.2&&/[A-Za-z]/.test(e)&&/[0-9]/.test(e)}function es(e){let t=new Map;for(let r of e)t.set(r,(t.get(r)??0)+1);let n=0;for(let r of t.values()){let i=r/e.length;n-=i*Math.log2(i)}return n}function ts(e){let t=new Set;return e.filter((n)=>{let r=`${n.type}:${n.line}:${n.preview}`;if(t.has(r))return!1;return t.add(r),!0})}import{createHash as Qn}from"crypto";import{existsSync as Bt,lstatSync as ns,readdirSync as rs,readFileSync as Oe,realpathSync as is,statSync as Dn}from"fs";import{homedir as Ue}from"os";import{basename as os,isAbsolute as ss,join as I,relative as jn,resolve as J}from"path";var Tt="SKILL.md",ls=new TextDecoder("utf-8",{fatal:!0}),It=2000,as=new Set([".git","node_modules","dist","build",".next",".turbo","cache","caches","logs","tmp","temp"]);class En{parents;constructor(e){this.parents=Array.from({length:e},(t,n)=>n)}find(e){let t=this.parents[e];if(t===e)return e;let n=this.find(t);return this.parents[e]=n,n}union(e,t){let n=this.find(e),r=this.find(t);if(n!==r)this.parents[r]=n}}function se(e={}){let t=J(e.homeDir??Ue()),n=e.repoRoot?J(e.repoRoot):void 0,r=hs([...He(t,n),...e.additionalRoots??[]]),i=cs(t,n),s=[];for(let a of r)for(let u of ms(a.path))s.push(Ss(u,a,t,n,i));s.sort((a,u)=>`${a.name}:${a.path}`.localeCompare(`${u.name}:${u.path}`));let l=Vn(s);return{version:1,generatedAt:new Date().toISOString(),home:t,repoRoot:n,roots:r,lockfiles:i,candidates:s,groups:l.groups,conflicts:l.conflicts,summary:{roots:r.length,existingRoots:r.filter((a)=>Bt(a.path)).length,lockfiles:i.length,candidates:s.length,groups:l.summary.groups,conflicts:l.summary.conflicts,warnings:s.reduce((a,u)=>a+u.validationWarnings.length,0),secrets:s.reduce((a,u)=>a+u.secretFindings.length,0)}}}function Vn(e){let t=new En(e.length);vt(e,t,(l)=>l.realPath?`realpath:${l.realPath}`:void 0),vt(e,t,(l)=>`hash:${l.contentHash}`),vt(e,t,(l)=>l.provenance.identityKey?`source:${l.provenance.identityKey}`:void 0);let n=new Map;e.forEach((l,a)=>{let u=t.find(a),c=n.get(u)??[];c.push(l),n.set(u,c)});let r=[...n.values()].map(bs).sort((l,a)=>`${l.name}:${l.id}`.localeCompare(`${a.name}:${a.id}`)),i=vs(r),s=new Set(i.map((l)=>l.name));for(let l of r)if(s.has(l.name))l.conflict="same-name-different-content";return{groups:r,conflicts:i,summary:{groups:r.length,conflicts:i.length,projectedInstalls:r.reduce((l,a)=>l+a.candidates.length,0)}}}function He(e=Ue(),t){let n=J(e),r=n===J(Ue()),i=r&&process.env.XDG_CONFIG_HOME?.trim()?J(process.env.XDG_CONFIG_HOME):I(n,".config"),s=r&&process.env.CODEX_HOME?.trim()?J(process.env.CODEX_HOME):I(n,".codex"),l=r&&process.env.CLAUDE_CONFIG_DIR?.trim()?J(process.env.CLAUDE_CONFIG_DIR):I(n,".claude"),a=[H("universal-global","universal","Universal Agent Skills","global",I(n,".agents","skills")),H("pi-global","pi","Pi","global",I(n,".pi","agent","skills")),H("claude-code-global","claude-code","Claude Code","global",I(l,"skills")),H("cursor-global","cursor","Cursor","global",I(n,".cursor","skills")),H("codex-global","codex","Codex","global",I(s,"skills")),H("opencode-global","opencode","OpenCode","global",I(i,"opencode","skills"))];if(t){let u=J(t);a.push(H("universal-project","universal","Universal Agent Skills","project",I(u,".agents","skills")),H("pi-project","pi","Pi","project",I(u,".pi","skills")),H("claude-code-project","claude-code","Claude Code","project",I(u,".claude","skills")),H("cursor-project","cursor","Cursor","project",I(u,".cursor","skills")),H("codex-project","codex","Codex","project",I(u,".codex","skills")),H("opencode-project","opencode","OpenCode","project",I(u,".config","opencode","skills")))}return a}function oe(e){let t=I(e,Tt);try{return Dn(t).isFile()}catch{return!1}}function cs(e,t){let n=[];for(let r of us(e)){let i=Xn(r);if(i)n.push({kind:"global-skill-lock",path:r,skills:i})}if(t){let r=I(t,"skills-lock.json"),i=Xn(r);if(i)n.push({kind:"project-skills-lock",path:r,skills:i})}return n}function us(e){let t=[I(e,".agents",".skill-lock.json")];if(e===J(Ue())&&process.env.XDG_STATE_HOME?.trim())t.unshift(I(J(process.env.XDG_STATE_HOME),"skills",".skill-lock.json"));return[...new Set(t)]}function Xn(e){if(!Bt(e))return;try{let t=JSON.parse(Oe(e,"utf-8"));if(typeof t.version!=="number"||!t.skills||typeof t.skills!=="object"||Array.isArray(t.skills))return;let n={};for(let[r,i]of Object.entries(t.skills)){let s=ds(i);if(s)n[r]=s}return n}catch{return}}function ds(e){if(!e||typeof e!=="object"||Array.isArray(e))return;let t=e,n=O(t.source),r=O(t.sourceType);if(!n||!r)return;return{source:n,sourceType:r,sourceUrl:O(t.sourceUrl),ref:O(t.ref),skillPath:O(t.skillPath),computedHash:O(t.computedHash),skillFolderHash:O(t.skillFolderHash),installedAt:O(t.installedAt),updatedAt:O(t.updatedAt),pluginName:O(t.pluginName)}}function fs(e,t,n,r){let i=n?r.find((u)=>u.kind==="project-skills-lock"&&u.skills[e.name]):void 0,s=i?.skills[e.name];if(i&&s&&n&&ps(e,n))return qn("project-skills-lock",i.path,s,e.name);let l=r.find((u)=>u.kind==="global-skill-lock"&&u.skills[e.name]),a=l?.skills[e.name];if(l&&a&&ks(e,t))return qn("global-skill-lock",l.path,a,e.name);return{kind:ys(e)}}function qn(e,t,n,r){return{kind:n.sourceType==="node_modules"?"package-backed":"npx-skills-installed",lockKind:e,lockPath:t,source:n.source,sourceType:n.sourceType,sourceUrl:n.sourceUrl,ref:n.ref,skillPath:n.skillPath,computedHash:n.computedHash,skillFolderHash:n.skillFolderHash,installedAt:n.installedAt,updatedAt:n.updatedAt,pluginName:n.pluginName,identityKey:gs(n,r)}}function gs(e,t){let n=e.skillPath??t,r=e.ref??"",i=e.computedHash??e.skillFolderHash??"";return[e.sourceType,e.source,r,n,i].join("\x00")}function ps(e,t){if(e.root.scope!=="project")return!1;return _e(e.path,I(t,".agents","skills"))||Boolean(e.realPath&&_e(e.realPath,I(t,".agents","skills")))}function ks(e,t){if(e.root.scope!=="global")return!1;return _e(e.path,I(t,".agents","skills"))||Boolean(e.realPath&&_e(e.realPath,I(t,".agents","skills")))}function ys(e){return e.root.agentId==="universal"?"local-authored":"unknown-copied"}function H(e,t,n,r,i){return{id:e,agentId:t,agentName:n,scope:r,path:i}}function hs(e){let t=new Set;return e.filter((n)=>{let r=`${n.scope}:${n.agentId}:${n.path}`;if(t.has(r))return!1;return t.add(r),!0})}function ms(e){if(!Bt(e))return[];if(!Rs(e)?.isDirectory())return[];let n=[];return er(e,0,n),n}function er(e,t,n){if(n.length>=It)return;if(oe(e)){n.push(e);return}if(t>=4)return;for(let r of nr(e)){let i=I(e,r.name);if(r.isSymbolicLink()){if(oe(i))n.push(i);continue}if(!r.isDirectory())continue;if(ir(r.name))continue;er(i,t+1,n)}}function Ss(e,t,n,r,i){let s=I(e,Tt),l=[],a=Ks(s),u=a?Ts(a):{metadata:{},warnings:[`missing ${Tt}`]};l.push(...u.warnings);let c=u.metadata,y=O(c.name),k=O(c.description);if(!y)l.push("SKILL.md frontmatter is missing required name");if(!k)l.push("SKILL.md frontmatter is missing required description");let p=Cs(e,l),b=Bs(p),B=xs(p),m=p.filter((w)=>At(w.relativePath)==="scripts").length,L=p.filter((w)=>At(w.relativePath)==="references").length,_=p.filter((w)=>At(w.relativePath)==="assets").length,K={name:y??os(e),path:e,realPath:Ps(e),root:t};return{name:K.name,description:k,path:e,displayPath:Ms(e,n),realPath:K.realPath,skillFilePath:s,root:t,provenance:fs(K,n,r,i),metadata:{name:y,description:k,license:O(c.license),compatibility:Yn(c.compatibility),allowedTools:Yn(c["allowed-tools"]),raw:c},files:{total:p.length,text:p.filter((w)=>!w.binary).length,binary:p.filter((w)=>w.binary).length,skipped:l.filter((w)=>w.startsWith("skipped ")).length,sizeBytes:p.reduce((w,S)=>w+S.sizeBytes,0),scripts:m,references:L,assets:_},hasScripts:m>0,hasReferences:L>0,hasAssets:_>0,contentHash:b,validationWarnings:l,secretFindings:B}}function bs(e){let t=[...e].sort((i,s)=>`${i.root.id}:${i.path}`.localeCompare(`${s.root.id}:${s.path}`)),n=t[0],r=ws(t);return{id:`skill:${n.name}:${Qn("sha256").update(t.map((i)=>`${i.path}\x00${i.contentHash}`).join("\x00")).digest("hex").slice(0,12)}`,name:n.name,description:n.description,candidates:t,roots:As(t.map((i)=>i.root)),contentHashes:[...new Set(t.map((i)=>i.contentHash))].sort(),provenanceKinds:[...new Set(t.map((i)=>i.provenance.kind))].sort(),identityReasons:r,hasScripts:t.some((i)=>i.hasScripts),hasReferences:t.some((i)=>i.hasReferences),hasAssets:t.some((i)=>i.hasAssets),warningCount:t.reduce((i,s)=>i+s.validationWarnings.length,0),secretCount:t.reduce((i,s)=>i+s.secretFindings.length,0)}}function vt(e,t,n){let r=new Map;e.forEach((i,s)=>{let l=n(i);if(!l)return;let a=r.get(l);if(a===void 0)r.set(l,s);else t.union(a,s)})}function ws(e){let t=[];if(new Set(e.map((n)=>n.realPath).filter(Boolean)).size===1&&e.length>1)t.push("same canonical realpath");if(new Set(e.map((n)=>n.contentHash)).size===1&&e.length>1)t.push("same content hash");if(new Set(e.map((n)=>n.provenance.identityKey).filter(Boolean)).size===1&&e.some((n)=>n.provenance.identityKey)&&e.length>1)t.push("same source metadata");if(t.length===0)t.push("single candidate");return t}function vs(e){let t=new Map;for(let n of e){let r=t.get(n.name)??[];r.push(n),t.set(n.name,r)}return[...t.entries()].filter(([,n])=>n.length>1&&new Set(n.flatMap((r)=>r.contentHashes)).size>1).map(([n,r])=>({name:n,groups:r.sort((i,s)=>i.id.localeCompare(s.id)),resolution:"choose-one"})).sort((n,r)=>n.name.localeCompare(r.name))}function As(e){let t=new Set;return e.filter((n)=>{if(t.has(n.id))return!1;return t.add(n.id),!0})}function Ts(e){let t=e.replace(/^\uFEFF/,"");if(!t.startsWith(`---
9
+ `)&&!t.startsWith(`---\r
10
+ `))return{metadata:{},warnings:["SKILL.md is missing YAML frontmatter"]};let n=t.split(/\r?\n/),r=n.findIndex((l,a)=>a>0&&l.trim()==="---");if(r<0)return{metadata:{},warnings:["SKILL.md frontmatter is not closed"]};let i={},s;for(let l of n.slice(1,r)){let a=l.replace(/\s+#.*$/,"");if(!a.trim())continue;let u=a.match(/^\s*-\s*(.+?)\s*$/);if(u&&s){let p=Array.isArray(i[s])?i[s]:[];p.push(Ct(u[1])),i[s]=p;continue}let c=a.match(/^([A-Za-z0-9_-]+):(?:\s*(.*))?$/);if(!c)continue;let[,y,k=""]=c;if(k.trim()===""){i[y]=[],s=y;continue}i[y]=Is(k.trim()),s=void 0}return{metadata:i,warnings:[]}}function Is(e){if(e.startsWith("[")&&e.endsWith("]"))return e.slice(1,-1).split(",").map((t)=>Ct(t.trim())).filter(Boolean);if(e==="true")return!0;if(e==="false")return!1;return Ct(e)}function Ct(e){let t=e.trim();if(t.startsWith('"')&&t.endsWith('"')||t.startsWith("'")&&t.endsWith("'"))return t.slice(1,-1);return t}function Cs(e,t){let n=[];return tr(e,e,n,t),n.sort((r,i)=>r.relativePath.localeCompare(i.relativePath)),n}function tr(e,t,n,r){if(n.length>=It){r.push(`skipped files after ${It} file scan limit`);return}for(let i of nr(t)){let s=I(t,i.name),l=Ls(jn(e,s)),a=$s(s);if(!a){r.push(`skipped unreadable path: ${l}`);continue}if(a.isSymbolicLink()){r.push(`skipped symlink: ${l}`);continue}if(a.isDirectory()){if(ir(i.name)){r.push(`skipped generated directory: ${l}`);continue}tr(e,s,n,r);continue}if(!a.isFile()){r.push(`skipped non-file path: ${l}`);continue}let u=Oe(s),c=rr(u);n.push({relativePath:l,path:s,sizeBytes:u.byteLength,text:c,binary:c===void 0})}}function Bs(e){let t=Qn("sha256");for(let n of e)t.update(n.relativePath),t.update("\x00"),t.update(Oe(n.path)),t.update("\x00");return t.digest("hex")}function xs(e){return e.flatMap((t)=>{if(t.text===void 0)return[];return ie(t.text).map((n)=>({...n,relativePath:t.relativePath}))})}function nr(e){try{return rs(e,{withFileTypes:!0})}catch{return[]}}function Rs(e){try{return Dn(e)}catch{return}}function $s(e){try{return ns(e)}catch{return}}function Ps(e){try{return is(e)}catch{return}}function Ks(e){try{let t=Oe(e);return rr(t)}catch{return}}function rr(e){if(e.includes(0))return;try{return ls.decode(e)}catch{return}}function O(e){return typeof e==="string"&&e.trim()?e.trim():void 0}function Yn(e){if(Array.isArray(e))return e.filter((t)=>typeof t==="string"&&t.trim().length>0).map((t)=>t.trim());if(typeof e==="string"&&e.trim())return[e.trim()];return}function ir(e){return as.has(e.toLowerCase())}function At(e){return e.split(/[\\/]+/).filter(Boolean)[0]}function Ls(e){return e.split(/[\\/]+/).join("/")}function Ms(e,t){return e.startsWith(t)?`~${e.slice(t.length)}`:e}function _e(e,t){let n=jn(t,e);return n===""||!n.startsWith("..")&&!ss(n)}var he=1048576;function or(e){let t=[];if(!e.exists)t.push("file does not exist");if(e.isDirectory||e.kind==="directory"||e.format==="directory")t.push("directory saving is not supported yet");if(e.kind==="generated")t.push("generated/cache files are not saved");if(e.kind==="private"||e.shareability==="private")t.push("private/auth files are blocked");if(e.secretFindings.length>0)t.push("detected secret material");if(e.size!==void 0&&e.size>1048576)t.push(`file is larger than ${Fs(1048576)}`);if(zs(e))t.push("binary files are not supported yet");return{ok:t.length===0,reasons:t}}function xt(e){let t=or(e);if(!t.ok)throw Error(`Cannot save ${e.id}: ${t.reasons.join("; ")}`)}function zs(e){if(e.previewSuppressedReason?.toLowerCase().includes("binary"))return!0;return["binary","sqlite","db"].includes(e.format.toLowerCase())}function Fs(e){if(e<1024)return`${e} B`;let t=e/1024;if(t<1024)return`${Math.round(t)} KiB`;return`${Math.round(t/1024)} MiB`}var sr="aes-256-gcm",Ns=1,Ws=1,lr=2000,Js=new TextDecoder("utf-8",{fatal:!0}),Lt=new Set([".git","node_modules","dist","build",".next",".turbo","cache","caches","logs","tmp","temp"]),vr=[/cache/i,/history/i,/session/i,/state/i,/\.mdb$/i,/\.sqlite/i,/\.db$/i,/zcompdump/i,/logs?/i,/lock$/i,/lock\./i],Ar=[/credential/i,/secret/i,/token/i,/auth/i,/cookie/i,/session/i,/id_rsa/i,/id_ed25519/i,/\.pem$/i,/\.key$/i,/hosts\.ya?ml$/i],ar=25,cr=new Set([".conf",".config",".ini",".json",".jsonc",".toml",".yaml",".yml"]),ur=new Set([".cjs",".css",".fish",".js",".lua",".md",".mjs",".ps1",".py",".sh",".ts",".txt",".vim",".zsh"]),dr=new Set(["config","config.json","config.jsonc","settings.json","settings.jsonc","preferences.json","keymap.json","keybindings.json",".zshrc",".zshenv",".gitconfig",".editorconfig",".npmrc",".tool-versions","starship.toml"]),fr=new Set(["readme","readme.md","license","install.sh","setup.sh"]),Zs=[/local/i,/backup/i,/archive/i,/old/i,/copy/i,/sample/i,/example/i,/template/i];async function Tr(e,t={}){xt(e);let n=$(),r=await te(t.passphrase,n),i=await X(e.path),s=await Rt(n,r,e.id,"file",e.displayPath,i);return{profileName:n,stableId:e.id,version:s.version,reused:s.reused}}async function Mt(e){let t=typeof e==="string"?dl(e):e.path,n=Se(t),r=await Pt(t).catch(()=>{return});if(!r)throw Error(`Folder does not exist: ${n}`);if(!r.isDirectory())throw Error(`Not a folder: ${n}`);let i=typeof e==="string"?Ge(n):e.id,s=[],l=[];if(oe(t))return l.push(Y(t,n,".","managed skill root; use atl skills")),{stableId:i,rootPath:t,rootDisplayPath:n,files:s,skipped:l};return await zr(t,async(u,c)=>{let y=Se(u),k=Ot(c);if(s.length>=lr){l.push(Y(u,y,k,`folder save is limited to ${lr} files`));return}let p=await il(i,u,k);if("reason"in p)l.push(Y(u,y,k,p.reason));else s.push(p)},l),s.sort((u,c)=>u.relativePath.localeCompare(c.relativePath)),l.sort((u,c)=>u.relativePath.localeCompare(c.relativePath)),ol(s),await qs({stableId:i,rootPath:t,rootDisplayPath:n,files:s,skipped:l})}async function Ir(e,t={}){let n=await Mt(e),r=$(),i=t.resumeRunId?await el(t.resumeRunId):void 0,s=i?.selectedFiles.map((p)=>p.relativePath)??t.includeRelativePaths??n.files.filter((p)=>p.selectedByDefault).map((p)=>p.relativePath),l=new Set(s),a={...n,files:n.files.filter((p)=>l.has(p.relativePath))};if(a.files.length===0)throw Error(`No eligible files selected in ${a.rootDisplayPath}`);let u=i?Object.fromEntries(i.selectedFiles.map((p)=>[p.relativePath,p.contentSha256])):t.expectedContentSha256ByRelativePath;Ys(a,u);let c=i??await js(r,a);Ds(c,r,a);let y=await te(t.passphrase,r),k=[];try{c.status="uploading",c.currentStep="uploading-files",c.error=void 0,await le(c);for(let m of a.files){let L=c.uploadedFiles.find((f)=>f.relativePath===m.relativePath&&f.contentSha256===m.contentSha256);if(L){k.push(L);continue}let _=await X(m.path);if(Z(_)!==m.contentSha256)throw Error(`Folder file changed during save: ${m.relativePath}`);let w=await Rt(r,y,m.stableId,"folder-file",m.displayPath,_),S={...m,version:w.version,reused:w.reused};k.push(S),c.uploadedFiles.push(S),await le(c)}c.currentStep="verifying-files",await le(c),await Qs(a.files);let p={version:Ns,rootPathHint:a.rootDisplayPath,savedAt:new Date().toISOString(),files:k.map((m)=>({stableId:m.stableId,relativePath:m.relativePath,pathHint:m.displayPath,versionId:m.version.id,contentSha256:m.version.contentSha256,sizeBytes:m.sizeBytes,createdAt:m.version.createdAt}))},b=Buffer.from(JSON.stringify(p,null,2),"utf-8");c.currentStep="uploading-manifest",await le(c);let B=await Rt(r,y,a.stableId,"folder-manifest",a.rootDisplayPath,b);return await $r(c.runId),{profileName:r,stableId:a.stableId,rootDisplayPath:a.rootDisplayPath,manifestVersion:B.version,files:k,skipped:a.skipped,reused:B.reused}}catch(p){throw c.status="failed",c.error=p instanceof Error?p.message:String(p),await le(c),Error(`Folder save failed before manifest commit. Rerun the same save to resume. ${p instanceof Error?p.message:String(p)}`)}}async function Xs(e,t={}){if(e.conflict)throw Error(`Skill ${e.name} has duplicate conflicting versions; resolve the conflict before saving.`);let n=nl(e),r=await ee(t.passphrase),i=fl(e.name),s=await tl(i,n.path);if(s.length===0)throw Error(`No files found in skill ${e.name}`);let l=rl(e),a=[];for(let k of s){let p=await X(k.path);if(Z(p)!==k.contentSha256)throw Error(`Skill file changed during save: ${k.relativePath}`);let B=await gr(k.stableId,{kind:"skill-file",name:e.name,description:e.description,pathHint:k.displayPath,sourceKind:n.provenance.kind,provenance:n.provenance,safety:l},r,p);a.push({...k,version:B.version,reused:B.reused})}let u={version:Ws,name:e.name,description:e.description,rootPathHint:n.displayPath,savedAt:new Date().toISOString(),contentHash:e.contentHashes[0]??Z(Buffer.from(JSON.stringify(s.map((k)=>k.contentSha256)),"utf-8")),sourceKind:n.provenance.kind,provenance:n.provenance,safety:l,files:a.map((k)=>({stableId:k.stableId,relativePath:k.relativePath,pathHint:k.displayPath,versionId:k.version.id,contentSha256:k.version.contentSha256,sizeBytes:k.sizeBytes,createdAt:k.version.createdAt}))},c=Buffer.from(JSON.stringify(u,null,2),"utf-8"),y=await gr(i,{kind:"skill-manifest",name:e.name,description:e.description,pathHint:n.displayPath,sourceKind:n.provenance.kind,provenance:n.provenance,safety:l},r,c);return{stableId:i,name:e.name,rootDisplayPath:n.displayPath,manifestVersion:y.version,files:a,reused:y.reused}}async function Cr(e,t={}){let n=[];for(let r of e)n.push(await Xs(r,t));return n}async function Br(e,t){let n=$(),r=new Date().toISOString(),i=await Rr(n,e.stableId,e.rootPath),s={version:1,profileName:n,stableId:e.stableId,rootPath:e.rootPath,rootDisplayPath:e.rootDisplayPath,includeRelativePaths:[...new Set(t)].sort(),createdAt:i?.createdAt??r,updatedAt:r};return await Vs(s),s}async function qs(e){let t=$(),n=await Rr(t,e.stableId,e.rootPath);if(!n)return e;let r=new Set(n.includeRelativePaths),i=new Set(e.files.map((c)=>c.relativePath)),s=e.files.filter((c)=>r.has(c.relativePath)).map((c)=>c.relativePath).sort(),l=n.includeRelativePaths.filter((c)=>!i.has(c)).sort(),a=e.files.filter((c)=>c.selectedByDefault&&!r.has(c.relativePath)).map((c)=>c.relativePath).sort(),u=e.files.filter((c)=>!c.selectedByDefault&&!r.has(c.relativePath)).map((c)=>c.relativePath).sort();for(let c of e.files)c.selectedByDefault=r.has(c.relativePath),c.defaultSelectionReason=c.selectedByDefault?"selected by saved recipe":"not selected by saved recipe";return{...e,recipe:n,recipeDelta:{selectedExisting:s,missingSelected:l,newRecommended:a,newUnreviewed:u}}}async function xr(e){let t=$();return(await Es()).filter((r)=>r.status==="failed"&&r.profileName===t&&r.stableId===e.stableId&&r.rootPath===e.rootPath).sort((r,i)=>i.updatedAt.localeCompare(r.updatedAt))[0]}async function zt(e){await $r(e)}function Ys(e,t){if(!t)return;for(let n of e.files){let r=t[n.relativePath];if(r&&r!==n.contentSha256)throw Error(`Folder file changed since review plan was created: ${n.relativePath}`)}}async function Qs(e){for(let t of e){let n=await X(t.path);if(Z(n)!==t.contentSha256)throw Error(`Folder file changed during save: ${t.relativePath}`)}}function Ds(e,t,n){if(e.profileName!==t||e.stableId!==n.stableId||e.rootPath!==n.rootPath)throw Error("Folder save run does not match this folder/profile")}async function js(e,t){let n=new Date().toISOString(),r={version:1,runId:`${gl()}-${yr(4).toString("hex")}`,status:"uploading",currentStep:"created",profileName:e,stableId:t.stableId,rootPath:t.rootPath,rootDisplayPath:t.rootDisplayPath,selectedFiles:t.files,uploadedFiles:[],createdAt:n,updatedAt:n};return await le(r),r}async function Es(){let e=Ut();if(!hr(e))return[];let t=await $t(e).catch(()=>[]);return(await Promise.all(t.filter((r)=>r.endsWith(".json")).map(async(r)=>{try{return JSON.parse(await X(G(e,r),"utf-8"))}catch{return}}))).filter((r)=>Boolean(r&&r.version===1&&r.runId))}async function Rr(e,t,n){let r=Pr(e,t,n);if(!hr(r))return;try{let i=JSON.parse(await X(r,"utf-8"));if(i.version!==1||i.profileName!==e||i.stableId!==t||i.rootPath!==n)return;return i}catch{return}}async function Vs(e){await Sr(Kr(),{recursive:!0}),await br(Pr(e.profileName,e.stableId,e.rootPath),JSON.stringify(e,null,2)+`
11
+ `,"utf-8")}async function el(e){return JSON.parse(await X(Ft(e),"utf-8"))}async function le(e){await Sr(Ut(),{recursive:!0}),await br(Ft(e.runId),JSON.stringify({...e,updatedAt:new Date().toISOString()},null,2)+`
12
+ `,"utf-8")}async function $r(e){await _s(Ft(e)).catch(()=>{return})}function Ft(e){return G(Ut(),`${Ur(e)}.json`)}function Ut(){return G(Lr(),"folder-save-runs")}function Pr(e,t,n){let r=kr("sha256").update(`${e}\x00${t}\x00${n}`).digest("hex").slice(0,24);return G(Kr(),`${Ur(t)}-${r}.json`)}function Kr(){return G(Lr(),"folder-save-recipes")}function Lr(){if(process.env.ATELIER_STATE_DIR)return process.env.ATELIER_STATE_DIR;if(process.env.XDG_STATE_HOME)return G(process.env.XDG_STATE_HOME,"atelier");if(Os()==="win32"&&process.env.LOCALAPPDATA)return G(process.env.LOCALAPPDATA,"Atelier");return G(me(),".local","state","atelier")}async function Rt(e,t,n,r,i,s){let l=Fr(s,t);return await mn(e,n,{kind:r,pathHint:i,contentSha256:Z(s),ciphertextSha256:Z(l.ciphertextBytes),sizeBytes:s.byteLength,algorithm:l.algorithm,profileKeyVersion:1,nonce:l.nonce,ciphertext:l.ciphertext})}async function gr(e,t,n,r){let i=Fr(r,n);return await bn(e,{kind:t.kind,name:t.name,description:t.description,pathHint:t.pathHint,sourceKind:t.sourceKind,provenance:t.provenance,safety:t.safety,contentSha256:Z(r),ciphertextSha256:Z(i.ciphertextBytes),sizeBytes:r.byteLength,algorithm:i.algorithm,encryptionKeyVersion:1,nonce:i.nonce,ciphertext:i.ciphertext})}async function tl(e,t){let n=[];return await Mr(e,t,t,n),n.sort((r,i)=>r.relativePath.localeCompare(i.relativePath)),n}async function Mr(e,t,n,r){let i=await $t(n,{withFileTypes:!0}).catch(()=>[]);for(let s of i){let l=G(n,s.name),a=Ot(wr(t,l)),u=await mr(l).catch(()=>{return});if(!u||u.isSymbolicLink())continue;if(u.isDirectory()){if(Lt.has(s.name.toLowerCase()))continue;await Mr(e,t,l,r);continue}if(!u.isFile())continue;let c=await Pt(l).catch(()=>{return});if(!c||c.size>he)continue;let y=await X(l);r.push({stableId:`${e}:file:${Ge(a)}`,path:l,displayPath:Se(l),relativePath:a,sizeBytes:c.size,contentSha256:Z(y)})}}function nl(e){return e.candidates.find((t)=>t.root.agentId==="universal")??e.candidates[0]}function rl(e){return{hasScripts:e.hasScripts,hasReferences:e.hasReferences,hasAssets:e.hasAssets,warningCount:e.warningCount,secretCount:e.secretCount,candidateCount:e.candidates.length,roots:e.roots.map((t)=>({agentId:t.agentId,agentName:t.agentName,scope:t.scope}))}}async function zr(e,t,n,r=e){let i=await $t(r,{withFileTypes:!0}).catch(()=>[]);for(let s of i){let l=G(r,s.name),a=wr(e,l),u=Ot(a),c=Se(l),y=await mr(l).catch(()=>{return});if(!y){n.push(Y(l,c,u,"cannot inspect path"));continue}if(oe(l)){n.push(Y(l,c,u,"managed skill root; use atl skills"));continue}if(y.isSymbolicLink()){n.push(Y(l,c,u,"symlinks are skipped"));continue}if(ll(s.name)){n.push(Y(l,c,u,"generated or private path segment"));continue}if(y.isDirectory()){await zr(e,t,n,l);continue}if(!y.isFile()){n.push(Y(l,c,u,"not a regular file"));continue}await t(l,a)}}async function il(e,t,n){let r=await Pt(t).catch(()=>{return});if(!r)return{reason:"cannot inspect file"};if(r.size>he)return{reason:`file is larger than ${pl(he)}`};if(al(n))return{reason:"generated or state file"};if(cl(n))return{reason:"private or secret-like path"};let i=await X(t).catch(()=>{return});if(!i)return{reason:"cannot read file"};let s=ul(i);if(s===void 0)return{reason:"binary files are not supported yet"};if(ie(s).length>0)return{reason:"detected secret material"};let l=sl(n,r.size);return{stableId:`${e}:${Ge(n)}`,path:t,displayPath:Se(t),relativePath:n,sizeBytes:r.size,contentSha256:Z(i),confidence:l.confidence,confidenceReasons:l.reasons,selectedByDefault:!1}}function Y(e,t,n,r){return{path:e,displayPath:t,relativePath:n,reason:r,confidence:"blocked",confidenceReasons:[r]}}function ol(e){let t=0;for(let n of e){if(n.confidence!=="high-confidence"){n.selectedByDefault=!1,n.defaultSelectionReason="not selected by default";continue}if(t>=ar){n.selectedByDefault=!1,n.defaultSelectionReason=`high-confidence preselection limit of ${ar} reached`;continue}n.selectedByDefault=!0,n.defaultSelectionReason="high-confidence config file",t+=1}}function sl(e,t){let n=Kt(e).toLowerCase(),r=Hs(n),i=_t(e),s=[];if(Zs.some((l)=>l.test(e)))return s.push("name suggests example, backup, or local-only material"),{confidence:"low-confidence",reasons:s};if(e.startsWith("."))s.push("dotfile-style config path");if(i.length<=2)s.push("shallow folder path");if(dr.has(n))s.push("recognized config filename");if(cr.has(r))s.push(`recognized config extension ${r}`);if(dr.has(n)||cr.has(r)&&i.length<=3)return{confidence:"high-confidence",reasons:s};if(fr.has(n))s.push("recognized supporting document");if(ur.has(r))s.push(`recognized text extension ${r}`);if(t<=65536)s.push("small text file");if(fr.has(n)||ur.has(r)||i.length<=3)return{confidence:"medium-confidence",reasons:s};return s.push("unrecognized text file in a deeper folder path"),{confidence:"low-confidence",reasons:s}}function ll(e){let t=e.toLowerCase();return Lt.has(t)||vr.some((n)=>n.test(e))||Ar.some((n)=>n.test(e))}function al(e){return _t(e).some((t)=>Lt.has(t.toLowerCase())||vr.some((n)=>n.test(t)))}function cl(e){return _t(e).some((t)=>Ar.some((n)=>n.test(t)))}function _t(e){return e.split(/[\\/]+/).filter(Boolean)}function ul(e){if(e.includes(0))return;try{return Js.decode(e)}catch{return}}function Fr(e,t){let n=yr(12),r=Us(sr,t,n),i=Buffer.concat([r.update(e),r.final()]),s=r.getAuthTag(),l=Buffer.concat([i,s]);return{algorithm:sr,nonce:pr(n),ciphertext:pr(l),ciphertextBytes:l}}function dl(e){if(e==="~")return me();if(e.startsWith("~/"))return G(me(),e.slice(2));return Gs(e)}function Se(e){return e.startsWith(me())?`~${e.slice(me().length)}`:e}function Ot(e){return e.split(/[\\/]+/).join("/")}function Ge(e){return e.replace(/[^A-Za-z0-9_.-]+/g,":").replace(/^:+|:+$/g,"")||Kt(e)||"folder"}function fl(e){return`skill:${Ge(e)}`}function gl(){return new Date().toISOString().replaceAll(":","-").replaceAll(".","-")}function Ur(e){return e.replace(/[^a-zA-Z0-9._-]+/g,"_").replace(/^_+|_+$/g,"")||Kt(e)||"item"}function Z(e){return kr("sha256").update(e).digest("hex")}function pr(e){return Buffer.from(e).toString("base64url")}function pl(e){if(e<1024)return`${e} B`;let t=e/1024;if(t<1024)return`${Math.round(t)} KiB`;return`${Math.round(t/1024)} MiB`}import{execFileSync as Nr}from"child_process";import{existsSync as E,lstatSync as kl,mkdirSync as yl,readdirSync as Gt,readFileSync as be,statSync as ae,writeFileSync as hl}from"fs";import{homedir as ml,userInfo as Sl}from"os";import{dirname as Wr,join as j,relative as Jr,resolve as bl}from"path";var _r=[{domain:"AI Tools",app:"Pi",items:[{id:"pi.dir",path:"~/.pi",kind:"directory",format:"directory",shareability:"machine-specific"}]},{domain:"Shell",app:"Starship",items:[{id:"starship.config",path:"~/.config/starship.toml",kind:"config",format:"toml",shareability:"shareable"}]},{domain:"Editors",app:"Zed",items:[{id:"zed.dir",path:"~/.config/zed",kind:"directory",format:"directory",shareability:"shareable"},{id:"zed.settings",path:"~/.config/zed/settings.json",kind:"config",format:"jsonc",shareability:"shareable"},{id:"zed.themes",path:"~/.config/zed/themes",kind:"config",format:"directory",shareability:"shareable"},{id:"zed.prompts",path:"~/.config/zed/prompts",kind:"generated",format:"directory",shareability:"machine-specific"}]},{domain:"Git",app:"Git",items:[{id:"git.config",path:"~/.gitconfig",kind:"config",format:"gitconfig",shareability:"machine-specific"},{id:"git.config-dir",path:"~/.config/git",kind:"directory",format:"directory",shareability:"machine-specific"},{id:"git.ignore",path:"~/.gitignore",kind:"config",format:"gitignore",shareability:"machine-specific"}]},{domain:"Private/Auth",app:"Credentials",privateByDefault:!0,items:[{id:"auth.ssh",path:"~/.ssh",kind:"private",format:"directory",shareability:"private"},{id:"auth.aws",path:"~/.aws",kind:"private",format:"directory",shareability:"private"},{id:"auth.gh",path:"~/.config/gh",kind:"private",format:"directory",shareability:"private"},{id:"auth.gcloud-adc",path:"~/.config/gcloud/application_default_credentials.json",kind:"private",format:"json",shareability:"private"},{id:"auth.docker",path:"~/.docker/config.json",kind:"private",format:"json",shareability:"private"},{id:"auth.pi",path:"~/.config/pi/auth.json",kind:"private",format:"json",shareability:"private"}]},{domain:"Shell",app:"Zsh",items:[{id:"zsh.home-rc",path:"~/.zshrc",kind:"config",format:"shell",shareability:"shareable"},{id:"zsh.home-env",path:"~/.zshenv",kind:"config",format:"shell",shareability:"private"},{id:"zsh.dir",path:"~/.config/zsh",kind:"directory",format:"directory",shareability:"machine-specific"},{id:"zsh.env",path:"~/.config/zsh/.zshenv",kind:"config",format:"shell",shareability:"private"},{id:"zsh.rc",path:"~/.config/zsh/.zshrc",kind:"config",format:"shell",shareability:"shareable"},{id:"zsh.conf",path:"~/.config/zsh/conf.d",kind:"directory",format:"directory",shareability:"shareable"},{id:"zsh.zcompdump",path:"~/.config/zsh/.zcompdump",kind:"generated",format:"text",shareability:"machine-specific"},{id:"zsh.sessions",path:"~/.config/zsh/.zsh_sessions",kind:"generated",format:"directory",shareability:"machine-specific"}]},{domain:"Terminals",app:"cmux",items:[{id:"cmux.dir",path:"~/.config/cmux",kind:"directory",format:"directory",shareability:"shareable"},{id:"cmux.config",path:"~/.config/cmux/cmux.json",kind:"config",format:"jsonc",shareability:"shareable"},{id:"cmux.ghostty",path:"~/Library/Application Support/com.cmuxterm.app/config.ghostty",kind:"config",format:"ghostty",shareability:"shareable"},{id:"cmux.browser-history",path:"~/Library/Application Support/com.cmuxterm.app/browser_history.json",kind:"generated",format:"json",shareability:"machine-specific"}]}];function Or(e){let r=e.replace(/\/\*[\s\S]*?\*\//g,"").replace(/(^|[^:])\/\/.*$/gm,"$1").replace(/,\s*([}\]])/g,"$1");return JSON.parse(r)}var V=ml(),wl=new Set([".zsh",".zshrc",".zshenv",".sh",".json",".jsonc",".toml",".md",".yml",".yaml",".gitconfig",".gitignore",".ghostty",""]),vl=[/cache/i,/history/i,/session/i,/state/i,/\.mdb$/i,/\.sqlite/i,/\.db$/i,/zcompdump/i,/logs?/i],Al=[/credential/i,/secret/i,/token/i,/auth\.json$/i,/hosts\.yml$/i,/config\.json$/i],We;async function Zr(e){We=e.includeLegacyManagers?zl():void 0;let n=Tl(e.repoRoot).flatMap((s)=>s.items.map((l)=>({definition:s,item:l}))),r=new Set,i=[];for(let{definition:s,item:l}of n){let a=Ht(l.path);r.add(a),i.push(Il(s,l,a))}for(let s of Cl()){if(r.has(s.path))continue;r.add(s.path),i.push(Hr(s))}for(let s of e.manualPaths??[]){let l=Ht(s);if(r.has(l))continue;r.add(l),i.push(Hr({path:l,reason:"manual path"}))}return i.sort((s,l)=>`${s.domain}:${s.app}:${s.path}`.localeCompare(`${l.domain}:${l.app}:${l.path}`)),{version:1,generatedAt:new Date().toISOString(),repoRoot:e.repoRoot,home:V,items:i,summary:{total:i.length,existing:i.filter((s)=>s.exists).length,secrets:i.filter((s)=>s.secretFindings.length>0).length,drift:i.filter((s)=>s.mirrors.some((l)=>l.exists&&l.identical===!1)).length,generated:i.filter((s)=>s.kind==="generated").length,private:i.filter((s)=>s.shareability==="private").length}}}function Xr(e,t={}){let n=t.path??j(e.repoRoot,".atelier","state","inventory.json");return yl(Wr(n),{recursive:!0}),hl(n,JSON.stringify(e,null,2)+`
13
+ `,"utf-8"),n}function Tl(e){let t=j(e,"packages","registry","definitions");if(!E(t))return _r;return Gt(t).filter((n)=>n.endsWith(".jsonc")).map((n)=>Or(be(j(t,n),"utf-8")))}function Il(e,t,n){return qr({path:n,domain:e.domain,app:e.app,kind:t.kind,format:t.format,shareability:t.shareability,reason:"registry match",mirrors:t.mirrors??[],privateByDefault:e.privateByDefault,id:t.id})}function Hr(e){let t=Ul(e.path),n=Ol(e.path),r=Hl(e.path,n);return qr({path:e.path,domain:_l(e.path),app:t,kind:n,format:Gl(e.path),shareability:r,reason:e.reason,mirrors:[],privateByDefault:r==="private"})}function qr(e){let t=E(e.path),n=t?kl(e.path):void 0,r=t?ae(e.path):void 0,i=!!r?.isDirectory(),s=!!n?.isSymbolicLink(),l=t&&!i&&Yr(e.path)?ie(be(e.path,"utf-8")):[],a=e.mirrors.map((y)=>xl(e.path,Ht(y))),u=Pl(e.kind,e.shareability,l.length,a),c=$l(e.path,t,i,e.shareability,e.privateByDefault,e.kind);return{id:e.id??Fl(e.path),domain:e.domain,app:e.app,path:e.path,displayPath:we(e.path),kind:e.kind,format:e.format,shareability:e.shareability,exists:t,isDirectory:i,isSymlink:s,mode:r?`0${(r.mode&511).toString(8)}`:void 0,owner:t?Sl().username:void 0,size:r?.size,git:t?Kl(e.path):void 0,legacyManagers:t?Ll(e.path):{},mirrors:a,secretFindings:l,...c,recommendation:u,reason:e.reason}}function Cl(){let e=[],t=j(V,".config");if(!E(t))return e;for(let n of Gt(t,{withFileTypes:!0})){if(n.name.startsWith("."))continue;let r=j(t,n.name);if(e.push({path:r,reason:"~/.config app directory"}),!n.isDirectory())continue;for(let i of Bl(r).slice(0,80)){let s=j(r,i.name);if(Nt(s)){e.push({path:s,reason:"generated/app-state candidate"});continue}if(i.isFile()&&Wt(i.name))e.push({path:s,reason:"shallow ~/.config config candidate"});if(i.isDirectory()&&["conf.d","themes","snippets","plugins"].includes(i.name))e.push({path:s,reason:"shallow ~/.config config directory"})}}return e}function Bl(e){try{return Gt(e,{withFileTypes:!0})}catch{return[]}}function xl(e,t){let n=E(t);if(!n||!E(e)||ae(e).isDirectory()||ae(t).isDirectory())return{path:t,displayPath:we(t),exists:n};let r=be(e,"utf-8"),i=be(t,"utf-8");return{path:t,displayPath:we(t),exists:n,identical:r===i,diff:r===i?void 0:Rl(i,r)}}function Rl(e,t){let n=e.split(/\r?\n/),r=t.split(/\r?\n/),i=Math.max(n.length,r.length),s=[];for(let l=0;l<i;l++){if(n[l]===r[l])continue;if(n[l]!==void 0)s.push(`-${n[l]}`);if(r[l]!==void 0)s.push(`+${r[l]}`)}return s.slice(0,200).join(`
14
+ `)}function $l(e,t,n,r,i,s){if(!t)return{previewSuppressedReason:"missing"};if(n)return{previewSuppressedReason:"directory"};if(r==="private"||i||s==="private")return{previewSuppressedReason:"private/auth metadata-only"};if(!Yr(e))return{previewSuppressedReason:"binary or unsupported file type"};let l=be(e,"utf-8");return{preview:Jn(l).slice(0,20000)}}function Pl(e,t,n,r){if(n>0)return"rotate-secret";if(e==="generated")return"ignore-generated";if(t==="private")return"mark-private";if(r.some((i)=>i.exists&&i.identical===!1))return"resolve-drift";if(t==="machine-specific")return"review-machine-specific";if(e==="config"||e==="directory")return"adopt-candidate";return"none"}function Kl(e){let t=ae(e).isDirectory()?e:Wr(e),n=Ne(["rev-parse","--show-toplevel"],t);if(!n)return;let r=Jr(n,e),i=!!Ne(["check-ignore","-q",r],n,!0),s=!!Ne(["ls-files","--error-unmatch",r],n,!0),l=s&&!!Ne(["status","--porcelain","--",r],n);return{root:n,tracked:s,modified:l,ignored:i}}function Ll(e){if(!We)return{};return{yadm:Ml(e)}}function Ml(e){let t=we(e).replace(/^~\//,"");if(We?.modified.has(t))return"modified";if(We?.tracked.has(t))return"tracked";return"unknown"}function zl(){let e=new Set((Gr("yadm",["ls-files"])??"").split(`
15
+ `).filter(Boolean)),t=new Set((Gr("yadm",["status","--porcelain"])??"").split(`
16
+ `).map((n)=>n.slice(3).trim()).filter(Boolean));return{tracked:e,modified:t}}function Ne(e,t,n=!1){try{return Nr("git",e,{cwd:t,encoding:"utf-8",stdio:["ignore","pipe","ignore"]}).trim()||(n?"ok":void 0)}catch{return}}function Gr(e,t){try{return Nr(e,t,{cwd:V,encoding:"utf-8",stdio:["ignore","pipe","ignore"]})}catch{return}}function Ht(e){return bl(e.replace(/^~(?=\/|$)/,V))}function we(e){return e.startsWith(V)?`~${e.slice(V.length)}`:e}function Fl(e){return we(e).replace(/[^A-Za-z0-9_.-]+/g,":")}function Ul(e){let t=Jr(j(V,".config"),e);if(!t.startsWith(".."))return t.split(/[\\/]/)[0]||"Unknown";return"Unknown"}function _l(e){if(e.includes("/.config/"))return"~/.config";if(e.includes("/.ssh")||e.includes("/.aws"))return"Private/Auth";return"Unknown"}function Ol(e){if(Nt(e))return"generated";if(Al.some((t)=>t.test(e)))return"private";if(E(e)&&ae(e).isDirectory())return"directory";if(Wt(e))return"config";return"unknown"}function Hl(e,t){if(t==="private")return"private";if(t==="generated")return"machine-specific";if(e.includes("/credentials")||e.includes("/.ssh")||e.includes("/.aws"))return"private";return"machine-specific"}function Gl(e){if(E(e)&&ae(e).isDirectory())return"directory";if(e.endsWith(".jsonc"))return"jsonc";if(e.endsWith(".json"))return"json";if(e.endsWith(".toml"))return"toml";if(e.endsWith(".zsh"))return"shell";if(e.endsWith(".md"))return"markdown";return"text"}function Nt(e){return vl.some((t)=>t.test(e))}function Wt(e){return/(^config\.|settings\.|rc$|\.rc$|\.zshrc$|\.zshenv$|\.jsonc?$|\.toml$|\.ya?ml$|\.zsh$|\.conf$|\.ini$)/i.test(e)}function Yr(e){let t=e.split("/").pop()??"";if(Nt(e))return!1;if(t.includes("lock")||t.endsWith(".mdb")||t.endsWith(".sqlite")||t.endsWith(".db"))return!1;let n=t.includes(".")?t.slice(t.lastIndexOf(".")):"";return wl.has(n)||Wt(t)}import{createCipheriv as nu,createDecipheriv as Nl,createHash as Er,randomBytes as ru}from"crypto";import{existsSync as ce,lstatSync as Vr,mkdirSync as ei,readdirSync as Wl,readFileSync as Jl,realpathSync as ti,rmSync as Zl}from"fs";import{cp as ni,mkdir as ri,symlink as Xl,writeFile as ql}from"fs/promises";import{homedir as qe,platform as Yl}from"os";import{basename as Ql,dirname as ii,join as N,relative as Dl,resolve as Ze}from"path";var jl="aes-256-gcm",El=1;async function Zt(e={}){let t=Ze(e.homeDir??qe()),n=await ee(e.passphrase),r=(await Sn()).filter((c)=>c.kind==="skill-manifest"&&Qr(c)),i=se({homeDir:t,repoRoot:e.repoRoot}),s=N(t,".agents","skills"),l=Vl(t,e.repoRoot),a=l.filter((c)=>c.agentId!=="universal"),u=[];for(let c of r){let y=Qr(c);if(!y)continue;let k=await ia(c,y,n),p=pa(k.name),b=N(s,p),B=i.groups.filter((S)=>S.name===k.name),m=[...new Set(B.flatMap((S)=>S.contentHashes))],L=i.candidates.find((S)=>Jt(S.path,b)||Boolean(S.realPath&&Jt(S.realPath,b))),_=si(b),K=a.map((S)=>la(S,k,b,N(S.rootPath,p))),w=sa(k,b,L,_,B.flatMap((S)=>S.candidates),K);u.push({stableId:c.stableId,name:k.name,description:k.description??c.description,source:"owned",savedSkill:c,manifestVersion:y,manifest:k,canonicalPath:b,canonicalDisplayPath:Xe(b,t),status:w.status,reason:w.reason,requiresBackup:w.requiresBackup,localHashes:m,projections:K})}return u.sort((c,y)=>c.name.localeCompare(y.name)),{generatedAt:new Date().toISOString(),canonicalRoot:s,canonicalRootDisplayPath:Xe(s,t),detectedAgents:l,items:u,summary:{total:u.length,new:u.filter((c)=>c.status==="new").length,alreadyInstalled:u.filter((c)=>c.status==="already-installed").length,outdated:u.filter((c)=>c.status==="outdated").length,conflicts:u.filter((c)=>c.status==="conflict").length,detectedAgents:l.length}}}async function oi(e={}){let t=await Zt(e),n=e.stableIds?new Set(e.stableIds):void 0,r=n?t.items.filter((u)=>n.has(u.stableId)):t.items.filter((u)=>u.status!=="already-installed");if(e.preview)return{preview:!0,backup:Boolean(e.backup),blocked:!1,results:r.map((u)=>Je(u,u.status,u.reason))};if(r.filter((u)=>u.requiresBackup&&!e.backup).length>0)return{preview:!1,backup:!1,blocked:!0,results:r.map((u)=>u.requiresBackup?Je(u,"blocked","local skill differs; rerun with --backup to replace safely"):Je(u,u.status,u.reason))};let s=await ee(e.passphrase),l=ya(),a=[];for(let u of r){if(u.status==="already-installed"){a.push(Je(u,u.status,u.reason));continue}a.push(await ea(u,s,{backup:Boolean(e.backup),backupRunId:l}))}return{preview:!1,backup:Boolean(e.backup),blocked:!1,results:a}}function Vl(e=qe(),t){return He(e,t).filter((i)=>i.scope==="global").filter((i)=>i.agentId==="universal"||da(i)).map((i)=>({agentId:i.agentId,agentName:i.agentName,rootPath:i.path,rootDisplayPath:Xe(i.path,e)}))}async function ea(e,t,n){let r=ce(e.canonicalPath)?await ai(e.stableId,e.canonicalPath,n.backupRunId):void 0;await ta(e,t);let i=[];for(let s of e.projections)i.push(await ra(e,s,n));return{stableId:e.stableId,name:e.name,status:e.status==="outdated"?"updated":"installed",reason:e.status==="outdated"?"updated skill after creating backup":e.status==="conflict"?"installed after explicit backup/replace confirmation":"installed skill into canonical Agent Skills directory",canonicalPath:e.canonicalPath,canonicalDisplayPath:e.canonicalDisplayPath,backupPath:r,projections:i}}async function ta(e,t){ei(e.canonicalPath,{recursive:!0});for(let n of e.manifest.files){let r=await na(n,t);if(ui(r)!==n.contentSha256)throw Error(`Saved skill file hash mismatch: ${n.relativePath}`);let s=N(e.canonicalPath,n.relativePath);fa(e.canonicalPath,s),await ri(ii(s),{recursive:!0}),await ql(s,r)}}async function na(e,t){let n=await lt(e.stableId,e.versionId);if(!n)throw Error(`Saved skill file blob not found: ${e.stableId}`);if(n.version.contentSha256!==e.contentSha256)throw Error(`Saved skill file metadata mismatch: ${e.relativePath}`);return ci(n.ciphertext,n.version.nonce,t)}async function ra(e,t,n){if(t.status==="unchanged"||t.status==="skip")return t;let r;if(ce(t.targetPath)){if(!n.backup)return t;r=await ai(`${e.stableId}:${t.agent.agentId}`,t.targetPath,n.backupRunId)}await ri(t.agent.rootPath,{recursive:!0});try{return await Xl(e.canonicalPath,t.targetPath,"dir"),{...t,status:"link",reason:"linked to canonical Agent Skills directory",backupPath:r}}catch{return await ni(e.canonicalPath,t.targetPath,{recursive:!0,force:!1,errorOnExist:!0}),{...t,status:"copy",reason:"symlink failed; copied skill into agent directory",backupPath:r}}}async function ia(e,t,n){let r=await lt(e.stableId,t.id);if(!r)throw Error(`Saved skill manifest blob not found: ${e.stableId}`);let i=ci(r.ciphertext,r.version.nonce,n);if(ui(i)!==t.contentSha256)throw Error(`Saved skill manifest hash mismatch: ${e.stableId}`);return oa(i,e.stableId)}function oa(e,t){let n=JSON.parse(Buffer.from(e).toString("utf-8"));if(n.version!==El||!n.name||!Array.isArray(n.files))throw Error(`Invalid skill manifest: ${t}`);if(n.files.some((r)=>!r.stableId||!r.relativePath||!r.versionId||!r.contentSha256))throw Error(`Invalid skill manifest entries: ${t}`);return n}function sa(e,t,n,r,i,s){let l=s.some((u)=>u.status==="conflict");if(!r.exists){if(i.some((c)=>c.contentHash!==e.contentHash))return{status:"conflict",reason:"same-name local skill differs from saved skill",requiresBackup:!0};return{status:l?"conflict":"new",reason:l?"agent projection target differs from saved skill":"canonical skill is not installed",requiresBackup:l}}if(!r.isSkill)return{status:"conflict",reason:"canonical install path exists but is not a skill",requiresBackup:!0};if((n?.contentHash??r.contentHash)===e.contentHash)return l?{status:"conflict",reason:"canonical skill matches but an agent projection differs",requiresBackup:!0}:{status:"already-installed",reason:"canonical skill already matches saved version",requiresBackup:!1};return{status:"outdated",reason:"canonical skill differs from saved version",requiresBackup:!0}}function la(e,t,n,r){let i=Xe(r);if(!ce(r))return{agent:e,targetPath:r,displayPath:i,status:"link",reason:"agent projection is missing"};let s=aa(r);if(s?.realPath&&Jt(s.realPath,n))return{agent:e,targetPath:r,displayPath:i,status:"unchanged",reason:"already linked to canonical skill"};let l=si(r);if(l.isSkill&&l.contentHash===t.contentHash)return{agent:e,targetPath:r,displayPath:i,status:"skip",reason:"agent already has matching skill content; leaving existing install untouched"};return{agent:e,targetPath:r,displayPath:i,status:"conflict",reason:"agent target exists and differs from saved skill"}}function si(e){if(!ce(e))return{exists:!1,isSkill:!1};let t=N(e,"SKILL.md");if(!ce(t))return{exists:!0,isSkill:!1};return{exists:!0,isSkill:!0,contentHash:ca(e)}}function aa(e){try{if(!Vr(e).isSymbolicLink())return;return{realPath:ti(e)}}catch{return}}function ca(e){let t=[];li(e,e,t);let n=Er("sha256");for(let r of t)n.update(r.relativePath),n.update("\x00"),n.update(r.bytes),n.update("\x00");return n.digest("hex")}function li(e,t,n){let r=[];try{r=Wl(t)}catch{return}for(let i of r){let s=N(t,i),l=ka(Dl(e,s)),a=ua(s);if(!a||a.isSymbolicLink())continue;if(a.isDirectory()){if(ga(i))continue;li(e,s,n);continue}if(!a.isFile())continue;n.push({relativePath:l,bytes:Jl(s)})}}function ua(e){try{return Vr(e)}catch{return}}async function ai(e,t,n){let r=N(ha(),n,jr(e),jr(t));return ei(ii(r),{recursive:!0}),await ni(t,r,{recursive:!0,force:!1,errorOnExist:!0}),Zl(t,{recursive:!0,force:!0}),r}function da(e){return ce(e.path)}function Qr(e){return e.latestVersion??e.versions?.[0]}function ci(e,t,n){let r=Buffer.from(e,"base64url"),i=Buffer.from(t,"base64url"),s=r.subarray(0,-16),l=r.subarray(-16),a=Nl(jl,n,i);return a.setAuthTag(l),Buffer.concat([a.update(s),a.final()])}function fa(e,t){let n=Ze(e),r=Ze(t);if(r!==n&&!r.startsWith(`${n}/`))throw Error(`Invalid skill manifest path: ${t}`)}function ga(e){return new Set([".git","node_modules","dist","build",".next",".turbo","cache","caches","logs","tmp","temp"]).has(e.toLowerCase())}function pa(e){return e.replaceAll("/","-").replaceAll("\\","-").trim()||"skill"}function Xe(e,t=qe()){return e.startsWith(t)?`~${e.slice(t.length)}`:e}function Jt(e,t){return Dr(e)===Dr(t)}function Dr(e){try{return ti(e)}catch{return Ze(e)}}function ka(e){return e.split(/[\\/]+/).join("/")}function ui(e){return Er("sha256").update(e).digest("hex")}function ya(){return new Date().toISOString().replaceAll(":","-").replaceAll(".","-")}function ha(){if(process.env.ATELIER_STATE_DIR)return N(process.env.ATELIER_STATE_DIR,"backups","skills");if(process.env.XDG_STATE_HOME)return N(process.env.XDG_STATE_HOME,"atelier","backups","skills");if(Yl()==="win32"&&process.env.LOCALAPPDATA)return N(process.env.LOCALAPPDATA,"Atelier","backups","skills");return N(qe(),".local","state","atelier","backups","skills")}function Je(e,t,n){return{stableId:e.stableId,name:e.name,status:t,reason:n,canonicalPath:e.canonicalPath,canonicalDisplayPath:e.canonicalDisplayPath,projections:e.projections}}function jr(e){return e.replace(/[^a-zA-Z0-9._-]+/g,"_").replace(/^_+|_+$/g,"")||Ql(e)||"item"}import{Box as g,Text as d,render as Qe,useApp as qt,useInput as yi}from"ink";import{useEffect as ma,useMemo as hi,useState as W}from"react";import{jsxDEV as o,Fragment as Ka}from"react/jsx-dev-runtime";function A(e){return Qe(o(Ka,{children:e},void 0,!1,void 0,this)).waitUntilExit()}async function ue(e,t){return await new Promise((n,r)=>{let i=Qe(o(Sa,{operation:e,options:t,onDone:(s,l)=>{if(i.unmount(),l)r(l);else n(s)}},void 0,!1,void 0,this))})}function Sa({operation:e,options:t,onDone:n}){let{exit:r}=qt(),[i,s]=W(0),l=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"];return ma(()=>{let a=!1,u=setInterval(()=>s((c)=>c+1),80);return e().then((c)=>{if(a)return;clearInterval(u),n(c),r()},(c)=>{if(a)return;clearInterval(u),n(void 0,c),r()}),()=>{a=!0,clearInterval(u)}},[]),o(g,{flexDirection:"column",children:[o(C,{title:t.title,subtitle:t.subtitle},void 0,!1,void 0,this),o(d,{color:"cyan",children:[l[i%l.length]," ",t.detail??"Working\u2026"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)}async function mi(e){return await new Promise((t)=>{let n=Qe(o(wa,{plan:e,onDone:(r)=>{t(r),n.unmount()}},void 0,!1,void 0,this))})}async function Si(e){return await new Promise((t)=>{let n=Qe(o(ba,{groups:e,onDone:(r)=>{t(r?e.filter((i)=>r.includes(i.id)):void 0),n.unmount()}},void 0,!1,void 0,this))})}function Yt({inventory:e,path:t}){return o(g,{flexDirection:"column",gap:1,children:[o(C,{title:"Scan complete",subtitle:t},void 0,!1,void 0,this),o(g,{gap:2,children:[o(M,{label:"total",value:e.summary.total,color:"cyan"},void 0,!1,void 0,this),o(M,{label:"existing",value:e.summary.existing,color:"green"},void 0,!1,void 0,this),o(M,{label:"private",value:e.summary.private,color:"red"},void 0,!1,void 0,this),o(M,{label:"generated",value:e.summary.generated,color:"magenta"},void 0,!1,void 0,this),o(M,{label:"secrets",value:e.summary.secrets,color:"red"},void 0,!1,void 0,this),o(M,{label:"drift",value:e.summary.drift,color:"blue"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)}function Qt({scan:e}){return o(g,{flexDirection:"column",gap:1,children:[o(C,{title:"Agent Skills scan",subtitle:`${e.summary.groups} skill${e.summary.groups===1?"":"s"} \xB7 ${e.summary.candidates} install${e.summary.candidates===1?"":"s"}`},void 0,!1,void 0,this),o(g,{gap:2,children:[o(M,{label:"skills",value:e.summary.groups,color:"cyan"},void 0,!1,void 0,this),o(M,{label:"installs",value:e.summary.candidates,color:"green"},void 0,!1,void 0,this),o(M,{label:"lockfiles",value:e.summary.lockfiles,color:"blue"},void 0,!1,void 0,this),o(M,{label:"conflicts",value:e.summary.conflicts,color:e.summary.conflicts>0?"red":"green"},void 0,!1,void 0,this),o(M,{label:"warnings",value:e.summary.warnings,color:e.summary.warnings>0?"yellow":"green"},void 0,!1,void 0,this),o(M,{label:"secrets",value:e.summary.secrets,color:e.summary.secrets>0?"red":"green"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),e.conflicts.length>0?o(g,{flexDirection:"column",children:[o(d,{color:"red",bold:!0,children:"Duplicate skill names need review"},void 0,!1,void 0,this),e.conflicts.map((t)=>o(g,{flexDirection:"column",marginLeft:1,children:[o(d,{color:"red",children:[t.name,": choose one version, save with aliases, or skip during save/install."]},void 0,!0,void 0,this),t.groups.map((n)=>o(di,{group:n,compact:!0},n.id,!1,void 0,this))]},t.name,!0,void 0,this))]},void 0,!0,void 0,this):null,o(g,{flexDirection:"column",children:e.groups.length===0?o(d,{color:"gray",children:"No Agent Skills found."},void 0,!1,void 0,this):e.groups.map((t)=>o(di,{group:t},t.id,!1,void 0,this))},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}function di({group:e,compact:t=!1}){let n=e.candidates.map((i)=>`${i.root.agentName}${i.root.scope==="project"?" project":""}`),r=Ba(e);return o(g,{flexDirection:"column",marginTop:t?0:1,children:[o(g,{gap:1,children:[o(d,{color:e.conflict?"red":"green",children:e.conflict?"!":"\u25CF"},void 0,!1,void 0,this),o(d,{bold:!0,children:e.name},void 0,!1,void 0,this),o(d,{color:"gray",children:e.contentHashes[0]?.slice(0,12)},void 0,!1,void 0,this),o(F,{label:r,color:r==="unknown-copied"?"yellow":"cyan"},void 0,!1,void 0,this),e.hasScripts?o(F,{label:"scripts",color:"red"},void 0,!1,void 0,this):null,e.hasReferences?o(F,{label:"references",color:"blue"},void 0,!1,void 0,this):null,e.hasAssets?o(F,{label:"assets",color:"magenta"},void 0,!1,void 0,this):null,e.warningCount>0?o(F,{label:`${e.warningCount} warning${e.warningCount===1?"":"s"}`,color:"yellow"},void 0,!1,void 0,this):null,e.secretCount>0?o(F,{label:`${e.secretCount} secret${e.secretCount===1?"":"s"}`,color:"red"},void 0,!1,void 0,this):null]},void 0,!0,void 0,this),!t&&e.description?o(d,{color:"gray",children:[" ",e.description]},void 0,!0,void 0,this):null,o(d,{color:"gray",children:[" installed in ",Ji(n).join(", ")," \xB7 ",e.identityReasons.join(", ")]},void 0,!0,void 0,this),!t?o(d,{color:"gray",children:[" ",e.candidates.map((i)=>i.displayPath).join(", ")]},void 0,!0,void 0,this):null]},void 0,!0,void 0,this)}function bi({items:e,title:t}){return o(g,{flexDirection:"column",children:[o(C,{title:t,subtitle:`${e.length} item${e.length===1?"":"s"}`},void 0,!1,void 0,this),o(g,{flexDirection:"column",marginTop:1,children:e.map((n)=>o(g,{gap:1,children:[o(d,{color:n.exists?"white":"gray",children:n.exists?"\u25CF":"\u25CB"},void 0,!1,void 0,this),o(d,{color:Gi(n),children:n.domain},void 0,!1,void 0,this),o(d,{color:"gray",children:"/"},void 0,!1,void 0,this),o(d,{color:"cyan",children:n.app},void 0,!1,void 0,this),o(d,{children:n.displayPath},void 0,!1,void 0,this),o(F,{label:n.shareability,color:Ni(n.shareability)},void 0,!1,void 0,this),n.secretFindings.length>0?o(F,{label:"secret",color:"red"},void 0,!1,void 0,this):null,n.mirrors.some((r)=>r.exists&&r.identical===!1)?o(F,{label:"drift",color:"blue"},void 0,!1,void 0,this):null]},n.id,!0,void 0,this))},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}function wi({item:e}){return o(g,{flexDirection:"column",gap:1,children:[o(C,{title:e.app,subtitle:e.displayPath},void 0,!1,void 0,this),o(g,{gap:1,children:[o(F,{label:e.domain,color:"cyan"},void 0,!1,void 0,this),o(F,{label:e.kind,color:Gi(e)},void 0,!1,void 0,this),o(F,{label:e.shareability,color:Ni(e.shareability)},void 0,!1,void 0,this),o(F,{label:e.recommendation,color:"yellow"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),o(va,{rows:[["reason",e.reason],["exists",String(e.exists)],["mode",e.mode??"\u2014"],["symlink",String(e.isSymlink)],["git",Pa(e)],["legacy",$a(e)]]},void 0,!1,void 0,this),e.secretFindings.length>0?o(g,{flexDirection:"column",children:[o(d,{color:"red",bold:!0,children:"Secret warnings"},void 0,!1,void 0,this),e.secretFindings.map((t,n)=>o(d,{color:"red",children:[" ",t.type,t.line?` line ${t.line}`:"",": ",t.preview]},`${t.type}-${n}`,!0,void 0,this))]},void 0,!0,void 0,this):null,e.mirrors.length>0?o(g,{flexDirection:"column",children:[o(d,{color:"blue",bold:!0,children:"Mirrors"},void 0,!1,void 0,this),e.mirrors.map((t)=>o(d,{children:[" ",t.displayPath," \u2014 ",t.exists?t.identical===!1?"differs":"identical":"missing"]},t.path,!0,void 0,this))]},void 0,!0,void 0,this):null,o(g,{flexDirection:"column",children:[o(d,{bold:!0,children:e.preview?"Safe preview":"Preview"},void 0,!1,void 0,this),o(d,{color:e.preview?"white":"gray",children:e.preview?e.preview.slice(0,3000):`Suppressed: ${e.previewSuppressedReason??"not available"}`},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)}function vi({verificationUri:e,userCode:t,expiresIn:n}){return o(g,{flexDirection:"column",gap:1,children:[o(C,{title:"Login with GitHub",subtitle:`code expires in ${Math.round(n/60)} minutes`},void 0,!1,void 0,this),o(g,{flexDirection:"column",children:[o(d,{children:"Open:"},void 0,!1,void 0,this),o(d,{color:"blue",underline:!0,children:e},void 0,!1,void 0,this)]},void 0,!0,void 0,this),o(g,{gap:1,children:[o(d,{children:"Enter code:"},void 0,!1,void 0,this),o(d,{color:"green",bold:!0,children:t},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)}function Ai({login:e,apiUrl:t}){return o(g,{flexDirection:"column",children:[o(C,{title:"Logged in",subtitle:t},void 0,!1,void 0,this),o(d,{color:"green",children:["\u2713 ",e]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)}function Ti({login:e,apiUrl:t}){if(!e)return o(d,{color:"yellow",children:"Not logged in. Run `atl login`."},void 0,!1,void 0,this);return o(g,{flexDirection:"column",children:[o(C,{title:"Current account",subtitle:t},void 0,!1,void 0,this),o(d,{color:"green",children:e},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}function Ii(){return o(d,{color:"green",children:"\u2713 Logged out"},void 0,!1,void 0,this)}function Ci({profiles:e,activeProfile:t}){return o(g,{flexDirection:"column",children:[o(C,{title:"Profiles",subtitle:`active: ${t}`},void 0,!1,void 0,this),o(g,{flexDirection:"column",marginTop:1,children:e.map((n)=>o(g,{gap:1,children:[o(d,{color:n.name===t?"green":"gray",children:n.name===t?"\u25CF":"\u25CB"},void 0,!1,void 0,this),o(d,{bold:n.name===t,children:n.name},void 0,!1,void 0,this),o(d,{color:"gray",children:n.createdAt},void 0,!1,void 0,this)]},n.id,!0,void 0,this))},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}function Dt({title:e,name:t}){return o(g,{flexDirection:"column",children:[o(C,{title:e},void 0,!1,void 0,this),o(d,{color:"green",children:["\u2713 ",t]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)}function Bi({configs:e,profileName:t}){return o(g,{flexDirection:"column",children:[o(C,{title:"Saved configs",subtitle:t},void 0,!1,void 0,this),e.length===0?o(d,{color:"gray",children:"No saved configs yet."},void 0,!1,void 0,this):e.map((n)=>o(g,{flexDirection:"column",marginTop:1,children:[o(d,{bold:!0,children:n.stableId},void 0,!1,void 0,this),o(d,{color:"gray",children:n.pathHint??"no path hint"},void 0,!1,void 0,this),n.latestVersion?o(d,{color:"green",children:[n.latestVersion.contentSha256.slice(0,12)," \xB7 ",n.latestVersion.sizeBytes," bytes \xB7 ",n.latestVersion.createdAt]},void 0,!0,void 0,this):null]},n.id,!0,void 0,this))]},void 0,!0,void 0,this)}function xi({config:e,profileName:t}){return o(g,{flexDirection:"column",children:[o(C,{title:e.stableId,subtitle:t},void 0,!1,void 0,this),o(d,{color:"gray",children:e.pathHint??"no path hint"},void 0,!1,void 0,this),o(g,{flexDirection:"column",marginTop:1,children:(e.versions??[]).map((n)=>o(d,{children:[n.contentSha256.slice(0,12)," \xB7 ",n.sizeBytes," bytes \xB7 ",n.createdAt]},n.id,!0,void 0,this))},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}function Ri({stableId:e,profileName:t,versionHash:n,sizeBytes:r,reused:i}){return o(g,{flexDirection:"column",children:[o(C,{title:i?"Config already saved":"Config saved",subtitle:t},void 0,!1,void 0,this),o(d,{color:"green",children:["\u2713 ",e]},void 0,!0,void 0,this),o(d,{color:"gray",children:["Version ",n.slice(0,12)," \xB7 ",r," bytes \xB7 encrypted"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)}function $i({results:e}){return o(g,{flexDirection:"column",children:[o(C,{title:"Skills saved",subtitle:`${e.length} skill${e.length===1?"":"s"} \xB7 account library`},void 0,!1,void 0,this),e.map((t)=>o(g,{flexDirection:"column",marginTop:1,children:[o(d,{color:"green",children:["\u2713 ",o(d,{bold:!0,children:t.name},void 0,!1,void 0,this)," ",o(d,{color:"gray",children:t.stableId},void 0,!1,void 0,this)]},void 0,!0,void 0,this),o(d,{color:"gray",children:[" ",t.files.length," file",t.files.length===1?"":"s"," \xB7 manifest ",t.manifestVersion.contentSha256.slice(0,12)," \xB7 encrypted",t.reused?" \xB7 reused":""]},void 0,!0,void 0,this)]},t.stableId,!0,void 0,this))]},void 0,!0,void 0,this)}function Pi({plan:e}){return o(g,{flexDirection:"column",gap:1,children:[o(C,{title:"Skill install plan",subtitle:`${e.summary.total} saved \xB7 ${e.canonicalRootDisplayPath}`},void 0,!1,void 0,this),o(g,{gap:2,children:[o(M,{label:"new",value:e.summary.new,color:"cyan"},void 0,!1,void 0,this),o(M,{label:"installed",value:e.summary.alreadyInstalled,color:"green"},void 0,!1,void 0,this),o(M,{label:"outdated",value:e.summary.outdated,color:e.summary.outdated>0?"yellow":"green"},void 0,!1,void 0,this),o(M,{label:"conflicts",value:e.summary.conflicts,color:e.summary.conflicts>0?"red":"green"},void 0,!1,void 0,this),o(M,{label:"agents",value:e.summary.detectedAgents,color:"blue"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),o(d,{color:"gray",children:["Detected: ",e.detectedAgents.map((t)=>t.agentName).join(", ")||"Universal Agent Skills only"]},void 0,!0,void 0,this),o(g,{flexDirection:"column",children:e.items.length===0?o(d,{color:"gray",children:"No saved skills yet. Run `atl skills save` first."},void 0,!1,void 0,this):e.items.map((t)=>o(g,{flexDirection:"column",marginTop:1,children:[o(g,{gap:1,children:[o(d,{color:pi(t.status),children:Ra(t.status)},void 0,!1,void 0,this),o(d,{bold:!0,children:t.name},void 0,!1,void 0,this),o(F,{label:t.status,color:pi(t.status)},void 0,!1,void 0,this),t.requiresBackup?o(F,{label:"backup required",color:"yellow"},void 0,!1,void 0,this):null,o(d,{color:"gray",children:t.manifest.contentHash.slice(0,12)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),o(d,{color:"gray",children:[" ",t.reason]},void 0,!0,void 0,this),o(d,{color:"gray",children:[" canonical ",t.canonicalDisplayPath]},void 0,!0,void 0,this),t.projections.length>0?o(d,{color:"gray",children:[" projections ",t.projections.map((n)=>`${n.agent.agentName}:${n.status}`).join(", ")]},void 0,!0,void 0,this):null]},t.stableId,!0,void 0,this))},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}function Ki({result:e}){return o(g,{flexDirection:"column",children:[o(C,{title:e.preview?"Skill install preview":"Skills installed",subtitle:`${e.results.length} skill${e.results.length===1?"":"s"}${e.backup?" \xB7 backups enabled":""}`},void 0,!1,void 0,this),e.results.length===0?o(d,{color:"gray",children:"No skills selected."},void 0,!1,void 0,this):e.results.map((t)=>o(g,{flexDirection:"column",marginTop:1,children:[o(d,{color:t.status==="blocked"?"red":"green",children:[t.status==="blocked"?"!":"\u2713"," ",o(d,{bold:!0,children:t.name},void 0,!1,void 0,this)," ",o(d,{color:"gray",children:t.status},void 0,!1,void 0,this)]},void 0,!0,void 0,this),o(d,{color:"gray",children:[" ",t.reason]},void 0,!0,void 0,this),o(d,{color:"gray",children:[" ",t.canonicalDisplayPath,t.backupPath?` \xB7 backup ${t.backupPath}`:""]},void 0,!0,void 0,this),t.projections.length>0?o(d,{color:"gray",children:[" projections ",t.projections.map((n)=>`${n.agent.agentName}:${n.status}`).join(", ")]},void 0,!0,void 0,this):null]},t.stableId,!0,void 0,this))]},void 0,!0,void 0,this)}function ba({groups:e,onDone:t}){let{exit:n}=qt(),[r,i]=W("overview"),[s,l]=W(0),[a,u]=W(()=>new Set),[c,y]=W(""),[k,p]=W(!1),b=e.filter(gi),B=e.filter((f)=>a.has(f.id)),m=hi(()=>{let f=c.trim().toLowerCase(),v=e.filter((h)=>{if(r==="overview")return!1;if(r==="selected")return a.has(h.id);if(r==="risky")return gi(h);return!0});if(!f)return v;return v.filter((h)=>h.name.toLowerCase().includes(f)||h.description?.toLowerCase().includes(f))},[e,r,c,a]),L=Math.max(0,Math.min(s-8,Math.max(0,m.length-18))),_=m.slice(L,L+18),K=m[s],w=(f)=>{t(f),n()},S=(f)=>{i(f),l(0),y(""),p(!1)};if(yi((f,v)=>{if(k){if(v.return){p(!1),l(0);return}if(v.escape){p(!1),y(""),l(0);return}if(v.backspace||v.delete){y((h)=>h.slice(0,-1));return}if(f&&!v.ctrl)y((h)=>h+f);return}if(f==="q"){w(void 0);return}if(v.escape||f==="b"){if(r==="overview")w(void 0);else S("overview");return}if(f==="c"||v.return&&r==="overview"){w([...a].sort());return}if(f==="s"){S("selected");return}if(f==="r"){S("risky");return}if(f==="a"){if(r==="overview")S("all");else u((h)=>new Set([...h,...m.map((x)=>x.id)]));return}if(f==="n"){u((h)=>{let x=new Set(h);for(let R of m)x.delete(R.id);return x});return}if(f==="f"||f==="/"){if(r==="overview")S("all");p(!0);return}if(v.upArrow||f==="k"){l((h)=>Math.max(0,h-1));return}if(v.downArrow||f==="j"){l((h)=>Math.min(Math.max(m.length-1,0),h+1));return}if(f===" "){let h=m[s];if(!h)return;u((x)=>{let R=new Set(x);if(R.has(h.id))R.delete(h.id);else R.add(h.id);return R})}}),r==="overview")return o(g,{flexDirection:"column",children:[o(C,{title:"Review skill save",subtitle:`${e.length} saveable skill${e.length===1?"":"s"}`},void 0,!1,void 0,this),o(d,{color:"gray",children:[a.size," selected now \xB7 ",b.length," with scripts, warnings, or secret findings"]},void 0,!0,void 0,this),o(g,{flexDirection:"column",marginTop:1,children:[o(d,{color:"green",bold:!0,children:"Will save now"},void 0,!1,void 0,this),B.slice(0,12).map((f)=>o(d,{color:"green",children:["\u2713 ",f.name,Ye(f)?` \xB7 ${Ye(f)}`:""]},f.id,!0,void 0,this)),B.length>12?o(d,{color:"gray",children:["\u2026 ",B.length-12," more selected"]},void 0,!0,void 0,this):null,B.length===0?o(d,{color:"yellow",children:"No skills are selected yet. Review all skills or risky skills before saving."},void 0,!1,void 0,this):null]},void 0,!0,void 0,this),o(g,{flexDirection:"column",marginTop:1,children:[o(d,{color:"yellow",children:"Review before saving"},void 0,!1,void 0,this),o(d,{color:"gray",children:"a all skills \xB7 r risky skills \xB7 s selected \xB7 f find all"},void 0,!1,void 0,this),o(d,{color:"gray",children:"enter/c save selected \xB7 q cancel"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this);return o(g,{flexDirection:"column",children:[o(C,{title:`Review ${xa(r)}`,subtitle:`${a.size} selected total`},void 0,!1,void 0,this),o(d,{color:"gray",children:[m.length," visible \xB7 ",b.length," risky total"]},void 0,!0,void 0,this),o(d,{color:k?"cyan":"gray",children:["Filter: ",c||"all",k?"\u2588":""]},void 0,!0,void 0,this),o(g,{flexDirection:"column",marginTop:1,children:[_.map((f,v)=>{let x=L+v===s,R=a.has(f.id);return o(d,{color:x?"cyan":R?"green":f.secretCount>0?"red":f.warningCount>0||f.hasScripts?"yellow":void 0,children:[x?"\u203A":" "," [",R?"x":" ","] ",f.name,Ye(f)?` \xB7 ${Ye(f)}`:""]},f.id,!0,void 0,this)}),m.length===0?o(d,{color:"yellow",children:"No skills match this view."},void 0,!1,void 0,this):null]},void 0,!0,void 0,this),K?o(d,{color:"gray",children:[K.description??"No description"," \xB7 installed in ",Ji(K.candidates.map((f)=>f.root.agentName)).join(", ")]},void 0,!0,void 0,this):null,o(d,{color:"gray",children:"space toggle \xB7 a select visible \xB7 n clear visible \xB7 / filter \xB7 b back \xB7 c save selected \xB7 q cancel"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}function wa({plan:e,onDone:t}){let{exit:n}=qt(),[r,i]=W("overview"),[s,l]=W(0),[a,u]=W(()=>new Set(e.files.filter((f)=>f.selectedByDefault).map((f)=>f.relativePath))),[c,y]=W(""),[k,p]=W(!1),b=Wi(e),B=e.files.filter((f)=>a.has(f.relativePath)),m=hi(()=>{let f=c.trim().toLowerCase(),v=e.files.filter((h)=>{if(r==="overview")return!1;if(r==="selected")return a.has(h.relativePath);if(r==="all")return!0;return h.confidence===r});if(!f)return v;return v.filter((h)=>h.relativePath.toLowerCase().includes(f))},[r,e.files,c,a]),L=Math.max(0,Math.min(s-8,Math.max(0,m.length-18))),_=m.slice(L,L+18),K=m[s],w=(f)=>{t(f),n()},S=(f)=>{i(f),l(0),y(""),p(!1)};if(yi((f,v)=>{if(k){if(v.return){p(!1),l(0);return}if(v.escape){p(!1),y(""),l(0);return}if(v.backspace||v.delete){y((h)=>h.slice(0,-1));return}if(f&&!v.ctrl)y((h)=>h+f);return}if(f==="q"){w(void 0);return}if(v.escape||f==="b"){if(r==="overview")w(void 0);else S("overview");return}if(f==="c"||v.return&&r==="overview"){w([...a].sort());return}if(f==="s"){S("selected");return}if(f==="h"){S("high-confidence");return}if(f==="m"){S("medium-confidence");return}if(f==="l"){S("low-confidence");return}if(f==="f"||f==="/"){if(r==="overview")S("all");p(!0);return}if(v.upArrow||f==="k"){l((h)=>Math.max(0,h-1));return}if(v.downArrow||f==="j"){l((h)=>Math.min(Math.max(m.length-1,0),h+1));return}if(f===" "){let h=m[s];if(!h)return;u((x)=>{let R=new Set(x);if(R.has(h.relativePath))R.delete(h.relativePath);else R.add(h.relativePath);return R});return}if(f==="a"){u((h)=>new Set([...h,...m.map((x)=>x.relativePath)]));return}if(f==="n")u((h)=>{let x=new Set(h);for(let R of m)x.delete(R.relativePath);return x})}),r==="overview")return o(g,{flexDirection:"column",children:[o(C,{title:"Review folder save",subtitle:e.rootDisplayPath},void 0,!1,void 0,this),o(d,{color:"gray",children:[e.files.length," eligible \xB7 ",e.skipped.length," skipped \xB7 ",a.size," selected now"]},void 0,!0,void 0,this),o(d,{color:"gray",children:[b.high," high \xB7 ",b.medium," medium \xB7 ",b.low," low confidence"]},void 0,!0,void 0,this),o(Li,{plan:e},void 0,!1,void 0,this),o(g,{flexDirection:"column",marginTop:1,children:[o(d,{color:"green",bold:!0,children:"Will save now"},void 0,!1,void 0,this),B.slice(0,12).map((f)=>o(d,{color:"green",children:["\u2713 ",Xt(f.confidence)," ",f.relativePath," \xB7 ",ki(f.sizeBytes)]},f.relativePath,!0,void 0,this)),B.length>12?o(d,{color:"gray",children:["\u2026 ",B.length-12," more selected"]},void 0,!0,void 0,this):null,B.length===0?o(d,{color:"yellow",children:"No files are selected yet. Review high, medium, or low confidence groups before saving."},void 0,!1,void 0,this):null]},void 0,!0,void 0,this),o(g,{flexDirection:"column",marginTop:1,children:[o(d,{color:"yellow",children:"Review before adding more"},void 0,!1,void 0,this),o(d,{color:"gray",children:"h high confidence \xB7 m medium confidence \xB7 l low confidence \xB7 s selected \xB7 f find all"},void 0,!1,void 0,this),o(d,{color:"gray",children:"enter/c save selected \xB7 q cancel"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),e.skipped.length>0?o(d,{color:"yellow",children:[e.skipped.length," blocked path",e.skipped.length===1?"":"s",". Use --preview to inspect reasons."]},void 0,!0,void 0,this):null]},void 0,!0,void 0,this);return o(g,{flexDirection:"column",children:[o(C,{title:`Review ${Ca(r)}`,subtitle:e.rootDisplayPath},void 0,!1,void 0,this),o(d,{color:"gray",children:[m.length," visible \xB7 ",a.size," selected total"]},void 0,!0,void 0,this),o(d,{color:k?"cyan":"gray",children:["Filter: ",c||"all",k?"\u2588":""]},void 0,!0,void 0,this),o(g,{flexDirection:"column",marginTop:1,children:[_.map((f,v)=>{let x=L+v===s,R=a.has(f.relativePath);return o(d,{color:x?"cyan":R?"green":void 0,children:[x?"\u203A":" "," [",R?"x":" ","] ",Xt(f.confidence)," ",f.relativePath," \xB7 ",ki(f.sizeBytes)]},f.relativePath,!0,void 0,this)}),m.length===0?o(d,{color:"yellow",children:"No files match this view."},void 0,!1,void 0,this):null]},void 0,!0,void 0,this),K?o(d,{color:"gray",children:["Reason: ",K.confidenceReasons.join(", "),K.defaultSelectionReason?` \xB7 ${K.defaultSelectionReason}`:""]},void 0,!0,void 0,this):null,o(d,{color:"gray",children:"space toggle \xB7 a select visible \xB7 n clear visible \xB7 / filter \xB7 b back \xB7 c save selected \xB7 q cancel"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}function Li({plan:e}){let t=e.recipeDelta;if(!e.recipe||!t)return null;return o(g,{flexDirection:"column",marginTop:1,children:[o(d,{color:"cyan",children:["Using saved recipe from ",e.recipe.updatedAt]},void 0,!0,void 0,this),o(d,{color:"gray",children:[t.selectedExisting.length," selected \xB7 ",t.newRecommended.length," new recommended \xB7 ",t.newUnreviewed.length," new unreviewed \xB7 ",t.missingSelected.length," missing"]},void 0,!0,void 0,this),t.newRecommended.length>0?o(d,{color:"yellow",children:["New recommended: ",t.newRecommended.slice(0,5).join(", "),t.newRecommended.length>5?"\u2026":""]},void 0,!0,void 0,this):null,t.missingSelected.length>0?o(d,{color:"yellow",children:["Missing from recipe: ",t.missingSelected.slice(0,5).join(", "),t.missingSelected.length>5?"\u2026":""]},void 0,!0,void 0,this):null]},void 0,!0,void 0,this)}function De({plan:e}){let t=Wi(e);return o(g,{flexDirection:"column",children:[o(C,{title:"Folder save preview",subtitle:e.rootDisplayPath},void 0,!1,void 0,this),o(d,{color:"gray",children:[e.files.length," eligible \xB7 ",t.defaultSelected," selected by default \xB7 ",e.skipped.length," skipped"]},void 0,!0,void 0,this),o(d,{color:"gray",children:[t.high," high \xB7 ",t.medium," medium \xB7 ",t.low," low confidence"]},void 0,!0,void 0,this),o(Li,{plan:e},void 0,!1,void 0,this),o(g,{flexDirection:"column",marginTop:1,children:[e.files.slice(0,25).map((n)=>o(d,{color:n.selectedByDefault?"green":n.confidence==="medium-confidence"?"yellow":"gray",children:[n.selectedByDefault?"\u2713":" "," ",Xt(n.confidence)," ",n.relativePath," \xB7 ",n.sizeBytes," bytes \xB7 ",n.confidenceReasons.join(", ")]},n.relativePath,!0,void 0,this)),e.files.length>25?o(d,{color:"gray",children:["\u2026 ",e.files.length-25," more file",e.files.length-25===1?"":"s"]},void 0,!0,void 0,this):null]},void 0,!0,void 0,this),e.skipped.length>0?o(g,{flexDirection:"column",marginTop:1,children:[o(d,{color:"yellow",children:"Skipped"},void 0,!1,void 0,this),e.skipped.slice(0,25).map((n,r)=>o(d,{color:"gray",children:["- ",n.relativePath," \xB7 ",n.reason]},`${n.displayPath}:${n.reason}:${r}`,!0,void 0,this)),e.skipped.length>25?o(d,{color:"gray",children:["\u2026 ",e.skipped.length-25," more skipped"]},void 0,!0,void 0,this):null]},void 0,!0,void 0,this):null]},void 0,!0,void 0,this)}function Mi({result:e}){return o(g,{flexDirection:"column",children:[o(C,{title:e.reused?"Folder already saved":"Folder saved",subtitle:e.profileName},void 0,!1,void 0,this),o(d,{color:"green",children:["\u2713 ",e.rootDisplayPath]},void 0,!0,void 0,this),o(d,{color:"gray",children:[e.files.length," file",e.files.length===1?"":"s"," saved \xB7 ",e.skipped.length," skipped \xB7 manifest ",e.manifestVersion.contentSha256.slice(0,12)]},void 0,!0,void 0,this),e.skipped.length>0?o(d,{color:"yellow",children:"Run with --preview to inspect skipped paths."},void 0,!1,void 0,this):null]},void 0,!0,void 0,this)}function zi({result:e,preview:t}){let n=t?"Apply preview":e.status==="blocked"?"Apply blocked":"Config applied";return o(g,{flexDirection:"column",children:[o(C,{title:n,subtitle:e.profileName},void 0,!1,void 0,this),o(Hi,{result:e},void 0,!1,void 0,this),o(d,{children:e.displayPath},void 0,!1,void 0,this),o(d,{color:"gray",children:e.reason},void 0,!1,void 0,this),e.backupPath?o(d,{color:"yellow",children:["Backup: ",e.backupPath]},void 0,!0,void 0,this):null,o(d,{color:"gray",children:["Version ",e.version.contentSha256.slice(0,12)," \xB7 ",e.version.sizeBytes," bytes \xB7 encrypted"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)}function Fi({result:e}){return o(_i,{result:e,title:e.preview?"Folder apply preview":e.blocked?"Folder apply blocked":"Folder applied",emptyText:"No saved files in this folder."},void 0,!1,void 0,this)}function Ui({result:e}){return o(_i,{result:e,title:e.preview?"Profile switch preview":e.blocked?"Profile switch blocked":"Profile switched",emptyText:"No saved configs in this profile."},void 0,!1,void 0,this)}function _i({result:e,title:t,emptyText:n}){let r=e.results.filter((s)=>s.status==="create"||s.status==="update").length,i=e.results.filter((s)=>s.status==="blocked").length;return o(g,{flexDirection:"column",children:[o(C,{title:t,subtitle:e.profileName},void 0,!1,void 0,this),e.results.length===0?o(d,{color:"gray",children:n},void 0,!1,void 0,this):null,e.results.length>0?o(d,{color:"gray",children:[r," change",r===1?"":"s"," \xB7 ",i," blocked \xB7 ",e.results.length," total"]},void 0,!0,void 0,this):null,o(g,{flexDirection:"column",marginTop:1,children:e.results.map((s)=>o(g,{flexDirection:"column",children:[o(Hi,{result:s},void 0,!1,void 0,this),o(d,{color:"gray",children:[" ",s.displayPath]},void 0,!0,void 0,this),o(d,{color:"gray",children:[" ",s.reason]},void 0,!0,void 0,this),s.backupPath?o(d,{color:"yellow",children:[" Backup: ",s.backupPath]},void 0,!0,void 0,this):null]},s.stableId,!0,void 0,this))},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}function Oi({checks:e}){let t=e.filter((r)=>r.status==="fail").length,n=e.filter((r)=>r.status==="warn").length;return o(g,{flexDirection:"column",gap:1,children:[o(C,{title:"Doctor",subtitle:t?`${t} failing`:n?`${n} warning${n===1?"":"s"}`:"all checks passed"},void 0,!1,void 0,this),o(g,{flexDirection:"column",children:e.map((r)=>o(g,{gap:1,children:[o(d,{color:Ta(r.status),children:Aa(r.status)},void 0,!1,void 0,this),o(d,{bold:!0,children:r.label},void 0,!1,void 0,this),o(d,{color:"gray",children:r.detail},void 0,!1,void 0,this)]},r.label,!0,void 0,this))},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}function jt({query:e}){return o(d,{color:"red",children:["No inventory item matched: ",e]},void 0,!0,void 0,this)}function C({title:e,subtitle:t}){return o(g,{flexDirection:"column",children:[o(d,{bold:!0,color:"cyan",children:"\u25C6 Atelier"},void 0,!1,void 0,this),o(g,{gap:1,children:[o(d,{bold:!0,children:e},void 0,!1,void 0,this),t?o(d,{color:"gray",children:t},void 0,!1,void 0,this):null]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)}function M({label:e,value:t,color:n}){return o(g,{flexDirection:"column",borderStyle:"round",borderColor:n,paddingX:1,children:[o(d,{color:n,bold:!0,children:t},void 0,!1,void 0,this),o(d,{color:"gray",children:e},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}function F({label:e,color:t}){return o(d,{color:t,children:["[",e,"]"]},void 0,!0,void 0,this)}function Hi({result:e}){return o(g,{gap:1,children:[o(d,{color:fi(e.status),children:Ia(e.status)},void 0,!1,void 0,this),o(d,{bold:!0,children:e.stableId},void 0,!1,void 0,this),o(F,{label:e.status,color:fi(e.status)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}function va({rows:e}){return o(g,{flexDirection:"column",children:e.map(([t,n])=>o(g,{gap:1,children:[o(d,{color:"gray",children:t.padEnd(10)},void 0,!1,void 0,this),o(d,{children:n},void 0,!1,void 0,this)]},t,!0,void 0,this))},void 0,!1,void 0,this)}function Gi(e){let t=typeof e==="string"?e:e.kind;if(t==="private")return"red";if(t==="generated")return"magenta";if(t==="config")return"green";return"yellow"}function Ni(e){if(e==="private")return"red";if(e==="shareable")return"green";return"yellow"}function Aa(e){if(e==="pass")return"\u2713";if(e==="warn")return"!";return"\u2717"}function Ta(e){if(e==="pass")return"green";if(e==="warn")return"yellow";return"red"}function fi(e){if(e==="unchanged")return"green";if(e==="create")return"cyan";if(e==="update")return"yellow";return"red"}function Ia(e){if(e==="unchanged")return"\u2713";if(e==="create")return"+";if(e==="update")return"\xB1";return"\u2717"}function Wi(e){return{high:e.files.filter((t)=>t.confidence==="high-confidence").length,medium:e.files.filter((t)=>t.confidence==="medium-confidence").length,low:e.files.filter((t)=>t.confidence==="low-confidence").length,defaultSelected:e.files.filter((t)=>t.selectedByDefault).length}}function Xt(e){if(e==="high-confidence")return"high";if(e==="medium-confidence")return"medium";return"low"}function Ca(e){if(e==="selected")return"selected files";if(e==="high-confidence")return"high confidence files";if(e==="medium-confidence")return"medium confidence files";if(e==="low-confidence")return"low confidence files";return"all files"}function Ba(e){if(e.provenanceKinds.includes("package-backed"))return"package-backed";if(e.provenanceKinds.includes("npx-skills-installed"))return"npx-skills";if(e.provenanceKinds.includes("local-authored"))return"local-authored";return"unknown-copied"}function gi(e){return e.hasScripts||e.warningCount>0||e.secretCount>0}function Ye(e){return[e.hasScripts?"scripts":void 0,e.secretCount>0?`${e.secretCount} secret${e.secretCount===1?"":"s"}`:void 0,e.warningCount>0?`${e.warningCount} warning${e.warningCount===1?"":"s"}`:void 0].filter(Boolean).join(", ")}function xa(e){if(e==="selected")return"selected skills";if(e==="risky")return"risky skills";return"all skills"}function pi(e){if(e==="new")return"cyan";if(e==="already-installed")return"green";if(e==="outdated")return"yellow";return"red"}function Ra(e){if(e==="conflict")return"!";if(e==="already-installed")return"\u2713";return"\u25CF"}function Ji(e){return[...new Set(e)]}function ki(e){if(e<1024)return`${e} B`;let t=e/1024;if(t<1024)return`${Math.round(t)} KiB`;return`${Math.round(t/1024)} MiB`}function $a(e){let t=Object.entries(e.legacyManagers??{});if(t.length===0)return"not scanned";return t.map(([n,r])=>`${n}: ${r}`).join(", ")}function Pa(e){if(!e.git)return"not in repo";return`${e.git.tracked?"tracked":"untracked"}${e.git.modified?", modified":""} @ ${e.git.root}`}import{jsxDEV as T}from"react/jsx-dev-runtime";var ve=Zi(import.meta.dir,"../../.."),Xi=Na(),de=je(Xi,"inventory.json"),Ve,Ua=25,z=new Fa;z.name("atl").description("Atelier config management CLI").version("0.2.0");z.command("login").description("Login to Atelier with GitHub device auth").option("--api-url <url>","Atelier API URL",xe()).action(async(e)=>{let t=await cn({apiUrl:e.apiUrl,onPrompt:async(n)=>{await A(T(vi,{verificationUri:n.verificationUri,userCode:n.userCode,expiresIn:n.expiresIn},void 0,!1,void 0,this))}});await A(T(Ai,{login:t.user.login,apiUrl:t.apiUrl},void 0,!1,void 0,this))});z.command("whoami").description("Show the current Atelier account").action(async()=>{let e=await un();if(await A(T(Ti,{login:e?.user.login,apiUrl:e?.apiUrl},void 0,!1,void 0,this)),!e)process.exitCode=1});z.command("logout").description("Remove the local Atelier session").action(async()=>{fn(),await A(T(Ii,{},void 0,!1,void 0,this))});var et=z.command("profile").description("Manage account-backed config profiles");et.command("list").description("List remote profiles").action(async()=>{await A(T(Ci,{profiles:await pn(),activeProfile:$()},void 0,!1,void 0,this))});et.command("create").description("Create a remote profile").argument("<name>").action(async(e)=>{let t=await kn(e);await A(T(Dt,{title:"Profile created",name:t.name},void 0,!1,void 0,this))});et.command("switch").description("Apply a remote profile to this machine and make it active").argument("<name>").option("--preview","show profile changes without writing files or switching").option("--backup","back up differing local files before replacing them").action(async(e,t)=>{await Qi(e,t)});et.command("current").description("Show the active local profile").action(async()=>{await A(T(Dt,{title:"Active profile",name:$()},void 0,!1,void 0,this))});z.command("checkout").description("Alias for `atl profile switch`").argument("<name>").option("--preview","show profile changes without writing files or switching").option("--backup","back up differing local files before replacing them").action(async(e,t)=>{await Qi(e,t)});var tt=z.command("vault").description("Advanced vault controls");tt.command("status").description("Show vault initialization and local unlock state").action(async()=>{let e=await ze();console.log(`Vault: ${e.initialized?"initialized":"not initialized"}`),console.log(`Local state: ${e.unlocked?"unlocked":"locked"}`),console.log(`Active profile: ${e.activeProfile}`)});tt.command("init").description("Initialize the encrypted vault now instead of waiting for first save").action(async()=>{let e=await Di("Create an Atelier vault passphrase: "),t=await gt(e);console.log(`Vault initialized for profile ${t.profileName}`)});tt.command("unlock").description("Unlock this machine with the vault passphrase").action(async()=>{let e=await Ie("Vault passphrase: "),t=await Tn(e);console.log(`Vault unlocked for profile ${t.activeProfile}`)});tt.command("lock").description("Remove local unlocked vault material from this machine").action(async()=>{In(),console.log("Vault locked")});z.command("save").description("Save a config snapshot to the active encrypted profile").argument("<id-or-path>").option("--preview","show which folder files would be saved without uploading").option("--review","open the interactive folder review picker").action(async(e,t)=>{await Wa(e,t)});z.command("apply").description("Apply a saved config to this machine").argument("<id-or-path>").option("--preview","show the local changes without writing files").option("--backup","back up a differing local file before replacing it").action(async(e,t)=>{await qa(e,t)});var qi=z.command("saved").description("Inspect encrypted configs saved remotely");qi.command("list").description("List saved configs for the active profile").action(async()=>{let e=$();await A(T(Bi,{configs:await ke(e),profileName:e},void 0,!1,void 0,this))});qi.command("show").description("Show saved metadata and version history").argument("<stable-id>").action(async(e)=>{let t=$(),n=await Pe(t,e);if(!n)throw Error(`Saved config not found: ${e}`);await A(T(xi,{config:n,profileName:t},void 0,!1,void 0,this))});var en=z.command("skills").description("Manage Agent Skills");en.command("scan").description("Scan this machine for Agent Skills").option("--json","print JSON instead of Ink output").action(async(e)=>{let t=se({repoRoot:ve});if(e.json)return Ce(t);if(await A(T(Qt,{scan:t},void 0,!1,void 0,this)),t.conflicts.length>0)process.exitCode=1});en.command("save").description("Save selected Agent Skills to your Atelier account").option("--yes","save all non-conflicting skills without prompting").action(async(e)=>{await _a(e)});en.command("install").description("Install saved Agent Skills on this machine").option("--preview","show install actions without writing files").option("--backup","back up differing local skill directories before replacing them").option("--yes","install all non-installed skills without prompting").action(async(e)=>{await Oa(e)});z.command("scan").description("Scan this machine and write local inventory").option("--path <path...>","additional manual path(s) to scan").option("--legacy","include legacy manager signals like yadm").action(async(e)=>{let t=await Zr({repoRoot:ve,manualPaths:e.path??[],includeLegacyManagers:e.legacy}),n=Xr(t,{path:de});await A(T(Yt,{inventory:t,path:n},void 0,!1,void 0,this))});z.command("list").description("List inventory items with polished terminal output").option("--domain <domain>","filter by domain").option("--app <app>","filter by app").option("--secrets","only items with secret warnings").option("--drift","only items with mirror drift").option("--generated","only generated/app-state items").option("--private","only private items").option("--missing","only missing registry items").option("--json","print JSON instead of Ink output").action(async(e)=>{let t=Be(),n=Qa(t.items,e);if(e.json)return Ce(n);await A(T(bi,{items:n,title:"Inventory"},void 0,!1,void 0,this))});z.command("inspect").description("Inspect one inventory item by id or path").argument("<id-or-path>").option("--json","print JSON instead of Ink output").action(async(e,t)=>{let n=Be(),r=ji(n,e);if(t.json)return Ce(r??null);await A(r?T(wi,{item:r},void 0,!1,void 0,this):T(jt,{query:e},void 0,!1,void 0,this))});z.command("summary").description("Print the last scan summary").option("--json","print JSON instead of Ink output").action(async(e)=>{let t=Be();if(e.json)return Ce(t.summary);await A(T(Yt,{inventory:t,path:de},void 0,!1,void 0,this))});z.command("doctor").description("Check Atelier CLI, account, inventory, and local environment health").option("--json","print JSON instead of Ink output").action(async(e)=>{let t=ja();if(e.json)Ce(t);else await A(T(Oi,{checks:t},void 0,!1,void 0,this));if(t.some((n)=>n.status==="fail"))process.exitCode=1});z.parseAsync(process.argv).catch((e)=>{console.error(e instanceof Error?e.message:e),process.exit(1)});function Ce(e){q.write(`${JSON.stringify(e,null,2)}
17
+ `)}function Yi(e){return e.split(`
13
18
  `).map((t)=>{if(t.startsWith("+")&&!t.startsWith("+++"))return`\x1B[32m${t}\x1B[0m`;if(t.startsWith("-")&&!t.startsWith("---"))return`\x1B[31m${t}\x1B[0m`;if(t.startsWith("@@"))return`\x1B[36m${t}\x1B[0m`;return t}).join(`
14
- `)}function X(){if(!Et(O))throw new Error("No inventory found. Run `atl scan` first.");return JSON.parse(jt(O,"utf-8"))}function En(){if(process.env.ATELIER_STATE_DIR)return process.env.ATELIER_STATE_DIR;if(process.env.XDG_STATE_HOME)return j(process.env.XDG_STATE_HOME,"atelier");if(Fn()==="win32"&&process.env.LOCALAPPDATA)return j(process.env.LOCALAPPDATA,"Atelier");return j(Gn(),".local","state","atelier")}async function jn(e){let t=X(),r=ir(t,e);if(!r){await g(d(xe,{query:e},void 0,!1,void 0,this)),process.exitCode=1;return}let n=await or({initialize:!0}),a=await vt(r,{passphrase:n});await g(d(Qt,{stableId:a.stableId,profileName:a.profileName,versionHash:a.version.contentSha256,sizeBytes:a.version.sizeBytes,reused:a.reused},void 0,!1,void 0,this))}async function eo(e,t){let r=await or({initialize:!1}),n=await lt(e,{passphrase:r,preview:t.preview,backup:t.backup});if(await g(d(Ht,{result:n,preview:t.preview},void 0,!1,void 0,this)),n.diff&&(t.preview||n.status==="blocked"))console.log(rr(n.diff));if(n.status==="blocked")process.exitCode=1}async function nr(e,t){let r=await Q(e);if(!r)throw new Error(`Profile not found: ${e}`);let n=await to(),a=await st(r.name,{passphrase:n,preview:t.preview,backup:t.backup});if(!t.preview&&!a.blocked)Me(r.name);if(await g(d(Nt,{result:a},void 0,!1,void 0,this)),t.preview||a.blocked){for(let i of a.results)if(i.diff&&(i.status==="update"||i.status==="blocked"))console.log(`
15
- ${i.stableId}`),console.log(rr(i.diff))}if(a.blocked)process.exitCode=1}async function to(){let e=await F();if(e.initialized&&!e.unlocked)return await J("Vault passphrase: ");return}async function or({initialize:e}){let t=await F();if(!t.initialized){if(!e)throw new Error("Atelier vault is not initialized. Run `atl save <id>` first.");return await ar("Create an Atelier vault passphrase: ")}if(!t.unlocked)return await J("Vault passphrase: ");return}async function ar(e){let t=await J(e),r=await J("Confirm vault passphrase: ");if(t!==r)throw new Error("Vault passphrases do not match");return t}async function J(e){if(!B.isTTY)return E.write(e),Dt??=jt(0,"utf-8").split(/\r?\n/),Dt.shift()??"";return E.write(e),B.setEncoding("utf-8"),B.resume(),B.setRawMode(!0),await new Promise((t)=>{let r="",n=()=>{B.off("data",i),B.setRawMode(!1),B.pause()},a=()=>{n(),E.write(`
16
- `),t(r)},i=(c)=>{for(let f of String(c)){if(f==="\x03")n(),E.write(`
17
- `),process.exit(130);if(f==="\r"||f===`
18
- `){a();return}if(f==="\x7F"){r=r.slice(0,-1);continue}r+=f}};B.on("data",i)})}function ro(e,t){return e.filter((r)=>{if(t.domain&&r.domain.toLowerCase()!==t.domain.toLowerCase())return!1;if(t.app&&r.app.toLowerCase()!==t.app.toLowerCase())return!1;if(t.secrets&&r.secretFindings.length===0)return!1;if(t.drift&&!r.mirrors.some((n)=>n.exists&&n.identical===!1))return!1;if(t.generated&&r.kind!=="generated")return!1;if(t.private&&r.shareability!=="private")return!1;if(t.missing&&r.exists)return!1;return!0})}function ir(e,t){let r=$e(t);return e.items.find((n)=>n.id===t||$e(n.path)===r||$e(n.displayPath)===r)??e.items.find((n)=>n.displayPath.includes(t)||n.path.includes(t))}function $e(e){return e.replace(/^~(?=\/|$)/,process.env.HOME??"").toLowerCase()}function no(){let e=[],t=Et(O)?X():void 0,r=Y();return e.push({label:"runtime",status:process.versions.bun?"pass":"fail",detail:process.versions.bun?`Bun ${process.versions.bun}`:"Bun is required"}),e.push({label:"api",status:"pass",detail:W()}),e.push({label:"session",status:r?"pass":"warn",detail:r?`logged in as ${r.user.login}`:"not logged in; run `atl login`"}),e.push({label:"state directory",status:"pass",detail:er}),e.push({label:"inventory",status:t?"pass":"warn",detail:t?`${t.summary.existing}/${t.summary.total} existing, generated ${t.generatedAt}`:"missing; run `atl scan`"}),e.push({label:"secret warnings",status:t&&t.summary.secrets>0?"warn":"pass",detail:t?`${t.summary.secrets} item${t.summary.secrets===1?"":"s"} flagged`:"no inventory"}),e}
19
+ `)}function Be(){if(!Ee(de))throw Error("No inventory found. Run `atl scan` first.");return JSON.parse(Vt(de,"utf-8"))}async function _a(e){let t=se({repoRoot:ve});await A(T(Qt,{scan:t},void 0,!1,void 0,this));let n=t.groups.filter((a)=>!a.conflict);if(n.length===0){console.log(t.conflicts.length>0?"No non-conflicting skills to save.":"No Agent Skills found."),process.exitCode=1;return}if(t.conflicts.length>0)console.log(`Skipping ${t.conflicts.length} duplicate skill name conflict${t.conflicts.length===1?"":"s"} for now.`);let r=e.yes?n:await Si(n);if(!r||r.length===0){console.log("Skill save cancelled");return}let i=r.filter((a)=>a.hasScripts||a.secretCount>0||a.warningCount>0);if(i.length>0&&!e.yes){if(console.log(`Selected skills include ${i.length} skill${i.length===1?"":"s"} with scripts, warnings, or secret findings.`),!await Te("Continue saving selected skills? [y/N] ")){console.log("Skill save cancelled");return}}let s=await Ae({initialize:!0}),l=await ue(()=>Cr(r,{passphrase:s}),{title:"Saving skills",subtitle:`${r.length} selected`,detail:"Encrypting and uploading skill files\u2026"});await A(T($i,{results:l},void 0,!1,void 0,this))}async function Oa(e){let t=await Ae({initialize:!1}),n=await ue(()=>Zt({passphrase:t,repoRoot:ve}),{title:"Planning skill install",detail:"Loading saved skills and comparing local installs\u2026"});if(await A(T(Pi,{plan:n},void 0,!1,void 0,this)),e.preview)return;let r=n.items.filter((u)=>u.status!=="already-installed");if(r.length===0){console.log("All saved skills are already installed.");return}let i=e.yes?r:await Ha(r);if(i.length===0){console.log("Skill install cancelled");return}let s=Boolean(e.backup),l=i.filter((u)=>u.requiresBackup);if(l.length>0&&!s){if(!P.isTTY)throw Error(`${l.length} selected skill${l.length===1?"":"s"} would replace differing local content. Rerun with --backup to proceed.`);if(console.log(`${l.length} selected skill${l.length===1?"":"s"} would replace differing local content.`),s=await Te("Create backups and replace those local skill directories? [y/N] "),!s){console.log("Skill install cancelled");return}}let a=await ue(()=>oi({passphrase:t,repoRoot:ve,backup:s,stableIds:i.map((u)=>u.stableId)}),{title:"Installing skills",subtitle:`${i.length} selected`,detail:"Decrypting saved skills and writing canonical installs\u2026"});if(await A(T(Ki,{result:a},void 0,!1,void 0,this)),a.blocked)process.exitCode=1}async function Ha(e){if(!P.isTTY)throw Error("Rerun in an interactive terminal or pass --yes to install all non-installed skills.");console.log("Select skills to install:"),e.forEach((n,r)=>{let i=[n.status,n.requiresBackup?"backup required":void 0].filter(Boolean).join(", ");console.log(`${r+1}. ${n.name} (${i})`)});let t=(await tn("Enter numbers/ranges, all, or empty to cancel: ")).trim().toLowerCase();return Ga(e,t)}function Ga(e,t){if(!t)return[];if(t==="all"||t==="a")return e;let n=new Set;for(let r of t.split(",")){let i=r.trim();if(!i)continue;let s=i.match(/^(\d+)\s*-\s*(\d+)$/);if(s){let a=Number(s[1]),u=Number(s[2]);for(let c=Math.min(a,u);c<=Math.max(a,u);c++)n.add(c-1);continue}let l=Number(i);if(Number.isInteger(l))n.add(l-1)}return[...n].sort((r,i)=>r-i).map((r)=>e[r]).filter((r)=>Boolean(r))}function Na(){if(process.env.ATELIER_STATE_DIR)return process.env.ATELIER_STATE_DIR;if(process.env.XDG_STATE_HOME)return je(process.env.XDG_STATE_HOME,"atelier");if(za()==="win32"&&process.env.LOCALAPPDATA)return je(process.env.LOCALAPPDATA,"Atelier");return je(Ma(),".local","state","atelier")}async function Wa(e,t){let n=Ee(de)?Be():void 0,r=n?ji(n,e):void 0,i=Ei(e),s=!r&&Ee(i)&&La(i).isDirectory();if(!r&&!s){await A(T(jt,{query:e},void 0,!1,void 0,this)),process.exitCode=1;return}if(r?.isDirectory||s){let u=r??i,c=await Mt(u);if(t.preview){await A(T(De,{plan:c},void 0,!1,void 0,this));return}let y=await xr(c),k=y?await Xa(y):void 0;if(k==="cancel")return;let p=c.files.filter((S)=>S.selectedByDefault).map((S)=>S.relativePath),b,B,m=!1;if(k&&k!=="restart")b=k.selectedFiles.map((S)=>S.relativePath),B=k.runId;else if(t.review||c.files.length>Ua||p.length===0){if(m=!0,!P.isTTY)throw await A(T(De,{plan:c},void 0,!1,void 0,this)),Error(`Folder has ${c.files.length} eligible files and ${p.length} recommended selections; rerun in an interactive terminal to review selections.`);if(b=await mi(c),!b){console.log("Folder save cancelled");return}if(b.length===0){console.log("No files selected"),process.exitCode=1;return}}else if(b=p,await A(T(De,{plan:c},void 0,!1,void 0,this)),!await Te(`Save ${p.length} recommended file${p.length===1?"":"s"}? [y/N] `)){console.log("Folder save cancelled");return}let L=b&&!B&&await Ja(c,b,m),_=Object.fromEntries(c.files.map((S)=>[S.relativePath,S.contentSha256])),K=await Ae({initialize:!0}),w=await ue(()=>Ir(u,{passphrase:K,includeRelativePaths:b,expectedContentSha256ByRelativePath:_,resumeRunId:B}),{title:"Saving folder",subtitle:c.rootDisplayPath,detail:`Encrypting and uploading ${b.length} file${b.length===1?"":"s"}\u2026`});if(L&&b)await Br(c,b),console.log(c.recipe?"Updated folder save recipe":"Saved folder save recipe");await A(T(Mi,{result:w},void 0,!1,void 0,this));return}if(t.preview)throw Error("--preview is only supported for folder saves");let l=await Ae({initialize:!0}),a=await ue(()=>Tr(r,{passphrase:l}),{title:"Saving config",subtitle:r.displayPath,detail:"Encrypting and uploading file\u2026"});await A(T(Ri,{stableId:a.stableId,profileName:a.profileName,versionHash:a.version.contentSha256,sizeBytes:a.version.sizeBytes,reused:a.reused},void 0,!1,void 0,this))}async function Ja(e,t,n){if(!P.isTTY||t.length===0)return!1;if(e.recipe){if(!n||Za(e.recipe.includeRelativePaths,t))return!1;return await Te("Update saved folder recipe with this selection? [y/N] ")}return await Te("Remember this folder selection as a recipe for future saves? [y/N] ")}function Za(e,t){if(e.length!==t.length)return!1;let n=new Set(t);return e.every((r)=>n.has(r))}async function Xa(e){let t=e.uploadedFiles.length,n=e.selectedFiles.length,r=e.error?` Last error: ${e.error}`:"";if(!P.isTTY)throw Error(`Previous folder save failed before commit (${t}/${n} files uploaded). Rerun in an interactive terminal to resume, restart, or discard.${r}`);console.log(`Previous folder save failed before commit for ${e.rootDisplayPath}.`),console.log(`Uploaded ${t}/${n} selected files. Manifest was not committed.${r}`);while(!0){let i=(await tn("Resume upload, restart review, discard recovery, or cancel? [r/s/d/q] ")).trim().toLowerCase();if(i==="r"||i==="resume"||i==="")return e;if(i==="s"||i==="restart")return await zt(e.runId),"restart";if(i==="d"||i==="discard")return await zt(e.runId),console.log("Discarded folder save recovery record"),"cancel";if(i==="q"||i==="cancel")return"cancel"}}async function qa(e,t){let n=await Ae({initialize:!1}),r=await Fn(e,{passphrase:n,preview:t.preview,backup:t.backup});if(Da(r)){if(await A(T(Fi,{result:r},void 0,!1,void 0,this)),t.preview||r.blocked)Vi(r.results);if(r.blocked)process.exitCode=1;return}if(await A(T(zi,{result:r,preview:t.preview},void 0,!1,void 0,this)),r.diff&&(t.preview||r.status==="blocked"))console.log(Yi(r.diff));if(r.status==="blocked")process.exitCode=1}async function Qi(e,t){let n=await $e(e);if(!n)throw Error(`Profile not found: ${e}`);let r=await Ya(),i=await Un(n.name,{passphrase:r,preview:t.preview,backup:t.backup});if(!t.preview&&!i.blocked)dn(n.name);if(await A(T(Ui,{result:i},void 0,!1,void 0,this)),t.preview||i.blocked)Vi(i.results);if(i.blocked)process.exitCode=1}async function Ya(){let e=await ze();if(e.initialized&&!e.unlocked)return await Ie("Vault passphrase: ");return}async function Ae({initialize:e}){let t=await ze();if(!t.initialized){if(!e)throw Error("Atelier vault is not initialized. Run `atl save <id>` first.");return await Di("Create an Atelier vault passphrase: ")}if(!t.unlocked)return await Ie("Vault passphrase: ");return}async function Di(e){let t=await Ie(e),n=await Ie("Confirm vault passphrase: ");if(t!==n)throw Error("Vault passphrases do not match");return t}async function Te(e){let t=await tn(e);return t.trim().toLowerCase()==="y"||t.trim().toLowerCase()==="yes"}async function tn(e){if(!P.isTTY)return q.write(e),Ve??=Vt(0,"utf-8").split(/\r?\n/),Ve.shift()??"";return q.write(e),P.setEncoding("utf-8"),P.resume(),await new Promise((t)=>{let n="",r=()=>{P.off("data",s),P.pause()},i=()=>{r(),t(n)},s=(l)=>{for(let a of String(l)){if(a==="\x03")r(),q.write(`
20
+ `),process.exit(130);if(a==="\r"||a===`
21
+ `){q.write(`
22
+ `),i();return}n+=a}};P.on("data",s)})}async function Ie(e){if(!P.isTTY)return q.write(e),Ve??=Vt(0,"utf-8").split(/\r?\n/),Ve.shift()??"";return q.write(e),P.setEncoding("utf-8"),P.resume(),P.setRawMode(!0),await new Promise((t)=>{let n="",r=()=>{P.off("data",s),P.setRawMode(!1),P.pause()},i=()=>{r(),q.write(`
23
+ `),t(n)},s=(l)=>{for(let a of String(l)){if(a==="\x03")r(),q.write(`
24
+ `),process.exit(130);if(a==="\r"||a===`
25
+ `){i();return}if(a==="\x7F"){n=n.slice(0,-1);continue}n+=a}};P.on("data",s)})}function Qa(e,t){return e.filter((n)=>{if(t.domain&&n.domain.toLowerCase()!==t.domain.toLowerCase())return!1;if(t.app&&n.app.toLowerCase()!==t.app.toLowerCase())return!1;if(t.secrets&&n.secretFindings.length===0)return!1;if(t.drift&&!n.mirrors.some((r)=>r.exists&&r.identical===!1))return!1;if(t.generated&&n.kind!=="generated")return!1;if(t.private&&n.shareability!=="private")return!1;if(t.missing&&n.exists)return!1;return!0})}function ji(e,t){let n=Et(t);return e.items.find((r)=>r.id===t||Et(r.path)===n||Et(r.displayPath)===n)??e.items.find((r)=>r.displayPath.includes(t)||r.path.includes(t))}function Et(e){return Ei(e).toLowerCase()}function Ei(e){return Zi(e.replace(/^~(?=\/|$)/,process.env.HOME??""))}function Da(e){return"results"in e}function Vi(e){for(let t of e)if(t.diff&&(t.status==="update"||t.status==="blocked"))console.log(`
26
+ ${t.stableId}`),console.log(Yi(t.diff))}function ja(){let e=[],t=Ee(de)?Be():void 0,n=Re();return e.push({label:"runtime",status:process.versions.bun?"pass":"fail",detail:process.versions.bun?`Bun ${process.versions.bun}`:"Bun is required"}),e.push({label:"api",status:"pass",detail:xe()}),e.push({label:"session",status:n?"pass":"warn",detail:n?`logged in as ${n.user.login}`:"not logged in; run `atl login`"}),e.push({label:"state directory",status:"pass",detail:Xi}),e.push({label:"inventory",status:t?"pass":"warn",detail:t?`${t.summary.existing}/${t.summary.total} existing, generated ${t.generatedAt}`:"missing; run `atl scan`"}),e.push({label:"secret warnings",status:t&&t.summary.secrets>0?"warn":"pass",detail:t?`${t.summary.secrets} item${t.summary.secrets===1?"":"s"} flagged`:"no inventory"}),e}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@manan_joshi/atelier",
3
- "version": "0.1.5",
3
+ "version": "0.3.0",
4
4
  "description": "Atelier config management CLI",
5
5
  "type": "module",
6
6
  "bin": {
@@ -11,9 +11,12 @@
11
11
  "README.md",
12
12
  "LICENSE"
13
13
  ],
14
+ "publishConfig": {
15
+ "access": "public"
16
+ },
14
17
  "scripts": {
15
18
  "clean": "rm -rf dist",
16
- "build": "bun build --target=bun --packages=external --minify --outfile dist/index.js src/index.tsx && chmod +x dist/index.js",
19
+ "build": "bun build --target=bun --packages=external --minify --define __ATELIER_SKILL_SHARING__=false --outfile dist/index.js src/index.tsx && chmod +x dist/index.js",
17
20
  "prepublishOnly": "bun run clean && bun run build"
18
21
  },
19
22
  "dependencies": {