@tokenbooks/wt 0.2.2 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +59 -28
- package/dist/cli.js +14 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/new.js +30 -5
- package/dist/commands/new.js.map +1 -1
- package/dist/commands/prune.d.ts +8 -0
- package/dist/commands/prune.js +210 -0
- package/dist/commands/prune.js.map +1 -0
- package/dist/commands/prune.spec.d.ts +1 -0
- package/dist/commands/prune.spec.js +173 -0
- package/dist/commands/prune.spec.js.map +1 -0
- package/dist/commands/remove.js +11 -1
- package/dist/commands/remove.js.map +1 -1
- package/dist/commands/setup.js +144 -7
- package/dist/commands/setup.js.map +1 -1
- package/dist/core/env-patcher.js +8 -8
- package/dist/core/env-patcher.js.map +1 -1
- package/dist/core/git.d.ts +8 -0
- package/dist/core/git.js +32 -0
- package/dist/core/git.js.map +1 -1
- package/dist/core/managed-redis.d.ts +19 -0
- package/dist/core/managed-redis.js +266 -0
- package/dist/core/managed-redis.js.map +1 -0
- package/dist/core/slot-allocator.d.ts +10 -0
- package/dist/core/slot-allocator.js +98 -0
- package/dist/core/slot-allocator.js.map +1 -1
- package/dist/output.js +14 -3
- package/dist/output.js.map +1 -1
- package/dist/schemas/config.schema.d.ts +45 -27
- package/dist/schemas/config.schema.js +22 -6
- package/dist/schemas/config.schema.js.map +1 -1
- package/dist/schemas/registry.schema.d.ts +4 -2
- package/dist/schemas/registry.schema.js +2 -1
- package/dist/schemas/registry.schema.js.map +1 -1
- package/dist/types.d.ts +1 -1
- package/package.json +2 -1
- package/skills/wt/SKILL.md +31 -12
|
@@ -0,0 +1,173 @@
|
|
|
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
|
+
const globals_1 = require("@jest/globals");
|
|
37
|
+
const fs = __importStar(require("node:fs"));
|
|
38
|
+
const os = __importStar(require("node:os"));
|
|
39
|
+
const path = __importStar(require("node:path"));
|
|
40
|
+
globals_1.jest.mock('../core/registry', () => ({
|
|
41
|
+
readRegistry: globals_1.jest.fn(),
|
|
42
|
+
writeRegistry: globals_1.jest.fn(),
|
|
43
|
+
removeAllocation: globals_1.jest.fn(),
|
|
44
|
+
findByPath: globals_1.jest.fn(),
|
|
45
|
+
}));
|
|
46
|
+
globals_1.jest.mock('../core/database', () => ({
|
|
47
|
+
dropDatabase: globals_1.jest.fn(),
|
|
48
|
+
}));
|
|
49
|
+
globals_1.jest.mock('../core/git', () => ({
|
|
50
|
+
getMainWorktreePath: globals_1.jest.fn(),
|
|
51
|
+
listPrunableWorktrees: globals_1.jest.fn(),
|
|
52
|
+
pruneWorktrees: globals_1.jest.fn(),
|
|
53
|
+
}));
|
|
54
|
+
globals_1.jest.mock('../core/managed-redis', () => ({
|
|
55
|
+
removeManagedRedisContainer: globals_1.jest.fn(),
|
|
56
|
+
}));
|
|
57
|
+
globals_1.jest.mock('./setup', () => ({
|
|
58
|
+
loadConfig: globals_1.jest.fn(),
|
|
59
|
+
}));
|
|
60
|
+
const registry_1 = require("../core/registry");
|
|
61
|
+
const database_1 = require("../core/database");
|
|
62
|
+
const git_1 = require("../core/git");
|
|
63
|
+
const managed_redis_1 = require("../core/managed-redis");
|
|
64
|
+
const setup_1 = require("./setup");
|
|
65
|
+
const prune_1 = require("./prune");
|
|
66
|
+
const mockReadRegistry = registry_1.readRegistry;
|
|
67
|
+
const mockWriteRegistry = registry_1.writeRegistry;
|
|
68
|
+
const mockRemoveAllocation = registry_1.removeAllocation;
|
|
69
|
+
const mockFindByPath = registry_1.findByPath;
|
|
70
|
+
const mockDropDatabase = database_1.dropDatabase;
|
|
71
|
+
const mockGetMainWorktreePath = git_1.getMainWorktreePath;
|
|
72
|
+
const mockListPrunableWorktrees = git_1.listPrunableWorktrees;
|
|
73
|
+
const mockPruneWorktrees = git_1.pruneWorktrees;
|
|
74
|
+
const mockRemoveManagedRedisContainer = managed_redis_1.removeManagedRedisContainer;
|
|
75
|
+
const mockLoadConfig = setup_1.loadConfig;
|
|
76
|
+
(0, globals_1.describe)('pruneCommand', () => {
|
|
77
|
+
let tmpDir;
|
|
78
|
+
let consoleLogSpy;
|
|
79
|
+
let consoleErrorSpy;
|
|
80
|
+
const allocation = {
|
|
81
|
+
worktreePath: '/repo/.worktrees/feat-auth',
|
|
82
|
+
branchName: 'feat/auth',
|
|
83
|
+
dbName: 'myapp_wt2',
|
|
84
|
+
redisContainerName: 'wt-myapp-deadbeef-slot-2-redis',
|
|
85
|
+
ports: { web: 3200, redis: 6579 },
|
|
86
|
+
createdAt: '2026-03-08T00:00:00.000Z',
|
|
87
|
+
};
|
|
88
|
+
const config = {
|
|
89
|
+
baseDatabaseName: 'myapp',
|
|
90
|
+
baseWorktreePath: '.worktrees',
|
|
91
|
+
portStride: 100,
|
|
92
|
+
maxSlots: 50,
|
|
93
|
+
services: [
|
|
94
|
+
{ name: 'web', defaultPort: 3000 },
|
|
95
|
+
{ name: 'redis', defaultPort: 6379 },
|
|
96
|
+
],
|
|
97
|
+
envFiles: [],
|
|
98
|
+
postSetup: [],
|
|
99
|
+
autoInstall: true,
|
|
100
|
+
};
|
|
101
|
+
(0, globals_1.beforeEach)(() => {
|
|
102
|
+
tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'wt-prune-test-'));
|
|
103
|
+
fs.writeFileSync(path.join(tmpDir, '.env'), 'DATABASE_URL=postgresql://user:pw@localhost:5432/myapp\n', 'utf-8');
|
|
104
|
+
consoleLogSpy = globals_1.jest.spyOn(console, 'log').mockImplementation(() => { });
|
|
105
|
+
consoleErrorSpy = globals_1.jest.spyOn(console, 'error').mockImplementation(() => { });
|
|
106
|
+
mockGetMainWorktreePath.mockReturnValue(tmpDir);
|
|
107
|
+
mockReadRegistry.mockReturnValue({
|
|
108
|
+
version: 1,
|
|
109
|
+
allocations: {
|
|
110
|
+
'2': allocation,
|
|
111
|
+
},
|
|
112
|
+
});
|
|
113
|
+
mockFindByPath.mockImplementation((_registry, worktreePath) => {
|
|
114
|
+
return path.resolve(worktreePath) === path.resolve(allocation.worktreePath)
|
|
115
|
+
? [2, allocation]
|
|
116
|
+
: null;
|
|
117
|
+
});
|
|
118
|
+
mockRemoveAllocation.mockImplementation((registry) => ({
|
|
119
|
+
...registry,
|
|
120
|
+
allocations: {},
|
|
121
|
+
}));
|
|
122
|
+
mockRemoveManagedRedisContainer.mockReturnValue(true);
|
|
123
|
+
mockLoadConfig.mockReturnValue(config);
|
|
124
|
+
process.exitCode = 0;
|
|
125
|
+
});
|
|
126
|
+
(0, globals_1.afterEach)(() => {
|
|
127
|
+
consoleLogSpy.mockRestore();
|
|
128
|
+
consoleErrorSpy.mockRestore();
|
|
129
|
+
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
130
|
+
globals_1.jest.clearAllMocks();
|
|
131
|
+
});
|
|
132
|
+
(0, globals_1.it)('reports managed and unmanaged prunable worktrees in dry-run mode', async () => {
|
|
133
|
+
mockListPrunableWorktrees.mockReturnValue([
|
|
134
|
+
{ path: allocation.worktreePath, reason: 'gitdir file points to non-existent location' },
|
|
135
|
+
{ path: '/repo/.worktrees/unmanaged', reason: 'gitdir file points to non-existent location' },
|
|
136
|
+
]);
|
|
137
|
+
await (0, prune_1.pruneCommand)({ json: true, keepDb: false, dryRun: true });
|
|
138
|
+
(0, globals_1.expect)(mockDropDatabase).not.toHaveBeenCalled();
|
|
139
|
+
(0, globals_1.expect)(mockPruneWorktrees).not.toHaveBeenCalled();
|
|
140
|
+
(0, globals_1.expect)(mockWriteRegistry).not.toHaveBeenCalled();
|
|
141
|
+
const output = JSON.parse(consoleLogSpy.mock.calls[0]?.[0] ?? 'null');
|
|
142
|
+
(0, globals_1.expect)(output.success).toBe(true);
|
|
143
|
+
(0, globals_1.expect)(output.data.prunableCount).toBe(2);
|
|
144
|
+
(0, globals_1.expect)(output.data.managed).toHaveLength(1);
|
|
145
|
+
(0, globals_1.expect)(output.data.managed[0]?.slot).toBe(2);
|
|
146
|
+
(0, globals_1.expect)(output.data.unmanaged).toEqual([
|
|
147
|
+
{ worktreePath: '/repo/.worktrees/unmanaged', reason: 'gitdir file points to non-existent location' },
|
|
148
|
+
]);
|
|
149
|
+
});
|
|
150
|
+
(0, globals_1.it)('drops managed resources and prunes Git metadata', async () => {
|
|
151
|
+
mockListPrunableWorktrees.mockReturnValue([
|
|
152
|
+
{ path: allocation.worktreePath, reason: 'gitdir file points to non-existent location' },
|
|
153
|
+
{ path: '/repo/.worktrees/unmanaged', reason: 'gitdir file points to non-existent location' },
|
|
154
|
+
]);
|
|
155
|
+
await (0, prune_1.pruneCommand)({ json: true, keepDb: false, dryRun: false });
|
|
156
|
+
(0, globals_1.expect)(mockLoadConfig).toHaveBeenCalledWith(tmpDir);
|
|
157
|
+
(0, globals_1.expect)(mockDropDatabase).toHaveBeenCalledWith('postgresql://user:pw@localhost:5432/myapp', allocation.dbName, 'myapp', globals_1.expect.any(Function));
|
|
158
|
+
(0, globals_1.expect)(mockRemoveManagedRedisContainer).toHaveBeenCalledWith(tmpDir, 2, globals_1.expect.any(Function));
|
|
159
|
+
(0, globals_1.expect)(mockRemoveAllocation).toHaveBeenCalled();
|
|
160
|
+
(0, globals_1.expect)(mockWriteRegistry).toHaveBeenCalledWith(tmpDir, { version: 1, allocations: {} });
|
|
161
|
+
(0, globals_1.expect)(mockPruneWorktrees).toHaveBeenCalledWith(globals_1.expect.any(Function));
|
|
162
|
+
const output = JSON.parse(consoleLogSpy.mock.calls[0]?.[0] ?? 'null');
|
|
163
|
+
(0, globals_1.expect)(output.success).toBe(true);
|
|
164
|
+
(0, globals_1.expect)(output.data.prunedManaged).toHaveLength(1);
|
|
165
|
+
(0, globals_1.expect)(output.data.prunedManaged[0]?.slot).toBe(2);
|
|
166
|
+
(0, globals_1.expect)(output.data.prunedManaged[0]?.redisContainerRemoved).toBe(true);
|
|
167
|
+
(0, globals_1.expect)(output.data.prunedUnmanaged).toEqual([
|
|
168
|
+
{ worktreePath: '/repo/.worktrees/unmanaged', reason: 'gitdir file points to non-existent location' },
|
|
169
|
+
]);
|
|
170
|
+
(0, globals_1.expect)(output.data.failed).toEqual([]);
|
|
171
|
+
});
|
|
172
|
+
});
|
|
173
|
+
//# sourceMappingURL=prune.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prune.spec.js","sourceRoot":"","sources":["../../src/commands/prune.spec.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2CAAkF;AAClF,4CAA8B;AAC9B,4CAA8B;AAC9B,gDAAkC;AAElC,cAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,GAAG,EAAE,CAAC,CAAC;IACnC,YAAY,EAAE,cAAI,CAAC,EAAE,EAAE;IACvB,aAAa,EAAE,cAAI,CAAC,EAAE,EAAE;IACxB,gBAAgB,EAAE,cAAI,CAAC,EAAE,EAAE;IAC3B,UAAU,EAAE,cAAI,CAAC,EAAE,EAAE;CACtB,CAAC,CAAC,CAAC;AAEJ,cAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,GAAG,EAAE,CAAC,CAAC;IACnC,YAAY,EAAE,cAAI,CAAC,EAAE,EAAE;CACxB,CAAC,CAAC,CAAC;AAEJ,cAAI,CAAC,IAAI,CAAC,aAAa,EAAE,GAAG,EAAE,CAAC,CAAC;IAC9B,mBAAmB,EAAE,cAAI,CAAC,EAAE,EAAE;IAC9B,qBAAqB,EAAE,cAAI,CAAC,EAAE,EAAE;IAChC,cAAc,EAAE,cAAI,CAAC,EAAE,EAAE;CAC1B,CAAC,CAAC,CAAC;AAEJ,cAAI,CAAC,IAAI,CAAC,uBAAuB,EAAE,GAAG,EAAE,CAAC,CAAC;IACxC,2BAA2B,EAAE,cAAI,CAAC,EAAE,EAAE;CACvC,CAAC,CAAC,CAAC;AAEJ,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;IAC1B,UAAU,EAAE,cAAI,CAAC,EAAE,EAAE;CACtB,CAAC,CAAC,CAAC;AAEJ,+CAA6F;AAC7F,+CAAgD;AAChD,qCAAyF;AACzF,yDAAoE;AACpE,mCAAqC;AACrC,mCAAuC;AAGvC,MAAM,gBAAgB,GAAG,uBAAwD,CAAC;AAClF,MAAM,iBAAiB,GAAG,wBAA0D,CAAC;AACrF,MAAM,oBAAoB,GAAG,2BAAgE,CAAC;AAC9F,MAAM,cAAc,GAAG,qBAAoD,CAAC;AAC5E,MAAM,gBAAgB,GAAG,uBAAwD,CAAC;AAClF,MAAM,uBAAuB,GAAG,yBAAsE,CAAC;AACvG,MAAM,yBAAyB,GAAG,2BAA0E,CAAC;AAC7G,MAAM,kBAAkB,GAAG,oBAA4D,CAAC;AACxF,MAAM,+BAA+B,GAAG,2CAEvC,CAAC;AACF,MAAM,cAAc,GAAG,kBAAoD,CAAC;AAE5E,IAAA,kBAAQ,EAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,IAAI,MAAc,CAAC;IACnB,IAAI,aAAqD,CAAC;IAC1D,IAAI,eAAyD,CAAC;IAE9D,MAAM,UAAU,GAAe;QAC7B,YAAY,EAAE,4BAA4B;QAC1C,UAAU,EAAE,WAAW;QACvB,MAAM,EAAE,WAAW;QACnB,kBAAkB,EAAE,gCAAgC;QACpD,KAAK,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE;QACjC,SAAS,EAAE,0BAA0B;KACtC,CAAC;IAEF,MAAM,MAAM,GAAa;QACvB,gBAAgB,EAAE,OAAO;QACzB,gBAAgB,EAAE,YAAY;QAC9B,UAAU,EAAE,GAAG;QACf,QAAQ,EAAE,EAAE;QACZ,QAAQ,EAAE;YACR,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE;YAClC,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE;SACrC;QACD,QAAQ,EAAE,EAAE;QACZ,SAAS,EAAE,EAAE;QACb,WAAW,EAAE,IAAI;KAClB,CAAC;IAEF,IAAA,oBAAU,EAAC,GAAG,EAAE;QACd,MAAM,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,gBAAgB,CAAC,CAAC,CAAC;QAClE,EAAE,CAAC,aAAa,CACd,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,EACzB,0DAA0D,EAC1D,OAAO,CACR,CAAC;QAEF,aAAa,GAAG,cAAI,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACxE,eAAe,GAAG,cAAI,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAE5E,uBAAuB,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAChD,gBAAgB,CAAC,eAAe,CAAC;YAC/B,OAAO,EAAE,CAAC;YACV,WAAW,EAAE;gBACX,GAAG,EAAE,UAAU;aAChB;SACiB,CAAC,CAAC;QACtB,cAAc,CAAC,kBAAkB,CAAC,CAAC,SAAS,EAAE,YAAY,EAAE,EAAE;YAC5D,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC;gBACzE,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC;gBACjB,CAAC,CAAC,IAAI,CAAC;QACX,CAAC,CAAC,CAAC;QACH,oBAAoB,CAAC,kBAAkB,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YACrD,GAAG,QAAQ;YACX,WAAW,EAAE,EAAE;SAChB,CAAC,CAAC,CAAC;QACJ,+BAA+B,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QACtD,cAAc,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QACvC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,IAAA,mBAAS,EAAC,GAAG,EAAE;QACb,aAAa,CAAC,WAAW,EAAE,CAAC;QAC5B,eAAe,CAAC,WAAW,EAAE,CAAC;QAC9B,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACpD,cAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,IAAA,YAAE,EAAC,kEAAkE,EAAE,KAAK,IAAI,EAAE;QAChF,yBAAyB,CAAC,eAAe,CAAC;YACxC,EAAE,IAAI,EAAE,UAAU,CAAC,YAAY,EAAE,MAAM,EAAE,6CAA6C,EAAE;YACxF,EAAE,IAAI,EAAE,4BAA4B,EAAE,MAAM,EAAE,6CAA6C,EAAE;SAC9F,CAAC,CAAC;QAEH,MAAM,IAAA,oBAAY,EAAC,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QAEhE,IAAA,gBAAM,EAAC,gBAAgB,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAChD,IAAA,gBAAM,EAAC,kBAAkB,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAClD,IAAA,gBAAM,EAAC,iBAAiB,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAEjD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,MAAM,CAOnE,CAAC;QACF,IAAA,gBAAM,EAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,IAAA,gBAAM,EAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC1C,IAAA,gBAAM,EAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC5C,IAAA,gBAAM,EAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC7C,IAAA,gBAAM,EAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC;YACpC,EAAE,YAAY,EAAE,4BAA4B,EAAE,MAAM,EAAE,6CAA6C,EAAE;SACtG,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,IAAA,YAAE,EAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;QAC/D,yBAAyB,CAAC,eAAe,CAAC;YACxC,EAAE,IAAI,EAAE,UAAU,CAAC,YAAY,EAAE,MAAM,EAAE,6CAA6C,EAAE;YACxF,EAAE,IAAI,EAAE,4BAA4B,EAAE,MAAM,EAAE,6CAA6C,EAAE;SAC9F,CAAC,CAAC;QAEH,MAAM,IAAA,oBAAY,EAAC,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;QAEjE,IAAA,gBAAM,EAAC,cAAc,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;QACpD,IAAA,gBAAM,EAAC,gBAAgB,CAAC,CAAC,oBAAoB,CAC3C,2CAA2C,EAC3C,UAAU,CAAC,MAAM,EACjB,OAAO,EACP,gBAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CACrB,CAAC;QACF,IAAA,gBAAM,EAAC,+BAA+B,CAAC,CAAC,oBAAoB,CAAC,MAAM,EAAE,CAAC,EAAE,gBAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC9F,IAAA,gBAAM,EAAC,oBAAoB,CAAC,CAAC,gBAAgB,EAAE,CAAC;QAChD,IAAA,gBAAM,EAAC,iBAAiB,CAAC,CAAC,oBAAoB,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC;QACxF,IAAA,gBAAM,EAAC,kBAAkB,CAAC,CAAC,oBAAoB,CAAC,gBAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;QAEtE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,MAAM,CAOnE,CAAC;QACF,IAAA,gBAAM,EAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,IAAA,gBAAM,EAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAClD,IAAA,gBAAM,EAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACnD,IAAA,gBAAM,EAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,qBAAqB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvE,IAAA,gBAAM,EAAC,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC;YAC1C,EAAE,YAAY,EAAE,4BAA4B,EAAE,MAAM,EAAE,6CAA6C,EAAE;SACtG,CAAC,CAAC;QACH,IAAA,gBAAM,EAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/dist/commands/remove.js
CHANGED
|
@@ -39,6 +39,7 @@ const path = __importStar(require("node:path"));
|
|
|
39
39
|
const fs = __importStar(require("node:fs"));
|
|
40
40
|
const registry_1 = require("../core/registry");
|
|
41
41
|
const database_1 = require("../core/database");
|
|
42
|
+
const managed_redis_1 = require("../core/managed-redis");
|
|
42
43
|
const git_1 = require("../core/git");
|
|
43
44
|
const setup_1 = require("./setup");
|
|
44
45
|
const output_1 = require("../output");
|
|
@@ -84,6 +85,7 @@ function resolveTarget(registry, target) {
|
|
|
84
85
|
slot,
|
|
85
86
|
worktreePath: allocation.worktreePath,
|
|
86
87
|
dbName: allocation.dbName,
|
|
88
|
+
redisContainerName: allocation.redisContainerName,
|
|
87
89
|
};
|
|
88
90
|
}
|
|
89
91
|
const resolvedPath = path.resolve(target);
|
|
@@ -95,6 +97,7 @@ function resolveTarget(registry, target) {
|
|
|
95
97
|
slot: found[0],
|
|
96
98
|
worktreePath: found[1].worktreePath,
|
|
97
99
|
dbName: found[1].dbName,
|
|
100
|
+
redisContainerName: found[1].redisContainerName,
|
|
98
101
|
};
|
|
99
102
|
}
|
|
100
103
|
/** Remove one or more worktrees, their databases, and registry entries */
|
|
@@ -146,11 +149,13 @@ async function removeCommand(rawTargets, options) {
|
|
|
146
149
|
return;
|
|
147
150
|
}
|
|
148
151
|
}
|
|
152
|
+
const config = (0, setup_1.loadConfig)(mainRoot);
|
|
153
|
+
const managedRedisEnabled = (0, managed_redis_1.usesManagedRedis)(config);
|
|
149
154
|
const dbContext = options.keepDb
|
|
150
155
|
? null
|
|
151
156
|
: {
|
|
152
157
|
databaseUrl: readDatabaseUrl(mainRoot),
|
|
153
|
-
baseDatabaseName:
|
|
158
|
+
baseDatabaseName: config.baseDatabaseName,
|
|
154
159
|
};
|
|
155
160
|
const seenSlots = new Set();
|
|
156
161
|
const removed = [];
|
|
@@ -201,6 +206,9 @@ async function removeCommand(rawTargets, options) {
|
|
|
201
206
|
else {
|
|
202
207
|
log(`Skipping database drop for '${resolved.dbName}' (--keep-db).`);
|
|
203
208
|
}
|
|
209
|
+
const redisContainerRemoved = managedRedisEnabled || resolved.redisContainerName !== undefined
|
|
210
|
+
? (0, managed_redis_1.removeManagedRedisContainer)(mainRoot, resolved.slot, log)
|
|
211
|
+
: false;
|
|
204
212
|
if (fs.existsSync(resolved.worktreePath)) {
|
|
205
213
|
(0, git_1.removeWorktree)(resolved.worktreePath, (command) => log(`Running: ${command}`));
|
|
206
214
|
}
|
|
@@ -214,6 +222,7 @@ async function removeCommand(rawTargets, options) {
|
|
|
214
222
|
worktreePath: resolved.worktreePath,
|
|
215
223
|
dbName: resolved.dbName,
|
|
216
224
|
dbDropped: !options.keepDb,
|
|
225
|
+
redisContainerRemoved,
|
|
217
226
|
});
|
|
218
227
|
}
|
|
219
228
|
catch (err) {
|
|
@@ -246,6 +255,7 @@ async function removeCommand(rawTargets, options) {
|
|
|
246
255
|
for (const item of removed) {
|
|
247
256
|
console.log(` Slot ${item.slot}: ${item.worktreePath}`);
|
|
248
257
|
console.log(` Database: ${item.dbName} ${item.dbDropped ? '(dropped)' : '(kept)'}`);
|
|
258
|
+
console.log(` Redis: ${item.redisContainerRemoved ? '(removed)' : '(not found)'}`);
|
|
249
259
|
}
|
|
250
260
|
}
|
|
251
261
|
if (failed.length > 0) {
|
|
@@ -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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkEA,gDAKC;AA0CD,sCAsMC;AAvTD,gDAAkC;AAClC,4CAA8B;AAC9B,+CAA6F;AAC7F,+CAAgD;AAChD,yDAAsF;AACtF,qCAKqB;AACrB,mCAAqC;AACrC,sCAAuD;AAUvD,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;AA2BD;;;;;;;GAOG;AACH,SAAgB,kBAAkB,CAAC,UAA6B;IAC9D,OAAO,UAAU;SACd,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;SAC5C,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;SAC9B,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAC3C,CAAC;AAED,SAAS,eAAe,CAAC,MAAc;IACrC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACzC,OAAO,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;AAClD,CAAC;AAED,SAAS,aAAa,CACpB,QAAkB,EAClB,MAAc;IAEd,MAAM,IAAI,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IACrC,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QAClB,MAAM,UAAU,GAAG,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QACtD,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,EAAE,KAAK,EAAE,gCAAgC,IAAI,GAAG,EAAE,CAAC;QAC5D,CAAC;QACD,OAAO;YACL,IAAI;YACJ,YAAY,EAAE,UAAU,CAAC,YAAY;YACrC,MAAM,EAAE,UAAU,CAAC,MAAM;YACzB,kBAAkB,EAAE,UAAU,CAAC,kBAAkB;SAClD,CAAC;IACJ,CAAC;IAED,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC1C,MAAM,KAAK,GAAG,IAAA,qBAAU,EAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IACjD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,EAAE,KAAK,EAAE,iCAAiC,YAAY,EAAE,EAAE,CAAC;IACpE,CAAC;IACD,OAAO;QACL,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;QACd,YAAY,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY;QACnC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM;QACvB,kBAAkB,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,kBAAkB;KAChD,CAAC;AACJ,CAAC;AAED,0EAA0E;AACnE,KAAK,UAAU,aAAa,CACjC,UAA6B,EAC7B,OAAsB;IAEtB,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI;QACtB,CAAC,CAAC,GAAG,EAAE,GAAE,CAAC;QACV,CAAC,CAAC,CAAC,OAAe,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,IAAI,CAAC,CAAC;IAE9D,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,IAAA,yBAAmB,GAAE,CAAC;QACvC,IAAI,QAAQ,GAAG,IAAA,uBAAY,EAAC,QAAQ,CAAC,CAAC;QACtC,MAAM,aAAa,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC;QAErD,IAAI,OAAO,CAAC,GAAG,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5C,MAAM,GAAG,GAAG,iDAAiD,CAAC;YAC9D,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;gBACjB,OAAO,CAAC,GAAG,CAAC,IAAA,mBAAU,EAAC,IAAA,cAAK,EAAC,cAAc,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;YACtD,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACrB,CAAC;YACD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QAED,IAAI,OAAiB,CAAC;QACtB,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;YAChB,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YAClF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACzB,MAAM,KAAK,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;gBAC1C,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;oBACjB,OAAO,CAAC,GAAG,CAAC,IAAA,mBAAU,EAAC,IAAA,gBAAO,EAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBAC1C,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;gBAChD,CAAC;gBACD,OAAO;YACT,CAAC;YACD,GAAG,CAAC,6BAA6B,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACzD,CAAC;aAAM,CAAC;YACN,OAAO,GAAG,aAAa,CAAC;YACxB,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACzB,MAAM,GAAG,GAAG,2CAA2C,CAAC;gBACxD,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;oBACjB,OAAO,CAAC,GAAG,CAAC,IAAA,mBAAU,EAAC,IAAA,cAAK,EAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;gBACxD,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBACrB,CAAC;gBACD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;gBACrB,OAAO;YACT,CAAC;QACH,CAAC;QAED,MAAM,MAAM,GAAG,IAAA,kBAAU,EAAC,QAAQ,CAAC,CAAC;QACpC,MAAM,mBAAmB,GAAG,IAAA,gCAAgB,EAAC,MAAM,CAAC,CAAC;QACrD,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM;YAC9B,CAAC,CAAC,IAAI;YACN,CAAC,CAAC;gBACA,WAAW,EAAE,eAAe,CAAC,QAAQ,CAAC;gBACtC,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;aAC1C,CAAC;QACJ,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;QACpC,MAAM,OAAO,GAAoB,EAAE,CAAC;QACpC,MAAM,MAAM,GAAoB,EAAE,CAAC;QAEnC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,QAAQ,GAAG,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YACjD,IAAI,OAAO,IAAI,QAAQ,EAAE,CAAC;gBACxB,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;gBACjD,SAAS;YACX,CAAC;YACD,IAAI,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBACjC,SAAS;YACX,CAAC;YACD,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAE7B,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;gBAC3D,MAAM,OAAO,GAAG,IAAA,2BAAqB,EAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;gBAC7D,MAAM,EAAE,eAAe,EAAE,UAAU,EAAE,GAAG,IAAA,uBAAiB,EAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;gBAEjF,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,IAAI,UAAU,EAAE,CAAC;oBACnE,MAAM,OAAO,GAAa,EAAE,CAAC;oBAC7B,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBACvB,OAAO,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;wBACvC,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;4BAC3B,OAAO,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;wBAC9B,CAAC;oBACH,CAAC;oBACD,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBAC/B,OAAO,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;wBACpC,KAAK,MAAM,IAAI,IAAI,eAAe,EAAE,CAAC;4BACnC,OAAO,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;wBAC9B,CAAC;oBACH,CAAC;oBACD,IAAI,UAAU,EAAE,CAAC;wBACf,OAAO,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC;oBAC5D,CAAC;oBACD,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBAClC,MAAM,CAAC,IAAI,CAAC;wBACV,MAAM;wBACN,OAAO,EAAE,2DAA2D,MAAM,EAAE;qBAC7E,CAAC,CAAC;oBACH,SAAS;gBACX,CAAC;YACH,CAAC;YAED,IAAI,CAAC;gBACH,GAAG,CAAC,iBAAiB,QAAQ,CAAC,IAAI,KAAK,QAAQ,CAAC,YAAY,GAAG,CAAC,CAAC;gBAEjE,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;oBACvB,MAAM,IAAA,uBAAY,EAChB,SAAS,CAAC,WAAW,EACrB,QAAQ,CAAC,MAAM,EACf,SAAS,CAAC,gBAAgB,EAC1B,CAAC,SAAS,EAAE,EAAE,CAAC,GAAG,CAAC,gBAAgB,SAAS,EAAE,CAAC,CAChD,CAAC;gBACJ,CAAC;qBAAM,CAAC;oBACN,GAAG,CAAC,+BAA+B,QAAQ,CAAC,MAAM,gBAAgB,CAAC,CAAC;gBACtE,CAAC;gBAED,MAAM,qBAAqB,GAAG,mBAAmB,IAAI,QAAQ,CAAC,kBAAkB,KAAK,SAAS;oBAC5F,CAAC,CAAC,IAAA,2CAA2B,EAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC;oBAC3D,CAAC,CAAC,KAAK,CAAC;gBAEV,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;oBACzC,IAAA,oBAAc,EACZ,QAAQ,CAAC,YAAY,EACrB,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,CAAC,YAAY,OAAO,EAAE,CAAC,CACxC,CAAC;gBACJ,CAAC;qBAAM,CAAC;oBACN,GAAG,CAAC,iDAAiD,QAAQ,CAAC,YAAY,EAAE,CAAC,CAAC;gBAChF,CAAC;gBAED,QAAQ,GAAG,IAAA,2BAAgB,EAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;gBACrD,OAAO,CAAC,IAAI,CAAC;oBACX,MAAM;oBACN,IAAI,EAAE,QAAQ,CAAC,IAAI;oBACnB,YAAY,EAAE,QAAQ,CAAC,YAAY;oBACnC,MAAM,EAAE,QAAQ,CAAC,MAAM;oBACvB,SAAS,EAAE,CAAC,OAAO,CAAC,MAAM;oBAC1B,qBAAqB;iBACtB,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACjE,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;YACnC,CAAC;QACH,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,IAAA,wBAAa,EAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACpC,CAAC;QAED,MAAM,OAAO,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QACpC,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACxB,OAAO,CAAC,GAAG,CAAC,IAAA,mBAAU,EAAC,IAAA,gBAAO,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAC5C,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CACT,IAAA,mBAAU,EAAC;oBACT,OAAO,EAAE,KAAK;oBACd,IAAI,EAAE,OAAO;oBACb,KAAK,EAAE;wBACL,IAAI,EAAE,gBAAgB;wBACtB,OAAO,EAAE,oBAAoB,MAAM,CAAC,MAAM,aAAa;qBACxD;iBACF,CAAC,CACH,CAAC;YACJ,CAAC;QACH,CAAC;aAAM,CAAC;YACN,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvB,OAAO,CAAC,GAAG,CAAC,WAAW,OAAO,CAAC,MAAM,eAAe,CAAC,CAAC;gBACtD,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;oBAC3B,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;oBACzD,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;oBACvF,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC;gBACxF,CAAC;YACH,CAAC;YACD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtB,OAAO,CAAC,KAAK,CAAC,oBAAoB,MAAM,CAAC,MAAM,aAAa,CAAC,CAAC;gBAC9D,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;oBAC1B,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;gBACrD,CAAC;YACH,CAAC;YACD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAChD,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;YAChD,CAAC;QACH,CAAC;QAED,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,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,eAAe,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;QAC3D,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,iCAAiC,OAAO,EAAE,CAAC,CAAC;QAC5D,CAAC;QACD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC"}
|
package/dist/commands/setup.js
CHANGED
|
@@ -43,13 +43,126 @@ const registry_1 = require("../core/registry");
|
|
|
43
43
|
const slot_allocator_1 = require("../core/slot-allocator");
|
|
44
44
|
const env_patcher_1 = require("../core/env-patcher");
|
|
45
45
|
const database_1 = require("../core/database");
|
|
46
|
+
const managed_redis_1 = require("../core/managed-redis");
|
|
46
47
|
const git_1 = require("../core/git");
|
|
47
48
|
const output_1 = require("../output");
|
|
49
|
+
function isRecord(value) {
|
|
50
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
51
|
+
}
|
|
52
|
+
function readPatchedEnvVar(mainRoot, source, varName) {
|
|
53
|
+
const envPath = path.join(mainRoot, source);
|
|
54
|
+
if (!fs.existsSync(envPath)) {
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
const content = fs.readFileSync(envPath, 'utf-8');
|
|
58
|
+
const match = content.match(new RegExp(`^${varName}=["']?([^"'\\n]+)`, 'm'));
|
|
59
|
+
return match?.[1] ?? null;
|
|
60
|
+
}
|
|
61
|
+
function inferLegacyRedisDefaultPort(mainRoot, envFiles) {
|
|
62
|
+
for (const envFile of envFiles) {
|
|
63
|
+
if (!isRecord(envFile) || typeof envFile.source !== 'string' || !Array.isArray(envFile.patches)) {
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
for (const patch of envFile.patches) {
|
|
67
|
+
if (!isRecord(patch) || patch.type !== 'redis' || typeof patch.var !== 'string') {
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
const sourceUrl = readPatchedEnvVar(mainRoot, envFile.source, patch.var);
|
|
71
|
+
if (!sourceUrl) {
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
try {
|
|
75
|
+
const parsed = new URL(sourceUrl);
|
|
76
|
+
return Number(parsed.port) || 6379;
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
return 6379;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return 6379;
|
|
84
|
+
}
|
|
85
|
+
function migrateLegacyConfig(mainRoot, raw) {
|
|
86
|
+
if (!isRecord(raw)) {
|
|
87
|
+
return { config: raw, migrated: false };
|
|
88
|
+
}
|
|
89
|
+
const next = JSON.parse(JSON.stringify(raw));
|
|
90
|
+
const envFiles = Array.isArray(next.envFiles) ? next.envFiles : [];
|
|
91
|
+
const services = Array.isArray(next.services) ? [...next.services] : [];
|
|
92
|
+
const redisServiceNames = new Set();
|
|
93
|
+
let migrated = false;
|
|
94
|
+
for (const envFile of envFiles) {
|
|
95
|
+
if (!isRecord(envFile) || !Array.isArray(envFile.patches)) {
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
for (const patch of envFile.patches) {
|
|
99
|
+
if (!isRecord(patch) || patch.type !== 'redis') {
|
|
100
|
+
continue;
|
|
101
|
+
}
|
|
102
|
+
const serviceName = typeof patch.service === 'string' && patch.service.length > 0
|
|
103
|
+
? patch.service
|
|
104
|
+
: 'redis';
|
|
105
|
+
if (patch.service !== serviceName) {
|
|
106
|
+
patch.service = serviceName;
|
|
107
|
+
migrated = true;
|
|
108
|
+
}
|
|
109
|
+
redisServiceNames.add(serviceName);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
if (redisServiceNames.size > 0) {
|
|
113
|
+
const declaredServiceNames = new Set(services
|
|
114
|
+
.filter(isRecord)
|
|
115
|
+
.map((service) => (typeof service.name === 'string' ? service.name : null))
|
|
116
|
+
.filter((name) => name !== null));
|
|
117
|
+
const inferredRedisPort = inferLegacyRedisDefaultPort(mainRoot, envFiles);
|
|
118
|
+
for (const serviceName of redisServiceNames) {
|
|
119
|
+
if (declaredServiceNames.has(serviceName)) {
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
services.push({
|
|
123
|
+
name: serviceName,
|
|
124
|
+
defaultPort: inferredRedisPort,
|
|
125
|
+
});
|
|
126
|
+
declaredServiceNames.add(serviceName);
|
|
127
|
+
migrated = true;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
if (migrated) {
|
|
131
|
+
next.services = services;
|
|
132
|
+
}
|
|
133
|
+
return { config: next, migrated };
|
|
134
|
+
}
|
|
135
|
+
function validateConfig(config) {
|
|
136
|
+
const services = (0, managed_redis_1.getAllocationServices)(config);
|
|
137
|
+
const seenServiceNames = new Set();
|
|
138
|
+
for (const service of services) {
|
|
139
|
+
if (seenServiceNames.has(service.name)) {
|
|
140
|
+
throw new Error(`Duplicate service name in wt.config.json: ${service.name}`);
|
|
141
|
+
}
|
|
142
|
+
seenServiceNames.add(service.name);
|
|
143
|
+
}
|
|
144
|
+
for (const envFile of config.envFiles) {
|
|
145
|
+
for (const patch of envFile.patches) {
|
|
146
|
+
if ('service' in patch && !seenServiceNames.has(patch.service)) {
|
|
147
|
+
throw new Error(`Patch '${patch.var}' references unknown service '${patch.service}'.`);
|
|
148
|
+
}
|
|
149
|
+
if (patch.type === 'redis' && patch.service !== 'redis') {
|
|
150
|
+
throw new Error(`Redis patch '${patch.var}' must use service name 'redis', got '${patch.service}'.`);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
(0, slot_allocator_1.validatePortPlan)(services, config.maxSlots, config.portStride);
|
|
155
|
+
return config;
|
|
156
|
+
}
|
|
48
157
|
/** Load and validate wt.config.json from the main worktree */
|
|
49
158
|
function loadConfig(mainRoot) {
|
|
50
159
|
const configPath = path.join(mainRoot, 'wt.config.json');
|
|
51
|
-
const raw =
|
|
52
|
-
|
|
160
|
+
const raw = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
|
|
161
|
+
const { config, migrated } = migrateLegacyConfig(mainRoot, raw);
|
|
162
|
+
if (migrated) {
|
|
163
|
+
fs.writeFileSync(configPath, JSON.stringify(config, null, 2) + '\n', 'utf-8');
|
|
164
|
+
}
|
|
165
|
+
return validateConfig(config_schema_1.configSchema.parse(config));
|
|
53
166
|
}
|
|
54
167
|
/**
|
|
55
168
|
* Read DATABASE_URL from the main worktree's .env file.
|
|
@@ -81,6 +194,7 @@ async function setupCommand(targetPath, options) {
|
|
|
81
194
|
return;
|
|
82
195
|
}
|
|
83
196
|
const config = loadConfig(mainRoot);
|
|
197
|
+
const services = (0, managed_redis_1.getAllocationServices)(config);
|
|
84
198
|
let registry = (0, registry_1.readRegistry)(mainRoot);
|
|
85
199
|
// Reuse existing allocation or allocate a new slot
|
|
86
200
|
const existing = (0, registry_1.findByPath)(registry, worktreePath);
|
|
@@ -89,9 +203,10 @@ async function setupCommand(targetPath, options) {
|
|
|
89
203
|
slot = existing[0];
|
|
90
204
|
}
|
|
91
205
|
else {
|
|
92
|
-
const available = (0, slot_allocator_1.
|
|
206
|
+
const available = await (0, slot_allocator_1.findAvailablePortSafeSlot)(registry, config.maxSlots, services, config.portStride);
|
|
93
207
|
if (available === null) {
|
|
94
|
-
const msg = `All ${config.maxSlots} slots are occupied
|
|
208
|
+
const msg = `All ${config.maxSlots} slots are occupied or blocked by ports already in use. ` +
|
|
209
|
+
'Remove a worktree, stop conflicting services, or increase maxSlots.';
|
|
95
210
|
if (options.json) {
|
|
96
211
|
console.log((0, output_1.formatJson)((0, output_1.error)('NO_SLOTS', msg)));
|
|
97
212
|
}
|
|
@@ -104,8 +219,30 @@ async function setupCommand(targetPath, options) {
|
|
|
104
219
|
slot = available;
|
|
105
220
|
}
|
|
106
221
|
const dbName = (0, slot_allocator_1.calculateDbName)(slot, config.baseDatabaseName);
|
|
107
|
-
const ports = (0, slot_allocator_1.calculatePorts)(slot,
|
|
222
|
+
const ports = (0, slot_allocator_1.calculatePorts)(slot, services, config.portStride);
|
|
223
|
+
if (!existing) {
|
|
224
|
+
const unavailablePorts = await (0, slot_allocator_1.findUnavailableServicePorts)(ports);
|
|
225
|
+
if (unavailablePorts.length > 0) {
|
|
226
|
+
const detail = unavailablePorts
|
|
227
|
+
.map(({ service, port }) => `${service}:${port}`)
|
|
228
|
+
.join(', ');
|
|
229
|
+
throw new Error(`Slot ${slot} has ports already in use: ${detail}`);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
108
232
|
const branchName = (0, git_1.getBranchName)(worktreePath);
|
|
233
|
+
const redisSourceUrl = (0, managed_redis_1.usesManagedRedis)(config)
|
|
234
|
+
? (0, managed_redis_1.readManagedRedisSourceUrl)(mainRoot, config)
|
|
235
|
+
: null;
|
|
236
|
+
const redisContainerName = (0, managed_redis_1.usesManagedRedis)(config)
|
|
237
|
+
? (0, managed_redis_1.ensureManagedRedisContainer)({
|
|
238
|
+
mainRoot,
|
|
239
|
+
slot,
|
|
240
|
+
branchName,
|
|
241
|
+
worktreePath,
|
|
242
|
+
port: ports.redis,
|
|
243
|
+
sourceUrl: redisSourceUrl,
|
|
244
|
+
})
|
|
245
|
+
: undefined;
|
|
109
246
|
// Create database if it doesn't exist
|
|
110
247
|
const databaseUrl = readDatabaseUrl(mainRoot);
|
|
111
248
|
const dbAlreadyExists = await (0, database_1.databaseExists)(databaseUrl, dbName);
|
|
@@ -115,7 +252,7 @@ async function setupCommand(targetPath, options) {
|
|
|
115
252
|
// Copy and patch env files
|
|
116
253
|
(0, env_patcher_1.copyAndPatchAllEnvFiles)(config, mainRoot, worktreePath, {
|
|
117
254
|
dbName,
|
|
118
|
-
|
|
255
|
+
redisPort: ports.redis,
|
|
119
256
|
ports,
|
|
120
257
|
});
|
|
121
258
|
// Update registry
|
|
@@ -123,7 +260,7 @@ async function setupCommand(targetPath, options) {
|
|
|
123
260
|
worktreePath,
|
|
124
261
|
branchName,
|
|
125
262
|
dbName,
|
|
126
|
-
|
|
263
|
+
redisContainerName,
|
|
127
264
|
ports,
|
|
128
265
|
createdAt: new Date().toISOString(),
|
|
129
266
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"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"}
|
package/dist/core/env-patcher.js
CHANGED
|
@@ -37,6 +37,7 @@ exports.patchEnvContent = patchEnvContent;
|
|
|
37
37
|
exports.copyAndPatchAllEnvFiles = copyAndPatchAllEnvFiles;
|
|
38
38
|
const fs = __importStar(require("node:fs"));
|
|
39
39
|
const path = __importStar(require("node:path"));
|
|
40
|
+
const managed_redis_1 = require("./managed-redis");
|
|
40
41
|
/**
|
|
41
42
|
* Apply a single patch to an env var value.
|
|
42
43
|
* Returns the transformed value or the original if no transformation applies.
|
|
@@ -46,7 +47,7 @@ function applyPatch(value, patch, context) {
|
|
|
46
47
|
case 'database':
|
|
47
48
|
return patchDatabaseUrl(value, context.dbName);
|
|
48
49
|
case 'redis':
|
|
49
|
-
return patchRedisUrl(value, context
|
|
50
|
+
return patchRedisUrl(value, context);
|
|
50
51
|
case 'port':
|
|
51
52
|
return patchPort(patch, context);
|
|
52
53
|
case 'url':
|
|
@@ -61,15 +62,14 @@ function patchDatabaseUrl(url, dbName) {
|
|
|
61
62
|
return url.replace(/\/([^/?]+)(\?|$)/, `/${dbName}$2`);
|
|
62
63
|
}
|
|
63
64
|
/**
|
|
64
|
-
*
|
|
65
|
-
*
|
|
66
|
-
* Also handles missing index: redis://...6379 → redis://...6379/3
|
|
65
|
+
* Rewrite a Redis URL to point at the managed per-worktree Redis container.
|
|
66
|
+
* The managed Redis always runs locally on DB 0.
|
|
67
67
|
*/
|
|
68
|
-
function patchRedisUrl(url,
|
|
69
|
-
if (
|
|
70
|
-
|
|
68
|
+
function patchRedisUrl(url, context) {
|
|
69
|
+
if (context.redisPort === undefined) {
|
|
70
|
+
throw new Error('Redis patch requires an allocated redis service port.');
|
|
71
71
|
}
|
|
72
|
-
return
|
|
72
|
+
return (0, managed_redis_1.patchManagedRedisUrl)(url, context.redisPort);
|
|
73
73
|
}
|
|
74
74
|
/** Replace port value entirely with the allocated port for the service */
|
|
75
75
|
function patchPort(patch, context) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"env-patcher.js","sourceRoot":"","sources":["../../src/core/env-patcher.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
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,4 +1,8 @@
|
|
|
1
1
|
type CommandLogger = (command: string) => void;
|
|
2
|
+
export interface PrunableWorktree {
|
|
3
|
+
readonly path: string;
|
|
4
|
+
readonly reason: string;
|
|
5
|
+
}
|
|
2
6
|
/**
|
|
3
7
|
* Get the main (bare) worktree path from git.
|
|
4
8
|
* Parses `git worktree list --porcelain` to find the first entry.
|
|
@@ -25,4 +29,8 @@ export declare function getUnsyncedStatus(worktreePath: string): {
|
|
|
25
29
|
unpushedCommits: string[];
|
|
26
30
|
noUpstream: boolean;
|
|
27
31
|
};
|
|
32
|
+
/** List worktrees that Git currently marks as prunable. */
|
|
33
|
+
export declare function listPrunableWorktrees(): PrunableWorktree[];
|
|
34
|
+
/** Remove Git metadata for prunable worktrees. */
|
|
35
|
+
export declare function pruneWorktrees(logCommand?: CommandLogger): void;
|
|
28
36
|
export {};
|
package/dist/core/git.js
CHANGED
|
@@ -40,6 +40,8 @@ exports.removeWorktree = removeWorktree;
|
|
|
40
40
|
exports.getBranchName = getBranchName;
|
|
41
41
|
exports.getUncommittedChanges = getUncommittedChanges;
|
|
42
42
|
exports.getUnsyncedStatus = getUnsyncedStatus;
|
|
43
|
+
exports.listPrunableWorktrees = listPrunableWorktrees;
|
|
44
|
+
exports.pruneWorktrees = pruneWorktrees;
|
|
43
45
|
const node_child_process_1 = require("node:child_process");
|
|
44
46
|
const path = __importStar(require("node:path"));
|
|
45
47
|
/**
|
|
@@ -118,6 +120,36 @@ function getUnsyncedStatus(worktreePath) {
|
|
|
118
120
|
return { unpushedCommits: [], noUpstream: true };
|
|
119
121
|
}
|
|
120
122
|
}
|
|
123
|
+
/** List worktrees that Git currently marks as prunable. */
|
|
124
|
+
function listPrunableWorktrees() {
|
|
125
|
+
const output = (0, node_child_process_1.execSync)('git worktree list --porcelain', {
|
|
126
|
+
encoding: 'utf-8',
|
|
127
|
+
});
|
|
128
|
+
const blocks = output
|
|
129
|
+
.split('\n\n')
|
|
130
|
+
.map((block) => block.trim())
|
|
131
|
+
.filter((block) => block.length > 0);
|
|
132
|
+
const prunable = [];
|
|
133
|
+
for (const block of blocks) {
|
|
134
|
+
const lines = block.split('\n');
|
|
135
|
+
const worktreeLine = lines.find((line) => line.startsWith('worktree '));
|
|
136
|
+
const prunableLine = lines.find((line) => line.startsWith('prunable '));
|
|
137
|
+
if (!worktreeLine || !prunableLine) {
|
|
138
|
+
continue;
|
|
139
|
+
}
|
|
140
|
+
prunable.push({
|
|
141
|
+
path: worktreeLine.replace('worktree ', ''),
|
|
142
|
+
reason: prunableLine.replace('prunable ', ''),
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
return prunable;
|
|
146
|
+
}
|
|
147
|
+
/** Remove Git metadata for prunable worktrees. */
|
|
148
|
+
function pruneWorktrees(logCommand) {
|
|
149
|
+
const command = 'git worktree prune --verbose';
|
|
150
|
+
logCommand?.(command);
|
|
151
|
+
(0, node_child_process_1.execSync)(command, { stdio: 'pipe' });
|
|
152
|
+
}
|
|
121
153
|
/** Check if a branch exists locally */
|
|
122
154
|
function branchExistsLocally(branchName) {
|
|
123
155
|
try {
|