fxied tea issue deps syntax problems

This commit is contained in:
2026-05-11 23:43:33 +02:00
parent 515595495e
commit 764aee4a18

View File

@@ -1,286 +1,119 @@
import { tool } from "@opencode-ai/plugin" import { tool } from "@opencode-ai/plugin";
import { $ } from "bun" import { $ } from "bun";
export const issueDepsList = tool({ export const issueDepsList = tool({
description: "List dependency relationships for an issue (what it blocks and what blocks it)", description: "List dependency relationships for an issue",
args: { args: {
issueNumber: tool.schema.number().describe("Issue number"), issueNumber: tool.schema.number().describe("Issue number"),
}, },
async execute(args, context) { async execute(args) {
try { try {
const result = await $`tea issue ${args.issueNumber} --output json --comments`.text() const result =
const issue = JSON.parse(result) await $`tea issue ${args.issueNumber} --output json --comments`.text();
const issue = JSON.parse(result);
const dependencies = {
const dependencies: {
issueNumber: number;
title: string;
blocks: Array<{ issueNumber: number; relationship: "blocks" }>;
blockedBy: Array<{ issueNumber: number; relationship: "blockedBy" }>;
} = {
issueNumber: issue.index, issueNumber: issue.index,
title: issue.title, title: issue.title,
blocks: [], blocks: [],
blockedBy: [], blockedBy: [],
} };
if (issue.comments && Array.isArray(issue.comments)) { for (const comment of issue.comments ?? []) {
for (const comment of issue.comments) { const text = comment.body ?? "";
const text = comment.body || ""
const depMatch = text.match(/blocks\s+#[0-9]+|blocked by\s+#[0-9]+/i) const matches = text.matchAll(/\b(blocks|blocked by)\s+#(\d+)/gi);
if (depMatch) {
const relatedIssueMatch = text.match(/#[0-9]+/) for (const match of matches) {
if (relatedIssueMatch) { const relationshipText = match[1].toLowerCase();
const relatedIssueNum = parseInt(relatedIssueMatch[0], 10) const relatedIssueNum = Number(match[2]);
const isBlocks = depMatch[0].toLowerCase().startsWith("blocks")
if (isBlocks) { if (relationshipText === "blocks") {
dependencies.blocks.push({ dependencies.blocks.push({
issueNumber: relatedIssueNum, issueNumber: relatedIssueNum,
relationship: "blocks", relationship: "blocks",
}) });
} else { } else {
dependencies.blockedBy.push({ dependencies.blockedBy.push({
issueNumber: relatedIssueNum, issueNumber: relatedIssueNum,
relationship: "blockedBy", relationship: "blockedBy",
}) });
}
}
} }
} }
} }
return dependencies return dependencies;
} catch (error: any) { } catch (error: any) {
return { return {
error: "Failed to get issue dependencies", error: "Failed to get issue dependencies",
message: error.message, message: error.message,
stderr: error.stderr?.toString(), stderr: error.stderr?.toString(),
} };
} }
}, },
}) });
export const issueDepsAdd = tool({ export const issueDepsAdd = tool({
description: "Add a dependency relationship between issues (issue A blocks issue B, or issue A is blocked by issue B)", description: "Add a dependency relationship between issues",
args: { args: {
issueNumber: tool.schema.number().describe("Primary issue number"), issueNumber: tool.schema.number().describe("Primary issue number"),
relatedIssueNumber: tool.schema.number().describe("Related issue number"), relatedIssueNumber: tool.schema.number().describe("Related issue number"),
relationship: tool.schema.enum(["blocks", "blockedBy"]).describe("Relationship type: 'blocks' means issueNumber blocks relatedIssueNumber, 'blockedBy' means issueNumber is blocked by relatedIssueNumber"), relationship: tool.schema
comment: tool.schema.string().optional().describe("Optional comment to add with the dependency"), .enum(["blocks", "blockedBy"])
.describe("'blocks' means issueNumber blocks relatedIssueNumber"),
comment: tool.schema.string().optional().describe("Optional comment"),
}, },
async execute(args, context) { async execute(args) {
try { try {
let commentText = "" let commentText =
if (args.relationship === "blocks") { args.relationship === "blocks"
commentText = `@${args.relatedIssueNumber} blocks #${args.issueNumber}` ? `blocks #${args.relatedIssueNumber}`
} else { : `blocked by #${args.relatedIssueNumber}`;
commentText = `@${args.issueNumber} is blocked by #${args.relatedIssueNumber}`
}
if (args.comment) {
commentText += `\n\n${args.comment}`
}
const result = await import { tool } from "@opencode-ai/plugin"
import { $ } from "bun"
export const issueDepsList = tool({
description: "List dependency relationships for an issue (what it blocks and what blocks it)",
args: {
issueNumber: tool.schema.number().describe("Issue number"),
},
async execute(args, context) {
try {
const result = await $`tea issue ${args.issueNumber} --output json --comments`.text()
const issue = JSON.parse(result)
const dependencies = {
issueNumber: issue.index,
title: issue.title,
blocks: [],
blockedBy: [],
}
if (issue.comments && Array.isArray(issue.comments)) {
for (const comment of issue.comments) {
const text = comment.body || ""
const depMatch = text.match(/blocks\s+#[0-9]+|blocked by\s+#[0-9]+/i)
if (depMatch) {
const relatedIssueMatch = text.match(/#[0-9]+/)
if (relatedIssueMatch) {
const relatedIssueNum = parseInt(relatedIssueMatch[0], 10)
const isBlocks = depMatch[0].toLowerCase().startsWith("blocks")
if (isBlocks) {
dependencies.blocks.push({
issueNumber: relatedIssueNum,
relationship: "blocks",
})
} else {
dependencies.blockedBy.push({
issueNumber: relatedIssueNum,
relationship: "blockedBy",
})
}
}
}
}
}
return dependencies
} catch (error: any) {
return {
error: "Failed to get issue dependencies",
message: error.message,
stderr: error.stderr?.toString(),
}
}
},
})
export const issueDepsAdd = tool({
description: "Add a dependency relationship between issues (issue A blocks issue B, or issue A is blocked by issue B)",
args: {
issueNumber: tool.schema.number().describe("Primary issue number"),
relatedIssueNumber: tool.schema.number().describe("Related issue number"),
relationship: tool.schema.enum(["blocks", "blockedBy"]).describe("Relationship type: 'blocks' means issueNumber blocks relatedIssueNumber, 'blockedBy' means issueNumber is blocked by relatedIssueNumber"),
comment: tool.schema.string().optional().describe("Optional comment to add with the dependency"),
},
async execute(args, context) {
try {
let commentText = ""
if (args.relationship === "blocks") {
commentText = `@${args.relatedIssueNumber} blocks #${args.issueNumber}`
} else {
commentText = `@${args.issueNumber} is blocked by #${args.relatedIssueNumber}`
}
if (args.comment) { if (args.comment) {
commentText += `\n\n${args.comment}` commentText += `\n\n${args.comment}`;
} }
tea issue comment --output json --issue ${args.issueNumber} --body ${commentText}`.text() const result =
return result await $`tea issue comment --output json --issue ${args.issueNumber} --body ${commentText}`.text();
return JSON.parse(result);
} catch (error: any) { } catch (error: any) {
return { return {
error: "Failed to add issue dependency", error: "Failed to add issue dependency",
message: error.message, message: error.message,
stderr: error.stderr?.toString(), stderr: error.stderr?.toString(),
} };
} }
}, },
}) });
export const issueDepsRemove = tool({ export const issueDepsRemove = tool({
description: "Remove a dependency relationship between issues by commenting on the issue", description:
args: { "Remove a dependency relationship between issues by commenting on the issue",
issueNumber: tool.schema.number().describe("Primary issue number"),
relatedIssueNumber: tool.schema.number().describe("Related issue number to remove dependency from"),
},
async execute(args, context) {
try {
const commentText = `@${args.relatedIssueNumber} removing dependency relationship`
const result = await import { tool } from "@opencode-ai/plugin"
import { $ } from "bun"
export const issueDepsList = tool({
description: "List dependency relationships for an issue (what it blocks and what blocks it)",
args: {
issueNumber: tool.schema.number().describe("Issue number"),
},
async execute(args, context) {
try {
const result = await $`tea issue ${args.issueNumber} --output json --comments`.text()
const issue = JSON.parse(result)
const dependencies = {
issueNumber: issue.index,
title: issue.title,
blocks: [],
blockedBy: [],
}
if (issue.comments && Array.isArray(issue.comments)) {
for (const comment of issue.comments) {
const text = comment.body || ""
const depMatch = text.match(/blocks\s+#[0-9]+|blocked by\s+#[0-9]+/i)
if (depMatch) {
const relatedIssueMatch = text.match(/#[0-9]+/)
if (relatedIssueMatch) {
const relatedIssueNum = parseInt(relatedIssueMatch[0], 10)
const isBlocks = depMatch[0].toLowerCase().startsWith("blocks")
if (isBlocks) {
dependencies.blocks.push({
issueNumber: relatedIssueNum,
relationship: "blocks",
})
} else {
dependencies.blockedBy.push({
issueNumber: relatedIssueNum,
relationship: "blockedBy",
})
}
}
}
}
}
return dependencies
} catch (error: any) {
return {
error: "Failed to get issue dependencies",
message: error.message,
stderr: error.stderr?.toString(),
}
}
},
})
export const issueDepsAdd = tool({
description: "Add a dependency relationship between issues (issue A blocks issue B, or issue A is blocked by issue B)",
args: { args: {
issueNumber: tool.schema.number().describe("Primary issue number"), issueNumber: tool.schema.number().describe("Primary issue number"),
relatedIssueNumber: tool.schema.number().describe("Related issue number"), relatedIssueNumber: tool.schema.number().describe("Related issue number"),
relationship: tool.schema.enum(["blocks", "blockedBy"]).describe("Relationship type: 'blocks' means issueNumber blocks relatedIssueNumber, 'blockedBy' means issueNumber is blocked by relatedIssueNumber"),
comment: tool.schema.string().optional().describe("Optional comment to add with the dependency"),
}, },
async execute(args, context) { async execute(args) {
try { try {
let commentText = "" const commentText = `removing dependency relationship with #${args.relatedIssueNumber}`;
if (args.relationship === "blocks") {
commentText = `@${args.relatedIssueNumber} blocks #${args.issueNumber}`
} else {
commentText = `@${args.issueNumber} is blocked by #${args.relatedIssueNumber}`
}
if (args.comment) {
commentText += `\n\n${args.comment}`
}
const result = await $`tea issue comment --output json --issue ${args.issueNumber} --body ${commentText}`.text()
return JSON.parse(result)
} catch (error: any) {
return {
error: "Failed to add issue dependency",
message: error.message,
stderr: error.stderr?.toString(),
}
}
},
})
export const issueDepsRemove = tool({ const result =
description: "Remove a dependency relationship between issues by commenting on the issue", await $`tea issue comment --output json --issue ${args.issueNumber} --body ${commentText}`.text();
args: {
issueNumber: tool.schema.number().describe("Primary issue number"), return JSON.parse(result);
relatedIssueNumber: tool.schema.number().describe("Related issue number to remove dependency from"),
},
async execute(args, context) {
try {
const commentText = `@${args.relatedIssueNumber} removing dependency relationship`
tea issue comment --output json --issue ${args.issueNumber} --body ${commentText}`.text()
return result
} catch (error: any) { } catch (error: any) {
return { return {
error: "Failed to remove issue dependency", error: "Failed to remove issue dependency",
message: error.message, message: error.message,
stderr: error.stderr?.toString(), stderr: error.stderr?.toString(),
} };
} }
}, },
}) });