feat(FN-2625): merge fusion/fn-2625

This commit is contained in:
gsxdsm
2026-04-26 21:36:23 -07:00
parent d8c4ab9c50
commit 27e72190a6
7 changed files with 140 additions and 1 deletions

View File

@@ -1059,6 +1059,19 @@ describe.skip("fn pi extension", () => {
"api", "api",
"repos/acme/demo/issues?state=open&per_page=5", "repos/acme/demo/issues?state=open&per_page=5",
]); ]);
const store = new TaskStore(tmpDir, join(tmpDir, ".fusion-global-settings"));
await store.init();
const tasks = await store.listTasks({ includeArchived: true });
expect(tasks).toHaveLength(2);
const issueOneTask = tasks.find((task) => task.sourceIssue?.issueNumber === 1);
expect(issueOneTask?.sourceIssue).toEqual({
provider: "github",
repository: "acme/demo",
externalIssueId: "1",
issueNumber: 1,
url: "https://github.com/acme/demo/issues/1",
});
}); });
it("fn_task_browse_github_issues lists issues via gh api", async () => { it("fn_task_browse_github_issues lists issues via gh api", async () => {

View File

@@ -922,12 +922,26 @@ describe("runTaskImportGitHubInteractive", () => {
description: "Description 1\n\nSource: https://github.com/owner/repo/issues/1", description: "Description 1\n\nSource: https://github.com/owner/repo/issues/1",
column: "triage", column: "triage",
dependencies: [], dependencies: [],
sourceIssue: {
provider: "github",
repository: "owner/repo",
externalIssueId: "1",
issueNumber: 1,
url: "https://github.com/owner/repo/issues/1",
},
}); });
expect(mockCreateTask).toHaveBeenCalledWith({ expect(mockCreateTask).toHaveBeenCalledWith({
title: "Third Issue", title: "Third Issue",
description: "Description 3\n\nSource: https://github.com/owner/repo/issues/3", description: "Description 3\n\nSource: https://github.com/owner/repo/issues/3",
column: "triage", column: "triage",
dependencies: [], dependencies: [],
sourceIssue: {
provider: "github",
repository: "owner/repo",
externalIssueId: "3",
issueNumber: 3,
url: "https://github.com/owner/repo/issues/3",
},
}); });
}); });
@@ -978,6 +992,13 @@ describe("runTaskImportGitHubInteractive", () => {
description: "Description 2\n\nSource: https://github.com/owner/repo/issues/2", description: "Description 2\n\nSource: https://github.com/owner/repo/issues/2",
column: "triage", column: "triage",
dependencies: [], dependencies: [],
sourceIssue: {
provider: "github",
repository: "owner/repo",
externalIssueId: "2",
issueNumber: 2,
url: "https://github.com/owner/repo/issues/2",
},
}); });
const skipLine = logSpy.mock.calls.find( const skipLine = logSpy.mock.calls.find(
@@ -1224,6 +1245,13 @@ describe("runTaskImportFromGitHub", () => {
description: "Description 1\n\nSource: https://github.com/owner/repo/issues/1", description: "Description 1\n\nSource: https://github.com/owner/repo/issues/1",
column: "triage", column: "triage",
dependencies: [], dependencies: [],
sourceIssue: {
provider: "github",
repository: "owner/repo",
externalIssueId: "1",
issueNumber: 1,
url: "https://github.com/owner/repo/issues/1",
},
}); });
const successLine = logSpy.mock.calls.find( const successLine = logSpy.mock.calls.find(
@@ -1299,6 +1327,13 @@ describe("runTaskImportFromGitHub", () => {
description: "(no description)\n\nSource: https://github.com/owner/repo/issues/1", description: "(no description)\n\nSource: https://github.com/owner/repo/issues/1",
column: "triage", column: "triage",
dependencies: [], dependencies: [],
sourceIssue: {
provider: "github",
repository: "owner/repo",
externalIssueId: "1",
issueNumber: 1,
url: "https://github.com/owner/repo/issues/1",
},
}); });
}); });
@@ -1313,6 +1348,13 @@ describe("runTaskImportFromGitHub", () => {
description: expect.stringContaining("Body"), description: expect.stringContaining("Body"),
column: "triage", column: "triage",
dependencies: [], dependencies: [],
sourceIssue: {
provider: "github",
repository: "owner/repo",
externalIssueId: "1",
issueNumber: 1,
url: "https://github.com/owner/repo/issues/1",
},
}); });
}); });
}); });

View File

@@ -820,6 +820,13 @@ export async function runTaskImportGitHubInteractive(
description, description,
column: "triage", column: "triage",
dependencies: [], dependencies: [],
sourceIssue: {
provider: "github",
repository: `${owner}/${repo}`,
externalIssueId: String(issue.number),
issueNumber: issue.number,
url: issue.html_url,
},
}); });
const label = task.title || task.description.slice(0, 60) + (task.description.length > 60 ? "…" : ""); const label = task.title || task.description.slice(0, 60) + (task.description.length > 60 ? "…" : "");
@@ -956,6 +963,13 @@ export async function runTaskImportFromGitHub(
description, description,
column: "triage", column: "triage",
dependencies: [], dependencies: [],
sourceIssue: {
provider: "github",
repository: `${owner}/${repo}`,
externalIssueId: String(issue.number),
issueNumber: issue.number,
url: issue.html_url,
},
}); });
const label = task.title || task.description.slice(0, 60) + (task.description.length > 60 ? "…" : ""); const label = task.title || task.description.slice(0, 60) + (task.description.length > 60 ? "…" : "");

