arbors 0.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.
- package/.claude-plugin/plugin.json +7 -0
- package/.oxlintrc.json +9 -0
- package/README.ja.md +131 -0
- package/README.ko.md +131 -0
- package/README.md +131 -0
- package/bin/arbors.ts +278 -0
- package/dist/arbors.js +1094 -0
- package/dist/arbors.js.map +1 -0
- package/dist/bun-EMN2NS2M.js +48 -0
- package/dist/bun-EMN2NS2M.js.map +1 -0
- package/dist/ja-F4DBSAAZ.js +38 -0
- package/dist/ja-F4DBSAAZ.js.map +1 -0
- package/dist/ko-MTIAHJOR.js +38 -0
- package/dist/ko-MTIAHJOR.js.map +1 -0
- package/dist/node-LCODN3HC.js +56 -0
- package/dist/node-LCODN3HC.js.map +1 -0
- package/package.json +54 -0
- package/pnpm-workspace.yaml +1 -0
- package/shell/arbors-wrapper.sh +21 -0
- package/shell/arbors-wrapper.zsh +21 -0
- package/skills/arbors-usage/SKILL.md +129 -0
- package/src/config.ts +66 -0
- package/src/git/exclude.ts +63 -0
- package/src/git/safety.ts +40 -0
- package/src/git/worktree.ts +171 -0
- package/src/i18n/en.ts +63 -0
- package/src/i18n/index.ts +37 -0
- package/src/i18n/ja.ts +40 -0
- package/src/i18n/ko.ts +40 -0
- package/src/project/registry.ts +108 -0
- package/src/project/setup.ts +74 -0
- package/src/runtime/adapter.ts +16 -0
- package/src/runtime/bun.ts +49 -0
- package/src/runtime/index.ts +17 -0
- package/src/runtime/node.ts +58 -0
- package/src/tui/App.tsx +87 -0
- package/src/tui/FuzzyList.tsx +111 -0
- package/src/tui/ProjectSelector.tsx +48 -0
- package/src/tui/WorktreeSelector.tsx +46 -0
- package/tests/config.test.ts +108 -0
- package/tests/exclude.test.ts +120 -0
- package/tests/i18n.test.ts +75 -0
- package/tests/registry.test.ts +136 -0
- package/tests/safety.test.ts +58 -0
- package/tests/setup-detection.test.ts +105 -0
- package/tests/setup.test.ts +87 -0
- package/tsconfig.json +22 -0
- package/tsup.config.ts +14 -0
- package/vitest.config.ts +8 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../node_modules/.pnpm/chalk@5.6.2/node_modules/chalk/source/vendor/ansi-styles/index.js","../node_modules/.pnpm/chalk@5.6.2/node_modules/chalk/source/vendor/supports-color/index.js","../node_modules/.pnpm/chalk@5.6.2/node_modules/chalk/source/utilities.js","../node_modules/.pnpm/chalk@5.6.2/node_modules/chalk/source/index.js","../src/config.ts","../src/git/exclude.ts","../src/git/worktree.ts","../src/git/safety.ts","../src/i18n/en.ts","../src/i18n/index.ts","../src/project/registry.ts","../src/project/setup.ts","../src/runtime/index.ts","../bin/arbors.ts"],"sourcesContent":["const ANSI_BACKGROUND_OFFSET = 10;\n\nconst wrapAnsi16 = (offset = 0) => code => `\\u001B[${code + offset}m`;\n\nconst wrapAnsi256 = (offset = 0) => code => `\\u001B[${38 + offset};5;${code}m`;\n\nconst wrapAnsi16m = (offset = 0) => (red, green, blue) => `\\u001B[${38 + offset};2;${red};${green};${blue}m`;\n\nconst styles = {\n\tmodifier: {\n\t\treset: [0, 0],\n\t\t// 21 isn't widely supported and 22 does the same thing\n\t\tbold: [1, 22],\n\t\tdim: [2, 22],\n\t\titalic: [3, 23],\n\t\tunderline: [4, 24],\n\t\toverline: [53, 55],\n\t\tinverse: [7, 27],\n\t\thidden: [8, 28],\n\t\tstrikethrough: [9, 29],\n\t},\n\tcolor: {\n\t\tblack: [30, 39],\n\t\tred: [31, 39],\n\t\tgreen: [32, 39],\n\t\tyellow: [33, 39],\n\t\tblue: [34, 39],\n\t\tmagenta: [35, 39],\n\t\tcyan: [36, 39],\n\t\twhite: [37, 39],\n\n\t\t// Bright color\n\t\tblackBright: [90, 39],\n\t\tgray: [90, 39], // Alias of `blackBright`\n\t\tgrey: [90, 39], // Alias of `blackBright`\n\t\tredBright: [91, 39],\n\t\tgreenBright: [92, 39],\n\t\tyellowBright: [93, 39],\n\t\tblueBright: [94, 39],\n\t\tmagentaBright: [95, 39],\n\t\tcyanBright: [96, 39],\n\t\twhiteBright: [97, 39],\n\t},\n\tbgColor: {\n\t\tbgBlack: [40, 49],\n\t\tbgRed: [41, 49],\n\t\tbgGreen: [42, 49],\n\t\tbgYellow: [43, 49],\n\t\tbgBlue: [44, 49],\n\t\tbgMagenta: [45, 49],\n\t\tbgCyan: [46, 49],\n\t\tbgWhite: [47, 49],\n\n\t\t// Bright color\n\t\tbgBlackBright: [100, 49],\n\t\tbgGray: [100, 49], // Alias of `bgBlackBright`\n\t\tbgGrey: [100, 49], // Alias of `bgBlackBright`\n\t\tbgRedBright: [101, 49],\n\t\tbgGreenBright: [102, 49],\n\t\tbgYellowBright: [103, 49],\n\t\tbgBlueBright: [104, 49],\n\t\tbgMagentaBright: [105, 49],\n\t\tbgCyanBright: [106, 49],\n\t\tbgWhiteBright: [107, 49],\n\t},\n};\n\nexport const modifierNames = Object.keys(styles.modifier);\nexport const foregroundColorNames = Object.keys(styles.color);\nexport const backgroundColorNames = Object.keys(styles.bgColor);\nexport const colorNames = [...foregroundColorNames, ...backgroundColorNames];\n\nfunction assembleStyles() {\n\tconst codes = new Map();\n\n\tfor (const [groupName, group] of Object.entries(styles)) {\n\t\tfor (const [styleName, style] of Object.entries(group)) {\n\t\t\tstyles[styleName] = {\n\t\t\t\topen: `\\u001B[${style[0]}m`,\n\t\t\t\tclose: `\\u001B[${style[1]}m`,\n\t\t\t};\n\n\t\t\tgroup[styleName] = styles[styleName];\n\n\t\t\tcodes.set(style[0], style[1]);\n\t\t}\n\n\t\tObject.defineProperty(styles, groupName, {\n\t\t\tvalue: group,\n\t\t\tenumerable: false,\n\t\t});\n\t}\n\n\tObject.defineProperty(styles, 'codes', {\n\t\tvalue: codes,\n\t\tenumerable: false,\n\t});\n\n\tstyles.color.close = '\\u001B[39m';\n\tstyles.bgColor.close = '\\u001B[49m';\n\n\tstyles.color.ansi = wrapAnsi16();\n\tstyles.color.ansi256 = wrapAnsi256();\n\tstyles.color.ansi16m = wrapAnsi16m();\n\tstyles.bgColor.ansi = wrapAnsi16(ANSI_BACKGROUND_OFFSET);\n\tstyles.bgColor.ansi256 = wrapAnsi256(ANSI_BACKGROUND_OFFSET);\n\tstyles.bgColor.ansi16m = wrapAnsi16m(ANSI_BACKGROUND_OFFSET);\n\n\t// From https://github.com/Qix-/color-convert/blob/3f0e0d4e92e235796ccb17f6e85c72094a651f49/conversions.js\n\tObject.defineProperties(styles, {\n\t\trgbToAnsi256: {\n\t\t\tvalue(red, green, blue) {\n\t\t\t\t// We use the extended greyscale palette here, with the exception of\n\t\t\t\t// black and white. normal palette only has 4 greyscale shades.\n\t\t\t\tif (red === green && green === blue) {\n\t\t\t\t\tif (red < 8) {\n\t\t\t\t\t\treturn 16;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (red > 248) {\n\t\t\t\t\t\treturn 231;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn Math.round(((red - 8) / 247) * 24) + 232;\n\t\t\t\t}\n\n\t\t\t\treturn 16\n\t\t\t\t\t+ (36 * Math.round(red / 255 * 5))\n\t\t\t\t\t+ (6 * Math.round(green / 255 * 5))\n\t\t\t\t\t+ Math.round(blue / 255 * 5);\n\t\t\t},\n\t\t\tenumerable: false,\n\t\t},\n\t\thexToRgb: {\n\t\t\tvalue(hex) {\n\t\t\t\tconst matches = /[a-f\\d]{6}|[a-f\\d]{3}/i.exec(hex.toString(16));\n\t\t\t\tif (!matches) {\n\t\t\t\t\treturn [0, 0, 0];\n\t\t\t\t}\n\n\t\t\t\tlet [colorString] = matches;\n\n\t\t\t\tif (colorString.length === 3) {\n\t\t\t\t\tcolorString = [...colorString].map(character => character + character).join('');\n\t\t\t\t}\n\n\t\t\t\tconst integer = Number.parseInt(colorString, 16);\n\n\t\t\t\treturn [\n\t\t\t\t\t/* eslint-disable no-bitwise */\n\t\t\t\t\t(integer >> 16) & 0xFF,\n\t\t\t\t\t(integer >> 8) & 0xFF,\n\t\t\t\t\tinteger & 0xFF,\n\t\t\t\t\t/* eslint-enable no-bitwise */\n\t\t\t\t];\n\t\t\t},\n\t\t\tenumerable: false,\n\t\t},\n\t\thexToAnsi256: {\n\t\t\tvalue: hex => styles.rgbToAnsi256(...styles.hexToRgb(hex)),\n\t\t\tenumerable: false,\n\t\t},\n\t\tansi256ToAnsi: {\n\t\t\tvalue(code) {\n\t\t\t\tif (code < 8) {\n\t\t\t\t\treturn 30 + code;\n\t\t\t\t}\n\n\t\t\t\tif (code < 16) {\n\t\t\t\t\treturn 90 + (code - 8);\n\t\t\t\t}\n\n\t\t\t\tlet red;\n\t\t\t\tlet green;\n\t\t\t\tlet blue;\n\n\t\t\t\tif (code >= 232) {\n\t\t\t\t\tred = (((code - 232) * 10) + 8) / 255;\n\t\t\t\t\tgreen = red;\n\t\t\t\t\tblue = red;\n\t\t\t\t} else {\n\t\t\t\t\tcode -= 16;\n\n\t\t\t\t\tconst remainder = code % 36;\n\n\t\t\t\t\tred = Math.floor(code / 36) / 5;\n\t\t\t\t\tgreen = Math.floor(remainder / 6) / 5;\n\t\t\t\t\tblue = (remainder % 6) / 5;\n\t\t\t\t}\n\n\t\t\t\tconst value = Math.max(red, green, blue) * 2;\n\n\t\t\t\tif (value === 0) {\n\t\t\t\t\treturn 30;\n\t\t\t\t}\n\n\t\t\t\t// eslint-disable-next-line no-bitwise\n\t\t\t\tlet result = 30 + ((Math.round(blue) << 2) | (Math.round(green) << 1) | Math.round(red));\n\n\t\t\t\tif (value === 2) {\n\t\t\t\t\tresult += 60;\n\t\t\t\t}\n\n\t\t\t\treturn result;\n\t\t\t},\n\t\t\tenumerable: false,\n\t\t},\n\t\trgbToAnsi: {\n\t\t\tvalue: (red, green, blue) => styles.ansi256ToAnsi(styles.rgbToAnsi256(red, green, blue)),\n\t\t\tenumerable: false,\n\t\t},\n\t\thexToAnsi: {\n\t\t\tvalue: hex => styles.ansi256ToAnsi(styles.hexToAnsi256(hex)),\n\t\t\tenumerable: false,\n\t\t},\n\t});\n\n\treturn styles;\n}\n\nconst ansiStyles = assembleStyles();\n\nexport default ansiStyles;\n","import process from 'node:process';\nimport os from 'node:os';\nimport tty from 'node:tty';\n\n// From: https://github.com/sindresorhus/has-flag/blob/main/index.js\n/// function hasFlag(flag, argv = globalThis.Deno?.args ?? process.argv) {\nfunction hasFlag(flag, argv = globalThis.Deno ? globalThis.Deno.args : process.argv) {\n\tconst prefix = flag.startsWith('-') ? '' : (flag.length === 1 ? '-' : '--');\n\tconst position = argv.indexOf(prefix + flag);\n\tconst terminatorPosition = argv.indexOf('--');\n\treturn position !== -1 && (terminatorPosition === -1 || position < terminatorPosition);\n}\n\nconst {env} = process;\n\nlet flagForceColor;\nif (\n\thasFlag('no-color')\n\t|| hasFlag('no-colors')\n\t|| hasFlag('color=false')\n\t|| hasFlag('color=never')\n) {\n\tflagForceColor = 0;\n} else if (\n\thasFlag('color')\n\t|| hasFlag('colors')\n\t|| hasFlag('color=true')\n\t|| hasFlag('color=always')\n) {\n\tflagForceColor = 1;\n}\n\nfunction envForceColor() {\n\tif ('FORCE_COLOR' in env) {\n\t\tif (env.FORCE_COLOR === 'true') {\n\t\t\treturn 1;\n\t\t}\n\n\t\tif (env.FORCE_COLOR === 'false') {\n\t\t\treturn 0;\n\t\t}\n\n\t\treturn env.FORCE_COLOR.length === 0 ? 1 : Math.min(Number.parseInt(env.FORCE_COLOR, 10), 3);\n\t}\n}\n\nfunction translateLevel(level) {\n\tif (level === 0) {\n\t\treturn false;\n\t}\n\n\treturn {\n\t\tlevel,\n\t\thasBasic: true,\n\t\thas256: level >= 2,\n\t\thas16m: level >= 3,\n\t};\n}\n\nfunction _supportsColor(haveStream, {streamIsTTY, sniffFlags = true} = {}) {\n\tconst noFlagForceColor = envForceColor();\n\tif (noFlagForceColor !== undefined) {\n\t\tflagForceColor = noFlagForceColor;\n\t}\n\n\tconst forceColor = sniffFlags ? flagForceColor : noFlagForceColor;\n\n\tif (forceColor === 0) {\n\t\treturn 0;\n\t}\n\n\tif (sniffFlags) {\n\t\tif (hasFlag('color=16m')\n\t\t\t|| hasFlag('color=full')\n\t\t\t|| hasFlag('color=truecolor')) {\n\t\t\treturn 3;\n\t\t}\n\n\t\tif (hasFlag('color=256')) {\n\t\t\treturn 2;\n\t\t}\n\t}\n\n\t// Check for Azure DevOps pipelines.\n\t// Has to be above the `!streamIsTTY` check.\n\tif ('TF_BUILD' in env && 'AGENT_NAME' in env) {\n\t\treturn 1;\n\t}\n\n\tif (haveStream && !streamIsTTY && forceColor === undefined) {\n\t\treturn 0;\n\t}\n\n\tconst min = forceColor || 0;\n\n\tif (env.TERM === 'dumb') {\n\t\treturn min;\n\t}\n\n\tif (process.platform === 'win32') {\n\t\t// Windows 10 build 10586 is the first Windows release that supports 256 colors.\n\t\t// Windows 10 build 14931 is the first release that supports 16m/TrueColor.\n\t\tconst osRelease = os.release().split('.');\n\t\tif (\n\t\t\tNumber(osRelease[0]) >= 10\n\t\t\t&& Number(osRelease[2]) >= 10_586\n\t\t) {\n\t\t\treturn Number(osRelease[2]) >= 14_931 ? 3 : 2;\n\t\t}\n\n\t\treturn 1;\n\t}\n\n\tif ('CI' in env) {\n\t\tif (['GITHUB_ACTIONS', 'GITEA_ACTIONS', 'CIRCLECI'].some(key => key in env)) {\n\t\t\treturn 3;\n\t\t}\n\n\t\tif (['TRAVIS', 'APPVEYOR', 'GITLAB_CI', 'BUILDKITE', 'DRONE'].some(sign => sign in env) || env.CI_NAME === 'codeship') {\n\t\t\treturn 1;\n\t\t}\n\n\t\treturn min;\n\t}\n\n\tif ('TEAMCITY_VERSION' in env) {\n\t\treturn /^(9\\.(0*[1-9]\\d*)\\.|\\d{2,}\\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0;\n\t}\n\n\tif (env.COLORTERM === 'truecolor') {\n\t\treturn 3;\n\t}\n\n\tif (env.TERM === 'xterm-kitty') {\n\t\treturn 3;\n\t}\n\n\tif (env.TERM === 'xterm-ghostty') {\n\t\treturn 3;\n\t}\n\n\tif (env.TERM === 'wezterm') {\n\t\treturn 3;\n\t}\n\n\tif ('TERM_PROGRAM' in env) {\n\t\tconst version = Number.parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10);\n\n\t\tswitch (env.TERM_PROGRAM) {\n\t\t\tcase 'iTerm.app': {\n\t\t\t\treturn version >= 3 ? 3 : 2;\n\t\t\t}\n\n\t\t\tcase 'Apple_Terminal': {\n\t\t\t\treturn 2;\n\t\t\t}\n\t\t\t// No default\n\t\t}\n\t}\n\n\tif (/-256(color)?$/i.test(env.TERM)) {\n\t\treturn 2;\n\t}\n\n\tif (/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) {\n\t\treturn 1;\n\t}\n\n\tif ('COLORTERM' in env) {\n\t\treturn 1;\n\t}\n\n\treturn min;\n}\n\nexport function createSupportsColor(stream, options = {}) {\n\tconst level = _supportsColor(stream, {\n\t\tstreamIsTTY: stream && stream.isTTY,\n\t\t...options,\n\t});\n\n\treturn translateLevel(level);\n}\n\nconst supportsColor = {\n\tstdout: createSupportsColor({isTTY: tty.isatty(1)}),\n\tstderr: createSupportsColor({isTTY: tty.isatty(2)}),\n};\n\nexport default supportsColor;\n","// TODO: When targeting Node.js 16, use `String.prototype.replaceAll`.\nexport function stringReplaceAll(string, substring, replacer) {\n\tlet index = string.indexOf(substring);\n\tif (index === -1) {\n\t\treturn string;\n\t}\n\n\tconst substringLength = substring.length;\n\tlet endIndex = 0;\n\tlet returnValue = '';\n\tdo {\n\t\treturnValue += string.slice(endIndex, index) + substring + replacer;\n\t\tendIndex = index + substringLength;\n\t\tindex = string.indexOf(substring, endIndex);\n\t} while (index !== -1);\n\n\treturnValue += string.slice(endIndex);\n\treturn returnValue;\n}\n\nexport function stringEncaseCRLFWithFirstIndex(string, prefix, postfix, index) {\n\tlet endIndex = 0;\n\tlet returnValue = '';\n\tdo {\n\t\tconst gotCR = string[index - 1] === '\\r';\n\t\treturnValue += string.slice(endIndex, (gotCR ? index - 1 : index)) + prefix + (gotCR ? '\\r\\n' : '\\n') + postfix;\n\t\tendIndex = index + 1;\n\t\tindex = string.indexOf('\\n', endIndex);\n\t} while (index !== -1);\n\n\treturnValue += string.slice(endIndex);\n\treturn returnValue;\n}\n","import ansiStyles from '#ansi-styles';\nimport supportsColor from '#supports-color';\nimport { // eslint-disable-line import/order\n\tstringReplaceAll,\n\tstringEncaseCRLFWithFirstIndex,\n} from './utilities.js';\n\nconst {stdout: stdoutColor, stderr: stderrColor} = supportsColor;\n\nconst GENERATOR = Symbol('GENERATOR');\nconst STYLER = Symbol('STYLER');\nconst IS_EMPTY = Symbol('IS_EMPTY');\n\n// `supportsColor.level` → `ansiStyles.color[name]` mapping\nconst levelMapping = [\n\t'ansi',\n\t'ansi',\n\t'ansi256',\n\t'ansi16m',\n];\n\nconst styles = Object.create(null);\n\nconst applyOptions = (object, options = {}) => {\n\tif (options.level && !(Number.isInteger(options.level) && options.level >= 0 && options.level <= 3)) {\n\t\tthrow new Error('The `level` option should be an integer from 0 to 3');\n\t}\n\n\t// Detect level if not set manually\n\tconst colorLevel = stdoutColor ? stdoutColor.level : 0;\n\tobject.level = options.level === undefined ? colorLevel : options.level;\n};\n\nexport class Chalk {\n\tconstructor(options) {\n\t\t// eslint-disable-next-line no-constructor-return\n\t\treturn chalkFactory(options);\n\t}\n}\n\nconst chalkFactory = options => {\n\tconst chalk = (...strings) => strings.join(' ');\n\tapplyOptions(chalk, options);\n\n\tObject.setPrototypeOf(chalk, createChalk.prototype);\n\n\treturn chalk;\n};\n\nfunction createChalk(options) {\n\treturn chalkFactory(options);\n}\n\nObject.setPrototypeOf(createChalk.prototype, Function.prototype);\n\nfor (const [styleName, style] of Object.entries(ansiStyles)) {\n\tstyles[styleName] = {\n\t\tget() {\n\t\t\tconst builder = createBuilder(this, createStyler(style.open, style.close, this[STYLER]), this[IS_EMPTY]);\n\t\t\tObject.defineProperty(this, styleName, {value: builder});\n\t\t\treturn builder;\n\t\t},\n\t};\n}\n\nstyles.visible = {\n\tget() {\n\t\tconst builder = createBuilder(this, this[STYLER], true);\n\t\tObject.defineProperty(this, 'visible', {value: builder});\n\t\treturn builder;\n\t},\n};\n\nconst getModelAnsi = (model, level, type, ...arguments_) => {\n\tif (model === 'rgb') {\n\t\tif (level === 'ansi16m') {\n\t\t\treturn ansiStyles[type].ansi16m(...arguments_);\n\t\t}\n\n\t\tif (level === 'ansi256') {\n\t\t\treturn ansiStyles[type].ansi256(ansiStyles.rgbToAnsi256(...arguments_));\n\t\t}\n\n\t\treturn ansiStyles[type].ansi(ansiStyles.rgbToAnsi(...arguments_));\n\t}\n\n\tif (model === 'hex') {\n\t\treturn getModelAnsi('rgb', level, type, ...ansiStyles.hexToRgb(...arguments_));\n\t}\n\n\treturn ansiStyles[type][model](...arguments_);\n};\n\nconst usedModels = ['rgb', 'hex', 'ansi256'];\n\nfor (const model of usedModels) {\n\tstyles[model] = {\n\t\tget() {\n\t\t\tconst {level} = this;\n\t\t\treturn function (...arguments_) {\n\t\t\t\tconst styler = createStyler(getModelAnsi(model, levelMapping[level], 'color', ...arguments_), ansiStyles.color.close, this[STYLER]);\n\t\t\t\treturn createBuilder(this, styler, this[IS_EMPTY]);\n\t\t\t};\n\t\t},\n\t};\n\n\tconst bgModel = 'bg' + model[0].toUpperCase() + model.slice(1);\n\tstyles[bgModel] = {\n\t\tget() {\n\t\t\tconst {level} = this;\n\t\t\treturn function (...arguments_) {\n\t\t\t\tconst styler = createStyler(getModelAnsi(model, levelMapping[level], 'bgColor', ...arguments_), ansiStyles.bgColor.close, this[STYLER]);\n\t\t\t\treturn createBuilder(this, styler, this[IS_EMPTY]);\n\t\t\t};\n\t\t},\n\t};\n}\n\nconst proto = Object.defineProperties(() => {}, {\n\t...styles,\n\tlevel: {\n\t\tenumerable: true,\n\t\tget() {\n\t\t\treturn this[GENERATOR].level;\n\t\t},\n\t\tset(level) {\n\t\t\tthis[GENERATOR].level = level;\n\t\t},\n\t},\n});\n\nconst createStyler = (open, close, parent) => {\n\tlet openAll;\n\tlet closeAll;\n\tif (parent === undefined) {\n\t\topenAll = open;\n\t\tcloseAll = close;\n\t} else {\n\t\topenAll = parent.openAll + open;\n\t\tcloseAll = close + parent.closeAll;\n\t}\n\n\treturn {\n\t\topen,\n\t\tclose,\n\t\topenAll,\n\t\tcloseAll,\n\t\tparent,\n\t};\n};\n\nconst createBuilder = (self, _styler, _isEmpty) => {\n\t// Single argument is hot path, implicit coercion is faster than anything\n\t// eslint-disable-next-line no-implicit-coercion\n\tconst builder = (...arguments_) => applyStyle(builder, (arguments_.length === 1) ? ('' + arguments_[0]) : arguments_.join(' '));\n\n\t// We alter the prototype because we must return a function, but there is\n\t// no way to create a function with a different prototype\n\tObject.setPrototypeOf(builder, proto);\n\n\tbuilder[GENERATOR] = self;\n\tbuilder[STYLER] = _styler;\n\tbuilder[IS_EMPTY] = _isEmpty;\n\n\treturn builder;\n};\n\nconst applyStyle = (self, string) => {\n\tif (self.level <= 0 || !string) {\n\t\treturn self[IS_EMPTY] ? '' : string;\n\t}\n\n\tlet styler = self[STYLER];\n\n\tif (styler === undefined) {\n\t\treturn string;\n\t}\n\n\tconst {openAll, closeAll} = styler;\n\tif (string.includes('\\u001B')) {\n\t\twhile (styler !== undefined) {\n\t\t\t// Replace any instances already present with a re-opening code\n\t\t\t// otherwise only the part of the string until said closing code\n\t\t\t// will be colored, and the rest will simply be 'plain'.\n\t\t\tstring = stringReplaceAll(string, styler.close, styler.open);\n\n\t\t\tstyler = styler.parent;\n\t\t}\n\t}\n\n\t// We can move both next actions out of loop, because remaining actions in loop won't have\n\t// any/visible effect on parts we add here. Close the styling before a linebreak and reopen\n\t// after next line to fix a bleed issue on macOS: https://github.com/chalk/chalk/pull/92\n\tconst lfIndex = string.indexOf('\\n');\n\tif (lfIndex !== -1) {\n\t\tstring = stringEncaseCRLFWithFirstIndex(string, closeAll, openAll, lfIndex);\n\t}\n\n\treturn openAll + string + closeAll;\n};\n\nObject.defineProperties(createChalk.prototype, styles);\n\nconst chalk = createChalk();\nexport const chalkStderr = createChalk({level: stderrColor ? stderrColor.level : 0});\n\nexport {\n\tmodifierNames,\n\tforegroundColorNames,\n\tbackgroundColorNames,\n\tcolorNames,\n\n\t// TODO: Remove these aliases in the next major version\n\tmodifierNames as modifiers,\n\tforegroundColorNames as foregroundColors,\n\tbackgroundColorNames as backgroundColors,\n\tcolorNames as colors,\n} from './vendor/ansi-styles/index.js';\n\nexport {\n\tstdoutColor as supportsColor,\n\tstderrColor as supportsColorStderr,\n};\n\nexport default chalk;\n","import { homedir } from \"node:os\";\nimport { join, resolve } from \"node:path\";\n\nexport interface ArborConfig {\n runtime: \"bun\" | \"node\";\n language: \"ko\" | \"en\" | \"ja\";\n packageManager: \"auto\" | \"pnpm\" | \"yarn\" | \"npm\";\n copyExcludes: boolean;\n copySkip: string[];\n worktreeDir: string;\n}\n\nconst DEFAULT_CONFIG: ArborConfig = {\n runtime: \"node\",\n language: \"en\",\n packageManager: \"auto\",\n copyExcludes: true,\n copySkip: [\"node_modules\"],\n worktreeDir: \"~/arbors/{repo}\",\n} satisfies ArborConfig;\n\nconst GLOBAL_CONFIG_PATH = join(homedir(), \".arbors\", \"config.json\");\nconst PROJECT_CONFIG_DIR = \".arbors\";\nconst PROJECT_CONFIG_FILE = \"config.json\";\n\nconst mergeConfig = (base: ArborConfig, override: Partial<ArborConfig>): ArborConfig => {\n return { ...base, ...override };\n};\n\nconst readJsonFile = async (\n readFile: (path: string) => Promise<string>,\n exists: (path: string) => Promise<boolean>,\n path: string,\n): Promise<Partial<ArborConfig>> => {\n if (!(await exists(path))) return {};\n\n try {\n const content = await readFile(path);\n return JSON.parse(content) as Partial<ArborConfig>;\n } catch {\n return {};\n }\n};\n\nexport const loadConfig = async (\n readFile: (path: string) => Promise<string>,\n exists: (path: string) => Promise<boolean>,\n projectRoot?: string,\n): Promise<ArborConfig> => {\n const globalOverride = await readJsonFile(readFile, exists, GLOBAL_CONFIG_PATH);\n const merged = mergeConfig(DEFAULT_CONFIG, globalOverride);\n\n if (!projectRoot) return merged;\n\n const projectConfigPath = resolve(projectRoot, PROJECT_CONFIG_DIR, PROJECT_CONFIG_FILE);\n const projectOverride = await readJsonFile(readFile, exists, projectConfigPath);\n\n return mergeConfig(merged, projectOverride);\n};\n\nexport const getGlobalConfigPath = (): string => GLOBAL_CONFIG_PATH;\n\nexport const getProjectConfigPath = (projectRoot: string): string =>\n resolve(projectRoot, PROJECT_CONFIG_DIR, PROJECT_CONFIG_FILE);\n\nexport { DEFAULT_CONFIG, mergeConfig };\n","import { join } from \"node:path\";\nimport type { RuntimeAdapter } from \"../runtime/adapter.js\";\nimport { getRepoRoot } from \"./worktree.js\";\n\nexport const getExcludePatterns = async (adapter: RuntimeAdapter): Promise<string[]> => {\n const repoRoot = await getRepoRoot(adapter);\n const excludePath = join(repoRoot, \".git\", \"info\", \"exclude\");\n\n if (!(await adapter.exists(excludePath))) return [];\n\n const content = await adapter.readFile(excludePath);\n\n return content\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter((line) => line !== \"\" && !line.startsWith(\"#\"));\n};\n\nexport const findExcludedEntries = async (\n adapter: RuntimeAdapter,\n patterns: string[],\n): Promise<string[]> => {\n const repoRoot = await getRepoRoot(adapter);\n const cleaned = patterns.map((p) => p.replace(/^\\//, \"\"));\n\n const groups = await Promise.all(\n cleaned.map((pattern) => adapter.glob(pattern, repoRoot)),\n );\n\n return [...new Set(groups.flat())].sort();\n};\n\nexport const copyExcludedFiles = async (\n adapter: RuntimeAdapter,\n worktreePath: string,\n skipPatterns: string[] = [],\n): Promise<string[]> => {\n const patterns = await getExcludePatterns(adapter);\n if (patterns.length === 0) return [];\n\n const repoRoot = await getRepoRoot(adapter);\n const allEntries = await findExcludedEntries(adapter, patterns);\n const entries = allEntries.filter(\n (e) => !skipPatterns.some((s) => e === s || e.startsWith(`${s}/`)),\n );\n\n const copied: string[] = [];\n\n await Promise.all(\n entries.map(async (entry) => {\n const src = join(repoRoot, entry);\n const dest = join(worktreePath, entry);\n try {\n await adapter.copy(src, dest);\n copied.push(entry);\n } catch {\n // Skip non-copyable entries (sockets, pipes, etc.)\n }\n }),\n );\n\n return copied;\n};\n","import { homedir } from \"node:os\";\nimport { basename, resolve } from \"node:path\";\nimport type { RuntimeAdapter } from \"../runtime/adapter.js\";\n\nexport interface WorktreeInfo {\n path: string;\n branch: string;\n isMain: boolean;\n}\n\nexport const getRepoRoot = async (adapter: RuntimeAdapter): Promise<string> => {\n const result = await adapter.exec(\"git\", [\"rev-parse\", \"--show-toplevel\"]);\n if (result.exitCode !== 0) throw new Error(\"Not a git repository\");\n return result.stdout;\n};\n\nexport const getRepoName = async (adapter: RuntimeAdapter): Promise<string> => {\n const root = await getRepoRoot(adapter);\n return basename(root);\n};\n\nexport const getDefaultBranch = async (adapter: RuntimeAdapter): Promise<string> => {\n const result = await adapter.exec(\"git\", [\"symbolic-ref\", \"refs/remotes/origin/HEAD\"]);\n\n if (result.exitCode === 0) {\n return result.stdout.replace(\"refs/remotes/origin/\", \"\");\n }\n\n const mainCheck = await adapter.exec(\"git\", [\"rev-parse\", \"--verify\", \"main\"]);\n return mainCheck.exitCode === 0 ? \"main\" : \"master\";\n};\n\nconst parseWorktreeBlock = (block: string, isFirst: boolean): WorktreeInfo | null => {\n const lines = block.split(\"\\n\");\n const pathLine = lines.find((l) => l.startsWith(\"worktree \"));\n const branchLine = lines.find((l) => l.startsWith(\"branch \"));\n\n if (!pathLine) return null;\n\n const path = pathLine.slice(9);\n const branch = branchLine?.slice(7).replace(\"refs/heads/\", \"\") ?? \"\";\n\n return { path, branch, isMain: isFirst };\n};\n\nexport const listWorktrees = async (adapter: RuntimeAdapter): Promise<WorktreeInfo[]> => {\n const result = await adapter.exec(\"git\", [\"worktree\", \"list\", \"--porcelain\"]);\n if (result.exitCode !== 0) return [];\n\n return result.stdout\n .split(\"\\n\\n\")\n .map((block: string, index: number) => parseWorktreeBlock(block, index === 0))\n .filter((wt): wt is WorktreeInfo => wt !== null);\n};\n\nexport const branchExists = async (adapter: RuntimeAdapter, branchName: string): Promise<boolean> => {\n const result = await adapter.exec(\"git\", [\"rev-parse\", \"--verify\", branchName]);\n return result.exitCode === 0;\n};\n\nexport const remoteBranchExists = async (adapter: RuntimeAdapter, branchName: string): Promise<boolean> => {\n const result = await adapter.exec(\"git\", [\"ls-remote\", \"--heads\", \"origin\", branchName]);\n return result.exitCode === 0 && result.stdout.length > 0;\n};\n\nconst branchToDir = (branch: string): string => branch.replaceAll(\"/\", \"-\");\n\nconst resolveWorktreeDir = (worktreeDir: string, repoName: string): string => {\n const expanded = worktreeDir.replace(/^~/, homedir()).replace(\"{repo}\", repoName);\n return resolve(expanded);\n};\n\nexport const createWorktree = async (\n adapter: RuntimeAdapter,\n branch: string,\n worktreeDir: string,\n baseBranch?: string,\n): Promise<string> => {\n const repoName = await getRepoName(adapter);\n const base = baseBranch ?? (await getDefaultBranch(adapter));\n const worktreePath = resolve(resolveWorktreeDir(worktreeDir, repoName), branchToDir(branch));\n\n if (await branchExists(adapter, branch)) {\n throw new Error(`Branch '${branch}' already exists`);\n }\n\n await adapter.exec(\"git\", [\"fetch\", \"origin\", base]);\n\n const result = await adapter.exec(\"git\", [\n \"worktree\",\n \"add\",\n \"-b\",\n branch,\n worktreePath,\n `origin/${base}`,\n ]);\n\n if (result.exitCode !== 0) {\n throw new Error(result.stderr || \"Failed to create worktree\");\n }\n\n return worktreePath;\n};\n\nexport interface CheckoutResult {\n path: string;\n created: boolean;\n}\n\nexport const checkoutWorktree = async (\n adapter: RuntimeAdapter,\n branch: string,\n worktreeDir: string,\n): Promise<CheckoutResult> => {\n const existing = (await listWorktrees(adapter)).find((wt) => wt.branch === branch);\n if (existing) return { path: existing.path, created: false };\n\n const repoName = await getRepoName(adapter);\n const worktreePath = resolve(resolveWorktreeDir(worktreeDir, repoName), branchToDir(branch));\n\n const result = await adapter.exec(\"git\", [\"worktree\", \"add\", worktreePath, branch]);\n\n if (result.exitCode !== 0) {\n throw new Error(result.stderr || \"Failed to checkout worktree\");\n }\n\n return { path: worktreePath, created: true };\n};\n\nexport const checkoutRemoteWorktree = async (\n adapter: RuntimeAdapter,\n branch: string,\n worktreeDir: string,\n): Promise<CheckoutResult> => {\n const existing = (await listWorktrees(adapter)).find((wt) => wt.branch === branch);\n if (existing) return { path: existing.path, created: false };\n\n await adapter.exec(\"git\", [\"fetch\", \"origin\", branch]);\n\n const repoName = await getRepoName(adapter);\n const worktreePath = resolve(resolveWorktreeDir(worktreeDir, repoName), branchToDir(branch));\n\n const result = await adapter.exec(\"git\", [\n \"worktree\",\n \"add\",\n \"-b\",\n branch,\n worktreePath,\n `origin/${branch}`,\n ]);\n\n if (result.exitCode !== 0) {\n throw new Error(result.stderr || \"Failed to checkout remote worktree\");\n }\n\n return { path: worktreePath, created: true };\n};\n\nexport const removeWorktree = async (\n adapter: RuntimeAdapter,\n worktreePath: string,\n branch: string,\n): Promise<void> => {\n const removeResult = await adapter.exec(\"git\", [\"worktree\", \"remove\", \"--force\", worktreePath]);\n\n if (removeResult.exitCode !== 0) {\n throw new Error(removeResult.stderr || \"Failed to remove worktree\");\n }\n\n await adapter.exec(\"git\", [\"branch\", \"-D\", branch]);\n};\n","import type { RuntimeAdapter } from \"../runtime/adapter.js\";\nimport { listWorktrees } from \"./worktree.js\";\n\nconst VALID_NAME_PATTERN = /^[a-zA-Z0-9][a-zA-Z0-9._\\/-]*$/;\n\nexport const validateWorktreeName = (name: string): boolean =>\n VALID_NAME_PATTERN.test(name) && !name.includes(\"..\");\n\nexport const hasUncommittedChanges = async (\n adapter: RuntimeAdapter,\n worktreePath: string,\n): Promise<boolean> => {\n const result = await adapter.exec(\"git\", [\"-C\", worktreePath, \"status\", \"--porcelain\"]);\n\n return result.exitCode === 0 && result.stdout.length > 0;\n};\n\nexport const isMainWorktree = async (\n adapter: RuntimeAdapter,\n worktreePath: string,\n): Promise<boolean> => {\n const worktrees = await listWorktrees(adapter);\n const target = worktrees.find((wt) => wt.path === worktreePath);\n return target?.isMain ?? false;\n};\n\nexport const canSafelyRemove = async (\n adapter: RuntimeAdapter,\n worktreePath: string,\n): Promise<{ safe: boolean; reason?: string }> => {\n if (await isMainWorktree(adapter, worktreePath)) {\n return { safe: false, reason: \"cannotDeleteMain\" };\n }\n\n if (await hasUncommittedChanges(adapter, worktreePath)) {\n return { safe: false, reason: \"uncommittedChanges\" };\n }\n\n return { safe: true };\n};\n","export interface Messages {\n selectProject: string;\n noProjects: string;\n recentProjects: string;\n selectWorktree: string;\n noWorktrees: string;\n createNew: string;\n creating: string;\n removing: string;\n copying: string;\n installing: string;\n created: string;\n removed: string;\n copied: string;\n installed: string;\n resultsFound: (count: number) => string;\n notGitRepo: string;\n worktreeExists: string;\n worktreeNotFound: string;\n uncommittedChanges: string;\n cannotDeleteMain: string;\n invalidName: string;\n helpFooter: string;\n helpWorktree: string;\n configSaved: string;\n configCurrent: string;\n version: string;\n usage: string;\n commands: string;\n options: string;\n}\n\nexport const en: Messages = {\n selectProject: \"Select a project:\",\n noProjects: \"No projects registered. Run arbors in a git repository first.\",\n recentProjects: \"Recent projects\",\n selectWorktree: \"Select a worktree:\",\n noWorktrees: \"No worktrees found.\",\n createNew: \"Create new worktree\",\n creating: \"Creating worktree...\",\n removing: \"Removing worktree...\",\n copying: \"Copying excluded files...\",\n installing: \"Installing dependencies...\",\n created: \"Worktree created\",\n removed: \"Worktree removed\",\n copied: \"Excluded files copied\",\n installed: \"Dependencies installed\",\n resultsFound: (count) => `${count} result${count === 1 ? \"\" : \"s\"} found`,\n notGitRepo: \"Not a git repository.\",\n worktreeExists: \"Worktree already exists.\",\n worktreeNotFound: \"Worktree not found.\",\n uncommittedChanges: \"Worktree has uncommitted changes. Commit or stash them first.\",\n cannotDeleteMain: \"Cannot delete the main worktree.\",\n invalidName: \"Invalid worktree name.\",\n helpFooter: \"Tab: autocomplete | Enter: select | Esc: cancel\",\n helpWorktree: \"Ctrl+B: new branch | Ctrl+X: delete | Esc: back\",\n configSaved: \"Configuration saved.\",\n configCurrent: \"Current configuration:\",\n version: \"arbors v0.1.0\",\n usage: \"Usage: arbors [command] [options]\",\n commands: \"Commands:\",\n options: \"Options:\",\n};\n","import type { Messages } from \"./en.js\";\nimport { en } from \"./en.js\";\n\nexport type { Messages };\n\ntype SupportedLanguage = \"ko\" | \"en\" | \"ja\";\n\nconst LANG_MAP: Record<string, SupportedLanguage> = {\n ko: \"ko\",\n \"ko-kr\": \"ko\",\n ko_kr: \"ko\",\n en: \"en\",\n \"en-us\": \"en\",\n en_us: \"en\",\n \"en-gb\": \"en\",\n en_gb: \"en\",\n ja: \"ja\",\n \"ja-jp\": \"ja\",\n ja_jp: \"ja\",\n};\n\nconst detectLanguage = (): SupportedLanguage => {\n const lang = (process.env.LANG ?? process.env.LANGUAGE ?? \"en\").split(\".\")[0].toLowerCase();\n\n return LANG_MAP[lang] ?? LANG_MAP[lang.split(/[-_]/)[0]] ?? \"en\";\n};\n\nconst loaders: Record<SupportedLanguage, () => Promise<Messages>> = {\n en: async () => en,\n ko: async () => (await import(\"./ko.js\")).ko,\n ja: async () => (await import(\"./ja.js\")).ja,\n};\n\nexport const loadMessages = async (configLanguage?: SupportedLanguage): Promise<Messages> => {\n const lang = configLanguage ?? detectLanguage();\n return loaders[lang]();\n};\n","import { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport type { RuntimeAdapter } from \"../runtime/adapter.js\";\n\nexport interface ProjectEntry {\n name: string;\n path: string;\n lastAccessed: string;\n}\n\nexport interface WorktreeEntry {\n path: string;\n branch: string;\n projectPath: string;\n}\n\ninterface RegistryData {\n projects: ProjectEntry[];\n worktrees: WorktreeEntry[];\n}\n\nconst DB_PATH = join(homedir(), \".arbors\", \"db.json\");\n\nconst readRegistry = async (adapter: RuntimeAdapter): Promise<RegistryData> => {\n if (!(await adapter.exists(DB_PATH))) return { projects: [], worktrees: [] };\n\n try {\n const content = await adapter.readFile(DB_PATH);\n const data = JSON.parse(content) as Partial<RegistryData>;\n return { projects: data.projects ?? [], worktrees: data.worktrees ?? [] };\n } catch {\n return { projects: [], worktrees: [] };\n }\n};\n\nconst writeRegistry = async (adapter: RuntimeAdapter, data: RegistryData): Promise<void> => {\n await adapter.writeFile(DB_PATH, JSON.stringify(data, null, 2));\n};\n\nexport const getProjects = async (adapter: RuntimeAdapter): Promise<ProjectEntry[]> =>\n (await readRegistry(adapter)).projects.toSorted(\n (a, b) => new Date(b.lastAccessed).getTime() - new Date(a.lastAccessed).getTime(),\n );\n\nexport const registerProject = async (\n adapter: RuntimeAdapter,\n name: string,\n path: string,\n): Promise<void> => {\n const data = await readRegistry(adapter);\n const now = new Date().toISOString();\n\n const existing = data.projects.findIndex((p) => p.path === path);\n\n if (existing !== -1) {\n data.projects[existing] = { ...data.projects[existing], lastAccessed: now };\n } else {\n data.projects.push({ name, path, lastAccessed: now });\n }\n\n await writeRegistry(adapter, data);\n};\n\nexport const touchProject = async (adapter: RuntimeAdapter, path: string): Promise<void> => {\n const data = await readRegistry(adapter);\n const entry = data.projects.find((p) => p.path === path);\n\n if (entry) {\n entry.lastAccessed = new Date().toISOString();\n await writeRegistry(adapter, data);\n }\n};\n\nexport const removeProject = async (adapter: RuntimeAdapter, path: string): Promise<void> => {\n const data = await readRegistry(adapter);\n data.projects = data.projects.filter((p) => p.path !== path);\n await writeRegistry(adapter, data);\n};\n\nexport const registerWorktree = async (\n adapter: RuntimeAdapter,\n path: string,\n branch: string,\n projectPath: string,\n): Promise<void> => {\n const data = await readRegistry(adapter);\n const existing = data.worktrees.findIndex((w) => w.path === path);\n\n if (existing === -1) {\n data.worktrees.push({ path, branch, projectPath });\n }\n\n await writeRegistry(adapter, data);\n};\n\nexport const getWorktrees = async (\n adapter: RuntimeAdapter,\n projectPath: string,\n): Promise<WorktreeEntry[]> => {\n const data = await readRegistry(adapter);\n return data.worktrees.filter((w) => w.projectPath === projectPath);\n};\n\nexport const unregisterWorktree = async (adapter: RuntimeAdapter, path: string): Promise<void> => {\n const data = await readRegistry(adapter);\n data.worktrees = data.worktrees.filter((w) => w.path !== path);\n await writeRegistry(adapter, data);\n};\n","import { join } from \"node:path\";\nimport type { RuntimeAdapter } from \"../runtime/adapter.js\";\n\ntype PackageManager = \"pnpm\" | \"yarn\" | \"npm\" | null;\ntype RuntimeManager = \"mise\" | \"nvm\" | null;\n\nconst LOCK_FILE_MAP: [string, PackageManager][] = [\n [\"pnpm-lock.yaml\", \"pnpm\"],\n [\"yarn.lock\", \"yarn\"],\n [\"package-lock.json\", \"npm\"],\n];\n\nconst RUNTIME_MANAGER_MAP: [string, RuntimeManager][] = [\n [\"mise.toml\", \"mise\"],\n [\".mise.toml\", \"mise\"],\n [\".nvmrc\", \"nvm\"],\n];\n\nconst detectFile = async <T>(\n adapter: RuntimeAdapter,\n cwd: string,\n entries: [string, T][],\n): Promise<T | null> => {\n const results = await Promise.all(\n entries.map(async ([file, value]) => ({\n value,\n exists: await adapter.exists(join(cwd, file)),\n })),\n );\n\n return results.find((r) => r.exists)?.value ?? null;\n};\n\nexport const detectPackageManager = async (\n adapter: RuntimeAdapter,\n cwd: string,\n): Promise<PackageManager> => detectFile(adapter, cwd, LOCK_FILE_MAP);\n\nexport const detectRuntimeManager = async (\n adapter: RuntimeAdapter,\n cwd: string,\n): Promise<RuntimeManager> => detectFile(adapter, cwd, RUNTIME_MANAGER_MAP);\n\nconst PM_INSTALL_ARGS: Record<string, string[]> = {\n pnpm: [\"install\"],\n yarn: [\"install\"],\n npm: [\"install\"],\n};\n\nconst RM_INSTALL_ARGS: Record<string, [string, string[]]> = {\n mise: [\"mise\", [\"install\"]],\n nvm: [\"bash\", [\"-c\", \"source ~/.nvm/nvm.sh && nvm install\"]],\n};\n\nexport const runSetup = async (\n adapter: RuntimeAdapter,\n cwd: string,\n configPm?: \"auto\" | \"pnpm\" | \"yarn\" | \"npm\",\n): Promise<{ packageManager: string | null; runtimeManager: string | null }> => {\n const rm = await detectRuntimeManager(adapter, cwd);\n\n if (rm) {\n const [cmd, args] = RM_INSTALL_ARGS[rm];\n await adapter.exec(cmd, args);\n }\n\n const pm = configPm && configPm !== \"auto\" ? configPm : await detectPackageManager(adapter, cwd);\n\n if (pm) {\n await adapter.exec(pm, PM_INSTALL_ARGS[pm]);\n }\n\n return { packageManager: pm, runtimeManager: rm };\n};\n","import type { RuntimeAdapter } from \"./adapter.js\";\n\nexport type { ExecResult, RuntimeAdapter } from \"./adapter.js\";\n\nconst isBun = (): boolean => Object.hasOwn(process.versions, \"bun\");\n\nexport const createAdapter = async (runtime?: \"bun\" | \"node\"): Promise<RuntimeAdapter> => {\n const resolved = runtime ?? (isBun() ? \"bun\" : \"node\");\n\n if (resolved === \"bun\") {\n const { createBunAdapter } = await import(\"./bun.js\");\n return createBunAdapter();\n }\n\n const { createNodeAdapter } = await import(\"./node.js\");\n return createNodeAdapter();\n};\n","import chalk from \"chalk\";\nimport { loadConfig } from \"../src/config.js\";\nimport { copyExcludedFiles, getExcludePatterns } from \"../src/git/exclude.js\";\nimport { validateWorktreeName, canSafelyRemove } from \"../src/git/safety.js\";\nimport {\n branchExists,\n checkoutRemoteWorktree,\n checkoutWorktree,\n createWorktree,\n getRepoRoot,\n listWorktrees,\n remoteBranchExists,\n removeWorktree,\n} from \"../src/git/worktree.js\";\nimport { loadMessages } from \"../src/i18n/index.js\";\nimport { getWorktrees, registerProject, registerWorktree, unregisterWorktree } from \"../src/project/registry.js\";\nimport { runSetup } from \"../src/project/setup.js\";\nimport { createAdapter } from \"../src/runtime/index.js\";\n\nconst parseArgs = (argv: string[]) => {\n const args = argv.slice(2);\n const command = args[0];\n\n const flags = args.reduce<Record<string, string>>((acc, arg, i) => {\n if (arg.startsWith(\"--\") && args[i + 1] && !args[i + 1].startsWith(\"-\")) {\n acc[arg.slice(2)] = args[i + 1];\n }\n if (arg === \"--plain\") acc.plain = \"true\";\n if (arg === \"--create\" || arg === \"-c\") acc.create = \"true\";\n if (arg === \"--help\" || arg === \"-h\") acc.help = \"true\";\n if (arg === \"--version\" || arg === \"-v\") acc.version = \"true\";\n return acc;\n }, {});\n\n const name = args.slice(1).find((a) => !a.startsWith(\"-\"));\n\n return { command, name, flags };\n};\n\nconst printHelp = (msg: typeof import(\"../src/i18n/en.js\").en) => {\n console.log(chalk.cyan.bold(msg.version));\n console.log();\n console.log(chalk.white(msg.usage));\n console.log();\n console.log(chalk.white(msg.commands));\n console.log(\" add <branch> Checkout existing branch (local or remote)\");\n console.log(\" add -c <branch> [--base <br>] Create a new branch worktree\");\n console.log(\" remove <branch> Remove a worktree\");\n console.log(\" list List worktrees\");\n console.log(\" excluded Show exclude patterns\");\n console.log(\" config Show current config\");\n console.log();\n console.log(chalk.white(msg.options));\n console.log(\" --plain Machine-readable output\");\n console.log(\" -h, --help Show help\");\n console.log(\" -v, --version Show version\");\n};\n\nconst main = async () => {\n const { command, name, flags } = parseArgs(process.argv);\n const config = await loadConfig(\n async (p) => {\n const { readFile } = await import(\"node:fs/promises\");\n return readFile(p, \"utf-8\");\n },\n async (p) => {\n const { stat } = await import(\"node:fs/promises\");\n try {\n await stat(p);\n return true;\n } catch {\n return false;\n }\n },\n );\n\n const msg = await loadMessages(config.language);\n const adapter = await createAdapter(config.runtime);\n\n if (flags.version) {\n console.log(msg.version);\n return;\n }\n\n if (flags.help || !command) {\n printHelp(msg);\n return;\n }\n\n switch (command) {\n case \"add\": {\n if (!name) {\n console.error(chalk.red(\"✗ Usage: arbors add [-c] <branch> [--base <branch>]\"));\n process.exitCode = 1;\n return;\n }\n if (!validateWorktreeName(name)) {\n console.error(chalk.red(`✗ ${msg.invalidName}`));\n process.exitCode = 1;\n return;\n }\n\n console.log();\n console.log(chalk.cyan.bold(\"arbors add\"));\n console.log();\n\n let worktreePath: string;\n let created = false;\n let newBranch = false;\n\n if (flags.create) {\n // arbors add -c <branch> [--base main]\n console.log(chalk.gray(msg.creating));\n worktreePath = await createWorktree(adapter, name, config.worktreeDir, flags.base);\n created = true;\n newBranch = true;\n console.log(chalk.green(`✓ ${msg.created}: ${worktreePath}`));\n console.log(chalk.gray(` Branch: ${name} (from ${flags.base ?? \"default\"})`));\n } else if (await branchExists(adapter, name)) {\n console.log(chalk.gray(`Checking out ${name}...`));\n const result = await checkoutWorktree(adapter, name, config.worktreeDir);\n worktreePath = result.path;\n created = result.created;\n console.log(chalk.green(`✓ ${msg.created}: ${worktreePath}`));\n console.log(chalk.gray(` Branch: ${name}`));\n } else if (await remoteBranchExists(adapter, name)) {\n console.log(chalk.gray(`Fetching ${name} from origin...`));\n const result = await checkoutRemoteWorktree(adapter, name, config.worktreeDir);\n worktreePath = result.path;\n created = result.created;\n newBranch = result.created;\n console.log(chalk.green(`✓ ${msg.created}: ${worktreePath}`));\n console.log(chalk.gray(` Branch: ${name} (from origin/${name})`));\n } else {\n console.error(\n chalk.red(`✗ Branch '${name}' not found locally or on origin. Use 'arbors add -c' to create.`),\n );\n process.exitCode = 1;\n return;\n }\n\n try {\n if (config.copyExcludes) {\n console.log();\n console.log(chalk.gray(msg.copying));\n const copied = await copyExcludedFiles(adapter, worktreePath, config.copySkip);\n console.log(chalk.green(`✓ ${msg.copied} (${copied.length} files)`));\n }\n\n console.log();\n console.log(chalk.gray(msg.installing));\n await runSetup(adapter, worktreePath, config.packageManager);\n console.log(chalk.green(`✓ ${msg.installed}`));\n\n const repoRoot = await getRepoRoot(adapter);\n await registerProject(adapter, name, repoRoot);\n await registerWorktree(adapter, worktreePath, name, repoRoot);\n } catch (setupErr) {\n console.error(chalk.red(`✗ ${(setupErr as Error).message}`));\n if (created) {\n console.log(chalk.gray(\"Rolling back worktree...\"));\n await adapter\n .exec(\"git\", [\"worktree\", \"remove\", \"--force\", worktreePath])\n .catch(() => {});\n if (newBranch) {\n await adapter.exec(\"git\", [\"branch\", \"-D\", name]).catch(() => {});\n }\n }\n process.exitCode = 1;\n return;\n }\n\n console.log();\n console.log(chalk.gray(` cd ${worktreePath}`));\n break;\n }\n\n case \"remove\": {\n if (!name) {\n console.error(chalk.red(\"✗ Usage: arbors remove <branch>\"));\n process.exitCode = 1;\n return;\n }\n\n console.log();\n console.log(chalk.cyan.bold(\"arbors remove\"));\n console.log();\n\n // Find the worktree by branch name\n const worktrees = await listWorktrees(adapter);\n const target = worktrees.find((wt) => wt.branch === name);\n\n if (!target) {\n console.error(chalk.red(`✗ No worktree found for branch '${name}'`));\n process.exitCode = 1;\n return;\n }\n\n const { safe, reason } = await canSafelyRemove(adapter, target.path);\n if (!safe) {\n const errorMsg = reason ? msg[reason as keyof typeof msg] : \"Cannot remove\";\n console.error(chalk.red(`✗ ${errorMsg}`));\n process.exitCode = 1;\n return;\n }\n\n console.log(chalk.gray(msg.removing));\n await removeWorktree(adapter, target.path, target.branch);\n await unregisterWorktree(adapter, target.path);\n console.log(chalk.green(`✓ ${msg.removed}: ${name}`));\n break;\n }\n\n case \"list\": {\n const repoRootForList = await getRepoRoot(adapter);\n const dbWorktrees = await getWorktrees(adapter, repoRootForList);\n const gitWorktrees = await listWorktrees(adapter);\n const gitPaths = new Set(gitWorktrees.map((wt) => wt.path));\n\n // Reconcile: remove db entries that no longer exist in git\n const stale = dbWorktrees.filter((w) => !gitPaths.has(w.path));\n for (const w of stale) {\n await unregisterWorktree(adapter, w.path);\n }\n\n const managedWorktrees = dbWorktrees.filter((w) => gitPaths.has(w.path));\n\n if (flags.plain) {\n managedWorktrees.forEach((wt) => console.log(`${wt.branch}\\t${wt.path}`));\n } else if (managedWorktrees.length === 0) {\n console.log(chalk.gray(msg.noWorktrees));\n } else {\n console.log();\n console.log(chalk.cyan.bold(\"arbors list\"));\n console.log();\n managedWorktrees.forEach((wt) => {\n console.log(chalk.white(wt.branch));\n console.log(chalk.gray(` ${wt.path}`));\n });\n }\n break;\n }\n\n case \"excluded\": {\n const patterns = await getExcludePatterns(adapter);\n if (patterns.length === 0) {\n console.log(chalk.gray(\"No exclude patterns found in .git/info/exclude\"));\n } else {\n console.log();\n console.log(chalk.cyan.bold(\"arbors excluded\"));\n console.log();\n patterns.forEach((p) => console.log(` ${p}`));\n }\n break;\n }\n\n case \"config\": {\n console.log();\n console.log(chalk.cyan.bold(\"arbors config\"));\n console.log();\n Object.entries(config).forEach(([key, value]) => {\n console.log(` ${chalk.white(key)}: ${chalk.gray(String(value))}`);\n });\n break;\n }\n\n default: {\n console.error(chalk.red(`✗ Unknown command: ${command}`));\n printHelp(msg);\n process.exitCode = 1;\n }\n }\n};\n\nmain().catch((err: Error) => {\n console.error(chalk.red(`✗ ${err.message}`));\n process.exitCode = 1;\n});\n"],"mappings":"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","names":["process","styles","chalk","styles","join","homedir","resolve","join","homedir","join","join"]}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// src/runtime/bun.ts
|
|
4
|
+
import { dirname } from "path";
|
|
5
|
+
var createBunAdapter = () => ({
|
|
6
|
+
async exec(cmd, args) {
|
|
7
|
+
const proc = Bun.spawn([cmd, ...args], {
|
|
8
|
+
stdout: "pipe",
|
|
9
|
+
stderr: "pipe"
|
|
10
|
+
});
|
|
11
|
+
const [stdout, stderr] = await Promise.all([
|
|
12
|
+
new Response(proc.stdout).text(),
|
|
13
|
+
new Response(proc.stderr).text()
|
|
14
|
+
]);
|
|
15
|
+
const exitCode = await proc.exited;
|
|
16
|
+
return { stdout: stdout.trimEnd(), stderr: stderr.trimEnd(), exitCode };
|
|
17
|
+
},
|
|
18
|
+
async glob(pattern, cwd) {
|
|
19
|
+
const bunGlob = new Bun.Glob(pattern);
|
|
20
|
+
const matches = [];
|
|
21
|
+
for await (const entry of bunGlob.scan({ cwd })) {
|
|
22
|
+
matches.push(entry);
|
|
23
|
+
}
|
|
24
|
+
return matches.sort();
|
|
25
|
+
},
|
|
26
|
+
async readFile(path) {
|
|
27
|
+
return Bun.file(path).text();
|
|
28
|
+
},
|
|
29
|
+
async writeFile(path, content) {
|
|
30
|
+
await Bun.write(path, content);
|
|
31
|
+
},
|
|
32
|
+
async exists(path) {
|
|
33
|
+
return Bun.file(path).exists();
|
|
34
|
+
},
|
|
35
|
+
async copy(src, dest) {
|
|
36
|
+
const { cp, mkdir } = await import("fs/promises");
|
|
37
|
+
await mkdir(dirname(dest), { recursive: true });
|
|
38
|
+
await cp(src, dest, { recursive: true });
|
|
39
|
+
},
|
|
40
|
+
async mkdir(path) {
|
|
41
|
+
const { mkdir } = await import("fs/promises");
|
|
42
|
+
await mkdir(path, { recursive: true });
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
export {
|
|
46
|
+
createBunAdapter
|
|
47
|
+
};
|
|
48
|
+
//# sourceMappingURL=bun-EMN2NS2M.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/runtime/bun.ts"],"sourcesContent":["import { dirname } from \"node:path\";\nimport type { RuntimeAdapter } from \"./adapter.js\";\n\nexport const createBunAdapter = (): RuntimeAdapter => ({\n async exec(cmd, args) {\n const proc = Bun.spawn([cmd, ...args], {\n stdout: \"pipe\",\n stderr: \"pipe\",\n });\n const [stdout, stderr] = await Promise.all([\n new Response(proc.stdout).text(),\n new Response(proc.stderr).text(),\n ]);\n const exitCode = await proc.exited;\n return { stdout: stdout.trimEnd(), stderr: stderr.trimEnd(), exitCode };\n },\n\n async glob(pattern, cwd) {\n const bunGlob = new Bun.Glob(pattern);\n const matches: string[] = [];\n for await (const entry of bunGlob.scan({ cwd })) {\n matches.push(entry);\n }\n return matches.sort();\n },\n\n async readFile(path) {\n return Bun.file(path).text();\n },\n\n async writeFile(path, content) {\n await Bun.write(path, content);\n },\n\n async exists(path) {\n return Bun.file(path).exists();\n },\n\n async copy(src, dest) {\n const { cp, mkdir } = await import(\"node:fs/promises\");\n await mkdir(dirname(dest), { recursive: true });\n await cp(src, dest, { recursive: true });\n },\n\n async mkdir(path) {\n const { mkdir } = await import(\"node:fs/promises\");\n await mkdir(path, { recursive: true });\n },\n});\n"],"mappings":";;;AAAA,SAAS,eAAe;AAGjB,IAAM,mBAAmB,OAAuB;AAAA,EACrD,MAAM,KAAK,KAAK,MAAM;AACpB,UAAM,OAAO,IAAI,MAAM,CAAC,KAAK,GAAG,IAAI,GAAG;AAAA,MACrC,QAAQ;AAAA,MACR,QAAQ;AAAA,IACV,CAAC;AACD,UAAM,CAAC,QAAQ,MAAM,IAAI,MAAM,QAAQ,IAAI;AAAA,MACzC,IAAI,SAAS,KAAK,MAAM,EAAE,KAAK;AAAA,MAC/B,IAAI,SAAS,KAAK,MAAM,EAAE,KAAK;AAAA,IACjC,CAAC;AACD,UAAM,WAAW,MAAM,KAAK;AAC5B,WAAO,EAAE,QAAQ,OAAO,QAAQ,GAAG,QAAQ,OAAO,QAAQ,GAAG,SAAS;AAAA,EACxE;AAAA,EAEA,MAAM,KAAK,SAAS,KAAK;AACvB,UAAM,UAAU,IAAI,IAAI,KAAK,OAAO;AACpC,UAAM,UAAoB,CAAC;AAC3B,qBAAiB,SAAS,QAAQ,KAAK,EAAE,IAAI,CAAC,GAAG;AAC/C,cAAQ,KAAK,KAAK;AAAA,IACpB;AACA,WAAO,QAAQ,KAAK;AAAA,EACtB;AAAA,EAEA,MAAM,SAAS,MAAM;AACnB,WAAO,IAAI,KAAK,IAAI,EAAE,KAAK;AAAA,EAC7B;AAAA,EAEA,MAAM,UAAU,MAAM,SAAS;AAC7B,UAAM,IAAI,MAAM,MAAM,OAAO;AAAA,EAC/B;AAAA,EAEA,MAAM,OAAO,MAAM;AACjB,WAAO,IAAI,KAAK,IAAI,EAAE,OAAO;AAAA,EAC/B;AAAA,EAEA,MAAM,KAAK,KAAK,MAAM;AACpB,UAAM,EAAE,IAAI,MAAM,IAAI,MAAM,OAAO,aAAkB;AACrD,UAAM,MAAM,QAAQ,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AAC9C,UAAM,GAAG,KAAK,MAAM,EAAE,WAAW,KAAK,CAAC;AAAA,EACzC;AAAA,EAEA,MAAM,MAAM,MAAM;AAChB,UAAM,EAAE,MAAM,IAAI,MAAM,OAAO,aAAkB;AACjD,UAAM,MAAM,MAAM,EAAE,WAAW,KAAK,CAAC;AAAA,EACvC;AACF;","names":[]}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// src/i18n/ja.ts
|
|
4
|
+
var ja = {
|
|
5
|
+
selectProject: "\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u3092\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044:",
|
|
6
|
+
noProjects: "\u767B\u9332\u3055\u308C\u305F\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u304C\u3042\u308A\u307E\u305B\u3093\u3002git\u30EA\u30DD\u30B8\u30C8\u30EA\u3067arbors\u3092\u5148\u306B\u5B9F\u884C\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
|
|
7
|
+
recentProjects: "\u6700\u8FD1\u306E\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8",
|
|
8
|
+
selectWorktree: "\u30EF\u30FC\u30AF\u30C4\u30EA\u30FC\u3092\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044:",
|
|
9
|
+
noWorktrees: "\u30EF\u30FC\u30AF\u30C4\u30EA\u30FC\u304C\u3042\u308A\u307E\u305B\u3093\u3002",
|
|
10
|
+
createNew: "\u65B0\u3057\u3044\u30EF\u30FC\u30AF\u30C4\u30EA\u30FC\u3092\u4F5C\u6210",
|
|
11
|
+
creating: "\u30EF\u30FC\u30AF\u30C4\u30EA\u30FC\u3092\u4F5C\u6210\u4E2D...",
|
|
12
|
+
removing: "\u30EF\u30FC\u30AF\u30C4\u30EA\u30FC\u3092\u524A\u9664\u4E2D...",
|
|
13
|
+
copying: "\u9664\u5916\u30D5\u30A1\u30A4\u30EB\u3092\u30B3\u30D4\u30FC\u4E2D...",
|
|
14
|
+
installing: "\u4F9D\u5B58\u95A2\u4FC2\u3092\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB\u4E2D...",
|
|
15
|
+
created: "\u30EF\u30FC\u30AF\u30C4\u30EA\u30FC\u3092\u4F5C\u6210\u3057\u307E\u3057\u305F",
|
|
16
|
+
removed: "\u30EF\u30FC\u30AF\u30C4\u30EA\u30FC\u3092\u524A\u9664\u3057\u307E\u3057\u305F",
|
|
17
|
+
copied: "\u9664\u5916\u30D5\u30A1\u30A4\u30EB\u3092\u30B3\u30D4\u30FC\u3057\u307E\u3057\u305F",
|
|
18
|
+
installed: "\u4F9D\u5B58\u95A2\u4FC2\u3092\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB\u3057\u307E\u3057\u305F",
|
|
19
|
+
resultsFound: (count) => `${count}\u4EF6\u306E\u7D50\u679C`,
|
|
20
|
+
notGitRepo: "git\u30EA\u30DD\u30B8\u30C8\u30EA\u3067\u306F\u3042\u308A\u307E\u305B\u3093\u3002",
|
|
21
|
+
worktreeExists: "\u30EF\u30FC\u30AF\u30C4\u30EA\u30FC\u306F\u3059\u3067\u306B\u5B58\u5728\u3057\u307E\u3059\u3002",
|
|
22
|
+
worktreeNotFound: "\u30EF\u30FC\u30AF\u30C4\u30EA\u30FC\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093\u3002",
|
|
23
|
+
uncommittedChanges: "\u30B3\u30DF\u30C3\u30C8\u3055\u308C\u3066\u3044\u306A\u3044\u5909\u66F4\u304C\u3042\u308A\u307E\u3059\u3002\u30B3\u30DF\u30C3\u30C8\u307E\u305F\u306F\u30B9\u30BF\u30C3\u30B7\u30E5\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
|
|
24
|
+
cannotDeleteMain: "\u30E1\u30A4\u30F3\u30EF\u30FC\u30AF\u30C4\u30EA\u30FC\u306F\u524A\u9664\u3067\u304D\u307E\u305B\u3093\u3002",
|
|
25
|
+
invalidName: "\u7121\u52B9\u306A\u30EF\u30FC\u30AF\u30C4\u30EA\u30FC\u540D\u3067\u3059\u3002",
|
|
26
|
+
helpFooter: "Tab: \u88DC\u5B8C | Enter: \u9078\u629E | Esc: \u30AD\u30E3\u30F3\u30BB\u30EB",
|
|
27
|
+
helpWorktree: "Ctrl+B: \u65B0\u30D6\u30E9\u30F3\u30C1 | Ctrl+X: \u524A\u9664 | Esc: \u623B\u308B",
|
|
28
|
+
configSaved: "\u8A2D\u5B9A\u3092\u4FDD\u5B58\u3057\u307E\u3057\u305F\u3002",
|
|
29
|
+
configCurrent: "\u73FE\u5728\u306E\u8A2D\u5B9A:",
|
|
30
|
+
version: "arbors v0.1.0",
|
|
31
|
+
usage: "\u4F7F\u3044\u65B9: arbors [\u30B3\u30DE\u30F3\u30C9] [\u30AA\u30D7\u30B7\u30E7\u30F3]",
|
|
32
|
+
commands: "\u30B3\u30DE\u30F3\u30C9:",
|
|
33
|
+
options: "\u30AA\u30D7\u30B7\u30E7\u30F3:"
|
|
34
|
+
};
|
|
35
|
+
export {
|
|
36
|
+
ja
|
|
37
|
+
};
|
|
38
|
+
//# sourceMappingURL=ja-F4DBSAAZ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/i18n/ja.ts"],"sourcesContent":["import type { Messages } from \"./en.js\";\n\nexport const ja: Messages = {\n selectProject: \"プロジェクトを選択してください:\",\n noProjects: \"登録されたプロジェクトがありません。gitリポジトリでarborsを先に実行してください。\",\n recentProjects: \"最近のプロジェクト\",\n\n selectWorktree: \"ワークツリーを選択してください:\",\n noWorktrees: \"ワークツリーがありません。\",\n createNew: \"新しいワークツリーを作成\",\n\n creating: \"ワークツリーを作成中...\",\n removing: \"ワークツリーを削除中...\",\n copying: \"除外ファイルをコピー中...\",\n installing: \"依存関係をインストール中...\",\n\n created: \"ワークツリーを作成しました\",\n removed: \"ワークツリーを削除しました\",\n copied: \"除外ファイルをコピーしました\",\n installed: \"依存関係をインストールしました\",\n resultsFound: (count: number) => `${count}件の結果`,\n\n notGitRepo: \"gitリポジトリではありません。\",\n worktreeExists: \"ワークツリーはすでに存在します。\",\n worktreeNotFound: \"ワークツリーが見つかりません。\",\n uncommittedChanges: \"コミットされていない変更があります。コミットまたはスタッシュしてください。\",\n cannotDeleteMain: \"メインワークツリーは削除できません。\",\n invalidName: \"無効なワークツリー名です。\",\n\n helpFooter: \"Tab: 補完 | Enter: 選択 | Esc: キャンセル\",\n helpWorktree: \"Ctrl+B: 新ブランチ | Ctrl+X: 削除 | Esc: 戻る\",\n\n configSaved: \"設定を保存しました。\",\n configCurrent: \"現在の設定:\",\n\n version: \"arbors v0.1.0\",\n usage: \"使い方: arbors [コマンド] [オプション]\",\n commands: \"コマンド:\",\n options: \"オプション:\",\n} as const;\n"],"mappings":";;;AAEO,IAAM,KAAe;AAAA,EAC1B,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAEhB,gBAAgB;AAAA,EAChB,aAAa;AAAA,EACb,WAAW;AAAA,EAEX,UAAU;AAAA,EACV,UAAU;AAAA,EACV,SAAS;AAAA,EACT,YAAY;AAAA,EAEZ,SAAS;AAAA,EACT,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,cAAc,CAAC,UAAkB,GAAG,KAAK;AAAA,EAEzC,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,kBAAkB;AAAA,EAClB,oBAAoB;AAAA,EACpB,kBAAkB;AAAA,EAClB,aAAa;AAAA,EAEb,YAAY;AAAA,EACZ,cAAc;AAAA,EAEd,aAAa;AAAA,EACb,eAAe;AAAA,EAEf,SAAS;AAAA,EACT,OAAO;AAAA,EACP,UAAU;AAAA,EACV,SAAS;AACX;","names":[]}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// src/i18n/ko.ts
|
|
4
|
+
var ko = {
|
|
5
|
+
selectProject: "\uD504\uB85C\uC81D\uD2B8\uB97C \uC120\uD0DD\uD558\uC138\uC694:",
|
|
6
|
+
noProjects: "\uB4F1\uB85D\uB41C \uD504\uB85C\uC81D\uD2B8\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4. git \uC800\uC7A5\uC18C\uC5D0\uC11C arbors\uB97C \uBA3C\uC800 \uC2E4\uD589\uD558\uC138\uC694.",
|
|
7
|
+
recentProjects: "\uCD5C\uADFC \uD504\uB85C\uC81D\uD2B8",
|
|
8
|
+
selectWorktree: "\uC6CC\uD06C\uD2B8\uB9AC\uB97C \uC120\uD0DD\uD558\uC138\uC694:",
|
|
9
|
+
noWorktrees: "\uC6CC\uD06C\uD2B8\uB9AC\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.",
|
|
10
|
+
createNew: "\uC0C8 \uC6CC\uD06C\uD2B8\uB9AC \uC0DD\uC131",
|
|
11
|
+
creating: "\uC6CC\uD06C\uD2B8\uB9AC \uC0DD\uC131 \uC911...",
|
|
12
|
+
removing: "\uC6CC\uD06C\uD2B8\uB9AC \uC0AD\uC81C \uC911...",
|
|
13
|
+
copying: "\uC81C\uC678 \uD30C\uC77C \uBCF5\uC0AC \uC911...",
|
|
14
|
+
installing: "\uC758\uC874\uC131 \uC124\uCE58 \uC911...",
|
|
15
|
+
created: "\uC6CC\uD06C\uD2B8\uB9AC \uC0DD\uC131 \uC644\uB8CC",
|
|
16
|
+
removed: "\uC6CC\uD06C\uD2B8\uB9AC \uC0AD\uC81C \uC644\uB8CC",
|
|
17
|
+
copied: "\uC81C\uC678 \uD30C\uC77C \uBCF5\uC0AC \uC644\uB8CC",
|
|
18
|
+
installed: "\uC758\uC874\uC131 \uC124\uCE58 \uC644\uB8CC",
|
|
19
|
+
resultsFound: (count) => `${count}\uAC1C \uACB0\uACFC`,
|
|
20
|
+
notGitRepo: "git \uC800\uC7A5\uC18C\uAC00 \uC544\uB2D9\uB2C8\uB2E4.",
|
|
21
|
+
worktreeExists: "\uC6CC\uD06C\uD2B8\uB9AC\uAC00 \uC774\uBBF8 \uC874\uC7AC\uD569\uB2C8\uB2E4.",
|
|
22
|
+
worktreeNotFound: "\uC6CC\uD06C\uD2B8\uB9AC\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.",
|
|
23
|
+
uncommittedChanges: "\uCEE4\uBC0B\uB418\uC9C0 \uC54A\uC740 \uBCC0\uACBD\uC0AC\uD56D\uC774 \uC788\uC2B5\uB2C8\uB2E4. \uCEE4\uBC0B\uD558\uAC70\uB098 \uC2A4\uD0DC\uC2DC\uD558\uC138\uC694.",
|
|
24
|
+
cannotDeleteMain: "\uBA54\uC778 \uC6CC\uD06C\uD2B8\uB9AC\uB294 \uC0AD\uC81C\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.",
|
|
25
|
+
invalidName: "\uC62C\uBC14\uB974\uC9C0 \uC54A\uC740 \uC6CC\uD06C\uD2B8\uB9AC \uC774\uB984\uC785\uB2C8\uB2E4.",
|
|
26
|
+
helpFooter: "Tab: \uC790\uB3D9\uC644\uC131 | Enter: \uC120\uD0DD | Esc: \uCDE8\uC18C",
|
|
27
|
+
helpWorktree: "Ctrl+B: \uC0C8 \uBE0C\uB79C\uCE58 | Ctrl+X: \uC0AD\uC81C | Esc: \uB4A4\uB85C",
|
|
28
|
+
configSaved: "\uC124\uC815\uC774 \uC800\uC7A5\uB418\uC5C8\uC2B5\uB2C8\uB2E4.",
|
|
29
|
+
configCurrent: "\uD604\uC7AC \uC124\uC815:",
|
|
30
|
+
version: "arbors v0.1.0",
|
|
31
|
+
usage: "\uC0AC\uC6A9\uBC95: arbors [\uBA85\uB839\uC5B4] [\uC635\uC158]",
|
|
32
|
+
commands: "\uBA85\uB839\uC5B4:",
|
|
33
|
+
options: "\uC635\uC158:"
|
|
34
|
+
};
|
|
35
|
+
export {
|
|
36
|
+
ko
|
|
37
|
+
};
|
|
38
|
+
//# sourceMappingURL=ko-MTIAHJOR.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/i18n/ko.ts"],"sourcesContent":["import type { Messages } from \"./en.js\";\n\nexport const ko: Messages = {\n selectProject: \"프로젝트를 선택하세요:\",\n noProjects: \"등록된 프로젝트가 없습니다. git 저장소에서 arbors를 먼저 실행하세요.\",\n recentProjects: \"최근 프로젝트\",\n\n selectWorktree: \"워크트리를 선택하세요:\",\n noWorktrees: \"워크트리가 없습니다.\",\n createNew: \"새 워크트리 생성\",\n\n creating: \"워크트리 생성 중...\",\n removing: \"워크트리 삭제 중...\",\n copying: \"제외 파일 복사 중...\",\n installing: \"의존성 설치 중...\",\n\n created: \"워크트리 생성 완료\",\n removed: \"워크트리 삭제 완료\",\n copied: \"제외 파일 복사 완료\",\n installed: \"의존성 설치 완료\",\n resultsFound: (count: number) => `${count}개 결과`,\n\n notGitRepo: \"git 저장소가 아닙니다.\",\n worktreeExists: \"워크트리가 이미 존재합니다.\",\n worktreeNotFound: \"워크트리를 찾을 수 없습니다.\",\n uncommittedChanges: \"커밋되지 않은 변경사항이 있습니다. 커밋하거나 스태시하세요.\",\n cannotDeleteMain: \"메인 워크트리는 삭제할 수 없습니다.\",\n invalidName: \"올바르지 않은 워크트리 이름입니다.\",\n\n helpFooter: \"Tab: 자동완성 | Enter: 선택 | Esc: 취소\",\n helpWorktree: \"Ctrl+B: 새 브랜치 | Ctrl+X: 삭제 | Esc: 뒤로\",\n\n configSaved: \"설정이 저장되었습니다.\",\n configCurrent: \"현재 설정:\",\n\n version: \"arbors v0.1.0\",\n usage: \"사용법: arbors [명령어] [옵션]\",\n commands: \"명령어:\",\n options: \"옵션:\",\n} as const;\n"],"mappings":";;;AAEO,IAAM,KAAe;AAAA,EAC1B,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAEhB,gBAAgB;AAAA,EAChB,aAAa;AAAA,EACb,WAAW;AAAA,EAEX,UAAU;AAAA,EACV,UAAU;AAAA,EACV,SAAS;AAAA,EACT,YAAY;AAAA,EAEZ,SAAS;AAAA,EACT,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,cAAc,CAAC,UAAkB,GAAG,KAAK;AAAA,EAEzC,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,kBAAkB;AAAA,EAClB,oBAAoB;AAAA,EACpB,kBAAkB;AAAA,EAClB,aAAa;AAAA,EAEb,YAAY;AAAA,EACZ,cAAc;AAAA,EAEd,aAAa;AAAA,EACb,eAAe;AAAA,EAEf,SAAS;AAAA,EACT,OAAO;AAAA,EACP,UAAU;AAAA,EACV,SAAS;AACX;","names":[]}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// src/runtime/node.ts
|
|
4
|
+
import { execFile } from "child_process";
|
|
5
|
+
import { cp, glob, mkdir, readFile, stat, writeFile } from "fs/promises";
|
|
6
|
+
import { dirname } from "path";
|
|
7
|
+
import { promisify } from "util";
|
|
8
|
+
var execFileAsync = promisify(execFile);
|
|
9
|
+
var createNodeAdapter = () => ({
|
|
10
|
+
async exec(cmd, args) {
|
|
11
|
+
try {
|
|
12
|
+
const { stdout, stderr } = await execFileAsync(cmd, args);
|
|
13
|
+
return { stdout: stdout.trimEnd(), stderr: stderr.trimEnd(), exitCode: 0 };
|
|
14
|
+
} catch (error) {
|
|
15
|
+
const err = error;
|
|
16
|
+
return {
|
|
17
|
+
stdout: (err.stdout ?? "").trimEnd(),
|
|
18
|
+
stderr: (err.stderr ?? "").trimEnd(),
|
|
19
|
+
exitCode: err.code ?? 1
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
async glob(pattern, cwd) {
|
|
24
|
+
const matches = [];
|
|
25
|
+
for await (const entry of glob(pattern, { cwd })) {
|
|
26
|
+
matches.push(entry);
|
|
27
|
+
}
|
|
28
|
+
return matches.sort();
|
|
29
|
+
},
|
|
30
|
+
async readFile(path) {
|
|
31
|
+
return readFile(path, "utf-8");
|
|
32
|
+
},
|
|
33
|
+
async writeFile(path, content) {
|
|
34
|
+
await mkdir(dirname(path), { recursive: true });
|
|
35
|
+
await writeFile(path, content, "utf-8");
|
|
36
|
+
},
|
|
37
|
+
async exists(path) {
|
|
38
|
+
try {
|
|
39
|
+
await stat(path);
|
|
40
|
+
return true;
|
|
41
|
+
} catch {
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
async copy(src, dest) {
|
|
46
|
+
await mkdir(dirname(dest), { recursive: true });
|
|
47
|
+
await cp(src, dest, { recursive: true });
|
|
48
|
+
},
|
|
49
|
+
async mkdir(path) {
|
|
50
|
+
await mkdir(path, { recursive: true });
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
export {
|
|
54
|
+
createNodeAdapter
|
|
55
|
+
};
|
|
56
|
+
//# sourceMappingURL=node-LCODN3HC.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/runtime/node.ts"],"sourcesContent":["import { execFile } from \"node:child_process\";\nimport { cp, glob, mkdir, readFile, stat, writeFile } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport { promisify } from \"node:util\";\nimport type { RuntimeAdapter } from \"./adapter.js\";\n\nconst execFileAsync = promisify(execFile);\n\nexport const createNodeAdapter = (): RuntimeAdapter => ({\n async exec(cmd, args) {\n try {\n const { stdout, stderr } = await execFileAsync(cmd, args);\n return { stdout: stdout.trimEnd(), stderr: stderr.trimEnd(), exitCode: 0 };\n } catch (error: unknown) {\n const err = error as { stdout?: string; stderr?: string; code?: number };\n return {\n stdout: (err.stdout ?? \"\").trimEnd(),\n stderr: (err.stderr ?? \"\").trimEnd(),\n exitCode: err.code ?? 1,\n };\n }\n },\n\n async glob(pattern, cwd) {\n const matches: string[] = [];\n for await (const entry of glob(pattern, { cwd })) {\n matches.push(entry);\n }\n return matches.sort();\n },\n\n async readFile(path) {\n return readFile(path, \"utf-8\");\n },\n\n async writeFile(path, content) {\n await mkdir(dirname(path), { recursive: true });\n await writeFile(path, content, \"utf-8\");\n },\n\n async exists(path) {\n try {\n await stat(path);\n return true;\n } catch {\n return false;\n }\n },\n\n async copy(src, dest) {\n await mkdir(dirname(dest), { recursive: true });\n await cp(src, dest, { recursive: true });\n },\n\n async mkdir(path) {\n await mkdir(path, { recursive: true });\n },\n});\n"],"mappings":";;;AAAA,SAAS,gBAAgB;AACzB,SAAS,IAAI,MAAM,OAAO,UAAU,MAAM,iBAAiB;AAC3D,SAAS,eAAe;AACxB,SAAS,iBAAiB;AAG1B,IAAM,gBAAgB,UAAU,QAAQ;AAEjC,IAAM,oBAAoB,OAAuB;AAAA,EACtD,MAAM,KAAK,KAAK,MAAM;AACpB,QAAI;AACF,YAAM,EAAE,QAAQ,OAAO,IAAI,MAAM,cAAc,KAAK,IAAI;AACxD,aAAO,EAAE,QAAQ,OAAO,QAAQ,GAAG,QAAQ,OAAO,QAAQ,GAAG,UAAU,EAAE;AAAA,IAC3E,SAAS,OAAgB;AACvB,YAAM,MAAM;AACZ,aAAO;AAAA,QACL,SAAS,IAAI,UAAU,IAAI,QAAQ;AAAA,QACnC,SAAS,IAAI,UAAU,IAAI,QAAQ;AAAA,QACnC,UAAU,IAAI,QAAQ;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,KAAK,SAAS,KAAK;AACvB,UAAM,UAAoB,CAAC;AAC3B,qBAAiB,SAAS,KAAK,SAAS,EAAE,IAAI,CAAC,GAAG;AAChD,cAAQ,KAAK,KAAK;AAAA,IACpB;AACA,WAAO,QAAQ,KAAK;AAAA,EACtB;AAAA,EAEA,MAAM,SAAS,MAAM;AACnB,WAAO,SAAS,MAAM,OAAO;AAAA,EAC/B;AAAA,EAEA,MAAM,UAAU,MAAM,SAAS;AAC7B,UAAM,MAAM,QAAQ,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AAC9C,UAAM,UAAU,MAAM,SAAS,OAAO;AAAA,EACxC;AAAA,EAEA,MAAM,OAAO,MAAM;AACjB,QAAI;AACF,YAAM,KAAK,IAAI;AACf,aAAO;AAAA,IACT,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,KAAK,KAAK,MAAM;AACpB,UAAM,MAAM,QAAQ,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AAC9C,UAAM,GAAG,KAAK,MAAM,EAAE,WAAW,KAAK,CAAC;AAAA,EACzC;AAAA,EAEA,MAAM,MAAM,MAAM;AAChB,UAAM,MAAM,MAAM,EAAE,WAAW,KAAK,CAAC;AAAA,EACvC;AACF;","names":[]}
|
package/package.json
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "arbors",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Interactive git worktree manager with TUI",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"cli",
|
|
7
|
+
"git",
|
|
8
|
+
"tui",
|
|
9
|
+
"worktree"
|
|
10
|
+
],
|
|
11
|
+
"license": "MIT",
|
|
12
|
+
"bin": {
|
|
13
|
+
"arbors": "./dist/arbors.js"
|
|
14
|
+
},
|
|
15
|
+
"type": "module",
|
|
16
|
+
"imports": {
|
|
17
|
+
"#/*": "./src/*"
|
|
18
|
+
},
|
|
19
|
+
"scripts": {
|
|
20
|
+
"build": "tsup",
|
|
21
|
+
"dev": "tsup --watch",
|
|
22
|
+
"lint": "oxlint .",
|
|
23
|
+
"format": "oxfmt .",
|
|
24
|
+
"test": "vitest run",
|
|
25
|
+
"test:watch": "vitest",
|
|
26
|
+
"typecheck": "tsc --noEmit"
|
|
27
|
+
},
|
|
28
|
+
"dependencies": {
|
|
29
|
+
"chalk": "^5.6.2",
|
|
30
|
+
"fuse.js": "^7.1.0",
|
|
31
|
+
"ink": "^6.8.0",
|
|
32
|
+
"react": "^19.2.4"
|
|
33
|
+
},
|
|
34
|
+
"devDependencies": {
|
|
35
|
+
"@types/bun": "^1.3.9",
|
|
36
|
+
"@types/node": "^25.3.2",
|
|
37
|
+
"@types/react": "^19.2.14",
|
|
38
|
+
"happy-dom": "^20.7.0",
|
|
39
|
+
"oxfmt": "^0.35.0",
|
|
40
|
+
"oxlint": "^1.50.0",
|
|
41
|
+
"tsup": "^8.5.1",
|
|
42
|
+
"typescript": "^5.9.3",
|
|
43
|
+
"vitest": "^4.0.18"
|
|
44
|
+
},
|
|
45
|
+
"engines": {
|
|
46
|
+
"node": ">=20.0.0"
|
|
47
|
+
},
|
|
48
|
+
"packageManager": "pnpm@10.29.3",
|
|
49
|
+
"pnpm": {
|
|
50
|
+
"onlyBuiltDependencies": [
|
|
51
|
+
"esbuild"
|
|
52
|
+
]
|
|
53
|
+
}
|
|
54
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
onlyBuiltDependencies: '["esbuild"]'
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Shell wrapper for arbors — captures __ARBORS_CD__ output and runs cd
|
|
3
|
+
# Source this file in .bashrc: source /path/to/arbors-wrapper.sh
|
|
4
|
+
|
|
5
|
+
arbors() {
|
|
6
|
+
local output
|
|
7
|
+
output=$(command arbors "$@" 2>&1)
|
|
8
|
+
local exit_code=$?
|
|
9
|
+
|
|
10
|
+
local cd_path
|
|
11
|
+
cd_path=$(echo "$output" | grep '^__ARBORS_CD__:' | head -1 | cut -d: -f2-)
|
|
12
|
+
|
|
13
|
+
# Print non-protocol lines
|
|
14
|
+
echo "$output" | grep -v '^__ARBORS_CD__:'
|
|
15
|
+
|
|
16
|
+
if [ -n "$cd_path" ] && [ -d "$cd_path" ]; then
|
|
17
|
+
cd "$cd_path" || return 1
|
|
18
|
+
fi
|
|
19
|
+
|
|
20
|
+
return $exit_code
|
|
21
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
#!/usr/bin/env zsh
|
|
2
|
+
# Shell wrapper for arbors — captures __ARBORS_CD__ output and runs cd
|
|
3
|
+
# Source this file in .zshrc: source /path/to/arbors-wrapper.zsh
|
|
4
|
+
|
|
5
|
+
arbors() {
|
|
6
|
+
local output
|
|
7
|
+
output=$(command arbors "$@" 2>&1)
|
|
8
|
+
local exit_code=$?
|
|
9
|
+
|
|
10
|
+
local cd_path
|
|
11
|
+
cd_path=$(echo "$output" | grep '^__ARBORS_CD__:' | head -1 | cut -d: -f2-)
|
|
12
|
+
|
|
13
|
+
# Print non-protocol lines
|
|
14
|
+
echo "$output" | grep -v '^__ARBORS_CD__:'
|
|
15
|
+
|
|
16
|
+
if [[ -n "$cd_path" ]] && [[ -d "$cd_path" ]]; then
|
|
17
|
+
cd "$cd_path" || return 1
|
|
18
|
+
fi
|
|
19
|
+
|
|
20
|
+
return $exit_code
|
|
21
|
+
}
|