feat(KB-635): integrate mission workflows across CLI, extension, and engine

- Add mission CLI commands and pi extension tools for creating missions, milestones, slices, features, and task links
- Extend core mission storage and schema migrations with auto-advance support, task slice linkage, and comment normalization coverage
- Wire mission-aware scheduler and executor behavior so linked features progress with task execution and completed slices can auto-activate follow-on work
- Add regression tests for mission CLI parsing, extension behaviors, scheduler mission semantics, and executor integration
This commit is contained in:
gsxdsm
2026-04-01 13:45:56 -07:00
parent 79a711a8a2
commit 27d2f25b42
13 changed files with 984 additions and 229 deletions

View File

@@ -255,6 +255,7 @@ CREATE TABLE IF NOT EXISTS missions (
description TEXT,
status TEXT NOT NULL,
interviewState TEXT NOT NULL,
autoAdvance INTEGER DEFAULT 0,
createdAt TEXT NOT NULL,
updatedAt TEXT NOT NULL
);
@@ -395,6 +396,7 @@ export class Database {
if (version < 5) {
this.applyMigration(5, () => {
this.addColumnIfMissing("missions", "autoAdvance", "INTEGER DEFAULT 0");
this.migrateLegacyCommentsToUnifiedComments();
});
}

View File

@@ -93,6 +93,7 @@ export class MissionStore extends EventEmitter<MissionStoreEvents> {
description: row.description || undefined,
status: row.status as MissionStatus,
interviewState: row.interviewState as InterviewState,
autoAdvance: Boolean(row.autoAdvance),
createdAt: row.createdAt,
updatedAt: row.updatedAt,
};
@@ -169,19 +170,21 @@ export class MissionStore extends EventEmitter<MissionStoreEvents> {
description: input.description,
status: "planning",
interviewState: "not_started",
autoAdvance: false,
createdAt: now,
updatedAt: now,
};
this.db.prepare(`
INSERT INTO missions (id, title, description, status, interviewState, createdAt, updatedAt)
VALUES (?, ?, ?, ?, ?, ?, ?)
INSERT INTO missions (id, title, description, status, interviewState, autoAdvance, createdAt, updatedAt)
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
`).run(
mission.id,
mission.title,
mission.description ?? null,
mission.status,
mission.interviewState,
mission.autoAdvance ? 1 : 0,
mission.createdAt,
mission.updatedAt,
);
@@ -270,6 +273,7 @@ export class MissionStore extends EventEmitter<MissionStoreEvents> {
description = ?,
status = ?,
interviewState = ?,
autoAdvance = ?,
updatedAt = ?
WHERE id = ?
`).run(
@@ -277,6 +281,7 @@ export class MissionStore extends EventEmitter<MissionStoreEvents> {
updated.description ?? null,
updated.status,
updated.interviewState,
updated.autoAdvance ? 1 : 0,
updated.updatedAt,
updated.id,
);