@agent-plan/core 0.2.22 → 0.2.23-next.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/display-status.d.ts +3 -5
- package/dist/display-status.d.ts.map +1 -1
- package/dist/display-status.js +5 -14
- package/dist/handoff-context.d.ts +60 -0
- package/dist/handoff-context.d.ts.map +1 -0
- package/dist/handoff-context.js +150 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/plan-store.d.ts +49 -9
- package/dist/plan-store.d.ts.map +1 -1
- package/dist/plan-store.js +376 -71
- package/dist/planner-rules.d.ts +21 -0
- package/dist/planner-rules.d.ts.map +1 -0
- package/dist/planner-rules.js +58 -0
- package/dist/read-tracking.d.ts +86 -0
- package/dist/read-tracking.d.ts.map +1 -0
- package/dist/read-tracking.js +192 -0
- package/dist/recap.d.ts.map +1 -1
- package/dist/recap.js +30 -24
- package/dist/schema.d.ts +551 -227
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +18 -6
- package/dist/task-selection.d.ts +38 -1
- package/dist/task-selection.d.ts.map +1 -1
- package/dist/task-selection.js +49 -11
- package/dist/task-start-outcome.d.ts +23 -0
- package/dist/task-start-outcome.d.ts.map +1 -0
- package/dist/task-start-outcome.js +23 -0
- package/package.json +1 -1
package/dist/display-status.d.ts
CHANGED
|
@@ -14,15 +14,15 @@
|
|
|
14
14
|
*
|
|
15
15
|
* These are NEVER persisted: they are computed on demand from children's
|
|
16
16
|
* canonical workflow statuses. The canonical workflow model
|
|
17
|
-
* (`planned | in-progress |
|
|
18
|
-
* canceled | rejected`)
|
|
17
|
+
* (`planned | in-progress | waiting | blocked | deferred | done |
|
|
18
|
+
* canceled | rejected`) represents paused leaf work as a startable status plus a durable checkpoint.
|
|
19
19
|
*/
|
|
20
20
|
import type { TaskStatus, PhaseStatus } from "./schema.js";
|
|
21
21
|
/**
|
|
22
22
|
* Canonical workflow status values used by tasks, phases, and features.
|
|
23
23
|
* Mirrors the union of TaskStatus and PhaseStatus used in the planner data.
|
|
24
24
|
*/
|
|
25
|
-
export type WorkflowStatus = "planned" | "in-progress" | "
|
|
25
|
+
export type WorkflowStatus = "planned" | "in-progress" | "waiting" | "blocked" | "deferred" | "done" | "canceled" | "rejected";
|
|
26
26
|
/**
|
|
27
27
|
* Display status adds parent-only presentation states on top of workflow
|
|
28
28
|
* statuses. Only parent entities (feature, phase) use the full union; leaf
|
|
@@ -33,7 +33,6 @@ export type DisplayStatus = WorkflowStatus | "started" | "closed";
|
|
|
33
33
|
export interface StatusBreakdown {
|
|
34
34
|
planned: number;
|
|
35
35
|
inProgress: number;
|
|
36
|
-
paused: number;
|
|
37
36
|
waiting: number;
|
|
38
37
|
blocked: number;
|
|
39
38
|
deferred: number;
|
|
@@ -68,7 +67,6 @@ export declare function countBreakdown(statuses: readonly WorkflowStatus[]): Sta
|
|
|
68
67
|
* - all `rejected` → `rejected`
|
|
69
68
|
* - otherwise → `closed` (mixed terminal outcomes)
|
|
70
69
|
* 3. Compute `unfinished = meaningful ∩ OPEN`.
|
|
71
|
-
* - homogeneous `paused` → `paused`
|
|
72
70
|
* - homogeneous `waiting` → `waiting`
|
|
73
71
|
* - homogeneous `blocked` → `blocked`
|
|
74
72
|
* - homogeneous `deferred` → `deferred`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"display-status.d.ts","sourceRoot":"","sources":["../src/display-status.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE3D;;;GAGG;AACH,MAAM,MAAM,cAAc,GACtB,SAAS,GACT,aAAa,GACb,
|
|
1
|
+
{"version":3,"file":"display-status.d.ts","sourceRoot":"","sources":["../src/display-status.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE3D;;;GAGG;AACH,MAAM,MAAM,cAAc,GACtB,SAAS,GACT,aAAa,GACb,SAAS,GACT,SAAS,GACT,UAAU,GACV,MAAM,GACN,UAAU,GACV,UAAU,CAAC;AAEf;;;;GAIG;AACH,MAAM,MAAM,aAAa,GAAG,cAAc,GAAG,SAAS,GAAG,QAAQ,CAAC;AAElE,+CAA+C;AAC/C,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,yDAAyD;AACzD,MAAM,WAAW,aAAa;IAC5B,uDAAuD;IACvD,aAAa,EAAE,aAAa,CAAC;IAC7B,wDAAwD;IACxD,SAAS,EAAE,eAAe,CAAC;IAC3B;+CAC2C;IAC3C,UAAU,EAAE,OAAO,CAAC;IACpB,8DAA8D;IAC9D,aAAa,EAAE,MAAM,CAAC;IACtB,8DAA8D;IAC9D,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAMD,iFAAiF;AACjF,wBAAgB,cAAc,CAAC,QAAQ,EAAE,SAAS,cAAc,EAAE,GAAG,eAAe,CAkBnF;AAMD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,mBAAmB,CAAC,aAAa,EAAE,SAAS,cAAc,EAAE,GAAG,aAAa,CAiE3F;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAcrE;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,UAAU,GAAG,WAAW,GAAG,cAAc,CAIpF"}
|
package/dist/display-status.js
CHANGED
|
@@ -14,16 +14,16 @@
|
|
|
14
14
|
*
|
|
15
15
|
* These are NEVER persisted: they are computed on demand from children's
|
|
16
16
|
* canonical workflow statuses. The canonical workflow model
|
|
17
|
-
* (`planned | in-progress |
|
|
18
|
-
* canceled | rejected`)
|
|
17
|
+
* (`planned | in-progress | waiting | blocked | deferred | done |
|
|
18
|
+
* canceled | rejected`) represents paused leaf work as a startable status plus a durable checkpoint.
|
|
19
19
|
*/
|
|
20
20
|
const ACTIVE = new Set(["in-progress"]);
|
|
21
|
-
const OPEN = new Set(["planned", "
|
|
21
|
+
const OPEN = new Set(["planned", "waiting", "blocked", "deferred"]);
|
|
22
22
|
const TERMINAL = new Set(["done", "canceled", "rejected"]);
|
|
23
23
|
/** Count children per canonical workflow status. Pure; does not mutate input. */
|
|
24
24
|
export function countBreakdown(statuses) {
|
|
25
25
|
const breakdown = {
|
|
26
|
-
planned: 0, inProgress: 0,
|
|
26
|
+
planned: 0, inProgress: 0, waiting: 0, blocked: 0,
|
|
27
27
|
deferred: 0, done: 0, canceled: 0, rejected: 0,
|
|
28
28
|
};
|
|
29
29
|
for (const s of statuses) {
|
|
@@ -34,9 +34,6 @@ export function countBreakdown(statuses) {
|
|
|
34
34
|
case "in-progress":
|
|
35
35
|
breakdown.inProgress++;
|
|
36
36
|
break;
|
|
37
|
-
case "paused":
|
|
38
|
-
breakdown.paused++;
|
|
39
|
-
break;
|
|
40
37
|
case "waiting":
|
|
41
38
|
breakdown.waiting++;
|
|
42
39
|
break;
|
|
@@ -60,7 +57,7 @@ export function countBreakdown(statuses) {
|
|
|
60
57
|
return breakdown;
|
|
61
58
|
}
|
|
62
59
|
function emptyBreakdown() {
|
|
63
|
-
return { planned: 0, inProgress: 0,
|
|
60
|
+
return { planned: 0, inProgress: 0, waiting: 0, blocked: 0, deferred: 0, done: 0, canceled: 0, rejected: 0 };
|
|
64
61
|
}
|
|
65
62
|
/**
|
|
66
63
|
* Derive the parent display snapshot from its children's canonical statuses.
|
|
@@ -73,7 +70,6 @@ function emptyBreakdown() {
|
|
|
73
70
|
* - all `rejected` → `rejected`
|
|
74
71
|
* - otherwise → `closed` (mixed terminal outcomes)
|
|
75
72
|
* 3. Compute `unfinished = meaningful ∩ OPEN`.
|
|
76
|
-
* - homogeneous `paused` → `paused`
|
|
77
73
|
* - homogeneous `waiting` → `waiting`
|
|
78
74
|
* - homogeneous `blocked` → `blocked`
|
|
79
75
|
* - homogeneous `deferred` → `deferred`
|
|
@@ -125,10 +121,6 @@ export function deriveParentDisplay(childStatuses) {
|
|
|
125
121
|
}
|
|
126
122
|
// 3. Unfinished meaningful remainder.
|
|
127
123
|
const unfinished = meaningful.filter((s) => OPEN.has(s));
|
|
128
|
-
const allPaused = unfinished.length > 0 && unfinished.every((s) => s === "paused");
|
|
129
|
-
if (allPaused) {
|
|
130
|
-
return { displayStatus: "paused", breakdown, hasStarted, totalChildren, meaningfulChildren };
|
|
131
|
-
}
|
|
132
124
|
const allWaiting = unfinished.length > 0 && unfinished.every((s) => s === "waiting");
|
|
133
125
|
if (allWaiting) {
|
|
134
126
|
return { displayStatus: "waiting", breakdown, hasStarted, totalChildren, meaningfulChildren };
|
|
@@ -158,7 +150,6 @@ export function toWorkflowStatus(value) {
|
|
|
158
150
|
switch (value) {
|
|
159
151
|
case "planned":
|
|
160
152
|
case "in-progress":
|
|
161
|
-
case "paused":
|
|
162
153
|
case "waiting":
|
|
163
154
|
case "blocked":
|
|
164
155
|
case "deferred":
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import type { Feature, Phase, Task } from "./schema.js";
|
|
2
|
+
export declare const COMPLETION_SUMMARY_HEADING = "**Completion summary:**";
|
|
3
|
+
export interface HandoffTaskContextUpdate {
|
|
4
|
+
taskId: string;
|
|
5
|
+
completionSummary: string;
|
|
6
|
+
verification: string;
|
|
7
|
+
remainingWork: string;
|
|
8
|
+
filesTouched?: string[];
|
|
9
|
+
decisions?: string[];
|
|
10
|
+
}
|
|
11
|
+
export interface HandoffPhaseContextUpdate {
|
|
12
|
+
progressSummary: string;
|
|
13
|
+
remainingWork: string;
|
|
14
|
+
decisions?: string[];
|
|
15
|
+
}
|
|
16
|
+
export interface HandoffFeatureContextUpdate {
|
|
17
|
+
workDone: string;
|
|
18
|
+
workRemaining: string;
|
|
19
|
+
}
|
|
20
|
+
export interface PhaseHandoffContextSync {
|
|
21
|
+
taskUpdates: HandoffTaskContextUpdate[];
|
|
22
|
+
phaseUpdate?: HandoffPhaseContextUpdate;
|
|
23
|
+
phaseNoUpdateReason?: string;
|
|
24
|
+
featureUpdate?: HandoffFeatureContextUpdate;
|
|
25
|
+
featureNoUpdateReason?: string;
|
|
26
|
+
}
|
|
27
|
+
export interface PhaseHandoffAudit {
|
|
28
|
+
phaseId: string;
|
|
29
|
+
featureId: string;
|
|
30
|
+
handoff: string;
|
|
31
|
+
handoffUpdatedAt: string;
|
|
32
|
+
missingCompletionTaskIds: string[];
|
|
33
|
+
missingCompletionTasks: Array<{
|
|
34
|
+
id: string;
|
|
35
|
+
number: number;
|
|
36
|
+
title: string;
|
|
37
|
+
}>;
|
|
38
|
+
}
|
|
39
|
+
export interface RefreshPhaseHandoffInput {
|
|
40
|
+
content: string;
|
|
41
|
+
expectedHandoffUpdatedAt: string;
|
|
42
|
+
reconciledExistingHandoff: boolean;
|
|
43
|
+
contextSync: PhaseHandoffContextSync;
|
|
44
|
+
}
|
|
45
|
+
export interface RefreshPhaseHandoffResult {
|
|
46
|
+
phase: Phase;
|
|
47
|
+
feature: Feature;
|
|
48
|
+
updatedTaskIds: string[];
|
|
49
|
+
handoffUpdatedAt: string;
|
|
50
|
+
}
|
|
51
|
+
export declare function hasTaskCompletionEvidence(task: Task): boolean;
|
|
52
|
+
export declare function auditPhaseHandoff(phase: Phase, feature: Feature): PhaseHandoffAudit;
|
|
53
|
+
export declare function validateCanonicalHandoffContent(content: string): void;
|
|
54
|
+
export declare function validateHandoffContextSync(phase: Phase, feature: Feature, input: RefreshPhaseHandoffInput): void;
|
|
55
|
+
export declare function applyHandoffContextSync(phase: Phase, feature: Feature, input: RefreshPhaseHandoffInput, timestamp: string): {
|
|
56
|
+
phase: Phase;
|
|
57
|
+
feature: Feature;
|
|
58
|
+
updatedTaskIds: string[];
|
|
59
|
+
};
|
|
60
|
+
//# sourceMappingURL=handoff-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handoff-context.d.ts","sourceRoot":"","sources":["../src/handoff-context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAExD,eAAO,MAAM,0BAA0B,4BAA4B,CAAC;AAEpE,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,iBAAiB,EAAE,MAAM,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,yBAAyB;IACxC,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,uBAAuB;IACtC,WAAW,EAAE,wBAAwB,EAAE,CAAC;IACxC,WAAW,CAAC,EAAE,yBAAyB,CAAC;IACxC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,aAAa,CAAC,EAAE,2BAA2B,CAAC;IAC5C,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,MAAM,CAAC;IACzB,wBAAwB,EAAE,MAAM,EAAE,CAAC;IACnC,sBAAsB,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC9E;AAED,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,wBAAwB,EAAE,MAAM,CAAC;IACjC,yBAAyB,EAAE,OAAO,CAAC;IACnC,WAAW,EAAE,uBAAuB,CAAC;CACtC;AAED,MAAM,WAAW,yBAAyB;IACxC,KAAK,EAAE,KAAK,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAI7D;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,GAAG,iBAAiB,CAYnF;AAkBD,wBAAgB,+BAA+B,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAgBrE;AAED,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,wBAAwB,GAC9B,IAAI,CA4CN;AAED,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,wBAAwB,EAC/B,SAAS,EAAE,MAAM,GAChB;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,cAAc,EAAE,MAAM,EAAE,CAAA;CAAE,CAqD9D"}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
export const COMPLETION_SUMMARY_HEADING = "**Completion summary:**";
|
|
2
|
+
export function hasTaskCompletionEvidence(task) {
|
|
3
|
+
if (task.status !== "done")
|
|
4
|
+
return true;
|
|
5
|
+
if (task.description.includes(COMPLETION_SUMMARY_HEADING))
|
|
6
|
+
return true;
|
|
7
|
+
return task.statusLog.some((entry) => entry.toStatus === "done" && entry.description.trim().length > 0);
|
|
8
|
+
}
|
|
9
|
+
export function auditPhaseHandoff(phase, feature) {
|
|
10
|
+
const missingCompletionTasks = phase.tasks
|
|
11
|
+
.filter((task) => task.status === "done" && !hasTaskCompletionEvidence(task))
|
|
12
|
+
.map((task) => ({ id: task.id, number: task.number, title: task.title }));
|
|
13
|
+
return {
|
|
14
|
+
phaseId: phase.id,
|
|
15
|
+
featureId: feature.id,
|
|
16
|
+
handoff: phase.handoff,
|
|
17
|
+
handoffUpdatedAt: phase.handoffUpdatedAt,
|
|
18
|
+
missingCompletionTaskIds: missingCompletionTasks.map((task) => task.id),
|
|
19
|
+
missingCompletionTasks,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
function nonEmpty(value, field) {
|
|
23
|
+
const normalized = value?.trim() ?? "";
|
|
24
|
+
if (!normalized)
|
|
25
|
+
throw new Error(`${field} is required.`);
|
|
26
|
+
return normalized;
|
|
27
|
+
}
|
|
28
|
+
function uniqueStrings(values) {
|
|
29
|
+
return [...new Set(values.map((value) => value.trim()).filter(Boolean))];
|
|
30
|
+
}
|
|
31
|
+
function appendSection(existing, section) {
|
|
32
|
+
const normalized = section.trim();
|
|
33
|
+
if (!normalized || existing.includes(normalized))
|
|
34
|
+
return existing;
|
|
35
|
+
return existing.trim() ? `${existing.trim()}\n\n---\n${normalized}` : normalized;
|
|
36
|
+
}
|
|
37
|
+
export function validateCanonicalHandoffContent(content) {
|
|
38
|
+
const body = nonEmpty(content, "Handoff content");
|
|
39
|
+
const required = [
|
|
40
|
+
{ label: "Created at", pattern: /^Created at:\s*\S+/im },
|
|
41
|
+
{ label: "Updated at", pattern: /^Updated at:\s*\S+/im },
|
|
42
|
+
{ label: "Reason", pattern: /^Reason:\s*\S+/im },
|
|
43
|
+
{ label: "Current focus", pattern: /^##\s+Current focus\s*$/im },
|
|
44
|
+
{ label: "What was being done", pattern: /^##\s+What was being done\s*$/im },
|
|
45
|
+
{ label: "How to resume", pattern: /^##\s+How to resume\s*$/im },
|
|
46
|
+
{ label: "Files touched", pattern: /^##\s+Files touched\s*$/im },
|
|
47
|
+
{ label: "Blockers", pattern: /^##\s+Blockers\s*$/im },
|
|
48
|
+
{ label: "Next steps", pattern: /^##\s+Next steps\s*$/im },
|
|
49
|
+
{ label: "Recent decisions", pattern: /^##\s+Recent decisions\s*$/im },
|
|
50
|
+
];
|
|
51
|
+
const missing = required.filter((entry) => !entry.pattern.test(body)).map((entry) => entry.label);
|
|
52
|
+
if (missing.length > 0)
|
|
53
|
+
throw new Error(`Canonical handoff is missing required sections: ${missing.join(", ")}.`);
|
|
54
|
+
}
|
|
55
|
+
export function validateHandoffContextSync(phase, feature, input) {
|
|
56
|
+
validateCanonicalHandoffContent(input.content);
|
|
57
|
+
if (phase.status === "done" || phase.status === "canceled") {
|
|
58
|
+
throw new Error(`Cannot write a handoff on ${phase.status} phase ${phase.id}; completed phases have no pending handoff.`);
|
|
59
|
+
}
|
|
60
|
+
if (phase.handoffUpdatedAt !== input.expectedHandoffUpdatedAt) {
|
|
61
|
+
throw new Error("Handoff changed after preparation. Run handoff_prepare again and reconcile the latest content before writing.");
|
|
62
|
+
}
|
|
63
|
+
if (phase.handoff.trim() && !input.reconciledExistingHandoff) {
|
|
64
|
+
throw new Error("An active handoff already exists. Reconcile its still-relevant content and set reconciledExistingHandoff=true.");
|
|
65
|
+
}
|
|
66
|
+
const sync = input.contextSync;
|
|
67
|
+
const taskIds = sync.taskUpdates.map((update) => nonEmpty(update.taskId, "Task update taskId"));
|
|
68
|
+
if (new Set(taskIds).size !== taskIds.length)
|
|
69
|
+
throw new Error("Each task may appear only once in handoff context updates.");
|
|
70
|
+
const phaseTaskIds = new Set(phase.tasks.map((task) => task.id));
|
|
71
|
+
for (const taskId of taskIds) {
|
|
72
|
+
if (!phaseTaskIds.has(taskId))
|
|
73
|
+
throw new Error(`Task ${taskId} does not belong to phase ${phase.id}.`);
|
|
74
|
+
}
|
|
75
|
+
for (const update of sync.taskUpdates) {
|
|
76
|
+
nonEmpty(update.completionSummary, `Task ${update.taskId} completionSummary`);
|
|
77
|
+
nonEmpty(update.verification, `Task ${update.taskId} verification`);
|
|
78
|
+
nonEmpty(update.remainingWork, `Task ${update.taskId} remainingWork`);
|
|
79
|
+
}
|
|
80
|
+
const audit = auditPhaseHandoff(phase, feature);
|
|
81
|
+
const covered = new Set(taskIds);
|
|
82
|
+
const uncovered = audit.missingCompletionTaskIds.filter((taskId) => !covered.has(taskId));
|
|
83
|
+
if (uncovered.length > 0) {
|
|
84
|
+
throw new Error(`Done tasks are missing durable completion evidence: ${uncovered.join(", ")}. Include context updates for every listed task.`);
|
|
85
|
+
}
|
|
86
|
+
if (sync.phaseUpdate) {
|
|
87
|
+
nonEmpty(sync.phaseUpdate.progressSummary, "Phase progressSummary");
|
|
88
|
+
nonEmpty(sync.phaseUpdate.remainingWork, "Phase remainingWork");
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
nonEmpty(sync.phaseNoUpdateReason, "phaseNoUpdateReason");
|
|
92
|
+
}
|
|
93
|
+
if (sync.featureUpdate) {
|
|
94
|
+
nonEmpty(sync.featureUpdate.workDone, "Feature workDone");
|
|
95
|
+
nonEmpty(sync.featureUpdate.workRemaining, "Feature workRemaining");
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
nonEmpty(sync.featureNoUpdateReason, "featureNoUpdateReason");
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
export function applyHandoffContextSync(phase, feature, input, timestamp) {
|
|
102
|
+
validateHandoffContextSync(phase, feature, input);
|
|
103
|
+
const nextPhase = structuredClone(phase);
|
|
104
|
+
const nextFeature = structuredClone(feature);
|
|
105
|
+
const updatedTaskIds = [];
|
|
106
|
+
for (const update of input.contextSync.taskUpdates) {
|
|
107
|
+
const task = nextPhase.tasks.find((candidate) => candidate.id === update.taskId);
|
|
108
|
+
const files = uniqueStrings(update.filesTouched ?? []);
|
|
109
|
+
const decisions = uniqueStrings(update.decisions ?? []);
|
|
110
|
+
const section = [
|
|
111
|
+
COMPLETION_SUMMARY_HEADING,
|
|
112
|
+
update.completionSummary.trim(),
|
|
113
|
+
"",
|
|
114
|
+
"**Verification:**",
|
|
115
|
+
update.verification.trim(),
|
|
116
|
+
"",
|
|
117
|
+
"**Remaining or unverified:**",
|
|
118
|
+
update.remainingWork.trim(),
|
|
119
|
+
...(files.length > 0 ? ["", "**Files touched:**", ...files.map((file) => `- ${file}`)] : []),
|
|
120
|
+
].join("\n");
|
|
121
|
+
task.description = appendSection(task.description, section);
|
|
122
|
+
task.descriptionUpdatedAt = timestamp;
|
|
123
|
+
task.decisions = uniqueStrings([...(task.decisions ?? []), ...decisions]);
|
|
124
|
+
task.updatedAt = timestamp;
|
|
125
|
+
updatedTaskIds.push(task.id);
|
|
126
|
+
}
|
|
127
|
+
const phaseUpdate = input.contextSync.phaseUpdate;
|
|
128
|
+
if (phaseUpdate) {
|
|
129
|
+
const section = [
|
|
130
|
+
"**Handoff context update:**",
|
|
131
|
+
phaseUpdate.progressSummary.trim(),
|
|
132
|
+
"",
|
|
133
|
+
"**Remaining work:**",
|
|
134
|
+
phaseUpdate.remainingWork.trim(),
|
|
135
|
+
].join("\n");
|
|
136
|
+
nextPhase.notes = appendSection(nextPhase.notes, section);
|
|
137
|
+
nextPhase.decisions = uniqueStrings([...(nextPhase.decisions ?? []), ...(phaseUpdate.decisions ?? [])]);
|
|
138
|
+
}
|
|
139
|
+
const featureUpdate = input.contextSync.featureUpdate;
|
|
140
|
+
if (featureUpdate) {
|
|
141
|
+
nextFeature.workDone = appendSection(nextFeature.workDone, featureUpdate.workDone);
|
|
142
|
+
nextFeature.workRemaining = appendSection(nextFeature.workRemaining, featureUpdate.workRemaining);
|
|
143
|
+
}
|
|
144
|
+
nextPhase.handoff = input.content.trim();
|
|
145
|
+
nextPhase.handoffUpdatedAt = timestamp;
|
|
146
|
+
nextPhase.handoffReadAt = "";
|
|
147
|
+
nextPhase.updatedAt = timestamp;
|
|
148
|
+
nextFeature.updatedAt = timestamp;
|
|
149
|
+
return { phase: nextPhase, feature: nextFeature, updatedTaskIds };
|
|
150
|
+
}
|
package/dist/index.d.ts
CHANGED
|
@@ -3,9 +3,13 @@ export * from "./refs.js";
|
|
|
3
3
|
export * from "./schema.js";
|
|
4
4
|
export * from "./checklist.js";
|
|
5
5
|
export * from "./recap.js";
|
|
6
|
+
export * from "./planner-rules.js";
|
|
6
7
|
export * from "./display-status.js";
|
|
7
8
|
export * from "./task-context.js";
|
|
8
9
|
export * from "./task-selection.js";
|
|
10
|
+
export * from "./task-start-outcome.js";
|
|
11
|
+
export * from "./read-tracking.js";
|
|
12
|
+
export * from "./handoff-context.js";
|
|
9
13
|
export * from "./package-version.js";
|
|
10
14
|
export { PlanStore, PlanStoreError, setWriteBusyHook, setWriteNotifyHook, migrateToUuids, migrateToGlobalSequence, withFeatureLock, type PhaseHandoffSummary, type OrphanPhaseSummary } from "./plan-store.js";
|
|
11
15
|
export { PlanRenderer } from "./renderer.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,cAAc,EAAE,uBAAuB,EAAE,eAAe,EAAE,KAAK,mBAAmB,EAAE,KAAK,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAC/M,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,YAAY,EAAE,eAAe,EAAE,WAAW,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,yBAAyB,CAAC;AACxC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,cAAc,EAAE,uBAAuB,EAAE,eAAe,EAAE,KAAK,mBAAmB,EAAE,KAAK,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAC/M,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,YAAY,EAAE,eAAe,EAAE,WAAW,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -3,9 +3,13 @@ export * from "./refs.js";
|
|
|
3
3
|
export * from "./schema.js";
|
|
4
4
|
export * from "./checklist.js";
|
|
5
5
|
export * from "./recap.js";
|
|
6
|
+
export * from "./planner-rules.js";
|
|
6
7
|
export * from "./display-status.js";
|
|
7
8
|
export * from "./task-context.js";
|
|
8
9
|
export * from "./task-selection.js";
|
|
10
|
+
export * from "./task-start-outcome.js";
|
|
11
|
+
export * from "./read-tracking.js";
|
|
12
|
+
export * from "./handoff-context.js";
|
|
9
13
|
export * from "./package-version.js";
|
|
10
14
|
export { PlanStore, PlanStoreError, setWriteBusyHook, setWriteNotifyHook, migrateToUuids, migrateToGlobalSequence, withFeatureLock } from "./plan-store.js";
|
|
11
15
|
export { PlanRenderer } from "./renderer.js";
|
package/dist/plan-store.d.ts
CHANGED
|
@@ -1,6 +1,21 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { type Feature, type FeaturesDocument, type Manifest, type Phase, type Task, type TaskPauseSnapshot, type PlanWorkspace, type Project, type RequirementsDocument, type Requirement, type ActivityEntry, type ActivityLog, type CodebaseProfile, type ResumeFocus, type WorkDeviation } from "./schema.js";
|
|
3
3
|
import { type ParentDisplay } from "./display-status.js";
|
|
4
|
+
import { type PhaseHandoffAudit, type RefreshPhaseHandoffInput, type RefreshPhaseHandoffResult } from "./handoff-context.js";
|
|
5
|
+
export interface RecordContextReadInput {
|
|
6
|
+
sessionId: string;
|
|
7
|
+
phaseId: string;
|
|
8
|
+
taskId: string;
|
|
9
|
+
featureId?: string;
|
|
10
|
+
requirementIds?: string[];
|
|
11
|
+
createdAt?: string;
|
|
12
|
+
}
|
|
13
|
+
export interface RecordContextReadResult {
|
|
14
|
+
phase: Phase;
|
|
15
|
+
feature?: Feature;
|
|
16
|
+
requirements: Requirement[];
|
|
17
|
+
createdAt: string;
|
|
18
|
+
}
|
|
4
19
|
export interface PlanStoreErrorDetails {
|
|
5
20
|
path?: string;
|
|
6
21
|
operation?: string;
|
|
@@ -117,6 +132,8 @@ export declare class PlanStore {
|
|
|
117
132
|
runBatch<T>(fn: () => Promise<T>): Promise<T>;
|
|
118
133
|
private maybeAutoSync;
|
|
119
134
|
private normalizeTasks;
|
|
135
|
+
private isTerminalTaskStatus;
|
|
136
|
+
private pruneObsoleteWorkDeviations;
|
|
120
137
|
/** Stamp description edits independently from generic entity mutations.
|
|
121
138
|
* Legacy entities cannot reveal their historical description-edit time, so
|
|
122
139
|
* their creation time is the earliest truthful fallback. */
|
|
@@ -157,6 +174,11 @@ export declare class PlanStore {
|
|
|
157
174
|
private resumePath;
|
|
158
175
|
private activityPath;
|
|
159
176
|
private localRoot;
|
|
177
|
+
private deviationsPath;
|
|
178
|
+
/** Runtime work deviations, persisted in worktree-local `.local/deviations.json`
|
|
179
|
+
* (never in shared `project.json`). Falls back to `[]` on a missing/corrupt file. */
|
|
180
|
+
private loadWorkDeviations;
|
|
181
|
+
private saveWorkDeviations;
|
|
160
182
|
private timestampPath;
|
|
161
183
|
private backupsDir;
|
|
162
184
|
private tmpDir;
|
|
@@ -168,6 +190,13 @@ export declare class PlanStore {
|
|
|
168
190
|
private migrateLegacyGeneratedDir;
|
|
169
191
|
private migrateLegacyHandoffArchive;
|
|
170
192
|
init(projectName: string): Promise<void>;
|
|
193
|
+
/**
|
|
194
|
+
* Planner extension rules — the agent-behavior contract for every project
|
|
195
|
+
* using the extension. Loaded from the static .planner/rules.json if present,
|
|
196
|
+
* otherwise the canonical code set. Static (no timestamps), safe across
|
|
197
|
+
* worktrees/branches.
|
|
198
|
+
*/
|
|
199
|
+
extensionRules(): Promise<string[]>;
|
|
171
200
|
/** Idempotently ensure `.planner/.gitignore` ignores `.local/` (and the
|
|
172
201
|
* canonical transient/derived patterns). Projects initialized before the
|
|
173
202
|
* `.local/` move either have no `.planner/.gitignore` or one with stale
|
|
@@ -324,6 +353,12 @@ export declare class PlanStore {
|
|
|
324
353
|
setWorkDeviationState(id: string, state: "active" | "resume-required" | "resolved" | "resumed" | "canceled", timestamp?: string): Promise<Project>;
|
|
325
354
|
updateFeatures(updater: (f: FeaturesDocument) => FeaturesDocument): Promise<FeaturesDocument>;
|
|
326
355
|
updateRequirements(updater: (r: RequirementsDocument) => RequirementsDocument): Promise<RequirementsDocument>;
|
|
356
|
+
/**
|
|
357
|
+
* Persist completion of one full task → phase → feature → requirements read
|
|
358
|
+
* sequence. Session metadata is deliberately the only changed entity field:
|
|
359
|
+
* semantic updatedAt/descriptionUpdatedAt values are preserved exactly.
|
|
360
|
+
*/
|
|
361
|
+
recordContextRead(input: RecordContextReadInput): Promise<RecordContextReadResult>;
|
|
327
362
|
saveProject(project: Project): Promise<void>;
|
|
328
363
|
saveFeatures(features: FeaturesDocument): Promise<void>;
|
|
329
364
|
/** Per-file write of all features + orphan reconcile. No lock (caller holds withFeaturesLock). */
|
|
@@ -336,12 +371,19 @@ export declare class PlanStore {
|
|
|
336
371
|
* task_create / phase_update calls on the SAME phaseId so batch operations
|
|
337
372
|
* don't lose tasks (last-write-wins race condition). */
|
|
338
373
|
updatePhase(phaseId: string, updater: (phase: Phase) => Phase): Promise<Phase>;
|
|
339
|
-
/**
|
|
374
|
+
/** Save a durable resume checkpoint without introducing a separate canonical task status. */
|
|
340
375
|
pauseTask(phaseId: string, taskId: string, input: TaskPauseSnapshot): Promise<Task>;
|
|
341
|
-
/** Resume a
|
|
376
|
+
/** Resume a checkpointed task without resetting its original startedAt. */
|
|
342
377
|
resumeTask(phaseId: string, taskId: string, timestamp?: string): Promise<Task>;
|
|
343
378
|
/** Get the handoff text for a phase ("" if none). Throws if phase missing. */
|
|
344
379
|
getPhaseHandoff(phaseId: string): Promise<string>;
|
|
380
|
+
/** Audit one exact phase before preparing a handoff refresh. */
|
|
381
|
+
preparePhaseHandoff(phaseId: string): Promise<PhaseHandoffAudit>;
|
|
382
|
+
/** Refresh the single active handoff and synchronize durable task/phase/feature
|
|
383
|
+
* context. Unlike setPhaseHandoff(), this deliberately does not archive the
|
|
384
|
+
* previous active body: callers must reconcile it using the optimistic
|
|
385
|
+
* handoffUpdatedAt token returned by preparePhaseHandoff(). */
|
|
386
|
+
refreshPhaseHandoff(phaseId: string, input: RefreshPhaseHandoffInput): Promise<RefreshPhaseHandoffResult>;
|
|
345
387
|
/** Set the handoff text for a phase + stamp handoffUpdatedAt. A completed or
|
|
346
388
|
* canceled phase cannot receive a new operational handoff. Replacing an
|
|
347
389
|
* existing handoff archives the previous content as `superseded` first. */
|
|
@@ -385,13 +427,11 @@ export declare class PlanStore {
|
|
|
385
427
|
removed: OrphanPhaseSummary[];
|
|
386
428
|
}>;
|
|
387
429
|
deletePhase(phaseId: string): Promise<void>;
|
|
388
|
-
/** Remove a phase file
|
|
389
|
-
*
|
|
390
|
-
*
|
|
391
|
-
*
|
|
392
|
-
*
|
|
393
|
-
* .local/backups/ and are never read by readJson, so only the inline .bak
|
|
394
|
-
* needs removing here. */
|
|
430
|
+
/** Remove a phase file and BOTH of its previous-version backups: the legacy
|
|
431
|
+
* inline `phases/<id>.json.bak` (kept for backward compat) and the relocated
|
|
432
|
+
* `.local/backups/phases/<id>.json.bak` (written once updatePhase passes root,
|
|
433
|
+
* per P043). Leaving either behind would RESURRECT the deleted phase on the
|
|
434
|
+
* next read, since readJson falls back to both locations. */
|
|
395
435
|
private unlinkPhaseFiles;
|
|
396
436
|
/** Load the full workspace (manifest + phases + project + requirements + features) */
|
|
397
437
|
loadWorkspace(): Promise<PlanWorkspace>;
|
package/dist/plan-store.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plan-store.d.ts","sourceRoot":"","sources":["../src/plan-store.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,CAAC,EAAY,MAAM,KAAK,CAAC;AAclC,OAAO,EAGL,KAAK,OAAO,EACZ,KAAK,gBAAgB,EAGrB,KAAK,QAAQ,EAEb,KAAK,KAAK,EACV,KAAK,IAAI,EACT,KAAK,iBAAiB,EAEtB,KAAK,aAAa,EAElB,KAAK,OAAO,EAEZ,KAAK,oBAAoB,EACzB,KAAK,WAAW,EAKhB,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,WAAW,EAChB,KAAK,aAAa,
|
|
1
|
+
{"version":3,"file":"plan-store.d.ts","sourceRoot":"","sources":["../src/plan-store.ts"],"names":[],"mappings":"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"}
|