@nickmeriano/task 0.7.1 → 0.9.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 (128) hide show
  1. package/README.md +73 -25
  2. package/dist/asks.test.d.ts +17 -0
  3. package/dist/asks.test.d.ts.map +1 -0
  4. package/dist/asks.test.js +278 -0
  5. package/dist/asks.test.js.map +1 -0
  6. package/dist/check.d.ts +43 -0
  7. package/dist/check.d.ts.map +1 -0
  8. package/dist/check.js +403 -0
  9. package/dist/check.js.map +1 -0
  10. package/dist/check.test.d.ts +9 -0
  11. package/dist/check.test.d.ts.map +1 -0
  12. package/dist/check.test.js +248 -0
  13. package/dist/check.test.js.map +1 -0
  14. package/dist/claim-io.d.ts +73 -0
  15. package/dist/claim-io.d.ts.map +1 -0
  16. package/dist/claim-io.js +344 -0
  17. package/dist/claim-io.js.map +1 -0
  18. package/dist/claim.d.ts +61 -9
  19. package/dist/claim.d.ts.map +1 -1
  20. package/dist/claim.js +197 -67
  21. package/dist/claim.js.map +1 -1
  22. package/dist/claim.test.d.ts +2 -2
  23. package/dist/claim.test.js +235 -64
  24. package/dist/claim.test.js.map +1 -1
  25. package/dist/cli.js +724 -136
  26. package/dist/cli.js.map +1 -1
  27. package/dist/file-store.d.ts +110 -38
  28. package/dist/file-store.d.ts.map +1 -1
  29. package/dist/file-store.js +514 -238
  30. package/dist/file-store.js.map +1 -1
  31. package/dist/git-serve.d.ts +183 -0
  32. package/dist/git-serve.d.ts.map +1 -0
  33. package/dist/git-serve.js +503 -0
  34. package/dist/git-serve.js.map +1 -0
  35. package/dist/git-serve.test.d.ts +16 -0
  36. package/dist/git-serve.test.d.ts.map +1 -0
  37. package/dist/git-serve.test.js +183 -0
  38. package/dist/git-serve.test.js.map +1 -0
  39. package/dist/git.d.ts +65 -0
  40. package/dist/git.d.ts.map +1 -0
  41. package/dist/git.js +114 -0
  42. package/dist/git.js.map +1 -0
  43. package/dist/id.d.ts +39 -0
  44. package/dist/id.d.ts.map +1 -0
  45. package/dist/id.js +67 -0
  46. package/dist/id.js.map +1 -0
  47. package/dist/inbox.d.ts +41 -0
  48. package/dist/inbox.d.ts.map +1 -0
  49. package/dist/inbox.js +56 -0
  50. package/dist/inbox.js.map +1 -0
  51. package/dist/index.d.ts +5 -3
  52. package/dist/index.d.ts.map +1 -1
  53. package/dist/index.js +5 -3
  54. package/dist/index.js.map +1 -1
  55. package/dist/overview.d.ts +52 -0
  56. package/dist/overview.d.ts.map +1 -0
  57. package/dist/overview.js +61 -0
  58. package/dist/overview.js.map +1 -0
  59. package/dist/overview.test.d.ts +8 -0
  60. package/dist/overview.test.d.ts.map +1 -0
  61. package/dist/overview.test.js +48 -0
  62. package/dist/overview.test.js.map +1 -0
  63. package/dist/promote.test.d.ts +15 -0
  64. package/dist/promote.test.d.ts.map +1 -0
  65. package/dist/promote.test.js +104 -0
  66. package/dist/promote.test.js.map +1 -0
  67. package/dist/publish.d.ts +2 -17
  68. package/dist/publish.d.ts.map +1 -1
  69. package/dist/publish.js +4 -49
  70. package/dist/publish.js.map +1 -1
  71. package/dist/search.d.ts +34 -0
  72. package/dist/search.d.ts.map +1 -0
  73. package/dist/search.js +79 -0
  74. package/dist/search.js.map +1 -0
  75. package/dist/search.test.d.ts +2 -0
  76. package/dist/search.test.d.ts.map +1 -0
  77. package/dist/search.test.js +53 -0
  78. package/dist/search.test.js.map +1 -0
  79. package/dist/server.d.ts.map +1 -1
  80. package/dist/server.js +228 -23
  81. package/dist/server.js.map +1 -1
  82. package/dist/store.d.ts +43 -63
  83. package/dist/store.d.ts.map +1 -1
  84. package/dist/store.js +0 -368
  85. package/dist/store.js.map +1 -1
  86. package/dist/store.test.d.ts +1 -2
  87. package/dist/store.test.d.ts.map +1 -1
  88. package/dist/store.test.js +148 -106
  89. package/dist/store.test.js.map +1 -1
  90. package/dist/ticket-doc.d.ts +74 -5
  91. package/dist/ticket-doc.d.ts.map +1 -1
  92. package/dist/ticket-doc.js +229 -15
  93. package/dist/ticket-doc.js.map +1 -1
  94. package/dist/types.d.ts +115 -28
  95. package/dist/types.d.ts.map +1 -1
  96. package/dist/types.js.map +1 -1
  97. package/package.json +1 -1
  98. package/skill/SKILL.md +153 -40
  99. package/src/asks.test.ts +355 -0
  100. package/src/check.test.ts +328 -0
  101. package/src/check.ts +497 -0
  102. package/src/claim-io.ts +401 -0
  103. package/src/claim.test.ts +301 -71
  104. package/src/claim.ts +238 -81
  105. package/src/cli.ts +740 -131
  106. package/src/file-store.ts +572 -254
  107. package/src/git-serve.test.ts +240 -0
  108. package/src/git-serve.ts +595 -0
  109. package/src/git.ts +141 -0
  110. package/src/id.ts +68 -0
  111. package/src/inbox.ts +77 -0
  112. package/src/index.ts +4 -2
  113. package/src/overview.test.ts +52 -0
  114. package/src/overview.ts +105 -0
  115. package/src/promote.test.ts +143 -0
  116. package/src/publish.ts +6 -53
  117. package/src/search.test.ts +64 -0
  118. package/src/search.ts +105 -0
  119. package/src/server.ts +232 -21
  120. package/src/store.test.ts +166 -116
  121. package/src/store.ts +46 -444
  122. package/src/ticket-doc.ts +284 -21
  123. package/src/types.ts +120 -28
  124. package/ui/dist/assets/index-BjsorZOU.js +229 -0
  125. package/ui/dist/assets/index-CoKCUYic.css +1 -0
  126. package/ui/dist/index.html +2 -2
  127. package/ui/dist/assets/index-COunM-QN.css +0 -1
  128. package/ui/dist/assets/index-D4homvrQ.js +0 -229
