@afokapu/atdd-flow 0.3.4 → 0.3.5
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 +1 -1
- package/package.json +1 -1
- package/src/cli.ts +3 -1
- package/src/tasks.ts +11 -0
package/README.md
CHANGED
|
@@ -130,7 +130,7 @@ atdd-flow behavioral-review launch resolver-os runtime-rollout --by coordinator@
|
|
|
130
130
|
atdd-flow task done resolver-os runtime-rollout --by coordinator@resolver-os
|
|
131
131
|
```
|
|
132
132
|
|
|
133
|
-
Proof is a compact PR, CI run, report, commit range, deployment, or thread reference. Dependencies gate prerequisites; independent tasks are parallel-ready. A coordinator can staff an unassigned ready task with `atdd-flow task assign <project> <task-id> --assignee <address> --by <coordinator-address>`; assignment is allowed only once while the task is `todo`. Use `task block` only for a real external blocker, then checkpoint exact state and next action. For deliveries explicitly governed by the `workflow` ATDD Bun profile, `review → done` additionally requires a durable final behavioral-review result with decision `APPROVE` for the current clean delivery commit. For an idle driver’s final task, `task done ... --retire-assignee` delegates clean-and-merged worktree retirement to ATDD Bun.
|
|
133
|
+
Proof is a compact PR, CI run, report, commit range, deployment, or thread reference. Dependencies gate prerequisites; independent tasks are parallel-ready. A coordinator can staff an unassigned ready task with `atdd-flow task assign <project> <task-id> --assignee <address> --by <coordinator-address>`; assignment is allowed only once while the task is `todo`. Use `task block` only for a real external blocker, then checkpoint exact state and next action. Once the blocker is resolved, only that coordinator can clear it with `atdd-flow task unblock <project> <task-id> --by <coordinator-address>` while the task remains `in_progress`. For deliveries explicitly governed by the `workflow` ATDD Bun profile, `review → done` additionally requires a durable final behavioral-review result with decision `APPROVE` for the current clean delivery commit. For an idle driver’s final task, `task done ... --retire-assignee` delegates clean-and-merged worktree retirement to ATDD Bun.
|
|
134
134
|
|
|
135
135
|
## Communicate and hand over
|
|
136
136
|
|
package/package.json
CHANGED
package/src/cli.ts
CHANGED
|
@@ -35,6 +35,7 @@ Usage:
|
|
|
35
35
|
atdd-flow task done <project> <task-id> --by <address> [--retire-assignee]
|
|
36
36
|
atdd-flow task prove <project> <task-id> --by <address> --item <number> --proof <reference>
|
|
37
37
|
atdd-flow task block <project> <task-id> --by <address> --reason <text>
|
|
38
|
+
atdd-flow task unblock <project> <task-id> --by <coordinator-address>
|
|
38
39
|
atdd-flow task list <project> [--coordinator <address>] [--assignee <address>]
|
|
39
40
|
atdd-flow task open <project> <task-id>
|
|
40
41
|
atdd-flow thread start --with <address,...> --subject <text> [--task <project/task-id>]
|
|
@@ -100,9 +101,10 @@ async function main() {
|
|
|
100
101
|
if (subcommand === "return") return tasks.returnToWork(root, required(projectName, "project"), required(taskId, "task id"), tail);
|
|
101
102
|
if (subcommand === "prove") return tasks.prove(root, required(projectName, "project"), required(taskId, "task id"), tail);
|
|
102
103
|
if (subcommand === "block") return tasks.block(root, required(projectName, "project"), required(taskId, "task id"), tail);
|
|
104
|
+
if (subcommand === "unblock") return tasks.unblock(root, required(projectName, "project"), required(taskId, "task id"), tail);
|
|
103
105
|
if (subcommand === "list") return tasks.list(root, required(projectName, "project"), rest.slice(2));
|
|
104
106
|
if (subcommand === "open") return tasks.open(root, required(projectName, "project"), required(taskId, "task id"));
|
|
105
|
-
throw new Error("Use `atdd-flow task add|assign|amend|import|start|prove|review|return|done|block|list|open`.");
|
|
107
|
+
throw new Error("Use `atdd-flow task add|assign|amend|import|start|prove|review|return|done|block|unblock|list|open`.");
|
|
106
108
|
},
|
|
107
109
|
thread: async () => {
|
|
108
110
|
const [subcommand, ...tail] = rest;
|
package/src/tasks.ts
CHANGED
|
@@ -240,6 +240,17 @@ export async function block(root: string, projectName: string, id: string, args:
|
|
|
240
240
|
console.log(`${id} blocked`);
|
|
241
241
|
}
|
|
242
242
|
|
|
243
|
+
export async function unblock(root: string, projectName: string, id: string, args: string[]) {
|
|
244
|
+
const task = await readTask(root, projectName, taskId(id));
|
|
245
|
+
const actor = await canonicalAddress(root, required(words(args, "--by"), "--by"));
|
|
246
|
+
if (actor !== task.coordinator) throw new Error(`Only ${task.coordinator} may unblock task ${id}.`);
|
|
247
|
+
if (task.status !== "in_progress") throw new Error(`Task ${id} can only be unblocked while in_progress.`);
|
|
248
|
+
if (!task.blocker) throw new Error(`Task ${id} has no blocker to clear.`);
|
|
249
|
+
delete task.blocker;
|
|
250
|
+
await writeTask(root, projectName, id, task);
|
|
251
|
+
console.log(`${id} unblocked`);
|
|
252
|
+
}
|
|
253
|
+
|
|
243
254
|
export async function list(root: string, projectName: string, args: string[]) {
|
|
244
255
|
const coordinator = words(args, "--coordinator") ? await canonicalAddress(root, required(words(args, "--coordinator"), "--coordinator")) : undefined;
|
|
245
256
|
const assignee = words(args, "--assignee") ? await canonicalAddress(root, required(words(args, "--assignee"), "--assignee")) : undefined;
|