@rryando/arcs 5.0.0 → 5.1.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.
Files changed (59) hide show
  1. package/README.md +17 -0
  2. package/dist/cli/arcs-flash.d.ts +1 -1
  3. package/dist/cli/arcs-flash.d.ts.map +1 -1
  4. package/dist/cli/arcs-flash.js +3 -1
  5. package/dist/cli/arcs-flash.js.map +1 -1
  6. package/dist/cli/arcs-orchestrate.d.ts +1 -1
  7. package/dist/cli/arcs-orchestrate.d.ts.map +1 -1
  8. package/dist/cli/arcs-orchestrate.js +3 -1
  9. package/dist/cli/arcs-orchestrate.js.map +1 -1
  10. package/dist/cli/arg-parser.d.ts +1 -0
  11. package/dist/cli/arg-parser.d.ts.map +1 -1
  12. package/dist/cli/arg-parser.js +12 -2
  13. package/dist/cli/arg-parser.js.map +1 -1
  14. package/dist/cli/command-registry.d.ts +2 -0
  15. package/dist/cli/command-registry.d.ts.map +1 -1
  16. package/dist/cli/command-registry.js.map +1 -1
  17. package/dist/cli/commands/index.d.ts +1 -0
  18. package/dist/cli/commands/index.d.ts.map +1 -1
  19. package/dist/cli/commands/index.js +1 -0
  20. package/dist/cli/commands/index.js.map +1 -1
  21. package/dist/cli/commands/remember.js +1 -0
  22. package/dist/cli/commands/remember.js.map +1 -1
  23. package/dist/cli/commands/worktree.d.ts +2 -0
  24. package/dist/cli/commands/worktree.d.ts.map +1 -0
  25. package/dist/cli/commands/worktree.js +608 -0
  26. package/dist/cli/commands/worktree.js.map +1 -0
  27. package/dist/cli/dag-commands.d.ts.map +1 -1
  28. package/dist/cli/dag-commands.js +2 -1
  29. package/dist/cli/dag-commands.js.map +1 -1
  30. package/dist/cli/help-generator.d.ts.map +1 -1
  31. package/dist/cli/help-generator.js +3 -0
  32. package/dist/cli/help-generator.js.map +1 -1
  33. package/dist/cli/index.d.ts.map +1 -1
  34. package/dist/cli/index.js +2 -1
  35. package/dist/cli/index.js.map +1 -1
  36. package/dist/cli/orchestrator-shared-blocks.d.ts +2 -1
  37. package/dist/cli/orchestrator-shared-blocks.d.ts.map +1 -1
  38. package/dist/cli/orchestrator-shared-blocks.js +13 -2
  39. package/dist/cli/orchestrator-shared-blocks.js.map +1 -1
  40. package/dist/cli/write-gate.d.ts +20 -0
  41. package/dist/cli/write-gate.d.ts.map +1 -0
  42. package/dist/cli/write-gate.js +39 -0
  43. package/dist/cli/write-gate.js.map +1 -0
  44. package/dist/utils/worktree-store.d.ts +54 -0
  45. package/dist/utils/worktree-store.d.ts.map +1 -0
  46. package/dist/utils/worktree-store.js +150 -0
  47. package/dist/utils/worktree-store.js.map +1 -0
  48. package/dist/utils/worktree.d.ts +71 -0
  49. package/dist/utils/worktree.d.ts.map +1 -0
  50. package/dist/utils/worktree.js +197 -0
  51. package/dist/utils/worktree.js.map +1 -0
  52. package/opencode/arcs/.opencode/plugins/arcs.js +5 -1
  53. package/opencode/arcs/prompts/arcs-docs.txt +1 -1
  54. package/opencode/arcs/prompts/arcs-flash.txt +14 -2
  55. package/opencode/arcs/prompts/arcs-orchestrate-caveman.txt +14 -2
  56. package/opencode/arcs/prompts/arcs-orchestrate.txt +14 -2
  57. package/opencode/arcs/prompts/software-engineer.txt +6 -0
  58. package/package.json +2 -2
  59. package/scripts/build-opencode-bundle.mjs +7 -8