package/dist/claim.js CHANGED
@@ -9,9 +9,10 @@
9
9
  * against `origin`. PR/session awareness belongs to whatever drives the claim
10
10
  * (the implement-task skill, a human).
11
11
  */
12
- import { spawnSync } from "node:child_process";
13
12
  import { join } from "node:path";
14
- import { FileStore, TICKETS_DIR } from "./file-store.js";
13
+ import { FileStore, TICKETS_DIR, openBoard } from "./file-store.js";
14
+ import { GIT_NETWORK_TIMEOUT_MS, defaultBase, git, gitMust, runGit, } from "./git.js";
15
+ import { boardConfig, findBoardsByPrefix, findRoot, findScopeRoot, } from "./store.js";
15
16
  /**
16
17
  * The branch namespace claims live under when the board doesn't configure
17
18
  * one. Deliberately vendor-neutral: repos whose workers are Claude Code cloud
@@ -25,21 +26,44 @@ export const DEFAULT_CLAIM_PREFIX = "task/claim/";
25
26
  /** Slash-terminated path segments of ref-safe characters. */
26
27
  const CLAIM_PREFIX_SHAPE = /^([A-Za-z0-9._-]+\/)+$/;
27
28
  /**
28
- * The board's claim namespace: configured `claimPrefix` (a trailing slash is
29
+ * The board's claim namespace: `claims.branchPrefix` (a trailing slash is
29
30
  * implied) or the default. Validated here because it becomes a git ref and an
30
31
  * ls-remote glob — a malformed value must fail the claim, not corrupt it.
32
+ *
33
+ * The pre-0.8 top-level `claimPrefix` spelling is not honored — no consumers,
34
+ * no compat (TAS-41) — but silently *defaulting* over it would be worse than
35
+ * a shim: the board's committed lock convention would change under every
36
+ * worker at once. So its presence refuses, loudly, by name.
31
37
  */
