mirror of
https://github.com/anthropics/claude-code-action.git
synced 2026-01-22 22:44:13 +08:00
feat: add unified update_claude_comment tool (#98)
* feat: add unified update_claude_comment tool - Add new update_claude_comment tool that automatically handles both issue and PR comments - Remove individual update_issue_comment and update_pull_request_comment tools - Pass CLAUDE_COMMENT_ID, GITHUB_EVENT_NAME, and IS_PR to MCP server environment - Simplify Claude's comment update workflow by removing need for owner/repo/commentId params - Update prompts and tests to use the new unified tool * feat: add unified update_claude_comment tool - Add new update_claude_comment tool that automatically handles both issue and PR comments - Remove individual update_issue_comment and update_pull_request_comment tools - Pass CLAUDE_COMMENT_ID, GITHUB_EVENT_NAME, and IS_PR to MCP server environment - Use Octokit instead of raw fetch for better type safety and error handling - Simplify Claude's comment update workflow by removing need for owner/repo/commentId params - Update prompts and tests to use the new unified tool * refactor: extract update_claude_comment logic to standalone testable function - Create new updateClaudeComment function in operations/comments - Add comprehensive unit tests following image-downloader pattern - Update MCP server to use extracted function - Refactor update-comment-link.ts and update-with-branch.ts to eliminate duplication - All tests passing (10 new tests for update-claude-comment) Co-authored-by: ashwin-ant <ashwin-ant@users.noreply.github.com> * prettier * tsc * clean up comments --------- Co-authored-by: claude[bot] <209825114+claude[bot]@users.noreply.github.com> Co-authored-by: ashwin-ant <ashwin-ant@users.noreply.github.com>
This commit is contained in:
@@ -25,12 +25,12 @@ describe("prepareMcpConfig", () => {
|
||||
});
|
||||
|
||||
test("should return base config when no additional config is provided", async () => {
|
||||
const result = await prepareMcpConfig(
|
||||
"test-token",
|
||||
"test-owner",
|
||||
"test-repo",
|
||||
"test-branch",
|
||||
);
|
||||
const result = await prepareMcpConfig({
|
||||
githubToken: "test-token",
|
||||
owner: "test-owner",
|
||||
repo: "test-repo",
|
||||
branch: "test-branch",
|
||||
});
|
||||
|
||||
const parsed = JSON.parse(result);
|
||||
expect(parsed.mcpServers).toBeDefined();
|
||||
@@ -50,13 +50,13 @@ describe("prepareMcpConfig", () => {
|
||||
});
|
||||
|
||||
test("should return base config when additional config is empty string", async () => {
|
||||
const result = await prepareMcpConfig(
|
||||
"test-token",
|
||||
"test-owner",
|
||||
"test-repo",
|
||||
"test-branch",
|
||||
"",
|
||||
);
|
||||
const result = await prepareMcpConfig({
|
||||
githubToken: "test-token",
|
||||
owner: "test-owner",
|
||||
repo: "test-repo",
|
||||
branch: "test-branch",
|
||||
additionalMcpConfig: "",
|
||||
});
|
||||
|
||||
const parsed = JSON.parse(result);
|
||||
expect(parsed.mcpServers).toBeDefined();
|
||||
@@ -66,13 +66,13 @@ describe("prepareMcpConfig", () => {
|
||||
});
|
||||
|
||||
test("should return base config when additional config is whitespace only", async () => {
|
||||
const result = await prepareMcpConfig(
|
||||
"test-token",
|
||||
"test-owner",
|
||||
"test-repo",
|
||||
"test-branch",
|
||||
" \n\t ",
|
||||
);
|
||||
const result = await prepareMcpConfig({
|
||||
githubToken: "test-token",
|
||||
owner: "test-owner",
|
||||
repo: "test-repo",
|
||||
branch: "test-branch",
|
||||
additionalMcpConfig: " \n\t ",
|
||||
});
|
||||
|
||||
const parsed = JSON.parse(result);
|
||||
expect(parsed.mcpServers).toBeDefined();
|
||||
@@ -94,13 +94,13 @@ describe("prepareMcpConfig", () => {
|
||||
},
|
||||
});
|
||||
|
||||
const result = await prepareMcpConfig(
|
||||
"test-token",
|
||||
"test-owner",
|
||||
"test-repo",
|
||||
"test-branch",
|
||||
additionalConfig,
|
||||
);
|
||||
const result = await prepareMcpConfig({
|
||||
githubToken: "test-token",
|
||||
owner: "test-owner",
|
||||
repo: "test-repo",
|
||||
branch: "test-branch",
|
||||
additionalMcpConfig: additionalConfig,
|
||||
});
|
||||
|
||||
const parsed = JSON.parse(result);
|
||||
expect(consoleInfoSpy).toHaveBeenCalledWith(
|
||||
@@ -127,13 +127,13 @@ describe("prepareMcpConfig", () => {
|
||||
},
|
||||
});
|
||||
|
||||
const result = await prepareMcpConfig(
|
||||
"test-token",
|
||||
"test-owner",
|
||||
"test-repo",
|
||||
"test-branch",
|
||||
additionalConfig,
|
||||
);
|
||||
const result = await prepareMcpConfig({
|
||||
githubToken: "test-token",
|
||||
owner: "test-owner",
|
||||
repo: "test-repo",
|
||||
branch: "test-branch",
|
||||
additionalMcpConfig: additionalConfig,
|
||||
});
|
||||
|
||||
const parsed = JSON.parse(result);
|
||||
expect(consoleInfoSpy).toHaveBeenCalledWith(
|
||||
@@ -163,13 +163,13 @@ describe("prepareMcpConfig", () => {
|
||||
},
|
||||
});
|
||||
|
||||
const result = await prepareMcpConfig(
|
||||
"test-token",
|
||||
"test-owner",
|
||||
"test-repo",
|
||||
"test-branch",
|
||||
additionalConfig,
|
||||
);
|
||||
const result = await prepareMcpConfig({
|
||||
githubToken: "test-token",
|
||||
owner: "test-owner",
|
||||
repo: "test-repo",
|
||||
branch: "test-branch",
|
||||
additionalMcpConfig: additionalConfig,
|
||||
});
|
||||
|
||||
const parsed = JSON.parse(result);
|
||||
expect(parsed.customProperty).toBe("custom-value");
|
||||
@@ -181,13 +181,13 @@ describe("prepareMcpConfig", () => {
|
||||
test("should handle invalid JSON gracefully", async () => {
|
||||
const invalidJson = "{ invalid json }";
|
||||
|
||||
const result = await prepareMcpConfig(
|
||||
"test-token",
|
||||
"test-owner",
|
||||
"test-repo",
|
||||
"test-branch",
|
||||
invalidJson,
|
||||
);
|
||||
const result = await prepareMcpConfig({
|
||||
githubToken: "test-token",
|
||||
owner: "test-owner",
|
||||
repo: "test-repo",
|
||||
branch: "test-branch",
|
||||
additionalMcpConfig: invalidJson,
|
||||
});
|
||||
|
||||
const parsed = JSON.parse(result);
|
||||
expect(consoleWarningSpy).toHaveBeenCalledWith(
|
||||
@@ -200,13 +200,13 @@ describe("prepareMcpConfig", () => {
|
||||
test("should handle non-object JSON values", async () => {
|
||||
const nonObjectJson = JSON.stringify("string value");
|
||||
|
||||
const result = await prepareMcpConfig(
|
||||
"test-token",
|
||||
"test-owner",
|
||||
"test-repo",
|
||||
"test-branch",
|
||||
nonObjectJson,
|
||||
);
|
||||
const result = await prepareMcpConfig({
|
||||
githubToken: "test-token",
|
||||
owner: "test-owner",
|
||||
repo: "test-repo",
|
||||
branch: "test-branch",
|
||||
additionalMcpConfig: nonObjectJson,
|
||||
});
|
||||
|
||||
const parsed = JSON.parse(result);
|
||||
expect(consoleWarningSpy).toHaveBeenCalledWith(
|
||||
@@ -222,13 +222,13 @@ describe("prepareMcpConfig", () => {
|
||||
test("should handle null JSON value", async () => {
|
||||
const nullJson = JSON.stringify(null);
|
||||
|
||||
const result = await prepareMcpConfig(
|
||||
"test-token",
|
||||
"test-owner",
|
||||
"test-repo",
|
||||
"test-branch",
|
||||
nullJson,
|
||||
);
|
||||
const result = await prepareMcpConfig({
|
||||
githubToken: "test-token",
|
||||
owner: "test-owner",
|
||||
repo: "test-repo",
|
||||
branch: "test-branch",
|
||||
additionalMcpConfig: nullJson,
|
||||
});
|
||||
|
||||
const parsed = JSON.parse(result);
|
||||
expect(consoleWarningSpy).toHaveBeenCalledWith(
|
||||
@@ -244,13 +244,13 @@ describe("prepareMcpConfig", () => {
|
||||
test("should handle array JSON value", async () => {
|
||||
const arrayJson = JSON.stringify([1, 2, 3]);
|
||||
|
||||
const result = await prepareMcpConfig(
|
||||
"test-token",
|
||||
"test-owner",
|
||||
"test-repo",
|
||||
"test-branch",
|
||||
arrayJson,
|
||||
);
|
||||
const result = await prepareMcpConfig({
|
||||
githubToken: "test-token",
|
||||
owner: "test-owner",
|
||||
repo: "test-repo",
|
||||
branch: "test-branch",
|
||||
additionalMcpConfig: arrayJson,
|
||||
});
|
||||
|
||||
const parsed = JSON.parse(result);
|
||||
// Arrays are objects in JavaScript, so they pass the object check
|
||||
@@ -289,13 +289,13 @@ describe("prepareMcpConfig", () => {
|
||||
},
|
||||
});
|
||||
|
||||
const result = await prepareMcpConfig(
|
||||
"test-token",
|
||||
"test-owner",
|
||||
"test-repo",
|
||||
"test-branch",
|
||||
additionalConfig,
|
||||
);
|
||||
const result = await prepareMcpConfig({
|
||||
githubToken: "test-token",
|
||||
owner: "test-owner",
|
||||
repo: "test-repo",
|
||||
branch: "test-branch",
|
||||
additionalMcpConfig: additionalConfig,
|
||||
});
|
||||
|
||||
const parsed = JSON.parse(result);
|
||||
expect(parsed.mcpServers.server1).toBeDefined();
|
||||
@@ -310,12 +310,12 @@ describe("prepareMcpConfig", () => {
|
||||
const oldEnv = process.env.GITHUB_ACTION_PATH;
|
||||
process.env.GITHUB_ACTION_PATH = "/test/action/path";
|
||||
|
||||
const result = await prepareMcpConfig(
|
||||
"test-token",
|
||||
"test-owner",
|
||||
"test-repo",
|
||||
"test-branch",
|
||||
);
|
||||
const result = await prepareMcpConfig({
|
||||
githubToken: "test-token",
|
||||
owner: "test-owner",
|
||||
repo: "test-repo",
|
||||
branch: "test-branch",
|
||||
});
|
||||
|
||||
const parsed = JSON.parse(result);
|
||||
expect(parsed.mcpServers.github_file_ops.args[1]).toBe(
|
||||
@@ -329,12 +329,12 @@ describe("prepareMcpConfig", () => {
|
||||
const oldEnv = process.env.GITHUB_WORKSPACE;
|
||||
delete process.env.GITHUB_WORKSPACE;
|
||||
|
||||
const result = await prepareMcpConfig(
|
||||
"test-token",
|
||||
"test-owner",
|
||||
"test-repo",
|
||||
"test-branch",
|
||||
);
|
||||
const result = await prepareMcpConfig({
|
||||
githubToken: "test-token",
|
||||
owner: "test-owner",
|
||||
repo: "test-repo",
|
||||
branch: "test-branch",
|
||||
});
|
||||
|
||||
const parsed = JSON.parse(result);
|
||||
expect(parsed.mcpServers.github_file_ops.env.REPO_DIR).toBe(process.cwd());
|
||||
|
||||
Reference in New Issue
Block a user