@engineereddev/fractal-planner 0.1.1
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-plugin/marketplace.json +22 -0
- package/.claude-plugin/plugin.json +19 -0
- package/LICENSE +21 -0
- package/README.md +257 -0
- package/agents/fp-analyst.md +96 -0
- package/agents/fp-context-builder.md +87 -0
- package/agents/fp-critic.md +140 -0
- package/agents/fp-decomposer.md +261 -0
- package/agents/fp-interviewer.md +263 -0
- package/agents/fp-linear-sync.md +128 -0
- package/agents/fp-researcher.md +82 -0
- package/agents/fp-task-tracker.md +134 -0
- package/dist/cli/classify-intent.js +118 -0
- package/dist/cli/compute-signals.js +495 -0
- package/dist/cli/generate-plan.js +14209 -0
- package/dist/cli/load-config.js +13661 -0
- package/dist/cli/validate-tasks.js +467 -0
- package/dist/index.js +24598 -0
- package/dist/src/cli/classify-intent.d.ts +3 -0
- package/dist/src/cli/compute-signals.d.ts +14 -0
- package/dist/src/cli/generate-plan.d.ts +3 -0
- package/dist/src/cli/load-config.d.ts +3 -0
- package/dist/src/cli/validate-tasks.d.ts +3 -0
- package/dist/src/config.d.ts +182 -0
- package/dist/src/index.d.ts +12 -0
- package/dist/src/phases/clearance.d.ts +12 -0
- package/dist/src/phases/decomposition.d.ts +41 -0
- package/dist/src/phases/interview.d.ts +17 -0
- package/dist/src/phases/planning.d.ts +21 -0
- package/dist/src/phases/research.d.ts +9 -0
- package/dist/src/types/index.d.ts +116 -0
- package/dist/src/utils/draft.d.ts +21 -0
- package/dist/src/utils/question-strategies.d.ts +24 -0
- package/dist/src/utils/task-parser.d.ts +3 -0
- package/hooks/hooks.json +27 -0
- package/hooks/nudge-teammate.sh +216 -0
- package/hooks/run-comment-checker.sh +91 -0
- package/package.json +65 -0
- package/skills/commit/SKILL.md +157 -0
- package/skills/fp/SKILL.md +857 -0
- package/skills/fp/scripts/resolve-env.sh +66 -0
- package/skills/handoff/SKILL.md +195 -0
- package/skills/implement/SKILL.md +783 -0
- package/skills/implement/reference.md +935 -0
- package/skills/retry/SKILL.md +333 -0
- package/skills/status/SKILL.md +182 -0
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
export interface TaskSignals {
|
|
3
|
+
fileScope: number;
|
|
4
|
+
coupling: number;
|
|
5
|
+
gitRisk: number;
|
|
6
|
+
testCoverage: number;
|
|
7
|
+
composite: number;
|
|
8
|
+
}
|
|
9
|
+
export declare function computeFileScope(files: string[]): number;
|
|
10
|
+
export declare function computeCoupling(files: string[]): number;
|
|
11
|
+
export declare function computeGitRisk(files: string[]): number;
|
|
12
|
+
export declare function computeTestCoverage(files: string[], testsRequired: boolean): number;
|
|
13
|
+
export declare function computeComposite(signals: Omit<TaskSignals, 'composite'>): number;
|
|
14
|
+
//# sourceMappingURL=compute-signals.d.ts.map
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration Module
|
|
3
|
+
*
|
|
4
|
+
* Layered JSON config system with user-level and project-level files,
|
|
5
|
+
* merged with sensible defaults.
|
|
6
|
+
*
|
|
7
|
+
* Priority (highest wins): runtime overrides > project config > user config > defaults
|
|
8
|
+
*/
|
|
9
|
+
import { z } from 'zod';
|
|
10
|
+
export declare const LinearConfigSchema: z.ZodObject<{
|
|
11
|
+
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
12
|
+
teamId: z.ZodOptional<z.ZodString>;
|
|
13
|
+
projectId: z.ZodOptional<z.ZodString>;
|
|
14
|
+
userId: z.ZodOptional<z.ZodString>;
|
|
15
|
+
statusMap: z.ZodOptional<z.ZodObject<{
|
|
16
|
+
pending: z.ZodOptional<z.ZodString>;
|
|
17
|
+
'in-progress': z.ZodOptional<z.ZodString>;
|
|
18
|
+
completed: z.ZodOptional<z.ZodString>;
|
|
19
|
+
failed: z.ZodOptional<z.ZodString>;
|
|
20
|
+
review: z.ZodOptional<z.ZodString>;
|
|
21
|
+
}, z.core.$strip>>;
|
|
22
|
+
}, z.core.$strip>;
|
|
23
|
+
export declare const CommentCheckerConfigSchema: z.ZodObject<{
|
|
24
|
+
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
25
|
+
binaryPath: z.ZodOptional<z.ZodString>;
|
|
26
|
+
customPrompt: z.ZodOptional<z.ZodString>;
|
|
27
|
+
}, z.core.$strip>;
|
|
28
|
+
export declare const NudgeConfigSchema: z.ZodObject<{
|
|
29
|
+
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
30
|
+
maxRetries: z.ZodDefault<z.ZodNumber>;
|
|
31
|
+
}, z.core.$strip>;
|
|
32
|
+
export declare const IterationScalingConfigSchema: z.ZodObject<{
|
|
33
|
+
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
34
|
+
base: z.ZodDefault<z.ZodNumber>;
|
|
35
|
+
factor: z.ZodDefault<z.ZodNumber>;
|
|
36
|
+
}, z.core.$strip>;
|
|
37
|
+
declare const FractalPlannerConfigBaseSchema: z.ZodObject<{
|
|
38
|
+
maxComplexity: z.ZodDefault<z.ZodNumber>;
|
|
39
|
+
maxIterations: z.ZodDefault<z.ZodNumber>;
|
|
40
|
+
maxParallelTasks: z.ZodDefault<z.ZodNumber>;
|
|
41
|
+
researchOnly: z.ZodDefault<z.ZodBoolean>;
|
|
42
|
+
planOnly: z.ZodDefault<z.ZodBoolean>;
|
|
43
|
+
skipPlanReview: z.ZodDefault<z.ZodBoolean>;
|
|
44
|
+
skipApproachReview: z.ZodDefault<z.ZodBoolean>;
|
|
45
|
+
preAnalysis: z.ZodDefault<z.ZodBoolean>;
|
|
46
|
+
enableAgentTeams: z.ZodDefault<z.ZodBoolean>;
|
|
47
|
+
noCommit: z.ZodDefault<z.ZodBoolean>;
|
|
48
|
+
plansDir: z.ZodDefault<z.ZodString>;
|
|
49
|
+
permissionMode: z.ZodDefault<z.ZodEnum<{
|
|
50
|
+
default: "default";
|
|
51
|
+
acceptEdits: "acceptEdits";
|
|
52
|
+
bypassPermissions: "bypassPermissions";
|
|
53
|
+
plan: "plan";
|
|
54
|
+
delegate: "delegate";
|
|
55
|
+
dontAsk: "dontAsk";
|
|
56
|
+
}>>;
|
|
57
|
+
linear: z.ZodDefault<z.ZodObject<{
|
|
58
|
+
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
59
|
+
teamId: z.ZodOptional<z.ZodString>;
|
|
60
|
+
projectId: z.ZodOptional<z.ZodString>;
|
|
61
|
+
userId: z.ZodOptional<z.ZodString>;
|
|
62
|
+
statusMap: z.ZodOptional<z.ZodObject<{
|
|
63
|
+
pending: z.ZodOptional<z.ZodString>;
|
|
64
|
+
'in-progress': z.ZodOptional<z.ZodString>;
|
|
65
|
+
completed: z.ZodOptional<z.ZodString>;
|
|
66
|
+
failed: z.ZodOptional<z.ZodString>;
|
|
67
|
+
review: z.ZodOptional<z.ZodString>;
|
|
68
|
+
}, z.core.$strip>>;
|
|
69
|
+
}, z.core.$strip>>;
|
|
70
|
+
commentChecker: z.ZodDefault<z.ZodObject<{
|
|
71
|
+
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
72
|
+
binaryPath: z.ZodOptional<z.ZodString>;
|
|
73
|
+
customPrompt: z.ZodOptional<z.ZodString>;
|
|
74
|
+
}, z.core.$strip>>;
|
|
75
|
+
nudge: z.ZodDefault<z.ZodObject<{
|
|
76
|
+
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
77
|
+
maxRetries: z.ZodDefault<z.ZodNumber>;
|
|
78
|
+
}, z.core.$strip>>;
|
|
79
|
+
cliRunner: z.ZodDefault<z.ZodEnum<{
|
|
80
|
+
bun: "bun";
|
|
81
|
+
node: "node";
|
|
82
|
+
auto: "auto";
|
|
83
|
+
}>>;
|
|
84
|
+
iterationScaling: z.ZodDefault<z.ZodObject<{
|
|
85
|
+
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
86
|
+
base: z.ZodDefault<z.ZodNumber>;
|
|
87
|
+
factor: z.ZodDefault<z.ZodNumber>;
|
|
88
|
+
}, z.core.$strip>>;
|
|
89
|
+
executionOrder: z.ZodDefault<z.ZodEnum<{
|
|
90
|
+
"risk-first": "risk-first";
|
|
91
|
+
"easy-first": "easy-first";
|
|
92
|
+
"document-order": "document-order";
|
|
93
|
+
}>>;
|
|
94
|
+
}, z.core.$strip>;
|
|
95
|
+
export declare const FractalPlannerConfigSchema: z.ZodObject<{
|
|
96
|
+
maxComplexity: z.ZodDefault<z.ZodNumber>;
|
|
97
|
+
maxIterations: z.ZodDefault<z.ZodNumber>;
|
|
98
|
+
maxParallelTasks: z.ZodDefault<z.ZodNumber>;
|
|
99
|
+
researchOnly: z.ZodDefault<z.ZodBoolean>;
|
|
100
|
+
planOnly: z.ZodDefault<z.ZodBoolean>;
|
|
101
|
+
skipPlanReview: z.ZodDefault<z.ZodBoolean>;
|
|
102
|
+
skipApproachReview: z.ZodDefault<z.ZodBoolean>;
|
|
103
|
+
preAnalysis: z.ZodDefault<z.ZodBoolean>;
|
|
104
|
+
enableAgentTeams: z.ZodDefault<z.ZodBoolean>;
|
|
105
|
+
noCommit: z.ZodDefault<z.ZodBoolean>;
|
|
106
|
+
plansDir: z.ZodDefault<z.ZodString>;
|
|
107
|
+
permissionMode: z.ZodDefault<z.ZodEnum<{
|
|
108
|
+
default: "default";
|
|
109
|
+
acceptEdits: "acceptEdits";
|
|
110
|
+
bypassPermissions: "bypassPermissions";
|
|
111
|
+
plan: "plan";
|
|
112
|
+
delegate: "delegate";
|
|
113
|
+
dontAsk: "dontAsk";
|
|
114
|
+
}>>;
|
|
115
|
+
linear: z.ZodDefault<z.ZodObject<{
|
|
116
|
+
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
117
|
+
teamId: z.ZodOptional<z.ZodString>;
|
|
118
|
+
projectId: z.ZodOptional<z.ZodString>;
|
|
119
|
+
userId: z.ZodOptional<z.ZodString>;
|
|
120
|
+
statusMap: z.ZodOptional<z.ZodObject<{
|
|
121
|
+
pending: z.ZodOptional<z.ZodString>;
|
|
122
|
+
'in-progress': z.ZodOptional<z.ZodString>;
|
|
123
|
+
completed: z.ZodOptional<z.ZodString>;
|
|
124
|
+
failed: z.ZodOptional<z.ZodString>;
|
|
125
|
+
review: z.ZodOptional<z.ZodString>;
|
|
126
|
+
}, z.core.$strip>>;
|
|
127
|
+
}, z.core.$strip>>;
|
|
128
|
+
commentChecker: z.ZodDefault<z.ZodObject<{
|
|
129
|
+
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
130
|
+
binaryPath: z.ZodOptional<z.ZodString>;
|
|
131
|
+
customPrompt: z.ZodOptional<z.ZodString>;
|
|
132
|
+
}, z.core.$strip>>;
|
|
133
|
+
nudge: z.ZodDefault<z.ZodObject<{
|
|
134
|
+
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
135
|
+
maxRetries: z.ZodDefault<z.ZodNumber>;
|
|
136
|
+
}, z.core.$strip>>;
|
|
137
|
+
cliRunner: z.ZodDefault<z.ZodEnum<{
|
|
138
|
+
bun: "bun";
|
|
139
|
+
node: "node";
|
|
140
|
+
auto: "auto";
|
|
141
|
+
}>>;
|
|
142
|
+
iterationScaling: z.ZodDefault<z.ZodObject<{
|
|
143
|
+
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
144
|
+
base: z.ZodDefault<z.ZodNumber>;
|
|
145
|
+
factor: z.ZodDefault<z.ZodNumber>;
|
|
146
|
+
}, z.core.$strip>>;
|
|
147
|
+
executionOrder: z.ZodDefault<z.ZodEnum<{
|
|
148
|
+
"risk-first": "risk-first";
|
|
149
|
+
"easy-first": "easy-first";
|
|
150
|
+
"document-order": "document-order";
|
|
151
|
+
}>>;
|
|
152
|
+
}, z.core.$strip>;
|
|
153
|
+
export type FractalPlannerConfig = z.infer<typeof FractalPlannerConfigSchema>;
|
|
154
|
+
export type FractalPlannerConfigFile = z.input<typeof FractalPlannerConfigBaseSchema>;
|
|
155
|
+
export declare const DEFAULT_CONFIG: FractalPlannerConfig;
|
|
156
|
+
/**
|
|
157
|
+
* Resolve the user-level config path.
|
|
158
|
+
* Respects $XDG_CONFIG_HOME, falls back to ~/.config.
|
|
159
|
+
*/
|
|
160
|
+
export declare function getUserConfigPath(): string;
|
|
161
|
+
/**
|
|
162
|
+
* Resolve the project-level config path (relative to cwd).
|
|
163
|
+
*/
|
|
164
|
+
export declare function getProjectConfigPath(): string;
|
|
165
|
+
/**
|
|
166
|
+
* Load config from user + project files, merge with defaults, and cache.
|
|
167
|
+
* Optionally accepts runtime overrides (highest priority).
|
|
168
|
+
*
|
|
169
|
+
* Throws if any config file contains invalid JSON or values.
|
|
170
|
+
*/
|
|
171
|
+
export declare function loadConfig(overrides?: FractalPlannerConfigFile): Promise<FractalPlannerConfig>;
|
|
172
|
+
/**
|
|
173
|
+
* Sync getter for cached config.
|
|
174
|
+
* Throws if loadConfig() has not been called.
|
|
175
|
+
*/
|
|
176
|
+
export declare function getConfig(): FractalPlannerConfig;
|
|
177
|
+
/**
|
|
178
|
+
* Clear the cached config (for testing or reloading).
|
|
179
|
+
*/
|
|
180
|
+
export declare function resetConfig(): void;
|
|
181
|
+
export {};
|
|
182
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fractal Planner
|
|
3
|
+
*
|
|
4
|
+
* Main exports for the framework
|
|
5
|
+
*/
|
|
6
|
+
export * from './types/index.js';
|
|
7
|
+
export * from './config.js';
|
|
8
|
+
export * from './phases/interview.js';
|
|
9
|
+
export * from './phases/research.js';
|
|
10
|
+
export * from './phases/decomposition.js';
|
|
11
|
+
export * from './phases/planning.js';
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Clearance Check Module
|
|
3
|
+
*
|
|
4
|
+
* Evaluates if interview has gathered enough context to proceed.
|
|
5
|
+
* Adapted from oh-my-opencode clearance checklist.
|
|
6
|
+
*/
|
|
7
|
+
import type { ClearanceCheck, InterviewDraft } from '../types/index.js';
|
|
8
|
+
/**
|
|
9
|
+
* Evaluate if interview has gathered enough context to proceed
|
|
10
|
+
*/
|
|
11
|
+
export declare function evaluateClearance(draft: InterviewDraft): Promise<ClearanceCheck>;
|
|
12
|
+
//# sourceMappingURL=clearance.d.ts.map
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { Task } from '../types/index.js';
|
|
2
|
+
export type ViolationType = 'over-complexity' | 'missing-acceptance' | 'missing-files' | 'missing-tests-required' | 'missing-hints' | 'missing-guardrails' | 'subtask-count' | 'scattered-files';
|
|
3
|
+
export interface TaskViolation {
|
|
4
|
+
type: ViolationType;
|
|
5
|
+
id: string;
|
|
6
|
+
description: string;
|
|
7
|
+
parentId: string | null;
|
|
8
|
+
depth: number;
|
|
9
|
+
detail: string;
|
|
10
|
+
}
|
|
11
|
+
export interface ValidationResult {
|
|
12
|
+
valid: boolean;
|
|
13
|
+
maxComplexity: number;
|
|
14
|
+
totalLeafTasks: number;
|
|
15
|
+
violations: TaskViolation[];
|
|
16
|
+
warnings: TaskViolation[];
|
|
17
|
+
stats: {
|
|
18
|
+
maxDepth: number;
|
|
19
|
+
leafComplexityDistribution: Record<number, number>;
|
|
20
|
+
dimensionAverages?: Record<string, number>;
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Validate that the task tree conforms to all decomposer rules:
|
|
25
|
+
* - Leaf complexity <= maxComplexity
|
|
26
|
+
* - Leaves have acceptance criteria
|
|
27
|
+
* - Leaves have filesToModify metadata
|
|
28
|
+
* - Leaves have testsRequired metadata
|
|
29
|
+
* - Leaves have guardrails metadata
|
|
30
|
+
* - Non-leaf, non-root nodes have 2-5 subtasks
|
|
31
|
+
*/
|
|
32
|
+
export declare function validateTaskTree(root: Task, maxComplexity: number): ValidationResult;
|
|
33
|
+
/**
|
|
34
|
+
* Calculate total number of leaf tasks in the tree
|
|
35
|
+
*/
|
|
36
|
+
export declare function countLeafTasks(task: Task): number;
|
|
37
|
+
/**
|
|
38
|
+
* Calculate maximum depth of the task tree
|
|
39
|
+
*/
|
|
40
|
+
export declare function calculateMaxDepth(task: Task, currentDepth?: number): number;
|
|
41
|
+
//# sourceMappingURL=decomposition.d.ts.map
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Interview Phase - Iterative clarification loop
|
|
3
|
+
*
|
|
4
|
+
* Uses Claude Agent SDK to spawn an agent with access to AskUserQuestion tool.
|
|
5
|
+
* Adapted from oh-my-opencode Prometheus agent.
|
|
6
|
+
*/
|
|
7
|
+
import type { InterviewFindings, FractalPlannerConfig } from '../types/index.js';
|
|
8
|
+
/**
|
|
9
|
+
* Interview Phase - Iterative clarification loop
|
|
10
|
+
* Runs until clearance check passes
|
|
11
|
+
*/
|
|
12
|
+
export declare function runInterviewPhase(userGoal: string, planId?: string, config?: Partial<FractalPlannerConfig>): Promise<{
|
|
13
|
+
findings: InterviewFindings;
|
|
14
|
+
draftPath: string;
|
|
15
|
+
planId: string;
|
|
16
|
+
}>;
|
|
17
|
+
//# sourceMappingURL=interview.d.ts.map
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Planning Phase
|
|
3
|
+
*
|
|
4
|
+
* Creates a detailed implementation plan with strict acceptance criteria
|
|
5
|
+
* and execution ordering based on dependencies.
|
|
6
|
+
*/
|
|
7
|
+
import type { Task, PlanningResult } from '../types/index.js';
|
|
8
|
+
/**
|
|
9
|
+
* Generate a comprehensive implementation plan
|
|
10
|
+
*/
|
|
11
|
+
export declare function createImplementationPlan(rootTask: Task): Promise<PlanningResult>;
|
|
12
|
+
/**
|
|
13
|
+
* Get execution order respecting dependencies
|
|
14
|
+
* Returns tasks in topological order with optional tiebreak strategy
|
|
15
|
+
*/
|
|
16
|
+
export declare function getExecutionOrder(rootTask: Task, tiebreak?: 'risk-first' | 'easy-first' | 'document-order'): Task[];
|
|
17
|
+
/**
|
|
18
|
+
* Print a visual tree representation of the plan
|
|
19
|
+
*/
|
|
20
|
+
export declare function printPlanTree(task: Task, prefix?: string, isLast?: boolean): void;
|
|
21
|
+
//# sourceMappingURL=planning.d.ts.map
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Research Phase
|
|
3
|
+
*
|
|
4
|
+
* Conducts iterative research to understand the codebase,
|
|
5
|
+
* identify gaps, and gather requirements.
|
|
6
|
+
*/
|
|
7
|
+
import type { ResearchFindings, InterviewFindings, FractalPlannerConfig } from '../types/index.js';
|
|
8
|
+
export declare function runResearchPhase(userGoal: string, interviewFindings?: InterviewFindings, config?: Partial<FractalPlannerConfig>): Promise<ResearchFindings>;
|
|
9
|
+
//# sourceMappingURL=research.d.ts.map
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core types for Fractal Planner
|
|
3
|
+
*/
|
|
4
|
+
export interface Task {
|
|
5
|
+
id: string;
|
|
6
|
+
description: string;
|
|
7
|
+
acceptanceCriteria: string[];
|
|
8
|
+
estimatedComplexity: number;
|
|
9
|
+
dependencies: string[];
|
|
10
|
+
subtasks?: Task[];
|
|
11
|
+
status?: TaskStatus;
|
|
12
|
+
complexityDimensions?: {
|
|
13
|
+
scope: number;
|
|
14
|
+
risk: number;
|
|
15
|
+
novelty: number;
|
|
16
|
+
integration: number;
|
|
17
|
+
testing: number;
|
|
18
|
+
};
|
|
19
|
+
metadata?: {
|
|
20
|
+
filesToModify?: string[];
|
|
21
|
+
testsRequired?: boolean;
|
|
22
|
+
hints?: string[];
|
|
23
|
+
references?: string[];
|
|
24
|
+
guardrails?: string[];
|
|
25
|
+
testCommands?: string[];
|
|
26
|
+
complexitySignals?: {
|
|
27
|
+
fileScope: number;
|
|
28
|
+
coupling: number;
|
|
29
|
+
gitRisk: number;
|
|
30
|
+
testCoverage: number;
|
|
31
|
+
composite: number;
|
|
32
|
+
};
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
export type TaskStatus = 'pending' | 'in-progress' | 'completed' | 'failed';
|
|
36
|
+
export interface ResearchFindings {
|
|
37
|
+
codebasePatterns: string[];
|
|
38
|
+
existingImplementations: string[];
|
|
39
|
+
potentialChallenges: string[];
|
|
40
|
+
openQuestions: string[];
|
|
41
|
+
assumptions: string[];
|
|
42
|
+
}
|
|
43
|
+
export interface PlanningResult {
|
|
44
|
+
rootTask: Task;
|
|
45
|
+
totalTasks: number;
|
|
46
|
+
maxDepth: number;
|
|
47
|
+
estimatedDuration?: string;
|
|
48
|
+
}
|
|
49
|
+
export interface ExecutionResult {
|
|
50
|
+
taskId: string;
|
|
51
|
+
success: boolean;
|
|
52
|
+
iterations: number;
|
|
53
|
+
verificationReport: VerificationReport;
|
|
54
|
+
}
|
|
55
|
+
export interface VerificationReport {
|
|
56
|
+
verified: boolean;
|
|
57
|
+
passedCriteria: number[];
|
|
58
|
+
failedCriteria: number[];
|
|
59
|
+
feedback: string;
|
|
60
|
+
suggestions?: string[];
|
|
61
|
+
}
|
|
62
|
+
export type { FractalPlannerConfig, FractalPlannerConfigFile } from '../config.js';
|
|
63
|
+
export interface AgentMessage {
|
|
64
|
+
role: 'builder' | 'verifier' | 'orchestrator';
|
|
65
|
+
content: string;
|
|
66
|
+
timestamp: number;
|
|
67
|
+
}
|
|
68
|
+
export type IntentType = 'trivial' | 'refactoring' | 'build-from-scratch' | 'mid-sized' | 'architecture';
|
|
69
|
+
export interface QuestionStrategy {
|
|
70
|
+
researchFirst: boolean;
|
|
71
|
+
focusAreas: string[];
|
|
72
|
+
initialQuestions: string[];
|
|
73
|
+
researchPrompts: string[];
|
|
74
|
+
}
|
|
75
|
+
export interface ClearanceCheck {
|
|
76
|
+
passed: boolean;
|
|
77
|
+
checklist: {
|
|
78
|
+
coreObjectiveDefined: boolean;
|
|
79
|
+
scopeBoundariesEstablished: boolean;
|
|
80
|
+
noAmbiguities: boolean;
|
|
81
|
+
technicalApproachDecided: boolean;
|
|
82
|
+
noBlockingQuestions: boolean;
|
|
83
|
+
testStrategyIdentified: boolean;
|
|
84
|
+
};
|
|
85
|
+
gaps: ClearanceGap[];
|
|
86
|
+
}
|
|
87
|
+
export interface ClearanceGap {
|
|
88
|
+
type: 'critical' | 'minor' | 'ambiguous';
|
|
89
|
+
item: keyof ClearanceCheck['checklist'];
|
|
90
|
+
description: string;
|
|
91
|
+
suggestedQuestion?: string;
|
|
92
|
+
}
|
|
93
|
+
export interface InterviewFindings {
|
|
94
|
+
intent: IntentType;
|
|
95
|
+
userGoal: string;
|
|
96
|
+
confirmedRequirements: string[];
|
|
97
|
+
scopeInclusions: string[];
|
|
98
|
+
scopeExclusions: string[];
|
|
99
|
+
technicalDecisions: Record<string, string>;
|
|
100
|
+
constraints: string[];
|
|
101
|
+
assumptions: string[];
|
|
102
|
+
openQuestions: string[];
|
|
103
|
+
codebaseContext?: {
|
|
104
|
+
relevantFiles: string[];
|
|
105
|
+
existingPatterns: string[];
|
|
106
|
+
testStrategy?: string;
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
export interface InterviewDraft {
|
|
110
|
+
name: string;
|
|
111
|
+
planId?: string;
|
|
112
|
+
created: string;
|
|
113
|
+
lastUpdated: string;
|
|
114
|
+
findings: InterviewFindings;
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Draft Management Utility
|
|
3
|
+
*
|
|
4
|
+
* Manages persistent interview state across turns.
|
|
5
|
+
* The draft file serves as working memory during the interview loop.
|
|
6
|
+
*/
|
|
7
|
+
import type { InterviewDraft, InterviewFindings, IntentType } from '../types/index.js';
|
|
8
|
+
export declare function generateSlugPlanId(description: string): string;
|
|
9
|
+
export declare function createDraft(name: string, userGoal: string, intent: IntentType, planId?: string, plansDir?: string): Promise<{
|
|
10
|
+
draftPath: string;
|
|
11
|
+
planId: string;
|
|
12
|
+
}>;
|
|
13
|
+
/**
|
|
14
|
+
* Update draft with new findings
|
|
15
|
+
*/
|
|
16
|
+
export declare function updateDraft(draftPath: string, updates: Partial<InterviewFindings>): Promise<void>;
|
|
17
|
+
/**
|
|
18
|
+
* Read draft file
|
|
19
|
+
*/
|
|
20
|
+
export declare function readDraft(draftPath: string): Promise<InterviewDraft>;
|
|
21
|
+
//# sourceMappingURL=draft.d.ts.map
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Intent-Specific Question Strategies
|
|
3
|
+
*
|
|
4
|
+
* Adapted from oh-my-opencode interview-mode.ts
|
|
5
|
+
*/
|
|
6
|
+
import type { IntentType } from '../types/index.js';
|
|
7
|
+
/**
|
|
8
|
+
* Question strategy for interview phase
|
|
9
|
+
*/
|
|
10
|
+
export interface QuestionStrategy {
|
|
11
|
+
researchFirst: boolean;
|
|
12
|
+
focusAreas: string[];
|
|
13
|
+
initialQuestions: string[];
|
|
14
|
+
researchPrompts: string[];
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Intent-specific interview strategies
|
|
18
|
+
*/
|
|
19
|
+
export declare function getQuestionStrategy(intent: IntentType): QuestionStrategy;
|
|
20
|
+
/**
|
|
21
|
+
* Classify user intent based on goal description
|
|
22
|
+
*/
|
|
23
|
+
export declare function classifyIntent(userGoal: string): IntentType;
|
|
24
|
+
//# sourceMappingURL=question-strategies.d.ts.map
|
package/hooks/hooks.json
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
{
|
|
2
|
+
"hooks": {
|
|
3
|
+
"PostToolUse": [
|
|
4
|
+
{
|
|
5
|
+
"matcher": "Write|Edit|MultiEdit|apply_patch",
|
|
6
|
+
"hooks": [
|
|
7
|
+
{
|
|
8
|
+
"type": "command",
|
|
9
|
+
"command": "${CLAUDE_PLUGIN_ROOT}/hooks/run-comment-checker.sh",
|
|
10
|
+
"timeout": 30
|
|
11
|
+
}
|
|
12
|
+
]
|
|
13
|
+
}
|
|
14
|
+
],
|
|
15
|
+
"TeammateIdle": [
|
|
16
|
+
{
|
|
17
|
+
"hooks": [
|
|
18
|
+
{
|
|
19
|
+
"type": "command",
|
|
20
|
+
"command": "${CLAUDE_PLUGIN_ROOT}/hooks/nudge-teammate.sh",
|
|
21
|
+
"timeout": 15
|
|
22
|
+
}
|
|
23
|
+
]
|
|
24
|
+
}
|
|
25
|
+
]
|
|
26
|
+
}
|
|
27
|
+
}
|