flaio-cli 1.0.3 → 1.0.4
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/dist/agents/agent-session.d.ts +1 -0
- package/dist/agents/agent-session.d.ts.map +1 -1
- package/dist/agents/agent-session.js +1 -0
- package/dist/agents/agent-session.js.map +1 -1
- package/dist/agents/drivers/base-driver.d.ts +7 -0
- package/dist/agents/drivers/base-driver.d.ts.map +1 -1
- package/dist/agents/drivers/base-driver.js.map +1 -1
- package/dist/agents/drivers/claude-driver.d.ts +3 -1
- package/dist/agents/drivers/claude-driver.d.ts.map +1 -1
- package/dist/agents/drivers/claude-driver.js +10 -0
- package/dist/agents/drivers/claude-driver.js.map +1 -1
- package/dist/agents/drivers/gemini-driver.d.ts +3 -1
- package/dist/agents/drivers/gemini-driver.d.ts.map +1 -1
- package/dist/agents/drivers/gemini-driver.js +9 -0
- package/dist/agents/drivers/gemini-driver.js.map +1 -1
- package/dist/config/config.d.ts +37 -0
- package/dist/config/config.d.ts.map +1 -1
- package/dist/config/config.js +6 -0
- package/dist/config/config.js.map +1 -1
- package/dist/relay/relay-client.d.ts.map +1 -1
- package/dist/relay/relay-client.js +108 -18
- package/dist/relay/relay-client.js.map +1 -1
- package/dist/relay/relay-message-schemas.d.ts +18 -0
- package/dist/relay/relay-message-schemas.d.ts.map +1 -1
- package/dist/relay/relay-message-schemas.js +6 -0
- package/dist/relay/relay-message-schemas.js.map +1 -1
- package/dist/relay/relay-protocol.d.ts +13 -0
- package/dist/relay/relay-protocol.d.ts.map +1 -1
- package/dist/relay/relay-protocol.js.map +1 -1
- package/dist/relay/ticket-tracker.d.ts +12 -2
- package/dist/relay/ticket-tracker.d.ts.map +1 -1
- package/dist/relay/ticket-tracker.js +36 -5
- package/dist/relay/ticket-tracker.js.map +1 -1
- package/dist/relay/worktree-manager.d.ts +43 -0
- package/dist/relay/worktree-manager.d.ts.map +1 -0
- package/dist/relay/worktree-manager.js +259 -0
- package/dist/relay/worktree-manager.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
export interface WorktreeEntry {
|
|
2
|
+
ticketId: string;
|
|
3
|
+
branchName: string;
|
|
4
|
+
worktreePath: string;
|
|
5
|
+
projectCwd: string;
|
|
6
|
+
createdAt: number;
|
|
7
|
+
}
|
|
8
|
+
export interface WorktreeManifest {
|
|
9
|
+
worktrees: Record<string, WorktreeEntry>;
|
|
10
|
+
}
|
|
11
|
+
export interface WorktreeInfo {
|
|
12
|
+
worktreePath: string;
|
|
13
|
+
branchName: string;
|
|
14
|
+
}
|
|
15
|
+
/** Sanitize a string for use as a git branch segment */
|
|
16
|
+
export declare function sanitizeBranchSegment(input: string): string;
|
|
17
|
+
export declare function getManifest(repoRoot: string): WorktreeManifest;
|
|
18
|
+
/**
|
|
19
|
+
* Create a git worktree for a ticket. Idempotent — returns existing worktree if one exists.
|
|
20
|
+
* Returns null if cwd is not a git repo.
|
|
21
|
+
*/
|
|
22
|
+
export declare function createWorktree(cwd: string, ticketId: string): Promise<WorktreeInfo | null>;
|
|
23
|
+
/**
|
|
24
|
+
* Auto-save uncommitted changes in a worktree with a WIP commit.
|
|
25
|
+
* Returns true if a WIP commit was created.
|
|
26
|
+
*/
|
|
27
|
+
export declare function autoSaveWorktree(worktreePath: string, ticketId: string): Promise<boolean>;
|
|
28
|
+
/**
|
|
29
|
+
* Remove a worktree. Auto-commits dirty changes first.
|
|
30
|
+
* By default keeps the branch (for PR creation).
|
|
31
|
+
*/
|
|
32
|
+
export declare function removeWorktree(cwd: string, ticketId: string, deleteBranch?: boolean): Promise<void>;
|
|
33
|
+
/**
|
|
34
|
+
* Auto-save all tracked worktrees for a given project directory.
|
|
35
|
+
* Called during graceful CLI shutdown.
|
|
36
|
+
*/
|
|
37
|
+
export declare function autoSaveAllWorktrees(projectCwd: string): Promise<void>;
|
|
38
|
+
/**
|
|
39
|
+
* Validate manifest entries against disk state. Prune stale entries.
|
|
40
|
+
* Called on CLI startup.
|
|
41
|
+
*/
|
|
42
|
+
export declare function pruneStaleEntries(projectCwd: string): Promise<void>;
|
|
43
|
+
//# sourceMappingURL=worktree-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worktree-manager.d.ts","sourceRoot":"","sources":["../../src/relay/worktree-manager.ts"],"names":[],"mappings":"AAiBA,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;CAC1C;AAED,MAAM,WAAW,YAAY;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB;AAMD,wDAAwD;AACxD,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAO3D;AAwBD,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,gBAAgB,CAW9D;AAaD;;;GAGG;AACH,wBAAsB,cAAc,CAClC,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAsE9B;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,OAAO,CAAC,CAelB;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAClC,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,YAAY,UAAQ,GACnB,OAAO,CAAC,IAAI,CAAC,CAgDf;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAe5E;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA4BzE"}
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// WorktreeManager — git worktree lifecycle for per-ticket isolation
|
|
3
|
+
// ---------------------------------------------------------------------------
|
|
4
|
+
import { execFile as execFileCb } from "node:child_process";
|
|
5
|
+
import { promisify } from "node:util";
|
|
6
|
+
import fs from "node:fs";
|
|
7
|
+
import path from "node:path";
|
|
8
|
+
import { makeDebugLog } from "../connectors/debug.js";
|
|
9
|
+
const execFile = promisify(execFileCb);
|
|
10
|
+
const debugLog = makeDebugLog("worktree");
|
|
11
|
+
// ---------------------------------------------------------------------------
|
|
12
|
+
// Helpers
|
|
13
|
+
// ---------------------------------------------------------------------------
|
|
14
|
+
/** Sanitize a string for use as a git branch segment */
|
|
15
|
+
export function sanitizeBranchSegment(input) {
|
|
16
|
+
return input
|
|
17
|
+
.toLowerCase()
|
|
18
|
+
.replace(/[^a-z0-9-]/g, "-")
|
|
19
|
+
.replace(/-+/g, "-")
|
|
20
|
+
.replace(/^-|-$/g, "")
|
|
21
|
+
.slice(0, 50);
|
|
22
|
+
}
|
|
23
|
+
async function isGitRepo(cwd) {
|
|
24
|
+
try {
|
|
25
|
+
await execFile("git", ["rev-parse", "--is-inside-work-tree"], { cwd });
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
async function getRepoRoot(cwd) {
|
|
33
|
+
const { stdout } = await execFile("git", ["rev-parse", "--show-toplevel"], { cwd });
|
|
34
|
+
return stdout.trim();
|
|
35
|
+
}
|
|
36
|
+
function manifestPath(repoRoot) {
|
|
37
|
+
return path.join(repoRoot, ".flaio", "worktrees", "manifest.json");
|
|
38
|
+
}
|
|
39
|
+
// ---------------------------------------------------------------------------
|
|
40
|
+
// Manifest I/O
|
|
41
|
+
// ---------------------------------------------------------------------------
|
|
42
|
+
export function getManifest(repoRoot) {
|
|
43
|
+
const p = manifestPath(repoRoot);
|
|
44
|
+
try {
|
|
45
|
+
if (fs.existsSync(p)) {
|
|
46
|
+
const raw = JSON.parse(fs.readFileSync(p, "utf-8"));
|
|
47
|
+
return raw;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
catch (err) {
|
|
51
|
+
debugLog(`worktree: failed to read manifest: ${err}`);
|
|
52
|
+
}
|
|
53
|
+
return { worktrees: {} };
|
|
54
|
+
}
|
|
55
|
+
function writeManifest(repoRoot, manifest) {
|
|
56
|
+
const p = manifestPath(repoRoot);
|
|
57
|
+
const dir = path.dirname(p);
|
|
58
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
59
|
+
fs.writeFileSync(p, JSON.stringify(manifest, null, 2) + "\n", "utf-8");
|
|
60
|
+
}
|
|
61
|
+
// ---------------------------------------------------------------------------
|
|
62
|
+
// Core functions
|
|
63
|
+
// ---------------------------------------------------------------------------
|
|
64
|
+
/**
|
|
65
|
+
* Create a git worktree for a ticket. Idempotent — returns existing worktree if one exists.
|
|
66
|
+
* Returns null if cwd is not a git repo.
|
|
67
|
+
*/
|
|
68
|
+
export async function createWorktree(cwd, ticketId) {
|
|
69
|
+
try {
|
|
70
|
+
if (!(await isGitRepo(cwd))) {
|
|
71
|
+
debugLog(`worktree: ${cwd} is not a git repo, skipping worktree creation`);
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
const repoRoot = await getRepoRoot(cwd);
|
|
75
|
+
const sanitized = sanitizeBranchSegment(ticketId);
|
|
76
|
+
const branchName = `ticket/${sanitized}`;
|
|
77
|
+
const worktreePath = path.join(repoRoot, ".flaio", "worktrees", sanitized);
|
|
78
|
+
// Check manifest first — if entry exists, validate and return
|
|
79
|
+
const manifest = getManifest(repoRoot);
|
|
80
|
+
const existing = manifest.worktrees[sanitized];
|
|
81
|
+
if (existing && fs.existsSync(existing.worktreePath)) {
|
|
82
|
+
debugLog(`worktree: reusing existing worktree for ${ticketId} at ${existing.worktreePath}`);
|
|
83
|
+
return { worktreePath: existing.worktreePath, branchName: existing.branchName };
|
|
84
|
+
}
|
|
85
|
+
// Check if the worktree directory already exists (e.g. from a previous run)
|
|
86
|
+
if (fs.existsSync(worktreePath)) {
|
|
87
|
+
debugLog(`worktree: directory exists at ${worktreePath}, reusing`);
|
|
88
|
+
// Update manifest
|
|
89
|
+
manifest.worktrees[sanitized] = {
|
|
90
|
+
ticketId,
|
|
91
|
+
branchName,
|
|
92
|
+
worktreePath,
|
|
93
|
+
projectCwd: repoRoot,
|
|
94
|
+
createdAt: Date.now(),
|
|
95
|
+
};
|
|
96
|
+
writeManifest(repoRoot, manifest);
|
|
97
|
+
return { worktreePath, branchName };
|
|
98
|
+
}
|
|
99
|
+
// Ensure parent directory exists
|
|
100
|
+
fs.mkdirSync(path.dirname(worktreePath), { recursive: true });
|
|
101
|
+
// Check if branch already exists
|
|
102
|
+
let branchExists = false;
|
|
103
|
+
try {
|
|
104
|
+
await execFile("git", ["rev-parse", "--verify", branchName], { cwd: repoRoot });
|
|
105
|
+
branchExists = true;
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
// Branch doesn't exist yet
|
|
109
|
+
}
|
|
110
|
+
if (branchExists) {
|
|
111
|
+
await execFile("git", ["worktree", "add", worktreePath, branchName], { cwd: repoRoot });
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
await execFile("git", ["worktree", "add", "-b", branchName, worktreePath], { cwd: repoRoot });
|
|
115
|
+
}
|
|
116
|
+
debugLog(`worktree: created worktree at ${worktreePath} on branch ${branchName}`);
|
|
117
|
+
// Write manifest entry
|
|
118
|
+
manifest.worktrees[sanitized] = {
|
|
119
|
+
ticketId,
|
|
120
|
+
branchName,
|
|
121
|
+
worktreePath,
|
|
122
|
+
projectCwd: repoRoot,
|
|
123
|
+
createdAt: Date.now(),
|
|
124
|
+
};
|
|
125
|
+
writeManifest(repoRoot, manifest);
|
|
126
|
+
return { worktreePath, branchName };
|
|
127
|
+
}
|
|
128
|
+
catch (err) {
|
|
129
|
+
debugLog(`worktree: createWorktree failed: ${err}`);
|
|
130
|
+
return null;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Auto-save uncommitted changes in a worktree with a WIP commit.
|
|
135
|
+
* Returns true if a WIP commit was created.
|
|
136
|
+
*/
|
|
137
|
+
export async function autoSaveWorktree(worktreePath, ticketId) {
|
|
138
|
+
try {
|
|
139
|
+
const { stdout } = await execFile("git", ["status", "--porcelain"], { cwd: worktreePath });
|
|
140
|
+
if (!stdout.trim())
|
|
141
|
+
return false;
|
|
142
|
+
await execFile("git", ["add", "-A"], { cwd: worktreePath });
|
|
143
|
+
await execFile("git", ["commit", "-m", `WIP: auto-save for ticket ${ticketId}`], {
|
|
144
|
+
cwd: worktreePath,
|
|
145
|
+
});
|
|
146
|
+
debugLog(`worktree: auto-saved uncommitted changes for ticket ${ticketId}`);
|
|
147
|
+
return true;
|
|
148
|
+
}
|
|
149
|
+
catch (err) {
|
|
150
|
+
debugLog(`worktree: autoSaveWorktree failed: ${err}`);
|
|
151
|
+
return false;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Remove a worktree. Auto-commits dirty changes first.
|
|
156
|
+
* By default keeps the branch (for PR creation).
|
|
157
|
+
*/
|
|
158
|
+
export async function removeWorktree(cwd, ticketId, deleteBranch = false) {
|
|
159
|
+
try {
|
|
160
|
+
if (!(await isGitRepo(cwd)))
|
|
161
|
+
return;
|
|
162
|
+
const repoRoot = await getRepoRoot(cwd);
|
|
163
|
+
const sanitized = sanitizeBranchSegment(ticketId);
|
|
164
|
+
const manifest = getManifest(repoRoot);
|
|
165
|
+
const entry = manifest.worktrees[sanitized];
|
|
166
|
+
if (!entry)
|
|
167
|
+
return;
|
|
168
|
+
// Auto-commit if dirty
|
|
169
|
+
if (fs.existsSync(entry.worktreePath)) {
|
|
170
|
+
await autoSaveWorktree(entry.worktreePath, ticketId);
|
|
171
|
+
// Remove the worktree
|
|
172
|
+
try {
|
|
173
|
+
await execFile("git", ["worktree", "remove", entry.worktreePath, "--force"], {
|
|
174
|
+
cwd: repoRoot,
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
catch (err) {
|
|
178
|
+
debugLog(`worktree: git worktree remove failed: ${err}`);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
// Optionally delete the branch
|
|
182
|
+
if (deleteBranch) {
|
|
183
|
+
try {
|
|
184
|
+
await execFile("git", ["branch", "-D", entry.branchName], { cwd: repoRoot });
|
|
185
|
+
}
|
|
186
|
+
catch (err) {
|
|
187
|
+
debugLog(`worktree: branch delete failed: ${err}`);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
// Prune stale worktrees
|
|
191
|
+
try {
|
|
192
|
+
await execFile("git", ["worktree", "prune"], { cwd: repoRoot });
|
|
193
|
+
}
|
|
194
|
+
catch {
|
|
195
|
+
// best effort
|
|
196
|
+
}
|
|
197
|
+
// Remove manifest entry
|
|
198
|
+
delete manifest.worktrees[sanitized];
|
|
199
|
+
writeManifest(repoRoot, manifest);
|
|
200
|
+
debugLog(`worktree: removed worktree for ticket ${ticketId}`);
|
|
201
|
+
}
|
|
202
|
+
catch (err) {
|
|
203
|
+
debugLog(`worktree: removeWorktree failed: ${err}`);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Auto-save all tracked worktrees for a given project directory.
|
|
208
|
+
* Called during graceful CLI shutdown.
|
|
209
|
+
*/
|
|
210
|
+
export async function autoSaveAllWorktrees(projectCwd) {
|
|
211
|
+
try {
|
|
212
|
+
if (!(await isGitRepo(projectCwd)))
|
|
213
|
+
return;
|
|
214
|
+
const repoRoot = await getRepoRoot(projectCwd);
|
|
215
|
+
const manifest = getManifest(repoRoot);
|
|
216
|
+
for (const [, entry] of Object.entries(manifest.worktrees)) {
|
|
217
|
+
if (entry.projectCwd === repoRoot && fs.existsSync(entry.worktreePath)) {
|
|
218
|
+
await autoSaveWorktree(entry.worktreePath, entry.ticketId);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
catch (err) {
|
|
223
|
+
debugLog(`worktree: autoSaveAllWorktrees failed: ${err}`);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Validate manifest entries against disk state. Prune stale entries.
|
|
228
|
+
* Called on CLI startup.
|
|
229
|
+
*/
|
|
230
|
+
export async function pruneStaleEntries(projectCwd) {
|
|
231
|
+
try {
|
|
232
|
+
if (!(await isGitRepo(projectCwd)))
|
|
233
|
+
return;
|
|
234
|
+
const repoRoot = await getRepoRoot(projectCwd);
|
|
235
|
+
const manifest = getManifest(repoRoot);
|
|
236
|
+
let changed = false;
|
|
237
|
+
for (const [key, entry] of Object.entries(manifest.worktrees)) {
|
|
238
|
+
if (!fs.existsSync(entry.worktreePath)) {
|
|
239
|
+
debugLog(`worktree: pruning stale manifest entry for ${entry.ticketId}`);
|
|
240
|
+
delete manifest.worktrees[key];
|
|
241
|
+
changed = true;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
if (changed) {
|
|
245
|
+
writeManifest(repoRoot, manifest);
|
|
246
|
+
// Also prune git's internal worktree references
|
|
247
|
+
try {
|
|
248
|
+
await execFile("git", ["worktree", "prune"], { cwd: repoRoot });
|
|
249
|
+
}
|
|
250
|
+
catch {
|
|
251
|
+
// best effort
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
catch (err) {
|
|
256
|
+
debugLog(`worktree: pruneStaleEntries failed: ${err}`);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
//# sourceMappingURL=worktree-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worktree-manager.js","sourceRoot":"","sources":["../../src/relay/worktree-manager.ts"],"names":[],"mappings":"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"}
|