feat(KB-057): complete Step 0 and 1 — backend API and frontend client for interactive terminal

This commit is contained in:
gsxdsm
2026-03-29 20:48:39 -07:00
parent d288e158d5
commit 1d2706351b
9 changed files with 690 additions and 62 deletions

View File

@@ -346,6 +346,11 @@ export class TaskStore extends EventEmitter<TaskStoreEvents> {
const dir = this.taskDir(id);
const task = await this.readTaskJson(dir);
// Initialize log array if missing (for legacy tasks)
if (!task.log) {
task.log = [];
}
if (updates.title !== undefined) task.title = updates.title;
if (updates.description !== undefined) task.description = updates.description;
if (updates.worktree !== undefined) task.worktree = updates.worktree;
@@ -431,6 +436,11 @@ export class TaskStore extends EventEmitter<TaskStoreEvents> {
const dir = this.taskDir(id);
const task = await this.readTaskJson(dir);
// Initialize log array if missing (for legacy tasks)
if (!task.log) {
task.log = [];
}
task.paused = paused || undefined;
// When pausing an in-progress task, set status so the UI can show the state.
// When unpausing, clear the "paused" status.
@@ -469,6 +479,11 @@ export class TaskStore extends EventEmitter<TaskStoreEvents> {
task.steps = await this.parseStepsFromPrompt(id);
}
// Initialize log array if missing (for legacy tasks)
if (!task.log) {
task.log = [];
}
if (stepIndex < 0 || stepIndex >= task.steps.length) {
throw new Error(
`Step ${stepIndex} out of range (task has ${task.steps.length} steps)`,
@@ -512,6 +527,11 @@ export class TaskStore extends EventEmitter<TaskStoreEvents> {
const dir = this.taskDir(id);
const task = await this.readTaskJson(dir);
// Initialize log array if missing (for legacy tasks)
if (!task.log) {
task.log = [];
}
task.log.push({
timestamp: new Date().toISOString(),
action,
@@ -751,6 +771,11 @@ export class TaskStore extends EventEmitter<TaskStoreEvents> {
const dir = this.taskDir(id);
const task = await this.readTaskJson(dir);
// Initialize log array if missing (for legacy tasks)
if (!task.log) {
task.log = [];
}
if (task.column !== "done") {
throw new Error(
`Cannot archive ${id}: task is in '${task.column}', must be in 'done'`,
@@ -784,6 +809,11 @@ export class TaskStore extends EventEmitter<TaskStoreEvents> {
const dir = this.taskDir(id);
const task = await this.readTaskJson(dir);
// Initialize log array if missing (for legacy tasks)
if (!task.log) {
task.log = [];
}
if (task.column !== "archived") {
throw new Error(
`Cannot unarchive ${id}: task is in '${task.column}', must be in 'archived'`,
@@ -1126,6 +1156,11 @@ export class TaskStore extends EventEmitter<TaskStoreEvents> {
const dir = this.taskDir(id);
const task = await this.readTaskJson(dir);
// Initialize log array if missing (for legacy tasks)
if (!task.log) {
task.log = [];
}
// Generate unique ID: timestamp + random suffix for collision resistance
const commentId = `${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;