@chorus-aidlc/chorus-openclaw-plugin 0.2.5 → 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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@chorus-aidlc/chorus-openclaw-plugin",
3
- "version": "0.2.5",
3
+ "version": "0.3.1",
4
4
  "description": "OpenClaw plugin for Chorus AI-DLC collaboration platform — SSE real-time events + MCP tool integration",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -432,4 +432,115 @@ export function registerCommonTools(api: any, mcpClient: ChorusMcpClient) {
432
432
  return JSON.stringify(result, null, 2);
433
433
  },
434
434
  });
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
+
523
+ api.registerTool({
524
+ name: "chorus_search",
525
+ description: "Search across tasks, ideas, proposals, documents, projects, and project groups.",
526
+ parameters: {
527
+ type: "object",
528
+ properties: {
529
+ query: { type: "string", description: "Search query (matches title, description, content)" },
530
+ scope: { type: "string", enum: ["global", "group", "project"], description: "Search scope (default: global)" },
531
+ scopeUuid: { type: "string", description: "Project group UUID (when scope=group) or project UUID (when scope=project)" },
532
+ entityTypes: { type: "array", items: { type: "string", enum: ["task", "idea", "proposal", "document", "project", "project_group"] }, description: "Entity types to search (default: all). Example: [\"task\", \"idea\"]" },
533
+ },
534
+ required: ["query"],
535
+ additionalProperties: false,
536
+ },
537
+ async execute(_id: string, { query, scope, scopeUuid, entityTypes }: { query: string; scope?: string; scopeUuid?: string; entityTypes?: string[] }) {
538
+ const args: Record<string, unknown> = { query };
539
+ if (scope) args.scope = scope;
540
+ if (scopeUuid) args.scopeUuid = scopeUuid;
541
+ if (entityTypes) args.entityTypes = entityTypes;
542
+ const result = await mcpClient.callTool("chorus_search", args);
543
+ return JSON.stringify(result, null, 2);
544
+ },
545
+ });
435
546
  }
@@ -19,26 +19,7 @@ export function registerDevTools(api: any, mcpClient: ChorusMcpClient) {
19
19
  },
20
20
  });
21
21
 
22
- api.registerTool({
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",