@laurentenhoor/devclaw 0.1.0

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 (163) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +406 -0
  3. package/dist/index.d.ts +88 -0
  4. package/dist/index.d.ts.map +1 -0
  5. package/dist/index.js +107 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/lib/audit.d.ts +2 -0
  8. package/dist/lib/audit.d.ts.map +1 -0
  9. package/dist/lib/audit.js +42 -0
  10. package/dist/lib/audit.js.map +1 -0
  11. package/dist/lib/binding-manager.d.ts +35 -0
  12. package/dist/lib/binding-manager.d.ts.map +1 -0
  13. package/dist/lib/binding-manager.js +88 -0
  14. package/dist/lib/binding-manager.js.map +1 -0
  15. package/dist/lib/cli.d.ts +12 -0
  16. package/dist/lib/cli.d.ts.map +1 -0
  17. package/dist/lib/cli.js +69 -0
  18. package/dist/lib/cli.js.map +1 -0
  19. package/dist/lib/dispatch.d.ts +58 -0
  20. package/dist/lib/dispatch.d.ts.map +1 -0
  21. package/dist/lib/dispatch.js +163 -0
  22. package/dist/lib/dispatch.js.map +1 -0
  23. package/dist/lib/model-selector.d.ts +21 -0
  24. package/dist/lib/model-selector.d.ts.map +1 -0
  25. package/dist/lib/model-selector.js +74 -0
  26. package/dist/lib/model-selector.js.map +1 -0
  27. package/dist/lib/notify.d.ts +54 -0
  28. package/dist/lib/notify.d.ts.map +1 -0
  29. package/dist/lib/notify.js +143 -0
  30. package/dist/lib/notify.js.map +1 -0
  31. package/dist/lib/onboarding.d.ts +5 -0
  32. package/dist/lib/onboarding.d.ts.map +1 -0
  33. package/dist/lib/onboarding.js +124 -0
  34. package/dist/lib/onboarding.js.map +1 -0
  35. package/dist/lib/projects.d.ts +64 -0
  36. package/dist/lib/projects.d.ts.map +1 -0
  37. package/dist/lib/projects.js +127 -0
  38. package/dist/lib/projects.js.map +1 -0
  39. package/dist/lib/providers/github.d.ts +23 -0
  40. package/dist/lib/providers/github.d.ts.map +1 -0
  41. package/dist/lib/providers/github.js +130 -0
  42. package/dist/lib/providers/github.js.map +1 -0
  43. package/dist/lib/providers/gitlab.d.ts +23 -0
  44. package/dist/lib/providers/gitlab.d.ts.map +1 -0
  45. package/dist/lib/providers/gitlab.js +133 -0
  46. package/dist/lib/providers/gitlab.js.map +1 -0
  47. package/dist/lib/providers/index.d.ts +12 -0
  48. package/dist/lib/providers/index.d.ts.map +1 -0
  49. package/dist/lib/providers/index.js +25 -0
  50. package/dist/lib/providers/index.js.map +1 -0
  51. package/dist/lib/providers/provider.d.ts +35 -0
  52. package/dist/lib/providers/provider.d.ts.map +1 -0
  53. package/dist/lib/providers/provider.js +13 -0
  54. package/dist/lib/providers/provider.js.map +1 -0
  55. package/dist/lib/services/health.d.ts +38 -0
  56. package/dist/lib/services/health.d.ts.map +1 -0
  57. package/dist/lib/services/health.js +100 -0
  58. package/dist/lib/services/health.js.map +1 -0
  59. package/dist/lib/services/heartbeat.d.ts +38 -0
  60. package/dist/lib/services/heartbeat.d.ts.map +1 -0
  61. package/dist/lib/services/heartbeat.js +199 -0
  62. package/dist/lib/services/heartbeat.js.map +1 -0
  63. package/dist/lib/services/pipeline.d.ts +36 -0
  64. package/dist/lib/services/pipeline.d.ts.map +1 -0
  65. package/dist/lib/services/pipeline.js +90 -0
  66. package/dist/lib/services/pipeline.js.map +1 -0
  67. package/dist/lib/services/queue.d.ts +14 -0
  68. package/dist/lib/services/queue.d.ts.map +1 -0
  69. package/dist/lib/services/queue.js +31 -0
  70. package/dist/lib/services/queue.js.map +1 -0
  71. package/dist/lib/services/tick.d.ts +62 -0
  72. package/dist/lib/services/tick.d.ts.map +1 -0
  73. package/dist/lib/services/tick.js +160 -0
  74. package/dist/lib/services/tick.js.map +1 -0
  75. package/dist/lib/setup/agent.d.ts +14 -0
  76. package/dist/lib/setup/agent.d.ts.map +1 -0
  77. package/dist/lib/setup/agent.js +72 -0
  78. package/dist/lib/setup/agent.js.map +1 -0
  79. package/dist/lib/setup/config.d.ts +22 -0
  80. package/dist/lib/setup/config.d.ts.map +1 -0
  81. package/dist/lib/setup/config.js +67 -0
  82. package/dist/lib/setup/config.js.map +1 -0
  83. package/dist/lib/setup/index.d.ts +53 -0
  84. package/dist/lib/setup/index.d.ts.map +1 -0
  85. package/dist/lib/setup/index.js +68 -0
  86. package/dist/lib/setup/index.js.map +1 -0
  87. package/dist/lib/setup/workspace.d.ts +6 -0
  88. package/dist/lib/setup/workspace.d.ts.map +1 -0
  89. package/dist/lib/setup/workspace.js +69 -0
  90. package/dist/lib/setup/workspace.js.map +1 -0
  91. package/dist/lib/templates.d.ts +9 -0
  92. package/dist/lib/templates.d.ts.map +1 -0
  93. package/dist/lib/templates.js +163 -0
  94. package/dist/lib/templates.js.map +1 -0
  95. package/dist/lib/tiers.d.ts +55 -0
  96. package/dist/lib/tiers.d.ts.map +1 -0
  97. package/dist/lib/tiers.js +74 -0
  98. package/dist/lib/tiers.js.map +1 -0
  99. package/dist/lib/tool-helpers.d.ts +44 -0
  100. package/dist/lib/tool-helpers.d.ts.map +1 -0
  101. package/dist/lib/tool-helpers.js +65 -0
  102. package/dist/lib/tool-helpers.js.map +1 -0
  103. package/dist/lib/tools/health.d.ts +28 -0
  104. package/dist/lib/tools/health.d.ts.map +1 -0
  105. package/dist/lib/tools/health.js +61 -0
  106. package/dist/lib/tools/health.js.map +1 -0
  107. package/dist/lib/tools/onboard.d.ts +24 -0
  108. package/dist/lib/tools/onboard.d.ts.map +1 -0
  109. package/dist/lib/tools/onboard.js +27 -0
  110. package/dist/lib/tools/onboard.js.map +1 -0
  111. package/dist/lib/tools/project-register.d.ts +51 -0
  112. package/dist/lib/tools/project-register.d.ts.map +1 -0
  113. package/dist/lib/tools/project-register.js +172 -0
  114. package/dist/lib/tools/project-register.js.map +1 -0
  115. package/dist/lib/tools/queue-status.test.d.ts +2 -0
  116. package/dist/lib/tools/queue-status.test.d.ts.map +1 -0
  117. package/dist/lib/tools/queue-status.test.js +48 -0
  118. package/dist/lib/tools/queue-status.test.js.map +1 -0
  119. package/dist/lib/tools/setup.d.ts +76 -0
  120. package/dist/lib/tools/setup.d.ts.map +1 -0
  121. package/dist/lib/tools/setup.js +102 -0
  122. package/dist/lib/tools/setup.js.map +1 -0
  123. package/dist/lib/tools/status.d.ts +24 -0
  124. package/dist/lib/tools/status.d.ts.map +1 -0
  125. package/dist/lib/tools/status.js +53 -0
  126. package/dist/lib/tools/status.js.map +1 -0
  127. package/dist/lib/tools/task-comment.d.ts +40 -0
  128. package/dist/lib/tools/task-comment.d.ts.map +1 -0
  129. package/dist/lib/tools/task-comment.js +84 -0
  130. package/dist/lib/tools/task-comment.js.map +1 -0
  131. package/dist/lib/tools/task-create.d.ts +54 -0
  132. package/dist/lib/tools/task-create.d.ts.map +1 -0
  133. package/dist/lib/tools/task-create.js +77 -0
  134. package/dist/lib/tools/task-create.js.map +1 -0
  135. package/dist/lib/tools/task-update.d.ts +40 -0
  136. package/dist/lib/tools/task-update.d.ts.map +1 -0
  137. package/dist/lib/tools/task-update.js +79 -0
  138. package/dist/lib/tools/task-update.js.map +1 -0
  139. package/dist/lib/tools/task-update.test.d.ts +7 -0
  140. package/dist/lib/tools/task-update.test.d.ts.map +1 -0
  141. package/dist/lib/tools/task-update.test.js +55 -0
  142. package/dist/lib/tools/task-update.test.js.map +1 -0
  143. package/dist/lib/tools/work-finish.d.ts +43 -0
  144. package/dist/lib/tools/work-finish.d.ts.map +1 -0
  145. package/dist/lib/tools/work-finish.js +77 -0
  146. package/dist/lib/tools/work-finish.js.map +1 -0
  147. package/dist/lib/tools/work-start.d.ts +39 -0
  148. package/dist/lib/tools/work-start.d.ts.map +1 -0
  149. package/dist/lib/tools/work-start.js +129 -0
  150. package/dist/lib/tools/work-start.js.map +1 -0
  151. package/dist/lib/types.d.ts +17 -0
  152. package/dist/lib/types.d.ts.map +1 -0
  153. package/dist/lib/types.js +8 -0
  154. package/dist/lib/types.js.map +1 -0
  155. package/docs/ARCHITECTURE.md +662 -0
  156. package/docs/CONFIGURATION.md +336 -0
  157. package/docs/MANAGEMENT.md +120 -0
  158. package/docs/ONBOARDING.md +251 -0
  159. package/docs/QA_WORKFLOW.md +120 -0
  160. package/docs/ROADMAP.md +96 -0
  161. package/docs/TESTING.md +339 -0
  162. package/docs/TOOLS.md +361 -0
  163. package/package.json +55 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-register.js","sourceRoot":"","sources":["../../../lib/tools/project-register.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=queue-status.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue-status.test.d.ts","sourceRoot":"","sources":["../../../lib/tools/queue-status.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Tests for status tool execution-aware sequencing logic
