planflow-ai 1.3.5 → 1.4.3
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/.claude/commands/brainstorm.md +6 -14
- package/.claude/commands/create-contract.md +6 -38
- package/.claude/commands/create-plan.md +18 -38
- package/.claude/commands/discovery-plan.md +19 -49
- package/.claude/commands/execute-plan.md +116 -77
- package/.claude/commands/flow.md +27 -2
- package/.claude/commands/heartbeat.md +12 -14
- package/.claude/commands/learn.md +20 -80
- package/.claude/commands/note.md +6 -23
- package/.claude/commands/resume-work.md +261 -0
- package/.claude/commands/review-code.md +19 -51
- package/.claude/commands/review-pr.md +21 -57
- package/.claude/commands/setup.md +8 -56
- package/.claude/commands/write-tests.md +7 -41
- package/.claude/resources/core/atomic-commits.md +380 -0
- package/.claude/resources/core/autopilot-mode.md +3 -2
- package/.claude/resources/core/compaction-guide.md +15 -1
- package/.claude/resources/core/heartbeat.md +129 -1
- package/.claude/resources/core/per-task-verification.md +362 -0
- package/.claude/resources/core/phase-isolation.md +237 -4
- package/.claude/resources/core/session-scratchpad.md +1 -0
- package/.claude/resources/core/shared-context.md +110 -0
- package/.claude/resources/core/wave-execution.md +407 -0
- package/.claude/resources/patterns/plans-patterns.md +56 -0
- package/.claude/resources/patterns/plans-templates.md +152 -0
- package/.claude/resources/skills/create-plan-skill.md +71 -5
- package/.claude/resources/skills/execute-plan-skill.md +420 -14
- package/.claude/resources/skills/resume-work-skill.md +159 -0
- package/README.md +154 -96
- package/dist/cli/commands/brain.d.ts +20 -0
- package/dist/cli/commands/brain.d.ts.map +1 -0
- package/dist/cli/commands/brain.js +127 -0
- package/dist/cli/commands/brain.js.map +1 -0
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +10 -1
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/state-query.d.ts +13 -0
- package/dist/cli/commands/state-query.d.ts.map +1 -0
- package/dist/cli/commands/state-query.js +32 -0
- package/dist/cli/commands/state-query.js.map +1 -0
- package/dist/cli/commands/state.d.ts +12 -0
- package/dist/cli/commands/state.d.ts.map +1 -0
- package/dist/cli/commands/state.js +47 -0
- package/dist/cli/commands/state.js.map +1 -0
- package/dist/cli/daemon/desktop-notifier.d.ts +16 -0
- package/dist/cli/daemon/desktop-notifier.d.ts.map +1 -0
- package/dist/cli/daemon/desktop-notifier.js +53 -0
- package/dist/cli/daemon/desktop-notifier.js.map +1 -0
- package/dist/cli/daemon/event-writer.d.ts +22 -0
- package/dist/cli/daemon/event-writer.d.ts.map +1 -0
- package/dist/cli/daemon/event-writer.js +76 -0
- package/dist/cli/daemon/event-writer.js.map +1 -0
- package/dist/cli/daemon/heartbeat-daemon.js +81 -1
- package/dist/cli/daemon/heartbeat-daemon.js.map +1 -1
- package/dist/cli/daemon/log-writer.d.ts +17 -0
- package/dist/cli/daemon/log-writer.d.ts.map +1 -0
- package/dist/cli/daemon/log-writer.js +62 -0
- package/dist/cli/daemon/log-writer.js.map +1 -0
- package/dist/cli/daemon/notification-router.d.ts +17 -0
- package/dist/cli/daemon/notification-router.d.ts.map +1 -0
- package/dist/cli/daemon/notification-router.js +35 -0
- package/dist/cli/daemon/notification-router.js.map +1 -0
- package/dist/cli/daemon/prompt-manager.d.ts +27 -0
- package/dist/cli/daemon/prompt-manager.d.ts.map +1 -0
- package/dist/cli/daemon/prompt-manager.js +107 -0
- package/dist/cli/daemon/prompt-manager.js.map +1 -0
- package/dist/cli/daemon/shared-context.d.ts +38 -0
- package/dist/cli/daemon/shared-context.d.ts.map +1 -0
- package/dist/cli/daemon/shared-context.js +129 -0
- package/dist/cli/daemon/shared-context.js.map +1 -0
- package/dist/cli/handlers/claude.d.ts.map +1 -1
- package/dist/cli/handlers/claude.js +18 -0
- package/dist/cli/handlers/claude.js.map +1 -1
- package/dist/cli/handlers/shared.js +1 -1
- package/dist/cli/handlers/shared.js.map +1 -1
- package/dist/cli/index.js +30 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/state/brain-query.d.ts +48 -0
- package/dist/cli/state/brain-query.d.ts.map +1 -0
- package/dist/cli/state/brain-query.js +113 -0
- package/dist/cli/state/brain-query.js.map +1 -0
- package/dist/cli/state/flowconfig-parser.d.ts +16 -0
- package/dist/cli/state/flowconfig-parser.d.ts.map +1 -0
- package/dist/cli/state/flowconfig-parser.js +166 -0
- package/dist/cli/state/flowconfig-parser.js.map +1 -0
- package/dist/cli/state/heartbeat-state.d.ts +16 -0
- package/dist/cli/state/heartbeat-state.d.ts.map +1 -0
- package/dist/cli/state/heartbeat-state.js +97 -0
- package/dist/cli/state/heartbeat-state.js.map +1 -0
- package/dist/cli/state/model-router.d.ts +8 -0
- package/dist/cli/state/model-router.d.ts.map +1 -0
- package/dist/cli/state/model-router.js +36 -0
- package/dist/cli/state/model-router.js.map +1 -0
- package/dist/cli/state/plan-parser.d.ts +16 -0
- package/dist/cli/state/plan-parser.d.ts.map +1 -0
- package/dist/cli/state/plan-parser.js +124 -0
- package/dist/cli/state/plan-parser.js.map +1 -0
- package/dist/cli/state/session-state.d.ts +21 -0
- package/dist/cli/state/session-state.d.ts.map +1 -0
- package/dist/cli/state/session-state.js +36 -0
- package/dist/cli/state/session-state.js.map +1 -0
- package/dist/cli/state/state-md-parser.d.ts +18 -0
- package/dist/cli/state/state-md-parser.d.ts.map +1 -0
- package/dist/cli/state/state-md-parser.js +222 -0
- package/dist/cli/state/state-md-parser.js.map +1 -0
- package/dist/cli/state/types.d.ts +137 -0
- package/dist/cli/state/types.d.ts.map +1 -0
- package/dist/cli/state/types.js +8 -0
- package/dist/cli/state/types.js.map +1 -0
- package/dist/cli/state/wave-calculator.d.ts +18 -0
- package/dist/cli/state/wave-calculator.d.ts.map +1 -0
- package/dist/cli/state/wave-calculator.js +134 -0
- package/dist/cli/state/wave-calculator.js.map +1 -0
- package/dist/cli/types.d.ts +15 -0
- package/dist/cli/types.d.ts.map +1 -1
- package/package.json +7 -2
- package/templates/shared/CLAUDE.md.template +4 -0
- package/.claude/resources/core/_index.md +0 -304
- package/.claude/resources/languages/_index.md +0 -76
- package/.claude/resources/patterns/_index.md +0 -200
- package/.claude/resources/skills/_index.md +0 -285
- package/.claude/resources/tools/_index.md +0 -110
- package/.claude/resources/tools/reference-expansion-tool.md +0 -326
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* STATE.md Parser
|
|
3
|
+
*
|
|
4
|
+
* Parses `flow/STATE.md` into a structured ExecutionState object.
|
|
5
|
+
* Uses regex-based line parsing consistent with flowconfig-parser and plan-parser patterns.
|
|
6
|
+
* Returns null if STATE.md doesn't exist.
|
|
7
|
+
*/
|
|
8
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
9
|
+
import { join } from 'node:path';
|
|
10
|
+
const SECTION_RE = /^## (.+)$/;
|
|
11
|
+
const BOLD_KV_RE = /^- \*\*(.+?)\*\*:\s*(.*)$/;
|
|
12
|
+
const BULLET_RE = /^- (.+)$/;
|
|
13
|
+
const UPDATED_RE = /^\*\*Updated\*\*:\s*(.+)$/;
|
|
14
|
+
const COMPLETED_PHASE_RE = /^Phase (\d+):\s*(.+?)\s*—\s*(.+)$/;
|
|
15
|
+
const CURRENT_PHASE_RE = /^(\d+)\s*—\s*(.+)$/;
|
|
16
|
+
/**
|
|
17
|
+
* Parse `flow/STATE.md` into a structured ExecutionState object.
|
|
18
|
+
* Returns null if STATE.md doesn't exist.
|
|
19
|
+
*/
|
|
20
|
+
export function parseStateMd(flowDir) {
|
|
21
|
+
const statePath = join(flowDir, 'STATE.md');
|
|
22
|
+
if (!existsSync(statePath)) {
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
let content;
|
|
26
|
+
try {
|
|
27
|
+
content = readFileSync(statePath, 'utf-8');
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
return parseStateMdContent(content);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Parse STATE.md content string (for testability without file I/O).
|
|
36
|
+
*/
|
|
37
|
+
export function parseStateMdContent(content) {
|
|
38
|
+
const state = {
|
|
39
|
+
active_skill: null,
|
|
40
|
+
active_plan: null,
|
|
41
|
+
current_phase: null,
|
|
42
|
+
current_task: null,
|
|
43
|
+
completed_phases: [],
|
|
44
|
+
decisions: [],
|
|
45
|
+
blockers: [],
|
|
46
|
+
files_modified: [],
|
|
47
|
+
next_action: null,
|
|
48
|
+
updated_at: null,
|
|
49
|
+
};
|
|
50
|
+
const lines = content.split('\n');
|
|
51
|
+
let currentSection = '';
|
|
52
|
+
let inCompletedPhases = false;
|
|
53
|
+
for (let i = 0; i < lines.length; i++) {
|
|
54
|
+
const line = lines[i];
|
|
55
|
+
const trimmed = line.trim();
|
|
56
|
+
// Updated timestamp (outside sections)
|
|
57
|
+
const updatedMatch = trimmed.match(UPDATED_RE);
|
|
58
|
+
if (updatedMatch) {
|
|
59
|
+
state.updated_at = updatedMatch[1].trim();
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
// Section header
|
|
63
|
+
const sectionMatch = trimmed.match(SECTION_RE);
|
|
64
|
+
if (sectionMatch) {
|
|
65
|
+
currentSection = sectionMatch[1].trim();
|
|
66
|
+
inCompletedPhases = false;
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
if (currentSection === 'Execution State') {
|
|
70
|
+
parseExecutionStateLine(trimmed, state, inCompletedPhases);
|
|
71
|
+
// Track if we just entered completed phases sub-list
|
|
72
|
+
const kvMatch = trimmed.match(BOLD_KV_RE);
|
|
73
|
+
if (kvMatch && kvMatch[1] === 'Completed Phases') {
|
|
74
|
+
inCompletedPhases = true;
|
|
75
|
+
}
|
|
76
|
+
else if (kvMatch && kvMatch[1] !== 'Completed Phases') {
|
|
77
|
+
inCompletedPhases = false;
|
|
78
|
+
}
|
|
79
|
+
// Indented bullets under Completed Phases
|
|
80
|
+
if (inCompletedPhases && line.match(/^\s{2,}- /)) {
|
|
81
|
+
const indentedContent = trimmed.replace(/^- /, '');
|
|
82
|
+
const phaseMatch = indentedContent.match(COMPLETED_PHASE_RE);
|
|
83
|
+
if (phaseMatch) {
|
|
84
|
+
state.completed_phases.push({
|
|
85
|
+
number: parseInt(phaseMatch[1], 10),
|
|
86
|
+
name: phaseMatch[2].trim(),
|
|
87
|
+
outcome: phaseMatch[3].trim(),
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
else if (currentSection === 'Decisions') {
|
|
93
|
+
parseDecisionLine(trimmed, state);
|
|
94
|
+
}
|
|
95
|
+
else if (currentSection === 'Blockers') {
|
|
96
|
+
parseBlockerLine(trimmed, state);
|
|
97
|
+
}
|
|
98
|
+
else if (currentSection === 'Files Modified') {
|
|
99
|
+
parseFileModifiedLine(trimmed, state);
|
|
100
|
+
}
|
|
101
|
+
else if (currentSection === 'Next Action') {
|
|
102
|
+
parseNextActionLine(trimmed, state);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return state;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Parse a line within the Execution State section.
|
|
109
|
+
*/
|
|
110
|
+
function parseExecutionStateLine(trimmed, state, inCompletedPhases) {
|
|
111
|
+
if (inCompletedPhases)
|
|
112
|
+
return;
|
|
113
|
+
const kvMatch = trimmed.match(BOLD_KV_RE);
|
|
114
|
+
if (!kvMatch)
|
|
115
|
+
return;
|
|
116
|
+
const key = kvMatch[1].trim();
|
|
117
|
+
const value = kvMatch[2].trim();
|
|
118
|
+
switch (key) {
|
|
119
|
+
case 'Active Skill':
|
|
120
|
+
state.active_skill = value;
|
|
121
|
+
break;
|
|
122
|
+
case 'Active Plan':
|
|
123
|
+
state.active_plan = value;
|
|
124
|
+
break;
|
|
125
|
+
case 'Current Phase': {
|
|
126
|
+
const phaseMatch = value.match(CURRENT_PHASE_RE);
|
|
127
|
+
if (phaseMatch) {
|
|
128
|
+
state.current_phase = {
|
|
129
|
+
number: parseInt(phaseMatch[1], 10),
|
|
130
|
+
name: phaseMatch[2].trim(),
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
break;
|
|
134
|
+
}
|
|
135
|
+
case 'Current Task':
|
|
136
|
+
state.current_task = value;
|
|
137
|
+
break;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Parse a decision bullet line.
|
|
142
|
+
* Format: "- Chose X over Y (reason: Z)" or "- Decision text (reason: explanation)"
|
|
143
|
+
*/
|
|
144
|
+
function parseDecisionLine(trimmed, state) {
|
|
145
|
+
const bulletMatch = trimmed.match(BULLET_RE);
|
|
146
|
+
if (!bulletMatch)
|
|
147
|
+
return;
|
|
148
|
+
const text = bulletMatch[1].trim();
|
|
149
|
+
const reasonMatch = text.match(/^(.+?)\s*\(reason:\s*(.+?)\)$/);
|
|
150
|
+
if (reasonMatch) {
|
|
151
|
+
const decisionText = reasonMatch[1].trim();
|
|
152
|
+
// Try to extract "Chose X over Y" pattern
|
|
153
|
+
const choseMatch = decisionText.match(/^(?:Chose|Used)\s+(.+?)(?:\s+(?:over|for|instead of)\s+(.+))?$/i);
|
|
154
|
+
if (choseMatch) {
|
|
155
|
+
state.decisions.push({
|
|
156
|
+
decision: decisionText,
|
|
157
|
+
choice: choseMatch[1].trim(),
|
|
158
|
+
reason: reasonMatch[2].trim(),
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
state.decisions.push({
|
|
163
|
+
decision: decisionText,
|
|
164
|
+
choice: decisionText,
|
|
165
|
+
reason: reasonMatch[2].trim(),
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
state.decisions.push({
|
|
171
|
+
decision: text,
|
|
172
|
+
choice: text,
|
|
173
|
+
reason: '',
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Parse a blocker bullet line.
|
|
179
|
+
* Format: "- Issue description (status: X, tried: Y)"
|
|
180
|
+
*/
|
|
181
|
+
function parseBlockerLine(trimmed, state) {
|
|
182
|
+
const bulletMatch = trimmed.match(BULLET_RE);
|
|
183
|
+
if (!bulletMatch)
|
|
184
|
+
return;
|
|
185
|
+
const text = bulletMatch[1].trim();
|
|
186
|
+
const detailsMatch = text.match(/^(.+?)\s*\(status:\s*(.+?),\s*tried:\s*(.+?)\)$/);
|
|
187
|
+
if (detailsMatch) {
|
|
188
|
+
state.blockers.push({
|
|
189
|
+
issue: detailsMatch[1].trim(),
|
|
190
|
+
status: detailsMatch[2].trim(),
|
|
191
|
+
tried: detailsMatch[3].trim(),
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
else {
|
|
195
|
+
state.blockers.push({
|
|
196
|
+
issue: text,
|
|
197
|
+
status: 'unknown',
|
|
198
|
+
tried: '',
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Parse a file path bullet line.
|
|
204
|
+
*/
|
|
205
|
+
function parseFileModifiedLine(trimmed, state) {
|
|
206
|
+
const bulletMatch = trimmed.match(BULLET_RE);
|
|
207
|
+
if (!bulletMatch)
|
|
208
|
+
return;
|
|
209
|
+
const filePath = bulletMatch[1].trim();
|
|
210
|
+
if (filePath) {
|
|
211
|
+
state.files_modified.push(filePath);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Parse the next action line (first non-empty line in the section).
|
|
216
|
+
*/
|
|
217
|
+
function parseNextActionLine(trimmed, state) {
|
|
218
|
+
if (trimmed && !state.next_action) {
|
|
219
|
+
state.next_action = trimmed;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
//# sourceMappingURL=state-md-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state-md-parser.js","sourceRoot":"","sources":["../../../src/cli/state/state-md-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Types for the deterministic state script (`planflow-ai state`).
|
|
3
|
+
*
|
|
4
|
+
* These interfaces define the JSON output shape produced by parsing
|
|
5
|
+
* plan-flow config files, session state, heartbeat events, and plans.
|
|
6
|
+
*/
|
|
7
|
+
export interface FlowConfig {
|
|
8
|
+
autopilot: boolean;
|
|
9
|
+
commit: boolean;
|
|
10
|
+
push: boolean;
|
|
11
|
+
pr: boolean;
|
|
12
|
+
branch: string;
|
|
13
|
+
wave_execution: boolean;
|
|
14
|
+
phase_isolation: boolean;
|
|
15
|
+
model_routing: boolean;
|
|
16
|
+
max_verify_retries: number;
|
|
17
|
+
}
|
|
18
|
+
export interface SessionState {
|
|
19
|
+
files_present: {
|
|
20
|
+
ledger: boolean;
|
|
21
|
+
brain_index: boolean;
|
|
22
|
+
tasklist: boolean;
|
|
23
|
+
memory: boolean;
|
|
24
|
+
scratchpad: boolean;
|
|
25
|
+
heartbeat_events: boolean;
|
|
26
|
+
heartbeat_state: boolean;
|
|
27
|
+
heartbeat_prompt: boolean;
|
|
28
|
+
state_md: boolean;
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
export interface HeartbeatSummary {
|
|
32
|
+
unread_count: number;
|
|
33
|
+
has_prompt: boolean;
|
|
34
|
+
last_read_timestamp: string | null;
|
|
35
|
+
}
|
|
36
|
+
export interface TaskCompletion {
|
|
37
|
+
task_number: number;
|
|
38
|
+
task_name: string;
|
|
39
|
+
files_created: string[];
|
|
40
|
+
files_modified: string[];
|
|
41
|
+
}
|
|
42
|
+
export interface PlanTask {
|
|
43
|
+
index: number;
|
|
44
|
+
name: string;
|
|
45
|
+
verify_command: string | null;
|
|
46
|
+
}
|
|
47
|
+
export interface PlanPhase {
|
|
48
|
+
number: number;
|
|
49
|
+
name: string;
|
|
50
|
+
complexity: number;
|
|
51
|
+
dependencies: number[];
|
|
52
|
+
tasks: PlanTask[];
|
|
53
|
+
}
|
|
54
|
+
export interface WaveGroup {
|
|
55
|
+
wave_number: number;
|
|
56
|
+
phase_numbers: number[];
|
|
57
|
+
}
|
|
58
|
+
export type ContextEntryType = 'contract' | 'decision' | 'progress';
|
|
59
|
+
export type ContractKind = 'endpoint' | 'interface' | 'function' | 'type';
|
|
60
|
+
export interface ContractData {
|
|
61
|
+
name: string;
|
|
62
|
+
kind: ContractKind;
|
|
63
|
+
signature: string;
|
|
64
|
+
fields?: string[];
|
|
65
|
+
}
|
|
66
|
+
export interface DecisionData {
|
|
67
|
+
choice: string;
|
|
68
|
+
reason?: string;
|
|
69
|
+
}
|
|
70
|
+
export interface ProgressData {
|
|
71
|
+
task: number;
|
|
72
|
+
status: 'complete' | 'in-progress';
|
|
73
|
+
summary?: string;
|
|
74
|
+
}
|
|
75
|
+
export interface ContextEntry {
|
|
76
|
+
agent: string;
|
|
77
|
+
type: ContextEntryType;
|
|
78
|
+
timestamp: string;
|
|
79
|
+
data: ContractData | DecisionData | ProgressData;
|
|
80
|
+
}
|
|
81
|
+
export interface ContractConflict {
|
|
82
|
+
name: string;
|
|
83
|
+
entries: {
|
|
84
|
+
agent: string;
|
|
85
|
+
signature: string;
|
|
86
|
+
fields?: string[];
|
|
87
|
+
}[];
|
|
88
|
+
}
|
|
89
|
+
export type ModelTierLevel = 'fast' | 'standard' | 'powerful';
|
|
90
|
+
export interface ModelTier {
|
|
91
|
+
phase: number;
|
|
92
|
+
complexity: number;
|
|
93
|
+
tier: ModelTierLevel;
|
|
94
|
+
model: string;
|
|
95
|
+
}
|
|
96
|
+
export interface CompletedPhase {
|
|
97
|
+
number: number;
|
|
98
|
+
name: string;
|
|
99
|
+
outcome: string;
|
|
100
|
+
}
|
|
101
|
+
export interface Decision {
|
|
102
|
+
decision: string;
|
|
103
|
+
choice: string;
|
|
104
|
+
reason: string;
|
|
105
|
+
}
|
|
106
|
+
export interface Blocker {
|
|
107
|
+
issue: string;
|
|
108
|
+
status: string;
|
|
109
|
+
tried: string;
|
|
110
|
+
}
|
|
111
|
+
export interface ExecutionState {
|
|
112
|
+
active_skill: string | null;
|
|
113
|
+
active_plan: string | null;
|
|
114
|
+
current_phase: {
|
|
115
|
+
number: number;
|
|
116
|
+
name: string;
|
|
117
|
+
} | null;
|
|
118
|
+
current_task: string | null;
|
|
119
|
+
completed_phases: CompletedPhase[];
|
|
120
|
+
decisions: Decision[];
|
|
121
|
+
blockers: Blocker[];
|
|
122
|
+
files_modified: string[];
|
|
123
|
+
next_action: string | null;
|
|
124
|
+
updated_at: string | null;
|
|
125
|
+
}
|
|
126
|
+
export interface StateOutput {
|
|
127
|
+
config: FlowConfig;
|
|
128
|
+
session: SessionState;
|
|
129
|
+
heartbeat: HeartbeatSummary;
|
|
130
|
+
execution?: ExecutionState;
|
|
131
|
+
plan?: {
|
|
132
|
+
phases: PlanPhase[];
|
|
133
|
+
waves: WaveGroup[];
|
|
134
|
+
model_tiers: ModelTier[];
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/cli/state/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Types for the deterministic state script (`planflow-ai state`).
|
|
3
|
+
*
|
|
4
|
+
* These interfaces define the JSON output shape produced by parsing
|
|
5
|
+
* plan-flow config files, session state, heartbeat events, and plans.
|
|
6
|
+
*/
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/cli/state/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wave calculator — topological sort of phase dependencies into wave groups.
|
|
3
|
+
*
|
|
4
|
+
* Phases with no dependencies land in wave 1. Each subsequent phase lands in
|
|
5
|
+
* wave = max(wave of each dependency) + 1. A "Tests" phase (last phase whose
|
|
6
|
+
* name contains "test", case-insensitive) is always isolated in the final wave.
|
|
7
|
+
*
|
|
8
|
+
* If a circular dependency is detected the fallback is sequential execution:
|
|
9
|
+
* one phase per wave in phase-number order.
|
|
10
|
+
*/
|
|
11
|
+
import type { PlanPhase, WaveGroup } from './types.js';
|
|
12
|
+
/**
|
|
13
|
+
* Calculate wave groups from plan phases.
|
|
14
|
+
*
|
|
15
|
+
* @returns Sorted array of WaveGroup objects.
|
|
16
|
+
*/
|
|
17
|
+
export declare function calculateWaves(phases: PlanPhase[]): WaveGroup[];
|
|
18
|
+
//# sourceMappingURL=wave-calculator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wave-calculator.d.ts","sourceRoot":"","sources":["../../../src/cli/state/wave-calculator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AA6CvD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,SAAS,EAAE,CAuF/D"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wave calculator — topological sort of phase dependencies into wave groups.
|
|
3
|
+
*
|
|
4
|
+
* Phases with no dependencies land in wave 1. Each subsequent phase lands in
|
|
5
|
+
* wave = max(wave of each dependency) + 1. A "Tests" phase (last phase whose
|
|
6
|
+
* name contains "test", case-insensitive) is always isolated in the final wave.
|
|
7
|
+
*
|
|
8
|
+
* If a circular dependency is detected the fallback is sequential execution:
|
|
9
|
+
* one phase per wave in phase-number order.
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Detect whether the dependency graph contains a cycle using iterative DFS.
|
|
13
|
+
*/
|
|
14
|
+
function hasCycle(phaseNumbers, adjacency) {
|
|
15
|
+
const WHITE = 0;
|
|
16
|
+
const GRAY = 1;
|
|
17
|
+
const BLACK = 2;
|
|
18
|
+
const color = new Map();
|
|
19
|
+
for (const n of phaseNumbers)
|
|
20
|
+
color.set(n, WHITE);
|
|
21
|
+
for (const start of phaseNumbers) {
|
|
22
|
+
if (color.get(start) !== WHITE)
|
|
23
|
+
continue;
|
|
24
|
+
const stack = [
|
|
25
|
+
{ node: start, idx: 0 },
|
|
26
|
+
];
|
|
27
|
+
color.set(start, GRAY);
|
|
28
|
+
while (stack.length > 0) {
|
|
29
|
+
const top = stack[stack.length - 1];
|
|
30
|
+
const neighbors = adjacency.get(top.node) ?? [];
|
|
31
|
+
if (top.idx < neighbors.length) {
|
|
32
|
+
const neighbor = neighbors[top.idx];
|
|
33
|
+
top.idx++;
|
|
34
|
+
const c = color.get(neighbor);
|
|
35
|
+
if (c === GRAY)
|
|
36
|
+
return true; // back-edge → cycle
|
|
37
|
+
if (c === WHITE) {
|
|
38
|
+
color.set(neighbor, GRAY);
|
|
39
|
+
stack.push({ node: neighbor, idx: 0 });
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
color.set(top.node, BLACK);
|
|
44
|
+
stack.pop();
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Calculate wave groups from plan phases.
|
|
52
|
+
*
|
|
53
|
+
* @returns Sorted array of WaveGroup objects.
|
|
54
|
+
*/
|
|
55
|
+
export function calculateWaves(phases) {
|
|
56
|
+
if (phases.length === 0)
|
|
57
|
+
return [];
|
|
58
|
+
// Build adjacency list (phase → phases it depends on, i.e. forward edges
|
|
59
|
+
// point from a phase to its dependencies for the purpose of cycle detection).
|
|
60
|
+
// For cycle detection we need "phase → successors" (who depends on me).
|
|
61
|
+
const phaseNumbers = phases.map((p) => p.number);
|
|
62
|
+
const depMap = new Map();
|
|
63
|
+
const successorMap = new Map();
|
|
64
|
+
for (const p of phases) {
|
|
65
|
+
depMap.set(p.number, [...p.dependencies]);
|
|
66
|
+
if (!successorMap.has(p.number))
|
|
67
|
+
successorMap.set(p.number, []);
|
|
68
|
+
for (const dep of p.dependencies) {
|
|
69
|
+
if (!successorMap.has(dep))
|
|
70
|
+
successorMap.set(dep, []);
|
|
71
|
+
successorMap.get(dep).push(p.number);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
// Cycle detection — use successor adjacency for DFS.
|
|
75
|
+
if (hasCycle(phaseNumbers, successorMap)) {
|
|
76
|
+
// Fallback: sequential, one phase per wave.
|
|
77
|
+
const sorted = [...phaseNumbers].sort((a, b) => a - b);
|
|
78
|
+
return sorted.map((n, i) => ({
|
|
79
|
+
wave_number: i + 1,
|
|
80
|
+
phase_numbers: [n],
|
|
81
|
+
}));
|
|
82
|
+
}
|
|
83
|
+
// Assign wave numbers iteratively.
|
|
84
|
+
const waveOf = new Map();
|
|
85
|
+
const phaseSet = new Set(phaseNumbers);
|
|
86
|
+
// Iterative assignment: keep going until all phases are assigned.
|
|
87
|
+
let changed = true;
|
|
88
|
+
while (changed) {
|
|
89
|
+
changed = false;
|
|
90
|
+
for (const p of phases) {
|
|
91
|
+
if (waveOf.has(p.number))
|
|
92
|
+
continue;
|
|
93
|
+
// Filter dependencies to only those that are actual phases in the plan.
|
|
94
|
+
const deps = (depMap.get(p.number) ?? []).filter((d) => phaseSet.has(d));
|
|
95
|
+
if (deps.length === 0) {
|
|
96
|
+
waveOf.set(p.number, 1);
|
|
97
|
+
changed = true;
|
|
98
|
+
}
|
|
99
|
+
else if (deps.every((d) => waveOf.has(d))) {
|
|
100
|
+
const maxDepWave = Math.max(...deps.map((d) => waveOf.get(d)));
|
|
101
|
+
waveOf.set(p.number, maxDepWave + 1);
|
|
102
|
+
changed = true;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
// Detect Tests phase: last phase by number whose name contains "test".
|
|
107
|
+
const sortedPhases = [...phases].sort((a, b) => a.number - b.number);
|
|
108
|
+
const lastPhase = sortedPhases[sortedPhases.length - 1];
|
|
109
|
+
const isTestsPhase = lastPhase && /test/i.test(lastPhase.name) ? lastPhase.number : null;
|
|
110
|
+
// If the Tests phase shares a wave with other phases, move it to its own final wave.
|
|
111
|
+
if (isTestsPhase !== null) {
|
|
112
|
+
const testWave = waveOf.get(isTestsPhase);
|
|
113
|
+
const phasesInSameWave = Array.from(waveOf.entries()).filter(([num, w]) => w === testWave && num !== isTestsPhase);
|
|
114
|
+
if (phasesInSameWave.length > 0) {
|
|
115
|
+
// Move Tests to max_wave + 1
|
|
116
|
+
const maxWave = Math.max(...Array.from(waveOf.values()));
|
|
117
|
+
waveOf.set(isTestsPhase, maxWave + 1);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
// Group phases by wave number.
|
|
121
|
+
const waveMap = new Map();
|
|
122
|
+
for (const [phaseNum, wave] of Array.from(waveOf.entries())) {
|
|
123
|
+
if (!waveMap.has(wave))
|
|
124
|
+
waveMap.set(wave, []);
|
|
125
|
+
waveMap.get(wave).push(phaseNum);
|
|
126
|
+
}
|
|
127
|
+
// Build sorted WaveGroup array.
|
|
128
|
+
const waveNumbers = Array.from(waveMap.keys()).sort((a, b) => a - b);
|
|
129
|
+
return waveNumbers.map((wn) => ({
|
|
130
|
+
wave_number: wn,
|
|
131
|
+
phase_numbers: waveMap.get(wn).sort((a, b) => a - b),
|
|
132
|
+
}));
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=wave-calculator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wave-calculator.js","sourceRoot":"","sources":["../../../src/cli/state/wave-calculator.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/types.d.ts
CHANGED
|
@@ -45,4 +45,19 @@ export interface HeartbeatTask {
|
|
|
45
45
|
export interface HeartbeatOptions {
|
|
46
46
|
target: string;
|
|
47
47
|
}
|
|
48
|
+
export type NotificationLevel = 'info' | 'warn' | 'error';
|
|
49
|
+
export type NotificationType = 'task_started' | 'phase_complete' | 'task_complete' | 'task_failed' | 'task_blocked';
|
|
50
|
+
export interface NotificationEvent {
|
|
51
|
+
id: string;
|
|
52
|
+
timestamp: Date;
|
|
53
|
+
task: string;
|
|
54
|
+
type: NotificationType;
|
|
55
|
+
level: NotificationLevel;
|
|
56
|
+
phase?: string;
|
|
57
|
+
message: string;
|
|
58
|
+
}
|
|
59
|
+
export interface HeartbeatState {
|
|
60
|
+
lastReadTimestamp: string;
|
|
61
|
+
lastSessionId?: string;
|
|
62
|
+
}
|
|
48
63
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/cli/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/cli/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,UAAU,CAAC;CACpB;AAED,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,SAAS,GAAG,OAAO,CAAC;AAE9E,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,OAAO,GAAG,UAAU,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC/C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,cAAc,CAAC;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;CAChB"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/cli/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,UAAU,CAAC;CACpB;AAED,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,SAAS,GAAG,OAAO,CAAC;AAE9E,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,OAAO,GAAG,UAAU,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC/C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,cAAc,CAAC;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAE1D,MAAM,MAAM,gBAAgB,GACxB,cAAc,GACd,gBAAgB,GAChB,eAAe,GACf,aAAa,GACb,cAAc,CAAC;AAEnB,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,IAAI,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,gBAAgB,CAAC;IACvB,KAAK,EAAE,iBAAiB,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "planflow-ai",
|
|
3
|
-
"version": "1.3
|
|
3
|
+
"version": "1.4.3",
|
|
4
4
|
"description": "Structured AI-assisted development workflows for discovery, planning, execution, code reviews, and testing",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/cli/index.js",
|
|
@@ -57,11 +57,16 @@
|
|
|
57
57
|
"author": "Bruno Cardoso",
|
|
58
58
|
"license": "MIT",
|
|
59
59
|
"dependencies": {
|
|
60
|
-
"commander": "^14.0.3"
|
|
60
|
+
"commander": "^14.0.3",
|
|
61
|
+
"node-notifier": "^10.0.1"
|
|
62
|
+
},
|
|
63
|
+
"optionalDependencies": {
|
|
64
|
+
"planflow-brain": "file:../brain"
|
|
61
65
|
},
|
|
62
66
|
"devDependencies": {
|
|
63
67
|
"@types/jest": "^29.5.14",
|
|
64
68
|
"@types/node": "^22.10.5",
|
|
69
|
+
"@types/node-notifier": "^8.0.5",
|
|
65
70
|
"jest": "^29.7.0",
|
|
66
71
|
"prettier": "^3.4.2",
|
|
67
72
|
"ts-jest": "^29.2.5",
|
|
@@ -90,6 +90,10 @@ During skill execution, the LLM silently buffers patterns and anti-patterns, pre
|
|
|
90
90
|
|
|
91
91
|
When `phase_isolation: true` in `flow/.flowconfig` (default), each `/execute-plan` phase runs in an isolated Agent sub-agent with a clean context window. Sub-agent receives focused context (phase spec, file list, patterns) and returns structured JSON summary. Eliminates context rot. Disable with `/flow phase_isolation=false`. See `.claude/resources/core/phase-isolation.md`.
|
|
92
92
|
|
|
93
|
+
## Per-Task Verification
|
|
94
|
+
|
|
95
|
+
Tasks in plan phases can include optional `<verify>` sections with targeted verification commands. After each task, verification runs immediately. Failed verifications trigger a debug sub-agent (haiku) for diagnosis, followed by an auto-repair loop (up to `max_verify_retries`, default: 2, configurable in `flow/.flowconfig`). `/create-plan` auto-generates `<verify>` sections based on task type heuristics. Backward compatible — tasks without `<verify>` skip verification. See `.claude/resources/core/per-task-verification.md`.
|
|
96
|
+
|
|
93
97
|
## Discovery Sub-Agents
|
|
94
98
|
|
|
95
99
|
During `/discovery-plan`, three parallel haiku sub-agents explore the codebase (similar features, API/data patterns, schema/types). Returns condensed JSON findings merged into a Codebase Analysis section. Always-on. See `.claude/resources/core/discovery-sub-agents.md`.
|