@@ -0,0 +1,608 @@
1
+ // ---------------------------------------------------------------------------
2
+ // Worktree Commands — plan-scoped git worktrees (1 plan = 1 tree)
3
+ // ---------------------------------------------------------------------------
4
+ import { execFile } from "node:child_process";
5
+ import { existsSync } from "node:fs";
6
+ import { basename, resolve } from "node:path";
7
+ import { promisify } from "node:util";
8
+ import { GIT_ASYNC_TIMEOUT_MS, getHeadCommitAsync } from "../../utils/git.js";
9
+ import { getProjectDir } from "../../utils/paths.js";
10
+ import { readPlanIndex } from "../../utils/project-memory.js";
11
+ import { normalizeIdentifier } from "../../utils/slug.js";
12
+ import { addWorktree, countUnmergedCommits, currentBranch, defaultWorktreeRoot, isBranchCheckedOutInAnotherWorktree, listWorktrees, planBranchName, pruneWorktrees, removeWorktree, resolvePlanWorktreePath, } from "../../utils/worktree.js";
13
+ import { findPathCollisions, findWorktreeByPlan, readWorktreeRegistry, removeWorktreeEntry, upsertWorktreeEntry, } from "../../utils/worktree-store.js";
14
+ import { defineCommand, ERROR_CODES, } from "../command-registry.js";
15
+ import { failure, success } from "../output-envelope.js";
16
+ // ---------------------------------------------------------------------------
17
+ // Helpers
18
+ // ---------------------------------------------------------------------------
19
+ const execFileAsync = promisify(execFile);
20
+ function requireProject(slug) {
21
+ const dir = getProjectDir(slug);
22
+ if (!existsSync(dir)) {
23
+ return failure(ERROR_CODES.PROJECT_NOT_FOUND, `Project "${slug}" not found`, {
24
+ hint: "Run 'arcs project list' to see available projects.",
25
+ });
26
+ }
27
+ return dir;
28
+ }
29
+ /**
30
+ * Resolve the target repo from the CLI's cwd: arcs runs INSIDE the user's
31
+ * project checkout, so the repo is always `git rev-parse --show-toplevel`
32
+ * from `process.cwd()` — never derived from $ARCS_DATA. Null when cwd is
33
+ * not inside a git work tree.
34
+ */
35
+ async function resolveRepoRoot() {
36
+ try {
37
+ const { stdout } = await execFileAsync("git", ["rev-parse", "--show-toplevel"], {
38
+ encoding: "utf-8",
39
+ cwd: process.cwd(),
40
+ timeout: GIT_ASYNC_TIMEOUT_MS,
41
+ windowsHide: true,
42
+ });
43
+ const root = stdout.trim().replace(/\\/g, "/");
44
+ return root || null;
45
+ }
46
+ catch {
47
+ return null;
48
+ }
49
+ }
50
+ /** Normalize a path for registry-vs-git comparisons (absolute, forward slashes). */
51
+ function normalizePathKey(p) {
52
+ return resolve(p).replace(/\\/g, "/");
53
+ }
54
+ /** Sibling-convention leaf pair: `<anything>-worktrees/<id>`. */
55
+ const WORKTREE_NAMING = /\/[^/]+-worktrees\/[^/]+$/;
56
+ function matchesArcsNaming(path) {
57
+ return WORKTREE_NAMING.test(normalizePathKey(path));
58
+ }
59
+ /** True when a local branch `refs/heads/<branch>` exists in the repo. */
60
+ async function branchExists(repoPath, branch) {
61
+ try {
62
+ await execFileAsync("git", ["rev-parse", "--verify", "--quiet", `refs/heads/${branch}`], {
63
+ encoding: "utf-8",
64
+ cwd: repoPath,
65
+ timeout: GIT_ASYNC_TIMEOUT_MS,
66
+ windowsHide: true,
67
+ });
68
+ return true;
69
+ }
70
+ catch {
71
+ return false;
72
+ }
73
+ }
74
+ /** Count uncommitted changes in a worktree (`git status --porcelain`). Null on failure. */
75
+ async function countDirtyFiles(worktreePath) {
76
+ try {
77
+ const { stdout } = await execFileAsync("git", ["status", "--porcelain"], {
78
+ encoding: "utf-8",
79
+ cwd: worktreePath,
80
+ timeout: GIT_ASYNC_TIMEOUT_MS,
81
+ windowsHide: true,
82
+ });
83
+ return stdout.split("\n").filter((line) => line.trim().length > 0).length;
84
+ }
85
+ catch {
86
+ return null;
87
+ }
88
+ }
89
+ function formatFinding(finding) {
90
+ const where = finding.planId ? ` [${finding.planId}]` : "";
91
+ return `${finding.code}${where}: ${finding.detail}`;
92
+ }
93
+ const ACTIVE_PLAN_STATUSES = new Set(["in_progress", "blocked"]);
94
+ const PRUNABLE_PLAN_STATUSES = new Set(["done", "archived"]);
95
+ // ---------------------------------------------------------------------------
96
+ // worktree ensure
97
+ // ---------------------------------------------------------------------------
98
+ const worktreeEnsureParams = {
99
+ slug: { type: "string", required: true, positional: 0, description: "Project slug" },
100
+ planId: { type: "string", required: true, positional: 1, description: "Plan ID" },
101
+ base: { type: "string", description: "Base ref to branch from (default: HEAD)" },
102
+ root: {
103
+ type: "string",
104
+ description: "Worktree parent directory override (default: sibling <repo>-worktrees)",
105
+ },
106
+ };
107
+ defineCommand({
108
+ path: "worktree ensure",
109
+ description: "Idempotently create and register a dedicated worktree for a plan",
110
+ mutation: true,
111
+ params: worktreeEnsureParams,
112
+ handler: handleWorktreeEnsure,
113
+ });
114
+ async function handleWorktreeEnsure(params, flags) {
115
+ const projectCheck = requireProject(params.slug);
116
+ if (typeof projectCheck !== "string")
117
+ return projectCheck;
118
+ const projectDir = projectCheck;
119
+ const planIndex = await readPlanIndex(projectDir);
120
+ const plan = planIndex.plans.find((p) => p.id === params.planId || p.normalizedId === params.planId);
121
+ if (!plan) {
122
+ return failure(ERROR_CODES.ENTITY_NOT_FOUND, `Plan "${params.planId}" not found`, {
123
+ hint: `Run 'arcs plan list ${params.slug}' to see available plans.`,
124
+ });
125
+ }
126
+ const repoRoot = await resolveRepoRoot();
127
+ if (!repoRoot) {
128
+ return failure("not_a_git_repo", "The current directory is not inside a git work tree", {
129
+ hint: "Run worktree commands from within the project checkout — the target repo is the CLI's cwd, not $ARCS_DATA.",
130
+ });
131
+ }
132
+ const branch = planBranchName(plan.normalizedId);
133
+ const path = params.root
134
+ ? `${normalizePathKey(params.root)}/${plan.normalizedId}`
135
+ : resolvePlanWorktreePath(repoRoot, plan.normalizedId);
136
+ // Idempotent: a registered row backed by a live tree on the right branch
137
+ // is the done state — return it instead of recreating anything.
138
+ const existing = await findWorktreeByPlan(projectDir, plan.normalizedId);
139
+ if (existing && existsSync(existing.path)) {
140
+ const checkedOut = await currentBranch(existing.path);
141
+ if (checkedOut === existing.branch) {
142
+ return success({
143
+ planId: existing.planId,
144
+ path: existing.path,
145
+ branch: existing.branch,
146
+ created: false,
147
+ });
148
+ }
149
+ }
150
+ // Mutual exclusion: two orchestrators must not dispatch onto one branch.
151
+ if (await isBranchCheckedOutInAnotherWorktree(repoRoot, branch)) {
152
+ return failure("branch_busy", `Branch "${branch}" is already checked out in another worktree`, {
153
+ hint: "Another orchestrator may hold this plan. Run 'arcs worktree list' to locate the holder.",
154
+ });
155
+ }
156
+ if (flags.dryRun) {
157
+ return success({
158
+ dryRun: true,
159
+ wouldCreate: { planId: plan.normalizedId, path, branch, baseRef: params.base ?? "HEAD" },
160
+ });
161
+ }
162
+ const baseCommit = await getHeadCommitAsync(repoRoot);
163
+ let added = await addWorktree(repoRoot, {
164
+ path,
165
+ branch,
166
+ createBranch: true,
167
+ ...(params.base ? { baseRef: params.base } : {}),
168
+ });
169
+ // Prune never deletes branches, so a re-ensure after a prune finds `-b`
170
+ // refusing an existing branch — fall back to checking that branch out
171
+ // (mutual exclusion above already proved no other worktree holds it).
172
+ if (!added && (await branchExists(repoRoot, branch))) {
173
+ added = await addWorktree(repoRoot, { path, branch, createBranch: false });
174
+ }
175
+ if (!added) {
176
+ return failure("worktree_error", `git worktree add failed for "${path}" (branch "${branch}")`, {
177
+ hint: "The branch may already exist without a worktree, or the path may be occupied. Inspect 'git worktree list'.",
178
+ });
179
+ }
180
+ const entry = await upsertWorktreeEntry(projectDir, {
181
+ planId: plan.normalizedId,
182
+ path: added.path,
183
+ branch,
184
+ ...(baseCommit ? { baseCommit } : {}),
185
+ });
186
+ return success({
187
+ planId: entry.planId,
188
+ path: entry.path,
189
+ branch: entry.branch,
190
+ ...(entry.baseCommit ? { baseCommit: entry.baseCommit } : {}),
191
+ created: true,
192
+ });
193
+ }
194
+ // ---------------------------------------------------------------------------
195
+ // worktree validate
196
+ // ---------------------------------------------------------------------------
197
+ const worktreeValidateParams = {
198
+ slug: { type: "string", required: true, positional: 0, description: "Project slug" },
199
+ };
200
+ defineCommand({
201
+ path: "worktree validate",
202
+ description: "Cross-check worktree registry, plan statuses, and git worktree state",
203
+ params: worktreeValidateParams,
204
+ handler: handleWorktreeValidate,
205
+ });
206
+ async function handleWorktreeValidate(params, _flags) {
207
+ const projectCheck = requireProject(params.slug);
208
+ if (typeof projectCheck !== "string")
209
+ return projectCheck;
210
+ const projectDir = projectCheck;
211
+ const repoRoot = await resolveRepoRoot();
212
+ if (!repoRoot) {
213
+ return failure("not_a_git_repo", "The current directory is not inside a git work tree", {
214
+ hint: "Run worktree commands from within the project checkout — the target repo is the CLI's cwd, not $ARCS_DATA.",
215
+ });
216
+ }
217
+ const [registry, plans, disk] = await Promise.all([
218
+ readWorktreeRegistry(projectDir),
219
+ readPlanIndex(projectDir),
220
+ listWorktrees(repoRoot),
221
+ ]);
222
+ const planById = new Map(plans.plans.map((p) => [p.normalizedId, p]));
223
+ const diskByPath = new Map(disk.map((wt) => [wt.path, wt]));
224
+ const violations = [];
225
+ const warnings = [];
226
+ const info = [];
227
+ // Registry rows: health, staleness, and drift signals.
228
+ for (const entry of registry) {
229
+ const plan = planById.get(entry.planId);
230
+ const live = diskByPath.get(normalizePathKey(entry.path));
231
+ if (!live) {
232
+ violations.push({
233
+ code: "worktree_missing_on_disk",
234
+ planId: entry.planId,
235
+ path: entry.path,
236
+ detail: "Registered worktree has no live git worktree at this path",
237
+ });
238
+ continue;
239
+ }
240
+ if (live.branch !== entry.branch) {
241
+ if (live.branch === null) {
242
+ warnings.push({
243
+ code: "unknown_state",
244
+ planId: entry.planId,
245
+ path: entry.path,
246
+ detail: "Worktree is detached or bare — registered branch cannot be verified",
247
+ });
248
+ }
249
+ else {
250
+ violations.push({
251
+ code: "branch_mismatch",
252
+ planId: entry.planId,
253
+ path: entry.path,
254
+ detail: `Checked out "${live.branch}" but registry records "${entry.branch}"`,
255
+ });
256
+ }
257
+ }
258
+ if (plan && PRUNABLE_PLAN_STATUSES.has(plan.status)) {
259
+ warnings.push({
260
+ code: "stale_registration",
261
+ planId: entry.planId,
262
+ path: entry.path,
263
+ detail: `Plan is ${plan.status} — run 'arcs worktree prune ${params.slug} ${entry.planId}'`,
264
+ });
265
+ }
266
+ if (!plan) {
267
+ warnings.push({
268
+ code: "orphaned_registration",
269
+ planId: entry.planId,
270
+ path: entry.path,
271
+ detail: "Registered plan no longer exists in the plan index",
272
+ });
273
+ }
274
+ const dirtyCount = await countDirtyFiles(entry.path);
275
+ if (dirtyCount !== null && dirtyCount > 0) {
276
+ info.push({
277
+ code: "dirty_worktree",
278
+ planId: entry.planId,
279
+ path: entry.path,
280
+ detail: `${dirtyCount} uncommitted change(s)`,
281
+ });
282
+ }
283
+ const unmerged = await countUnmergedCommits(entry.path);
284
+ if (unmerged !== null && unmerged > 0) {
285
+ info.push({
286
+ code: "unmerged_commits",
287
+ planId: entry.planId,
288
+ path: entry.path,
289
+ detail: `${unmerged} commit(s) not reachable from upstream/base`,
290
+ });
291
+ }
292
+ }
293
+ // Active plans must hold a registered worktree.
294
+ for (const plan of plans.plans) {
295
+ if (!ACTIVE_PLAN_STATUSES.has(plan.status))
296
+ continue;
297
+ if (registry.some((entry) => entry.planId === plan.normalizedId))
298
+ continue;
299
+ violations.push({
300
+ code: "active_plan_unprotected",
301
+ planId: plan.normalizedId,
302
+ detail: `${plan.status} plan has no registered worktree — run 'arcs worktree ensure ${params.slug} ${plan.normalizedId}'`,
303
+ });
304
+ }
305
+ // On-disk trees under ARCS naming that no registry row claims.
306
+ for (const wt of disk) {
307
+ if (wt.bare)
308
+ continue;
309
+ if (!matchesArcsNaming(wt.path))
310
+ continue;
311
+ if (registry.some((entry) => normalizePathKey(entry.path) === wt.path))
312
+ continue;
313
+ const guessedPlanId = basename(wt.path);
314
+ const plan = planById.get(guessedPlanId);
315
+ if (plan && PRUNABLE_PLAN_STATUSES.has(plan.status)) {
316
+ warnings.push({
317
+ code: "stale_tree_on_disk",
318
+ planId: guessedPlanId,
319
+ path: wt.path,
320
+ detail: `Plan is ${plan.status} — run 'arcs worktree prune ${params.slug} ${guessedPlanId}'`,
321
+ });
322
+ }
323
+ else {
324
+ warnings.push({
325
+ code: "unregistered_worktree",
326
+ path: wt.path,
327
+ detail: "Matches ARCS worktree naming but has no registry row",
328
+ });
329
+ }
330
+ }
331
+ // Registry rows claiming the same resolved path.
332
+ for (const collision of findPathCollisions(registry)) {
333
+ violations.push({
334
+ code: "path_collision",
335
+ path: collision.path,
336
+ detail: `Claimed by multiple registry rows: ${collision.planIds.join(", ")}`,
337
+ });
338
+ }
339
+ const summary = {
340
+ violations: violations.length,
341
+ warnings: warnings.length,
342
+ info: info.length,
343
+ };
344
+ if (violations.length > 0) {
345
+ const preview = violations.slice(0, 5).map(formatFinding).join("\n");
346
+ const more = violations.length > 5 ? `\n… and ${violations.length - 5} more` : "";
347
+ return failure("validation_failed", `Worktree validation failed: ${summary.violations} violation(s), ${summary.warnings} warning(s), ${summary.info} info`, { hint: `${preview}${more}` });
348
+ }
349
+ return success({ violations, warnings, info, summary });
350
+ }
351
+ // ---------------------------------------------------------------------------
352
+ // worktree prune
353
+ // ---------------------------------------------------------------------------
354
+ const worktreePruneParams = {
355
+ slug: { type: "string", required: true, positional: 0, description: "Project slug" },
356
+ planId: {
357
+ type: "string",
358
+ positional: 1,
359
+ description: "Plan ID (omit to prune all done/archived worktrees)",
360
+ },
361
+ force: { type: "boolean", description: "Remove even when unmerged commits exist" },
362
+ };
363
+ defineCommand({
364
+ path: "worktree prune",
365
+ description: "Remove plan worktrees (branches are never deleted)",
366
+ mutation: true,
367
+ params: worktreePruneParams,
368
+ handler: handleWorktreePrune,
369
+ });
370
+ async function handleWorktreePrune(params, flags) {
371
+ const projectCheck = requireProject(params.slug);
372
+ if (typeof projectCheck !== "string")
373
+ return projectCheck;
374
+ const projectDir = projectCheck;
375
+ const repoRoot = await resolveRepoRoot();
376
+ if (!repoRoot) {
377
+ return failure("not_a_git_repo", "The current directory is not inside a git work tree", {
378
+ hint: "Run worktree commands from within the project checkout — the target repo is the CLI's cwd, not $ARCS_DATA.",
379
+ });
380
+ }
381
+ if (flags.dryRun) {
382
+ const candidates = params.planId
383
+ ? [await findPruneTarget(projectDir, repoRoot, params.planId)]
384
+ : await listPrunableEntries(projectDir);
385
+ return success({
386
+ dryRun: true,
387
+ wouldRemove: candidates
388
+ .filter((entry) => entry !== null)
389
+ .map((entry) => ({ planId: entry.planId, path: entry.path })),
390
+ });
391
+ }
392
+ // Guarded-mode enforcement happens centrally in invokeCommand (mutation: true).
393
+ if (params.planId) {
394
+ return pruneSinglePlan(projectDir, repoRoot, params.slug, params.planId, params.force ?? false);
395
+ }
396
+ return pruneCompletedPlans(projectDir, repoRoot, params.force ?? false);
397
+ }
398
+ /** Registry row (or on-disk default-path tree) for a named prune target. */
399
+ async function findPruneTarget(projectDir, repoRoot, planId) {
400
+ const entry = await findWorktreeByPlan(projectDir, planId);
401
+ if (entry)
402
+ return entry;
403
+ const fallback = resolvePlanWorktreePath(repoRoot, normalizeIdentifier(planId));
404
+ if (existsSync(fallback)) {
405
+ return {
406
+ planId: normalizeIdentifier(planId),
407
+ path: fallback,
408
+ branch: planBranchName(planId),
409
+ createdAt: "",
410
+ };
411
+ }
412
+ return null;
413
+ }
414
+ /** Registry rows eligible for batch prune: done/archived plans only. */
415
+ async function listPrunableEntries(projectDir) {
416
+ const [registry, plans] = await Promise.all([
417
+ readWorktreeRegistry(projectDir),
418
+ readPlanIndex(projectDir),
419
+ ]);
420
+ const statusById = new Map(plans.plans.map((p) => [p.normalizedId, p.status]));
421
+ return registry.filter((entry) => {
422
+ const status = statusById.get(entry.planId);
423
+ return status !== undefined && PRUNABLE_PLAN_STATUSES.has(status);
424
+ });
425
+ }
426
+ /** Refuse to destroy unmergeable work unless --force overrides. */
427
+ async function unmergedBlock(path, force) {
428
+ if (force)
429
+ return null;
430
+ const unmerged = await countUnmergedCommits(path);
431
+ if (unmerged === null) {
432
+ return failure("unmerged_commits_unknown", `Cannot verify the merge state of "${path}" — refusing to remove without --force`, { hint: "Verify the branch is merged, then rerun with --force." });
433
+ }
434
+ if (unmerged > 0) {
435
+ return failure("unmerged_commits", `"${path}" holds ${unmerged} unmerged commit(s) — refusing to remove without --force`, {
436
+ hint: "Merge or push the branch, or rerun with --force to discard the worktree anyway (commits stay on the branch).",
437
+ });
438
+ }
439
+ return null;
440
+ }
441
+ async function pruneSinglePlan(projectDir, repoRoot, slug, planId, force) {
442
+ const target = await findPruneTarget(projectDir, repoRoot, planId);
443
+ if (!target) {
444
+ return failure(ERROR_CODES.ENTITY_NOT_FOUND, `No worktree found for plan "${planId}"`, {
445
+ hint: `Run 'arcs worktree list ${slug}' to see registered worktrees.`,
446
+ });
447
+ }
448
+ const block = await unmergedBlock(target.path, force);
449
+ if (block)
450
+ return block;
451
+ const removed = await removeWorktree(repoRoot, target.path, force);
452
+ const registryRemoved = await removeWorktreeEntry(projectDir, target.planId);
453
+ const adminEntriesPruned = await pruneWorktrees(repoRoot);
454
+ return success({
455
+ planId: target.planId,
456
+ path: target.path,
457
+ worktreeRemoved: removed,
458
+ registryRemoved,
459
+ adminEntriesPruned,
460
+ branchesDeleted: false,
461
+ });
462
+ }
463
+ async function pruneCompletedPlans(projectDir, repoRoot, force) {
464
+ const registry = await readWorktreeRegistry(projectDir);
465
+ const plans = await readPlanIndex(projectDir);
466
+ const statusById = new Map(plans.plans.map((p) => [p.normalizedId, p.status]));
467
+ const removed = [];
468
+ const skipped = [];
469
+ for (const entry of registry) {
470
+ const status = statusById.get(entry.planId);
471
+ if (status === undefined || !PRUNABLE_PLAN_STATUSES.has(status)) {
472
+ skipped.push({
473
+ planId: entry.planId,
474
+ path: entry.path,
475
+ reason: status === undefined
476
+ ? "plan not found in plan index"
477
+ : `plan status is ${status}, not done/archived`,
478
+ });
479
+ continue;
480
+ }
481
+ if (!force) {
482
+ const unmerged = await countUnmergedCommits(entry.path);
483
+ if (unmerged === null) {
484
+ skipped.push({
485
+ planId: entry.planId,
486
+ path: entry.path,
487
+ reason: "merge state unknown; rerun with --force to override",
488
+ });
489
+ continue;
490
+ }
491
+ if (unmerged > 0) {
492
+ skipped.push({
493
+ planId: entry.planId,
494
+ path: entry.path,
495
+ reason: `${unmerged} unmerged commit(s); rerun with --force to override`,
496
+ });
497
+ continue;
498
+ }
499
+ }
500
+ if (!(await removeWorktree(repoRoot, entry.path, force))) {
501
+ skipped.push({
502
+ planId: entry.planId,
503
+ path: entry.path,
504
+ reason: "git worktree remove failed",
505
+ });
506
+ continue;
507
+ }
508
+ await removeWorktreeEntry(projectDir, entry.planId);
509
+ removed.push({ planId: entry.planId, path: entry.path });
510
+ }
511
+ const adminEntriesPruned = await pruneWorktrees(repoRoot);
512
+ return success({ removed, skipped, adminEntriesPruned, branchesDeleted: false });
513
+ }
514
+ // ---------------------------------------------------------------------------
515
+ // worktree list
516
+ // ---------------------------------------------------------------------------
517
+ const worktreeListParams = {
518
+ slug: { type: "string", required: true, positional: 0, description: "Project slug" },
519
+ };
520
+ defineCommand({
521
+ path: "worktree list",
522
+ description: "List registered and on-disk plan worktrees with drift markers",
523
+ params: worktreeListParams,
524
+ handler: handleWorktreeList,
525
+ });
526
+ async function handleWorktreeList(params, _flags) {
527
+ const projectCheck = requireProject(params.slug);
528
+ if (typeof projectCheck !== "string")
529
+ return projectCheck;
530
+ const projectDir = projectCheck;
531
+ const repoRoot = await resolveRepoRoot();
532
+ if (!repoRoot) {
533
+ return failure("not_a_git_repo", "The current directory is not inside a git work tree", {
534
+ hint: "Run worktree commands from within the project checkout — the target repo is the CLI's cwd, not $ARCS_DATA.",
535
+ });
536
+ }
537
+ const [registry, disk] = await Promise.all([
538
+ readWorktreeRegistry(projectDir),
539
+ listWorktrees(repoRoot),
540
+ ]);
541
+ const diskByPath = new Map(disk.map((wt) => [wt.path, wt]));
542
+ const collisionPaths = new Set(findPathCollisions(registry).map((c) => c.path));
543
+ const claimedPaths = new Set(registry.map((entry) => normalizePathKey(entry.path)));
544
+ const defaultRoot = defaultWorktreeRoot(repoRoot);
545
+ const rows = [];
546
+ for (const entry of registry) {
547
+ const key = normalizePathKey(entry.path);
548
+ if (collisionPaths.has(key)) {
549
+ rows.push({
550
+ planId: entry.planId,
551
+ path: entry.path,
552
+ branch: entry.branch,
553
+ marker: "collision",
554
+ detail: "Path claimed by multiple registry rows",
555
+ });
556
+ continue;
557
+ }
558
+ const live = diskByPath.get(key);
559
+ if (!live) {
560
+ rows.push({
561
+ planId: entry.planId,
562
+ path: entry.path,
563
+ branch: entry.branch,
564
+ marker: "missing",
565
+ detail: "No live git worktree at this path",
566
+ });
567
+ continue;
568
+ }
569
+ if (live.branch !== entry.branch) {
570
+ rows.push({
571
+ planId: entry.planId,
572
+ path: entry.path,
573
+ branch: entry.branch,
574
+ marker: "foreign-branch",
575
+ detail: `Checked out branch: ${live.branch ?? "detached HEAD"}`,
576
+ });
577
+ continue;
578
+ }
579
+ rows.push({ planId: entry.planId, path: entry.path, branch: entry.branch, marker: "ok" });
580
+ }
581
+ for (const wt of disk) {
582
+ if (wt.bare)
583
+ continue;
584
+ if (!wt.path.startsWith(`${defaultRoot}/`))
585
+ continue;
586
+ if (claimedPaths.has(wt.path))
587
+ continue;
588
+ rows.push({
589
+ path: wt.path,
590
+ branch: wt.branch,
591
+ marker: "unregistered",
592
+ detail: "On-disk worktree with no registry row",
593
+ });
594
+ }
595
+ const countBy = (marker) => rows.filter((row) => row.marker === marker).length;
596
+ return success({
597
+ worktrees: rows,
598
+ counts: {
599
+ total: rows.length,
600
+ ok: countBy("ok"),
601
+ missing: countBy("missing"),
602
+ unregistered: countBy("unregistered"),
603
+ collision: countBy("collision"),
604
+ foreignBranch: countBy("foreign-branch"),
605
+ },
606
+ });
607
+ }
608
+ //# sourceMappingURL=worktree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worktree.js","sourceRoot":"","sources":["../../../src/cli/commands/worktree.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"dag-commands.d.ts","sourceRoot":"","sources":["../../src/cli/dag-commands.ts"],"names":[],"mappings":"AAYA,OAAO,qBAAqB,CAAC;AAe7B;;;;;;;GAOG;AACH,eAAO,MAAM,kBAAkB,yIAaO,CAAC;AAEvC;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAiHxF"}
1
+ {"version":3,"file":"dag-commands.d.ts","sourceRoot":"","sources":["../../src/cli/dag-commands.ts"],"names":[],"mappings":"AAYA,OAAO,qBAAqB,CAAC;AAgB7B;;;;;;;GAOG;AACH,eAAO,MAAM,kBAAkB,yIAaO,CAAC;AAEvC;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAiHxF"}
@@ -10,6 +10,7 @@ import { getCommand } from "./command-registry.js";
10
10
  import { isLeanMode } from "./lean-output.js";
11
11
  import { render, stripTimestamps } from "./output-envelope.js";
12
12
  import "./commands/index.js";
13
+ import { invokeCommand } from "./write-gate.js";
13
14
  function cliError(msg) {
14
15
  console.error(msg);
15
16
  }
@@ -136,7 +137,7 @@ export async function handleDagCommand(command, args) {
136
137
  // Let the main router handle --help
137
138
  return false;
138
139
  }
139
- const cmdResult = await registeredCmd.handler(result.parsed.params, result.parsed.flags);
140
+ const cmdResult = await invokeCommand(registeredCmd, result.parsed.params, result.parsed.flags);
140
141
  if (cmdResult.ok) {
141
142
  const flags = result.parsed.flags;
142
143
  if (flags.json) {