3
+ * Run with: node --test lib/tools/queue-status.test.ts
4
+ */
5
+ import { describe, it } from "node:test";
6
+ import assert from "node:assert";
7
+ describe("status execution-aware sequencing", () => {
8
+ describe("priority ordering", () => {
9
+ it("should prioritize To Improve > To Test > To Do", () => {
10
+ // To Improve has priority 3, To Test has 2, To Do has 1
11
+ assert.strictEqual(3 > 2, true);
12
+ assert.strictEqual(2 > 1, true);
13
+ });
14
+ });
15
+ describe("role assignment", () => {
16
+ it("should assign To Improve to dev", () => {
17
+ // To Improve = dev work
18
+ assert.ok(true);
19
+ });
20
+ it("should assign To Do to dev", () => {
21
+ // To Do = dev work
22
+ assert.ok(true);
23
+ });
24
+ it("should assign To Test to qa", () => {
25
+ // To Test = qa work
26
+ assert.ok(true);
27
+ });
28
+ });
29
+ describe("execution modes", () => {
30
+ it("should support parallel project execution", () => {
31
+ // Projects can run simultaneously
32
+ assert.ok(true);
33
+ });
34
+ it("should support sequential project execution", () => {
35
+ // Only one project at a time
36
+ assert.ok(true);
37
+ });
38
+ it("should support parallel role execution within project", () => {
39
+ // DEV and QA can run simultaneously
40
+ assert.ok(true);
41
+ });
42
+ it("should support sequential role execution within project", () => {
43
+ // DEV and QA alternate
44
+ assert.ok(true);
45
+ });
46
+ });
47
+ });
48
+ //# sourceMappingURL=queue-status.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue-status.test.js","sourceRoot":"","sources":["../../../lib/tools/queue-status.test.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,MAAM,MAAM,aAAa,CAAC;AAEjC,QAAQ,CAAC,mCAAmC,EAAE,GAAG,EAAE;IACjD,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;QACjC,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;YACxD,wDAAwD;YACxD,MAAM,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;YAChC,MAAM,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;QAC/B,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;YACzC,wBAAwB;YACxB,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;YACpC,mBAAmB;YACnB,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;YACrC,oBAAoB;YACpB,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;QAC/B,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;YACnD,kCAAkC;YAClC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;YACrD,6BAA6B;YAC7B,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;YAC/D,oCAAoC;YACpC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;YACjE,uBAAuB;YACvB,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * setup — Agent-driven DevClaw setup.
3
+ *
4
+ * Creates agent, configures model levels, writes workspace files.
5
+ * Thin wrapper around lib/setup/.
6
+ */
7
+ import type { OpenClawPluginApi } from "openclaw/plugin-sdk";
8
+ import type { ToolContext } from "../types.js";
9
+ export declare function createSetupTool(api: OpenClawPluginApi): (ctx: ToolContext) => {
10
+ name: string;
11
+ label: string;
12
+ description: string;
13
+ parameters: {
14
+ type: string;
15
+ properties: {
16
+ newAgentName: {
17
+ type: string;
18
+ description: string;
19
+ };
20
+ channelBinding: {
21
+ type: string;
22
+ enum: string[];
23
+ description: string;
24
+ };
25
+ migrateFrom: {
26
+ type: string;
27
+ description: string;
28
+ };
29
+ models: {
30
+ type: string;
31
+ description: string;
32
+ properties: {
33
+ dev: {
34
+ type: string;
35
+ description: string;
36
+ properties: {
37
+ junior: {
38
+ type: string;
39
+ description: string;
40
+ };
41
+ medior: {
42
+ type: string;
43
+ description: string;
44
+ };
45
+ senior: {
46
+ type: string;
47
+ description: string;
48
+ };
49
+ };
50
+ };
51
+ qa: {
52
+ type: string;
53
+ description: string;
54
+ properties: {
55
+ reviewer: {
56
+ type: string;
57
+ description: string;
58
+ };
59
+ tester: {
60
+ type: string;
61
+ description: string;
62
+ };
63
+ };
64
+ };
65
+ };
66
+ };
67
+ projectExecution: {
68
+ type: string;
69
+ enum: string[];
70
+ description: string;
71
+ };
72
+ };
73
+ };
74
+ execute(_id: string, params: Record<string, unknown>): Promise<import("@mariozechner/pi-agent-core").AgentToolResult<unknown>>;
75
+ };
76
+ //# sourceMappingURL=setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../../lib/tools/setup.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAE7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAI/C,wBAAgB,eAAe,CAAC,GAAG,EAAE,iBAAiB,IAC5C,KAAK,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAoEH,MAAM,UAAU,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;EAkD7D"}
@@ -0,0 +1,102 @@
1
+ import { jsonResult } from "openclaw/plugin-sdk";
2
+ import { runSetup } from "../setup/index.js";
3
+ import { DEV_LEVELS, QA_LEVELS, DEFAULT_MODELS } from "../tiers.js";
4
+ export function createSetupTool(api) {
5
+ return (ctx) => ({
6
+ name: "setup",
7
+ label: "Setup",
8
+ description: `Execute DevClaw setup. Creates AGENTS.md, HEARTBEAT.md, projects/projects.json, and model level config. Optionally creates a new agent with channel binding. Called after onboard collects configuration.`,
9
+ parameters: {
10
+ type: "object",
11
+ properties: {
12
+ newAgentName: {
13
+ type: "string",
14
+ description: "Create a new agent. Omit to configure current workspace.",
15
+ },
16
+ channelBinding: {
17
+ type: "string",
18
+ enum: ["telegram", "whatsapp"],
19
+ description: "Channel to bind (optional, with newAgentName only).",
20
+ },
21
+ migrateFrom: {
22
+ type: "string",
23
+ description: "Agent ID to migrate channel binding from. Check openclaw.json bindings first.",
24
+ },
25
+ models: {
26
+ type: "object",
27
+ description: "Model overrides per role and level.",
28
+ properties: {
29
+ dev: {
30
+ type: "object",
31
+ description: "Developer level models",
32
+ properties: {
33
+ junior: {
34
+ type: "string",
35
+ description: `Default: ${DEFAULT_MODELS.dev.junior}`,
36
+ },
37
+ medior: {
38
+ type: "string",
39
+ description: `Default: ${DEFAULT_MODELS.dev.medior}`,
40
+ },
41
+ senior: {
42
+ type: "string",
43
+ description: `Default: ${DEFAULT_MODELS.dev.senior}`,
44
+ },
45
+ },
46
+ },
47
+ qa: {
48
+ type: "object",
49
+ description: "QA level models",
50
+ properties: {
51
+ reviewer: {
52
+ type: "string",
53
+ description: `Default: ${DEFAULT_MODELS.qa.reviewer}`,
54
+ },
55
+ tester: {
56
+ type: "string",
57
+ description: `Default: ${DEFAULT_MODELS.qa.tester}`,
58
+ },
59
+ },
60
+ },
61
+ },
62
+ },
63
+ projectExecution: {
64
+ type: "string",
65
+ enum: ["parallel", "sequential"],
66
+ description: "Project execution mode. Default: parallel.",
67
+ },
68
+ },
69
+ },
70
+ async execute(_id, params) {
71
+ const result = await runSetup({
72
+ api,
73
+ newAgentName: params.newAgentName,
74
+ channelBinding: params.channelBinding ?? null,
75
+ migrateFrom: params.migrateFrom,
76
+ agentId: params.newAgentName ? undefined : ctx.agentId,
77
+ workspacePath: params.newAgentName ? undefined : ctx.workspaceDir,
78
+ models: params.models,
79
+ projectExecution: params.projectExecution,
80
+ });
81
+ const lines = [
82
+ result.agentCreated
83
+ ? `Agent "${result.agentId}" created`
84
+ : `Configured "${result.agentId}"`,
85
+ "",
86
+ ];
87
+ if (result.bindingMigrated) {
88
+ lines.push(`āœ… Binding migrated: ${result.bindingMigrated.channel} (${result.bindingMigrated.from} → ${result.agentId})`, "");
89
+ }
90
+ lines.push("Models:", ...DEV_LEVELS.map((t) => ` dev.${t}: ${result.models.dev[t]}`), ...QA_LEVELS.map((t) => ` qa.${t}: ${result.models.qa[t]}`), "", "Files:", ...result.filesWritten.map((f) => ` ${f}`));
91
+ if (result.warnings.length > 0)
92
+ lines.push("", "Warnings:", ...result.warnings.map((w) => ` ${w}`));
93
+ lines.push("", "Next: register a project, then create issues and pick them up.");
94
+ return jsonResult({
95
+ success: true,
96
+ ...result,
97
+ summary: lines.join("\n"),
98
+ });
99
+ },
100
+ });
101
+ }
102
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../../lib/tools/setup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * status — Lightweight queue + worker state dashboard.
3
+ *
4
+ * Shows worker state and queue counts per project. No health checks
5
+ * (use `health` tool), no complex sequencing.
6
+ */
7
+ import type { OpenClawPluginApi } from "openclaw/plugin-sdk";
8
+ import type { ToolContext } from "../types.js";
9
+ export declare function createStatusTool(api: OpenClawPluginApi): (ctx: ToolContext) => {
10
+ name: string;
11
+ label: string;
12
+ description: string;
13
+ parameters: {
14
+ type: string;
15
+ properties: {
16
+ projectGroupId: {
17
+ type: string;
18
+ description: string;
19
+ };
20
+ };
21
+ };
22
+ execute(_id: string, params: Record<string, unknown>): Promise<import("@mariozechner/pi-agent-core").AgentToolResult<unknown>>;
23
+ };
24
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../lib/tools/status.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAE7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAM/C,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,iBAAiB,IAC7C,KAAK,WAAW;;;;;;;;;;;;;iBAWH,MAAM,UAAU,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;EA4C7D"}
@@ -0,0 +1,53 @@
1
+ import { jsonResult } from "openclaw/plugin-sdk";
2
+ import { readProjects, getProject } from "../projects.js";
3
+ import { log as auditLog } from "../audit.js";
4
+ import { fetchProjectQueues } from "../services/queue.js";
5
+ import { requireWorkspaceDir, getPluginConfig } from "../tool-helpers.js";
6
+ export function createStatusTool(api) {
7
+ return (ctx) => ({
8
+ name: "status",
9
+ label: "Status",
10
+ description: `Show task queue and worker state per project. Use \`health\` tool for worker health checks.`,
11
+ parameters: {
12
+ type: "object",
13
+ properties: {
14
+ projectGroupId: { type: "string", description: "Filter to specific project. Omit for all." },
15
+ },
16
+ },
17
+ async execute(_id, params) {
18
+ const workspaceDir = requireWorkspaceDir(ctx);
19
+ const groupId = params.projectGroupId;
20
+ const pluginConfig = getPluginConfig(api);
21
+ const projectExecution = pluginConfig?.projectExecution ?? "parallel";
22
+ const data = await readProjects(workspaceDir);
23
+ const projectIds = groupId ? [groupId] : Object.keys(data.projects);
24
+ // Build project summaries with queue counts
25
+ const projects = await Promise.all(projectIds.map(async (pid) => {
26
+ const project = getProject(data, pid);
27
+ if (!project)
28
+ return null;
29
+ const queues = await fetchProjectQueues(project);
30
+ const count = (label) => queues[label].length;
31
+ return {
32
+ name: project.name,
33
+ groupId: pid,
34
+ roleExecution: project.roleExecution ?? "parallel",
35
+ dev: { active: project.dev.active, issueId: project.dev.issueId, level: project.dev.level, startTime: project.dev.startTime },
36
+ qa: { active: project.qa.active, issueId: project.qa.issueId, level: project.qa.level, startTime: project.qa.startTime },
37
+ queue: { toImprove: count("To Improve"), toTest: count("To Test"), toDo: count("To Do") },
38
+ };
39
+ }));
40
+ const filtered = projects.filter(Boolean);
41
+ await auditLog(workspaceDir, "status", {
42
+ projectCount: filtered.length,
43
+ totalQueued: filtered.reduce((s, p) => s + p.queue.toImprove + p.queue.toTest + p.queue.toDo, 0),
44
+ });
45
+ return jsonResult({
46
+ success: true,
47
+ execution: { projectExecution },
48
+ projects: filtered,
49
+ });
50
+ },
51
+ });
52
+ }
53
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../lib/tools/status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * task_comment — Add review comments or notes to an issue.
3
+ *
4
+ * Use cases:
5
+ * - QA worker adds review feedback without blocking pass/fail
6
+ * - DEV worker posts implementation notes
7
+ * - Orchestrator adds summary comments
8
+ */
9
+ import type { OpenClawPluginApi } from "openclaw/plugin-sdk";
10
+ import type { ToolContext } from "../types.js";
11
+ export declare function createTaskCommentTool(api: OpenClawPluginApi): (ctx: ToolContext) => {
12
+ name: string;
13
+ label: string;
14
+ description: string;
15
+ parameters: {
16
+ type: string;
17
+ required: string[];
18
+ properties: {
19
+ projectGroupId: {
20
+ type: string;
21
+ description: string;
22
+ };
23
+ issueId: {
24
+ type: string;
25
+ description: string;
26
+ };
27
+ body: {
28
+ type: string;
29
+ description: string;
30
+ };
31
+ authorRole: {
32
+ type: string;
33
+ enum: readonly ["dev", "qa", "orchestrator"];
34
+ description: string;
35
+ };
36
+ };
37
+ };
38
+ execute(_id: string, params: Record<string, unknown>): Promise<import("@mariozechner/pi-agent-core").AgentToolResult<unknown>>;
39
+ };
40
+ //# sourceMappingURL=task-comment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-comment.d.ts","sourceRoot":"","sources":["../../../lib/tools/task-comment.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAE7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAQ/C,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,iBAAiB,IAClD,KAAK,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAuCH,MAAM,UAAU,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;EAqC7D"}
@@ -0,0 +1,84 @@
1
+ import { jsonResult } from "openclaw/plugin-sdk";
2
+ import { log as auditLog } from "../audit.js";
3
+ import { requireWorkspaceDir, resolveProject, resolveProvider } from "../tool-helpers.js";
4
+ /** Valid author roles for attribution */
5
+ const AUTHOR_ROLES = ["dev", "qa", "orchestrator"];
6
+ export function createTaskCommentTool(api) {
7
+ return (ctx) => ({
8
+ name: "task_comment",
9
+ label: "Task Comment",
10
+ description: `Add a comment to an issue. Use this for review feedback, implementation notes, or any discussion that doesn't require a state change.
11
+
12
+ Use cases:
13
+ - QA adds review feedback without blocking pass/fail
14
+ - DEV posts implementation notes or progress updates
15
+ - Orchestrator adds summary comments
16
+ - Cross-referencing related issues or PRs
17
+
18
+ Examples:
19
+ - Simple: { projectGroupId: "-123456789", issueId: 42, body: "Found an edge case with null inputs" }
20
+ - With role: { projectGroupId: "-123456789", issueId: 42, body: "LGTM!", authorRole: "qa" }
21
+ - Detailed: { projectGroupId: "-123456789", issueId: 42, body: "## Notes\\n\\n- Tested on staging\\n- All checks passing", authorRole: "dev" }`,
22
+ parameters: {
23
+ type: "object",
24
+ required: ["projectGroupId", "issueId", "body"],
25
+ properties: {
26
+ projectGroupId: {
27
+ type: "string",
28
+ description: "Telegram/WhatsApp group ID (key in projects.json)",
29
+ },
30
+ issueId: {
31
+ type: "number",
32
+ description: "Issue ID to comment on",
33
+ },
34
+ body: {
35
+ type: "string",
36
+ description: "Comment body in markdown. Supports GitHub-flavored markdown.",
37
+ },
38
+ authorRole: {
39
+ type: "string",
40
+ enum: AUTHOR_ROLES,
41
+ description: `Optional role attribution for the comment. One of: ${AUTHOR_ROLES.join(", ")}`,
42
+ },
43
+ },
44
+ },
45
+ async execute(_id, params) {
46
+ const groupId = params.projectGroupId;
47
+ const issueId = params.issueId;
48
+ const body = params.body;
49
+ const authorRole = params.authorRole ?? undefined;
50
+ const workspaceDir = requireWorkspaceDir(ctx);
51
+ if (!body || body.trim().length === 0) {
52
+ throw new Error("Comment body cannot be empty.");
53
+ }
54
+ const { project } = await resolveProject(workspaceDir, groupId);
55
+ const { provider, type: providerType } = resolveProvider(project);
56
+ const issue = await provider.getIssue(issueId);
57
+ const commentBody = authorRole
58
+ ? `${ROLE_EMOJI[authorRole]} **${authorRole.toUpperCase()}**: ${body}`
59
+ : body;
60
+ await provider.addComment(issueId, commentBody);
61
+ await auditLog(workspaceDir, "task_comment", {
62
+ project: project.name, groupId, issueId,
63
+ authorRole: authorRole ?? null,
64
+ bodyPreview: body.slice(0, 100) + (body.length > 100 ? "..." : ""),
65
+ provider: providerType,
66
+ });
67
+ return jsonResult({
68
+ success: true, issueId, issueTitle: issue.title, issueUrl: issue.web_url,
69
+ commentAdded: true, authorRole: authorRole ?? null, bodyLength: body.length,
70
+ project: project.name, provider: providerType,
71
+ announcement: `šŸ’¬ Comment added to #${issueId}${authorRole ? ` by ${authorRole.toUpperCase()}` : ""}`,
72
+ });
73
+ },
74
+ });
75
+ }
76
+ // ---------------------------------------------------------------------------
77
+ // Private helpers
78
+ // ---------------------------------------------------------------------------
79
+ const ROLE_EMOJI = {
80
+ dev: "šŸ‘Øā€šŸ’»",
81
+ qa: "šŸ”",
82
+ orchestrator: "šŸŽ›ļø",
83
+ };
84
+ //# sourceMappingURL=task-comment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-comment.js","sourceRoot":"","sources":["../../../lib/tools/task-comment.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * task_create — Create a new task (issue) in the project's issue tracker.
3
+ *
4
+ * Atomically: creates an issue with the specified title, description, and label.
5
+ * Returns the created issue for immediate pickup if desired.
6
+ *
7
+ * Use this when:
8
+ * - You want to create work items from chat
9
+ * - A sub-agent finds a bug and needs to file a follow-up issue
10
+ * - Breaking down an epic into smaller tasks
11
+ */
12
+ import type { OpenClawPluginApi } from "openclaw/plugin-sdk";
13
+ import type { ToolContext } from "../types.js";
14
+ export declare function createTaskCreateTool(api: OpenClawPluginApi): (ctx: ToolContext) => {
15
+ name: string;
16
+ label: string;
17
+ description: string;
18
+ parameters: {
19
+ type: string;
20
+ required: string[];
21
+ properties: {
22
+ projectGroupId: {
23
+ type: string;
24
+ description: string;
25
+ };
26
+ title: {
27
+ type: string;
28
+ description: string;
29
+ };
30
+ description: {
31
+ type: string;
32
+ description: string;
33
+ };
34
+ label: {
35
+ type: string;
36
+ description: string;
37
+ enum: readonly ["Planning", "To Do", "Doing", "To Test", "Testing", "Done", "To Improve", "Refining"];
38
+ };
39
+ assignees: {
40
+ type: string;
41
+ items: {
42
+ type: string;
43
+ };
44
+ description: string;
45
+ };
46
+ pickup: {
47
+ type: string;
48
+ description: string;
49
+ };
50
+ };
51
+ };
52
+ execute(_id: string, params: Record<string, unknown>): Promise<import("@mariozechner/pi-agent-core").AgentToolResult<unknown>>;
53
+ };
54
+ //# sourceMappingURL=task-create.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-create.d.ts","sourceRoot":"","sources":["../../../lib/tools/task-create.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAE7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAK/C,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,iBAAiB,IACjD,KAAK,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA2CH,MAAM,UAAU,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;EAgC7D"}
@@ -0,0 +1,77 @@
1
+ import { jsonResult } from "openclaw/plugin-sdk";
2
+ import { log as auditLog } from "../audit.js";
3
+ import { STATE_LABELS } from "../providers/provider.js";
4
+ import { requireWorkspaceDir, resolveProject, resolveProvider } from "../tool-helpers.js";
5
+ export function createTaskCreateTool(api) {
6
+ return (ctx) => ({
7
+ name: "task_create",
8
+ label: "Task Create",
9
+ description: `Create a new task (issue) in the project's issue tracker. Use this to file bugs, features, or tasks from chat.
10
+
11
+ **IMPORTANT:** Always creates in "Planning" unless the user explicitly asks to start work immediately. Never set label to "To Do" on your own — "Planning" issues require human review before entering the queue.
12
+
13
+ Examples:
14
+ - Default: { title: "Fix login bug" } → created in Planning
15
+ - User says "create and start working": { title: "Implement auth", description: "...", label: "To Do" }`,
16
+ parameters: {
17
+ type: "object",
18
+ required: ["projectGroupId", "title"],
19
+ properties: {
20
+ projectGroupId: {
21
+ type: "string",
22
+ description: "Telegram/WhatsApp group ID for the project",
23
+ },
24
+ title: {
25
+ type: "string",
26
+ description: "Short, descriptive issue title (e.g., 'Fix login timeout bug')",
27
+ },
28
+ description: {
29
+ type: "string",
30
+ description: "Full issue body in markdown. Use for detailed context, acceptance criteria, reproduction steps, links. Supports GitHub-flavored markdown.",
31
+ },
32
+ label: {
33
+ type: "string",
34
+ description: `State label. Defaults to "Planning" — only use "To Do" when the user explicitly asks to start work immediately.`,
35
+ enum: STATE_LABELS,
36
+ },
37
+ assignees: {
38
+ type: "array",
39
+ items: { type: "string" },
40
+ description: "GitHub/GitLab usernames to assign (optional)",
41
+ },
42
+ pickup: {
43
+ type: "boolean",
44
+ description: "If true, immediately pick up this issue for DEV after creation. Defaults to false.",
45
+ },
46
+ },
47
+ },
48
+ async execute(_id, params) {
49
+ const groupId = params.projectGroupId;
50
+ const title = params.title;
51
+ const description = params.description ?? "";
52
+ const label = params.label ?? "Planning";
53
+ const assignees = params.assignees ?? [];
54
+ const pickup = params.pickup ?? false;
55
+ const workspaceDir = requireWorkspaceDir(ctx);
56
+ const { project } = await resolveProject(workspaceDir, groupId);
57
+ const { provider, type: providerType } = resolveProvider(project);
58
+ const issue = await provider.createIssue(title, description, label, assignees);
59
+ await auditLog(workspaceDir, "task_create", {
60
+ project: project.name, groupId, issueId: issue.iid,
61
+ title, label, provider: providerType, pickup,
62
+ });
63
+ const hasBody = description && description.trim().length > 0;
64
+ let announcement = `šŸ“‹ Created #${issue.iid}: "${title}" (${label})`;
65
+ if (hasBody)
66
+ announcement += "\nWith detailed description.";
67
+ announcement += `\nšŸ”— ${issue.web_url}`;
68
+ announcement += pickup ? "\nPicking up for DEV..." : "\nReady for pickup when needed.";
69
+ return jsonResult({
70
+ success: true,
71
+ issue: { id: issue.iid, title: issue.title, body: hasBody ? description : null, url: issue.web_url, label },
72
+ project: project.name, provider: providerType, pickup, announcement,
73
+ });
74
+ },
75
+ });
76
+ }
77
+ //# sourceMappingURL=task-create.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-create.js","sourceRoot":"","sources":["../../../lib/tools/task-create.ts"],"names":[],"mappings":"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"}