View File

@@ -801,6 +801,13 @@ export default function kbExtension(pi: ExtensionAPI) {
description, description,
column: "triage", column: "triage",
dependencies: [], dependencies: [],
sourceIssue: {
provider: "github",
repository: `${owner}/${repo}`,
externalIssueId: String(issue.number),
issueNumber: issue.number,
url: issue.html_url,
},
}); });
await store.logEntry(task.id, "Imported from GitHub", sourceUrl); await store.logEntry(task.id, "Imported from GitHub", sourceUrl);
@@ -887,6 +894,13 @@ export default function kbExtension(pi: ExtensionAPI) {
description, description,
column: "triage", column: "triage",
dependencies: [], dependencies: [],
sourceIssue: {
provider: "github",
repository: `${owner}/${repo}`,
externalIssueId: String(issue.number),
issueNumber: issue.number,
url: issue.html_url,
},
}); });
await store.logEntry(task.id, "Imported from GitHub", sourceUrl); await store.logEntry(task.id, "Imported from GitHub", sourceUrl);

View File

@@ -6,7 +6,8 @@
"types": ["node", "vitest/globals"], "types": ["node", "vitest/globals"],
"jsx": "react-jsx", "jsx": "react-jsx",
"paths": { "paths": {
"@fusion/test-utils": ["../core/src/__test-utils__/workspace.ts"] "@fusion/test-utils": ["../core/src/__test-utils__/workspace.ts"],
"node-pty": ["../dashboard/src/types/node-pty/index.d.ts"]
} }
}, },
"include": ["src/**/*"], "include": ["src/**/*"],

View File

@@ -6146,6 +6146,13 @@ describe("POST /github/issues/import", () => {
description: "Test body\n\nSource: https://github.com/owner/repo/issues/1", description: "Test body\n\nSource: https://github.com/owner/repo/issues/1",
column: "triage", column: "triage",
dependencies: [], dependencies: [],
sourceIssue: {
provider: "github",
repository: "owner/repo",
externalIssueId: "1",
issueNumber: 1,
url: "https://github.com/owner/repo/issues/1",
},
}); });
}); });
@@ -6240,6 +6247,13 @@ describe("POST /github/issues/import", () => {
description: expect.stringContaining("Source:"), description: expect.stringContaining("Source:"),
column: "triage", column: "triage",
dependencies: [], dependencies: [],
sourceIssue: {
provider: "github",
repository: "owner/repo",
externalIssueId: "1",
issueNumber: 1,
url: "https://github.com/owner/repo/issues/1",
},
}); });
}); });
}); });
@@ -6317,6 +6331,33 @@ describe("POST /github/issues/batch-import", () => {
expect(res.body.results.every((r: { success: boolean }) => r.success)).toBe(true); expect(res.body.results.every((r: { success: boolean }) => r.success)).toBe(true);
expect(throttledSpy).toHaveBeenCalledTimes(3); expect(throttledSpy).toHaveBeenCalledTimes(3);
expect(store.createTask).toHaveBeenCalledTimes(3); expect(store.createTask).toHaveBeenCalledTimes(3);
expect(store.createTask).toHaveBeenNthCalledWith(1, expect.objectContaining({
sourceIssue: {
provider: "github",
repository: "owner/repo",
externalIssueId: "1",
issueNumber: 1,
url: "https://github.com/owner/repo/issues/1",
},
}));
expect(store.createTask).toHaveBeenNthCalledWith(2, expect.objectContaining({
sourceIssue: {
provider: "github",
repository: "owner/repo",
externalIssueId: "2",
issueNumber: 2,
url: "https://github.com/owner/repo/issues/2",
},
}));
expect(store.createTask).toHaveBeenNthCalledWith(3, expect.objectContaining({
sourceIssue: {
provider: "github",
repository: "owner/repo",
externalIssueId: "3",
issueNumber: 3,
url: "https://github.com/owner/repo/issues/3",
},
}));
}); });
it("skips already-imported issues", async () => { it("skips already-imported issues", async () => {

View File

@@ -2079,6 +2079,13 @@ export function registerGitGitHubRoutes(ctx: ApiRoutesContext): void {
description, description,
column: "triage", column: "triage",
dependencies: [], dependencies: [],
sourceIssue: {
provider: "github",
repository: `${owner}/${repo}`,
externalIssueId: String(issue.number),
issueNumber: issue.number,
url: issue.html_url,
},
}); });
// Log the import action // Log the import action
@@ -2208,6 +2215,13 @@ export function registerGitGitHubRoutes(ctx: ApiRoutesContext): void {
description, description,
column: "triage", column: "triage",
dependencies: [], dependencies: [],
sourceIssue: {
provider: "github",
repository: `${owner}/${repo}`,
externalIssueId: String(issue.number),
issueNumber: issue.number,
url: issue.html_url,
},
}); });
// Log the import action // Log the import action