taskplane 0.28.4 → 0.28.6

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 (71) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +215 -215
  3. package/bin/gitignore-patterns.mjs +79 -79
  4. package/bin/rpc-wrapper.mjs +1086 -1086
  5. package/bin/taskplane.mjs +3254 -3254
  6. package/dashboard/public/app.js +2573 -2573
  7. package/dashboard/public/index.html +139 -139
  8. package/dashboard/public/style.css +1882 -1882
  9. package/dashboard/public/taskplane-word-color.svg +18 -18
  10. package/dashboard/public/taskplane-word-white.svg +18 -18
  11. package/dashboard/server.cjs +1666 -1666
  12. package/extensions/reviewer-extension.ts +119 -119
  13. package/extensions/task-orchestrator.ts +28 -28
  14. package/extensions/taskplane/abort.ts +502 -502
  15. package/extensions/taskplane/agent-bridge-extension.ts +838 -765
  16. package/extensions/taskplane/agent-host.ts +833 -745
  17. package/extensions/taskplane/cleanup.ts +747 -747
  18. package/extensions/taskplane/config-loader.ts +1328 -1322
  19. package/extensions/taskplane/config-schema.ts +692 -682
  20. package/extensions/taskplane/config.ts +73 -73
  21. package/extensions/taskplane/context-window.ts +66 -66
  22. package/extensions/taskplane/diagnostic-reports.ts +463 -463
  23. package/extensions/taskplane/diagnostics.ts +385 -385
  24. package/extensions/taskplane/engine-worker-entry.mjs +34 -34
  25. package/extensions/taskplane/engine-worker.ts +381 -381
  26. package/extensions/taskplane/engine.ts +4539 -4527
  27. package/extensions/taskplane/execution.ts +2733 -2708
  28. package/extensions/taskplane/extension.ts +30 -9
  29. package/extensions/taskplane/formatting.ts +773 -773
  30. package/extensions/taskplane/git.ts +90 -90
  31. package/extensions/taskplane/index.ts +28 -28
  32. package/extensions/taskplane/lane-runner.ts +1383 -1360
  33. package/extensions/taskplane/mailbox.ts +689 -689
  34. package/extensions/taskplane/merge.ts +3135 -3135
  35. package/extensions/taskplane/messages.ts +985 -985
  36. package/extensions/taskplane/migrations.ts +278 -278
  37. package/extensions/taskplane/naming.ts +117 -117
  38. package/extensions/taskplane/path-resolver.ts +237 -237
  39. package/extensions/taskplane/persistence.ts +2087 -2087
  40. package/extensions/taskplane/process-registry.ts +416 -416
  41. package/extensions/taskplane/quality-gate.ts +1033 -1033
  42. package/extensions/taskplane/resume.ts +2879 -2878
  43. package/extensions/taskplane/sessions.ts +57 -57
  44. package/extensions/taskplane/settings-loader.ts +136 -136
  45. package/extensions/taskplane/settings-tui.ts +1867 -1867
  46. package/extensions/taskplane/sidecar-telemetry.ts +252 -252
  47. package/extensions/taskplane/supervisor-primer.md +1694 -1694
  48. package/extensions/taskplane/supervisor.ts +4341 -4341
  49. package/extensions/taskplane/task-executor-core.ts +550 -550
  50. package/extensions/taskplane/tmux-compat.ts +37 -37
  51. package/extensions/taskplane/types.ts +4297 -4278
  52. package/extensions/taskplane/verification.ts +542 -542
  53. package/extensions/taskplane/waves.ts +1548 -1548
  54. package/extensions/taskplane/workspace.ts +705 -705
  55. package/extensions/taskplane/worktree.ts +2604 -2505
  56. package/package.json +57 -57
  57. package/skills/create-taskplane-task/SKILL.md +465 -465
  58. package/skills/create-taskplane-task/references/prompt-template.md +285 -285
  59. package/templates/agents/local/supervisor.md +33 -33
  60. package/templates/agents/local/task-merger.md +27 -27
  61. package/templates/agents/local/task-reviewer.md +30 -30
  62. package/templates/agents/local/task-worker.md +34 -34
  63. package/templates/agents/supervisor-routing.md +92 -92
  64. package/templates/agents/supervisor.md +168 -168
  65. package/templates/agents/task-merger.md +214 -214
  66. package/templates/agents/task-reviewer.md +192 -192
  67. package/templates/agents/task-worker.md +505 -429
  68. package/templates/tasks/EXAMPLE-001-hello-world/PROMPT.md +98 -98
  69. package/templates/tasks/EXAMPLE-001-hello-world/STATUS.md +73 -73
  70. package/templates/tasks/EXAMPLE-002-parallel-smoke/PROMPT.md +97 -97
  71. package/templates/tasks/EXAMPLE-002-parallel-smoke/STATUS.md +73 -73