32
38
  export function claimNamespace(config) {
33
- const raw = config.claimPrefix ?? DEFAULT_CLAIM_PREFIX;
39
+ if (config.claimPrefix !== undefined && config.claims?.branchPrefix === undefined) {
40
+ throw new ClaimError('`claimPrefix` in .task/config.json is the pre-0.8 spelling and is no longer read — rename it to `claims: { "branchPrefix": … }`', "invalid");
41
+ }
42
+ const raw = config.claims?.branchPrefix ?? DEFAULT_CLAIM_PREFIX;
34
43
  const prefix = raw.endsWith("/") ? raw : `${raw}/`;
35
44
  if (!CLAIM_PREFIX_SHAPE.test(prefix) || prefix.includes("..") || /(^|\/)\./.test(prefix)) {
36
- throw new ClaimError(`invalid claimPrefix in .task/config.json: ${JSON.stringify(raw)} — use slash-separated segments like "task/claim/" or "claude/task/"`, "invalid");
45
+ throw new ClaimError(`invalid claims.branchPrefix in .task/config.json: ${JSON.stringify(raw)} — use slash-separated segments like "task/claim/" or "claude/task/"`, "invalid");
37
46
  }
38
47
  return prefix;
39
48
  }
40
- /** { prefix: "TAS" }, 21 → "task/claim/tas-21" (or under the configured namespace). */
41
- export function claimBranch(config, number) {
42
- return `${claimNamespace(config)}${config.prefix.toLowerCase()}-${number}`;
49
+ /**
50
+ * The repo-wide cap on open claims: `claims.maxOpenCount` read from the
51
+ * *root* board's config (the outermost `.task/` above `root`), never the
52
+ * nearest one — a WIP cap each board could set for itself is no cap at all.
53
+ * Absent, unparseable or nonsensical values all mean "no cap".
54
+ */
55
+ export function openClaimCap(root) {
56
+ try {
57
+ const cap = boardConfig(findScopeRoot(root)).claims?.maxOpenCount;
58
+ return typeof cap === "number" && Number.isInteger(cap) && cap > 0 ? cap : undefined;
59
+ }
60
+ catch {
61
+ return undefined;
62
+ }
63
+ }
64
+ /** { prefix: "TAS" }, "x7k4m" → "task/claim/tas-x7k4m" (or under the configured namespace). */
65
+ export function claimBranch(config, key) {
66
+ return `${claimNamespace(config)}${config.prefix.toLowerCase()}-${key}`;
43
67
  }
44
68
  /**
45
69
  * Why a claim was refused: "claimed" (someone holds the branch — exit 1, pick
@@ -53,43 +77,17 @@ export class ClaimError extends Error {
53
77
  this.kind = kind;
54
78
  }
55
79
  }
56
- function git(cwd, ...args) {
57
- const result = spawnSync("git", args, { cwd, encoding: "utf8" });
58
- if (result.error)
59
- throw result.error;
60
- return {
61
- status: result.status ?? 1,
62
- stdout: (result.stdout ?? "").trim(),
63
- stderr: (result.stderr ?? "").trim(),
64
- };
65
- }
66
- /** Run git and throw on failure — for the steps that have no soft outcome. */
67
- function gitMust(cwd, ...args) {
68
- const result = git(cwd, ...args);
80
+ /** Network git that throws on failure, with the timeout a real remote deserves. */
81
+ function gitNetMust(cwd, ...args) {
82
+ const result = runGit(cwd, args, { timeoutMs: GIT_NETWORK_TIMEOUT_MS });
69
83
  if (result.status !== 0) {
70
84
  throw new Error(`git ${args[0]} failed: ${result.stderr || result.stdout}`);
71
85
  }
72
86
  return result.stdout;
73
87
  }
74
- /**
75
- * The base every claim branch starts from: origin's default branch. Resolved
76
- * from `origin/HEAD` when the clone recorded it, with a main/master fallback
77
- * for repos wired up by hand (`git remote add` + push never sets origin/HEAD).
78
- */
79
- function defaultBase(cwd) {
80
- const head = git(cwd, "symbolic-ref", "--quiet", "refs/remotes/origin/HEAD");
81
- if (head.status === 0)
82
- return head.stdout.replace(/^refs\/remotes\//, "");
83
- for (const name of ["main", "master"]) {
84
- if (git(cwd, "show-ref", "--verify", "--quiet", `refs/remotes/origin/${name}`).status === 0) {
85
- return `origin/${name}`;
86
- }
87
- }
88
- throw new Error("couldn't resolve origin's default branch — origin/HEAD is unset and neither origin/main nor origin/master exists");
89
- }
90
88
  /** Every claim branch that exists on origin right now — one network call. */
91
89
  export function remoteClaims(cwd, namespace) {
92
- const out = gitMust(cwd, "ls-remote", "--heads", "origin", `${namespace}*`);
90
+ const out = gitNetMust(cwd, "ls-remote", "--heads", "origin", `${namespace}*`);
93
91
  const names = new Set();
94
92
  for (const line of out.split("\n")) {
95
93
  const ref = line.split("\t")[1];
@@ -99,30 +97,48 @@ export function remoteClaims(cwd, namespace) {
99
97
  return names;
100
98
  }
101
99
  function remoteBranchExists(cwd, branch) {
102
- return gitMust(cwd, "ls-remote", "--heads", "origin", branch) !== "";
100
+ return gitNetMust(cwd, "ls-remote", "--heads", "origin", branch) !== "";
103
101
  }
104
102
  /** Blockers still in the way — anything not done or canceled still blocks. */
105
103
  function openBlockers(store, task) {
106
104
  return task.blockedBy
107
- .map((n) => store.get(n))
105
+ .map((k) => store.get(k))
108
106
  .filter((b) => b !== null && b.status !== "done" && b.status !== "canceled")
109
107
  .map((b) => b.id);
110
108
  }
111
- /** Throws ClaimError("invalid") unless `task` is claimable right now. */
112
- function assertClaimable(store, task, number) {
113
- const id = store.displayId(number);
109
+ /**
110
+ * Throws ClaimError("invalid") unless `task` is claimable right now. Open asks
111
+ * deliberately don't gate here: a ticket can be agent-implementable while a
112
+ * person owes it something in parallel — the done gate keeps that honest. An
113
+ * ask that must land *before* the work starts is a `blocked_by` on a thin
114
+ * human ticket, which the blocker check below already enforces.
115
+ */
116
+ function assertClaimable(store, task, key) {
117
+ const id = store.displayId(key);
114
118
  if (!task)
115
119
  throw new ClaimError(`no such task: ${id}`, "invalid");
116
120
  if (task.status !== "todo") {
117
121
  throw new ClaimError(`${id} is ${task.status} — only todo tickets can be claimed`, "invalid");
118
122
  }
119
- if (task.needsHuman)
120
- throw new ClaimError(`${id} needs a human — not claimable`, "invalid");
121
123
  const blockers = openBlockers(store, task);
122
124
  if (blockers.length) {
123
125
  throw new ClaimError(`${id} is blocked by ${blockers.join(", ")} — not claimable`, "invalid");
124
126
  }
125
127
  }
128
+ /**
129
+ * The WIP-cap gate every claim passes through: while `maxOpenCount` claim
130
+ * branches exist on origin, claiming more is refused (exit 2 — the fix is to
131
+ * finish or release one, not to pick a different ticket). Existence on origin
132
+ * is the definition of "open": a claim branch dies at merge or release, so a
133
+ * lingering merged branch counts — deliberate pressure to clean it up. The
134
+ * cap applies to humans and agents alike; `--force` is the escape.
135
+ */
136
+ function assertUnderCap(openClaims, root, namespace) {
137
+ const cap = openClaimCap(root);
138
+ if (cap !== undefined && openClaims.size >= cap) {
139
+ throw new ClaimError(`${openClaims.size} claim branch${openClaims.size === 1 ? "" : "es"} already open under ${namespace} — at the root board's maxOpenCount cap (${cap}); finish or \`task claim --release\` one, or pass --force`, "invalid");
140
+ }
141
+ }
126
142
  /**
127
143
  * Claim `number`: validate, branch off origin's default branch, flip the
128
144
  * ticket to in_progress as the branch's first commit, and push. The push
@@ -132,31 +148,44 @@ function assertClaimable(store, task, number) {
132
148
  * someone pre-created without a claim commit can't be hijacked by a plain
133
149
  * fast-forward. Leaves the winner checked out on the claim branch.
134
150
  */
135
- export function claim(store, number) {
151
+ export function claim(store, key, options = {}) {
152
+ // Unreachable since openBoard refuses pre-0.6 boards, kept as the narrowing
153
+ // that lets the rest of this function assume text-canonical semantics.
136
154
  if (!(store instanceof FileStore)) {
137
- throw new ClaimError("claiming needs a text-format board — run `task migrate` first", "invalid");
155
+ throw new ClaimError("claiming needs a text-format board — run `npx @nickmeriano/task@0.6 migrate` once", "invalid");
138
156
  }
139
157
  const cwd = store.root;
140
- const branch = claimBranch(store.config, number);
141
- const id = store.displayId(number);
158
+ const branch = claimBranch(store.config, key);
159
+ const id = store.displayId(key);
142
160
  // The local-branch check comes before ticket validation on purpose: on the
143
161
  // claim branch itself the ticket reads in_progress, and "already claimed"
144
162
  // (exit 1, move on) is the truthful answer there — not a validation failure.
145
- const tree = git(cwd, "status", "--porcelain");
163
+ // -uno everywhere a claim reads the tree: only *tracked* modifications block
164
+ // a branch switch. Untracked files ride along untouched — and the release
165
+ // flow deliberately leaves one (the reason comment), so counting them would
166
+ // wedge the release-then-claim-next loop this exists for.
167
+ const tree = git(cwd, "status", "--porcelain", "-uno");
146
168
  if (tree.status !== 0) {
147
169
  throw new ClaimError(`not a git repository: ${cwd}`, "invalid");
148
170
  }
149
171
  if (git(cwd, "show-ref", "--verify", "--quiet", `refs/heads/${branch}`).status === 0) {
150
172
  throw new ClaimError(`${id} is already claimed — ${branch} exists locally (finish it, or \`task claim --release ${id}\`)`, "claimed");
151
173
  }
152
- assertClaimable(store, store.get(number), number);
174
+ assertClaimable(store, store.get(key), key);
153
175
  if (tree.stdout !== "") {
154
176
  throw new ClaimError("working tree is dirty — commit or stash before claiming, the claim switches branches", "invalid");
155
177
  }
156
- gitMust(cwd, "fetch", "--quiet", "origin");
157
- if (remoteBranchExists(cwd, branch)) {
178
+ gitNetMust(cwd, "fetch", "--quiet", "origin");
179
+ // One ls-remote answers both gates: is this ticket taken, and is the repo
180
+ // at its WIP cap. "Already claimed" wins — that's exit 1 (pick the next
181
+ // ticket), where the cap is exit 2 (fix something).
182
+ const namespace = claimNamespace(store.config);
183
+ const openClaims = remoteClaims(cwd, namespace);
184
+ if (openClaims.has(branch)) {
158
185
  throw new ClaimError(`${id} is already claimed — ${branch} exists on origin`, "claimed");
159
186
  }
187
+ if (!options.force)
188
+ assertUnderCap(openClaims, cwd, namespace);
160
189
  const base = defaultBase(cwd);
161
190
  // So a failed claim can put the checkout back exactly where it was —
162
191
  // a branch name usually, a bare sha when HEAD was detached.
@@ -171,16 +200,16 @@ export function claim(store, number) {
171
200
  // Re-validate against the base branch: the pre-checkout validation read
172
201
  // whatever happened to be checked out, this one reads the truth the claim
173
202
  // will actually be built on.
174
- assertClaimable(store, store.get(number), number);
175
- store.update(number, { status: "in_progress" });
176
- gitMust(cwd, "add", "--", join(store.taskDir, TICKETS_DIR, String(number)));
203
+ assertClaimable(store, store.get(key), key);
204
+ store.update(key, { status: "in_progress" });
205
+ gitMust(cwd, "add", "--", join(store.taskDir, TICKETS_DIR, key));
177
206
  gitMust(cwd, "commit", "--quiet", "-m", `chore(board): claim ${id} → in_progress`);
178
207
  }
179
208
  catch (error) {
180
209
  undo();
181
210
  throw error;
182
211
  }
183
- const push = git(cwd, "push", "--quiet", "-u", "origin", branch, `--force-with-lease=refs/heads/${branch}:`);
212
+ const push = runGit(cwd, ["push", "--quiet", "-u", "origin", branch, `--force-with-lease=refs/heads/${branch}:`], { timeoutMs: GIT_NETWORK_TIMEOUT_MS });
184
213
  if (push.status !== 0) {
185
214
  undo();
186
215
  if (remoteBranchExists(cwd, branch)) {
@@ -188,19 +217,19 @@ export function claim(store, number) {
188
217
  }
189
218
  throw new ClaimError(`${id}: push of ${branch} was rejected (likely a concurrent claim) — ${push.stderr || "no detail from git"}`, "claimed");
190
219
  }
191
- return { task: store.get(number), branch, base };
220
+ return { task: store.get(key), branch, base };
192
221
  }
193
222
  /**
194
223
  * Abandon a claim cleanly: delete the branch on origin and locally. The status
195
224
  * flip only ever existed as a commit on that branch, so deleting it *is* the
196
225
  * revert — the default branch never saw in_progress.
197
226
  */
198
- export function release(store, number) {
227
+ export function release(store, key) {
199
228
  const cwd = store.root;
200
- const branch = claimBranch(store.config, number);
229
+ const branch = claimBranch(store.config, key);
201
230
  const onBranch = git(cwd, "symbolic-ref", "--quiet", "--short", "HEAD").stdout === branch;
202
231
  if (onBranch) {
203
- const tree = gitMust(cwd, "status", "--porcelain");
232
+ const tree = gitMust(cwd, "status", "--porcelain", "-uno");
204
233
  if (tree !== "") {
205
234
  throw new ClaimError(`working tree on ${branch} is dirty — commit elsewhere or discard before releasing`, "invalid");
206
235
  }
@@ -218,20 +247,121 @@ export function release(store, number) {
218
247
  const local = git(cwd, "branch", "--quiet", "-D", branch).status === 0;
219
248
  const remote = remoteBranchExists(cwd, branch);
220
249
  if (remote)
221
- gitMust(cwd, "push", "--quiet", "origin", "--delete", branch);
250
+ gitNetMust(cwd, "push", "--quiet", "origin", "--delete", branch);
222
251
  return { branch, remote, local };
223
252
  }
224
253
  /**
225
- * The dispatcher's queue view: `todo` in position order, minus needs-human,
226
- * minus blocked, minus tickets whose claim branch already exists on origin
227
- * (one ls-remote for the whole namespace). The top entry is next up.
254
+ * The dispatcher's queue view: `todo` in position order, minus blocked, minus
255
+ * tickets whose claim branch already exists on origin (one ls-remote for the
256
+ * whole namespace). The top entry is next up. Open asks don't exclude a
257
+ * ticket — see assertClaimable.
228
258
  */
229
259
  export function claimableTasks(store) {
230
260
  const claimed = remoteClaims(store.root, claimNamespace(store.config));
231
261
  return store
232
262
  .list({ statuses: ["todo"] })
233
- .filter((t) => !t.needsHuman)
234
263
  .filter((t) => openBlockers(store, t).length === 0)
235
- .filter((t) => !claimed.has(claimBranch(store.config, t.number)));
264
+ .filter((t) => !claimed.has(claimBranch(store.config, t.key)));
265
+ }
266
+ /**
267
+ * `task promote` — the human "build this" call, as a verb: `backlog` → `todo`.
268
+ * No quality gate: planning happens at claim time (the worker's plan tick),
269
+ * so a one-line backlog ticket is promotable. Blockers are claim-time facts
270
+ * that `claim`/`--claimable` already enforce live, so promoting a blocked
271
+ * ticket is legitimate sequencing ("build this once NIC-11 lands") — reported
272
+ * as a hold, never refused. Open asks aren't a hold at all: they don't gate
273
+ * claiming, only done. Writes the ticket like `update` does; committing is
274
+ * the caller's job.
275
+ */
276
+ export function promote(store, key) {
277
+ const task = store.get(key);
278
+ const id = store.displayId(key);
279
+ if (!task)
280
+ throw new ClaimError(`no such task: ${id}`, "invalid");
281
+ if (task.status !== "backlog") {
282
+ throw new ClaimError(`${id} is ${task.status} — only backlog tickets can be promoted`, "invalid");
283
+ }
284
+ const updated = store.update(key, { status: "todo" });
285
+ const holds = [];
286
+ const blockers = openBlockers(store, updated);
287
+ if (blockers.length)
288
+ holds.push(`blocked by ${blockers.join(", ")}`);
289
+ return { task: updated, holds };
290
+ }
291
+ /**
292
+ * The boards `claim --next` and `list --claimable` select over, in priority
293
+ * order. Resolution: an explicit `--board` list > the root board's top-level
294
+ * `boards` key > the nearest board alone. The list is *selection scope*, not
295
+ * permission — `task claim <id>` works on any board regardless — and it's
296
+ * read from the repo's root board only, so a vendored board can't opt itself
297
+ * into a repo's automation by shipping a config.
298
+ */
299
+ export function selectionBoards(cwd, prefixes) {
300
+ const scope = findScopeRoot(cwd);
301
+ let wanted = prefixes?.length ? prefixes : undefined;
302
+ if (!wanted) {
303
+ try {
304
+ const boards = boardConfig(scope).boards;
305
+ if (Array.isArray(boards) && boards.length > 0)
306
+ wanted = boards.map(String);
307
+ }
308
+ catch {
309
+ // No readable root board — same answer as no boards list.
310
+ }
311
+ }
312
+ if (!wanted) {
313
+ const nearest = findRoot(cwd);
314
+ if (!nearest) {
315
+ throw new ClaimError("no .task directory found in this directory or any parent — run `task init` first", "invalid");
316
+ }
317
+ return [openBoard(nearest)];
318
+ }
319
+ return wanted.map((prefix) => {
320
+ const matches = findBoardsByPrefix(scope, prefix);
321
+ if (matches.length === 1)
322
+ return openBoard(matches[0].root);
323
+ throw new ClaimError(matches.length === 0
324
+ ? `no board with prefix ${prefix.toUpperCase()} in this repo — check --board and the root board's "boards" list`
325
+ : `prefix ${prefix.toUpperCase()} is ambiguous — boards at: ${matches.map((m) => m.id).join(", ")}`, "invalid");
326
+ });
327
+ }
328
+ /**
329
+ * `task claim --next`: walk the selection scope in priority order and claim
330
+ * the first ticket that sticks. Losing a race for one ticket (another worker
331
+ * pushed its branch first) means *try the next*, so every ClaimError inside
332
+ * the loop is a skip — which is why the repo-level preconditions (dirty tree,
333
+ * malformed prefix, WIP cap) are asserted up front, where they still mean
334
+ * "stop and fix something" (exit 2) instead of draining the queue to a bogus
335
+ * "nothing claimable". Returns null when the queue really is empty (exit 1).
336
+ */
337
+ export function claimNext(stores, options = {}) {
338
+ const first = stores[0];
339
+ const tree = git(first.root, "status", "--porcelain", "-uno");
340
+ if (tree.status !== 0) {
341
+ throw new ClaimError(`not a git repository: ${first.root}`, "invalid");
342
+ }
343
+ if (tree.stdout !== "") {
344
+ throw new ClaimError("working tree is dirty — commit or stash before claiming, the claim switches branches", "invalid");
345
+ }
346
+ for (const store of stores)
347
+ claimNamespace(store.config);
348
+ if (!options.force) {
349
+ const namespace = claimNamespace(first.config);
350
+ assertUnderCap(remoteClaims(first.root, namespace), first.root, namespace);
351
+ }
352
+ for (const store of stores) {
353
+ for (const task of claimableTasks(store)) {
354
+ try {
355
+ return claim(store, task.key, options);
356
+ }
357
+ catch (error) {
358
+ // Claimed out from under us, or changed since listing — next in line.
359
+ if (error instanceof ClaimError)
360
+ continue;
361
+ throw error;
362
+ }
363
+ }
364
+ }
365
+ return null;
236
366
  }
237
367
  //# sourceMappingURL=claim.js.map
package/dist/claim.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"claim.js","sourceRoot":"","sources":["../src/claim.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"claim.js","sourceRoot":"","sources":["../src/claim.ts"],"names":[],"mappings":"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"}
@@ -6,8 +6,8 @@
6
6
  * 1. Two concurrent `task claim <same-id>`: exactly one exits 0, the other
7
7
  * exits 1 — git's atomic ref creation is the lock.
8
8
  * 2. Validation failures exit 2 before anything touches git.
9
- * 3. `task list --claimable` is the queue: position order, minus blocked,
10
- * needs-human, and already-claimed tickets.
9
+ * 3. `task list --claimable` is the queue: position order, minus blocked
10
+ * and already-claimed tickets — open asks never exclude a ticket.
11
11
  * 4. `task claim --release` deletes the branch both sides and the ticket is
12
12
  * claimable again.
13
13
  */