@tokenbooks/wt 0.1.0 → 0.1.1
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/README.md +22 -0
- package/dist/cli.js +13 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/new.d.ts +11 -0
- package/dist/commands/new.js +76 -81
- package/dist/commands/new.js.map +1 -1
- package/dist/commands/open.d.ts +7 -0
- package/dist/commands/open.js +77 -0
- package/dist/commands/open.js.map +1 -0
- package/package.json +1 -1
- package/skills/wt/SKILL.md +15 -1
package/README.md
CHANGED
|
@@ -98,6 +98,10 @@ echo ".worktree-registry.json" >> .gitignore
|
|
|
98
98
|
# Create a worktree with full isolation
|
|
99
99
|
wt new feat/my-feature
|
|
100
100
|
|
|
101
|
+
# Jump into a worktree by slot or branch
|
|
102
|
+
cd $(wt open 1)
|
|
103
|
+
cd $(wt open feat/my-feature)
|
|
104
|
+
|
|
101
105
|
# List all worktree allocations
|
|
102
106
|
wt list
|
|
103
107
|
|
|
@@ -131,6 +135,24 @@ Creates a new git worktree and sets up its isolated environment:
|
|
|
131
135
|
4. Copies all configured `.env` files, patching each with slot-specific values
|
|
132
136
|
5. Runs `postSetup` commands (unless `--no-install`)
|
|
133
137
|
|
|
138
|
+
### `wt open <slot-or-branch> [--no-install] [--json]`
|
|
139
|
+
|
|
140
|
+
Opens an existing worktree or creates one on the fly. Prints the worktree path to stdout for easy shell integration:
|
|
141
|
+
|
|
142
|
+
```bash
|
|
143
|
+
cd $(wt open 1) # by slot number
|
|
144
|
+
cd $(wt open feat/my-feature) # by branch name (creates if not found)
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
- **Slot number**: Looks up the allocation and prints its path. Exits 1 if the slot is empty.
|
|
148
|
+
- **Branch name**: Scans allocations for a matching branch. If not found, creates a new worktree (like `wt new`).
|
|
149
|
+
|
|
150
|
+
Shell helper tip:
|
|
151
|
+
|
|
152
|
+
```bash
|
|
153
|
+
wto() { cd "$(wt open "$@")"; }
|
|
154
|
+
```
|
|
155
|
+
|
|
134
156
|
### `wt setup [path] [--no-install] [--json]`
|
|
135
157
|
|
|
136
158
|
Sets up an existing worktree that was created manually or by another tool. Useful when:
|
package/dist/cli.js
CHANGED
|
@@ -7,6 +7,7 @@ const setup_1 = require("./commands/setup");
|
|
|
7
7
|
const remove_1 = require("./commands/remove");
|
|
8
8
|
const list_1 = require("./commands/list");
|
|
9
9
|
const doctor_1 = require("./commands/doctor");
|
|
10
|
+
const open_1 = require("./commands/open");
|
|
10
11
|
const git_1 = require("./core/git");
|
|
11
12
|
const program = new commander_1.Command();
|
|
12
13
|
program
|
|
@@ -39,6 +40,18 @@ program
|
|
|
39
40
|
install: opts.install,
|
|
40
41
|
});
|
|
41
42
|
});
|
|
43
|
+
program
|
|
44
|
+
.command('open')
|
|
45
|
+
.description('Open a worktree by slot or branch (creates if not found)')
|
|
46
|
+
.argument('<slot-or-branch>', 'Slot number or branch name')
|
|
47
|
+
.option('--no-install', 'Skip post-setup commands if creating')
|
|
48
|
+
.option('--json', 'Output as JSON', false)
|
|
49
|
+
.action(async (slotOrBranch, opts) => {
|
|
50
|
+
await (0, open_1.openCommand)(slotOrBranch, {
|
|
51
|
+
json: opts.json,
|
|
52
|
+
install: opts.install,
|
|
53
|
+
});
|
|
54
|
+
});
|
|
42
55
|
program
|
|
43
56
|
.command('remove')
|
|
44
57
|
.description('Remove a worktree and clean up its resources')
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;AAEA,yCAAoC;AACpC,wCAA4C;AAC5C,4CAAgD;AAChD,8CAAkD;AAClD,0CAA8C;AAC9C,8CAAkD;AAClD,oCAAiD;AAEjD,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,IAAI,CAAC;KACV,WAAW,CAAC,wCAAwC,CAAC;KACrD,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO;KACJ,OAAO,CAAC,KAAK,CAAC;KACd,WAAW,CAAC,iDAAiD,CAAC;KAC9D,QAAQ,CAAC,UAAU,EAAE,mCAAmC,CAAC;KACzD,MAAM,CAAC,YAAY,EAAE,8BAA8B,CAAC;KACpD,MAAM,CAAC,cAAc,EAAE,0BAA0B,CAAC;KAClD,MAAM,CAAC,QAAQ,EAAE,gBAAgB,EAAE,KAAK,CAAC;KACzC,MAAM,CAAC,KAAK,EAAE,MAAc,EAAE,IAAI,EAAE,EAAE;IACrC,MAAM,IAAA,gBAAU,EAAC,MAAM,EAAE;QACvB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,IAAI,EAAE,IAAI,CAAC,IAAI;KAChB,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,6CAA6C,CAAC;KAC1D,QAAQ,CAAC,QAAQ,EAAE,4CAA4C,CAAC;KAChE,MAAM,CAAC,cAAc,EAAE,0BAA0B,CAAC;KAClD,MAAM,CAAC,QAAQ,EAAE,gBAAgB,EAAE,KAAK,CAAC;KACzC,MAAM,CAAC,KAAK,EAAE,UAA8B,EAAE,IAAI,EAAE,EAAE;IACrD,MAAM,IAAA,oBAAY,EAAC,UAAU,EAAE;QAC7B,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,OAAO,EAAE,IAAI,CAAC,OAAO;KACtB,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,8CAA8C,CAAC;KAC3D,QAAQ,CAAC,gBAAgB,EAAE,8BAA8B,CAAC;KAC1D,MAAM,CAAC,WAAW,EAAE,iCAAiC,EAAE,KAAK,CAAC;KAC7D,MAAM,CAAC,QAAQ,EAAE,gBAAgB,EAAE,KAAK,CAAC;KACzC,MAAM,CAAC,KAAK,EAAE,UAAkB,EAAE,IAAI,EAAE,EAAE;IACzC,MAAM,IAAA,sBAAa,EAAC,UAAU,EAAE;QAC9B,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,MAAM,EAAE,IAAI,CAAC,MAAM;KACpB,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,+BAA+B,CAAC;KAC5C,MAAM,CAAC,QAAQ,EAAE,gBAAgB,EAAE,KAAK,CAAC;KACzC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;IACf,MAAM,QAAQ,GAAG,IAAA,yBAAmB,GAAE,CAAC;IACvC,IAAA,kBAAW,EAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;AAC7C,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,8CAA8C,CAAC;KAC3D,MAAM,CAAC,OAAO,EAAE,kDAAkD,EAAE,KAAK,CAAC;KAC1E,MAAM,CAAC,QAAQ,EAAE,gBAAgB,EAAE,KAAK,CAAC;KACzC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;IACrB,MAAM,IAAA,sBAAa,EAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;AAC1D,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,KAAK,EAAE,CAAC"}
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/new.d.ts
CHANGED
|
@@ -1,8 +1,19 @@
|
|
|
1
|
+
import type { Allocation } from '../types';
|
|
1
2
|
interface NewOptions {
|
|
2
3
|
readonly json: boolean;
|
|
3
4
|
readonly install: boolean;
|
|
4
5
|
readonly slot?: string;
|
|
5
6
|
}
|
|
7
|
+
export interface CreateWorktreeResult {
|
|
8
|
+
slot: number;
|
|
9
|
+
allocation: Allocation;
|
|
10
|
+
}
|
|
11
|
+
/** Core worktree creation logic — returns the result for programmatic use */
|
|
12
|
+
export declare function createNewWorktree(branchName: string, options: {
|
|
13
|
+
install: boolean;
|
|
14
|
+
slot?: string;
|
|
15
|
+
quiet?: boolean;
|
|
16
|
+
}): Promise<CreateWorktreeResult>;
|
|
6
17
|
/** Create a new worktree with full environment isolation */
|
|
7
18
|
export declare function newCommand(branchName: string, options: NewOptions): Promise<void>;
|
|
8
19
|
export {};
|
package/dist/commands/new.js
CHANGED
|
@@ -33,6 +33,7 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.createNewWorktree = createNewWorktree;
|
|
36
37
|
exports.newCommand = newCommand;
|
|
37
38
|
const path = __importStar(require("node:path"));
|
|
38
39
|
const registry_1 = require("../core/registry");
|
|
@@ -54,91 +55,85 @@ function readDatabaseUrl(mainRoot) {
|
|
|
54
55
|
}
|
|
55
56
|
return match[1];
|
|
56
57
|
}
|
|
57
|
-
/**
|
|
58
|
-
async function
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
}
|
|
72
|
-
else {
|
|
73
|
-
console.error(msg);
|
|
74
|
-
}
|
|
75
|
-
process.exitCode = 1;
|
|
76
|
-
return;
|
|
77
|
-
}
|
|
78
|
-
if (String(slot) in registry.allocations) {
|
|
79
|
-
const msg = `Slot ${slot} is already occupied.`;
|
|
80
|
-
if (options.json) {
|
|
81
|
-
console.log((0, output_1.formatJson)((0, output_1.error)('SLOT_OCCUPIED', msg)));
|
|
82
|
-
}
|
|
83
|
-
else {
|
|
84
|
-
console.error(msg);
|
|
85
|
-
}
|
|
86
|
-
process.exitCode = 1;
|
|
87
|
-
return;
|
|
88
|
-
}
|
|
58
|
+
/** Core worktree creation logic — returns the result for programmatic use */
|
|
59
|
+
async function createNewWorktree(branchName, options) {
|
|
60
|
+
const log = options.quiet
|
|
61
|
+
? () => { }
|
|
62
|
+
: (msg) => process.stderr.write(`${msg}\n`);
|
|
63
|
+
const mainRoot = (0, git_1.getMainWorktreePath)();
|
|
64
|
+
const config = (0, setup_1.loadConfig)(mainRoot);
|
|
65
|
+
let registry = (0, registry_1.readRegistry)(mainRoot);
|
|
66
|
+
// Determine slot
|
|
67
|
+
let slot;
|
|
68
|
+
if (options.slot !== undefined) {
|
|
69
|
+
slot = parseInt(options.slot, 10);
|
|
70
|
+
if (isNaN(slot) || slot < 1 || slot > config.maxSlots) {
|
|
71
|
+
throw new Error(`Invalid slot: ${options.slot}. Must be 1-${config.maxSlots}.`);
|
|
89
72
|
}
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
if (available === null) {
|
|
93
|
-
const msg = `All ${config.maxSlots} slots are occupied. Remove a worktree first.`;
|
|
94
|
-
if (options.json) {
|
|
95
|
-
console.log((0, output_1.formatJson)((0, output_1.error)('NO_SLOTS', msg)));
|
|
96
|
-
}
|
|
97
|
-
else {
|
|
98
|
-
console.error(msg);
|
|
99
|
-
}
|
|
100
|
-
process.exitCode = 1;
|
|
101
|
-
return;
|
|
102
|
-
}
|
|
103
|
-
slot = available;
|
|
73
|
+
if (String(slot) in registry.allocations) {
|
|
74
|
+
throw new Error(`Slot ${slot} is already occupied.`);
|
|
104
75
|
}
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
const
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
const dbName = (0, slot_allocator_1.calculateDbName)(slot, config.baseDatabaseName);
|
|
111
|
-
const ports = (0, slot_allocator_1.calculatePorts)(slot, config.services, config.portStride);
|
|
112
|
-
// Create database
|
|
113
|
-
const databaseUrl = readDatabaseUrl(mainRoot);
|
|
114
|
-
const dbAlreadyExists = await (0, database_1.databaseExists)(databaseUrl, dbName);
|
|
115
|
-
if (!dbAlreadyExists) {
|
|
116
|
-
await (0, database_1.createDatabase)(databaseUrl, config.baseDatabaseName, dbName);
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
const available = (0, slot_allocator_1.findAvailableSlot)(registry, config.maxSlots);
|
|
79
|
+
if (available === null) {
|
|
80
|
+
throw new Error(`All ${config.maxSlots} slots are occupied. Remove a worktree first.`);
|
|
117
81
|
}
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
};
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
82
|
+
slot = available;
|
|
83
|
+
}
|
|
84
|
+
log(`Creating worktree for '${branchName}' in slot ${slot}...`);
|
|
85
|
+
// Create worktree
|
|
86
|
+
const basePath = path.join(mainRoot, config.baseWorktreePath);
|
|
87
|
+
const worktreePath = (0, git_1.createWorktree)(basePath, branchName);
|
|
88
|
+
const actualBranch = (0, git_1.getBranchName)(worktreePath);
|
|
89
|
+
// Compute isolation params
|
|
90
|
+
const dbName = (0, slot_allocator_1.calculateDbName)(slot, config.baseDatabaseName);
|
|
91
|
+
const ports = (0, slot_allocator_1.calculatePorts)(slot, config.services, config.portStride);
|
|
92
|
+
// Create database
|
|
93
|
+
const databaseUrl = readDatabaseUrl(mainRoot);
|
|
94
|
+
const dbAlreadyExists = await (0, database_1.databaseExists)(databaseUrl, dbName);
|
|
95
|
+
if (!dbAlreadyExists) {
|
|
96
|
+
log(`Creating database '${dbName}'...`);
|
|
97
|
+
await (0, database_1.createDatabase)(databaseUrl, config.baseDatabaseName, dbName);
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
log(`Database '${dbName}' already exists, reusing.`);
|
|
101
|
+
}
|
|
102
|
+
// Copy and patch env files
|
|
103
|
+
log(`Patching ${config.envFiles.length} env file(s)...`);
|
|
104
|
+
(0, env_patcher_1.copyAndPatchAllEnvFiles)(config, mainRoot, worktreePath, {
|
|
105
|
+
dbName,
|
|
106
|
+
redisDb: slot,
|
|
107
|
+
ports,
|
|
108
|
+
});
|
|
109
|
+
// Update registry
|
|
110
|
+
const allocation = {
|
|
111
|
+
worktreePath,
|
|
112
|
+
branchName: actualBranch,
|
|
113
|
+
dbName,
|
|
114
|
+
redisDb: slot,
|
|
115
|
+
ports,
|
|
116
|
+
createdAt: new Date().toISOString(),
|
|
117
|
+
};
|
|
118
|
+
registry = (0, registry_1.addAllocation)(registry, slot, allocation);
|
|
119
|
+
(0, registry_1.writeRegistry)(mainRoot, registry);
|
|
120
|
+
// Run post-setup commands
|
|
121
|
+
if (config.autoInstall && options.install && config.postSetup.length > 0) {
|
|
122
|
+
for (const cmd of config.postSetup) {
|
|
123
|
+
log(`Running: ${cmd}`);
|
|
124
|
+
(0, node_child_process_1.execSync)(cmd, { cwd: worktreePath, stdio: 'inherit' });
|
|
141
125
|
}
|
|
126
|
+
}
|
|
127
|
+
log(`Ready — slot ${slot}, branch '${actualBranch}'.`);
|
|
128
|
+
return { slot, allocation };
|
|
129
|
+
}
|
|
130
|
+
/** Create a new worktree with full environment isolation */
|
|
131
|
+
async function newCommand(branchName, options) {
|
|
132
|
+
try {
|
|
133
|
+
const { slot, allocation } = await createNewWorktree(branchName, {
|
|
134
|
+
...options,
|
|
135
|
+
quiet: options.json,
|
|
136
|
+
});
|
|
142
137
|
if (options.json) {
|
|
143
138
|
console.log((0, output_1.formatJson)((0, output_1.success)({ slot, ...allocation })));
|
|
144
139
|
}
|
package/dist/commands/new.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"new.js","sourceRoot":"","sources":["../../src/commands/new.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"new.js","sourceRoot":"","sources":["../../src/commands/new.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoCA,8CAiFC;AAGD,gCAwBC;AAhJD,gDAAkC;AAElC,+CAA8E;AAC9E,2DAA4F;AAC5F,qDAA8D;AAC9D,+CAAkE;AAClE,qCAAiF;AACjF,sCAA2E;AAC3E,mCAAqC;AAErC,2DAA8C;AAC9C,4CAA8B;AAa9B,2DAA2D;AAC3D,SAAS,eAAe,CAAC,QAAgB;IACvC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC5C,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAClD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;IAC9D,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;IACpD,CAAC;IACD,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,6EAA6E;AACtE,KAAK,UAAU,iBAAiB,CACrC,UAAkB,EAClB,OAA6D;IAE7D,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK;QACvB,CAAC,CAAC,GAAG,EAAE,GAAE,CAAC;QACV,CAAC,CAAC,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;IAEtD,MAAM,QAAQ,GAAG,IAAA,yBAAmB,GAAE,CAAC;IACvC,MAAM,MAAM,GAAG,IAAA,kBAAU,EAAC,QAAQ,CAAC,CAAC;IACpC,IAAI,QAAQ,GAAG,IAAA,uBAAY,EAAC,QAAQ,CAAC,CAAC;IAEtC,iBAAiB;IACjB,IAAI,IAAY,CAAC;IACjB,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC/B,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAClC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;YACtD,MAAM,IAAI,KAAK,CAAC,iBAAiB,OAAO,CAAC,IAAI,eAAe,MAAM,CAAC,QAAQ,GAAG,CAAC,CAAC;QAClF,CAAC;QACD,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,WAAW,EAAE,CAAC;YACzC,MAAM,IAAI,KAAK,CAAC,QAAQ,IAAI,uBAAuB,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,SAAS,GAAG,IAAA,kCAAiB,EAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC/D,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,OAAO,MAAM,CAAC,QAAQ,+CAA+C,CAAC,CAAC;QACzF,CAAC;QACD,IAAI,GAAG,SAAS,CAAC;IACnB,CAAC;IAED,GAAG,CAAC,0BAA0B,UAAU,aAAa,IAAI,KAAK,CAAC,CAAC;IAEhE,kBAAkB;IAClB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,gBAAgB,CAAC,CAAC;IAC9D,MAAM,YAAY,GAAG,IAAA,oBAAc,EAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IAC1D,MAAM,YAAY,GAAG,IAAA,mBAAa,EAAC,YAAY,CAAC,CAAC;IAEjD,2BAA2B;IAC3B,MAAM,MAAM,GAAG,IAAA,gCAAe,EAAC,IAAI,EAAE,MAAM,CAAC,gBAAgB,CAAC,CAAC;IAC9D,MAAM,KAAK,GAAG,IAAA,+BAAc,EAAC,IAAI,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;IAEvE,kBAAkB;IAClB,MAAM,WAAW,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;IAC9C,MAAM,eAAe,GAAG,MAAM,IAAA,yBAAc,EAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAClE,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,GAAG,CAAC,sBAAsB,MAAM,MAAM,CAAC,CAAC;QACxC,MAAM,IAAA,yBAAc,EAAC,WAAW,EAAE,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;IACrE,CAAC;SAAM,CAAC;QACN,GAAG,CAAC,aAAa,MAAM,4BAA4B,CAAC,CAAC;IACvD,CAAC;IAED,2BAA2B;IAC3B,GAAG,CAAC,YAAY,MAAM,CAAC,QAAQ,CAAC,MAAM,iBAAiB,CAAC,CAAC;IACzD,IAAA,qCAAuB,EAAC,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE;QACtD,MAAM;QACN,OAAO,EAAE,IAAI;QACb,KAAK;KACN,CAAC,CAAC;IAEH,kBAAkB;IAClB,MAAM,UAAU,GAAe;QAC7B,YAAY;QACZ,UAAU,EAAE,YAAY;QACxB,MAAM;QACN,OAAO,EAAE,IAAI;QACb,KAAK;QACL,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC;IACF,QAAQ,GAAG,IAAA,wBAAa,EAAC,QAAQ,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;IACrD,IAAA,wBAAa,EAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAElC,0BAA0B;IAC1B,IAAI,MAAM,CAAC,WAAW,IAAI,OAAO,CAAC,OAAO,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzE,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACnC,GAAG,CAAC,YAAY,GAAG,EAAE,CAAC,CAAC;YACvB,IAAA,6BAAQ,EAAC,GAAG,EAAE,EAAE,GAAG,EAAE,YAAY,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;IAED,GAAG,CAAC,gBAAgB,IAAI,aAAa,YAAY,IAAI,CAAC,CAAC;IACvD,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;AAC9B,CAAC;AAED,4DAA4D;AACrD,KAAK,UAAU,UAAU,CAC9B,UAAkB,EAClB,OAAmB;IAEnB,IAAI,CAAC;QACH,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,MAAM,iBAAiB,CAAC,UAAU,EAAE;YAC/D,GAAG,OAAO;YACV,KAAK,EAAE,OAAO,CAAC,IAAI;SACpB,CAAC,CAAC;QAEH,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,IAAA,mBAAU,EAAC,IAAA,gBAAO,EAAC,EAAE,IAAI,EAAE,GAAG,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC;QAC5D,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,IAAA,2BAAkB,EAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,IAAA,mBAAU,EAAC,IAAA,cAAK,EAAC,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;QACxD,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,8BAA8B,OAAO,EAAE,CAAC,CAAC;QACzD,CAAC;QACD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.openCommand = openCommand;
|
|
4
|
+
const registry_1 = require("../core/registry");
|
|
5
|
+
const git_1 = require("../core/git");
|
|
6
|
+
const new_1 = require("./new");
|
|
7
|
+
const output_1 = require("../output");
|
|
8
|
+
/** Open (or create) a worktree and print its path */
|
|
9
|
+
async function openCommand(slotOrBranch, options) {
|
|
10
|
+
const log = options.json
|
|
11
|
+
? () => { }
|
|
12
|
+
: (msg) => process.stderr.write(`${msg}\n`);
|
|
13
|
+
try {
|
|
14
|
+
const mainRoot = (0, git_1.getMainWorktreePath)();
|
|
15
|
+
const registry = (0, registry_1.readRegistry)(mainRoot);
|
|
16
|
+
const asSlot = parseInt(slotOrBranch, 10);
|
|
17
|
+
if (!isNaN(asSlot) && String(asSlot) === slotOrBranch) {
|
|
18
|
+
// Slot lookup
|
|
19
|
+
const allocation = registry.allocations[String(asSlot)];
|
|
20
|
+
if (!allocation) {
|
|
21
|
+
if (options.json) {
|
|
22
|
+
console.log((0, output_1.formatJson)((0, output_1.error)('NOT_FOUND', `No allocation found for slot ${asSlot}.`)));
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
console.error(`No allocation found for slot ${asSlot}.\n`);
|
|
26
|
+
console.error((0, output_1.formatAllocationTable)(registry.allocations));
|
|
27
|
+
}
|
|
28
|
+
process.exitCode = 1;
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
log(`Opening slot ${asSlot} (${allocation.branchName})`);
|
|
32
|
+
if (options.json) {
|
|
33
|
+
console.log((0, output_1.formatJson)((0, output_1.success)({ slot: asSlot, ...allocation })));
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
console.log(allocation.worktreePath);
|
|
37
|
+
}
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
// Branch lookup
|
|
41
|
+
for (const [slotStr, allocation] of Object.entries(registry.allocations)) {
|
|
42
|
+
if (allocation.branchName === slotOrBranch) {
|
|
43
|
+
log(`Opening slot ${slotStr} (${allocation.branchName})`);
|
|
44
|
+
if (options.json) {
|
|
45
|
+
console.log((0, output_1.formatJson)((0, output_1.success)({ slot: Number(slotStr), ...allocation })));
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
console.log(allocation.worktreePath);
|
|
49
|
+
}
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
// Not found — create a new worktree
|
|
54
|
+
log(`Branch '${slotOrBranch}' not found in registry, creating...`);
|
|
55
|
+
const { slot, allocation } = await (0, new_1.createNewWorktree)(slotOrBranch, {
|
|
56
|
+
install: options.install,
|
|
57
|
+
quiet: options.json,
|
|
58
|
+
});
|
|
59
|
+
if (options.json) {
|
|
60
|
+
console.log((0, output_1.formatJson)((0, output_1.success)({ slot, ...allocation })));
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
console.log(allocation.worktreePath);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
catch (err) {
|
|
67
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
68
|
+
if (options.json) {
|
|
69
|
+
console.log((0, output_1.formatJson)((0, output_1.error)('OPEN_FAILED', message)));
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
console.error(`Failed to open worktree: ${message}`);
|
|
73
|
+
}
|
|
74
|
+
process.exitCode = 1;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=open.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"open.js","sourceRoot":"","sources":["../../src/commands/open.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/skills/wt/SKILL.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: wt
|
|
3
3
|
description: Manage git worktree isolation — create, list, remove worktrees with isolated databases, Redis, and ports
|
|
4
|
-
argument-hint: "[new|list|remove|doctor|setup|init] [args...]"
|
|
4
|
+
argument-hint: "[new|open|list|remove|doctor|setup|init] [args...]"
|
|
5
5
|
allowed-tools: Bash, Read, Write, Edit, Grep, Glob
|
|
6
6
|
---
|
|
7
7
|
|
|
@@ -136,6 +136,19 @@ Present the results to the user.
|
|
|
136
136
|
|
|
137
137
|
---
|
|
138
138
|
|
|
139
|
+
### `open $1` — Open (or create) a worktree
|
|
140
|
+
|
|
141
|
+
Run:
|
|
142
|
+
```bash
|
|
143
|
+
wt open $1
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
Accepts a slot number (`1`) or branch name (`feat/auth`). If a branch isn't found in the registry, it creates a new worktree automatically.
|
|
147
|
+
|
|
148
|
+
Tip: use `cd $(wt open $1)` to jump into the worktree directory.
|
|
149
|
+
|
|
150
|
+
---
|
|
151
|
+
|
|
139
152
|
### `new $1` — Create a new worktree
|
|
140
153
|
|
|
141
154
|
Run:
|
|
@@ -204,6 +217,7 @@ Show a brief help:
|
|
|
204
217
|
Available commands:
|
|
205
218
|
/wt init — Set up wt in a new repository (discovers env files, generates config)
|
|
206
219
|
/wt new <branch> — Create a worktree with isolated DB, Redis, and ports
|
|
220
|
+
/wt open <slot|branch> — Open a worktree by slot or branch (creates if not found)
|
|
207
221
|
/wt list — List all worktree allocations
|
|
208
222
|
/wt remove <target> — Remove a worktree and clean up resources
|
|
209
223
|
/wt doctor — Diagnose and fix environment issues
|