diff --git a/index.ts b/index.ts index 9ab88f0..97098cd 100644 --- a/index.ts +++ b/index.ts @@ -65,10 +65,10 @@ const plugin = { register(api: OpenClawPluginApi) { // Agent tools (primary interface — agent calls these directly) api.registerTool(createTaskPickupTool(api), { - names: ["task_pickup"], + names: ["task_pickup", "work_start"], }); api.registerTool(createTaskCompleteTool(api), { - names: ["task_complete"], + names: ["task_complete", "work_finish"], }); api.registerTool(createTaskUpdateTool(api), { names: ["task_update"], @@ -77,7 +77,7 @@ const plugin = { names: ["task_comment"], }); api.registerTool(createQueueStatusTool(api), { - names: ["queue_status"], + names: ["queue_status", "status"], }); api.registerTool(createSessionHealthTool(api), { names: ["session_health"], diff --git a/lib/tools/task-complete.ts b/lib/tools/task-complete.ts index 2801a46..f47f0b0 100644 --- a/lib/tools/task-complete.ts +++ b/lib/tools/task-complete.ts @@ -138,6 +138,10 @@ export function createTaskCompleteTool(api: OpenClawPluginApi) { output.gitPull = `warning: ${(err as Error).message}`; } + // Fetch issue to get URL + const issue = await provider.getIssue(issueId); + const issueUrl = issue.web_url; + // Auto-detect PR/MR URL if not provided if (!prUrl) { try { @@ -152,17 +156,19 @@ export function createTaskCompleteTool(api: OpenClawPluginApi) { output.labelTransition = "Doing → To Test"; - // Build announcement with PR URL if available + // Build announcement with URLs let announcement = `āœ… DEV done #${issueId}`; if (summary) { announcement += ` — ${summary}`; } + announcement += `\nšŸ“‹ Issue: ${issueUrl}`; if (prUrl) { announcement += `\nšŸ”— PR: ${prUrl}`; } - announcement += `. Moved to QA queue.`; + announcement += `\nMoved to QA queue.`; output.announcement = announcement; + output.issueUrl = issueUrl; if (prUrl) { output.prUrl = prUrl; } @@ -215,13 +221,18 @@ export function createTaskCompleteTool(api: OpenClawPluginApi) { // === QA PASS === if (role === "qa" && result === "pass") { + // Fetch issue to get URL + const issue = await provider.getIssue(issueId); + const issueUrl = issue.web_url; + await deactivateWorker(workspaceDir, groupId, "qa"); await provider.transitionLabel(issueId, "Testing", "Done"); await provider.closeIssue(issueId); output.labelTransition = "Testing → Done"; output.issueClosed = true; - output.announcement = `šŸŽ‰ QA PASS #${issueId}${summary ? ` — ${summary}` : ""}. Issue closed.`; + output.issueUrl = issueUrl; + output.announcement = `šŸŽ‰ QA PASS #${issueId}${summary ? ` — ${summary}` : ""}\nšŸ“‹ Issue: ${issueUrl}\nIssue closed.`; } // === QA FAIL ===