@@ -1,119 +1,119 @@
1
- /**
2
- * Persistent Reviewer Extension — TP-057
3
- *
4
- * Provides the `wait_for_review` tool that enables a reviewer agent to stay
5
- * alive across multiple review requests within a single task. The tool blocks
6
- * (via filesystem polling) until the task-runner signals a new review request
7
- * or shutdown.
8
- *
9
- * Signal protocol:
10
- * - `.reviews/.review-signal-{NNN}` — new review request available
11
- * - `.reviews/.review-shutdown` — reviewer should exit cleanly
12
- * - `.reviews/request-R{NNN}.md` — review request content
13
- *
14
- * Environment:
15
- * - REVIEWER_SIGNAL_DIR — path to .reviews/ directory (required)
16
- */
17
-
18
- import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
19
- import { Type } from "@mariozechner/pi-ai";
20
- import { existsSync, readFileSync } from "fs";
21
- import { join } from "path";
22
- import {
23
- REVIEWER_POLL_INTERVAL_MS,
24
- REVIEWER_WAIT_TIMEOUT_MS,
25
- REVIEWER_SHUTDOWN_SIGNAL,
26
- REVIEWER_SIGNAL_PREFIX,
27
- } from "./taskplane/types.ts";
28
-
29
- // ── Extension ────────────────────────────────────────────────────────
30
-
31
- export default function reviewerExtension(pi: ExtensionAPI) {
32
- const signalDir = process.env.REVIEWER_SIGNAL_DIR;
33
-
34
- if (!signalDir) {
35
- // Not running in persistent reviewer mode — skip tool registration.
36
- // This allows the extension to be loaded in non-persistent contexts
37
- // without error (fallback fresh-spawn mode).
38
- return;
39
- }
40
-
41
- /** Counter tracking which signal number to watch for next. */
42
- let nextSignalNum = 1;
43
-
44
- pi.registerTool({
45
- name: "wait_for_review",
46
- label: "Wait for Review",
47
- description:
48
- "Block until the next review request is available, then return its content. " +
49
- "Call this after completing each review to wait for the next one. " +
50
- "Returns 'SHUTDOWN' when the task is complete and you should exit.",
51
- promptSnippet: "wait_for_review() — block until the next review request arrives (persistent reviewer mode)",
52
- promptGuidelines: [
53
- "Call wait_for_review() to receive each review request.",
54
- "After writing your review to the specified output file, call wait_for_review() again.",
55
- "When it returns 'SHUTDOWN', exit cleanly — the task is complete.",
56
- "Reference your previous reviews when relevant (e.g., 'I flagged X in Step 1 — checking if addressed').",
57
- ],
58
- parameters: Type.Object({}),
59
- async execute() {
60
- const startTime = Date.now();
61
- const signalNum = String(nextSignalNum).padStart(3, "0");
62
- const signalPath = join(signalDir, `${REVIEWER_SIGNAL_PREFIX}${signalNum}`);
63
- const shutdownPath = join(signalDir, REVIEWER_SHUTDOWN_SIGNAL);
64
-
65
- // Poll for signal file or shutdown
66
- while (true) {
67
- // Check for shutdown signal first
68
- if (existsSync(shutdownPath)) {
69
- return {
70
- content: [{ type: "text" as const, text: "SHUTDOWN — The task is complete. Exit cleanly." }],
71
- details: undefined,
72
- };
73
- }
74
-
75
- // Check for review signal
76
- if (existsSync(signalPath)) {
77
- // Signal found — read the request file path from signal content.
78
- // Signal file content is the request filename (e.g., "request-R003.md").
79
- const signalContent = readFileSync(signalPath, "utf-8").trim();
80
- const requestPath = join(signalDir, signalContent);
81
-
82
- if (!existsSync(requestPath)) {
83
- // Signal fired but request file doesn't exist (race condition or error)
84
- return {
85
- content: [{
86
- type: "text" as const,
87
- text: `ERROR — Signal file ${REVIEWER_SIGNAL_PREFIX}${signalNum} found but ` +
88
- `${signalContent} does not exist. Waiting for next signal.`,
89
- }],
90
- details: undefined,
91
- };
92
- }
93
-
94
- const requestContent = readFileSync(requestPath, "utf-8");
95
- nextSignalNum++;
96
-
97
- return {
98
- content: [{ type: "text" as const, text: requestContent }],
99
- details: undefined,
100
- };
101
- }
102
-
103
- // Check timeout
104
- if (Date.now() - startTime > REVIEWER_WAIT_TIMEOUT_MS) {
105
- return {
106
- content: [{
107
- type: "text" as const,
108
- text: "TIMEOUT — No review request received within the timeout period. Exit cleanly.",
109
- }],
110
- details: undefined,
111
- };
112
- }
113
-
114
- // Wait before next poll
115
- await new Promise(resolve => setTimeout(resolve, REVIEWER_POLL_INTERVAL_MS));
116
- }
117
- },
118
- });
119
- }
1
+ /**
2
+ * Persistent Reviewer Extension — TP-057
3
+ *
4
+ * Provides the `wait_for_review` tool that enables a reviewer agent to stay
5
+ * alive across multiple review requests within a single task. The tool blocks
6
+ * (via filesystem polling) until the task-runner signals a new review request
7
+ * or shutdown.
8
+ *
9
+ * Signal protocol:
10
+ * - `.reviews/.review-signal-{NNN}` — new review request available
11
+ * - `.reviews/.review-shutdown` — reviewer should exit cleanly
12
+ * - `.reviews/request-R{NNN}.md` — review request content
13
+ *
14
+ * Environment:
15
+ * - REVIEWER_SIGNAL_DIR — path to .reviews/ directory (required)
16
+ */
17
+
18
+ import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
19
+ import { Type } from "@mariozechner/pi-ai";
20
+ import { existsSync, readFileSync } from "fs";
21
+ import { join } from "path";
22
+ import {
23
+ REVIEWER_POLL_INTERVAL_MS,
24
+ REVIEWER_WAIT_TIMEOUT_MS,
25
+ REVIEWER_SHUTDOWN_SIGNAL,
26
+ REVIEWER_SIGNAL_PREFIX,
27
+ } from "./taskplane/types.ts";
28
+
29
+ // ── Extension ────────────────────────────────────────────────────────
30
+
31
+ export default function reviewerExtension(pi: ExtensionAPI) {
32
+ const signalDir = process.env.REVIEWER_SIGNAL_DIR;
33
+
34
+ if (!signalDir) {
35
+ // Not running in persistent reviewer mode — skip tool registration.
36
+ // This allows the extension to be loaded in non-persistent contexts
37
+ // without error (fallback fresh-spawn mode).
38
+ return;
39
+ }
40
+
41
+ /** Counter tracking which signal number to watch for next. */
42
+ let nextSignalNum = 1;
43
+
44
+ pi.registerTool({
45
+ name: "wait_for_review",
46
+ label: "Wait for Review",
47
+ description:
48
+ "Block until the next review request is available, then return its content. " +
49
+ "Call this after completing each review to wait for the next one. " +
50
+ "Returns 'SHUTDOWN' when the task is complete and you should exit.",
51
+ promptSnippet: "wait_for_review() — block until the next review request arrives (persistent reviewer mode)",
52
+ promptGuidelines: [
53
+ "Call wait_for_review() to receive each review request.",
54
+ "After writing your review to the specified output file, call wait_for_review() again.",
55
+ "When it returns 'SHUTDOWN', exit cleanly — the task is complete.",
56
+ "Reference your previous reviews when relevant (e.g., 'I flagged X in Step 1 — checking if addressed').",
57
+ ],
58
+ parameters: Type.Object({}),
59
+ async execute() {
60
+ const startTime = Date.now();
61
+ const signalNum = String(nextSignalNum).padStart(3, "0");
62
+ const signalPath = join(signalDir, `${REVIEWER_SIGNAL_PREFIX}${signalNum}`);
63
+ const shutdownPath = join(signalDir, REVIEWER_SHUTDOWN_SIGNAL);
64
+
65
+ // Poll for signal file or shutdown
66
+ while (true) {
67
+ // Check for shutdown signal first
68
+ if (existsSync(shutdownPath)) {
69
+ return {
70
+ content: [{ type: "text" as const, text: "SHUTDOWN — The task is complete. Exit cleanly." }],
71
+ details: undefined,
72
+ };
73
+ }
74
+
75
+ // Check for review signal
76
+ if (existsSync(signalPath)) {
77
+ // Signal found — read the request file path from signal content.
78
+ // Signal file content is the request filename (e.g., "request-R003.md").
79
+ const signalContent = readFileSync(signalPath, "utf-8").trim();
80
+ const requestPath = join(signalDir, signalContent);
81
+
82
+ if (!existsSync(requestPath)) {
83
+ // Signal fired but request file doesn't exist (race condition or error)
84
+ return {
85
+ content: [{
86
+ type: "text" as const,
87
+ text: `ERROR — Signal file ${REVIEWER_SIGNAL_PREFIX}${signalNum} found but ` +
88
+ `${signalContent} does not exist. Waiting for next signal.`,
89
+ }],
90
+ details: undefined,
91
+ };
92
+ }
93
+
94
+ const requestContent = readFileSync(requestPath, "utf-8");
95
+ nextSignalNum++;
96
+
97
+ return {
98
+ content: [{ type: "text" as const, text: requestContent }],
99
+ details: undefined,
100
+ };
101
+ }
102
+
103
+ // Check timeout
104
+ if (Date.now() - startTime > REVIEWER_WAIT_TIMEOUT_MS) {
105
+ return {
106
+ content: [{
107
+ type: "text" as const,
108
+ text: "TIMEOUT — No review request received within the timeout period. Exit cleanly.",
109
+ }],
110
+ details: undefined,
111
+ };
112
+ }
113
+
114
+ // Wait before next poll
115
+ await new Promise(resolve => setTimeout(resolve, REVIEWER_POLL_INTERVAL_MS));
116
+ }
117
+ },
118
+ });
119
+ }
@@ -1,28 +1,28 @@
1
- /**
2
- * Task Orchestrator — Parallel task execution with git worktrees
3
- *
4
- * This is a thin facade that re-exports everything from the taskplane/ modules.
5
- * The actual implementation lives in extensions/taskplane/*.ts.
6
- *
7
- * Commands:
8
- * /orch <areas|paths|all> — Start batch execution
9
- * /orch-plan <areas|paths|all> — Preview execution plan (no execution)
10
- * /orch-status — Show current batch progress
11
- * /orch-pause — Pause after current tasks finish
12
- * /orch-resume — Resume a paused batch
13
- * /orch-abort [--hard] — Abort batch (graceful or immediate)
14
- * /orch-deps <areas|paths|all> — Show dependency graph
15
- * /orch-sessions — List active lane sessions
16
- *
17
- * Configuration:
18
- * .pi/task-orchestrator.yaml — orchestrator-specific settings
19
- * .pi/task-runner.yaml — task areas, worker/reviewer config (shared)
20
- *
21
- * Usage: pi -e extensions/task-orchestrator.ts
22
- */
23
-
24
- // Re-export all named exports for tests and other consumers
25
- export * from "./taskplane/index.ts";
26
-
27
- // Re-export the default activate function for the pi extension system
28
- export { default } from "./taskplane/extension.ts";
1
+ /**
2
+ * Task Orchestrator — Parallel task execution with git worktrees
3
+ *
4
+ * This is a thin facade that re-exports everything from the taskplane/ modules.
5
+ * The actual implementation lives in extensions/taskplane/*.ts.
6
+ *
7
+ * Commands:
8
+ * /orch <areas|paths|all> — Start batch execution
9
+ * /orch-plan <areas|paths|all> — Preview execution plan (no execution)
10
+ * /orch-status — Show current batch progress
11
+ * /orch-pause — Pause after current tasks finish
12
+ * /orch-resume — Resume a paused batch
13
+ * /orch-abort [--hard] — Abort batch (graceful or immediate)
14
+ * /orch-deps <areas|paths|all> — Show dependency graph
15
+ * /orch-sessions — List active lane sessions
16
+ *
17
+ * Configuration:
18
+ * .pi/task-orchestrator.yaml — orchestrator-specific settings
19
+ * .pi/task-runner.yaml — task areas, worker/reviewer config (shared)
20
+ *
21
+ * Usage: pi -e extensions/task-orchestrator.ts
22
+ */
23
+
24
+ // Re-export all named exports for tests and other consumers
25
+ export * from "./taskplane/index.ts";
26
+
27
+ // Re-export the default activate function for the pi extension system
28
+ export { default } from "./taskplane/extension.ts";