@eunjae/dots 1.0.2 → 1.1.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.
@@ -0,0 +1,30 @@
1
+ import{a as d,b as m}from"./chunk-GPHKPMNY.js";import{exec as E}from"node:child_process";import{promisify as D}from"node:util";import{lstat as k,mkdir as R,readlink as P,rm as S,symlink as C}from"node:fs/promises";import{homedir as B}from"node:os";import{dirname as A,resolve as w}from"node:path";function y(t,e){return t.startsWith("~/")?w(B(),t.slice(2)):t.startsWith("./")||!t.startsWith("/")?w(e,t):t}async function g(t){try{return await k(t),!0}catch{return!1}}async function I(t){try{return(await k(t)).isSymbolicLink()}catch{return!1}}async function v(t,e,i){let n=y(t.src,e),r=y(t.dest,e);if(!await g(n))return{action:"skipped",src:n,dest:r,error:`Source does not exist: ${n}`};if(await g(r)){if(await I(r)&&await P(r)===n)return{action:"exists",src:n,dest:r};if(!t.force)return{action:"skipped",src:n,dest:r,error:"Destination exists and is not the correct symlink. Use force: true to overwrite."};i||await S(r,{recursive:!0})}return i||(await R(A(r),{recursive:!0}),await C(n,r)),{action:"created",src:n,dest:r}}async function u(t,e,i){let n=[];for(let r of t){let o=await v(r,e,i);n.push(o)}return n}var f=D(E);function H(t){return typeof t=="string"?{name:t}:t}async function L(){try{return await f("which brew"),!0}catch{return!1}}async function W(t,e){try{let i=e?`brew list --cask ${t}`:`brew list ${t}`;return await f(i),!0}catch{return!1}}async function F(t,e){let i=e?`brew install --cask ${t}`:`brew install ${t}`;await f(i)}async function N(t){return await L()?!0:t?(console.log("[dry-run] Would install Homebrew"),!1):(console.log("Installing Homebrew..."),await f('/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"'),!0)}async function T(t,e,i){let n=H(t),{name:r,cask:o=!1,symlinks:s}=n;if(await W(r,o)){let c={action:"exists",name:r,cask:o};return s&&s.length>0&&(c.symlinkResults=await u(s,e,i)),c}if(!i)try{await F(r,o)}catch(c){return{action:"skipped",name:r,cask:o,error:`Failed to install: ${c instanceof Error?c.message:String(c)}`}}let a={action:"installed",name:r,cask:o};return s&&s.length>0&&(a.symlinkResults=await u(s,e,i)),a}async function $(t,e,i){if(!await N(i)&&!i)throw new Error("Homebrew is not installed and could not be installed");let r=[];for(let o of t){let s=await T(o,e,i);r.push(s)}return r}import{exec as U}from"node:child_process";import{lstat as z,mkdir as G}from"node:fs/promises";import{homedir as M}from"node:os";import{resolve as p}from"node:path";import{promisify as j}from"node:util";var h=j(U);function x(t){return t.startsWith("~/")?p(M(),t.slice(2)):t}function q(t){let e=t.match(/\/([^/]+?)(?:\.git)?$/);if(e?.[1])return e[1];let i=t.match(/:([^/]+?)(?:\.git)?$/);if(i?.[1])return i[1];throw new Error(`Cannot extract repository name from URL: ${t}`)}async function J(t){try{return await z(t),!0}catch{return!1}}async function K(t){try{return await h(`git -C "${t}" rev-parse --git-dir`),!0}catch{return!1}}async function O(t,e,i){let{url:n}=t,r;if(t.dest)r=x(t.dest);else if(i){let o=q(n);r=x(p(i,o))}else return{action:"skipped",url:n,dest:"",error:"No destination specified and no workspacePath configured"};if(await J(r))return await K(r)?{action:"exists",url:n,dest:r}:{action:"skipped",url:n,dest:r,error:`Destination exists but is not a git repository: ${r}`};if(!e){let o=p(r,"..");await G(o,{recursive:!0});try{await h(`git clone "${n}" "${r}"`)}catch(s){return{action:"skipped",url:n,dest:r,error:`Failed to clone: ${s instanceof Error?s.message:String(s)}`}}}return{action:"cloned",url:n,dest:r}}async function b(t,e,i){let n=[];for(let r of t){let o=await O(r,e,i);n.push(o)}return n}async function pt(t){let{process:e}=this,i=t.dry,n=m();i?e.stdout.write(`
2
+ \u{1F50D} Dry run mode - no changes will be made
3
+
4
+ `):e.stdout.write(`
5
+ \u{1F680} Applying configuration...
6
+
7
+ `);let r=await d(n);if(!r){e.stderr.write(`Error: No config file found. Create dots.config.ts in the current directory.
8
+ `),e.exit(1);return}if(r.repos&&r.repos.length>0){e.stdout.write(`\u{1F4E6} Repositories:
9
+ `);let o=await b(r.repos,i,r.workspacePath);for(let s of o){let a=i?"[dry-run] ":"";s.action==="cloned"?e.stdout.write(` ${a}\u2713 Cloned ${s.url} \u2192 ${s.dest}
10
+ `):s.action==="exists"?e.stdout.write(` ${a}\u2022 Already exists: ${s.dest}
11
+ `):s.action==="skipped"&&e.stdout.write(` ${a}\u2717 Skipped: ${s.error}
12
+ `)}e.stdout.write(`
13
+ `)}if(r.symlinks&&r.symlinks.length>0){e.stdout.write(`\u{1F517} Symlinks:
14
+ `);let o=await u(r.symlinks,n,i);for(let s of o){let a=i?"[dry-run] ":"";s.action==="created"?e.stdout.write(` ${a}\u2713 Created ${s.dest} \u2192 ${s.src}
15
+ `):s.action==="exists"?e.stdout.write(` ${a}\u2022 Already exists: ${s.dest}
16
+ `):s.action==="skipped"&&e.stdout.write(` ${a}\u2717 Skipped: ${s.error}
17
+ `)}e.stdout.write(`
18
+ `)}if(r.brew&&r.brew.length>0){e.stdout.write(`\u{1F37A} Homebrew packages:
19
+ `);let o=await $(r.brew,n,i);for(let s of o){let a=i?"[dry-run] ":"",c=s.cask?"(cask)":"";if(s.action==="installed"?e.stdout.write(` ${a}\u2713 Installed ${s.name} ${c}
20
+ `):s.action==="exists"?e.stdout.write(` ${a}\u2022 Already installed: ${s.name} ${c}
21
+ `):s.action==="skipped"&&e.stdout.write(` ${a}\u2717 Skipped ${s.name}: ${s.error}
22
+ `),s.symlinkResults)for(let l of s.symlinkResults)l.action==="created"?e.stdout.write(` ${a}\u2713 Symlink: ${l.dest} \u2192 ${l.src}
23
+ `):l.action==="exists"?e.stdout.write(` ${a}\u2022 Symlink exists: ${l.dest}
24
+ `):l.action==="skipped"&&e.stdout.write(` ${a}\u2717 Symlink skipped: ${l.error}
25
+ `)}e.stdout.write(`
26
+ `)}i?e.stdout.write(`\u2705 Dry run complete. Run without --dry to apply changes.
27
+
28
+ `):e.stdout.write(`\u2705 Configuration applied successfully!
29
+
30
+ `)}export{pt as default};
@@ -1,3 +1,3 @@
1
1
  #!/usr/bin/env node
