@chorus-aidlc/chorus-openclaw-plugin 0.3.0 → 0.3.1
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/package.json +1 -1
- package/src/tools/common-tools.ts +87 -0
- package/src/tools/dev-tools.ts +1 -20
package/package.json
CHANGED
|
@@ -433,6 +433,93 @@ export function registerCommonTools(api: any, mcpClient: ChorusMcpClient) {
|
|
|
433
433
|
},
|
|
434
434
|
});
|
|
435
435
|
|
|
436
|
+
// ===== Task Creation & Editing (available to all roles) =====
|
|
437
|
+
|
|
438
|
+
api.registerTool({
|
|
439
|
+
name: "chorus_create_tasks",
|
|
440
|
+
description:
|
|
441
|
+
"Batch create tasks in a project. Two modes:\n\n" +
|
|
442
|
+
"**Quick Task** (skip Idea→Proposal): omit proposalUuid. Ideal for bug fixes, small features, post-delivery patches.\n" +
|
|
443
|
+
"Flow: create → chorus_claim_task → execute → chorus_report_work → chorus_submit_for_verify → done.\n\n" +
|
|
444
|
+
"**Proposal-linked** (traditional AI-DLC): pass proposalUuid to associate with an approved proposal.\n\n" +
|
|
445
|
+
"Supports batch creation with intra-batch dependencies (draftUuid + dependsOnDraftUuids) and dependencies on existing tasks (dependsOnTaskUuids).",
|
|
446
|
+
parameters: {
|
|
447
|
+
type: "object",
|
|
448
|
+
properties: {
|
|
449
|
+
projectUuid: { type: "string", description: "Project UUID" },
|
|
450
|
+
proposalUuid: { type: "string", description: "Associated Proposal UUID (optional — omit for Quick Task mode)" },
|
|
451
|
+
tasks: {
|
|
452
|
+
type: "array",
|
|
453
|
+
description: "Task list. Each: { title, description?, priority?, storyPoints?, acceptanceCriteriaItems?, draftUuid?, dependsOnDraftUuids?, dependsOnTaskUuids? }",
|
|
454
|
+
items: {
|
|
455
|
+
type: "object",
|
|
456
|
+
properties: {
|
|
457
|
+
title: { type: "string", description: "Task title" },
|
|
458
|
+
description: { type: "string", description: "Task description" },
|
|
459
|
+
priority: { type: "string", description: 'Priority: "low", "medium", or "high"' },
|
|
460
|
+
storyPoints: { type: "number", description: "Effort estimate in agent hours" },
|
|
461
|
+
acceptanceCriteriaItems: { type: "array", description: "Structured acceptance criteria: [{ description, required? }]", items: { type: "object", properties: { description: { type: "string" }, required: { type: "boolean" } }, required: ["description"] } },
|
|
462
|
+
draftUuid: { type: "string", description: "Temporary UUID for intra-batch dependency references" },
|
|
463
|
+
dependsOnDraftUuids: { type: "array", description: "Dependent draftUuid list within this batch", items: { type: "string" } },
|
|
464
|
+
dependsOnTaskUuids: { type: "array", description: "Dependent existing Task UUID list", items: { type: "string" } },
|
|
465
|
+
},
|
|
466
|
+
required: ["title"],
|
|
467
|
+
},
|
|
468
|
+
},
|
|
469
|
+
},
|
|
470
|
+
required: ["projectUuid", "tasks"],
|
|
471
|
+
additionalProperties: false,
|
|
472
|
+
},
|
|
473
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
474
|
+
async execute(_id: string, { projectUuid, proposalUuid, tasks }: any) {
|
|
475
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
476
|
+
const args: Record<string, any> = { projectUuid, tasks };
|
|
477
|
+
if (proposalUuid !== undefined) args.proposalUuid = proposalUuid;
|
|
478
|
+
const result = await mcpClient.callTool("chorus_create_tasks", args);
|
|
479
|
+
return JSON.stringify(result, null, 2);
|
|
480
|
+
},
|
|
481
|
+
});
|
|
482
|
+
|
|
483
|
+
api.registerTool({
|
|
484
|
+
name: "chorus_update_task",
|
|
485
|
+
description:
|
|
486
|
+
"Update a task — edit fields, manage dependencies, or change status.\n\n" +
|
|
487
|
+
"**Field editing** (any role): title, description, priority, storyPoints, addDependsOn/removeDependsOn (incremental dependency management).\n\n" +
|
|
488
|
+
"**Status update** (assignee only): in_progress (requires all dependencies resolved), to_verify.\n\n" +
|
|
489
|
+
"For Quick Tasks: create → claim → edit details → execute → verify → done.",
|
|
490
|
+
parameters: {
|
|
491
|
+
type: "object",
|
|
492
|
+
properties: {
|
|
493
|
+
taskUuid: { type: "string", description: "Task UUID" },
|
|
494
|
+
status: { type: "string", description: "New status: in_progress | to_verify (assignee only)" },
|
|
495
|
+
sessionUuid: { type: "string", description: "Session UUID for sub-agent identification" },
|
|
496
|
+
title: { type: "string", description: "New task title" },
|
|
497
|
+
description: { type: "string", description: "New task description (supports @mentions)" },
|
|
498
|
+
priority: { type: "string", description: 'New priority: "low", "medium", or "high"' },
|
|
499
|
+
storyPoints: { type: "number", description: "New effort estimate (agent hours)" },
|
|
500
|
+
addDependsOn: { type: "array", description: "Task UUIDs to add as dependencies", items: { type: "string" } },
|
|
501
|
+
removeDependsOn: { type: "array", description: "Task UUIDs to remove from dependencies", items: { type: "string" } },
|
|
502
|
+
},
|
|
503
|
+
required: ["taskUuid"],
|
|
504
|
+
additionalProperties: false,
|
|
505
|
+
},
|
|
506
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
507
|
+
async execute(_id: string, { taskUuid, status, sessionUuid, title, description, priority, storyPoints, addDependsOn, removeDependsOn }: any) {
|
|
508
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
509
|
+
const args: Record<string, any> = { taskUuid };
|
|
510
|
+
if (status !== undefined) args.status = status;
|
|
511
|
+
if (sessionUuid !== undefined) args.sessionUuid = sessionUuid;
|
|
512
|
+
if (title !== undefined) args.title = title;
|
|
513
|
+
if (description !== undefined) args.description = description;
|
|
514
|
+
if (priority !== undefined) args.priority = priority;
|
|
515
|
+
if (storyPoints !== undefined) args.storyPoints = storyPoints;
|
|
516
|
+
if (addDependsOn !== undefined) args.addDependsOn = addDependsOn;
|
|
517
|
+
if (removeDependsOn !== undefined) args.removeDependsOn = removeDependsOn;
|
|
518
|
+
const result = await mcpClient.callTool("chorus_update_task", args);
|
|
519
|
+
return JSON.stringify(result, null, 2);
|
|
520
|
+
},
|
|
521
|
+
});
|
|
522
|
+
|
|
436
523
|
api.registerTool({
|
|
437
524
|
name: "chorus_search",
|
|
438
525
|
description: "Search across tasks, ideas, proposals, documents, projects, and project groups.",
|
package/src/tools/dev-tools.ts
CHANGED
|
@@ -19,26 +19,7 @@ export function registerDevTools(api: any, mcpClient: ChorusMcpClient) {
|
|
|
19
19
|
},
|
|
20
20
|
});
|
|
21
21
|
|
|
22
|
-
|
|
23
|
-
name: "chorus_update_task",
|
|
24
|
-
description: "Update task status (only the assignee can operate). Moving to in_progress requires all dependsOn tasks to be done or closed — otherwise the request is rejected with blocker details. Use chorus_get_unblocked_tasks to find tasks ready to start.",
|
|
25
|
-
parameters: {
|
|
26
|
-
type: "object",
|
|
27
|
-
properties: {
|
|
28
|
-
taskUuid: { type: "string", description: "Task UUID" },
|
|
29
|
-
status: { type: "string", description: "New status: in_progress | to_verify" },
|
|
30
|
-
sessionUuid: { type: "string", description: "Session UUID for sub-agent identification" },
|
|
31
|
-
},
|
|
32
|
-
required: ["taskUuid", "status"],
|
|
33
|
-
additionalProperties: false,
|
|
34
|
-
},
|
|
35
|
-
async execute(_id: string, { taskUuid, status, sessionUuid }: { taskUuid: string; status: string; sessionUuid?: string }) {
|
|
36
|
-
const args: Record<string, unknown> = { taskUuid, status };
|
|
37
|
-
if (sessionUuid) args.sessionUuid = sessionUuid;
|
|
38
|
-
const result = await mcpClient.callTool("chorus_update_task", args);
|
|
39
|
-
return JSON.stringify(result, null, 2);
|
|
40
|
-
},
|
|
41
|
-
});
|
|
22
|
+
// chorus_update_task — migrated to common-tools.ts (available to all roles, enhanced with field editing)
|
|
42
23
|
|
|
43
24
|
api.registerTool({
|
|
44
25
|
name: "chorus_report_work",
|