xling 0.7.2 → 0.7.3

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.
@@ -1,4 +1,4 @@
1
- import{t as e}from"../../git-BZvqM5hz.js";import"../../errors-pXKbCKbL.js";import"../../runner-DYk4q6mP.js";import"../../utils-DDnNMPIq.js";import"../../pr-DjdO-vJk.js";import"../../view-JZaEEspp.js";import"../../worktree-BuIXmI0X.js";import"../../create-CKUHliul.js";import{t}from"../../dispatcher-D4bEJonH.js";import{Command as n,Flags as r}from"@oclif/core";var i=class i extends n{static summary=`Create a pull request (PR Create)`;static description=`
1
+ import{t as e}from"../../git-BZvqM5hz.js";import"../../errors-pXKbCKbL.js";import"../../runner-DYk4q6mP.js";import"../../utils-DDnNMPIq.js";import"../../pr-DjdO-vJk.js";import"../../view-JZaEEspp.js";import"../../worktree-Bw7I8UQ6.js";import"../../create-CKUHliul.js";import{t}from"../../dispatcher-BzafsG2-.js";import{Command as n,Flags as r}from"@oclif/core";var i=class i extends n{static summary=`Create a pull request (PR Create)`;static description=`
2
2
  Create a pull request using GitHub CLI.
3
3
  Supports automatic browser preview with customizable browser selection.
4
4
  `;static examples=[{description:`Create PR interactively`,command:`<%= config.bin %> <%= command.id %>`},{description:`Create PR with title and body`,command:`<%= config.bin %> <%= command.id %> --title "Feature X" --body "Implements feature X"`},{description:`Create PR and open in browser`,command:`<%= config.bin %> <%= command.id %> --web`},{description:`Create PR and preview in Safari`,command:`<%= config.bin %> <%= command.id %> --web --browser safari`},{description:`Create draft PR`,command:`<%= config.bin %> <%= command.id %> --draft --title "WIP: Feature X"`},{description:`Create PR with reviewers and labels`,command:`<%= config.bin %> <%= command.id %> --reviewer user1 --reviewer user2 --label bug --label urgent`}];static flags={title:r.string({char:`t`,description:`PR title`}),body:r.string({char:`b`,description:`PR body/description`}),base:r.string({description:`Base branch (default: repository default branch)`}),head:r.string({description:`Head branch (default: current branch)`}),draft:r.boolean({char:`d`,description:`Create as draft PR`,default:!1}),web:r.boolean({char:`w`,description:`Open PR in browser after creation`,default:!1}),browser:r.string({description:`Browser to use when --web is enabled`,options:[...e],default:`chrome`}),assignee:r.string({char:`a`,description:`Assign user(s) (can be used multiple times)`,multiple:!0}),reviewer:r.string({char:`r`,description:`Request reviewer(s) (can be used multiple times)`,multiple:!0}),label:r.string({char:`l`,description:`Add label(s) (can be used multiple times)`,multiple:!0})};async run(){let{flags:e}=await this.parse(i),n=new t,r={title:e.title,body:e.body,base:e.base,head:e.head,draft:e.draft,web:e.web,browser:e.browser,assignee:e.assignee,reviewer:e.reviewer,label:e.label};try{let e=await n.execute({command:`prc`,cwd:process.cwd(),data:r});this.log(`✓ ${e.message}`),e.details?.draft&&this.log(` Type: Draft PR`),e.details?.base&&this.log(` Base: ${e.details.base}`),e.details?.head&&this.log(` Head: ${e.details.head}`)}catch(e){this.error(e.message,{exit:1})}}};export{i as default};
@@ -1,4 +1,4 @@
1
- import"../../errors-pXKbCKbL.js";import"../../runner-DYk4q6mP.js";import"../../utils-DDnNMPIq.js";import"../../pr-DjdO-vJk.js";import"../../view-JZaEEspp.js";import"../../worktree-BuIXmI0X.js";import"../../create-CKUHliul.js";import{t as e}from"../../dispatcher-D4bEJonH.js";import{Args as t,Command as n,Flags as r}from"@oclif/core";var i=class i extends n{static summary=`Checkout a PR branch (PR Read/Retrieve)`;static description=`
1
+ import"../../errors-pXKbCKbL.js";import"../../runner-DYk4q6mP.js";import"../../utils-DDnNMPIq.js";import"../../pr-DjdO-vJk.js";import"../../view-JZaEEspp.js";import"../../worktree-Bw7I8UQ6.js";import"../../create-CKUHliul.js";import{t as e}from"../../dispatcher-BzafsG2-.js";import{Args as t,Command as n,Flags as r}from"@oclif/core";var i=class i extends n{static summary=`Checkout a PR branch (PR Read/Retrieve)`;static description=`
2
2
  Checkout a pull request branch using GitHub CLI (gh) or git fallback.
3
3
  Automatically detects gh availability and falls back to git fetch if needed.
4
4
  `;static examples=[{description:`Checkout PR using gh or git fallback`,command:`<%= config.bin %> <%= command.id %> 123`},{description:`Checkout PR to specific branch`,command:`<%= config.bin %> <%= command.id %> 456 --branch my-pr-branch`},{description:`Force git fallback with custom remote`,command:`<%= config.bin %> <%= command.id %> 789 --no-gh --remote upstream`}];static args={id:t.string({description:`PR number or owner:repo#123 format`,required:!0})};static flags={branch:r.string({char:`b`,description:`Branch name (default: pr/<id>)`}),remote:r.string({char:`r`,description:`Remote name`,default:`origin`}),"no-gh":r.boolean({description:`Skip GitHub CLI, use git directly`,default:!1})};async run(){let{args:t,flags:n}=await this.parse(i),r=new e,a={id:t.id,branch:n.branch,strategy:n[`no-gh`]?`git`:`gh`,remote:n.remote};try{let e=await r.execute({command:`prr`,cwd:process.cwd(),data:a});this.log(`✓ ${e.message}`),e.details&&(this.log(` Strategy: ${e.details.strategy}`),this.log(` Branch: ${e.details.branch}`))}catch(e){this.error(e.message,{exit:1})}}};export{i as default};
@@ -1,4 +1,4 @@
1
- import{t as e}from"../../git-BZvqM5hz.js";import"../../errors-pXKbCKbL.js";import"../../runner-DYk4q6mP.js";import"../../utils-DDnNMPIq.js";import"../../pr-DjdO-vJk.js";import"../../view-JZaEEspp.js";import"../../worktree-BuIXmI0X.js";import"../../create-CKUHliul.js";import{t}from"../../dispatcher-D4bEJonH.js";import{Args as n,Command as r,Flags as i}from"@oclif/core";var a=class a extends r{static summary=`Open PR in web browser (PR View)`;static description=`
1
+ import{t as e}from"../../git-BZvqM5hz.js";import"../../errors-pXKbCKbL.js";import"../../runner-DYk4q6mP.js";import"../../utils-DDnNMPIq.js";import"../../pr-DjdO-vJk.js";import"../../view-JZaEEspp.js";import"../../worktree-Bw7I8UQ6.js";import"../../create-CKUHliul.js";import{t}from"../../dispatcher-BzafsG2-.js";import{Args as n,Command as r,Flags as i}from"@oclif/core";var a=class a extends r{static summary=`Open PR in web browser (PR View)`;static description=`
2
2
  Open a pull request in your web browser using GitHub CLI.
3
3
  Supports multiple browsers: Chrome (default), Safari, Firefox, Arc, Edge, Dia.
4
4
  `;static examples=[{description:`Open PR in Chrome (default)`,command:`<%= config.bin %> <%= command.id %> 123`},{description:`Open PR in Safari`,command:`<%= config.bin %> <%= command.id %> 456 --browser safari`},{description:`Open PR in Firefox`,command:`<%= config.bin %> <%= command.id %> 789 --browser firefox`},{description:`Open PR in Arc`,command:`<%= config.bin %> <%= command.id %> 999 --browser arc`}];static args={id:n.string({description:`PR number`,required:!0})};static flags={browser:i.string({char:`b`,description:`Browser to use`,options:[...e],default:`chrome`})};async run(){let{args:e,flags:n}=await this.parse(a),r=new t,i={id:e.id,browser:n.browser};try{let e=await r.execute({command:`prv`,cwd:process.cwd(),data:i});this.log(`✓ ${e.message}`)}catch(e){this.error(e.message,{exit:1})}}};export{a as default};
@@ -1,4 +1,4 @@
1
- import"../../errors-pXKbCKbL.js";import"../../runner-DYk4q6mP.js";import"../../utils-DDnNMPIq.js";import"../../pr-DjdO-vJk.js";import"../../view-JZaEEspp.js";import"../../worktree-BuIXmI0X.js";import"../../create-CKUHliul.js";import{t as e}from"../../dispatcher-D4bEJonH.js";import{Command as t,Flags as n}from"@oclif/core";var r=class r extends t{static summary=`Manage git worktrees`;static description=`
1
+ import"../../errors-pXKbCKbL.js";import"../../runner-DYk4q6mP.js";import"../../utils-DDnNMPIq.js";import"../../pr-DjdO-vJk.js";import"../../view-JZaEEspp.js";import"../../worktree-Bw7I8UQ6.js";import"../../create-CKUHliul.js";import{t as e}from"../../dispatcher-BzafsG2-.js";import{Command as t,Flags as n}from"@oclif/core";var r=class r extends t{static summary=`Manage git worktrees`;static description=`
2
2
  Manage git worktrees: list existing worktrees, add new ones, remove, or prune stale entries.
3
3
  Git worktrees allow multiple working directories from a single repository.
4
4
  `;static examples=[{description:`List all worktrees in friendly format`,command:`<%= config.bin %> <%= command.id %> --list`},{description:`Add new worktree with auto-generated path`,command:`<%= config.bin %> <%= command.id %> --add --branch feature/login`},{description:`Add worktree with custom path`,command:`<%= config.bin %> <%= command.id %> -a -p ../repo-feature -b feature/login`},{description:`Switch to main worktree (outputs path for cd)`,command:`cd $(<%= config.bin %> <%= command.id %> -s)`},{description:`Switch to specific worktree by branch name`,command:`cd $(<%= config.bin %> <%= command.id %> -s -b feature/login)`},{description:`Remove worktree by branch name`,command:`<%= config.bin %> <%= command.id %> -r -b main`},{description:`Remove worktree by directory name`,command:`<%= config.bin %> <%= command.id %> -r -b xling-feature`},{description:`Remove worktree by path`,command:`<%= config.bin %> <%= command.id %> -r -p ../repo-feature`},{description:`Prune stale worktrees`,command:`<%= config.bin %> <%= command.id %> --prune`}];static flags={list:n.boolean({char:`l`,description:`List worktrees (default)`,default:!1}),add:n.boolean({char:`a`,description:`Add new worktree (auto-generates path if not specified)`,default:!1}),switch:n.boolean({char:`s`,description:`Get worktree path (outputs path only, use with: cd $(xling git:worktree -s -b <branch>))`,default:!1}),remove:n.boolean({char:`r`,description:`Remove worktree`,default:!1}),prune:n.boolean({description:`Prune stale worktrees`,default:!1}),path:n.string({char:`p`,description:`Worktree path (e.g., '../repo-feature' or absolute path). Auto-generated if not specified with --add.`}),branch:n.string({char:`b`,description:`Branch or worktree name. Defaults to main for --add and --switch. For --remove, intelligently matches branch or directory name.`}),force:n.boolean({char:`f`,description:`Force operation`,default:!1}),detach:n.boolean({description:`Detach HEAD in new worktree`,default:!1})};async run(){let{flags:t}=await this.parse(r),n=`list`;t.add?n=`add`:t.switch?n=`switch`:t.remove?n=`remove`:t.prune&&(n=`prune`);let i=new e,a={action:n,path:t.path,branch:t.branch,force:t.force,detach:t.detach};try{let e=await i.execute({command:`worktree`,cwd:process.cwd(),data:a});if(n===`switch`){this.log(e.message);return}this.log(`✓ ${e.message}`),e.details?.output&&this.log(`
@@ -1,5 +1,6 @@
1
- import"../../errors-pXKbCKbL.js";import"../../runner-DYk4q6mP.js";import"../../utils-DDnNMPIq.js";import"../../pr-DjdO-vJk.js";import"../../view-JZaEEspp.js";import"../../worktree-BuIXmI0X.js";import"../../create-CKUHliul.js";import{t as e}from"../../dispatcher-D4bEJonH.js";import{Command as t,Flags as n}from"@oclif/core";var r=class r extends t{static summary=`Add a new git worktree`;static description=`
1
+ import"../../errors-pXKbCKbL.js";import"../../runner-DYk4q6mP.js";import"../../utils-DDnNMPIq.js";import"../../pr-DjdO-vJk.js";import"../../view-JZaEEspp.js";import"../../worktree-Bw7I8UQ6.js";import"../../create-CKUHliul.js";import{t as e}from"../../dispatcher-BzafsG2-.js";import{Command as t,Flags as n}from"@oclif/core";var r=class r extends t{static summary=`Add a new git worktree`;static description=`
2
2
  Create a new git worktree with automatic path generation.
3
3
  Defaults to main branch if not specified.
4
- `;static examples=[{description:`Add worktree for main branch (default)`,command:`<%= config.bin %> <%= command.id %>`},{description:`Add worktree for specific branch`,command:`<%= config.bin %> <%= command.id %> -b feature/login`},{description:`Add worktree with custom path`,command:`<%= config.bin %> <%= command.id %> -b feature/login -p ../my-worktree`}];static flags={branch:n.string({char:`b`,description:`Branch name (defaults to main)`}),path:n.string({char:`p`,description:`Custom worktree path (auto-generated if not specified)`}),force:n.boolean({char:`f`,description:`Force operation`,default:!1}),detach:n.boolean({description:`Detach HEAD in new worktree`,default:!1})};async run(){let{flags:t}=await this.parse(r),n=new e,i={action:`add`,branch:t.branch,path:t.path,force:t.force,detach:t.detach};try{let e=await n.execute({command:`worktree`,cwd:process.cwd(),data:i});this.log(`✓ ${e.message}`),e.details?.output&&this.log(`
4
+ Use --select to choose a branch from an interactive list.
5
+ `;static examples=[{description:`Add worktree for main branch (default)`,command:`<%= config.bin %> <%= command.id %>`},{description:`Add worktree for specific branch`,command:`<%= config.bin %> <%= command.id %> -b feature/login`},{description:`Add worktree with custom path`,command:`<%= config.bin %> <%= command.id %> -b feature/login -p ../my-worktree`},{description:`Pick a branch interactively`,command:`<%= config.bin %> <%= command.id %> --select`}];static flags={branch:n.string({char:`b`,description:`Branch name (defaults to main)`}),path:n.string({char:`p`,description:`Custom worktree path (auto-generated if not specified)`}),force:n.boolean({char:`f`,description:`Force operation`,default:!1}),detach:n.boolean({description:`Detach HEAD in new worktree`,default:!1}),select:n.boolean({description:`Use an interactive selector to choose the branch`,default:!1})};async run(){let{flags:t}=await this.parse(r),n=new e,i={action:`add`,branch:t.branch,path:t.path,force:t.force,detach:t.detach,interactive:t.select};try{let e=await n.execute({command:`worktree`,cwd:process.cwd(),data:i});this.log(`✓ ${e.message}`),e.details?.output&&this.log(`
5
6
  `+e.details.output)}catch(e){this.error(e.message,{exit:1})}}};export{r as default};
@@ -1,4 +1,4 @@
1
- import"../../errors-pXKbCKbL.js";import"../../runner-DYk4q6mP.js";import"../../utils-DDnNMPIq.js";import"../../pr-DjdO-vJk.js";import"../../view-JZaEEspp.js";import"../../worktree-BuIXmI0X.js";import"../../create-CKUHliul.js";import{t as e}from"../../dispatcher-D4bEJonH.js";import{Command as t}from"@oclif/core";var n=class extends t{static summary=`List git worktrees`;static description=`
1
+ import"../../errors-pXKbCKbL.js";import"../../runner-DYk4q6mP.js";import"../../utils-DDnNMPIq.js";import"../../pr-DjdO-vJk.js";import"../../view-JZaEEspp.js";import"../../worktree-Bw7I8UQ6.js";import"../../create-CKUHliul.js";import{t as e}from"../../dispatcher-BzafsG2-.js";import{Command as t}from"@oclif/core";var n=class extends t{static summary=`List git worktrees`;static description=`
2
2
  List all git worktrees in a friendly format.
3
3
  Shows the path and branch for each worktree.
4
4
  `;static examples=[{description:`List all worktrees`,command:`<%= config.bin %> <%= command.id %>`}];async run(){let t=new e,n={action:`list`};try{let e=await t.execute({command:`worktree`,cwd:process.cwd(),data:n});this.log(`✓ ${e.message}`),e.details?.output&&this.log(`
@@ -1,4 +1,4 @@
1
- import"../../errors-pXKbCKbL.js";import"../../runner-DYk4q6mP.js";import"../../utils-DDnNMPIq.js";import"../../pr-DjdO-vJk.js";import"../../view-JZaEEspp.js";import"../../worktree-BuIXmI0X.js";import"../../create-CKUHliul.js";import{t as e}from"../../dispatcher-D4bEJonH.js";import{Command as t}from"@oclif/core";var n=class extends t{static summary=`Prune stale git worktrees`;static description=`
1
+ import"../../errors-pXKbCKbL.js";import"../../runner-DYk4q6mP.js";import"../../utils-DDnNMPIq.js";import"../../pr-DjdO-vJk.js";import"../../view-JZaEEspp.js";import"../../worktree-Bw7I8UQ6.js";import"../../create-CKUHliul.js";import{t as e}from"../../dispatcher-BzafsG2-.js";import{Command as t}from"@oclif/core";var n=class extends t{static summary=`Prune stale git worktrees`;static description=`
2
2
  Remove stale worktree administrative files.
3
3
  This cleans up worktrees that have been manually deleted from the filesystem.
4
4
  `;static examples=[{description:`Prune stale worktrees`,command:`<%= config.bin %> <%= command.id %>`}];async run(){let t=new e,n={action:`prune`};try{let e=await t.execute({command:`worktree`,cwd:process.cwd(),data:n});this.log(`✓ ${e.message}`),e.details?.output&&this.log(`
@@ -1,5 +1,6 @@
1
- import"../../errors-pXKbCKbL.js";import"../../runner-DYk4q6mP.js";import"../../utils-DDnNMPIq.js";import"../../pr-DjdO-vJk.js";import"../../view-JZaEEspp.js";import"../../worktree-BuIXmI0X.js";import"../../create-CKUHliul.js";import{t as e}from"../../dispatcher-D4bEJonH.js";import{Command as t,Flags as n}from"@oclif/core";var r=class r extends t{static summary=`Remove a git worktree`;static description=`
1
+ import"../../errors-pXKbCKbL.js";import"../../runner-DYk4q6mP.js";import"../../utils-DDnNMPIq.js";import"../../pr-DjdO-vJk.js";import"../../view-JZaEEspp.js";import"../../worktree-Bw7I8UQ6.js";import"../../create-CKUHliul.js";import{t as e}from"../../dispatcher-BzafsG2-.js";import{Command as t,Flags as n}from"@oclif/core";var r=class r extends t{static summary=`Remove a git worktree`;static description=`
2
2
  Remove a git worktree by branch name, directory name, or path.
3
3
  Intelligently matches branch or directory names.
4
- `;static examples=[{description:`Remove worktree by branch name`,command:`<%= config.bin %> <%= command.id %> -b main`},{description:`Remove worktree by directory name`,command:`<%= config.bin %> <%= command.id %> -b xling-feature`},{description:`Remove worktree by path`,command:`<%= config.bin %> <%= command.id %> -p ../repo-feature`},{description:`Force remove worktree`,command:`<%= config.bin %> <%= command.id %> -b main -f`}];static flags={branch:n.string({char:`b`,description:`Branch or worktree directory name`}),path:n.string({char:`p`,description:`Worktree path`}),force:n.boolean({char:`f`,description:`Force removal`,default:!1})};async run(){let{flags:t}=await this.parse(r),n=new e,i={action:`remove`,branch:t.branch,path:t.path,force:t.force};try{let e=await n.execute({command:`worktree`,cwd:process.cwd(),data:i});this.log(`✓ ${e.message}`),e.details?.output&&this.log(`
4
+ Use --select to pick which worktree to remove from an interactive list.
5
+ `;static examples=[{description:`Remove worktree by branch name`,command:`<%= config.bin %> <%= command.id %> -b main`},{description:`Remove worktree by directory name`,command:`<%= config.bin %> <%= command.id %> -b xling-feature`},{description:`Remove worktree by path`,command:`<%= config.bin %> <%= command.id %> -p ../repo-feature`},{description:`Force remove worktree`,command:`<%= config.bin %> <%= command.id %> -b main -f`},{description:`Pick a worktree to remove interactively`,command:`<%= config.bin %> <%= command.id %> --select`}];static flags={branch:n.string({char:`b`,description:`Branch or worktree directory name`}),path:n.string({char:`p`,description:`Worktree path`}),force:n.boolean({char:`f`,description:`Force removal`,default:!1}),select:n.boolean({description:`Use an interactive selector to choose the worktree to remove`,default:!1})};async run(){let{flags:t}=await this.parse(r),n=new e,i={action:`remove`,branch:t.branch,path:t.path,force:t.force,interactive:t.select};try{let e=await n.execute({command:`worktree`,cwd:process.cwd(),data:i});this.log(`✓ ${e.message}`),e.details?.output&&this.log(`
5
6
  `+e.details.output)}catch(e){this.error(e.message,{exit:1})}}};export{r as default};
@@ -1,5 +1,6 @@
1
- import"../../errors-pXKbCKbL.js";import"../../runner-DYk4q6mP.js";import"../../utils-DDnNMPIq.js";import"../../pr-DjdO-vJk.js";import"../../view-JZaEEspp.js";import"../../worktree-BuIXmI0X.js";import"../../create-CKUHliul.js";import{t as e}from"../../dispatcher-D4bEJonH.js";import{Command as t,Flags as n}from"@oclif/core";import{spawn as r}from"node:child_process";var i=class i extends t{static summary=`Switch to a git worktree (opens subshell by default)`;static description=`
1
+ import"../../errors-pXKbCKbL.js";import"../../runner-DYk4q6mP.js";import"../../utils-DDnNMPIq.js";import"../../pr-DjdO-vJk.js";import"../../view-JZaEEspp.js";import"../../worktree-Bw7I8UQ6.js";import"../../create-CKUHliul.js";import{t as e}from"../../dispatcher-BzafsG2-.js";import{Command as t,Flags as n}from"@oclif/core";import{spawn as r}from"node:child_process";var i=class i extends t{static summary=`Switch to a git worktree (opens subshell by default)`;static description=`
2
2
  Find a matching worktree, then start a subshell rooted there.
3
3
  Defaults to the main branch if no branch/directory is provided.
4
4
  Use --path-only for scripting (outputs the path for cd $(...)).
5
- `;static examples=[{description:`Switch to main worktree`,command:`cd $(<%= config.bin %> <%= command.id %>)`},{description:`Switch to specific worktree by branch name`,command:`cd $(<%= config.bin %> <%= command.id %> -b feature/login)`},{description:`Switch by directory name`,command:`cd $(<%= config.bin %> <%= command.id %> -b xling-feature)`}];static flags={branch:n.string({char:`b`,description:`Branch or worktree directory name (defaults to main)`}),"path-only":n.boolean({description:`Only print the worktree path (useful for cd $(...))`,default:!1})};async run(){let{flags:t}=await this.parse(i),n=new e,r={action:`switch`,branch:t.branch};try{let e=await n.execute({command:`worktree`,cwd:process.cwd(),data:r}),i=e.details?.path,a=typeof i==`string`?i:e.message;if(t[`path-only`]){this.log(a);return}this.log(`Switching to worktree at ${a}. Exit the shell to return.`),await this.#t(a)}catch(e){this.error(e.message,{exit:1})}}#e(){return process.platform===`win32`?{command:process.env.COMSPEC||`cmd.exe`,args:[]}:{command:process.env.SHELL||`bash`,args:[]}}async#t(e){let{command:t,args:n}=this.#e();await new Promise((i,a)=>{let o=r(t,n,{cwd:e,stdio:`inherit`});o.on(`error`,e=>{a(Error(`Failed to launch shell "${t}": ${e.message}`))}),o.on(`exit`,e=>{e===0?i():a(Error(`Shell exited with code ${e}`))})})}};export{i as default};
5
+ Use --select to pick a worktree from an interactive list.
6
+ `;static examples=[{description:`Switch to main worktree`,command:`cd $(<%= config.bin %> <%= command.id %>)`},{description:`Switch to specific worktree by branch name`,command:`cd $(<%= config.bin %> <%= command.id %> -b feature/login)`},{description:`Switch by directory name`,command:`cd $(<%= config.bin %> <%= command.id %> -b xling-feature)`},{description:`Use interactive selector to pick a worktree`,command:`cd $(<%= config.bin %> <%= command.id %> --select)`}];static flags={branch:n.string({char:`b`,description:`Branch or worktree directory name (defaults to main)`}),"path-only":n.boolean({description:`Only print the worktree path (useful for cd $(...))`,default:!1}),select:n.boolean({description:`Use an interactive selector to choose the worktree`,default:!1})};async run(){let{flags:t}=await this.parse(i),n=new e,r={action:`switch`,branch:t.branch,interactive:t.select};try{let e=await n.execute({command:`worktree`,cwd:process.cwd(),data:r}),i=e.details?.path,a=typeof i==`string`?i:e.message;if(t[`path-only`]){this.log(a);return}this.log(`Switching to worktree at ${a}. Exit the shell to return.`),await this.#t(a)}catch(e){this.error(e.message,{exit:1})}}#e(){return process.platform===`win32`?{command:process.env.COMSPEC||`cmd.exe`,args:[]}:{command:process.env.SHELL||`bash`,args:[]}}async#t(e){let{command:t,args:n}=this.#e();await new Promise((i,a)=>{let o=r(t,n,{cwd:e,stdio:`inherit`});o.on(`error`,e=>{a(Error(`Failed to launch shell "${t}": ${e.message}`))}),o.on(`exit`,e=>{e===0?i():a(Error(`Shell exited with code ${e}`))})})}};export{i as default};
@@ -1,16 +1,16 @@
1
- import"../../errors-pXKbCKbL.js";import"../../editor-CUiekAEb.js";import"../../fsStore-S8RslR8L.js";import"../../base-DtcPVpvU.js";import"../../config-JHw2hqMN.js";import"../../template-B19CdPfg.js";import{t as e}from"../../xling-BxVsmPja.js";import"../../providerRegistry-Cljln1eo.js";import"../../client-DTC49Rug.js";import{n as t,t as n}from"../../types-99-EmVXg.js";import{n as r}from"../../router-DX-dIEei.js";import{Args as i,Command as a,Flags as o}from"@oclif/core";import*as s from"fs";import*as c from"readline";import*as l from"tty";var u=class u extends a{static description=`Execute a prompt using configured AI providers with automatic fallback`;static examples=[{description:`Simple prompt`,command:`<%= config.bin %> <%= command.id %> "Explain quantum computing"`},{description:`Specify model`,command:`<%= config.bin %> <%= command.id %> --model gpt-4-turbo "Write a poem"`},{description:`Read from file`,command:`<%= config.bin %> <%= command.id %> -f README.md "Summarize this"`},{description:`Read from stdin`,command:`git diff | <%= config.bin %> <%= command.id %> --stdin "Review this diff"`},{description:`JSON output`,command:`<%= config.bin %> <%= command.id %> --json "What is 2+2?"`}];static flags={model:o.string({char:`m`,description:`Model to use (defaults to configured defaultModel)`,required:!1}),prompt:o.string({char:`p`,description:`Prompt text (alternative to positional arg)`,required:!1}),system:o.string({char:`s`,description:`System prompt`,required:!1}),file:o.string({char:`f`,description:`Read additional context from file`,required:!1,multiple:!0}),stdin:o.boolean({description:`Read prompt from stdin`,required:!1,default:!1}),temperature:o.string({char:`t`,description:`Temperature (0.0-2.0)`,required:!1}),"max-tokens":o.integer({description:`Maximum tokens to generate`,required:!1}),json:o.boolean({description:`Output as JSON`,required:!1,default:!1}),stream:o.boolean({description:`Stream output (default: true)`,required:!1,default:!0,allowNo:!0}),interactive:o.boolean({char:`i`,description:`Enter interactive chat mode after first response`,required:!1,default:!1})};static args={prompt:i.string({description:`The prompt text`,required:!1})};async run(){let{args:i,flags:a}=await this.parse(u);try{let t=new e().resolvePath(`user`);s.existsSync(t.replace(`~`,process.env.HOME||``))||this.error(`Configuration not found at ${t}\n\nPlease create a configuration file with at least one provider.\nExample:\n{\n "prompt": {\n "providers": [\n {\n "name": "openai",\n "baseUrl": "https://api.openai.com/v1",\n "apiKey": "sk-...",\n "models": ["gpt-4", "gpt-4-turbo"]\n }\n ],\n "defaultModel": "gpt-4"\n }\n}`);let n=await this.#i(i,a);n.trim()||this.error(`No prompt provided. Use argument, --prompt, --file, or --stdin`);let o={prompt:n,model:a.model,system:a.system,temperature:a.temperature?parseFloat(a.temperature):void 0,maxTokens:a[`max-tokens`],stream:a.stream},c=await r(),l,u,d;if(a.stream&&!a.json){let e=await c.executeStream(o);l=await this.#r(e);let t=await e.usage;u=t?{promptTokens:t.inputTokens??0,completionTokens:t.outputTokens??0,totalTokens:t.totalTokens??0}:void 0,d={provider:`streaming`,model:a.model||`default`}}else{let e=await c.execute(o);l=e.content,u=e.usage,d={provider:e.provider,model:e.model},a.json?this.log(JSON.stringify(e,null,2)):this.log(e.content)}!a.json&&u&&d&&this.log(`\n[${d.provider}/${d.model}] ${u.totalTokens} tokens (${u.promptTokens} prompt + ${u.completionTokens} completion)`);let f=this.#e(a),p=f;!f&&!a.json&&process.stdout.isTTY&&(p=await this.#t()),p&&await this.#n(n,l,a,c)}catch(e){e instanceof t?this.error(e.message):e instanceof n?this.error(`All providers failed:\n${e.errors.map(e=>` ${e.provider}: ${e.error.message}`).join(`
2
- `)}`):this.error(e.message)}}#e(e){return e.interactive?!0:(process.stdout.isTTY&&process.stdin.isTTY,!1)}async#t(){return new Promise(e=>{let t=!1;try{let n=s.openSync(`/dev/tty`,`r+`),r=new l.ReadStream(n),i=new l.WriteStream(n),a=c.createInterface({input:r,output:i});a.question(`
3
- Continue conversation? (y/N): `,o=>{t=!0;let c=o.trim().toLowerCase(),l=c===`y`||c===`yes`;l||(i??process.stdout).write(`
1
+ import"../../errors-pXKbCKbL.js";import"../../editor-CUiekAEb.js";import{i as e,t}from"../../runner-DYk4q6mP.js";import"../../fsStore-S8RslR8L.js";import"../../base-DtcPVpvU.js";import"../../config-JHw2hqMN.js";import"../../template-B19CdPfg.js";import{t as n}from"../../xling-BxVsmPja.js";import"../../providerRegistry-Cljln1eo.js";import"../../client-DTC49Rug.js";import{n as r,t as i}from"../../types-99-EmVXg.js";import{n as a}from"../../router-DX-dIEei.js";import{Args as o,Command as s,Flags as c}from"@oclif/core";import*as l from"fs";import*as u from"readline";import*as d from"tty";var f=class f extends s{static description=`Execute a prompt via xling providers or hand off to codex exec / claude -p with yolo`;static examples=[{description:`Simple prompt`,command:`<%= config.bin %> <%= command.id %> "Explain quantum computing"`},{description:`Specify model`,command:`<%= config.bin %> <%= command.id %> --model gpt-4-turbo "Write a poem"`},{description:`Read from file`,command:`<%= config.bin %> <%= command.id %> -f README.md "Summarize this"`},{description:`Read from stdin`,command:`git diff | <%= config.bin %> <%= command.id %> --stdin "Review this diff"`},{description:`JSON output`,command:`<%= config.bin %> <%= command.id %> --json "What is 2+2?"`},{description:`Directly run codex exec (bypass xling providers)`,command:`<%= config.bin %> <%= command.id %> --tool codex "Summarize this repo"`},{description:`Use Claude Code CLI with yolo by default`,command:`<%= config.bin %> <%= command.id %> --tool claude "Review this diff"`},{description:`Shorthand for Codex backend (matches x command flag)`,command:`<%= config.bin %> <%= command.id %> -t codex "Hello"`}];static flags={tool:c.string({description:`Choose backend: xling router (default) or call codex/claude CLI directly`,options:[`xling`,`codex`,`claude`],required:!1,default:`xling`,char:`t`}),yolo:c.boolean({description:`Use yolo flags when calling codex/claude directly (skip permission prompts)`,required:!1,default:!0,allowNo:!0}),model:c.string({char:`m`,description:`Model to use (defaults to configured defaultModel)`,required:!1}),prompt:c.string({char:`p`,description:`Prompt text (alternative to positional arg)`,required:!1}),system:c.string({char:`s`,description:`System prompt`,required:!1}),file:c.string({char:`f`,description:`Read additional context from file`,required:!1,multiple:!0}),stdin:c.boolean({description:`Read prompt from stdin`,required:!1,default:!1}),temperature:c.string({char:`T`,description:`Temperature (0.0-2.0)`,required:!1}),"max-tokens":c.integer({description:`Maximum tokens to generate`,required:!1}),json:c.boolean({description:`Output as JSON`,required:!1,default:!1}),stream:c.boolean({description:`Stream output (default: true)`,required:!1,default:!0,allowNo:!0}),interactive:c.boolean({char:`i`,description:`Enter interactive chat mode after first response`,required:!1,default:!1})};static args={prompt:o.string({description:`The prompt text`,required:!1})};async run(){let{args:e,flags:t}=await this.parse(f),n=t.tool??`xling`,o=t.yolo!==!1;try{let r=await this.#s(e,t);if(r.trim()||this.error(`No prompt provided. Use argument, --prompt, --file, or --stdin`),n!==`xling`){this.#t(t),await this.#n(n,r,o);return}this.#e();let i={prompt:r,model:t.model,system:t.system,temperature:t.temperature?parseFloat(t.temperature):void 0,maxTokens:t[`max-tokens`],stream:t.stream},s=await a(),c,l,u;if(t.stream&&!t.json){let e=await s.executeStream(i);c=await this.#o(e);let n=await e.usage;l=n?{promptTokens:n.inputTokens??0,completionTokens:n.outputTokens??0,totalTokens:n.totalTokens??0}:void 0,u={provider:`streaming`,model:t.model||`default`}}else{let e=await s.execute(i);c=e.content,l=e.usage,u={provider:e.provider,model:e.model},t.json?this.log(JSON.stringify(e,null,2)):this.log(e.content)}!t.json&&l&&u&&this.log(`\n[${u.provider}/${u.model}] ${l.totalTokens} tokens (${l.promptTokens} prompt + ${l.completionTokens} completion)`);let d=this.#r(t),f=d;!d&&!t.json&&process.stdout.isTTY&&(f=await this.#i()),f&&await this.#a(r,c,t,s)}catch(e){e instanceof r?this.error(e.message):e instanceof i?this.error(`All providers failed:\n${e.errors.map(e=>` ${e.provider}: ${e.error.message}`).join(`
2
+ `)}`):this.error(e.message)}}#e(){let e=new n().resolvePath(`user`);l.existsSync(e.replace(`~`,process.env.HOME||``))||this.error(`Configuration not found at ${e}\n\nPlease create a configuration file with at least one provider.\nExample:\n{\n "prompt": {\n "providers": [\n {\n "name": "openai",\n "baseUrl": "https://api.openai.com/v1",\n "apiKey": "sk-...",\n "models": ["gpt-4", "gpt-4-turbo"]\n }\n ],\n "defaultModel": "gpt-4"\n }\n}`)}#t(e){e.interactive&&this.error(`Interactive mode is not supported when using --tool codex/claude. Remove --interactive or use the default xling router.`);let t=[];e.json&&t.push(`--json`),e.model&&t.push(`--model`),e.system&&t.push(`--system`),e.temperature!==void 0&&t.push(`--temperature`),e[`max-tokens`]!==void 0&&t.push(`--max-tokens`),e.stream===!1&&t.push(`--no-stream`),t.length>0&&this.warn(`Ignoring ${t.join(`, `)} when using direct CLI backend; codex/claude will apply their own defaults.`)}async#n(n,r,i){let a=n===`codex`?`codex`:`claude`;await t(a)||this.error(`Tool "${a}" is not installed or not found in PATH. Please install it before using --tool ${n}.`);let o={executable:a,baseArgs:n===`codex`?[`exec`,r]:[`-p`,r],yoloArgs:i&&n===`codex`?[`--dangerously-bypass-approvals-and-sandbox`]:i?[`--dangerously-skip-permissions`]:void 0};this.log(`[backend: ${n}] ${i?`yolo on`:`yolo off`} — handing output to ${a}`),await e(o)}#r(e){return e.interactive?!0:(process.stdout.isTTY&&process.stdin.isTTY,!1)}async#i(){return new Promise(e=>{let t=!1;try{let n=l.openSync(`/dev/tty`,`r+`),r=new d.ReadStream(n),i=new d.WriteStream(n),a=u.createInterface({input:r,output:i});a.question(`
3
+ Continue conversation? (y/N): `,o=>{t=!0;let s=o.trim().toLowerCase(),c=s===`y`||s===`yes`;c||(i??process.stdout).write(`
4
4
  Okay, not continuing the conversation.
5
- `),a.close(),r.destroy(),i.destroy(),s.closeSync(n),e(l)}),setTimeout(()=>{t||(a.close(),r.destroy(),i.destroy(),s.closeSync(n),process.stdout.write(`
5
+ `),a.close(),r.destroy(),i.destroy(),l.closeSync(n),e(c)}),setTimeout(()=>{t||(a.close(),r.destroy(),i.destroy(),l.closeSync(n),process.stdout.write(`
6
6
  No response received. Ending conversation prompt.
7
- `),e(!1))},1e4)}catch{this.log(`Skipping interactive follow-up (TTY not available).`),e(!1)}})}async#n(e,t,n,r){let i=[];n.system&&i.push({role:`system`,content:n.system}),i.push({role:`user`,content:e}),i.push({role:`assistant`,content:t}),this.log(`
7
+ `),e(!1))},1e4)}catch{this.log(`Skipping interactive follow-up (TTY not available).`),e(!1)}})}async#a(e,t,n,r){let i=[];n.system&&i.push({role:`system`,content:n.system}),i.push({role:`user`,content:e}),i.push({role:`assistant`,content:t}),this.log(`
8
8
  --- Interactive mode (type 'exit', 'quit', or press Ctrl+D to end) ---
9
- `);try{let e,t=null,a=null,o=null,u=!1,d,f=()=>{if(d&&`setRawMode`in d)try{d.setRawMode(u)}catch{}if(a)try{a.destroy()}catch{}if(o)try{o.destroy()}catch{}if(t!==null)try{s.closeSync(t)}catch{}};process.stdin.isTTY?(d=process.stdin,u=process.stdin.isRaw||!1,u||process.stdin.setRawMode(!0),e=c.createInterface({input:process.stdin,output:process.stdout,prompt:`> `})):(t=s.openSync(`/dev/tty`,`r+`),a=new l.ReadStream(t),o=new l.WriteStream(t),d=a,u=a.isRaw||!1,u||a.setRawMode(!0),e=c.createInterface({input:a,output:o,prompt:`> `}));let p=o||process.stdout;e.prompt(),e.on(`line`,async t=>{let a=t.trim();if([`exit`,`quit`,`q`].includes(a.toLowerCase())){e.close();return}if(!a){e.prompt();return}i.push({role:`user`,content:a});try{let t={messages:i,model:n.model,temperature:n.temperature?parseFloat(n.temperature):void 0,maxTokens:n[`max-tokens`],stream:!0},a=await r.executeStream(t),o=await this.#r(a,p);i.push({role:`assistant`,content:o}),e.prompt()}catch(t){p.write(`\n[Error] ${t.message}\n\n`),e.prompt()}}),e.on(`close`,()=>{f(),this.log(`
9
+ `);try{let e,t=null,a=null,o=null,s=!1,c,f=()=>{if(c&&`setRawMode`in c)try{c.setRawMode(s)}catch{}if(a)try{a.destroy()}catch{}if(o)try{o.destroy()}catch{}if(t!==null)try{l.closeSync(t)}catch{}};process.stdin.isTTY?(c=process.stdin,s=process.stdin.isRaw||!1,s||process.stdin.setRawMode(!0),e=u.createInterface({input:process.stdin,output:process.stdout,prompt:`> `})):(t=l.openSync(`/dev/tty`,`r+`),a=new d.ReadStream(t),o=new d.WriteStream(t),c=a,s=a.isRaw||!1,s||a.setRawMode(!0),e=u.createInterface({input:a,output:o,prompt:`> `}));let p=o||process.stdout;e.prompt(),e.on(`line`,async t=>{let a=t.trim();if([`exit`,`quit`,`q`].includes(a.toLowerCase())){e.close();return}if(!a){e.prompt();return}i.push({role:`user`,content:a});try{let t={messages:i,model:n.model,temperature:n.temperature?parseFloat(n.temperature):void 0,maxTokens:n[`max-tokens`],stream:!0},a=await r.executeStream(t),o=await this.#o(a,p);i.push({role:`assistant`,content:o}),e.prompt()}catch(t){p.write(`\n[Error] ${t.message}\n\n`),e.prompt()}}),e.on(`close`,()=>{f(),this.log(`
10
10
  Goodbye!`),process.exit(0)}),e.on(`SIGINT`,()=>{p.write(`
11
11
 
12
12
  Interrupted. Type 'exit' to quit or continue chatting.
13
- `),e.prompt()});let m=()=>{f(),process.exit(0)};process.once(`SIGTERM`,m),process.once(`SIGINT`,m)}catch(e){this.error(`Cannot enter interactive mode: ${e.message}`)}}async#r(e,t=process.stdout){let n=``;t.write(`
13
+ `),e.prompt()});let m=()=>{f(),process.exit(0)};process.once(`SIGTERM`,m),process.once(`SIGINT`,m)}catch(e){this.error(`Cannot enter interactive mode: ${e.message}`)}}async#o(e,t=process.stdout){let n=``;t.write(`
14
14
  `);for await(let r of e.textStream)t.write(r),n+=r,`flush`in t&&typeof t.flush==`function`&&t.flush();return t.write(`
15
- `),n}async#i(e,t){let n=[];if(e.prompt&&n.push(e.prompt),t.prompt&&n.push(t.prompt),t.file&&t.file.length>0)for(let e of t.file)try{let t=s.readFileSync(e,`utf-8`);n.push(`\n--- File: ${e} ---\n${t}`)}catch(t){this.warn(`Failed to read file ${e}: ${t.message}`)}if(t.stdin){let e=await this.#a();e&&n.push(e)}return n.join(`
16
- `).trim()}async#a(){return new Promise(e=>{let t=[];process.stdin.setEncoding(`utf-8`),process.stdin.on(`data`,e=>{t.push(e.toString())}),process.stdin.on(`end`,()=>{e(t.join(``))}),process.stdin.isTTY&&e(``)})}};export{u as default};
15
+ `),n}async#s(e,t){let n=[];if(e.prompt&&n.push(e.prompt),t.prompt&&n.push(t.prompt),t.file&&t.file.length>0)for(let e of t.file)try{let t=l.readFileSync(e,`utf-8`);n.push(`\n--- File: ${e} ---\n${t}`)}catch(t){this.warn(`Failed to read file ${e}: ${t.message}`)}if(t.stdin){let e=await this.#c();e&&n.push(e)}return n.join(`
16
+ `).trim()}async#c(){return new Promise(e=>{let t=[];process.stdin.setEncoding(`utf-8`),process.stdin.on(`data`,e=>{t.push(e.toString())}),process.stdin.on(`end`,()=>{e(t.join(``))}),process.stdin.isTTY&&e(``)})}};export{f as default};
@@ -1 +1 @@
1
- import{Command as e}from"@oclif/core";var t=`0.7.2`,n=class extends e{static summary=`Show the current xling version`;static description=`Displays the version from package.json.`;static examples=[`<%= config.bin %> <%= command.id %>`];async run(){this.log(t??`unknown`)}};export{n as default};
1
+ import{Command as e}from"@oclif/core";var t=`0.7.3`,n=class extends e{static summary=`Show the current xling version`;static description=`Displays the version from package.json.`;static examples=[`<%= config.bin %> <%= command.id %>`];async run(){this.log(t??`unknown`)}};export{n as default};
@@ -1 +1 @@
1
- import{n as e}from"./utils-DDnNMPIq.js";import{t}from"./pr-DjdO-vJk.js";import{t as n}from"./view-JZaEEspp.js";import{t as r}from"./worktree-BuIXmI0X.js";import{t as i}from"./create-CKUHliul.js";var a=class{async execute(a){if(a.command!==`prv`&&await e(a.cwd),a.command===`worktree`)return r(a.data,a.cwd);if(a.command===`prr`)return t(a.data,a.cwd);if(a.command===`prv`)return n(a.data,a.cwd);if(a.command===`prc`)return i(a.data,a.cwd);let o=a;throw Error(`Unknown git command: ${o}`)}};export{a as t};
1
+ import{n as e}from"./utils-DDnNMPIq.js";import{t}from"./pr-DjdO-vJk.js";import{t as n}from"./view-JZaEEspp.js";import{t as r}from"./worktree-Bw7I8UQ6.js";import{t as i}from"./create-CKUHliul.js";var a=class{async execute(a){if(a.command!==`prv`&&await e(a.cwd),a.command===`worktree`)return r(a.data,a.cwd);if(a.command===`prr`)return t(a.data,a.cwd);if(a.command===`prv`)return n(a.data,a.cwd);if(a.command===`prc`)return i(a.data,a.cwd);let o=a;throw Error(`Unknown git command: ${o}`)}};export{a as t};
@@ -1,2 +1,2 @@
1
- import { a as GitPrRequest, c as GitWorktreeRequest, d as WorktreeStatus, i as GitCreatePrRequest, l as SUPPORTED_BROWSERS, n as GitCommandPayload, o as GitViewRequest, r as GitCommandResult, s as GitWorktreeAction, t as GitCommandDetails, u as SupportedBrowser } from "../git-DLTG_wRS.js";
1
+ import { a as GitPrRequest, c as GitWorktreeRequest, d as WorktreeStatus, i as GitCreatePrRequest, l as SUPPORTED_BROWSERS, n as GitCommandPayload, o as GitViewRequest, r as GitCommandResult, s as GitWorktreeAction, t as GitCommandDetails, u as SupportedBrowser } from "../git-DSnxX0yi.js";
2
2
  export { GitCommandDetails, GitCommandPayload, GitCommandResult, GitCreatePrRequest, GitPrRequest, GitViewRequest, GitWorktreeAction, GitWorktreeRequest, SUPPORTED_BROWSERS, SupportedBrowser, WorktreeStatus };
@@ -32,6 +32,7 @@ interface GitWorktreeRequest {
32
32
  branch?: string;
33
33
  force?: boolean;
34
34
  detach?: boolean;
35
+ interactive?: boolean;
35
36
  }
36
37
  /**
37
38
  * PR checkout request
@@ -1,4 +1,4 @@
1
- import { i as GitCreatePrRequest, r as GitCommandResult } from "../../git-DLTG_wRS.js";
1
+ import { i as GitCreatePrRequest, r as GitCommandResult } from "../../git-DSnxX0yi.js";
2
2
 
3
3
  //#region src/services/git/create.d.ts
4
4
 
@@ -1,4 +1,4 @@
1
- import { n as GitCommandPayload, r as GitCommandResult } from "../../git-DLTG_wRS.js";
1
+ import { n as GitCommandPayload, r as GitCommandResult } from "../../git-DSnxX0yi.js";
2
2
 
3
3
  //#region src/services/git/dispatcher.d.ts
4
4
 
@@ -1 +1 @@
1
- import"../../errors-pXKbCKbL.js";import"../../runner-DYk4q6mP.js";import"../../utils-DDnNMPIq.js";import"../../pr-DjdO-vJk.js";import"../../view-JZaEEspp.js";import"../../worktree-BuIXmI0X.js";import"../../create-CKUHliul.js";import{t as e}from"../../dispatcher-D4bEJonH.js";export{e as GitDispatcher};
1
+ import"../../errors-pXKbCKbL.js";import"../../runner-DYk4q6mP.js";import"../../utils-DDnNMPIq.js";import"../../pr-DjdO-vJk.js";import"../../view-JZaEEspp.js";import"../../worktree-Bw7I8UQ6.js";import"../../create-CKUHliul.js";import{t as e}from"../../dispatcher-BzafsG2-.js";export{e as GitDispatcher};
@@ -1,4 +1,4 @@
1
- import { a as GitPrRequest, r as GitCommandResult } from "../../git-DLTG_wRS.js";
1
+ import { a as GitPrRequest, r as GitCommandResult } from "../../git-DSnxX0yi.js";
2
2
 
3
3
  //#region src/services/git/pr.d.ts
4
4
 
@@ -1,4 +1,4 @@
1
- import { o as GitViewRequest, r as GitCommandResult } from "../../git-DLTG_wRS.js";
1
+ import { o as GitViewRequest, r as GitCommandResult } from "../../git-DSnxX0yi.js";
2
2
 
3
3
  //#region src/services/git/view.d.ts
4
4
 
@@ -1,4 +1,4 @@
1
- import { c as GitWorktreeRequest, r as GitCommandResult } from "../../git-DLTG_wRS.js";
1
+ import { c as GitWorktreeRequest, r as GitCommandResult } from "../../git-DSnxX0yi.js";
2
2
 
3
3
  //#region src/services/git/worktree.d.ts
4
4
 
@@ -1 +1 @@
1
- import"../../errors-pXKbCKbL.js";import"../../runner-DYk4q6mP.js";import{t as e}from"../../worktree-BuIXmI0X.js";export{e as manageWorktree};
1
+ import"../../errors-pXKbCKbL.js";import"../../runner-DYk4q6mP.js";import{t as e}from"../../worktree-Bw7I8UQ6.js";export{e as manageWorktree};
@@ -0,0 +1,8 @@
1
+ import{o as e}from"./errors-pXKbCKbL.js";import{r as t}from"./runner-DYk4q6mP.js";import n from"node:path";import{existsSync as r}from"node:fs";import i from"node:readline";function a(e){return n.basename(e)}function o(e,t){let r=a(e),i=t.replace(/\//g,`-`);return n.join(e,`..`,`${r}-${i}`)}function s(e,t){t.path&&e.push({path:t.path,branch:t.branch,head:t.head})}function c(e){let t=[],n=e.trim().split(`
2
+ `),r={};for(let e of n)e.startsWith(`worktree `)?(s(t,r),r={path:e.substring(9)}):e.startsWith(`HEAD `)?r.head=e.substring(5):e.startsWith(`branch `)?r.branch=e.substring(7).replace(`refs/heads/`,``):e===``&&(s(t,r),r={});return s(t,r),t}async function l(n){let r=await t(`git`,[`worktree`,`list`,`--porcelain`],{cwd:n,throwOnError:!1});if(!r.success)throw new e(`git worktree list`,r.stderr);return c(r.stdout)}async function u(n){let r=await t(`git`,[`branch`,`--format=%(refname:short)`,`--sort=-committerdate`],{cwd:n,throwOnError:!1});if(!r.success)throw new e(`git branch --format=%(refname:short)`,r.stderr);return r.stdout.split(`
3
+ `).map(e=>e.trim()).filter(Boolean)}async function d(e,t,n=0){if(t.length===0)throw Error(`No options available for selection.`);let r=process.stdin,a=process.stdout;if(!r.isTTY||!a.isTTY)throw Error(`Interactive selection requires a TTY. Remove --select to continue.`);i.emitKeypressEvents(r),r.resume();let o=!!r.isRaw;r.setRawMode&&r.setRawMode(!0);let s=Math.min(Math.max(n,0),t.length-1),c=0,l=()=>{a.moveCursor(0,-c),a.clearScreenDown();let n=[e,`Use ↑/↓ then Enter to confirm. Press q or Ctrl+C to cancel.`,...t.map((e,t)=>{let n=`${t===s?`➜`:` `} ${e.label}`;return t===s?`\x1B[36m${n}\x1B[0m`:n})];a.write(n.join(`
4
+ `)+`
5
+ `),c=n.length};return await new Promise((e,n)=>{let i=(t,i)=>{r.off(`keypress`,c),r.setRawMode&&r.setRawMode(o),r.pause(),a.write(`\x1B[?25h
6
+ `),t?n(t):e(i)},c=(e,n)=>{if(n){if(n.name===`up`){s=(s-1+t.length)%t.length,l();return}if(n.name===`down`){s=(s+1)%t.length,l();return}if(n.name===`return`){i(void 0,t[s].value);return}(n.name===`c`&&n.ctrl||n.name===`q`)&&i(Error(`Selection cancelled.`))}};r.on(`keypress`,c),a.write(`\x1B[?25l`),l()})}function f(e,t){let r=t.find(t=>t.branch===e);if(r)return r.path;let i=t.find(t=>{let r=n.basename(t.path);return r===e||r.endsWith(`-${e}`)});if(i)return i.path;let a=t.find(t=>t.path.includes(e));return a?a.path:null}async function p(n,i){let a=i||process.cwd(),{action:s,path:c,branch:p,force:m,detach:h,interactive:g}=n;switch(s){case`list`:{let e=await l(a);return{success:!0,message:`Available worktrees:`,details:{output:e.length===0?` (no worktrees found)`:e.map((e,t)=>` [${t+1}] ${e.path}\n Branch: ${e.branch||`detached`}`).join(`
7
+
8
+ `),worktrees:e}}}case`switch`:{let e=await l(a);if(e.length===0)throw Error(`No worktrees found`);if(g){let t=p&&f(p,e)||null,n=t===null?0:Math.max(0,e.findIndex(e=>e.path===t)),r=await d(`Select worktree to switch to:`,e.map(e=>({label:`${e.branch||`detached`} — ${e.path}`,value:e})),n);return{success:!0,message:r.path,details:{path:r.path,branch:r.branch}}}let t=p||`main`,n=f(t,e);if(!n)throw Error(`Could not find worktree matching "${t}". Use --list to see available worktrees.`);return{success:!0,message:n,details:{path:n,branch:t}}}case`add`:{let n=p||`main`,i=await l(a);if(g){let e=await u(a);if(e.length===0)throw Error(`No local branches found. Create one or fetch remote branches before adding a worktree.`);let t=e.map(e=>({label:i.some(t=>t.branch===e)?`${e} (already has a worktree)`:e,value:e}));n=await d(`Select branch to create a worktree for:`,t,Math.max(0,t.findIndex(e=>e.value===n)))}let s=i.find(e=>e.branch===n);if(s)throw Error(`Branch "${n}" is already used by worktree at "${s.path}".\nChoose a different branch name, or switch that worktree to another branch first.`);let f=c||o(a,n);if(r(f)&&!m)throw Error(`Path "${f}" already exists. Use --force to override or specify a different path with --path`);let _=[`worktree`,`add`];m&&_.push(`--force`),h&&_.push(`--detach`),_.push(f,n);let v=await t(`git`,_,{cwd:a,throwOnError:!1});if(!v.success)throw new e(`git worktree add ${f} ${n}`,v.stderr);return{success:!0,message:`Created worktree at ${f} for branch ${n}`,details:{path:f,branch:n}}}case`remove`:{let n=await l(a),i;if(g){if(n.length===0)throw Error(`No worktrees found`);let e=p&&f(p,n)||c||null,t=e===null?0:Math.max(0,n.findIndex(t=>t.path===e));i=(await d(`Select worktree to remove:`,n.map(e=>({label:`${e.branch||`detached`} — ${e.path}`,value:e})),t)).path}else if(p){let e=f(p,n);if(!e)throw Error(`Could not find worktree matching "${p}". Use --list to see available worktrees.`);i=e}else if(c){if(!r(c))throw Error(`Path "${c}" does not exist. Use --branch (-b) to remove by name, or --list to see available worktrees.`);i=c}else throw Error(`--branch (-b) or --path (-p) is required for remove action.`);let o=[`worktree`,`remove`];m&&o.push(`--force`),o.push(i);let s=await t(`git`,o,{cwd:a,throwOnError:!1});if(!s.success)throw new e(`git worktree remove ${i}`,s.stderr);return{success:!0,message:`Removed worktree at ${i}`,details:{path:i}}}case`prune`:{let n=await t(`git`,[`worktree`,`prune`],{cwd:a,throwOnError:!1});if(!n.success)throw new e(`git worktree prune`,n.stderr);return{success:!0,message:`Pruned stale worktrees`,details:{output:n.stdout}}}default:throw Error(`Unknown worktree action: ${s}`)}}export{p as t};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "xling",
3
- "version": "0.7.2",
3
+ "version": "0.7.3",
4
4
  "description": "Unified CLI for managing AI tool settings",
5
5
  "homepage": "https://github.com/kingsword09/xling/tree/main#readme",
6
6
  "bugs": {
@@ -72,4 +72,4 @@
72
72
  "smol-toml": "^1.4.2",
73
73
  "zod": "^4.1.12"
74
74
  }
75
- }
75
+ }
@@ -1,4 +0,0 @@
1
- import{o as e}from"./errors-pXKbCKbL.js";import{r as t}from"./runner-DYk4q6mP.js";import n from"node:path";import{existsSync as r}from"node:fs";function i(e){return n.basename(e)}function a(e,t){let r=i(e),a=t.replace(/\//g,`-`);return n.join(e,`..`,`${r}-${a}`)}function o(e,t){t.path&&e.push({path:t.path,branch:t.branch,head:t.head})}function s(e){let t=[],n=e.trim().split(`
2
- `),r={};for(let e of n)e.startsWith(`worktree `)?(o(t,r),r={path:e.substring(9)}):e.startsWith(`HEAD `)?r.head=e.substring(5):e.startsWith(`branch `)?r.branch=e.substring(7).replace(`refs/heads/`,``):e===``&&(o(t,r),r={});return o(t,r),t}async function c(e,r){let i=await t(`git`,[`worktree`,`list`,`--porcelain`],{cwd:r,throwOnError:!1});if(!i.success)return null;let a=s(i.stdout),o=a.find(t=>t.branch===e);if(o)return o.path;let c=a.find(t=>{let r=n.basename(t.path);return r===e||r.endsWith(`-${e}`)});if(c)return c.path;let l=a.find(t=>t.path.includes(e));return l?l.path:null}async function l(n,i){let o=i||process.cwd(),{action:l,path:u,branch:d,force:f,detach:p}=n;switch(l){case`list`:{let n=await t(`git`,[`worktree`,`list`,`--porcelain`],{cwd:o,throwOnError:!1});if(!n.success)throw new e(`git worktree list`,n.stderr);let r=s(n.stdout);return{success:!0,message:`Available worktrees:`,details:{output:r.map((e,t)=>` [${t+1}] ${e.path}\n Branch: ${e.branch||`detached`}`).join(`
3
-
4
- `),worktrees:r}}}case`switch`:{let n=await t(`git`,[`worktree`,`list`,`--porcelain`],{cwd:o,throwOnError:!1});if(!n.success)throw new e(`git worktree list`,n.stderr);if(s(n.stdout).length===0)throw Error(`No worktrees found`);let r=d||`main`,i=await c(r,o);if(!i)throw Error(`Could not find worktree matching "${r}". Use --list to see available worktrees.`);return{success:!0,message:i,details:{path:i,branch:r}}}case`add`:{let n=d||`main`,i=await t(`git`,[`worktree`,`list`,`--porcelain`],{cwd:o,throwOnError:!1});if(i.success){let e=s(i.stdout).find(e=>e.branch===n);if(e)throw Error(`Branch "${n}" is already used by worktree at "${e.path}".\nChoose a different branch name, or switch that worktree to another branch first.`)}let c=u||a(o,n);if(r(c)&&!f)throw Error(`Path "${c}" already exists. Use --force to override or specify a different path with --path`);let l=[`worktree`,`add`];f&&l.push(`--force`),p&&l.push(`--detach`),l.push(c,n);let m=await t(`git`,l,{cwd:o,throwOnError:!1});if(!m.success)throw new e(`git worktree add ${c} ${n}`,m.stderr);return{success:!0,message:`Created worktree at ${c} for branch ${n}`,details:{path:c,branch:n}}}case`remove`:{let n;if(d){let e=await c(d,o);if(!e)throw Error(`Could not find worktree matching "${d}". Use --list to see available worktrees.`);n=e}else if(u){if(!r(u))throw Error(`Path "${u}" does not exist. Use --branch (-b) to remove by name, or --list to see available worktrees.`);n=u}else throw Error(`--branch (-b) or --path (-p) is required for remove action.`);let i=[`worktree`,`remove`];f&&i.push(`--force`),i.push(n);let a=await t(`git`,i,{cwd:o,throwOnError:!1});if(!a.success)throw new e(`git worktree remove ${n}`,a.stderr);return{success:!0,message:`Removed worktree at ${n}`,details:{path:n}}}case`prune`:{let n=await t(`git`,[`worktree`,`prune`],{cwd:o,throwOnError:!1});if(!n.success)throw new e(`git worktree prune`,n.stderr);return{success:!0,message:`Pruned stale worktrees`,details:{output:n.stdout}}}default:throw Error(`Unknown worktree action: ${l}`)}}export{l as t};