2
- import{a as o,b as s}from"../chunk-QIS5QHQM.js";import"../chunk-DNQSYMNA.js";import{proposeCompletions as r}from"@stricli/core";var t=process.argv.slice(3);process.env.COMP_LINE?.endsWith(" ")&&t.push("");await r(o,t,s(process));try{for(let{completion:p}of await r(o,t,s(process)))process.stdout.write(`${p}
2
+ import{a as o,b as s}from"../chunk-UXRA3RZ6.js";import"../chunk-UQJPOVKD.js";import{proposeCompletions as r}from"@stricli/core";var t=process.argv.slice(3);process.env.COMP_LINE?.endsWith(" ")&&t.push("");await r(o,t,s(process));try{for(let{completion:p}of await r(o,t,s(process)))process.stdout.write(`${p}
3
3
  `)}catch{}
package/dist/bin/cli.js CHANGED
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- import{a as r,b as o}from"../chunk-QIS5QHQM.js";import"../chunk-DNQSYMNA.js";import{run as i}from"@stricli/core";await i(r,process.argv.slice(2),o(process));
2
+ import{a as r,b as o}from"../chunk-UXRA3RZ6.js";import"../chunk-UQJPOVKD.js";import{run as i}from"@stricli/core";await i(r,process.argv.slice(2),o(process));
@@ -0,0 +1 @@
1
+ var s="Declarative dotfiles and Mac setup manager";var i="1.1.0";export{s as a,i as b};
@@ -1 +1 @@
1
- import{a as o,b as t}from"./chunk-DNQSYMNA.js";import{buildApplication as i,buildCommand as e,buildRouteMap as n}from"@stricli/core";var a=e({loader:async()=>import("./init.impl-ITIVD5YC.js"),parameters:{positional:{kind:"tuple",parameters:[{brief:"Git URL of the config repository (omit to create new project)",parse:String,placeholder:"repo-url",optional:!0}]},flags:{path:{kind:"parsed",brief:"Path for the dotfiles directory",parse:String,default:"~/.dots"}}},docs:{brief:"Initialize dots (clone existing repo or create new project)"}}),p=e({loader:async()=>import("./apply.impl-27DRVKZK.js"),parameters:{flags:{dry:{kind:"boolean",brief:"Show what would be done without making changes",default:!1}}},docs:{brief:"Apply the configuration from the current directory"}}),s=n({routes:{init:a,apply:p},docs:{brief:o}}),u=i(s,{name:"dots",versionInfo:{currentVersion:t}});import c from"node:fs";import l from"node:os";import m from"node:path";function y(r){return{process:r,os:l,fs:c,path:m}}export{u as a,y as b};
1
+ import{a as o,b as t}from"./chunk-UQJPOVKD.js";import{buildApplication as i,buildCommand as e,buildRouteMap as n}from"@stricli/core";var a=e({loader:async()=>import("./init.impl-C6ASC52B.js"),parameters:{positional:{kind:"tuple",parameters:[{brief:"Git URL of the config repository (omit to create new project)",parse:String,placeholder:"repo-url",optional:!0}]},flags:{path:{kind:"parsed",brief:"Path for the dotfiles directory",parse:String,default:"~/.dots"}}},docs:{brief:"Initialize dots (clone existing repo or create new project)"}}),p=e({loader:async()=>import("./apply.impl-FVWPMQ5W.js"),parameters:{flags:{dry:{kind:"boolean",brief:"Show what would be done without making changes",default:!1}}},docs:{brief:"Apply the configuration from the current directory"}}),s=n({routes:{init:a,apply:p},docs:{brief:o}}),u=i(s,{name:"dots",versionInfo:{currentVersion:t}});import c from"node:fs";import l from"node:os";import m from"node:path";function y(r){return{process:r,os:l,fs:c,path:m}}export{u as a,y as b};
@@ -11,9 +11,10 @@ interface BrewPackageConfig {
11
11
  type BrewItem = string | BrewPackageConfig;
12
12
  interface RepoConfig {
13
13
  url: string;
14
- dest: string;
14
+ dest?: string;
15
15
  }
16
16
  interface DotsConfig {
17
+ workspacePath?: string;
17
18
  repos?: RepoConfig[];
18
19
  symlinks?: SymlinkConfig[];
19
20
  brew?: BrewItem[];
@@ -0,0 +1,133 @@
1
+ import{b as u}from"./chunk-UQJPOVKD.js";import{exec as m}from"node:child_process";import{lstat as f,mkdir as y,readFile as h,writeFile as a}from"node:fs/promises";import{homedir as d}from"node:os";import{resolve as s}from"node:path";import{promisify as b}from"node:util";var l=t=>`{
2
+ "name": "dotfiles",
3
+ "private": true,
4
+ "type": "module",
5
+ "devDependencies": {
6
+ "@eunjae/dots": "^${t}"
7
+ }
8
+ }
9
+ `,w=`node_modules
10
+ `,c=`import { defineConfig } from "@eunjae/dots";
11
+
12
+ export default defineConfig({
13
+ // Clone additional repositories
14
+ // repos: [
15
+ // { url: "git@github.com:user/project.git", dest: "~/workspace/project" },
16
+ // ],
17
+
18
+ // Create symlinks
19
+ symlinks: [
20
+ // { src: "./zshrc", dest: "~/.zshrc" },
21
+ // { src: "./gitconfig", dest: "~/.gitconfig" },
22
+ ],
23
+
24
+ // Install Homebrew packages
25
+ brew: [
26
+ // "ripgrep",
27
+ // {
28
+ // name: "neovim",
29
+ // symlinks: [{ src: "./nvim", dest: "~/.config/nvim" }],
30
+ // },
31
+ ],
32
+ });
33
+ `,g=`# Dotfiles
34
+
35
+ Managed with [@eunjae/dots](https://github.com/eunjae-lee/dots).
36
+
37
+ ## Setup on a new machine
38
+
39
+ \`\`\`bash
40
+ npx @eunjae/dots init git@github.com:YOUR_USERNAME/dotfiles.git
41
+ \`\`\`
42
+
43
+ ## Apply changes
44
+
45
+ \`\`\`bash
46
+ cd ~/.dots
47
+ npx @eunjae/dots apply
48
+ \`\`\`
49
+
50
+ ## Preview changes (dry run)
51
+
52
+ \`\`\`bash
53
+ npx @eunjae/dots apply --dry
54
+ \`\`\`
55
+ `;var o=b(m);async function r(t){try{return await f(t),!0}catch{return!1}}async function p(){try{return await o("which brew"),!0}catch{return!1}}async function k(){console.log("Installing Homebrew..."),await o('/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"',{stdio:"inherit"})}async function S(t){try{return await o(`brew list ${t}`),!0}catch{return!1}}async function C(t){console.log(`Installing ${t}...`),await o(`brew install ${t}`)}async function x(){let t=s(d(),".ssh"),i=["id_ed25519","id_rsa","id_ecdsa"];for(let e of i)if(await r(s(t,e)))return!0;return!1}function H(t){t.stdout.write(`
56
+ To generate an SSH key, run:
57
+ `),t.stdout.write(` ssh-keygen -t ed25519 -C "your_email@example.com"
58
+
59
+ `),t.stdout.write(` Then add it to GitHub:
60
+ `),t.stdout.write(` 1. Copy your public key: cat ~/.ssh/id_ed25519.pub
61
+ `),t.stdout.write(` 2. Go to https://github.com/settings/keys
62
+ `),t.stdout.write(` 3. Click 'New SSH key' and paste the key
63
+ `),t.stdout.write(` 4. Re-run this command after adding the key
64
+
65
+ `)}async function $(){let t=s(d(),".ssh"),i=["id_ed25519.pub","id_rsa.pub","id_ecdsa.pub"];for(let e of i){let n=s(t,e);if(await r(n))return(await h(n,"utf-8")).trim()}throw new Error("No SSH public key found")}async function j(){try{await o("ssh -T git@github.com 2>&1 || true");let{stderr:t}=await o("ssh -T git@github.com 2>&1 || true");return t.includes("successfully authenticated")||t.includes("You've successfully authenticated")}catch{return!1}}async function v(t,i){if(i.stdout.write(`
66
+ \u{1F4C1} Creating new dotfiles project at ${t}
67
+
68
+ `),await r(t)){i.stderr.write(`Error: Directory already exists: ${t}
69
+ `),i.exit(1);return}await y(t,{recursive:!0}),await a(s(t,"package.json"),l(u)),await a(s(t,".gitignore"),w),await a(s(t,"dots.config.ts"),c),await a(s(t,"README.md"),g),i.stdout.write(` \u2713 Created package.json
70
+ `),i.stdout.write(` \u2713 Created .gitignore
71
+ `),i.stdout.write(` \u2713 Created dots.config.ts
72
+ `),i.stdout.write(` \u2713 Created README.md
73
+ `),await o(`git -C "${t}" init`),i.stdout.write(` \u2713 Initialized git repository
74
+ `),i.stdout.write(`
75
+ \u{1F4E6} Installing dependencies...
76
+ `);try{await o(`cd "${t}" && npm install`),i.stdout.write(` \u2713 Dependencies installed
77
+ `)}catch{i.stdout.write(` \u26A0 Could not install dependencies (package may not be published yet)
78
+ `),i.stdout.write(` Run 'npm install' manually after publishing @eunjae/dots
79
+ `)}i.stdout.write(`
80
+ \u2705 Project created!
81
+
82
+ `),i.stdout.write(`Next steps:
83
+ `),i.stdout.write(` cd ${t}
84
+ `),i.stdout.write(` # Edit dots.config.ts
85
+ `),i.stdout.write(` # Add your dotfiles (zshrc, gitconfig, etc.)
86
+ `),i.stdout.write(` git remote add origin git@github.com:YOUR_USERNAME/dotfiles.git
87
+ `),i.stdout.write(` npx @eunjae/dots apply --dry
88
+
89
+ `)}async function E(t,i,e){e.stdout.write(`
90
+ \u{1F680} Initializing dots with config repo: ${t}
91
+
92
+ `),e.stdout.write(`Step 1: Checking Homebrew...
93
+ `),await p()?e.stdout.write(` \u2713 Homebrew is installed
94
+ `):(await k(),e.stdout.write(` \u2713 Homebrew installed
95
+ `)),e.stdout.write(`
96
+ Step 2: Installing git and gh...
97
+ `);for(let n of["git","gh"])await S(n)?e.stdout.write(` \u2713 ${n} is installed
98
+ `):(await C(n),e.stdout.write(` \u2713 ${n} installed
99
+ `));if(e.stdout.write(`
100
+ Step 3: Checking SSH key and GitHub access...
101
+ `),!await x()){e.stdout.write(` \u26A0\uFE0F No SSH key found.
102
+ `),H(e);return}if(e.stdout.write(` \u2713 SSH key exists
103
+ `),!await j()){let n=await $();e.stdout.write(`
104
+ \u26A0\uFE0F SSH key not added to GitHub yet.
105
+ `),e.stdout.write(`
106
+ Your public key:
107
+ `),e.stdout.write(` ${n}
108
+
109
+ `),e.stdout.write(` Please add this key to GitHub:
110
+ `),e.stdout.write(` 1. Go to https://github.com/settings/keys
111
+ `),e.stdout.write(` 2. Click 'New SSH key' and paste the key
112
+ `),e.stdout.write(` 3. Re-run this command after adding the key
113
+
114
+ `),e.stdout.write(` Or run: gh auth login
115
+
116
+ `);return}e.stdout.write(` \u2713 GitHub SSH access confirmed
117
+ `),e.stdout.write(`
118
+ Step 4: Cloning config repo to ${i}...
119
+ `),await r(i)?e.stdout.write(` \u2713 Config repo already exists at ${i}
120
+ `):(await o(`git clone "${t}" "${i}"`),e.stdout.write(` \u2713 Config repo cloned
121
+ `)),e.stdout.write(`
122
+ Step 5: Installing dependencies...
123
+ `);try{await o(`cd "${i}" && npm install`),e.stdout.write(` \u2713 Dependencies installed
124
+ `)}catch{e.stdout.write(` \u26A0 Could not install dependencies
125
+ `),e.stdout.write(` Run 'npm install' manually in the config directory
126
+ `)}e.stdout.write(`
127
+ \u2705 Bootstrap complete!
128
+
129
+ `),e.stdout.write(`Next steps:
130
+ `),e.stdout.write(` cd ${i}
131
+ `),e.stdout.write(` npx @eunjae/dots apply
132
+
133
+ `)}async function P(t,i){let{process:e}=this,n=t.path.startsWith("~/")?s(d(),t.path.slice(2)):s(t.path);i?await E(i,n,e):await v(n,e)}export{P as default};
package/package.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "description": "Declarative dotfiles and Mac setup manager",
5
5
  "license": "MIT",
6
6
  "type": "module",
7
- "version": "1.0.2",
7
+ "version": "1.1.0",
8
8
  "files": [
9
9
  "dist"
10
10
  ],
@@ -1,30 +0,0 @@
1
- import{a as p,b as d}from"./chunk-GPHKPMNY.js";import{exec as v}from"node:child_process";import{promisify as E}from"node:util";import{lstat as g,mkdir as R,readlink as h,rm as P,symlink as S}from"node:fs/promises";import{homedir as C}from"node:os";import{dirname as B,resolve as m}from"node:path";function w(t,e){return t.startsWith("~/")?m(C(),t.slice(2)):t.startsWith("./")||!t.startsWith("/")?m(e,t):t}async function y(t){try{return await g(t),!0}catch{return!1}}async function A(t){try{return(await g(t)).isSymbolicLink()}catch{return!1}}async function I(t,e,r){let n=w(t.src,e),s=w(t.dest,e);if(!await y(n))return{action:"skipped",src:n,dest:s,error:`Source does not exist: ${n}`};if(await y(s)){if(await A(s)&&await h(s)===n)return{action:"exists",src:n,dest:s};if(!t.force)return{action:"skipped",src:n,dest:s,error:"Destination exists and is not the correct symlink. Use force: true to overwrite."};r||await P(s,{recursive:!0})}return r||(await R(B(s),{recursive:!0}),await S(n,s)),{action:"created",src:n,dest:s}}async function u(t,e,r){let n=[];for(let s of t){let o=await I(s,e,r);n.push(o)}return n}var f=E(v);function D(t){return typeof t=="string"?{name:t}:t}async function H(){try{return await f("which brew"),!0}catch{return!1}}async function W(t,e){try{let r=e?`brew list --cask ${t}`:`brew list ${t}`;return await f(r),!0}catch{return!1}}async function F(t,e){let r=e?`brew install --cask ${t}`:`brew install ${t}`;await f(r)}async function L(t){return await H()?!0:t?(console.log("[dry-run] Would install Homebrew"),!1):(console.log("Installing Homebrew..."),await f('/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"'),!0)}async function T(t,e,r){let n=D(t),{name:s,cask:o=!1,symlinks:i}=n;if(await W(s,o)){let l={action:"exists",name:s,cask:o};return i&&i.length>0&&(l.symlinkResults=await u(i,e,r)),l}if(!r)try{await F(s,o)}catch(l){return{action:"skipped",name:s,cask:o,error:`Failed to install: ${l instanceof Error?l.message:String(l)}`}}let a={action:"installed",name:s,cask:o};return i&&i.length>0&&(a.symlinkResults=await u(i,e,r)),a}async function k(t,e,r){if(!await L(r)&&!r)throw new Error("Homebrew is not installed and could not be installed");let s=[];for(let o of t){let i=await T(o,e,r);s.push(i)}return s}import{exec as z}from"node:child_process";import{lstat as G,mkdir as N}from"node:fs/promises";import{homedir as U}from"node:os";import{resolve as $}from"node:path";import{promisify as j}from"node:util";var b=j(z);function q(t){return t.startsWith("~/")?$(U(),t.slice(2)):t}async function J(t){try{return await G(t),!0}catch{return!1}}async function K(t){try{return await b(`git -C "${t}" rev-parse --git-dir`),!0}catch{return!1}}async function M(t,e){let r=q(t.dest),{url:n}=t;if(await J(r))return await K(r)?{action:"exists",url:n,dest:r}:{action:"skipped",url:n,dest:r,error:`Destination exists but is not a git repository: ${r}`};if(!e){let s=$(r,"..");await N(s,{recursive:!0});try{await b(`git clone "${n}" "${r}"`)}catch(o){return{action:"skipped",url:n,dest:r,error:`Failed to clone: ${o instanceof Error?o.message:String(o)}`}}}return{action:"cloned",url:n,dest:r}}async function x(t,e){let r=[];for(let n of t){let s=await M(n,e);r.push(s)}return r}async function ft(t){let{process:e}=this,r=t.dry,n=d();r?e.stdout.write(`
2
- \u{1F50D} Dry run mode - no changes will be made
3
-
4
- `):e.stdout.write(`
5
- \u{1F680} Applying configuration...
6
-
7
- `);let s=await p(n);if(!s){e.stderr.write(`Error: No config file found. Create dots.config.ts in the current directory.
8
- `),e.exit(1);return}if(s.repos&&s.repos.length>0){e.stdout.write(`\u{1F4E6} Repositories:
9
- `);let o=await x(s.repos,r);for(let i of o){let a=r?"[dry-run] ":"";i.action==="cloned"?e.stdout.write(` ${a}\u2713 Cloned ${i.url} \u2192 ${i.dest}
10
- `):i.action==="exists"?e.stdout.write(` ${a}\u2022 Already exists: ${i.dest}
11
- `):i.action==="skipped"&&e.stdout.write(` ${a}\u2717 Skipped: ${i.error}
12
- `)}e.stdout.write(`
13
- `)}if(s.symlinks&&s.symlinks.length>0){e.stdout.write(`\u{1F517} Symlinks:
14
- `);let o=await u(s.symlinks,n,r);for(let i of o){let a=r?"[dry-run] ":"";i.action==="created"?e.stdout.write(` ${a}\u2713 Created ${i.dest} \u2192 ${i.src}
15
- `):i.action==="exists"?e.stdout.write(` ${a}\u2022 Already exists: ${i.dest}
16
- `):i.action==="skipped"&&e.stdout.write(` ${a}\u2717 Skipped: ${i.error}
17
- `)}e.stdout.write(`
18
- `)}if(s.brew&&s.brew.length>0){e.stdout.write(`\u{1F37A} Homebrew packages:
19
- `);let o=await k(s.brew,n,r);for(let i of o){let a=r?"[dry-run] ":"",l=i.cask?"(cask)":"";if(i.action==="installed"?e.stdout.write(` ${a}\u2713 Installed ${i.name} ${l}
20
- `):i.action==="exists"?e.stdout.write(` ${a}\u2022 Already installed: ${i.name} ${l}
21
- `):i.action==="skipped"&&e.stdout.write(` ${a}\u2717 Skipped ${i.name}: ${i.error}
22
- `),i.symlinkResults)for(let c of i.symlinkResults)c.action==="created"?e.stdout.write(` ${a}\u2713 Symlink: ${c.dest} \u2192 ${c.src}
23
- `):c.action==="exists"?e.stdout.write(` ${a}\u2022 Symlink exists: ${c.dest}
24
- `):c.action==="skipped"&&e.stdout.write(` ${a}\u2717 Symlink skipped: ${c.error}
25
- `)}e.stdout.write(`
26
- `)}r?e.stdout.write(`\u2705 Dry run complete. Run without --dry to apply changes.
27
-
28
- `):e.stdout.write(`\u2705 Configuration applied successfully!
29
-
30
- `)}export{ft as default};
@@ -1 +0,0 @@
1
- var s="Declarative dotfiles and Mac setup manager";var i="1.0.2";export{s as a,i as b};
@@ -1,127 +0,0 @@
1
- import{b as l}from"./chunk-DNQSYMNA.js";import{exec as y}from"node:child_process";import{lstat as h,mkdir as p,readFile as f,writeFile as r}from"node:fs/promises";import{homedir as d}from"node:os";import{resolve as n}from"node:path";import{promisify as b}from"node:util";var c=e=>`{
2
- "name": "dotfiles",
3
- "private": true,
4
- "type": "module",
5
- "devDependencies": {
6
- "@eunjae/dots": "^${e}"
7
- }
8
- }
9
- `,w=`node_modules
10
- `,g=`import { defineConfig } from "@eunjae/dots";
11
-
12
- export default defineConfig({
13
- // Clone additional repositories
14
- // repos: [
15
- // { url: "git@github.com:user/project.git", dest: "~/workspace/project" },
16
- // ],
17
-
18
- // Create symlinks
19
- symlinks: [
20
- // { src: "./zshrc", dest: "~/.zshrc" },
21
- // { src: "./gitconfig", dest: "~/.gitconfig" },
22
- ],
23
-
24
- // Install Homebrew packages
25
- brew: [
26
- // "git",
27
- // "ripgrep",
28
- // {
29
- // name: "neovim",
30
- // symlinks: [{ src: "./nvim", dest: "~/.config/nvim" }],
31
- // },
32
- ],
33
- });
34
- `,m=`# Dotfiles
35
-
36
- Managed with [@eunjae/dots](https://github.com/eunjae-lee/dots).
37
-
38
- ## Setup on a new machine
39
-
40
- \`\`\`bash
41
- npx @eunjae/dots init git@github.com:YOUR_USERNAME/dotfiles.git
42
- \`\`\`
43
-
44
- ## Apply changes
45
-
46
- \`\`\`bash
47
- cd ~/.dots
48
- npx @eunjae/dots apply
49
- \`\`\`
50
-
51
- ## Preview changes (dry run)
52
-
53
- \`\`\`bash
54
- npx @eunjae/dots apply --dry
55
- \`\`\`
56
- `;var s=b(y);async function u(e){try{return await h(e),!0}catch{return!1}}async function S(){try{return await s("which brew"),!0}catch{return!1}}async function k(){console.log("Installing Homebrew..."),await s('/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"',{stdio:"inherit"})}async function x(e){try{return await s(`brew list ${e}`),!0}catch{return!1}}async function C(e){console.log(`Installing ${e}...`),await s(`brew install ${e}`)}async function H(){let e=n(d(),".ssh"),i=["id_ed25519","id_rsa","id_ecdsa"];for(let t of i)if(await u(n(e,t)))return!0;return!1}async function $(){let e=n(d(),".ssh","id_ed25519");return console.log("Generating SSH key..."),await s(`ssh-keygen -t ed25519 -f "${e}" -N ""`),(await f(`${e}.pub`,"utf-8")).trim()}async function j(){let e=n(d(),".ssh"),i=["id_ed25519.pub","id_rsa.pub","id_ecdsa.pub"];for(let t of i){let o=n(e,t);if(await u(o))return(await f(o,"utf-8")).trim()}throw new Error("No SSH public key found")}async function v(){try{await s("ssh -T git@github.com 2>&1 || true");let{stderr:e}=await s("ssh -T git@github.com 2>&1 || true");return e.includes("successfully authenticated")||e.includes("You've successfully authenticated")}catch{return!1}}async function E(e,i){if(i.stdout.write(`
57
- \u{1F4C1} Creating new dotfiles project at ${e}
58
-
59
- `),await u(e)){i.stderr.write(`Error: Directory already exists: ${e}
60
- `),i.exit(1);return}await p(e,{recursive:!0}),await r(n(e,"package.json"),c(l)),await r(n(e,".gitignore"),w),await r(n(e,"dots.config.ts"),g),await r(n(e,"README.md"),m),i.stdout.write(` \u2713 Created package.json
61
- `),i.stdout.write(` \u2713 Created .gitignore
62
- `),i.stdout.write(` \u2713 Created dots.config.ts
63
- `),i.stdout.write(` \u2713 Created README.md
64
- `),await s(`git -C "${e}" init`),i.stdout.write(` \u2713 Initialized git repository
65
- `),i.stdout.write(`
66
- \u{1F4E6} Installing dependencies...
67
- `);try{await s(`cd "${e}" && npm install`),i.stdout.write(` \u2713 Dependencies installed
68
- `)}catch{i.stdout.write(` \u26A0 Could not install dependencies (package may not be published yet)
69
- `),i.stdout.write(` Run 'npm install' manually after publishing @eunjae/dots
70
- `)}i.stdout.write(`
71
- \u2705 Project created!
72
-
73
- `),i.stdout.write(`Next steps:
74
- `),i.stdout.write(` cd ${e}
75
- `),i.stdout.write(` # Edit dots.config.ts
76
- `),i.stdout.write(` # Add your dotfiles (zshrc, gitconfig, etc.)
77
- `),i.stdout.write(` git remote add origin git@github.com:YOUR_USERNAME/dotfiles.git
78
- `),i.stdout.write(` npx @eunjae/dots apply --dry
79
-
80
- `)}async function I(e,i,t){t.stdout.write(`
81
- \u{1F680} Initializing dots with config repo: ${e}
82
-
83
- `),t.stdout.write(`Step 1: Checking Homebrew...
84
- `),await S()?t.stdout.write(` \u2713 Homebrew is installed
85
- `):(await k(),t.stdout.write(` \u2713 Homebrew installed
86
- `)),t.stdout.write(`
87
- Step 2: Installing git and gh...
88
- `);for(let a of["git","gh"])await x(a)?t.stdout.write(` \u2713 ${a} is installed
89
- `):(await C(a),t.stdout.write(` \u2713 ${a} installed
90
- `));t.stdout.write(`
91
- Step 3: Setting up SSH key...
92
- `);let o;if(await H()?(o=await j(),t.stdout.write(` \u2713 SSH key exists
93
- `)):(o=await $(),t.stdout.write(` \u2713 SSH key generated
94
- `)),t.stdout.write(`
95
- Step 4: Checking GitHub SSH access...
96
- `),await v())t.stdout.write(` \u2713 GitHub SSH access confirmed
97
- `);else{t.stdout.write(`
98
- \u26A0\uFE0F SSH key not added to GitHub yet.
99
- `),t.stdout.write(`
100
- Your public key:
101
- `),t.stdout.write(` ${o}
102
-
103
- `),t.stdout.write(` Please add this key to GitHub:
104
- `),t.stdout.write(` 1. Go to https://github.com/settings/keys
105
- `),t.stdout.write(` 2. Click 'New SSH key'
106
- `),t.stdout.write(` 3. Paste the key above
107
- `),t.stdout.write(` 4. Re-run this command after adding the key
108
-
109
- `),t.stdout.write(` Or run: gh auth login
110
-
111
- `);return}t.stdout.write(`
112
- Step 5: Cloning config repo to ${i}...
113
- `),await u(i)?t.stdout.write(` \u2713 Config repo already exists at ${i}
114
- `):(await s(`git clone "${e}" "${i}"`),t.stdout.write(` \u2713 Config repo cloned
115
- `)),t.stdout.write(`
116
- Step 6: Installing dependencies...
117
- `);try{await s(`cd "${i}" && npm install`),t.stdout.write(` \u2713 Dependencies installed
118
- `)}catch{t.stdout.write(` \u26A0 Could not install dependencies
119
- `),t.stdout.write(` Run 'npm install' manually in the config directory
120
- `)}t.stdout.write(`
121
- \u2705 Bootstrap complete!
122
-
123
- `),t.stdout.write(`Next steps:
124
- `),t.stdout.write(` cd ${i}
125
- `),t.stdout.write(` npx @eunjae/dots apply
126
-
127
- `)}async function K(e,i){let{process:t}=this,o=e.path.startsWith("~/")?n(d(),e.path.slice(2)):n(e.path);i?await I(i,o,t):await E(o,t)}export{K as default};