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.
Files changed (38) hide show
  1. package/dist/agents/agent-session.d.ts +1 -0
  2. package/dist/agents/agent-session.d.ts.map +1 -1
  3. package/dist/agents/agent-session.js +1 -0
  4. package/dist/agents/agent-session.js.map +1 -1
  5. package/dist/agents/drivers/base-driver.d.ts +7 -0
  6. package/dist/agents/drivers/base-driver.d.ts.map +1 -1
  7. package/dist/agents/drivers/base-driver.js.map +1 -1
  8. package/dist/agents/drivers/claude-driver.d.ts +3 -1
  9. package/dist/agents/drivers/claude-driver.d.ts.map +1 -1
  10. package/dist/agents/drivers/claude-driver.js +10 -0
  11. package/dist/agents/drivers/claude-driver.js.map +1 -1
  12. package/dist/agents/drivers/gemini-driver.d.ts +3 -1
  13. package/dist/agents/drivers/gemini-driver.d.ts.map +1 -1
  14. package/dist/agents/drivers/gemini-driver.js +9 -0
  15. package/dist/agents/drivers/gemini-driver.js.map +1 -1
  16. package/dist/config/config.d.ts +37 -0
  17. package/dist/config/config.d.ts.map +1 -1
  18. package/dist/config/config.js +6 -0
  19. package/dist/config/config.js.map +1 -1
  20. package/dist/relay/relay-client.d.ts.map +1 -1
  21. package/dist/relay/relay-client.js +108 -18
  22. package/dist/relay/relay-client.js.map +1 -1
  23. package/dist/relay/relay-message-schemas.d.ts +18 -0
  24. package/dist/relay/relay-message-schemas.d.ts.map +1 -1
  25. package/dist/relay/relay-message-schemas.js +6 -0
  26. package/dist/relay/relay-message-schemas.js.map +1 -1
  27. package/dist/relay/relay-protocol.d.ts +13 -0
  28. package/dist/relay/relay-protocol.d.ts.map +1 -1
  29. package/dist/relay/relay-protocol.js.map +1 -1
  30. package/dist/relay/ticket-tracker.d.ts +12 -2
  31. package/dist/relay/ticket-tracker.d.ts.map +1 -1
  32. package/dist/relay/ticket-tracker.js +36 -5
  33. package/dist/relay/ticket-tracker.js.map +1 -1
  34. package/dist/relay/worktree-manager.d.ts +43 -0
  35. package/dist/relay/worktree-manager.d.ts.map +1 -0
  36. package/dist/relay/worktree-manager.js +259 -0
  37. package/dist/relay/worktree-manager.js.map +1 -0
  38. 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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "flaio-cli",
3
- "version": "1.0.3",
3
+ "version": "1.0.4",
4
4
  "description": "Terminal UI for managing multiple AI CLI agents with tabbed sessions",
5
5
  "license": "MIT",
6
6
  "type": "module",