@manan_joshi/atelier 0.2.0 → 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 (2) hide show
  1. package/dist/index.js +23 -20
  2. package/package.json +5 -2
package/dist/index.js CHANGED
@@ -1,23 +1,26 @@
1
1
  #!/usr/bin/env bun
2
2
  // @bun
3
- import{stdin as S,stdout as F}from"process";import{existsSync as $e,readFileSync as pr,statSync as Ni}from"fs";import{homedir as Vi,platform as Di}from"os";import{join as Ce,resolve as hn}from"path";import{Command as Ei}from"commander";import{createDecipheriv as ao,createHash as fo}from"crypto";import{existsSync as go,mkdirSync as qr}from"fs";import{copyFile as uo,readFile as yo,writeFile as wo}from"fs/promises";import{homedir as He,platform as bo}from"os";import{basename as vo,dirname as Nr,join as P,resolve as po}from"path";import{createPatch as mo}from"diff";import{execFileSync as Re}from"child_process";import{chmodSync as mr,existsSync as Me,mkdirSync as Ar,readFileSync as hr,rmSync as In,writeFileSync as Tr}from"fs";import{homedir as Rn,platform as Mn}from"os";import{dirname as Br,join as Ue}from"path";var kr=Ue(Rn(),".config","atelier"),Z=Ue(kr,"session.json"),ee=Ue(kr,"config.json"),Le="dev.atelier.session",Un="https://atelier.mananjoshi.me/api",Ln="Ov23liiscZlMXcJ2RLnd";function ge(){return process.env.ATELIER_API_URL??Un}function Fn(){return process.env.ATELIER_GITHUB_CLIENT_ID??Ln}async function Sr(e){let r=e.apiUrl??ge(),t=e.clientId??Fn(),n=await Xn(t);await e.onPrompt({verificationUri:n.verification_uri,userCode:n.user_code,expiresIn:n.expires_in});let c=await Wn(t,n,e.onPoll),o=await fetch(`${r}/auth/github/exchange`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({githubAccessToken:c})});if(!o.ok)throw new Error(`Atelier API rejected GitHub login (${o.status})`);let s=await o.json();return Zn({apiUrl:r,user:s.user,token:s.token}),{apiUrl:r,user:s.user}}async function Cr(){let e=re();if(!e)return;let r=await fetch(`${e.apiUrl}/me`,{headers:{authorization:`Bearer ${e.token}`}});if(!r.ok)return;return{user:(await r.json()).user,apiUrl:e.apiUrl}}function re(){let e=ue();if(!e)return;let r=Jn(e);if(!r)return;return{apiUrl:e.apiUrl,user:e.user,token:r}}function T(){return xr().activeProfile??"personal"}function $r(e){_n({...xr(),activeProfile:e})}function zr(){let e=ue();if(e?.tokenStorage==="keychain")On(e.user.id);if(Me(Z))In(Z)}function ue(){if(!Me(Z))return;return JSON.parse(hr(Z,"utf-8"))}function xr(){if(!Me(ee))return{};return JSON.parse(hr(ee,"utf-8"))}function _n(e){Ar(Br(ee),{recursive:!0}),Tr(ee,JSON.stringify(e,null,2)+`
4
- `,"utf-8"),mr(ee,384)}function Zn(e){Ar(Br(Z),{recursive:!0});let r=Mn()==="darwin",t={apiUrl:e.apiUrl,user:e.user,tokenStorage:r?"keychain":"file",createdAt:new Date().toISOString()};if(r)Qn(e.user.id,e.token);else t.token=e.token;Tr(Z,JSON.stringify(t,null,2)+`
5
- `,"utf-8"),mr(Z,384)}function Jn(e){if(e.tokenStorage==="file")return e.token;return Yn(e.user.id)}async function Xn(e){let r=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(!r.ok)throw new Error(`GitHub device-code request failed (${r.status})`);return r.json()}async function Wn(e,r,t){let n=r.interval,c=Date.now()+r.expires_in*1000;while(Date.now()<c){await Gn(n*1000),await t?.("Waiting for GitHub authorization\u2026");let o=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:r.device_code,grant_type:"urn:ietf:params:oauth:grant-type:device_code"})});if(!o.ok)throw new Error(`GitHub token polling failed (${o.status})`);let s=await o.json();if(s.access_token)return s.access_token;if(s.error==="authorization_pending")continue;if(s.error==="slow_down"){n+=5;continue}if(s.error==="access_denied")throw new Error("GitHub login was denied");if(s.error==="expired_token")throw new Error("GitHub login code expired");throw new Error(s.error_description??"GitHub login failed")}throw new Error("GitHub login timed out")}function Qn(e,r){Re("security",["add-generic-password","-a",e,"-s",Le,"-w",r,"-U"],{stdio:"ignore"})}function Yn(e){try{return Re("security",["find-generic-password","-a",e,"-s",Le,"-w"],{encoding:"utf-8",stdio:["ignore","pipe","ignore"]}).trim()}catch{return}}function On(e){try{Re("security",["delete-generic-password","-a",e,"-s",Le],{stdio:"ignore"})}catch{}}function Gn(e){return new Promise((r)=>setTimeout(r,e))}async function Kr(){return(await(await x("/profiles")).json()).profiles}async function Ir(e){return(await(await x("/profiles",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({name:e})})).json()).profile}async function de(e){let r=await x(`/profiles/${encodeURIComponent(e)}`);if(r.status===404)return;return(await r.json()).profile}async function te(){return await(await x("/vault")).json()}async function Rr(e){await x("/vault",{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify(e)})}async function Mr(e){let r=await x(`/profiles/${encodeURIComponent(e)}/key`);if(r.status===404)return;return(await r.json()).profileKey}async function Fe(e,r){return(await(await x(`/profiles/${encodeURIComponent(e)}/key`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify(r)})).json()).profileKey}async function ne(e,r={}){let n=await(await x(`/profiles/${encodeURIComponent(e)}/configs`)).json();return r.includeInternal?n.configs:n.configs.filter((c)=>c.kind!=="folder-file")}async function ye(e,r){let t=await x(`/profiles/${encodeURIComponent(e)}/configs/${encodeURIComponent(r)}`);if(t.status===404)return;return(await t.json()).config}async function Ur(e,r,t){return await(await x(`/profiles/${encodeURIComponent(e)}/configs/${encodeURIComponent(r)}/versions`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(t)})).json()}async function we(e,r,t){let n=await x(`/profiles/${encodeURIComponent(e)}/configs/${encodeURIComponent(r)}/versions/${encodeURIComponent(t)}/blob`);if(n.status===404)return;return await n.json()}async function x(e,r={}){let t=re();if(!t)throw new Error("Not logged in. Run `atl login`.");let n=await fetch(`${t.apiUrl}${e}`,{...r,headers:{...r.headers,authorization:`Bearer ${t.token}`}});if(!n.ok&&n.status!==404){let c=await n.json().catch(()=>{return});throw new Error(c?.error??`Atelier API request failed (${n.status})`)}return n}import{execFileSync as Xe}from"child_process";import{createCipheriv as Hn,createDecipheriv as Pn,randomBytes as oe,scryptSync as qn}from"crypto";import{chmodSync as Nn,existsSync as Fr,mkdirSync as Vn,readFileSync as Dn,rmSync as En,writeFileSync as jn}from"fs";import{homedir as eo,platform as We}from"os";import{dirname as ro,join as _r}from"path";var Qe="dev.atelier.vault",to=_r(eo(),".config","atelier"),J=_r(to,"vault-key.json"),Lr={N:32768,r:8,p:1},no=67108864,_e="aes-256-gcm";async function pe(){let e=H();return{initialized:(await te()).initialized,unlocked:Boolean(Je(e.user.id)),activeProfile:T()}}async function Ye(e,r=T()){io(e);let t=H();if((await te()).initialized)throw new Error("Atelier vault already exists. Run `atl vault unlock` if this machine is locked.");let c=await de(r);if(!c)throw new Error(`Profile not found: ${r}`);let o=oe(32),s=oe(32),l=oe(16),u=Wr(e,l,Lr),f=Ze(o,u),b=Ze(s,o);return await Rr({kdf:{algorithm:"scrypt",salt:be(l),params:Lr},encryptedVaultKey:f}),await Fe(r,{version:1,algorithm:b.algorithm,nonce:b.nonce,encryptedKey:b.ciphertext}),Oe(t.user.id,o),{profileName:c.name}}async function Zr(e){let r=H(),t=await te();if(!t.initialized)throw new Error("Atelier vault is not initialized. Run `atl save <id>` or `atl vault init`.");let n=Xr(t,e);return Oe(r.user.id,n),{activeProfile:T()}}function Jr(){let e=H();co(e.user.id)}async function oo(e,r=T()){let t=H(),n=Je(t.user.id);if(n)return n;if(!e)throw new Error("Vault passphrase is required");let c=await te();if(!c.initialized){await Ye(e,r);let o=Je(t.user.id);if(!o)throw new Error("Vault initialized but local key was not stored");return o}return Xr(c,e)}async function G(e,r=T()){let t=await oo(e,r),n=await Mr(r);if(n)return Qr(n.encryptedKey,n.nonce,t);let c=oe(32),o=Ze(c,t);return await Fe(r,{version:1,algorithm:o.algorithm,nonce:o.nonce,encryptedKey:o.ciphertext}),c}function Xr(e,r){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 t=ve(e.kdf.salt),n=Wr(r,t,e.kdf.params),c=Qr(e.encryptedVaultKey.ciphertext,e.encryptedVaultKey.nonce,n);return Oe(H().user.id,c),c}function Wr(e,r,t){return qn(e,r,32,{N:t.N,r:t.r,p:t.p,maxmem:no})}function Ze(e,r){let t=oe(12),n=Hn(_e,r,t),c=Buffer.concat([n.update(e),n.final()]),o=n.getAuthTag();return{algorithm:_e,nonce:be(t),ciphertext:be(Buffer.concat([c,o]))}}function Qr(e,r,t){let n=Buffer.from(ve(e)),c=Buffer.from(ve(r)),o=n.subarray(0,-16),s=n.subarray(-16),l=Pn(_e,t,c);return l.setAuthTag(s),Buffer.concat([l.update(o),l.final()])}function io(e){if(e.length<12)throw new Error("Vault passphrase must be at least 12 characters.")}function H(){let e=re();if(!e)throw new Error("Not logged in. Run `atl login`.");return e}function Oe(e,r){let t=be(r);if(We()==="darwin"){Xe("security",["add-generic-password","-a",e,"-s",Qe,"-w",t,"-U"],{stdio:"ignore"});return}Vn(ro(J),{recursive:!0}),jn(J,JSON.stringify({userId:e,key:t},null,2)+`
6
- `,"utf-8"),Nn(J,384)}function Je(e){let r=We()==="darwin"?so(e):lo(e);return r?Buffer.from(ve(r)):void 0}function co(e){if(We()==="darwin"){try{Xe("security",["delete-generic-password","-a",e,"-s",Qe],{stdio:"ignore"})}catch{}return}if(Fr(J))En(J)}function so(e){try{return Xe("security",["find-generic-password","-a",e,"-s",Qe,"-w"],{encoding:"utf-8",stdio:["ignore","pipe","ignore"]}).trim()}catch{return}}function lo(e){if(!Fr(J))return;let r=JSON.parse(Dn(J,"utf-8"));return r.userId===e?r.key:void 0}function be(e){return Buffer.from(e).toString("base64url")}function ve(e){return new Uint8Array(Buffer.from(e,"base64url"))}var Ao="aes-256-gcm",ho=new TextDecoder("utf-8",{fatal:!0});async function Vr(e,r={}){let t=r.profileName??T(),n=await Co(t,e);if(!n)throw new Error(`Saved config not found: ${e}`);let c=await G(r.passphrase,t);if(n.kind==="folder-manifest")return await To(t,n,c,r);let o=await qe(t,n,c,{preview:r.preview});return await et(o,r)}async function Dr(e,r={}){let n=(await ne(e)).filter((s)=>(s.kind==="file"||s.kind==="folder-manifest")&&s.pathHint&&Ne(s));if(n.length===0)return{profileName:e,results:[],blocked:!1,preview:Boolean(r.preview),backup:Boolean(r.backup)};let c=await G(r.passphrase,e),o=await Promise.all(n.map((s)=>Bo(e,s,c,{preview:r.preview})));return await jr(e,o.flat(),r)}async function To(e,r,t,n){if(!r.pathHint)throw new Error(`Saved folder has no target path: ${r.stableId}`);let c=await Er(e,r,t,{preview:n.preview});return{...await jr(e,c,n),stableId:r.stableId,displayPath:r.pathHint}}async function Bo(e,r,t,n){if(r.kind==="folder-manifest")return await Er(e,r,t,n);return[await qe(e,r,t,n)]}async function Er(e,r,t,n){let c=await So(e,r,t),o=[];for(let s of c.files)o.push(await ko(e,s.stableId,s.pathHint,s.versionId,s.contentSha256,t,n));return o}async function jr(e,r,t){if(t.preview)return{profileName:e,results:r.map((s)=>s.result),blocked:!1,preview:!0,backup:Boolean(t.backup)};if(r.some((s)=>s.result.status==="update")&&!t.backup)return{profileName:e,results:r.map((s)=>{if(s.result.status==="update")return{...s.result,status:"blocked",reason:"local file differs; rerun with --preview to inspect or --backup to replace safely"};if(s.result.status==="create")return{...s.result,reason:"would create missing local file after blocked changes are resolved"};return s.result}),blocked:!0,preview:!1,backup:!1};let c=nt(),o=[];for(let s of r)o.push(await et(s,{...t,backupRunId:c}));return{profileName:e,results:o,blocked:!1,preview:!1,backup:Boolean(t.backup)}}async function et(e,r){let{result:t,savedBytes:n}=e;if(t.status==="unchanged")return t;if(t.status==="create"){if(!r.preview)await Yr(t.targetPath,n);return{...t,reason:r.preview?"would create missing local file":"created missing local file"}}if(r.preview)return t;if(!r.backup)return{...t,status:"blocked",reason:"local file differs; rerun with --preview to inspect or --backup to replace safely"};let c=await $o(t.stableId,t.targetPath,r.backupRunId??nt());return await Yr(t.targetPath,n),{...t,reason:"replaced differing local file after creating backup",backupPath:c}}async function ko(e,r,t,n,c,o,s){let l=await we(e,r,n);if(!l)throw new Error(`Saved folder file blob not found: ${r}`);if(l.version.contentSha256!==c)throw new Error(`Saved folder file hash mismatch for ${r}`);return await qe(e,{id:r,stableId:r,kind:"file",pathHint:t,latestVersion:l.version},o,s,l.ciphertext)}async function qe(e,r,t,n,c){if(r.kind!=="file")throw new Error(`Cannot apply non-file config: ${r.stableId}`);if(!r.pathHint)throw new Error(`Saved config has no target path: ${r.stableId}`);let o=Ne(r);if(!o)throw new Error(`Saved config has no versions: ${r.stableId}`);let s=c?{version:o,ciphertext:c}:await we(e,r.stableId,o.id);if(!s)throw new Error(`Saved config blob not found: ${r.stableId}`);let l=rt(s.ciphertext,s.version.nonce,t),u=tt(r.pathHint),f=r.pathHint,b=go(u),m=b?await yo(u):void 0,y=Pe(l);if(y!==o.contentSha256)throw new Error(`Saved content hash mismatch for ${r.stableId}`);if(!b)return{savedBytes:l,result:{profileName:e,stableId:r.stableId,targetPath:u,displayPath:f,status:"create",reason:n.preview?"would create missing local file":"created missing local file",diff:Or("",l,f),version:Ge(o)}};if(Pe(m)===y)return{savedBytes:l,result:{profileName:e,stableId:r.stableId,targetPath:u,displayPath:f,status:"unchanged",reason:"local file already matches saved version",version:Ge(o)}};return{savedBytes:l,result:{profileName:e,stableId:r.stableId,targetPath:u,displayPath:f,status:"update",reason:n.preview?"would replace differing local file":"local file differs",diff:Or(m,l,f),version:Ge(o)}}}async function So(e,r,t){let n=Ne(r);if(!n)throw new Error(`Saved folder has no versions: ${r.stableId}`);let c=await we(e,r.stableId,n.id);if(!c)throw new Error(`Saved folder manifest blob not found: ${r.stableId}`);let o=rt(c.ciphertext,c.version.nonce,t);if(Pe(o)!==n.contentSha256)throw new Error(`Saved folder manifest hash mismatch for ${r.stableId}`);let l=JSON.parse(o.toString("utf-8"));if(l.version!==1||!Array.isArray(l.files))throw new Error(`Invalid folder manifest: ${r.stableId}`);if(l.files.some((u)=>!u.stableId||!u.pathHint||!u.versionId||!u.contentSha256))throw new Error(`Invalid folder manifest entries: ${r.stableId}`);return l}async function Co(e,r){let t=await ye(e,r);if(t)return t;let n=Hr(r);return(await ne(e)).find((o)=>o.pathHint&&Hr(o.pathHint)===n)}function Ne(e){return e.latestVersion??e.versions?.[0]}function rt(e,r,t){let n=Buffer.from(e,"base64url"),c=Buffer.from(r,"base64url"),o=n.subarray(0,-16),s=n.subarray(-16),l=ao(Ao,t,c);return l.setAuthTag(s),Buffer.concat([l.update(o),l.final()])}async function Yr(e,r){qr(Nr(e),{recursive:!0}),await wo(e,r)}async function $o(e,r,t){let n=P(zo(),t,Pr(e),Pr(r));return qr(Nr(n),{recursive:!0}),await uo(r,n),n}function zo(){if(process.env.ATELIER_STATE_DIR)return P(process.env.ATELIER_STATE_DIR,"backups");if(process.env.XDG_STATE_HOME)return P(process.env.XDG_STATE_HOME,"atelier","backups");if(bo()==="win32"&&process.env.LOCALAPPDATA)return P(process.env.LOCALAPPDATA,"Atelier","backups");return P(He(),".local","state","atelier","backups")}function Or(e,r,t){let n=typeof e==="string"?e:Gr(e),c=Gr(r);if(n===void 0||c===void 0)return;return mo(`local ${t}`,n,c,"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 Gr(e){if(e.includes(0))return;try{return ho.decode(e)}catch{return}}function tt(e){if(e==="~")return He();if(e.startsWith("~/"))return P(He(),e.slice(2));return po(e)}function Hr(e){return tt(e).toLowerCase()}function Pe(e){return fo("sha256").update(e).digest("hex")}function Ge(e){return{id:e.id,contentSha256:e.contentSha256,sizeBytes:e.sizeBytes,createdAt:e.createdAt}}function nt(){return new Date().toISOString().replaceAll(":","-").replaceAll(".","-")}function Pr(e){return e.replace(/[^a-zA-Z0-9._-]+/g,"_").replace(/^_+|_+$/g,"")||vo(e)||"item"}import{createCipheriv as Uo,createHash as wt,randomBytes as bt}from"crypto";import{existsSync as vt}from"fs";import{lstat as Lo,mkdir as pt,readFile as X,readdir as mt,stat as At,unlink as Fo,writeFile as ht}from"fs/promises";import{homedir as ie,platform as _o}from"os";import{basename as je,extname as Zo,join as K,relative as Jo,resolve as Xo}from"path";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 Ae(e){let r=[],t=e.split(/\r?\n/);for(let[n,c]of Ve)for(let o of e.matchAll(c)){let s=o.index??0,l=e.slice(0,s).split(/\r?\n/).length;r.push({type:n,line:l,preview:me(o[0])})}return t.forEach((n,c)=>{for(let o of n.matchAll(/[A-Za-z0-9_+\/=.-]{32,}/g)){let s=o[0];if(!xo(s,n)&&it(s,n))r.push({type:"High-entropy string",line:c+1,preview:me(s)})}}),Io(r)}function me(e){if(e.length<=8)return"[redacted]";return`${e.slice(0,4)}\u2026${e.slice(-4)}`}function ot(e){let r=e;for(let[,t]of Ve)r=r.replace(t,(n)=>me(n));return r=r.replace(/[A-Za-z0-9_+\/=.-]{32,}/g,(t)=>{if(it(t,e))return me(t);return t}),r}function xo(e,r){return Ve.some(([,t])=>{return t.lastIndex=0,Array.from(r.matchAll(t)).some((n)=>n[0].includes(e)||e.includes(n[0]))})}function it(e,r){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(r)&&/^[A-Za-z0-9_.-]+$/.test(e))return!1;return Ko(e)>4.2&&/[A-Za-z]/.test(e)&&/[0-9]/.test(e)}function Ko(e){let r=new Map;for(let n of e)r.set(n,(r.get(n)??0)+1);let t=0;for(let n of r.values()){let c=n/e.length;t-=c*Math.log2(c)}return t}function Io(e){let r=new Set;return e.filter((t)=>{let n=`${t.type}:${t.line}:${t.preview}`;if(r.has(n))return!1;return r.add(n),!0})}var he=1048576;function ct(e){let r=[];if(!e.exists)r.push("file does not exist");if(e.isDirectory||e.kind==="directory"||e.format==="directory")r.push("directory saving is not supported yet");if(e.kind==="generated")r.push("generated/cache files are not saved");if(e.kind==="private"||e.shareability==="private")r.push("private/auth files are blocked");if(e.secretFindings.length>0)r.push("detected secret material");if(e.size!==void 0&&e.size>1048576)r.push(`file is larger than ${Mo(1048576)}`);if(Ro(e))r.push("binary files are not supported yet");return{ok:r.length===0,reasons:r}}function De(e){let r=ct(e);if(!r.ok)throw new Error(`Cannot save ${e.id}: ${r.reasons.join("; ")}`)}function Ro(e){if(e.previewSuppressedReason?.toLowerCase().includes("binary"))return!0;return["binary","sqlite","db"].includes(e.format.toLowerCase())}function Mo(e){if(e<1024)return`${e} B`;let r=e/1024;if(r<1024)return`${Math.round(r)} KiB`;return`${Math.round(r/1024)} MiB`}var st="aes-256-gcm",Wo=1,lt=2000,Qo=new TextDecoder("utf-8",{fatal:!0}),Tt=new Set([".git","node_modules","dist","build",".next",".turbo","cache","caches","logs","tmp","temp"]),Bt=[/cache/i,/history/i,/session/i,/state/i,/\.mdb$/i,/\.sqlite/i,/\.db$/i,/zcompdump/i,/logs?/i,/lock$/i,/lock\./i],kt=[/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],at=25,ft=new Set([".conf",".config",".ini",".json",".jsonc",".toml",".yaml",".yml"]),gt=new Set([".cjs",".css",".fish",".js",".lua",".md",".mjs",".ps1",".py",".sh",".ts",".txt",".vim",".zsh"]),ut=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"]),dt=new Set(["readme","readme.md","license","install.sh","setup.sh"]),Yo=[/local/i,/backup/i,/archive/i,/old/i,/copy/i,/sample/i,/example/i,/template/i];async function St(e,r={}){De(e);let t=T(),n=await G(r.passphrase,t),c=await X(e.path),o=await Ee(t,n,e.id,"file",e.displayPath,c);return{profileName:t,stableId:e.id,version:o.version,reused:o.reused}}async function er(e){let r=typeof e==="string"?ci(e):e.path,t=Te(r),n=await At(r).catch(()=>{return});if(!n)throw new Error(`Folder does not exist: ${t}`);if(!n.isDirectory())throw new Error(`Not a folder: ${t}`);let c=typeof e==="string"?Ft(t):e.id,o=[],s=[];return await Ut(r,async(u,f)=>{let b=Te(u),m=Lt(f);if(o.length>=lt){s.push(N(u,b,m,`folder save is limited to ${lt} files`));return}let y=await Eo(c,u,m);if("reason"in y)s.push(N(u,b,m,y.reason));else o.push(y)},s),o.sort((u,f)=>u.relativePath.localeCompare(f.relativePath)),s.sort((u,f)=>u.relativePath.localeCompare(f.relativePath)),jo(o),await Oo({stableId:c,rootPath:r,rootDisplayPath:t,files:o,skipped:s})}async function Ct(e,r={}){let t=await er(e),n=T(),c=r.resumeRunId?await Do(r.resumeRunId):void 0,o=c?.selectedFiles.map((y)=>y.relativePath)??r.includeRelativePaths??t.files.filter((y)=>y.selectedByDefault).map((y)=>y.relativePath),s=new Set(o),l={...t,files:t.files.filter((y)=>s.has(y.relativePath))};if(l.files.length===0)throw new Error(`No eligible files selected in ${l.rootDisplayPath}`);let u=c?Object.fromEntries(c.selectedFiles.map((y)=>[y.relativePath,y.contentSha256])):r.expectedContentSha256ByRelativePath;Go(l,u);let f=c??await qo(n,l);Po(f,n,l);let b=await G(r.passphrase,n),m=[];try{f.status="uploading",f.currentStep="uploading-files",f.error=void 0,await q(f);for(let w of l.files){let M=f.uploadedFiles.find((d)=>d.relativePath===w.relativePath&&d.contentSha256===w.contentSha256);if(M){m.push(M);continue}let O=await X(w.path);if(ce(O)!==w.contentSha256)throw new Error(`Folder file changed during save: ${w.relativePath}`);let U=await Ee(n,b,w.stableId,"folder-file",w.displayPath,O),k={...w,version:U.version,reused:U.reused};m.push(k),f.uploadedFiles.push(k),await q(f)}f.currentStep="verifying-files",await q(f),await Ho(l.files);let y={version:Wo,rootPathHint:l.rootDisplayPath,savedAt:new Date().toISOString(),files:m.map((w)=>({stableId:w.stableId,relativePath:w.relativePath,pathHint:w.displayPath,versionId:w.version.id,contentSha256:w.version.contentSha256,sizeBytes:w.sizeBytes,createdAt:w.version.createdAt}))},h=Buffer.from(JSON.stringify(y,null,2),"utf-8");f.currentStep="uploading-manifest",await q(f);let z=await Ee(n,b,l.stableId,"folder-manifest",l.rootDisplayPath,h);return await Kt(f.runId),{profileName:n,stableId:l.stableId,rootDisplayPath:l.rootDisplayPath,manifestVersion:z.version,files:m,skipped:l.skipped,reused:z.reused}}catch(y){throw f.status="failed",f.error=y instanceof Error?y.message:String(y),await q(f),new Error(`Folder save failed before manifest commit. Rerun the same save to resume. ${y instanceof Error?y.message:String(y)}`)}}async function $t(e,r){let t=T(),n=new Date().toISOString(),c=await xt(t,e.stableId,e.rootPath),o={version:1,profileName:t,stableId:e.stableId,rootPath:e.rootPath,rootDisplayPath:e.rootDisplayPath,includeRelativePaths:[...new Set(r)].sort(),createdAt:c?.createdAt??n,updatedAt:n};return await Vo(o),o}async function Oo(e){let r=T(),t=await xt(r,e.stableId,e.rootPath);if(!t)return e;let n=new Set(t.includeRelativePaths),c=new Set(e.files.map((f)=>f.relativePath)),o=e.files.filter((f)=>n.has(f.relativePath)).map((f)=>f.relativePath).sort(),s=t.includeRelativePaths.filter((f)=>!c.has(f)).sort(),l=e.files.filter((f)=>f.selectedByDefault&&!n.has(f.relativePath)).map((f)=>f.relativePath).sort(),u=e.files.filter((f)=>!f.selectedByDefault&&!n.has(f.relativePath)).map((f)=>f.relativePath).sort();for(let f of e.files)f.selectedByDefault=n.has(f.relativePath),f.defaultSelectionReason=f.selectedByDefault?"selected by saved recipe":"not selected by saved recipe";return{...e,recipe:t,recipeDelta:{selectedExisting:o,missingSelected:s,newRecommended:l,newUnreviewed:u}}}async function zt(e){let r=T();return(await No()).filter((n)=>n.status==="failed"&&n.profileName===r&&n.stableId===e.stableId&&n.rootPath===e.rootPath).sort((n,c)=>c.updatedAt.localeCompare(n.updatedAt))[0]}async function rr(e){await Kt(e)}function Go(e,r){if(!r)return;for(let t of e.files){let n=r[t.relativePath];if(n&&n!==t.contentSha256)throw new Error(`Folder file changed since review plan was created: ${t.relativePath}`)}}async function Ho(e){for(let r of e){let t=await X(r.path);if(ce(t)!==r.contentSha256)throw new Error(`Folder file changed during save: ${r.relativePath}`)}}function Po(e,r,t){if(e.profileName!==r||e.stableId!==t.stableId||e.rootPath!==t.rootPath)throw new Error("Folder save run does not match this folder/profile")}async function qo(e,r){let t=new Date().toISOString(),n={version:1,runId:`${si()}-${bt(4).toString("hex")}`,status:"uploading",currentStep:"created",profileName:e,stableId:r.stableId,rootPath:r.rootPath,rootDisplayPath:r.rootDisplayPath,selectedFiles:r.files,uploadedFiles:[],createdAt:t,updatedAt:t};return await q(n),n}async function No(){let e=nr();if(!vt(e))return[];let r=await mt(e).catch(()=>[]);return(await Promise.all(r.filter((n)=>n.endsWith(".json")).map(async(n)=>{try{return JSON.parse(await X(K(e,n),"utf-8"))}catch{return}}))).filter((n)=>Boolean(n&&n.version===1&&n.runId))}async function xt(e,r,t){let n=It(e,r,t);if(!vt(n))return;try{let c=JSON.parse(await X(n,"utf-8"));if(c.version!==1||c.profileName!==e||c.stableId!==r||c.rootPath!==t)return;return c}catch{return}}async function Vo(e){await pt(Rt(),{recursive:!0}),await ht(It(e.profileName,e.stableId,e.rootPath),JSON.stringify(e,null,2)+`
9
- `,"utf-8")}async function Do(e){return JSON.parse(await X(tr(e),"utf-8"))}async function q(e){await pt(nr(),{recursive:!0}),await ht(tr(e.runId),JSON.stringify({...e,updatedAt:new Date().toISOString()},null,2)+`
10
- `,"utf-8")}async function Kt(e){await Fo(tr(e)).catch(()=>{return})}function tr(e){return K(nr(),`${_t(e)}.json`)}function nr(){return K(Mt(),"folder-save-runs")}function It(e,r,t){let n=wt("sha256").update(`${e}\x00${r}\x00${t}`).digest("hex").slice(0,24);return K(Rt(),`${_t(r)}-${n}.json`)}function Rt(){return K(Mt(),"folder-save-recipes")}function Mt(){if(process.env.ATELIER_STATE_DIR)return process.env.ATELIER_STATE_DIR;if(process.env.XDG_STATE_HOME)return K(process.env.XDG_STATE_HOME,"atelier");if(_o()==="win32"&&process.env.LOCALAPPDATA)return K(process.env.LOCALAPPDATA,"Atelier");return K(ie(),".local","state","atelier")}async function Ee(e,r,t,n,c,o){let s=ii(o,r);return await Ur(e,t,{kind:n,pathHint:c,contentSha256:ce(o),ciphertextSha256:ce(s.ciphertextBytes),sizeBytes:o.byteLength,algorithm:s.algorithm,profileKeyVersion:1,nonce:s.nonce,ciphertext:s.ciphertext})}async function Ut(e,r,t){let n=await mt(e,{withFileTypes:!0}).catch(()=>[]);for(let c of n){let o=K(e,c.name),s=Jo(e,o),l=Lt(s),u=Te(o);if(ri(c.name)){t.push(N(o,u,l,"generated or private path segment"));continue}let f=await Lo(o).catch(()=>{return});if(!f){t.push(N(o,u,l,"cannot inspect path"));continue}if(f.isSymbolicLink()){t.push(N(o,u,l,"symlinks are skipped"));continue}if(f.isDirectory()){await Ut(o,async(b,m)=>{await r(b,K(s,m))},t);continue}if(!f.isFile()){t.push(N(o,u,l,"not a regular file"));continue}await r(o,s)}}async function Eo(e,r,t){let n=await At(r).catch(()=>{return});if(!n)return{reason:"cannot inspect file"};if(n.size>he)return{reason:`file is larger than ${li(he)}`};if(ti(t))return{reason:"generated or state file"};if(ni(t))return{reason:"private or secret-like path"};let c=await X(r).catch(()=>{return});if(!c)return{reason:"cannot read file"};let o=oi(c);if(o===void 0)return{reason:"binary files are not supported yet"};if(Ae(o).length>0)return{reason:"detected secret material"};let s=ei(t,n.size);return{stableId:`${e}:${Ft(t)}`,path:r,displayPath:Te(r),relativePath:t,sizeBytes:n.size,contentSha256:ce(c),confidence:s.confidence,confidenceReasons:s.reasons,selectedByDefault:!1}}function N(e,r,t,n){return{path:e,displayPath:r,relativePath:t,reason:n,confidence:"blocked",confidenceReasons:[n]}}function jo(e){let r=0;for(let t of e){if(t.confidence!=="high-confidence"){t.selectedByDefault=!1,t.defaultSelectionReason="not selected by default";continue}if(r>=at){t.selectedByDefault=!1,t.defaultSelectionReason=`high-confidence preselection limit of ${at} reached`;continue}t.selectedByDefault=!0,t.defaultSelectionReason="high-confidence config file",r+=1}}function ei(e,r){let t=je(e).toLowerCase(),n=Zo(t),c=or(e),o=[];if(Yo.some((s)=>s.test(e)))return o.push("name suggests example, backup, or local-only material"),{confidence:"low-confidence",reasons:o};if(e.startsWith("."))o.push("dotfile-style config path");if(c.length<=2)o.push("shallow folder path");if(ut.has(t))o.push("recognized config filename");if(ft.has(n))o.push(`recognized config extension ${n}`);if(ut.has(t)||ft.has(n)&&c.length<=3)return{confidence:"high-confidence",reasons:o};if(dt.has(t))o.push("recognized supporting document");if(gt.has(n))o.push(`recognized text extension ${n}`);if(r<=65536)o.push("small text file");if(dt.has(t)||gt.has(n)||c.length<=3)return{confidence:"medium-confidence",reasons:o};return o.push("unrecognized text file in a deeper folder path"),{confidence:"low-confidence",reasons:o}}function ri(e){let r=e.toLowerCase();return Tt.has(r)||Bt.some((t)=>t.test(e))||kt.some((t)=>t.test(e))}function ti(e){return or(e).some((r)=>Tt.has(r.toLowerCase())||Bt.some((t)=>t.test(r)))}function ni(e){return or(e).some((r)=>kt.some((t)=>t.test(r)))}function or(e){return e.split(/[\\/]+/).filter(Boolean)}function oi(e){if(e.includes(0))return;try{return Qo.decode(e)}catch{return}}function ii(e,r){let t=bt(12),n=Uo(st,r,t),c=Buffer.concat([n.update(e),n.final()]),o=n.getAuthTag(),s=Buffer.concat([c,o]);return{algorithm:st,nonce:yt(t),ciphertext:yt(s),ciphertextBytes:s}}function ci(e){if(e==="~")return ie();if(e.startsWith("~/"))return K(ie(),e.slice(2));return Xo(e)}function Te(e){return e.startsWith(ie())?`~${e.slice(ie().length)}`:e}function Lt(e){return e.split(/[\\/]+/).join("/")}function Ft(e){return e.replace(/[^A-Za-z0-9_.-]+/g,":").replace(/^:+|:+$/g,"")||je(e)||"folder"}function si(){return new Date().toISOString().replaceAll(":","-").replaceAll(".","-")}function _t(e){return e.replace(/[^a-zA-Z0-9._-]+/g,"_").replace(/^_+|_+$/g,"")||je(e)||"item"}function ce(e){return wt("sha256").update(e).digest("hex")}function yt(e){return Buffer.from(e).toString("base64url")}function li(e){if(e<1024)return`${e} B`;let r=e/1024;if(r<1024)return`${Math.round(r)} KiB`;return`${Math.round(r/1024)} MiB`}import{execFileSync as Qt}from"child_process";import{existsSync as Q,lstatSync as ai,mkdirSync as fi,readdirSync as cr,readFileSync as se,statSync as V,writeFileSync as gi}from"fs";import{homedir as ui,userInfo as di}from"os";import{dirname as Yt,join as W,relative as Ot,resolve as yi}from"path";var Zt=[{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 Jt(e){let n=e.replace(/\/\*[\s\S]*?\*\//g,"").replace(/(^|[^:])\/\/.*$/gm,"$1").replace(/,\s*([}\]])/g,"$1");return JSON.parse(n)}var Y=ui(),wi=new Set([".zsh",".zshrc",".zshenv",".sh",".json",".jsonc",".toml",".md",".yml",".yaml",".gitconfig",".gitignore",".ghostty",""]),bi=[/cache/i,/history/i,/session/i,/state/i,/\.mdb$/i,/\.sqlite/i,/\.db$/i,/zcompdump/i,/logs?/i],vi=[/credential/i,/secret/i,/token/i,/auth\.json$/i,/hosts\.yml$/i,/config\.json$/i],ke;async function Gt(e){ke=e.includeLegacyManagers?xi():void 0;let t=pi(e.repoRoot).flatMap((o)=>o.items.map((s)=>({definition:o,item:s}))),n=new Set,c=[];for(let{definition:o,item:s}of t){let l=ir(s.path);n.add(l),c.push(mi(o,s,l))}for(let o of Ai()){if(n.has(o.path))continue;n.add(o.path),c.push(Xt(o))}for(let o of e.manualPaths??[]){let s=ir(o);if(n.has(s))continue;n.add(s),c.push(Xt({path:s,reason:"manual path"}))}return c.sort((o,s)=>`${o.domain}:${o.app}:${o.path}`.localeCompare(`${s.domain}:${s.app}:${s.path}`)),{version:1,generatedAt:new Date().toISOString(),repoRoot:e.repoRoot,home:Y,items:c,summary:{total:c.length,existing:c.filter((o)=>o.exists).length,secrets:c.filter((o)=>o.secretFindings.length>0).length,drift:c.filter((o)=>o.mirrors.some((s)=>s.exists&&s.identical===!1)).length,generated:c.filter((o)=>o.kind==="generated").length,private:c.filter((o)=>o.shareability==="private").length}}}function Ht(e,r={}){let t=r.path??W(e.repoRoot,".atelier","state","inventory.json");return fi(Yt(t),{recursive:!0}),gi(t,JSON.stringify(e,null,2)+`
11
- `,"utf-8"),t}function pi(e){let r=W(e,"packages","registry","definitions");if(!Q(r))return Zt;return cr(r).filter((t)=>t.endsWith(".jsonc")).map((t)=>Jt(se(W(r,t),"utf-8")))}function mi(e,r,t){return Pt({path:t,domain:e.domain,app:e.app,kind:r.kind,format:r.format,shareability:r.shareability,reason:"registry match",mirrors:r.mirrors??[],privateByDefault:e.privateByDefault,id:r.id})}function Xt(e){let r=Ii(e.path),t=Mi(e.path),n=Ui(e.path,t);return Pt({path:e.path,domain:Ri(e.path),app:r,kind:t,format:Li(e.path),shareability:n,reason:e.reason,mirrors:[],privateByDefault:n==="private"})}function Pt(e){let r=Q(e.path),t=r?ai(e.path):void 0,n=r?V(e.path):void 0,c=!!n?.isDirectory(),o=!!t?.isSymbolicLink(),s=r&&!c&&qt(e.path)?Ae(se(e.path,"utf-8")):[],l=e.mirrors.map((b)=>Ti(e.path,ir(b))),u=Si(e.kind,e.shareability,s.length,l),f=ki(e.path,r,c,e.shareability,e.privateByDefault,e.kind);return{id:e.id??Ki(e.path),domain:e.domain,app:e.app,path:e.path,displayPath:le(e.path),kind:e.kind,format:e.format,shareability:e.shareability,exists:r,isDirectory:c,isSymlink:o,mode:n?`0${(n.mode&511).toString(8)}`:void 0,owner:r?di().username:void 0,size:n?.size,git:r?Ci(e.path):void 0,legacyManagers:r?$i(e.path):{},mirrors:l,secretFindings:s,...f,recommendation:u,reason:e.reason}}function Ai(){let e=[],r=W(Y,".config");if(!Q(r))return e;for(let t of cr(r,{withFileTypes:!0})){if(t.name.startsWith("."))continue;let n=W(r,t.name);if(e.push({path:n,reason:"~/.config app directory"}),!t.isDirectory())continue;for(let c of hi(n).slice(0,80)){let o=W(n,c.name);if(sr(o)){e.push({path:o,reason:"generated/app-state candidate"});continue}if(c.isFile()&&lr(c.name))e.push({path:o,reason:"shallow ~/.config config candidate"});if(c.isDirectory()&&["conf.d","themes","snippets","plugins"].includes(c.name))e.push({path:o,reason:"shallow ~/.config config directory"})}}return e}function hi(e){try{return cr(e,{withFileTypes:!0})}catch{return[]}}function Ti(e,r){let t=Q(r);if(!t||!Q(e)||V(e).isDirectory()||V(r).isDirectory())return{path:r,displayPath:le(r),exists:t};let n=se(e,"utf-8"),c=se(r,"utf-8");return{path:r,displayPath:le(r),exists:t,identical:n===c,diff:n===c?void 0:Bi(c,n)}}function Bi(e,r){let t=e.split(/\r?\n/),n=r.split(/\r?\n/),c=Math.max(t.length,n.length),o=[];for(let s=0;s<c;s++){if(t[s]===n[s])continue;if(t[s]!==void 0)o.push(`-${t[s]}`);if(n[s]!==void 0)o.push(`+${n[s]}`)}return o.slice(0,200).join(`
12
- `)}function ki(e,r,t,n,c,o){if(!r)return{previewSuppressedReason:"missing"};if(t)return{previewSuppressedReason:"directory"};if(n==="private"||c||o==="private")return{previewSuppressedReason:"private/auth metadata-only"};if(!qt(e))return{previewSuppressedReason:"binary or unsupported file type"};let s=se(e,"utf-8");return{preview:ot(s).slice(0,20000)}}function Si(e,r,t,n){if(t>0)return"rotate-secret";if(e==="generated")return"ignore-generated";if(r==="private")return"mark-private";if(n.some((c)=>c.exists&&c.identical===!1))return"resolve-drift";if(r==="machine-specific")return"review-machine-specific";if(e==="config"||e==="directory")return"adopt-candidate";return"none"}function Ci(e){let r=V(e).isDirectory()?e:Yt(e),t=Be(["rev-parse","--show-toplevel"],r);if(!t)return;let n=Ot(t,e),c=!!Be(["check-ignore","-q",n],t,!0),o=!!Be(["ls-files","--error-unmatch",n],t,!0),s=o&&!!Be(["status","--porcelain","--",n],t);return{root:t,tracked:o,modified:s,ignored:c}}function $i(e){if(!ke)return{};return{yadm:zi(e)}}function zi(e){let r=le(e).replace(/^~\//,"");if(ke?.modified.has(r))return"modified";if(ke?.tracked.has(r))return"tracked";return"unknown"}function xi(){let e=new Set((Wt("yadm",["ls-files"])??"").split(`
13
- `).filter(Boolean)),r=new Set((Wt("yadm",["status","--porcelain"])??"").split(`
14
- `).map((t)=>t.slice(3).trim()).filter(Boolean));return{tracked:e,modified:r}}function Be(e,r,t=!1){try{return Qt("git",e,{cwd:r,encoding:"utf-8",stdio:["ignore","pipe","ignore"]}).trim()||(t?"ok":void 0)}catch{return}}function Wt(e,r){try{return Qt(e,r,{cwd:Y,encoding:"utf-8",stdio:["ignore","pipe","ignore"]})}catch{return}}function ir(e){return yi(e.replace(/^~(?=\/|$)/,Y))}function le(e){return e.startsWith(Y)?`~${e.slice(Y.length)}`:e}function Ki(e){return le(e).replace(/[^A-Za-z0-9_.-]+/g,":")}function Ii(e){let r=Ot(W(Y,".config"),e);if(!r.startsWith(".."))return r.split(/[\\/]/)[0]||"Unknown";return"Unknown"}function Ri(e){if(e.includes("/.config/"))return"~/.config";if(e.includes("/.ssh")||e.includes("/.aws"))return"Private/Auth";return"Unknown"}function Mi(e){if(sr(e))return"generated";if(vi.some((r)=>r.test(e)))return"private";if(Q(e)&&V(e).isDirectory())return"directory";if(lr(e))return"config";return"unknown"}function Ui(e,r){if(r==="private")return"private";if(r==="generated")return"machine-specific";if(e.includes("/credentials")||e.includes("/.ssh")||e.includes("/.aws"))return"private";return"machine-specific"}function Li(e){if(Q(e)&&V(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 sr(e){return bi.some((r)=>r.test(e))}function lr(e){return/(^config\.|settings\.|rc$|\.rc$|\.zshrc$|\.zshenv$|\.jsonc?$|\.toml$|\.ya?ml$|\.zsh$|\.conf$|\.ini$)/i.test(e)}function qt(e){let r=e.split("/").pop()??"";if(sr(e))return!1;if(r.includes("lock")||r.endsWith(".mdb")||r.endsWith(".sqlite")||r.endsWith(".db"))return!1;let t=r.includes(".")?r.slice(r.lastIndexOf(".")):"";return wi.has(t)||lr(r)}import{Box as g,Text as a,render as fr,useApp as Dt,useInput as Fi}from"ink";import{useEffect as _i,useMemo as Zi,useState as E}from"react";import{jsxDEV as i,Fragment as qi}from"react/jsx-dev-runtime";function v(e){return fr(i(qi,{children:e},void 0,!1,void 0,this)).waitUntilExit()}async function gr(e,r){return await new Promise((t,n)=>{let c=fr(i(Ji,{operation:e,options:r,onDone:(o,s)=>{if(c.unmount(),s)n(s);else t(o)}},void 0,!1,void 0,this))})}function Ji({operation:e,options:r,onDone:t}){let{exit:n}=Dt(),[c,o]=E(0),s=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"];return _i(()=>{let l=!1,u=setInterval(()=>o((f)=>f+1),80);return e().then((f)=>{if(l)return;clearInterval(u),t(f),n()},(f)=>{if(l)return;clearInterval(u),t(void 0,f),n()}),()=>{l=!0,clearInterval(u)}},[]),i(g,{flexDirection:"column",children:[i(B,{title:r.title,subtitle:r.subtitle},void 0,!1,void 0,this),i(a,{color:"cyan",children:[s[c%s.length]," ",r.detail??"Working\u2026"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)}async function Et(e){return await new Promise((r)=>{let t=fr(i(Xi,{plan:e,onDone:(n)=>{r(n),t.unmount()}},void 0,!1,void 0,this))})}function ur({inventory:e,path:r}){return i(g,{flexDirection:"column",gap:1,children:[i(B,{title:"Scan complete",subtitle:r},void 0,!1,void 0,this),i(g,{gap:2,children:[i(D,{label:"total",value:e.summary.total,color:"cyan"},void 0,!1,void 0,this),i(D,{label:"existing",value:e.summary.existing,color:"green"},void 0,!1,void 0,this),i(D,{label:"private",value:e.summary.private,color:"red"},void 0,!1,void 0,this),i(D,{label:"generated",value:e.summary.generated,color:"magenta"},void 0,!1,void 0,this),i(D,{label:"secrets",value:e.summary.secrets,color:"red"},void 0,!1,void 0,this),i(D,{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 jt({items:e,title:r}){return i(g,{flexDirection:"column",children:[i(B,{title:r,subtitle:`${e.length} item${e.length===1?"":"s"}`},void 0,!1,void 0,this),i(g,{flexDirection:"column",marginTop:1,children:e.map((t)=>i(g,{gap:1,children:[i(a,{color:t.exists?"white":"gray",children:t.exists?"\u25CF":"\u25CB"},void 0,!1,void 0,this),i(a,{color:pn(t),children:t.domain},void 0,!1,void 0,this),i(a,{color:"gray",children:"/"},void 0,!1,void 0,this),i(a,{color:"cyan",children:t.app},void 0,!1,void 0,this),i(a,{children:t.displayPath},void 0,!1,void 0,this),i(L,{label:t.shareability,color:mn(t.shareability)},void 0,!1,void 0,this),t.secretFindings.length>0?i(L,{label:"secret",color:"red"},void 0,!1,void 0,this):null,t.mirrors.some((n)=>n.exists&&n.identical===!1)?i(L,{label:"drift",color:"blue"},void 0,!1,void 0,this):null]},t.id,!0,void 0,this))},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}function en({item:e}){return i(g,{flexDirection:"column",gap:1,children:[i(B,{title:e.app,subtitle:e.displayPath},void 0,!1,void 0,this),i(g,{gap:1,children:[i(L,{label:e.domain,color:"cyan"},void 0,!1,void 0,this),i(L,{label:e.kind,color:pn(e)},void 0,!1,void 0,this),i(L,{label:e.shareability,color:mn(e.shareability)},void 0,!1,void 0,this),i(L,{label:e.recommendation,color:"yellow"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),i(Wi,{rows:[["reason",e.reason],["exists",String(e.exists)],["mode",e.mode??"\u2014"],["symlink",String(e.isSymlink)],["git",Pi(e)],["legacy",Hi(e)]]},void 0,!1,void 0,this),e.secretFindings.length>0?i(g,{flexDirection:"column",children:[i(a,{color:"red",bold:!0,children:"Secret warnings"},void 0,!1,void 0,this),e.secretFindings.map((r,t)=>i(a,{color:"red",children:[" ",r.type,r.line?` line ${r.line}`:"",": ",r.preview]},`${r.type}-${t}`,!0,void 0,this))]},void 0,!0,void 0,this):null,e.mirrors.length>0?i(g,{flexDirection:"column",children:[i(a,{color:"blue",bold:!0,children:"Mirrors"},void 0,!1,void 0,this),e.mirrors.map((r)=>i(a,{children:[" ",r.displayPath," \u2014 ",r.exists?r.identical===!1?"differs":"identical":"missing"]},r.path,!0,void 0,this))]},void 0,!0,void 0,this):null,i(g,{flexDirection:"column",children:[i(a,{bold:!0,children:e.preview?"Safe preview":"Preview"},void 0,!1,void 0,this),i(a,{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 rn({verificationUri:e,userCode:r,expiresIn:t}){return i(g,{flexDirection:"column",gap:1,children:[i(B,{title:"Login with GitHub",subtitle:`code expires in ${Math.round(t/60)} minutes`},void 0,!1,void 0,this),i(g,{flexDirection:"column",children:[i(a,{children:"Open:"},void 0,!1,void 0,this),i(a,{color:"blue",underline:!0,children:e},void 0,!1,void 0,this)]},void 0,!0,void 0,this),i(g,{gap:1,children:[i(a,{children:"Enter code:"},void 0,!1,void 0,this),i(a,{color:"green",bold:!0,children:r},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)}function tn({login:e,apiUrl:r}){return i(g,{flexDirection:"column",children:[i(B,{title:"Logged in",subtitle:r},void 0,!1,void 0,this),i(a,{color:"green",children:["\u2713 ",e]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)}function nn({login:e,apiUrl:r}){if(!e)return i(a,{color:"yellow",children:"Not logged in. Run `atl login`."},void 0,!1,void 0,this);return i(g,{flexDirection:"column",children:[i(B,{title:"Current account",subtitle:r},void 0,!1,void 0,this),i(a,{color:"green",children:e},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}function on(){return i(a,{color:"green",children:"\u2713 Logged out"},void 0,!1,void 0,this)}function cn({profiles:e,activeProfile:r}){return i(g,{flexDirection:"column",children:[i(B,{title:"Profiles",subtitle:`active: ${r}`},void 0,!1,void 0,this),i(g,{flexDirection:"column",marginTop:1,children:e.map((t)=>i(g,{gap:1,children:[i(a,{color:t.name===r?"green":"gray",children:t.name===r?"\u25CF":"\u25CB"},void 0,!1,void 0,this),i(a,{bold:t.name===r,children:t.name},void 0,!1,void 0,this),i(a,{color:"gray",children:t.createdAt},void 0,!1,void 0,this)]},t.id,!0,void 0,this))},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}function dr({title:e,name:r}){return i(g,{flexDirection:"column",children:[i(B,{title:e},void 0,!1,void 0,this),i(a,{color:"green",children:["\u2713 ",r]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)}function sn({configs:e,profileName:r}){return i(g,{flexDirection:"column",children:[i(B,{title:"Saved configs",subtitle:r},void 0,!1,void 0,this),e.length===0?i(a,{color:"gray",children:"No saved configs yet."},void 0,!1,void 0,this):e.map((t)=>i(g,{flexDirection:"column",marginTop:1,children:[i(a,{bold:!0,children:t.stableId},void 0,!1,void 0,this),i(a,{color:"gray",children:t.pathHint??"no path hint"},void 0,!1,void 0,this),t.latestVersion?i(a,{color:"green",children:[t.latestVersion.contentSha256.slice(0,12)," \xB7 ",t.latestVersion.sizeBytes," bytes \xB7 ",t.latestVersion.createdAt]},void 0,!0,void 0,this):null]},t.id,!0,void 0,this))]},void 0,!0,void 0,this)}function ln({config:e,profileName:r}){return i(g,{flexDirection:"column",children:[i(B,{title:e.stableId,subtitle:r},void 0,!1,void 0,this),i(a,{color:"gray",children:e.pathHint??"no path hint"},void 0,!1,void 0,this),i(g,{flexDirection:"column",marginTop:1,children:(e.versions??[]).map((t)=>i(a,{children:[t.contentSha256.slice(0,12)," \xB7 ",t.sizeBytes," bytes \xB7 ",t.createdAt]},t.id,!0,void 0,this))},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}function an({stableId:e,profileName:r,versionHash:t,sizeBytes:n,reused:c}){return i(g,{flexDirection:"column",children:[i(B,{title:c?"Config already saved":"Config saved",subtitle:r},void 0,!1,void 0,this),i(a,{color:"green",children:["\u2713 ",e]},void 0,!0,void 0,this),i(a,{color:"gray",children:["Version ",t.slice(0,12)," \xB7 ",n," bytes \xB7 encrypted"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)}function Xi({plan:e,onDone:r}){let{exit:t}=Dt(),[n,c]=E("overview"),[o,s]=E(0),[l,u]=E(()=>new Set(e.files.filter((d)=>d.selectedByDefault).map((d)=>d.relativePath))),[f,b]=E(""),[m,y]=E(!1),h=An(e),z=e.files.filter((d)=>l.has(d.relativePath)),w=Zi(()=>{let d=f.trim().toLowerCase(),$=e.files.filter((A)=>{if(n==="overview")return!1;if(n==="selected")return l.has(A.relativePath);if(n==="all")return!0;return A.confidence===n});if(!d)return $;return $.filter((A)=>A.relativePath.toLowerCase().includes(d))},[n,e.files,f,l]),M=Math.max(0,Math.min(o-8,Math.max(0,w.length-18))),O=w.slice(M,M+18),_=w[o],U=(d)=>{r(d),t()},k=(d)=>{c(d),s(0),b(""),y(!1)};if(Fi((d,$)=>{if(m){if($.return){y(!1),s(0);return}if($.escape){y(!1),b(""),s(0);return}if($.backspace||$.delete){b((A)=>A.slice(0,-1));return}if(d&&!$.ctrl)b((A)=>A+d);return}if(d==="q"){U(void 0);return}if($.escape||d==="b"){if(n==="overview")U(void 0);else k("overview");return}if(d==="c"||$.return&&n==="overview"){U([...l].sort());return}if(d==="s"){k("selected");return}if(d==="h"){k("high-confidence");return}if(d==="m"){k("medium-confidence");return}if(d==="l"){k("low-confidence");return}if(d==="f"||d==="/"){if(n==="overview")k("all");y(!0);return}if($.upArrow||d==="k"){s((A)=>Math.max(0,A-1));return}if($.downArrow||d==="j"){s((A)=>Math.min(Math.max(w.length-1,0),A+1));return}if(d===" "){let A=w[o];if(!A)return;u((I)=>{let R=new Set(I);if(R.has(A.relativePath))R.delete(A.relativePath);else R.add(A.relativePath);return R});return}if(d==="a"){u((A)=>new Set([...A,...w.map((I)=>I.relativePath)]));return}if(d==="n")u((A)=>{let I=new Set(A);for(let R of w)I.delete(R.relativePath);return I})}),n==="overview")return i(g,{flexDirection:"column",children:[i(B,{title:"Review folder save",subtitle:e.rootDisplayPath},void 0,!1,void 0,this),i(a,{color:"gray",children:[e.files.length," eligible \xB7 ",e.skipped.length," skipped \xB7 ",l.size," selected now"]},void 0,!0,void 0,this),i(a,{color:"gray",children:[h.high," high \xB7 ",h.medium," medium \xB7 ",h.low," low confidence"]},void 0,!0,void 0,this),i(fn,{plan:e},void 0,!1,void 0,this),i(g,{flexDirection:"column",marginTop:1,children:[i(a,{color:"green",bold:!0,children:"Will save now"},void 0,!1,void 0,this),z.slice(0,12).map((d)=>i(a,{color:"green",children:["\u2713 ",ar(d.confidence)," ",d.relativePath," \xB7 ",Vt(d.sizeBytes)]},d.relativePath,!0,void 0,this)),z.length>12?i(a,{color:"gray",children:["\u2026 ",z.length-12," more selected"]},void 0,!0,void 0,this):null,z.length===0?i(a,{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),i(g,{flexDirection:"column",marginTop:1,children:[i(a,{color:"yellow",children:"Review before adding more"},void 0,!1,void 0,this),i(a,{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),i(a,{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?i(a,{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 i(g,{flexDirection:"column",children:[i(B,{title:`Review ${Gi(n)}`,subtitle:e.rootDisplayPath},void 0,!1,void 0,this),i(a,{color:"gray",children:[w.length," visible \xB7 ",l.size," selected total"]},void 0,!0,void 0,this),i(a,{color:m?"cyan":"gray",children:["Filter: ",f||"all",m?"\u2588":""]},void 0,!0,void 0,this),i(g,{flexDirection:"column",marginTop:1,children:[O.map((d,$)=>{let I=M+$===o,R=l.has(d.relativePath);return i(a,{color:I?"cyan":R?"green":void 0,children:[I?"\u203A":" "," [",R?"x":" ","] ",ar(d.confidence)," ",d.relativePath," \xB7 ",Vt(d.sizeBytes)]},d.relativePath,!0,void 0,this)}),w.length===0?i(a,{color:"yellow",children:"No files match this view."},void 0,!1,void 0,this):null]},void 0,!0,void 0,this),_?i(a,{color:"gray",children:["Reason: ",_.confidenceReasons.join(", "),_.defaultSelectionReason?` \xB7 ${_.defaultSelectionReason}`:""]},void 0,!0,void 0,this):null,i(a,{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 fn({plan:e}){let r=e.recipeDelta;if(!e.recipe||!r)return null;return i(g,{flexDirection:"column",marginTop:1,children:[i(a,{color:"cyan",children:["Using saved recipe from ",e.recipe.updatedAt]},void 0,!0,void 0,this),i(a,{color:"gray",children:[r.selectedExisting.length," selected \xB7 ",r.newRecommended.length," new recommended \xB7 ",r.newUnreviewed.length," new unreviewed \xB7 ",r.missingSelected.length," missing"]},void 0,!0,void 0,this),r.newRecommended.length>0?i(a,{color:"yellow",children:["New recommended: ",r.newRecommended.slice(0,5).join(", "),r.newRecommended.length>5?"\u2026":""]},void 0,!0,void 0,this):null,r.missingSelected.length>0?i(a,{color:"yellow",children:["Missing from recipe: ",r.missingSelected.slice(0,5).join(", "),r.missingSelected.length>5?"\u2026":""]},void 0,!0,void 0,this):null]},void 0,!0,void 0,this)}function Se({plan:e}){let r=An(e);return i(g,{flexDirection:"column",children:[i(B,{title:"Folder save preview",subtitle:e.rootDisplayPath},void 0,!1,void 0,this),i(a,{color:"gray",children:[e.files.length," eligible \xB7 ",r.defaultSelected," selected by default \xB7 ",e.skipped.length," skipped"]},void 0,!0,void 0,this),i(a,{color:"gray",children:[r.high," high \xB7 ",r.medium," medium \xB7 ",r.low," low confidence"]},void 0,!0,void 0,this),i(fn,{plan:e},void 0,!1,void 0,this),i(g,{flexDirection:"column",marginTop:1,children:[e.files.slice(0,25).map((t)=>i(a,{color:t.selectedByDefault?"green":t.confidence==="medium-confidence"?"yellow":"gray",children:[t.selectedByDefault?"\u2713":" "," ",ar(t.confidence)," ",t.relativePath," \xB7 ",t.sizeBytes," bytes \xB7 ",t.confidenceReasons.join(", ")]},t.relativePath,!0,void 0,this)),e.files.length>25?i(a,{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?i(g,{flexDirection:"column",marginTop:1,children:[i(a,{color:"yellow",children:"Skipped"},void 0,!1,void 0,this),e.skipped.slice(0,25).map((t,n)=>i(a,{color:"gray",children:["- ",t.relativePath," \xB7 ",t.reason]},`${t.displayPath}:${t.reason}:${n}`,!0,void 0,this)),e.skipped.length>25?i(a,{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 gn({result:e}){return i(g,{flexDirection:"column",children:[i(B,{title:e.reused?"Folder already saved":"Folder saved",subtitle:e.profileName},void 0,!1,void 0,this),i(a,{color:"green",children:["\u2713 ",e.rootDisplayPath]},void 0,!0,void 0,this),i(a,{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?i(a,{color:"yellow",children:"Run with --preview to inspect skipped paths."},void 0,!1,void 0,this):null]},void 0,!0,void 0,this)}function un({result:e,preview:r}){let t=r?"Apply preview":e.status==="blocked"?"Apply blocked":"Config applied";return i(g,{flexDirection:"column",children:[i(B,{title:t,subtitle:e.profileName},void 0,!1,void 0,this),i(vn,{result:e},void 0,!1,void 0,this),i(a,{children:e.displayPath},void 0,!1,void 0,this),i(a,{color:"gray",children:e.reason},void 0,!1,void 0,this),e.backupPath?i(a,{color:"yellow",children:["Backup: ",e.backupPath]},void 0,!0,void 0,this):null,i(a,{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 dn({result:e}){return i(wn,{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 yn({result:e}){return i(wn,{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 wn({result:e,title:r,emptyText:t}){let n=e.results.filter((o)=>o.status==="create"||o.status==="update").length,c=e.results.filter((o)=>o.status==="blocked").length;return i(g,{flexDirection:"column",children:[i(B,{title:r,subtitle:e.profileName},void 0,!1,void 0,this),e.results.length===0?i(a,{color:"gray",children:t},void 0,!1,void 0,this):null,e.results.length>0?i(a,{color:"gray",children:[n," change",n===1?"":"s"," \xB7 ",c," blocked \xB7 ",e.results.length," total"]},void 0,!0,void 0,this):null,i(g,{flexDirection:"column",marginTop:1,children:e.results.map((o)=>i(g,{flexDirection:"column",children:[i(vn,{result:o},void 0,!1,void 0,this),i(a,{color:"gray",children:[" ",o.displayPath]},void 0,!0,void 0,this),i(a,{color:"gray",children:[" ",o.reason]},void 0,!0,void 0,this),o.backupPath?i(a,{color:"yellow",children:[" Backup: ",o.backupPath]},void 0,!0,void 0,this):null]},o.stableId,!0,void 0,this))},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}function bn({checks:e}){let r=e.filter((n)=>n.status==="fail").length,t=e.filter((n)=>n.status==="warn").length;return i(g,{flexDirection:"column",gap:1,children:[i(B,{title:"Doctor",subtitle:r?`${r} failing`:t?`${t} warning${t===1?"":"s"}`:"all checks passed"},void 0,!1,void 0,this),i(g,{flexDirection:"column",children:e.map((n)=>i(g,{gap:1,children:[i(a,{color:Yi(n.status),children:Qi(n.status)},void 0,!1,void 0,this),i(a,{bold:!0,children:n.label},void 0,!1,void 0,this),i(a,{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 yr({query:e}){return i(a,{color:"red",children:["No inventory item matched: ",e]},void 0,!0,void 0,this)}function B({title:e,subtitle:r}){return i(g,{flexDirection:"column",children:[i(a,{bold:!0,color:"cyan",children:"\u25C6 Atelier"},void 0,!1,void 0,this),i(g,{gap:1,children:[i(a,{bold:!0,children:e},void 0,!1,void 0,this),r?i(a,{color:"gray",children:r},void 0,!1,void 0,this):null]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)}function D({label:e,value:r,color:t}){return i(g,{flexDirection:"column",borderStyle:"round",borderColor:t,paddingX:1,children:[i(a,{color:t,bold:!0,children:r},void 0,!1,void 0,this),i(a,{color:"gray",children:e},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}function L({label:e,color:r}){return i(a,{color:r,children:["[",e,"]"]},void 0,!0,void 0,this)}function vn({result:e}){return i(g,{gap:1,children:[i(a,{color:Nt(e.status),children:Oi(e.status)},void 0,!1,void 0,this),i(a,{bold:!0,children:e.stableId},void 0,!1,void 0,this),i(L,{label:e.status,color:Nt(e.status)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}function Wi({rows:e}){return i(g,{flexDirection:"column",children:e.map(([r,t])=>i(g,{gap:1,children:[i(a,{color:"gray",children:r.padEnd(10)},void 0,!1,void 0,this),i(a,{children:t},void 0,!1,void 0,this)]},r,!0,void 0,this))},void 0,!1,void 0,this)}function pn(e){let r=typeof e==="string"?e:e.kind;if(r==="private")return"red";if(r==="generated")return"magenta";if(r==="config")return"green";return"yellow"}function mn(e){if(e==="private")return"red";if(e==="shareable")return"green";return"yellow"}function Qi(e){if(e==="pass")return"\u2713";if(e==="warn")return"!";return"\u2717"}function Yi(e){if(e==="pass")return"green";if(e==="warn")return"yellow";return"red"}function Nt(e){if(e==="unchanged")return"green";if(e==="create")return"cyan";if(e==="update")return"yellow";return"red"}function Oi(e){if(e==="unchanged")return"\u2713";if(e==="create")return"+";if(e==="update")return"\xB1";return"\u2717"}function An(e){return{high:e.files.filter((r)=>r.confidence==="high-confidence").length,medium:e.files.filter((r)=>r.confidence==="medium-confidence").length,low:e.files.filter((r)=>r.confidence==="low-confidence").length,defaultSelected:e.files.filter((r)=>r.selectedByDefault).length}}function ar(e){if(e==="high-confidence")return"high";if(e==="medium-confidence")return"medium";return"low"}function Gi(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 Vt(e){if(e<1024)return`${e} B`;let r=e/1024;if(r<1024)return`${Math.round(r)} KiB`;return`${Math.round(r/1024)} MiB`}function Hi(e){let r=Object.entries(e.legacyManagers??{});if(r.length===0)return"not scanned";return r.map(([t,n])=>`${t}: ${n}`).join(", ")}function Pi(e){if(!e.git)return"not in repo";return`${e.git.tracked?"tracked":"untracked"}${e.git.modified?", modified":""} @ ${e.git.root}`}import{jsxDEV as p}from"react/jsx-dev-runtime";var ji=hn(import.meta.dir,"../../.."),Tn=rc(),j=Ce(Tn,"inventory.json"),ze,ec=25,C=new Ei;C.name("atl").description("Atelier config management CLI").version("0.2.0");C.command("login").description("Login to Atelier with GitHub device auth").option("--api-url <url>","Atelier API URL",ge()).action(async(e)=>{let r=await Sr({apiUrl:e.apiUrl,onPrompt:async(t)=>{await v(p(rn,{verificationUri:t.verificationUri,userCode:t.userCode,expiresIn:t.expiresIn},void 0,!1,void 0,this))}});await v(p(tn,{login:r.user.login,apiUrl:r.apiUrl},void 0,!1,void 0,this))});C.command("whoami").description("Show the current Atelier account").action(async()=>{let e=await Cr();if(await v(p(nn,{login:e?.user.login,apiUrl:e?.apiUrl},void 0,!1,void 0,this)),!e)process.exitCode=1});C.command("logout").description("Remove the local Atelier session").action(async()=>{zr(),await v(p(on,{},void 0,!1,void 0,this))});var xe=C.command("profile").description("Manage account-backed config profiles");xe.command("list").description("List remote profiles").action(async()=>{await v(p(cn,{profiles:await Kr(),activeProfile:T()},void 0,!1,void 0,this))});xe.command("create").description("Create a remote profile").argument("<name>").action(async(e)=>{let r=await Ir(e);await v(p(dr,{title:"Profile created",name:r.name},void 0,!1,void 0,this))});xe.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,r)=>{await Sn(e,r)});xe.command("current").description("Show the active local profile").action(async()=>{await v(p(dr,{title:"Active profile",name:T()},void 0,!1,void 0,this))});C.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,r)=>{await Sn(e,r)});var Ke=C.command("vault").description("Advanced vault controls");Ke.command("status").description("Show vault initialization and local unlock state").action(async()=>{let e=await pe();console.log(`Vault: ${e.initialized?"initialized":"not initialized"}`),console.log(`Local state: ${e.unlocked?"unlocked":"locked"}`),console.log(`Active profile: ${e.activeProfile}`)});Ke.command("init").description("Initialize the encrypted vault now instead of waiting for first save").action(async()=>{let e=await Cn("Create an Atelier vault passphrase: "),r=await Ye(e);console.log(`Vault initialized for profile ${r.profileName}`)});Ke.command("unlock").description("Unlock this machine with the vault passphrase").action(async()=>{let e=await ae("Vault passphrase: "),r=await Zr(e);console.log(`Vault unlocked for profile ${r.activeProfile}`)});Ke.command("lock").description("Remove local unlocked vault material from this machine").action(async()=>{Jr(),console.log("Vault locked")});C.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,r)=>{await tc(e,r)});C.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,r)=>{await cc(e,r)});var Bn=C.command("saved").description("Inspect encrypted configs saved remotely");Bn.command("list").description("List saved configs for the active profile").action(async()=>{let e=T();await v(p(sn,{configs:await ne(e),profileName:e},void 0,!1,void 0,this))});Bn.command("show").description("Show saved metadata and version history").argument("<stable-id>").action(async(e)=>{let r=T(),t=await ye(r,e);if(!t)throw new Error(`Saved config not found: ${e}`);await v(p(ln,{config:t,profileName:r},void 0,!1,void 0,this))});C.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 r=await Gt({repoRoot:ji,manualPaths:e.path??[],includeLegacyManagers:e.legacy}),t=Ht(r,{path:j});await v(p(ur,{inventory:r,path:t},void 0,!1,void 0,this))});C.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 r=fe(),t=lc(r.items,e);if(e.json)return Ie(t);await v(p(jt,{items:t,title:"Inventory"},void 0,!1,void 0,this))});C.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,r)=>{let t=fe(),n=zn(t,e);if(r.json)return Ie(n??null);await v(n?p(en,{item:n},void 0,!1,void 0,this):p(yr,{query:e},void 0,!1,void 0,this))});C.command("summary").description("Print the last scan summary").option("--json","print JSON instead of Ink output").action(async(e)=>{let r=fe();if(e.json)return Ie(r.summary);await v(p(ur,{inventory:r,path:j},void 0,!1,void 0,this))});C.command("doctor").description("Check Atelier CLI, account, inventory, and local environment health").option("--json","print JSON instead of Ink output").action(async(e)=>{let r=fc();if(e.json)Ie(r);else await v(p(bn,{checks:r},void 0,!1,void 0,this));if(r.some((t)=>t.status==="fail"))process.exitCode=1});C.parseAsync(process.argv).catch((e)=>{console.error(e instanceof Error?e.message:e),process.exit(1)});function Ie(e){console.log(JSON.stringify(e,null,2))}function kn(e){return e.split(`
15
- `).map((r)=>{if(r.startsWith("+")&&!r.startsWith("+++"))return`\x1B[32m${r}\x1B[0m`;if(r.startsWith("-")&&!r.startsWith("---"))return`\x1B[31m${r}\x1B[0m`;if(r.startsWith("@@"))return`\x1B[36m${r}\x1B[0m`;return r}).join(`
16
- `)}function fe(){if(!$e(j))throw new Error("No inventory found. Run `atl scan` first.");return JSON.parse(pr(j,"utf-8"))}function rc(){if(process.env.ATELIER_STATE_DIR)return process.env.ATELIER_STATE_DIR;if(process.env.XDG_STATE_HOME)return Ce(process.env.XDG_STATE_HOME,"atelier");if(Di()==="win32"&&process.env.LOCALAPPDATA)return Ce(process.env.LOCALAPPDATA,"Atelier");return Ce(Vi(),".local","state","atelier")}async function tc(e,r){let t=$e(j)?fe():void 0,n=t?zn(t,e):void 0,c=xn(e),o=!n&&$e(c)&&Ni(c).isDirectory();if(!n&&!o){await v(p(yr,{query:e},void 0,!1,void 0,this)),process.exitCode=1;return}if(n?.isDirectory||o){let u=n??c,f=await er(u);if(r.preview){await v(p(Se,{plan:f},void 0,!1,void 0,this));return}let b=await zt(f),m=b?await ic(b):void 0;if(m==="cancel")return;let y=f.files.filter((k)=>k.selectedByDefault).map((k)=>k.relativePath),h,z,w=!1;if(m&&m!=="restart")h=m.selectedFiles.map((k)=>k.relativePath),z=m.runId;else if(r.review||f.files.length>ec||y.length===0){if(w=!0,!S.isTTY)throw await v(p(Se,{plan:f},void 0,!1,void 0,this)),new Error(`Folder has ${f.files.length} eligible files and ${y.length} recommended selections; rerun in an interactive terminal to review selections.`);if(h=await Et(f),!h){console.log("Folder save cancelled");return}if(h.length===0){console.log("No files selected"),process.exitCode=1;return}}else if(h=y,await v(p(Se,{plan:f},void 0,!1,void 0,this)),!await vr(`Save ${y.length} recommended file${y.length===1?"":"s"}? [y/N] `)){console.log("Folder save cancelled");return}let M=h&&!z&&await nc(f,h,w),O=Object.fromEntries(f.files.map((k)=>[k.relativePath,k.contentSha256])),_=await br({initialize:!0}),U=await gr(()=>Ct(u,{passphrase:_,includeRelativePaths:h,expectedContentSha256ByRelativePath:O,resumeRunId:z}),{title:"Saving folder",subtitle:f.rootDisplayPath,detail:`Encrypting and uploading ${h.length} file${h.length===1?"":"s"}\u2026`});if(M&&h)await $t(f,h),console.log(f.recipe?"Updated folder save recipe":"Saved folder save recipe");await v(p(gn,{result:U},void 0,!1,void 0,this));return}if(r.preview)throw new Error("--preview is only supported for folder saves");let s=await br({initialize:!0}),l=await gr(()=>St(n,{passphrase:s}),{title:"Saving config",subtitle:n.displayPath,detail:"Encrypting and uploading file\u2026"});await v(p(an,{stableId:l.stableId,profileName:l.profileName,versionHash:l.version.contentSha256,sizeBytes:l.version.sizeBytes,reused:l.reused},void 0,!1,void 0,this))}async function nc(e,r,t){if(!S.isTTY||r.length===0)return!1;if(e.recipe){if(!t||oc(e.recipe.includeRelativePaths,r))return!1;return await vr("Update saved folder recipe with this selection? [y/N] ")}return await vr("Remember this folder selection as a recipe for future saves? [y/N] ")}function oc(e,r){if(e.length!==r.length)return!1;let t=new Set(r);return e.every((n)=>t.has(n))}async function ic(e){let r=e.uploadedFiles.length,t=e.selectedFiles.length,n=e.error?` Last error: ${e.error}`:"";if(!S.isTTY)throw new Error(`Previous folder save failed before commit (${r}/${t} files uploaded). Rerun in an interactive terminal to resume, restart, or discard.${n}`);console.log(`Previous folder save failed before commit for ${e.rootDisplayPath}.`),console.log(`Uploaded ${r}/${t} selected files. Manifest was not committed.${n}`);while(!0){let c=(await $n("Resume upload, restart review, discard recovery, or cancel? [r/s/d/q] ")).trim().toLowerCase();if(c==="r"||c==="resume"||c==="")return e;if(c==="s"||c==="restart")return await rr(e.runId),"restart";if(c==="d"||c==="discard")return await rr(e.runId),console.log("Discarded folder save recovery record"),"cancel";if(c==="q"||c==="cancel")return"cancel"}}async function cc(e,r){let t=await br({initialize:!1}),n=await Vr(e,{passphrase:t,preview:r.preview,backup:r.backup});if(ac(n)){if(await v(p(dn,{result:n},void 0,!1,void 0,this)),r.preview||n.blocked)Kn(n.results);if(n.blocked)process.exitCode=1;return}if(await v(p(un,{result:n,preview:r.preview},void 0,!1,void 0,this)),n.diff&&(r.preview||n.status==="blocked"))console.log(kn(n.diff));if(n.status==="blocked")process.exitCode=1}async function Sn(e,r){let t=await de(e);if(!t)throw new Error(`Profile not found: ${e}`);let n=await sc(),c=await Dr(t.name,{passphrase:n,preview:r.preview,backup:r.backup});if(!r.preview&&!c.blocked)$r(t.name);if(await v(p(yn,{result:c},void 0,!1,void 0,this)),r.preview||c.blocked)Kn(c.results);if(c.blocked)process.exitCode=1}async function sc(){let e=await pe();if(e.initialized&&!e.unlocked)return await ae("Vault passphrase: ");return}async function br({initialize:e}){let r=await pe();if(!r.initialized){if(!e)throw new Error("Atelier vault is not initialized. Run `atl save <id>` first.");return await Cn("Create an Atelier vault passphrase: ")}if(!r.unlocked)return await ae("Vault passphrase: ");return}async function Cn(e){let r=await ae(e),t=await ae("Confirm vault passphrase: ");if(r!==t)throw new Error("Vault passphrases do not match");return r}async function vr(e){let r=await $n(e);return r.trim().toLowerCase()==="y"||r.trim().toLowerCase()==="yes"}async function $n(e){if(!S.isTTY)return F.write(e),ze??=pr(0,"utf-8").split(/\r?\n/),ze.shift()??"";return F.write(e),S.setEncoding("utf-8"),S.resume(),await new Promise((r)=>{let t="",n=()=>{S.off("data",o),S.pause()},c=()=>{n(),r(t)},o=(s)=>{for(let l of String(s)){if(l==="\x03")n(),F.write(`
17
- `),process.exit(130);if(l==="\r"||l===`
18
- `){F.write(`
19
- `),c();return}t+=l}};S.on("data",o)})}async function ae(e){if(!S.isTTY)return F.write(e),ze??=pr(0,"utf-8").split(/\r?\n/),ze.shift()??"";return F.write(e),S.setEncoding("utf-8"),S.resume(),S.setRawMode(!0),await new Promise((r)=>{let t="",n=()=>{S.off("data",o),S.setRawMode(!1),S.pause()},c=()=>{n(),F.write(`
20
- `),r(t)},o=(s)=>{for(let l of String(s)){if(l==="\x03")n(),F.write(`
21
- `),process.exit(130);if(l==="\r"||l===`
22
- `){c();return}if(l==="\x7F"){t=t.slice(0,-1);continue}t+=l}};S.on("data",o)})}function lc(e,r){return e.filter((t)=>{if(r.domain&&t.domain.toLowerCase()!==r.domain.toLowerCase())return!1;if(r.app&&t.app.toLowerCase()!==r.app.toLowerCase())return!1;if(r.secrets&&t.secretFindings.length===0)return!1;if(r.drift&&!t.mirrors.some((n)=>n.exists&&n.identical===!1))return!1;if(r.generated&&t.kind!=="generated")return!1;if(r.private&&t.shareability!=="private")return!1;if(r.missing&&t.exists)return!1;return!0})}function zn(e,r){let t=wr(r);return e.items.find((n)=>n.id===r||wr(n.path)===t||wr(n.displayPath)===t)??e.items.find((n)=>n.displayPath.includes(r)||n.path.includes(r))}function wr(e){return xn(e).toLowerCase()}function xn(e){return hn(e.replace(/^~(?=\/|$)/,process.env.HOME??""))}function ac(e){return"results"in e}function Kn(e){for(let r of e)if(r.diff&&(r.status==="update"||r.status==="blocked"))console.log(`
23
- ${r.stableId}`),console.log(kn(r.diff))}function fc(){let e=[],r=$e(j)?fe():void 0,t=ue();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:ge()}),e.push({label:"session",status:t?"pass":"warn",detail:t?`logged in as ${t.user.login}`:"not logged in; run `atl login`"}),e.push({label:"state directory",status:"pass",detail:Tn}),e.push({label:"inventory",status:r?"pass":"warn",detail:r?`${r.summary.existing}/${r.summary.total} existing, generated ${r.generatedAt}`:"missing; run `atl scan`"}),e.push({label:"secret warnings",status:r&&r.summary.secrets>0?"warn":"pass",detail:r?`${r.summary.secrets} item${r.summary.secrets===1?"":"s"} flagged`:"no inventory"}),e}
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(`
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(`
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.2.0",
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": {