feat(KB-622): unify steeringComments and comments into single comments field

- Merge steeringComments and comments into unified comments field in Task type
- Update TaskStore to use single comments array instead of separate steeringComments
- Add database migration to convert existing steeringComments to comments
- Update executor to inject all comments into AI execution context
- Update dashboard SteeringTab to use unified comments API
- Update CLI task steer command to use comments field
- Update PR comment handler to add comments via unified API
This commit is contained in:
gsxdsm
2026-04-01 07:05:23 -07:00
parent 8f00302fb6
commit 02a30a9e96
22 changed files with 294 additions and 260 deletions

View File

@@ -71,7 +71,7 @@ function createMockStore(overrides: Partial<TaskStore> = {}): TaskStore {
getGlobalSettingsStore: vi.fn().mockReturnValue(createMockGlobalSettingsStore()),
logEntry: vi.fn().mockResolvedValue(undefined),
getAgentLogs: vi.fn().mockResolvedValue([]),
addSteeringComment: vi.fn(),
addComment: vi.fn(),
addTaskComment: vi.fn(),
updateTaskComment: vi.fn(),
deleteTaskComment: vi.fn(),
@@ -1858,7 +1858,7 @@ describe("Pause/Unpause endpoints", () => {
it("adds a steering comment to a task", async () => {
const mockComment = {
id: "FN-001",
steeringComments: [
comments: [
{
id: "1234567890-abc123",
text: "Please handle the edge case",
@@ -1867,7 +1867,7 @@ describe("Pause/Unpause endpoints", () => {
},
],
};
(store.addSteeringComment as ReturnType<typeof vi.fn>).mockResolvedValue(mockComment);
(store.addComment as ReturnType<typeof vi.fn>).mockResolvedValue(mockComment);
const res = await REQUEST(
buildApp(),
@@ -1879,7 +1879,7 @@ describe("Pause/Unpause endpoints", () => {
expect(res.status).toBe(200);
expect(res.body).toEqual(mockComment);
expect(store.addSteeringComment).toHaveBeenCalledWith(
expect(store.addComment).toHaveBeenCalledWith(
"KB-001",
"Please handle the edge case",
"user"
@@ -1926,7 +1926,7 @@ describe("Pause/Unpause endpoints", () => {
it("returns 404 when task not found", async () => {
const error = new Error("Task not found") as Error & { code?: string };
error.code = "ENOENT";
(store.addSteeringComment as ReturnType<typeof vi.fn>).mockRejectedValue(error);
(store.addComment as ReturnType<typeof vi.fn>).mockRejectedValue(error);
const res = await REQUEST(
buildApp(),
@@ -1940,7 +1940,7 @@ describe("Pause/Unpause endpoints", () => {
});
it("returns 500 on unexpected errors", async () => {
(store.addSteeringComment as ReturnType<typeof vi.fn>).mockRejectedValue(
(store.addComment as ReturnType<typeof vi.fn>).mockRejectedValue(
new Error("Database error")
);

View File

@@ -2114,7 +2114,7 @@ export function createApiRoutes(store: TaskStore, options?: ServerOptions): Rout
res.status(400).json({ error: "text must be between 1 and 2000 characters" });
return;
}
const task = await store.addSteeringComment(req.params.id, text, "user");
const task = await store.addComment(req.params.id, text, "user");
res.json(task);
} catch (err: any) {
const status = err.code === "ENOENT" ? 404 : 500;