@tokenbooks/wt 0.1.4 → 0.2.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 +7 -2
- package/dist/cli.js +21 -4
- package/dist/cli.js.map +1 -1
- package/dist/commands/new.js +2 -2
- package/dist/commands/new.js.map +1 -1
- package/dist/commands/remove.d.ts +12 -2
- package/dist/commands/remove.js +157 -42
- package/dist/commands/remove.js.map +1 -1
- package/dist/commands/remove.spec.d.ts +1 -0
- package/dist/commands/remove.spec.js +22 -0
- package/dist/commands/remove.spec.js.map +1 -0
- package/dist/core/database.d.ts +4 -2
- package/dist/core/database.js +26 -6
- package/dist/core/database.js.map +1 -1
- package/dist/core/env-patcher.js +17 -3
- package/dist/core/env-patcher.js.map +1 -1
- package/dist/core/git.d.ts +4 -2
- package/dist/core/git.js +8 -4
- package/dist/core/git.js.map +1 -1
- package/dist/core/update-check.d.ts +16 -0
- package/dist/core/update-check.js +131 -0
- package/dist/core/update-check.js.map +1 -0
- package/package.json +1 -1
- package/skills/wt/SKILL.md +8 -4
package/README.md
CHANGED
|
@@ -163,7 +163,7 @@ Sets up an existing worktree that was created manually or by another tool. Usefu
|
|
|
163
163
|
|
|
164
164
|
If the worktree already has a slot allocation, it reuses it.
|
|
165
165
|
|
|
166
|
-
### `wt remove <
|
|
166
|
+
### `wt remove <targets...> [--all] [--keep-db] [--json]`
|
|
167
167
|
|
|
168
168
|
Removes a worktree and cleans up its resources:
|
|
169
169
|
|
|
@@ -171,7 +171,12 @@ Removes a worktree and cleans up its resources:
|
|
|
171
171
|
2. Runs `git worktree remove`
|
|
172
172
|
3. Removes the allocation from the registry
|
|
173
173
|
|
|
174
|
-
Accepts either
|
|
174
|
+
Accepts either paths (`.worktrees/feat-my-feature`) or slot numbers (`3`), including batch formats:
|
|
175
|
+
|
|
176
|
+
- `wt remove 1 2`
|
|
177
|
+
- `wt remove 1,2`
|
|
178
|
+
- `wt remove "1, 2"`
|
|
179
|
+
- `wt remove --all`
|
|
175
180
|
|
|
176
181
|
### `wt list [--json]`
|
|
177
182
|
|
package/dist/cli.js
CHANGED
|
@@ -10,6 +10,7 @@ const doctor_1 = require("./commands/doctor");
|
|
|
10
10
|
const open_1 = require("./commands/open");
|
|
11
11
|
const git_1 = require("./core/git");
|
|
12
12
|
const package_json_1 = require("../package.json");
|
|
13
|
+
const update_check_1 = require("./core/update-check");
|
|
13
14
|
const program = new commander_1.Command();
|
|
14
15
|
program
|
|
15
16
|
.name('wt')
|
|
@@ -55,14 +56,26 @@ program
|
|
|
55
56
|
});
|
|
56
57
|
program
|
|
57
58
|
.command('remove')
|
|
58
|
-
.description('Remove
|
|
59
|
-
.argument('
|
|
59
|
+
.description('Remove worktree(s) by target list, CSV slots, or --all')
|
|
60
|
+
.argument('[targets...]', 'Worktree path(s) or slot number(s); supports comma-separated values')
|
|
61
|
+
.option('--all', 'Remove all registered worktrees', false)
|
|
60
62
|
.option('--keep-db', 'Keep the database (do not drop)', false)
|
|
61
63
|
.option('--json', 'Output as JSON', false)
|
|
62
|
-
.
|
|
63
|
-
|
|
64
|
+
.addHelpText('after', [
|
|
65
|
+
'',
|
|
66
|
+
'Examples:',
|
|
67
|
+
' wt remove 1',
|
|
68
|
+
' wt remove 1,2',
|
|
69
|
+
' wt remove "1, 2"',
|
|
70
|
+
' wt remove .worktrees/feat-auth',
|
|
71
|
+
' wt remove --all',
|
|
72
|
+
'',
|
|
73
|
+
].join('\n'))
|
|
74
|
+
.action(async (targets, opts) => {
|
|
75
|
+
await (0, remove_1.removeCommand)(targets ?? [], {
|
|
64
76
|
json: opts.json,
|
|
65
77
|
keepDb: opts.keepDb,
|
|
78
|
+
all: opts.all,
|
|
66
79
|
});
|
|
67
80
|
});
|
|
68
81
|
program
|
|
@@ -82,4 +95,8 @@ program
|
|
|
82
95
|
await (0, doctor_1.doctorCommand)({ json: opts.json, fix: opts.fix });
|
|
83
96
|
});
|
|
84
97
|
program.parse();
|
|
98
|
+
process.stderr.write((0, update_check_1.getUpdateNotice)(package_json_1.version) + '\n');
|
|
99
|
+
if (!(0, update_check_1.isCacheFresh)()) {
|
|
100
|
+
(0, update_check_1.refreshUpdateCache)(package_json_1.name);
|
|
101
|
+
}
|
|
85
102
|
//# sourceMappingURL=cli.js.map
|
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,0CAA8C;AAC9C,oCAAiD;AACjD,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/new.js
CHANGED
|
@@ -84,7 +84,7 @@ async function createNewWorktree(branchName, options) {
|
|
|
84
84
|
log(`Creating worktree for '${branchName}' in slot ${slot}...`);
|
|
85
85
|
// Create worktree
|
|
86
86
|
const basePath = path.join(mainRoot, config.baseWorktreePath);
|
|
87
|
-
const worktreePath = (0, git_1.createWorktree)(basePath, branchName);
|
|
87
|
+
const worktreePath = (0, git_1.createWorktree)(basePath, branchName, (command) => log(`Running: ${command}`));
|
|
88
88
|
const actualBranch = (0, git_1.getBranchName)(worktreePath);
|
|
89
89
|
// Compute isolation params
|
|
90
90
|
const dbName = (0, slot_allocator_1.calculateDbName)(slot, config.baseDatabaseName);
|
|
@@ -94,7 +94,7 @@ async function createNewWorktree(branchName, options) {
|
|
|
94
94
|
const dbAlreadyExists = await (0, database_1.databaseExists)(databaseUrl, dbName);
|
|
95
95
|
if (!dbAlreadyExists) {
|
|
96
96
|
log(`Creating database '${dbName}'...`);
|
|
97
|
-
await (0, database_1.createDatabase)(databaseUrl, config.baseDatabaseName, dbName);
|
|
97
|
+
await (0, database_1.createDatabase)(databaseUrl, config.baseDatabaseName, dbName, (statement) => log(`Running SQL: ${statement}`));
|
|
98
98
|
}
|
|
99
99
|
else {
|
|
100
100
|
log(`Database '${dbName}' already exists, reusing.`);
|
package/dist/commands/new.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"new.js","sourceRoot":"","sources":["../../src/commands/new.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmCA,
|
|
1
|
+
{"version":3,"file":"new.js","sourceRoot":"","sources":["../../src/commands/new.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,17 @@
|
|
|
1
1
|
interface RemoveOptions {
|
|
2
2
|
readonly json: boolean;
|
|
3
3
|
readonly keepDb: boolean;
|
|
4
|
+
readonly all: boolean;
|
|
4
5
|
}
|
|
5
|
-
/**
|
|
6
|
-
|
|
6
|
+
/**
|
|
7
|
+
* Parse raw CLI targets.
|
|
8
|
+
*
|
|
9
|
+
* Supports:
|
|
10
|
+
* - `wt remove 1,2`
|
|
11
|
+
* - `wt remove "1, 2"`
|
|
12
|
+
* - `wt remove 1 2`
|
|
13
|
+
*/
|
|
14
|
+
export declare function parseRemoveTargets(rawTargets: readonly string[]): string[];
|
|
15
|
+
/** Remove one or more worktrees, their databases, and registry entries */
|
|
16
|
+
export declare function removeCommand(rawTargets: readonly string[], options: RemoveOptions): Promise<void>;
|
|
7
17
|
export {};
|
package/dist/commands/remove.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.parseRemoveTargets = parseRemoveTargets;
|
|
36
37
|
exports.removeCommand = removeCommand;
|
|
37
38
|
const path = __importStar(require("node:path"));
|
|
38
39
|
const fs = __importStar(require("node:fs"));
|
|
@@ -51,43 +52,92 @@ function readDatabaseUrl(mainRoot) {
|
|
|
51
52
|
}
|
|
52
53
|
return match[1];
|
|
53
54
|
}
|
|
54
|
-
/**
|
|
55
|
-
|
|
55
|
+
/**
|
|
56
|
+
* Parse raw CLI targets.
|
|
57
|
+
*
|
|
58
|
+
* Supports:
|
|
59
|
+
* - `wt remove 1,2`
|
|
60
|
+
* - `wt remove "1, 2"`
|
|
61
|
+
* - `wt remove 1 2`
|
|
62
|
+
*/
|
|
63
|
+
function parseRemoveTargets(rawTargets) {
|
|
64
|
+
return rawTargets
|
|
65
|
+
.flatMap((rawTarget) => rawTarget.split(','))
|
|
66
|
+
.map((target) => target.trim())
|
|
67
|
+
.filter((target) => target.length > 0);
|
|
68
|
+
}
|
|
69
|
+
function parseSlotTarget(target) {
|
|
70
|
+
if (!/^\d+$/.test(target)) {
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
const slot = Number.parseInt(target, 10);
|
|
74
|
+
return Number.isSafeInteger(slot) ? slot : null;
|
|
75
|
+
}
|
|
76
|
+
function resolveTarget(registry, target) {
|
|
77
|
+
const slot = parseSlotTarget(target);
|
|
78
|
+
if (slot !== null) {
|
|
79
|
+
const allocation = registry.allocations[String(slot)];
|
|
80
|
+
if (!allocation) {
|
|
81
|
+
return { error: `No allocation found for slot ${slot}.` };
|
|
82
|
+
}
|
|
83
|
+
return {
|
|
84
|
+
slot,
|
|
85
|
+
worktreePath: allocation.worktreePath,
|
|
86
|
+
dbName: allocation.dbName,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
const resolvedPath = path.resolve(target);
|
|
90
|
+
const found = (0, registry_1.findByPath)(registry, resolvedPath);
|
|
91
|
+
if (!found) {
|
|
92
|
+
return { error: `No allocation found for path: ${resolvedPath}` };
|
|
93
|
+
}
|
|
94
|
+
return {
|
|
95
|
+
slot: found[0],
|
|
96
|
+
worktreePath: found[1].worktreePath,
|
|
97
|
+
dbName: found[1].dbName,
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
/** Remove one or more worktrees, their databases, and registry entries */
|
|
101
|
+
async function removeCommand(rawTargets, options) {
|
|
102
|
+
const log = options.json
|
|
103
|
+
? () => { }
|
|
104
|
+
: (message) => process.stderr.write(`${message}\n`);
|
|
56
105
|
try {
|
|
57
106
|
const mainRoot = (0, git_1.getMainWorktreePath)();
|
|
58
|
-
const config = (0, setup_1.loadConfig)(mainRoot);
|
|
59
107
|
let registry = (0, registry_1.readRegistry)(mainRoot);
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
108
|
+
const parsedTargets = parseRemoveTargets(rawTargets);
|
|
109
|
+
if (options.all && parsedTargets.length > 0) {
|
|
110
|
+
const msg = 'Use either explicit targets or --all, not both.';
|
|
111
|
+
if (options.json) {
|
|
112
|
+
console.log((0, output_1.formatJson)((0, output_1.error)('INVALID_ARGS', msg)));
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
console.error(msg);
|
|
116
|
+
}
|
|
117
|
+
process.exitCode = 1;
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
let targets;
|
|
121
|
+
if (options.all) {
|
|
122
|
+
targets = Object.keys(registry.allocations).sort((a, b) => Number(a) - Number(b));
|
|
123
|
+
if (targets.length === 0) {
|
|
124
|
+
const empty = { removed: [], failed: [] };
|
|
70
125
|
if (options.json) {
|
|
71
|
-
console.log((0, output_1.formatJson)((0, output_1.
|
|
126
|
+
console.log((0, output_1.formatJson)((0, output_1.success)(empty)));
|
|
72
127
|
}
|
|
73
128
|
else {
|
|
74
|
-
console.
|
|
129
|
+
console.log('No worktree allocations found.');
|
|
75
130
|
}
|
|
76
|
-
process.exitCode = 1;
|
|
77
131
|
return;
|
|
78
132
|
}
|
|
79
|
-
|
|
80
|
-
worktreePath = allocation.worktreePath;
|
|
81
|
-
dbName = allocation.dbName;
|
|
133
|
+
log(`Removing all allocations: ${targets.join(', ')}`);
|
|
82
134
|
}
|
|
83
135
|
else {
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
if (!found) {
|
|
88
|
-
const msg = `No allocation found for path: ${resolved}`;
|
|
136
|
+
targets = parsedTargets;
|
|
137
|
+
if (targets.length === 0) {
|
|
138
|
+
const msg = 'Provide at least one target or use --all.';
|
|
89
139
|
if (options.json) {
|
|
90
|
-
console.log((0, output_1.formatJson)((0, output_1.error)('
|
|
140
|
+
console.log((0, output_1.formatJson)((0, output_1.error)('MISSING_TARGET', msg)));
|
|
91
141
|
}
|
|
92
142
|
else {
|
|
93
143
|
console.error(msg);
|
|
@@ -95,28 +145,93 @@ async function removeCommand(pathOrSlot, options) {
|
|
|
95
145
|
process.exitCode = 1;
|
|
96
146
|
return;
|
|
97
147
|
}
|
|
98
|
-
[slot, { worktreePath, dbName }] = [found[0], found[1]];
|
|
99
148
|
}
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
149
|
+
const dbContext = options.keepDb
|
|
150
|
+
? null
|
|
151
|
+
: {
|
|
152
|
+
databaseUrl: readDatabaseUrl(mainRoot),
|
|
153
|
+
baseDatabaseName: (0, setup_1.loadConfig)(mainRoot).baseDatabaseName,
|
|
154
|
+
};
|
|
155
|
+
const seenSlots = new Set();
|
|
156
|
+
const removed = [];
|
|
157
|
+
const failed = [];
|
|
158
|
+
for (const target of targets) {
|
|
159
|
+
const resolved = resolveTarget(registry, target);
|
|
160
|
+
if ('error' in resolved) {
|
|
161
|
+
failed.push({ target, message: resolved.error });
|
|
162
|
+
continue;
|
|
163
|
+
}
|
|
164
|
+
if (seenSlots.has(resolved.slot)) {
|
|
165
|
+
continue;
|
|
166
|
+
}
|
|
167
|
+
seenSlots.add(resolved.slot);
|
|
168
|
+
try {
|
|
169
|
+
log(`Removing slot ${resolved.slot} (${resolved.worktreePath})`);
|
|
170
|
+
if (dbContext !== null) {
|
|
171
|
+
await (0, database_1.dropDatabase)(dbContext.databaseUrl, resolved.dbName, dbContext.baseDatabaseName, (statement) => log(`Running SQL: ${statement}`));
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
log(`Skipping database drop for '${resolved.dbName}' (--keep-db).`);
|
|
175
|
+
}
|
|
176
|
+
if (fs.existsSync(resolved.worktreePath)) {
|
|
177
|
+
(0, git_1.removeWorktree)(resolved.worktreePath, (command) => log(`Running: ${command}`));
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
log(`Skipping git worktree remove; path not found: ${resolved.worktreePath}`);
|
|
181
|
+
}
|
|
182
|
+
registry = (0, registry_1.removeAllocation)(registry, resolved.slot);
|
|
183
|
+
removed.push({
|
|
184
|
+
target,
|
|
185
|
+
slot: resolved.slot,
|
|
186
|
+
worktreePath: resolved.worktreePath,
|
|
187
|
+
dbName: resolved.dbName,
|
|
188
|
+
dbDropped: !options.keepDb,
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
catch (err) {
|
|
192
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
193
|
+
failed.push({ target, message });
|
|
194
|
+
}
|
|
104
195
|
}
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
(0, git_1.removeWorktree)(worktreePath);
|
|
196
|
+
if (removed.length > 0) {
|
|
197
|
+
(0, registry_1.writeRegistry)(mainRoot, registry);
|
|
108
198
|
}
|
|
109
|
-
|
|
110
|
-
registry = (0, registry_1.removeAllocation)(registry, slot);
|
|
111
|
-
(0, registry_1.writeRegistry)(mainRoot, registry);
|
|
112
|
-
const result = { slot, worktreePath, dbName, dbDropped: !options.keepDb };
|
|
199
|
+
const payload = { removed, failed };
|
|
113
200
|
if (options.json) {
|
|
114
|
-
|
|
201
|
+
if (failed.length === 0) {
|
|
202
|
+
console.log((0, output_1.formatJson)((0, output_1.success)(payload)));
|
|
203
|
+
}
|
|
204
|
+
else {
|
|
205
|
+
console.log((0, output_1.formatJson)({
|
|
206
|
+
success: false,
|
|
207
|
+
data: payload,
|
|
208
|
+
error: {
|
|
209
|
+
code: 'REMOVE_PARTIAL',
|
|
210
|
+
message: `Failed to remove ${failed.length} target(s).`,
|
|
211
|
+
},
|
|
212
|
+
}));
|
|
213
|
+
}
|
|
115
214
|
}
|
|
116
215
|
else {
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
216
|
+
if (removed.length > 0) {
|
|
217
|
+
console.log(`Removed ${removed.length} worktree(s):`);
|
|
218
|
+
for (const item of removed) {
|
|
219
|
+
console.log(` Slot ${item.slot}: ${item.worktreePath}`);
|
|
220
|
+
console.log(` Database: ${item.dbName} ${item.dbDropped ? '(dropped)' : '(kept)'}`);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
if (failed.length > 0) {
|
|
224
|
+
console.error(`Failed to remove ${failed.length} target(s):`);
|
|
225
|
+
for (const item of failed) {
|
|
226
|
+
console.error(` ${item.target}: ${item.message}`);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
if (removed.length === 0 && failed.length === 0) {
|
|
230
|
+
console.log('No worktree allocations found.');
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
if (failed.length > 0) {
|
|
234
|
+
process.exitCode = 1;
|
|
120
235
|
}
|
|
121
236
|
}
|
|
122
237
|
catch (err) {
|
|
@@ -125,7 +240,7 @@ async function removeCommand(pathOrSlot, options) {
|
|
|
125
240
|
console.log((0, output_1.formatJson)((0, output_1.error)('REMOVE_FAILED', message)));
|
|
126
241
|
}
|
|
127
242
|
else {
|
|
128
|
-
console.error(`Failed to remove worktree: ${message}`);
|
|
243
|
+
console.error(`Failed to remove worktree(s): ${message}`);
|
|
129
244
|
}
|
|
130
245
|
process.exitCode = 1;
|
|
131
246
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remove.js","sourceRoot":"","sources":["../../src/commands/remove.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"remove.js","sourceRoot":"","sources":["../../src/commands/remove.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const globals_1 = require("@jest/globals");
|
|
4
|
+
const remove_1 = require("./remove");
|
|
5
|
+
(0, globals_1.describe)('remove command target parsing', () => {
|
|
6
|
+
(0, globals_1.it)('parses comma-separated slots', () => {
|
|
7
|
+
(0, globals_1.expect)((0, remove_1.parseRemoveTargets)(['1,2'])).toEqual(['1', '2']);
|
|
8
|
+
});
|
|
9
|
+
(0, globals_1.it)('parses comma-separated slots with spaces', () => {
|
|
10
|
+
(0, globals_1.expect)((0, remove_1.parseRemoveTargets)(['1, 2'])).toEqual(['1', '2']);
|
|
11
|
+
});
|
|
12
|
+
(0, globals_1.it)('parses mixed comma and variadic targets', () => {
|
|
13
|
+
(0, globals_1.expect)((0, remove_1.parseRemoveTargets)(['1, 2', '3'])).toEqual(['1', '2', '3']);
|
|
14
|
+
});
|
|
15
|
+
(0, globals_1.it)('keeps single path targets untouched', () => {
|
|
16
|
+
(0, globals_1.expect)((0, remove_1.parseRemoveTargets)(['.worktrees/feat-auth'])).toEqual(['.worktrees/feat-auth']);
|
|
17
|
+
});
|
|
18
|
+
(0, globals_1.it)('drops empty target fragments', () => {
|
|
19
|
+
(0, globals_1.expect)((0, remove_1.parseRemoveTargets)(['1,,2', ' , '])).toEqual(['1', '2']);
|
|
20
|
+
});
|
|
21
|
+
});
|
|
22
|
+
//# sourceMappingURL=remove.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remove.spec.js","sourceRoot":"","sources":["../../src/commands/remove.spec.ts"],"names":[],"mappings":";;AAAA,2CAAqD;AACrD,qCAA8C;AAE9C,IAAA,kBAAQ,EAAC,+BAA+B,EAAE,GAAG,EAAE;IAC7C,IAAA,YAAE,EAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,IAAA,gBAAM,EAAC,IAAA,2BAAkB,EAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,IAAA,YAAE,EAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,IAAA,gBAAM,EAAC,IAAA,2BAAkB,EAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,IAAA,YAAE,EAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,IAAA,gBAAM,EAAC,IAAA,2BAAkB,EAAC,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IAEH,IAAA,YAAE,EAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,IAAA,gBAAM,EAAC,IAAA,2BAAkB,EAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC;IACzF,CAAC,CAAC,CAAC;IAEH,IAAA,YAAE,EAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,IAAA,gBAAM,EAAC,IAAA,2BAAkB,EAAC,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/dist/core/database.d.ts
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
|
+
type SqlLogger = (statement: string) => void;
|
|
1
2
|
/**
|
|
2
3
|
* Create a new database by cloning the template database.
|
|
3
4
|
* Uses CREATE DATABASE ... TEMPLATE for fast, consistent copies.
|
|
4
5
|
*/
|
|
5
|
-
export declare function createDatabase(databaseUrl: string, templateName: string, targetName: string): Promise<void>;
|
|
6
|
+
export declare function createDatabase(databaseUrl: string, templateName: string, targetName: string, logSql?: SqlLogger): Promise<void>;
|
|
6
7
|
/** Drop a database if it exists. Refuses to drop the template database. */
|
|
7
|
-
export declare function dropDatabase(databaseUrl: string, dbName: string, templateName: string): Promise<void>;
|
|
8
|
+
export declare function dropDatabase(databaseUrl: string, dbName: string, templateName: string, logSql?: SqlLogger): Promise<void>;
|
|
8
9
|
/** Check if a database exists */
|
|
9
10
|
export declare function databaseExists(databaseUrl: string, dbName: string): Promise<boolean>;
|
|
10
11
|
/** List all databases matching a pattern (for doctor command) */
|
|
11
12
|
export declare function listDatabasesByPattern(databaseUrl: string, pattern: string): Promise<string[]>;
|
|
13
|
+
export {};
|
package/dist/core/database.js
CHANGED
|
@@ -30,26 +30,46 @@ async function withAdminClient(databaseUrl, fn) {
|
|
|
30
30
|
await client.end();
|
|
31
31
|
}
|
|
32
32
|
}
|
|
33
|
+
function quoteIdentifier(identifier) {
|
|
34
|
+
return `"${identifier.replace(/"/g, '""')}"`;
|
|
35
|
+
}
|
|
36
|
+
function formatQueryLog(query, params = []) {
|
|
37
|
+
if (params.length === 0) {
|
|
38
|
+
return query;
|
|
39
|
+
}
|
|
40
|
+
const bindings = params
|
|
41
|
+
.map((value, index) => `$${index + 1}=${JSON.stringify(value)}`)
|
|
42
|
+
.join(', ');
|
|
43
|
+
return `${query} -- ${bindings}`;
|
|
44
|
+
}
|
|
33
45
|
/**
|
|
34
46
|
* Create a new database by cloning the template database.
|
|
35
47
|
* Uses CREATE DATABASE ... TEMPLATE for fast, consistent copies.
|
|
36
48
|
*/
|
|
37
|
-
async function createDatabase(databaseUrl, templateName, targetName) {
|
|
49
|
+
async function createDatabase(databaseUrl, templateName, targetName, logSql) {
|
|
38
50
|
await withAdminClient(databaseUrl, async (client) => {
|
|
39
51
|
// Terminate connections to the template DB so TEMPLATE works
|
|
40
|
-
|
|
41
|
-
|
|
52
|
+
const terminateSql = 'SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = $1 AND pid <> pg_backend_pid()';
|
|
53
|
+
logSql?.(formatQueryLog(terminateSql, [templateName]));
|
|
54
|
+
await client.query(terminateSql, [templateName]);
|
|
55
|
+
const createSql = `CREATE DATABASE ${quoteIdentifier(targetName)} TEMPLATE ${quoteIdentifier(templateName)}`;
|
|
56
|
+
logSql?.(formatQueryLog(createSql));
|
|
57
|
+
await client.query(createSql);
|
|
42
58
|
});
|
|
43
59
|
}
|
|
44
60
|
/** Drop a database if it exists. Refuses to drop the template database. */
|
|
45
|
-
async function dropDatabase(databaseUrl, dbName, templateName) {
|
|
61
|
+
async function dropDatabase(databaseUrl, dbName, templateName, logSql) {
|
|
46
62
|
if (dbName === templateName) {
|
|
47
63
|
throw new Error(`Refusing to drop template database: ${templateName}`);
|
|
48
64
|
}
|
|
49
65
|
await withAdminClient(databaseUrl, async (client) => {
|
|
50
66
|
// Terminate active connections first
|
|
51
|
-
|
|
52
|
-
|
|
67
|
+
const terminateSql = 'SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = $1 AND pid <> pg_backend_pid()';
|
|
68
|
+
logSql?.(formatQueryLog(terminateSql, [dbName]));
|
|
69
|
+
await client.query(terminateSql, [dbName]);
|
|
70
|
+
const dropSql = `DROP DATABASE IF EXISTS ${quoteIdentifier(dbName)}`;
|
|
71
|
+
logSql?.(formatQueryLog(dropSql));
|
|
72
|
+
await client.query(dropSql);
|
|
53
73
|
});
|
|
54
74
|
}
|
|
55
75
|
/** Check if a database exists */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database.js","sourceRoot":"","sources":["../../src/core/database.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"database.js","sourceRoot":"","sources":["../../src/core/database.ts"],"names":[],"mappings":"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"}
|
package/dist/core/env-patcher.js
CHANGED
|
@@ -97,7 +97,8 @@ function patchUrlPort(value, patch, context) {
|
|
|
97
97
|
*/
|
|
98
98
|
function patchEnvContent(content, patches, context) {
|
|
99
99
|
const patchMap = new Map(patches.map((p) => [p.var, p]));
|
|
100
|
-
|
|
100
|
+
const found = new Set();
|
|
101
|
+
const lines = content
|
|
101
102
|
.split('\n')
|
|
102
103
|
.map((line) => {
|
|
103
104
|
const match = line.match(/^([A-Z_][A-Z0-9_]*)=(.*)/);
|
|
@@ -107,12 +108,25 @@ function patchEnvContent(content, patches, context) {
|
|
|
107
108
|
const patch = patchMap.get(varName);
|
|
108
109
|
if (!patch)
|
|
109
110
|
return line;
|
|
111
|
+
found.add(varName);
|
|
110
112
|
const unquoted = rawValue.replace(/^["']|["']$/g, '');
|
|
111
113
|
const patched = applyPatch(unquoted, patch, context);
|
|
112
114
|
const quote = rawValue.startsWith('"') ? '"' : rawValue.startsWith("'") ? "'" : '';
|
|
113
115
|
return `${varName}=${quote}${patched}${quote}`;
|
|
114
|
-
})
|
|
115
|
-
|
|
116
|
+
});
|
|
117
|
+
// Append vars declared in patches but missing from the source file.
|
|
118
|
+
// Only "port" patches can be computed without a source value.
|
|
119
|
+
for (const patch of patches) {
|
|
120
|
+
if (found.has(patch.var))
|
|
121
|
+
continue;
|
|
122
|
+
if (patch.type === 'port') {
|
|
123
|
+
const serviceName = patch.service;
|
|
124
|
+
if (serviceName && serviceName in context.ports) {
|
|
125
|
+
lines.push(`${patch.var}=${context.ports[serviceName]}`);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return lines.join('\n');
|
|
116
130
|
}
|
|
117
131
|
/**
|
|
118
132
|
* Copy and patch all env files from the main worktree to the target worktree.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"env-patcher.js","sourceRoot":"","sources":["../../src/core/env-patcher.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8EA,
|
|
1
|
+
{"version":3,"file":"env-patcher.js","sourceRoot":"","sources":["../../src/core/env-patcher.ts"],"names":[],"mappings":"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"}
|
package/dist/core/git.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
type CommandLogger = (command: string) => void;
|
|
1
2
|
/**
|
|
2
3
|
* Get the main (bare) worktree path from git.
|
|
3
4
|
* Parses `git worktree list --porcelain` to find the first entry.
|
|
@@ -12,8 +13,9 @@ export declare function isMainWorktree(targetPath: string): boolean;
|
|
|
12
13
|
* Create a new git worktree at the given base path for the specified branch.
|
|
13
14
|
* If the branch already exists, checks it out; otherwise creates it with -b.
|
|
14
15
|
*/
|
|
15
|
-
export declare function createWorktree(basePath: string, branchName: string): string;
|
|
16
|
+
export declare function createWorktree(basePath: string, branchName: string, logCommand?: CommandLogger): string;
|
|
16
17
|
/** Remove a git worktree by path */
|
|
17
|
-
export declare function removeWorktree(worktreePath: string): void;
|
|
18
|
+
export declare function removeWorktree(worktreePath: string, logCommand?: CommandLogger): void;
|
|
18
19
|
/** Get the current branch name for a worktree path */
|
|
19
20
|
export declare function getBranchName(worktreePath: string): string;
|
|
21
|
+
export {};
|
package/dist/core/git.js
CHANGED
|
@@ -66,19 +66,23 @@ function isMainWorktree(targetPath) {
|
|
|
66
66
|
* Create a new git worktree at the given base path for the specified branch.
|
|
67
67
|
* If the branch already exists, checks it out; otherwise creates it with -b.
|
|
68
68
|
*/
|
|
69
|
-
function createWorktree(basePath, branchName) {
|
|
69
|
+
function createWorktree(basePath, branchName, logCommand) {
|
|
70
70
|
const slug = branchName.replace(/\//g, '-');
|
|
71
71
|
const worktreePath = path.resolve(basePath, slug);
|
|
72
72
|
const branchExists = branchExistsLocally(branchName);
|
|
73
73
|
const args = branchExists
|
|
74
74
|
? `"${worktreePath}" "${branchName}"`
|
|
75
75
|
: `"${worktreePath}" -b "${branchName}"`;
|
|
76
|
-
|
|
76
|
+
const command = `git worktree add ${args}`;
|
|
77
|
+
logCommand?.(command);
|
|
78
|
+
(0, node_child_process_1.execSync)(command, { stdio: 'pipe' });
|
|
77
79
|
return worktreePath;
|
|
78
80
|
}
|
|
79
81
|
/** Remove a git worktree by path */
|
|
80
|
-
function removeWorktree(worktreePath) {
|
|
81
|
-
|
|
82
|
+
function removeWorktree(worktreePath, logCommand) {
|
|
83
|
+
const command = `git worktree remove "${worktreePath}" --force`;
|
|
84
|
+
logCommand?.(command);
|
|
85
|
+
(0, node_child_process_1.execSync)(command, { stdio: 'pipe' });
|
|
82
86
|
}
|
|
83
87
|
/** Get the current branch name for a worktree path */
|
|
84
88
|
function getBranchName(worktreePath) {
|
package/dist/core/git.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/core/git.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/core/git.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AASA,kDASC;AAMD,wCAGC;AAMD,wCAiBC;AAGD,wCAOC;AAGD,sCAKC;AApED,2DAA8C;AAC9C,gDAAkC;AAIlC;;;GAGG;AACH,SAAgB,mBAAmB;IACjC,MAAM,MAAM,GAAG,IAAA,6BAAQ,EAAC,+BAA+B,EAAE;QACvD,QAAQ,EAAE,OAAO;KAClB,CAAC,CAAC;IACH,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACxC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IAC5D,CAAC;IACD,OAAO,SAAS,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;AAC5C,CAAC;AAED;;;GAGG;AACH,SAAgB,cAAc,CAAC,UAAkB;IAC/C,MAAM,QAAQ,GAAG,mBAAmB,EAAE,CAAC;IACvC,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;AAC7D,CAAC;AAED;;;GAGG;AACH,SAAgB,cAAc,CAC5B,QAAgB,EAChB,UAAkB,EAClB,UAA0B;IAE1B,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC5C,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAElD,MAAM,YAAY,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC;IACrD,MAAM,IAAI,GAAG,YAAY;QACvB,CAAC,CAAC,IAAI,YAAY,MAAM,UAAU,GAAG;QACrC,CAAC,CAAC,IAAI,YAAY,SAAS,UAAU,GAAG,CAAC;IAE3C,MAAM,OAAO,GAAG,oBAAoB,IAAI,EAAE,CAAC;IAC3C,UAAU,EAAE,CAAC,OAAO,CAAC,CAAC;IACtB,IAAA,6BAAQ,EAAC,OAAO,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IACrC,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,oCAAoC;AACpC,SAAgB,cAAc,CAC5B,YAAoB,EACpB,UAA0B;IAE1B,MAAM,OAAO,GAAG,wBAAwB,YAAY,WAAW,CAAC;IAChE,UAAU,EAAE,CAAC,OAAO,CAAC,CAAC;IACtB,IAAA,6BAAQ,EAAC,OAAO,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;AACvC,CAAC;AAED,sDAAsD;AACtD,SAAgB,aAAa,CAAC,YAAoB;IAChD,OAAO,IAAA,6BAAQ,EAAC,iCAAiC,EAAE;QACjD,GAAG,EAAE,YAAY;QACjB,QAAQ,EAAE,OAAO;KAClB,CAAC,CAAC,IAAI,EAAE,CAAC;AACZ,CAAC;AAED,uCAAuC;AACvC,SAAS,mBAAmB,CAAC,UAAkB;IAC7C,IAAI,CAAC;QACH,IAAA,6BAAQ,EAAC,sCAAsC,UAAU,GAAG,EAAE;YAC5D,KAAK,EAAE,MAAM;SACd,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Synchronously read the update cache and return a version notice string.
|
|
3
|
+
* Returns a multi-line update notice if a newer version is available,
|
|
4
|
+
* or a simple version line otherwise.
|
|
5
|
+
*/
|
|
6
|
+
export declare function getUpdateNotice(currentVersion: string): string;
|
|
7
|
+
/**
|
|
8
|
+
* Fetch the latest version from the npm registry and write it to the cache.
|
|
9
|
+
* Fire-and-forget — all errors are silently swallowed.
|
|
10
|
+
*/
|
|
11
|
+
export declare function refreshUpdateCache(packageName: string): void;
|
|
12
|
+
/**
|
|
13
|
+
* Check whether the cache is fresh (less than TTL old).
|
|
14
|
+
* Used to skip redundant registry fetches.
|
|
15
|
+
*/
|
|
16
|
+
export declare function isCacheFresh(): boolean;
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.getUpdateNotice = getUpdateNotice;
|
|
37
|
+
exports.refreshUpdateCache = refreshUpdateCache;
|
|
38
|
+
exports.isCacheFresh = isCacheFresh;
|
|
39
|
+
const fs = __importStar(require("node:fs"));
|
|
40
|
+
const path = __importStar(require("node:path"));
|
|
41
|
+
const https = __importStar(require("node:https"));
|
|
42
|
+
const os = __importStar(require("node:os"));
|
|
43
|
+
const CACHE_PATH = path.join(os.homedir(), '.cache', 'wt-update-check.json');
|
|
44
|
+
const CACHE_TTL_MS = 24 * 60 * 60 * 1000; // 24 hours
|
|
45
|
+
const FETCH_TIMEOUT_MS = 3000;
|
|
46
|
+
/**
|
|
47
|
+
* Compare two semver-like version strings (e.g. "0.1.4" vs "0.2.0").
|
|
48
|
+
* Returns true if b is newer than a.
|
|
49
|
+
*/
|
|
50
|
+
function isNewer(a, b) {
|
|
51
|
+
const pa = a.split('.').map(Number);
|
|
52
|
+
const pb = b.split('.').map(Number);
|
|
53
|
+
for (let i = 0; i < Math.max(pa.length, pb.length); i++) {
|
|
54
|
+
const na = pa[i] ?? 0;
|
|
55
|
+
const nb = pb[i] ?? 0;
|
|
56
|
+
if (nb > na)
|
|
57
|
+
return true;
|
|
58
|
+
if (nb < na)
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Synchronously read the update cache and return a version notice string.
|
|
65
|
+
* Returns a multi-line update notice if a newer version is available,
|
|
66
|
+
* or a simple version line otherwise.
|
|
67
|
+
*/
|
|
68
|
+
function getUpdateNotice(currentVersion) {
|
|
69
|
+
try {
|
|
70
|
+
const raw = fs.readFileSync(CACHE_PATH, 'utf-8');
|
|
71
|
+
const cache = JSON.parse(raw);
|
|
72
|
+
if (cache.latest && isNewer(currentVersion, cache.latest)) {
|
|
73
|
+
return `wt v${currentVersion} — update available: ${cache.latest}\nRun: pnpm add -g @tokenbooks/wt`;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
// Cache missing or corrupt — fall through
|
|
78
|
+
}
|
|
79
|
+
return `wt v${currentVersion}`;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Fetch the latest version from the npm registry and write it to the cache.
|
|
83
|
+
* Fire-and-forget — all errors are silently swallowed.
|
|
84
|
+
*/
|
|
85
|
+
function refreshUpdateCache(packageName) {
|
|
86
|
+
const url = `https://registry.npmjs.org/${packageName}/latest`;
|
|
87
|
+
const req = https.get(url, { timeout: FETCH_TIMEOUT_MS }, (res) => {
|
|
88
|
+
let body = '';
|
|
89
|
+
res.on('data', (chunk) => {
|
|
90
|
+
body += chunk.toString();
|
|
91
|
+
});
|
|
92
|
+
res.on('end', () => {
|
|
93
|
+
try {
|
|
94
|
+
const data = JSON.parse(body);
|
|
95
|
+
if (!data.version)
|
|
96
|
+
return;
|
|
97
|
+
const cache = {
|
|
98
|
+
latest: data.version,
|
|
99
|
+
checkedAt: Date.now(),
|
|
100
|
+
};
|
|
101
|
+
const dir = path.dirname(CACHE_PATH);
|
|
102
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
103
|
+
fs.writeFileSync(CACHE_PATH, JSON.stringify(cache) + '\n');
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
// Silently swallow JSON/write errors
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
req.on('error', () => {
|
|
111
|
+
// Silently swallow network errors
|
|
112
|
+
});
|
|
113
|
+
req.on('timeout', () => {
|
|
114
|
+
req.destroy();
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Check whether the cache is fresh (less than TTL old).
|
|
119
|
+
* Used to skip redundant registry fetches.
|
|
120
|
+
*/
|
|
121
|
+
function isCacheFresh() {
|
|
122
|
+
try {
|
|
123
|
+
const raw = fs.readFileSync(CACHE_PATH, 'utf-8');
|
|
124
|
+
const cache = JSON.parse(raw);
|
|
125
|
+
return Date.now() - cache.checkedAt < CACHE_TTL_MS;
|
|
126
|
+
}
|
|
127
|
+
catch {
|
|
128
|
+
return false;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=update-check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-check.js","sourceRoot":"","sources":["../../src/core/update-check.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/skills/wt/SKILL.md
CHANGED
|
@@ -171,14 +171,18 @@ wt list
|
|
|
171
171
|
|
|
172
172
|
---
|
|
173
173
|
|
|
174
|
-
### `remove
|
|
174
|
+
### `remove [targets...]|--all` — Remove one or more worktrees
|
|
175
175
|
|
|
176
176
|
Run:
|
|
177
177
|
```bash
|
|
178
|
-
wt remove
|
|
178
|
+
wt remove $@
|
|
179
179
|
```
|
|
180
180
|
|
|
181
|
-
Accepts
|
|
181
|
+
Accepts paths or slots, including batch slot formats:
|
|
182
|
+
- `wt remove 1 2`
|
|
183
|
+
- `wt remove 1,2`
|
|
184
|
+
- `wt remove "1, 2"`
|
|
185
|
+
- `wt remove --all`
|
|
182
186
|
|
|
183
187
|
If the user wants to keep the database, use `--keep-db`.
|
|
184
188
|
|
|
@@ -219,7 +223,7 @@ Available commands:
|
|
|
219
223
|
/wt new <branch> — Create a worktree with isolated DB, Redis, and ports
|
|
220
224
|
/wt open <slot|branch> — Open a worktree by slot or branch (creates if not found)
|
|
221
225
|
/wt list — List all worktree allocations
|
|
222
|
-
/wt remove <
|
|
226
|
+
/wt remove <targets...>|--all — Remove one or more worktrees and clean up resources
|
|
223
227
|
/wt doctor — Diagnose and fix environment issues
|
|
224
228
|
/wt setup [path] — Set up an existing worktree
|
|
225
229
|
```
|