@pi-orca/tasks 0.0.2-dev.20260413162335

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/dist/index.js ADDED
@@ -0,0 +1,229 @@
1
+ /**
2
+ * Pi Orca Tasks Extension
3
+ * File-backed task DAG with locking.
4
+ * Spec: §3 — pi-orca-tasks Extension
5
+ */
6
+ import { executeTaskTool } from "./tool.js";
7
+ import { renderTaskWidget } from "./widget.js";
8
+ import { cmdTaskList, cmdTaskStuck, cmdTaskUnlock, cmdTaskDeps, cmdTaskValidate, } from "./commands.js";
9
+ import { listTasks } from "./engine/crud.js";
10
+ import { resolveCompletions } from "@pi-orca/core";
11
+ export { executeTaskTool } from "./tool.js";
12
+ export * from "./engine/index.js";
13
+ export { renderTaskWidget } from "./widget.js";
14
+ export * from "./commands.js";
15
+ // ─── completion cache (updated on session_start) ─────────────────────────────
16
+ let _cachedTaskIds = [];
17
+ const TASK_STATUSES = ["pending", "in_progress", "completed", "failed", "blocked", "abandoned"];
18
+ function buildTaskTree() {
19
+ return {
20
+ items: [
21
+ { value: "list", label: "list", description: "List tasks" },
22
+ { value: "create", label: "create", description: "Create a new task" },
23
+ { value: "stuck", label: "stuck", description: "Show stuck tasks" },
24
+ { value: "unlock", label: "unlock", description: "Force-release a task lock" },
25
+ { value: "deps", label: "deps", description: "Show task dependencies" },
26
+ { value: "validate", label: "validate", description: "Validate task files" },
27
+ ],
28
+ children: {
29
+ list: {
30
+ items: TASK_STATUSES.map((s) => ({ value: s, label: s })),
31
+ },
32
+ create: { freeform: true },
33
+ unlock: {
34
+ dynamicItems: () => _cachedTaskIds.map((t) => ({
35
+ value: t.id,
36
+ label: t.id,
37
+ description: `${t.title} [${t.status}]`,
38
+ })),
39
+ },
40
+ deps: {
41
+ dynamicItems: () => _cachedTaskIds.map((t) => ({
42
+ value: t.id,
43
+ label: t.id,
44
+ description: `${t.title} [${t.status}]`,
45
+ })),
46
+ },
47
+ validate: {
48
+ dynamicItems: () => _cachedTaskIds.map((t) => ({
49
+ value: t.id,
50
+ label: t.id,
51
+ description: `${t.title} [${t.status}]`,
52
+ })),
53
+ },
54
+ },
55
+ };
56
+ }
57
+ let widgetVisible = false;
58
+ export function register(pi) {
59
+ console.log("pi-orca-tasks: Registering extension");
60
+ // Register task tool with full implementation
61
+ pi.registerTool?.({
62
+ name: "task",
63
+ label: "Task Management",
64
+ description: "Manage file-backed tasks with dependencies. Actions: create, claim, complete, fail, abandon, list, unlock, update, retry, note, unclaim",
65
+ parameters: {
66
+ type: "object",
67
+ properties: {
68
+ action: {
69
+ type: "string",
70
+ enum: [
71
+ "create",
72
+ "claim",
73
+ "complete",
74
+ "fail",
75
+ "abandon",
76
+ "list",
77
+ "unlock",
78
+ "update",
79
+ "retry",
80
+ "note",
81
+ "unclaim",
82
+ ],
83
+ description: "Action to perform",
84
+ },
85
+ taskId: { type: "string", description: "Task ID (required for most actions)" },
86
+ title: { type: "string", description: "Task title (required for create)" },
87
+ description: { type: "string", description: "Task description (for create)" },
88
+ dependencies: {
89
+ type: "array",
90
+ items: { type: "string" },
91
+ description: "Task IDs this task depends on",
92
+ },
93
+ labels: {
94
+ type: "object",
95
+ description: "Key-value labels for filtering",
96
+ },
97
+ status: { type: "string", description: "Status filter for list action" },
98
+ note: { type: "string", description: "Note content (required for fail, abandon, note actions)" },
99
+ },
100
+ required: ["action"],
101
+ },
102
+ async execute(toolCallId, params, signal, onUpdate, ctx) {
103
+ const sessionId = ctx?.sessionId ?? process.env["PI_SESSION_ID"] ?? "default-session";
104
+ const sessionPath = ctx?.sessionPath ?? process.env["PI_SESSION_PATH"] ?? "";
105
+ const result = await executeTaskTool({
106
+ ...params,
107
+ sessionId,
108
+ sessionPath,
109
+ });
110
+ // Refresh widget after state changes
111
+ if (widgetVisible &&
112
+ ctx?.ui?.setWidget &&
113
+ ["create", "claim", "complete", "fail", "abandon", "unclaim", "retry", "unlock", "update"].includes(params.action)) {
114
+ const widgetContent = await renderTaskWidget();
115
+ ctx.ui.setWidget("pi-orca-tasks", widgetContent);
116
+ }
117
+ return result;
118
+ },
119
+ });
120
+ // Register slash commands
121
+ pi.registerCommand("task", {
122
+ description: "Manage tasks or toggle task widget",
123
+ getArgumentCompletions(prefix) {
124
+ return resolveCompletions(prefix, buildTaskTree());
125
+ },
126
+ handler: async (args, ctx) => {
127
+ const parts = args ? args.trim().split(/\s+/) : [];
128
+ const subcommand = parts[0];
129
+ if (!subcommand) {
130
+ // Toggle widget
131
+ widgetVisible = !widgetVisible;
132
+ if (widgetVisible) {
133
+ const content = await renderTaskWidget();
134
+ ctx.ui.setWidget("pi-orca-tasks", content);
135
+ ctx.ui.notify("Task widget shown", "info");
136
+ }
137
+ else {
138
+ ctx.ui.setWidget("pi-orca-tasks", undefined);
139
+ ctx.ui.notify("Task widget hidden", "info");
140
+ }
141
+ return;
142
+ }
143
+ switch (subcommand.toLowerCase()) {
144
+ case "list": {
145
+ const statusFilter = parts[1];
146
+ const result = await cmdTaskList(statusFilter);
147
+ ctx.ui.notify(result, "info");
148
+ break;
149
+ }
150
+ case "create": {
151
+ const title = parts.slice(1).join(" ");
152
+ if (!title) {
153
+ ctx.ui.notify("Usage: /task create <title>", "error");
154
+ break;
155
+ }
156
+ const result = await executeTaskTool({
157
+ action: "create",
158
+ title,
159
+ sessionId: ctx?.sessionManager?.getSessionFile?.() ?? "default-session",
160
+ sessionPath: ctx?.sessionManager?.getSessionFile?.() ?? "",
161
+ });
162
+ if (result.success) {
163
+ ctx.ui.notify(`Created task: ${result.task?.id} — ${title}`, "info");
164
+ }
165
+ else {
166
+ ctx.ui.notify(`Error: ${result.error}`, "error");
167
+ }
168
+ break;
169
+ }
170
+ case "stuck": {
171
+ const result = await cmdTaskStuck();
172
+ ctx.ui.notify(result, "info");
173
+ break;
174
+ }
175
+ case "unlock": {
176
+ const taskId = parts[1];
177
+ if (!taskId) {
178
+ ctx.ui.notify("Usage: /task unlock <id>", "error");
179
+ break;
180
+ }
181
+ const result = await cmdTaskUnlock(taskId);
182
+ ctx.ui.notify(result, result.startsWith("Error") ? "error" : "info");
183
+ break;
184
+ }
185
+ case "deps": {
186
+ const taskId = parts[1];
187
+ if (!taskId) {
188
+ ctx.ui.notify("Usage: /task deps <id>", "error");
189
+ break;
190
+ }
191
+ const result = await cmdTaskDeps(taskId);
192
+ ctx.ui.notify(result, "info");
193
+ break;
194
+ }
195
+ case "validate": {
196
+ const taskId = parts[1];
197
+ const result = await cmdTaskValidate(taskId);
198
+ ctx.ui.notify(result, result.includes("Error") || result.includes("invalid") ? "warning" : "info");
199
+ break;
200
+ }
201
+ default:
202
+ ctx.ui.notify(`Unknown subcommand '${subcommand}'. Available: list, create, stuck, unlock, deps, validate`, "error");
203
+ }
204
+ },
205
+ });
206
+ // Populate caches and emit ready event on session_start
207
+ pi.on("session_start", async () => {
208
+ try {
209
+ const tasks = await listTasks({});
210
+ _cachedTaskIds = tasks.map((t) => ({
211
+ id: t.task.id,
212
+ title: t.task.title,
213
+ status: t.task.status,
214
+ }));
215
+ }
216
+ catch {
217
+ // Task directory may not exist yet — leave cache empty
218
+ }
219
+ pi.events?.emit("orca:tasks:ready", {});
220
+ console.log("pi-orca-tasks: Ready");
221
+ });
222
+ // Check for other extensions
223
+ pi.events?.on("orca:models:ready", () => {
224
+ console.log("pi-orca-tasks: pi-orca-models detected");
225
+ });
226
+ console.log("pi-orca-tasks: Registered");
227
+ }
228
+ export default register;
229
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/tool.d.ts ADDED
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Task tool action dispatcher.
3
+ * Spec: §3.9 — Tool Schema
4
+ */
5
+ export interface TaskToolParams {
6
+ action: "create" | "claim" | "complete" | "fail" | "abandon" | "list" | "unlock" | "update" | "retry" | "note" | "unclaim";
7
+ taskId?: string;
8
+ title?: string;
9
+ description?: string;
10
+ dependencies?: string[];
11
+ labels?: Record<string, string>;
12
+ status?: string;
13
+ note?: string;
14
+ sessionId?: string;
15
+ sessionPath?: string;
16
+ projectSlug?: string;
17
+ }
18
+ export declare function executeTaskTool(params: TaskToolParams): Promise<Record<string, unknown>>;
19
+ //# sourceMappingURL=tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../src/tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAsBH,MAAM,WAAW,cAAc;IAC7B,MAAM,EACF,QAAQ,GACR,OAAO,GACP,UAAU,GACV,MAAM,GACN,SAAS,GACT,MAAM,GACN,QAAQ,GACR,QAAQ,GACR,OAAO,GACP,MAAM,GACN,SAAS,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAsB,eAAe,CACnC,MAAM,EAAE,cAAc,GACrB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CA6LlC"}
package/dist/tool.js ADDED
@@ -0,0 +1,188 @@
1
+ /**
2
+ * Task tool action dispatcher.
3
+ * Spec: §3.9 — Tool Schema
4
+ */
5
+ import { createTask, readTask, listTasks, updateTask as updateTaskCrud, syncDependentLinks, buildDependencyMaps, } from "./engine/crud.js";
6
+ import { claimTask, completeTask, failTask, abandonTask, unclaimTask, retryTask, unlockTask, } from "./engine/state-machine.js";
7
+ import { addNote } from "./engine/notes.js";
8
+ import { validateDependencies } from "./engine/dag.js";
9
+ export async function executeTaskTool(params) {
10
+ const sessionId = params.sessionId ?? process.env["PI_SESSION_ID"] ?? "default-session";
11
+ const sessionPath = params.sessionPath ?? process.env["PI_SESSION_PATH"] ?? "";
12
+ const projectSlug = params.projectSlug;
13
+ switch (params.action) {
14
+ case "create": {
15
+ if (!params.title) {
16
+ return { success: false, error: "The 'title' parameter is required for create action" };
17
+ }
18
+ // Validate dependencies exist and no cycles
19
+ if (params.dependencies && params.dependencies.length > 0) {
20
+ // Check each dep task exists
21
+ for (const dep of params.dependencies) {
22
+ const depFile = await readTask(dep, projectSlug);
23
+ if (!depFile) {
24
+ return { success: false, error: `Dependency task ${dep} not found` };
25
+ }
26
+ }
27
+ // We need a temporary fake ID to check for cycles (task doesn't exist yet)
28
+ // Use a deterministic placeholder
29
+ const tempId = `__new__`;
30
+ const { dependencies: depMap } = await buildDependencyMaps(projectSlug);
31
+ for (const dep of params.dependencies) {
32
+ const { detectCycle } = await import("@pi-orca/core");
33
+ const cycle = detectCycle(tempId, dep, depMap);
34
+ if (cycle) {
35
+ return { success: false, error: `Cycle detected: ${cycle.join(" → ")}` };
36
+ }
37
+ }
38
+ }
39
+ const taskFile = await createTask({
40
+ title: params.title,
41
+ description: params.description,
42
+ dependencies: params.dependencies,
43
+ labels: params.labels,
44
+ projectSlug,
45
+ });
46
+ // Update reverse links
47
+ if (params.dependencies && params.dependencies.length > 0) {
48
+ await syncDependentLinks(taskFile.task.id, [], params.dependencies, projectSlug);
49
+ }
50
+ return { success: true, task: taskFile.task, message: `Created task ${taskFile.task.id}` };
51
+ }
52
+ case "claim": {
53
+ if (!params.taskId) {
54
+ return { success: false, error: "The 'taskId' parameter is required for claim action" };
55
+ }
56
+ const result = await claimTask(params.taskId, sessionId, sessionPath, undefined, projectSlug);
57
+ if (!result.success)
58
+ return { success: false, error: result.error };
59
+ return {
60
+ success: true,
61
+ task: result.task?.task,
62
+ body: result.task?.body,
63
+ claimContext: result.claimContext,
64
+ message: `Claimed task ${params.taskId}`,
65
+ };
66
+ }
67
+ case "complete": {
68
+ if (!params.taskId) {
69
+ return { success: false, error: "The 'taskId' parameter is required for complete action" };
70
+ }
71
+ const result = await completeTask(params.taskId, sessionId, projectSlug);
72
+ if (!result.success)
73
+ return { success: false, error: result.error };
74
+ return { success: true, task: result.task?.task, message: `Completed task ${params.taskId}` };
75
+ }
76
+ case "fail": {
77
+ if (!params.taskId) {
78
+ return { success: false, error: "The 'taskId' parameter is required for fail action" };
79
+ }
80
+ if (!params.note) {
81
+ return { success: false, error: "The 'note' parameter is required when failing a task" };
82
+ }
83
+ const result = await failTask(params.taskId, sessionId, params.note, projectSlug);
84
+ if (!result.success)
85
+ return { success: false, error: result.error };
86
+ return { success: true, task: result.task?.task, message: `Failed task ${params.taskId}` };
87
+ }
88
+ case "abandon": {
89
+ if (!params.taskId) {
90
+ return { success: false, error: "The 'taskId' parameter is required for abandon action" };
91
+ }
92
+ if (!params.note) {
93
+ return { success: false, error: "The 'note' parameter is required when abandoning a task" };
94
+ }
95
+ const result = await abandonTask(params.taskId, sessionId, params.note, projectSlug);
96
+ if (!result.success)
97
+ return { success: false, error: result.error };
98
+ return { success: true, task: result.task?.task, message: `Abandoned task ${params.taskId}` };
99
+ }
100
+ case "unclaim": {
101
+ if (!params.taskId) {
102
+ return { success: false, error: "The 'taskId' parameter is required for unclaim action" };
103
+ }
104
+ const result = await unclaimTask(params.taskId, sessionId, projectSlug);
105
+ if (!result.success)
106
+ return { success: false, error: result.error };
107
+ return { success: true, task: result.task?.task, message: `Unclaimed task ${params.taskId}` };
108
+ }
109
+ case "list": {
110
+ const statusFilter = params.status;
111
+ const tasks = await listTasks({
112
+ status: statusFilter,
113
+ labels: params.labels,
114
+ projectSlug,
115
+ });
116
+ return {
117
+ success: true,
118
+ tasks: tasks.map((t) => t.task),
119
+ count: tasks.length,
120
+ };
121
+ }
122
+ case "unlock": {
123
+ if (!params.taskId) {
124
+ return { success: false, error: "The 'taskId' parameter is required for unlock action" };
125
+ }
126
+ const result = await unlockTask(params.taskId, projectSlug);
127
+ if (!result.success)
128
+ return { success: false, error: result.error };
129
+ return { success: true, task: result.task?.task, message: result.message ?? `Unlocked task ${params.taskId}` };
130
+ }
131
+ case "update": {
132
+ if (!params.taskId) {
133
+ return { success: false, error: "The 'taskId' parameter is required for update action" };
134
+ }
135
+ const taskFile = await readTask(params.taskId, projectSlug);
136
+ if (!taskFile) {
137
+ return { success: false, error: `Task ${params.taskId} not found` };
138
+ }
139
+ const patch = {};
140
+ if (params.title !== undefined)
141
+ patch["title"] = params.title;
142
+ if (params.labels !== undefined)
143
+ patch["labels"] = params.labels;
144
+ if (params.dependencies !== undefined) {
145
+ // Validate new dependencies
146
+ const error = await validateDependencies(params.taskId, params.dependencies, projectSlug);
147
+ if (error)
148
+ return { success: false, error };
149
+ const oldDeps = taskFile.task.dependencies ?? [];
150
+ patch["dependencies"] = params.dependencies;
151
+ const updated = await updateTaskCrud(params.taskId, patch, projectSlug);
152
+ if (!updated)
153
+ return { success: false, error: `Failed to update task ${params.taskId}` };
154
+ // Sync reverse links
155
+ await syncDependentLinks(params.taskId, oldDeps, params.dependencies, projectSlug);
156
+ return { success: true, task: updated.task, message: `Updated task ${params.taskId}` };
157
+ }
158
+ const updated = await updateTaskCrud(params.taskId, patch, projectSlug);
159
+ if (!updated)
160
+ return { success: false, error: `Failed to update task ${params.taskId}` };
161
+ return { success: true, task: updated.task, message: `Updated task ${params.taskId}` };
162
+ }
163
+ case "retry": {
164
+ if (!params.taskId) {
165
+ return { success: false, error: "The 'taskId' parameter is required for retry action" };
166
+ }
167
+ const result = await retryTask(params.taskId, projectSlug);
168
+ if (!result.success)
169
+ return { success: false, error: result.error };
170
+ return { success: true, task: result.task?.task, message: `Retried task ${params.taskId}` };
171
+ }
172
+ case "note": {
173
+ if (!params.taskId) {
174
+ return { success: false, error: "The 'taskId' parameter is required for note action" };
175
+ }
176
+ if (!params.note) {
177
+ return { success: false, error: "The 'note' parameter is required for note action" };
178
+ }
179
+ const result = await addNote(params.taskId, params.note, sessionId, projectSlug);
180
+ if (!result.success)
181
+ return { success: false, error: result.error };
182
+ return { success: true, message: `Added note to task ${params.taskId}` };
183
+ }
184
+ default:
185
+ return { success: false, error: `Unknown action: ${params.action}` };
186
+ }
187
+ }
188
+ //# sourceMappingURL=tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool.js","sourceRoot":"","sources":["../src/tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,UAAU,EACV,QAAQ,EACR,SAAS,EACT,UAAU,IAAI,cAAc,EAC5B,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,SAAS,EACT,YAAY,EACZ,QAAQ,EACR,WAAW,EACX,WAAW,EACX,SAAS,EACT,UAAU,GACX,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AA2BvD,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,MAAsB;IAEtB,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,iBAAiB,CAAC;IACxF,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,EAAE,CAAC;IAC/E,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;IAEvC,QAAQ,MAAM,CAAC,MAAM,EAAE,CAAC;QACtB,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;gBAClB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,qDAAqD,EAAE,CAAC;YAC1F,CAAC;YAED,4CAA4C;YAC5C,IAAI,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC1D,6BAA6B;gBAC7B,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;oBACtC,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;oBACjD,IAAI,CAAC,OAAO,EAAE,CAAC;wBACb,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,mBAAmB,GAAG,YAAY,EAAE,CAAC;oBACvE,CAAC;gBACH,CAAC;gBAED,2EAA2E;gBAC3E,kCAAkC;gBAClC,MAAM,MAAM,GAAG,SAAS,CAAC;gBACzB,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,MAAM,mBAAmB,CAAC,WAAW,CAAC,CAAC;gBACxE,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;oBACtC,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;oBACtD,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;oBAC/C,IAAI,KAAK,EAAE,CAAC;wBACV,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,mBAAmB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;oBAC3E,CAAC;gBACH,CAAC;YACH,CAAC;YAED,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC;gBAChC,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,WAAW,EAAE,MAAM,CAAC,WAAW;gBAC/B,YAAY,EAAE,MAAM,CAAC,YAAY;gBACjC,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,WAAW;aACZ,CAAC,CAAC;YAEH,uBAAuB;YACvB,IAAI,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC1D,MAAM,kBAAkB,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;YACnF,CAAC;YAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,gBAAgB,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC;QAC7F,CAAC;QAED,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;gBACnB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,qDAAqD,EAAE,CAAC;YAC1F,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;YAC9F,IAAI,CAAC,MAAM,CAAC,OAAO;gBAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;YACpE,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI;gBACvB,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI;gBACvB,YAAY,EAAE,MAAM,CAAC,YAAY;gBACjC,OAAO,EAAE,gBAAgB,MAAM,CAAC,MAAM,EAAE;aACzC,CAAC;QACJ,CAAC;QAED,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;gBACnB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,wDAAwD,EAAE,CAAC;YAC7F,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;YACzE,IAAI,CAAC,MAAM,CAAC,OAAO;gBAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;YACpE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,kBAAkB,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;QAChG,CAAC;QAED,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;gBACnB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,oDAAoD,EAAE,CAAC;YACzF,CAAC;YACD,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;gBACjB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,sDAAsD,EAAE,CAAC;YAC3F,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;YAClF,IAAI,CAAC,MAAM,CAAC,OAAO;gBAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;YACpE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,eAAe,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;QAC7F,CAAC;QAED,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;gBACnB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,uDAAuD,EAAE,CAAC;YAC5F,CAAC;YACD,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;gBACjB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,yDAAyD,EAAE,CAAC;YAC9F,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;YACrF,IAAI,CAAC,MAAM,CAAC,OAAO;gBAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;YACpE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,kBAAkB,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;QAChG,CAAC;QAED,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;gBACnB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,uDAAuD,EAAE,CAAC;YAC5F,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;YACxE,IAAI,CAAC,MAAM,CAAC,OAAO;gBAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;YACpE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,kBAAkB,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;QAChG,CAAC;QAED,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,YAAY,GAAG,MAAM,CAAC,MAAa,CAAC;YAC1C,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC;gBAC5B,MAAM,EAAE,YAAY;gBACpB,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,WAAW;aACZ,CAAC,CAAC;YACH,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;gBAC/B,KAAK,EAAE,KAAK,CAAC,MAAM;aACpB,CAAC;QACJ,CAAC;QAED,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;gBACnB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,sDAAsD,EAAE,CAAC;YAC3F,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;YAC5D,IAAI,CAAC,MAAM,CAAC,OAAO;gBAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;YACpE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,iBAAiB,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;QACjH,CAAC;QAED,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;gBACnB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,sDAAsD,EAAE,CAAC;YAC3F,CAAC;YAED,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;YAC5D,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,MAAM,CAAC,MAAM,YAAY,EAAE,CAAC;YACtE,CAAC;YAED,MAAM,KAAK,GAA4B,EAAE,CAAC;YAC1C,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS;gBAAE,KAAK,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC;YAC9D,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS;gBAAE,KAAK,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;YAEjE,IAAI,MAAM,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;gBACtC,4BAA4B;gBAC5B,MAAM,KAAK,GAAG,MAAM,oBAAoB,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;gBAC1F,IAAI,KAAK;oBAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;gBAE5C,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,YAAY,IAAI,EAAE,CAAC;gBACjD,KAAK,CAAC,cAAc,CAAC,GAAG,MAAM,CAAC,YAAY,CAAC;gBAE5C,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,MAAM,CAAC,MAAM,EAAE,KAAY,EAAE,WAAW,CAAC,CAAC;gBAC/E,IAAI,CAAC,OAAO;oBAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,yBAAyB,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;gBAEzF,qBAAqB;gBACrB,MAAM,kBAAkB,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;gBACnF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,gBAAgB,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;YACzF,CAAC;YAED,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,MAAM,CAAC,MAAM,EAAE,KAAY,EAAE,WAAW,CAAC,CAAC;YAC/E,IAAI,CAAC,OAAO;gBAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,yBAAyB,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;YACzF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,gBAAgB,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;QACzF,CAAC;QAED,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;gBACnB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,qDAAqD,EAAE,CAAC;YAC1F,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;YAC3D,IAAI,CAAC,MAAM,CAAC,OAAO;gBAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;YACpE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,gBAAgB,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;QAC9F,CAAC;QAED,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;gBACnB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,oDAAoD,EAAE,CAAC;YACzF,CAAC;YACD,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;gBACjB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,kDAAkD,EAAE,CAAC;YACvF,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;YACjF,IAAI,CAAC,MAAM,CAAC,OAAO;gBAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;YACpE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,sBAAsB,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;QAC3E,CAAC;QAED;YACE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,mBAAoB,MAAc,CAAC,MAAM,EAAE,EAAE,CAAC;IAClF,CAAC;AACH,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Task widget renderer.
3
+ * Spec: §3.11 — Widget
4
+ */
5
+ /**
6
+ * Render the task widget as a string.
7
+ * Spec: §3.11
8
+ */
9
+ export declare function renderTaskWidget(projectSlug?: string): Promise<string>;
10
+ //# sourceMappingURL=widget.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"widget.d.ts","sourceRoot":"","sources":["../src/widget.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA4CH;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAgB5E"}
package/dist/widget.js ADDED
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Task widget renderer.
3
+ * Spec: §3.11 — Widget
4
+ */
5
+ import { listTasks } from "./engine/crud.js";
6
+ const STATUS_ICONS = {
7
+ completed: "✓",
8
+ in_progress: "◉",
9
+ pending: "○",
10
+ failed: "✗",
11
+ blocked: "⊘",
12
+ abandoned: "—",
13
+ };
14
+ function formatLabels(labels = {}) {
15
+ const entries = Object.entries(labels);
16
+ if (entries.length === 0)
17
+ return "";
18
+ return `[${entries.map(([, v]) => v).join(", ")}]`;
19
+ }
20
+ function formatTaskLine(task) {
21
+ const icon = STATUS_ICONS[task.status] ?? "?";
22
+ const assignee = task.status === "in_progress" && task.assignedTo
23
+ ? ` ← ${task.assignedTo.slice(0, 8)}`
24
+ : "";
25
+ const labels = formatLabels(task.labels);
26
+ const labelsStr = labels ? ` ${labels}` : "";
27
+ let suffix = "";
28
+ if (task.status === "failed") {
29
+ suffix = " FAILED";
30
+ }
31
+ else if (task.status === "blocked") {
32
+ const reason = task.blockedReason?.replace("root cause: ", "") ?? "";
33
+ suffix = reason ? ` BLOCKED: ${reason}` : " BLOCKED";
34
+ }
35
+ else if (task.status === "pending" && task.dependencies?.length) {
36
+ suffix = ` depends: ${task.dependencies.join(", ")}`;
37
+ }
38
+ const id = task.id.padEnd(10);
39
+ const title = task.title.length > 40 ? task.title.slice(0, 37) + "..." : task.title.padEnd(40);
40
+ return ` ${icon} ${id} ${title}${assignee}${labelsStr}${suffix}`;
41
+ }
42
+ /**
43
+ * Render the task widget as a string.
44
+ * Spec: §3.11
45
+ */
46
+ export async function renderTaskWidget(projectSlug) {
47
+ const tasks = await listTasks({ projectSlug });
48
+ const completed = tasks.filter((t) => t.task.status === "completed").length;
49
+ const total = tasks.length;
50
+ const lines = [
51
+ `📋 Tasks — ${completed}/${total} completed`,
52
+ ...tasks.map((t) => formatTaskLine(t.task)),
53
+ ];
54
+ if (total === 0) {
55
+ lines.push(" (no tasks — use /task create <title> to add one)");
56
+ }
57
+ return lines.join("\n");
58
+ }
59
+ //# sourceMappingURL=widget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"widget.js","sourceRoot":"","sources":["../src/widget.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAG7C,MAAM,YAAY,GAA2B;IAC3C,SAAS,EAAE,GAAG;IACd,WAAW,EAAE,GAAG;IAChB,OAAO,EAAE,GAAG;IACZ,MAAM,EAAE,GAAG;IACX,OAAO,EAAE,GAAG;IACZ,SAAS,EAAE,GAAG;CACf,CAAC;AAEF,SAAS,YAAY,CAAC,SAAiC,EAAE;IACvD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACvC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACpC,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;AACrD,CAAC;AAED,SAAS,cAAc,CAAC,IAAU;IAChC,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC;IAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,KAAK,aAAa,IAAI,IAAI,CAAC,UAAU;QAC/D,CAAC,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;QACrC,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACzC,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAE9C,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC7B,MAAM,GAAG,aAAa,CAAC;IACzB,CAAC;SAAM,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QACrC,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC;QACrE,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,iBAAiB,MAAM,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC;IAC/D,CAAC;SAAM,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,IAAI,CAAC,YAAY,EAAE,MAAM,EAAE,CAAC;QAClE,MAAM,GAAG,iBAAiB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IAC3D,CAAC;IAED,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAE/F,OAAO,KAAK,IAAI,IAAI,EAAE,KAAK,KAAK,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,EAAE,CAAC;AACrE,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,WAAoB;IACzD,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC;IAE/C,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,MAAM,CAAC;IAC5E,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC;IAE3B,MAAM,KAAK,GAAa;QACtB,cAAc,SAAS,IAAI,KAAK,YAAY;QAC5C,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;KAC5C,CAAC;IAEF,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;QAChB,KAAK,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAC;IACnE,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
package/package.json ADDED
@@ -0,0 +1,44 @@
1
+ {
2
+ "name": "@pi-orca/tasks",
3
+ "version": "0.0.2-dev.20260413162335",
4
+ "description": "File-backed task DAG with locking",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ }
13
+ },
14
+ "files": [
15
+ "dist",
16
+ "defaults"
17
+ ],
18
+ "scripts": {
19
+ "build": "tsc -p tsconfig.json",
20
+ "clean": "rm -rf dist *.tsbuildinfo",
21
+ "typecheck": "tsc --noEmit",
22
+ "test": "vitest run",
23
+ "test:watch": "vitest"
24
+ },
25
+ "keywords": [
26
+ "pi-package",
27
+ "pi-orca",
28
+ "pi-agent",
29
+ "pi-extension"
30
+ ],
31
+ "author": "Bindu / Ba",
32
+ "license": "MIT",
33
+ "publishConfig": {
34
+ "access": "public"
35
+ },
36
+ "repository": {
37
+ "type": "git",
38
+ "url": "https://github.com/bwavell/pi-orca.git",
39
+ "directory": "packages/pi-orca-tasks"
40
+ },
41
+ "dependencies": {
42
+ "@pi-orca/core": "0.0.2-dev.20260413162335"
43
+ }
44
+ }