@haoyiyin/workflow 0.2.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/README.md +168 -0
- package/SETUP.md +71 -0
- package/SKILL.md +68 -0
- package/USAGE.md +152 -0
- package/dist/bin/yi-workflow.d.ts +3 -0
- package/dist/bin/yi-workflow.d.ts.map +1 -0
- package/dist/bin/yi-workflow.js +39 -0
- package/dist/bin/yi-workflow.js.map +1 -0
- package/dist/src/agents/contracts.d.ts +120 -0
- package/dist/src/agents/contracts.d.ts.map +1 -0
- package/dist/src/agents/contracts.js +431 -0
- package/dist/src/agents/contracts.js.map +1 -0
- package/dist/src/agents/dispatcher-enhanced.d.ts +68 -0
- package/dist/src/agents/dispatcher-enhanced.d.ts.map +1 -0
- package/dist/src/agents/dispatcher-enhanced.js +290 -0
- package/dist/src/agents/dispatcher-enhanced.js.map +1 -0
- package/dist/src/agents/dispatcher.d.ts +107 -0
- package/dist/src/agents/dispatcher.d.ts.map +1 -0
- package/dist/src/agents/dispatcher.js +454 -0
- package/dist/src/agents/dispatcher.js.map +1 -0
- package/dist/src/agents/index.d.ts +11 -0
- package/dist/src/agents/index.d.ts.map +1 -0
- package/dist/src/agents/index.js +10 -0
- package/dist/src/agents/index.js.map +1 -0
- package/dist/src/agents/resilience.d.ts +86 -0
- package/dist/src/agents/resilience.d.ts.map +1 -0
- package/dist/src/agents/resilience.js +183 -0
- package/dist/src/agents/resilience.js.map +1 -0
- package/dist/src/agents/token-budget.d.ts +47 -0
- package/dist/src/agents/token-budget.d.ts.map +1 -0
- package/dist/src/agents/token-budget.js +63 -0
- package/dist/src/agents/token-budget.js.map +1 -0
- package/dist/src/agents/types.d.ts +59 -0
- package/dist/src/agents/types.d.ts.map +1 -0
- package/dist/src/agents/types.js +5 -0
- package/dist/src/agents/types.js.map +1 -0
- package/dist/src/guard/main-agent.d.ts +72 -0
- package/dist/src/guard/main-agent.d.ts.map +1 -0
- package/dist/src/guard/main-agent.js +184 -0
- package/dist/src/guard/main-agent.js.map +1 -0
- package/dist/src/hooks/builtin/index.d.ts +9 -0
- package/dist/src/hooks/builtin/index.d.ts.map +1 -0
- package/dist/src/hooks/builtin/index.js +9 -0
- package/dist/src/hooks/builtin/index.js.map +1 -0
- package/dist/src/hooks/builtin/on-error.d.ts +7 -0
- package/dist/src/hooks/builtin/on-error.d.ts.map +1 -0
- package/dist/src/hooks/builtin/on-error.js +15 -0
- package/dist/src/hooks/builtin/on-error.js.map +1 -0
- package/dist/src/hooks/builtin/post-execute.d.ts +7 -0
- package/dist/src/hooks/builtin/post-execute.d.ts.map +1 -0
- package/dist/src/hooks/builtin/post-execute.js +30 -0
- package/dist/src/hooks/builtin/post-execute.js.map +1 -0
- package/dist/src/hooks/builtin/post-plan.d.ts +7 -0
- package/dist/src/hooks/builtin/post-plan.d.ts.map +1 -0
- package/dist/src/hooks/builtin/post-plan.js +15 -0
- package/dist/src/hooks/builtin/post-plan.js.map +1 -0
- package/dist/src/hooks/builtin/pre-execute.d.ts +7 -0
- package/dist/src/hooks/builtin/pre-execute.d.ts.map +1 -0
- package/dist/src/hooks/builtin/pre-execute.js +22 -0
- package/dist/src/hooks/builtin/pre-execute.js.map +1 -0
- package/dist/src/hooks/builtin/pre-plan.d.ts +7 -0
- package/dist/src/hooks/builtin/pre-plan.d.ts.map +1 -0
- package/dist/src/hooks/builtin/pre-plan.js +19 -0
- package/dist/src/hooks/builtin/pre-plan.js.map +1 -0
- package/dist/src/hooks/index.d.ts +8 -0
- package/dist/src/hooks/index.d.ts.map +1 -0
- package/dist/src/hooks/index.js +4 -0
- package/dist/src/hooks/index.js.map +1 -0
- package/dist/src/hooks/loader.d.ts +16 -0
- package/dist/src/hooks/loader.d.ts.map +1 -0
- package/dist/src/hooks/loader.js +77 -0
- package/dist/src/hooks/loader.js.map +1 -0
- package/dist/src/hooks/manager.d.ts +20 -0
- package/dist/src/hooks/manager.d.ts.map +1 -0
- package/dist/src/hooks/manager.js +76 -0
- package/dist/src/hooks/manager.js.map +1 -0
- package/dist/src/hooks/types-enhanced.d.ts +30 -0
- package/dist/src/hooks/types-enhanced.d.ts.map +1 -0
- package/dist/src/hooks/types-enhanced.js +22 -0
- package/dist/src/hooks/types-enhanced.js.map +1 -0
- package/dist/src/hooks/types.d.ts +27 -0
- package/dist/src/hooks/types.d.ts.map +1 -0
- package/dist/src/hooks/types.js +2 -0
- package/dist/src/hooks/types.js.map +1 -0
- package/dist/src/index.d.ts +43 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +41 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/persistence/index.d.ts +7 -0
- package/dist/src/persistence/index.d.ts.map +1 -0
- package/dist/src/persistence/index.js +6 -0
- package/dist/src/persistence/index.js.map +1 -0
- package/dist/src/persistence/plan-md.d.ts +11 -0
- package/dist/src/persistence/plan-md.d.ts.map +1 -0
- package/dist/src/persistence/plan-md.js +125 -0
- package/dist/src/persistence/plan-md.js.map +1 -0
- package/dist/src/persistence/state-md.d.ts +17 -0
- package/dist/src/persistence/state-md.d.ts.map +1 -0
- package/dist/src/persistence/state-md.js +143 -0
- package/dist/src/persistence/state-md.js.map +1 -0
- package/dist/src/persistence/types.d.ts +85 -0
- package/dist/src/persistence/types.d.ts.map +1 -0
- package/dist/src/persistence/types.js +5 -0
- package/dist/src/persistence/types.js.map +1 -0
- package/dist/src/router/classifier.d.ts +108 -0
- package/dist/src/router/classifier.d.ts.map +1 -0
- package/dist/src/router/classifier.js +476 -0
- package/dist/src/router/classifier.js.map +1 -0
- package/dist/src/router/guard.d.ts +128 -0
- package/dist/src/router/guard.d.ts.map +1 -0
- package/dist/src/router/guard.js +370 -0
- package/dist/src/router/guard.js.map +1 -0
- package/dist/src/router/index.d.ts +10 -0
- package/dist/src/router/index.d.ts.map +1 -0
- package/dist/src/router/index.js +8 -0
- package/dist/src/router/index.js.map +1 -0
- package/dist/src/router/router.d.ts +58 -0
- package/dist/src/router/router.d.ts.map +1 -0
- package/dist/src/router/router.js +78 -0
- package/dist/src/router/router.js.map +1 -0
- package/dist/src/router/types.d.ts +100 -0
- package/dist/src/router/types.d.ts.map +1 -0
- package/dist/src/router/types.js +24 -0
- package/dist/src/router/types.js.map +1 -0
- package/dist/src/skills/agents-md/index.d.ts +9 -0
- package/dist/src/skills/agents-md/index.d.ts.map +1 -0
- package/dist/src/skills/agents-md/index.js +28 -0
- package/dist/src/skills/agents-md/index.js.map +1 -0
- package/dist/src/skills/execute-plan/index.d.ts +141 -0
- package/dist/src/skills/execute-plan/index.d.ts.map +1 -0
- package/dist/src/skills/execute-plan/index.js +784 -0
- package/dist/src/skills/execute-plan/index.js.map +1 -0
- package/dist/src/skills/index.d.ts +14 -0
- package/dist/src/skills/index.d.ts.map +1 -0
- package/dist/src/skills/index.js +10 -0
- package/dist/src/skills/index.js.map +1 -0
- package/dist/src/skills/quick-task/index.d.ts +75 -0
- package/dist/src/skills/quick-task/index.d.ts.map +1 -0
- package/dist/src/skills/quick-task/index.js +284 -0
- package/dist/src/skills/quick-task/index.js.map +1 -0
- package/dist/src/skills/registry.d.ts +15 -0
- package/dist/src/skills/registry.d.ts.map +1 -0
- package/dist/src/skills/registry.js +44 -0
- package/dist/src/skills/registry.js.map +1 -0
- package/dist/src/skills/review-diff/index.d.ts +96 -0
- package/dist/src/skills/review-diff/index.d.ts.map +1 -0
- package/dist/src/skills/review-diff/index.js +316 -0
- package/dist/src/skills/review-diff/index.js.map +1 -0
- package/dist/src/skills/skill.d.ts +24 -0
- package/dist/src/skills/skill.d.ts.map +1 -0
- package/dist/src/skills/skill.js +39 -0
- package/dist/src/skills/skill.js.map +1 -0
- package/dist/src/skills/systematic-debugging/index.d.ts +90 -0
- package/dist/src/skills/systematic-debugging/index.d.ts.map +1 -0
- package/dist/src/skills/systematic-debugging/index.js +305 -0
- package/dist/src/skills/systematic-debugging/index.js.map +1 -0
- package/dist/src/skills/tdd/index.d.ts +103 -0
- package/dist/src/skills/tdd/index.d.ts.map +1 -0
- package/dist/src/skills/tdd/index.js +338 -0
- package/dist/src/skills/tdd/index.js.map +1 -0
- package/dist/src/skills/to-plan/index-enhanced.d.ts +100 -0
- package/dist/src/skills/to-plan/index-enhanced.d.ts.map +1 -0
- package/dist/src/skills/to-plan/index-enhanced.js +452 -0
- package/dist/src/skills/to-plan/index-enhanced.js.map +1 -0
- package/dist/src/skills/to-plan/index.d.ts +131 -0
- package/dist/src/skills/to-plan/index.d.ts.map +1 -0
- package/dist/src/skills/to-plan/index.js +460 -0
- package/dist/src/skills/to-plan/index.js.map +1 -0
- package/dist/src/skills/types.d.ts +44 -0
- package/dist/src/skills/types.d.ts.map +1 -0
- package/dist/src/skills/types.js +2 -0
- package/dist/src/skills/types.js.map +1 -0
- package/dist/src/state/cleanup.d.ts +22 -0
- package/dist/src/state/cleanup.d.ts.map +1 -0
- package/dist/src/state/cleanup.js +87 -0
- package/dist/src/state/cleanup.js.map +1 -0
- package/dist/src/state/index.d.ts +9 -0
- package/dist/src/state/index.d.ts.map +1 -0
- package/dist/src/state/index.js +5 -0
- package/dist/src/state/index.js.map +1 -0
- package/dist/src/state/manager.d.ts +15 -0
- package/dist/src/state/manager.d.ts.map +1 -0
- package/dist/src/state/manager.js +73 -0
- package/dist/src/state/manager.js.map +1 -0
- package/dist/src/state/persistence.d.ts +13 -0
- package/dist/src/state/persistence.d.ts.map +1 -0
- package/dist/src/state/persistence.js +68 -0
- package/dist/src/state/persistence.js.map +1 -0
- package/dist/src/state/types.d.ts +26 -0
- package/dist/src/state/types.d.ts.map +1 -0
- package/dist/src/state/types.js +2 -0
- package/dist/src/state/types.js.map +1 -0
- package/dist/src/state/validator.d.ts +12 -0
- package/dist/src/state/validator.d.ts.map +1 -0
- package/dist/src/state/validator.js +56 -0
- package/dist/src/state/validator.js.map +1 -0
- package/dist/src/types.d.ts +83 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +5 -0
- package/dist/src/types.js.map +1 -0
- package/dist/src/utils/compress.d.ts +37 -0
- package/dist/src/utils/compress.d.ts.map +1 -0
- package/dist/src/utils/compress.js +298 -0
- package/dist/src/utils/compress.js.map +1 -0
- package/dist/src/utils/git.d.ts +9 -0
- package/dist/src/utils/git.d.ts.map +1 -0
- package/dist/src/utils/git.js +81 -0
- package/dist/src/utils/git.js.map +1 -0
- package/dist/src/utils/index.d.ts +7 -0
- package/dist/src/utils/index.d.ts.map +1 -0
- package/dist/src/utils/index.js +7 -0
- package/dist/src/utils/index.js.map +1 -0
- package/dist/src/utils/logger.d.ts +6 -0
- package/dist/src/utils/logger.d.ts.map +1 -0
- package/dist/src/utils/logger.js +19 -0
- package/dist/src/utils/logger.js.map +1 -0
- package/dist/src/utils/paths.d.ts +12 -0
- package/dist/src/utils/paths.d.ts.map +1 -0
- package/dist/src/utils/paths.js +44 -0
- package/dist/src/utils/paths.js.map +1 -0
- package/package.json +76 -0
- package/scripts/postinstall.js +69 -0
- package/yi-workflow.js +17 -0
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* yi-workflow - Production workflow skills for coding agents
|
|
3
|
+
*
|
|
4
|
+
* Core Architecture:
|
|
5
|
+
* 1. Main Agent = Orchestrator only (NEVER executes work)
|
|
6
|
+
* 2. Router = Classifies ALL user input and dispatches to subagents
|
|
7
|
+
* 3. Subagents = Do ALL actual work
|
|
8
|
+
* 4. Guard = Enforces Main Agent never does prohibited operations
|
|
9
|
+
*/
|
|
10
|
+
// Export hooks
|
|
11
|
+
export { HookManager, createHookManager } from './hooks/manager.js';
|
|
12
|
+
export { HookLoader, createHookLoader } from './hooks/loader.js';
|
|
13
|
+
// Export state
|
|
14
|
+
export { StateManagerImpl, createStateManager } from './state/manager.js';
|
|
15
|
+
export { FilePersistence, createPersistence } from './state/persistence.js';
|
|
16
|
+
export { validateState, isValidState, sanitizeState } from './state/validator.js';
|
|
17
|
+
export { cleanupOldStates, cleanupEmptyDirs, getStateStats } from './state/cleanup.js';
|
|
18
|
+
// Export skills
|
|
19
|
+
export { Skill } from './skills/skill.js';
|
|
20
|
+
export { Registry, createRegistry } from './skills/registry.js';
|
|
21
|
+
export { toPlanSkill } from './skills/to-plan/index.js';
|
|
22
|
+
export { executePlanSkill } from './skills/execute-plan/index.js';
|
|
23
|
+
export { quickTaskSkill } from './skills/quick-task/index.js';
|
|
24
|
+
export { reviewDiffSkill } from './skills/review-diff/index.js';
|
|
25
|
+
export { tddSkill } from './skills/tdd/index.js';
|
|
26
|
+
export { systematicDebuggingSkill } from './skills/systematic-debugging/index.js';
|
|
27
|
+
export { agentsMdSkill } from './skills/agents-md/index.js';
|
|
28
|
+
// Export agents - dispatcher
|
|
29
|
+
export { SubagentDispatcher, createDispatcher, createProcessExecutor } from './agents/dispatcher.js';
|
|
30
|
+
// Export agents - contracts
|
|
31
|
+
export { explorerContract, implementerContract, reviewerContract, debuggerContract, verifierContract, } from './agents/contracts.js';
|
|
32
|
+
// Export router
|
|
33
|
+
export { createRouter } from './router/router.js';
|
|
34
|
+
export { ROUTE_KEYWORDS, MAIN_AGENT_PROHIBITED } from './router/types.js';
|
|
35
|
+
// Export guard
|
|
36
|
+
export { createMainAgentGuard } from './guard/main-agent.js';
|
|
37
|
+
// Export utils
|
|
38
|
+
export { createLogger } from './utils/logger.js';
|
|
39
|
+
export { getCurrentBranch, getBaseBranch, isWorktree } from './utils/git.js';
|
|
40
|
+
export { getPlansPath, getStatePath } from './utils/paths.js';
|
|
41
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAkBH,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AACnE,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAQhE,eAAe;AACf,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AACzE,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC3E,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACjF,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAOtF,gBAAgB;AAChB,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AACzC,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAA;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAChD,OAAO,EAAE,wBAAwB,EAAE,MAAM,wCAAwC,CAAA;AACjF,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAA;AAQ3D,6BAA6B;AAC7B,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAA;AAkBpG,4BAA4B;AAC5B,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,uBAAuB,CAAA;AAS9B,gBAAgB;AAChB,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAEjD,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAA;AAYzE,eAAe;AACf,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AAQ5D,eAAe;AACf,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAC5E,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Persistence layer exports
|
|
3
|
+
*/
|
|
4
|
+
export { StateMdManager } from './state-md.js';
|
|
5
|
+
export { PlanMdManager } from './plan-md.js';
|
|
6
|
+
export type { Task, Wave, Plan, TaskResult, VerificationResult, DimensionResult, WorkflowState, StateMdManager as IStateMdManager, PlanMdManager as IPlanMdManager, PersistenceManager } from './types.js';
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/persistence/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAC5C,YAAY,EACV,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,UAAU,EACV,kBAAkB,EAClB,eAAe,EACf,aAAa,EACb,cAAc,IAAI,eAAe,EACjC,aAAa,IAAI,cAAc,EAC/B,kBAAkB,EACnB,MAAM,YAAY,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/persistence/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Plan, PlanMdManager as IPlanMdManager } from './types.js';
|
|
2
|
+
export declare class PlanMdManager implements IPlanMdManager {
|
|
3
|
+
private planPath;
|
|
4
|
+
constructor(planPath?: string);
|
|
5
|
+
writePlan(plan: Plan): Promise<void>;
|
|
6
|
+
readPlan(): Promise<Plan>;
|
|
7
|
+
updateTaskStatus(taskId: string, status: 'pending' | 'in_progress' | 'complete'): Promise<void>;
|
|
8
|
+
private generatePlanMarkdown;
|
|
9
|
+
private parsePlan;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=plan-md.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan-md.d.ts","sourceRoot":"","sources":["../../../src/persistence/plan-md.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,IAAI,EAAQ,aAAa,IAAI,cAAc,EAAE,MAAM,YAAY,CAAA;AAE7E,qBAAa,aAAc,YAAW,cAAc;IAClD,OAAO,CAAC,QAAQ,CAAQ;gBAEZ,QAAQ,GAAE,MAA4B;IAI5C,SAAS,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAQpC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAKzB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAG,aAAa,GAAG,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAUrG,OAAO,CAAC,oBAAoB;IA+B5B,OAAO,CAAC,SAAS;CAwElB"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PLAN.md manager for execution plan persistence
|
|
3
|
+
*/
|
|
4
|
+
import { promises as fs } from 'fs';
|
|
5
|
+
import { dirname } from 'path';
|
|
6
|
+
export class PlanMdManager {
|
|
7
|
+
planPath;
|
|
8
|
+
constructor(planPath = '.pi/state/PLAN.md') {
|
|
9
|
+
this.planPath = planPath;
|
|
10
|
+
}
|
|
11
|
+
async writePlan(plan) {
|
|
12
|
+
// Ensure directory exists
|
|
13
|
+
await fs.mkdir(dirname(this.planPath), { recursive: true });
|
|
14
|
+
const content = this.generatePlanMarkdown(plan);
|
|
15
|
+
await fs.writeFile(this.planPath, content, 'utf-8');
|
|
16
|
+
}
|
|
17
|
+
async readPlan() {
|
|
18
|
+
const content = await fs.readFile(this.planPath, 'utf-8');
|
|
19
|
+
return this.parsePlan(content);
|
|
20
|
+
}
|
|
21
|
+
async updateTaskStatus(taskId, status) {
|
|
22
|
+
const content = await fs.readFile(this.planPath, 'utf-8');
|
|
23
|
+
const statusChar = status === 'complete' ? 'x' : status === 'in_progress' ? '~' : ' ';
|
|
24
|
+
const updated = content.replace(new RegExp(`- \\[.] ${taskId}:`), `- [${statusChar}] ${taskId}:`);
|
|
25
|
+
await fs.writeFile(this.planPath, updated, 'utf-8');
|
|
26
|
+
}
|
|
27
|
+
generatePlanMarkdown(plan) {
|
|
28
|
+
return `# Execution Plan
|
|
29
|
+
|
|
30
|
+
## Goal
|
|
31
|
+
${plan.goal}
|
|
32
|
+
|
|
33
|
+
## Tasks
|
|
34
|
+
${plan.tasks.map(t => `- [ ] ${t.id}: ${t.description} (${t.estimatedComplexity})`).join('\n')}
|
|
35
|
+
|
|
36
|
+
## Dependencies
|
|
37
|
+
${Object.entries(plan.dependencies).length > 0
|
|
38
|
+
? Object.entries(plan.dependencies).map(([task, deps]) => `- ${task}: ${deps.join(', ')}`).join('\n')
|
|
39
|
+
: '- No dependencies'}
|
|
40
|
+
|
|
41
|
+
## Waves
|
|
42
|
+
${plan.waves.map(w => `- ${w.id}: ${w.tasks.join(', ')}`).join('\n')}
|
|
43
|
+
|
|
44
|
+
## Verification Criteria
|
|
45
|
+
${plan.verificationCriteria.map(c => `- ${c}`).join('\n')}
|
|
46
|
+
|
|
47
|
+
## Estimated Effort
|
|
48
|
+
- Total Tasks: ${plan.tasks.length}
|
|
49
|
+
- Parallel Waves: ${plan.waves.length}
|
|
50
|
+
- Estimated Duration: ${plan.estimatedDuration}ms
|
|
51
|
+
|
|
52
|
+
## Rationale
|
|
53
|
+
${plan.rationale}
|
|
54
|
+
`;
|
|
55
|
+
}
|
|
56
|
+
parsePlan(content) {
|
|
57
|
+
const goalMatch = content.match(/## Goal\n(.+)/);
|
|
58
|
+
const tasksMatch = content.match(/## Tasks\n([\s\S]*?)(?=\n## |$)/);
|
|
59
|
+
const depsMatch = content.match(/## Dependencies\n([\s\S]*?)(?=\n## |$)/);
|
|
60
|
+
const wavesMatch = content.match(/## Waves\n([\s\S]*?)(?=\n## |$)/);
|
|
61
|
+
const criteriaMatch = content.match(/## Verification Criteria\n([\s\S]*?)(?=\n## |$)/);
|
|
62
|
+
const durationMatch = content.match(/- Estimated Duration: (\d+)/);
|
|
63
|
+
const rationaleMatch = content.match(/## Rationale\n([\s\S]*?)(?=\n## |$)/);
|
|
64
|
+
// Parse tasks
|
|
65
|
+
const tasks = [];
|
|
66
|
+
if (tasksMatch) {
|
|
67
|
+
const taskLines = tasksMatch[1].split('\n').filter(l => l.trim().startsWith('- ['));
|
|
68
|
+
for (const line of taskLines) {
|
|
69
|
+
const match = line.match(/- \[[x\s~]]\s+(\w+):\s+(.+)\s+\((\w+)\)/);
|
|
70
|
+
if (match) {
|
|
71
|
+
tasks.push({
|
|
72
|
+
id: match[1],
|
|
73
|
+
description: match[2],
|
|
74
|
+
estimatedComplexity: match[3]
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// Parse dependencies
|
|
80
|
+
const dependencies = {};
|
|
81
|
+
if (depsMatch && depsMatch[1].trim() !== '- No dependencies') {
|
|
82
|
+
const depLines = depsMatch[1].split('\n').filter(l => l.trim().startsWith('- '));
|
|
83
|
+
for (const line of depLines) {
|
|
84
|
+
const match = line.match(/- (\w+):\s*(.+)/);
|
|
85
|
+
if (match) {
|
|
86
|
+
dependencies[match[1]] = match[2].split(',').map(s => s.trim()).filter(s => s);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
// Parse waves
|
|
91
|
+
const waves = [];
|
|
92
|
+
if (wavesMatch) {
|
|
93
|
+
const waveLines = wavesMatch[1].split('\n').filter(l => l.trim().startsWith('- '));
|
|
94
|
+
for (const line of waveLines) {
|
|
95
|
+
const match = line.match(/- (\w+):\s*(.+)/);
|
|
96
|
+
if (match) {
|
|
97
|
+
waves.push({
|
|
98
|
+
id: match[1],
|
|
99
|
+
tasks: match[2].split(',').map(s => s.trim()).filter(s => s)
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
// Parse verification criteria
|
|
105
|
+
const verificationCriteria = [];
|
|
106
|
+
if (criteriaMatch) {
|
|
107
|
+
const criteriaLines = criteriaMatch[1].split('\n').filter(l => l.trim().startsWith('- '));
|
|
108
|
+
for (const line of criteriaLines) {
|
|
109
|
+
const criterion = line.replace(/^- /, '').trim();
|
|
110
|
+
if (criterion)
|
|
111
|
+
verificationCriteria.push(criterion);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return {
|
|
115
|
+
goal: goalMatch?.[1] || '',
|
|
116
|
+
tasks,
|
|
117
|
+
dependencies,
|
|
118
|
+
waves,
|
|
119
|
+
verificationCriteria,
|
|
120
|
+
estimatedDuration: durationMatch ? parseInt(durationMatch[1], 10) : 0,
|
|
121
|
+
rationale: rationaleMatch?.[1]?.trim() || ''
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=plan-md.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan-md.js","sourceRoot":"","sources":["../../../src/persistence/plan-md.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { WorkflowState, Plan, TaskResult, VerificationResult, StateMdManager as IStateMdManager } from './types.js';
|
|
2
|
+
export declare class StateMdManager implements IStateMdManager {
|
|
3
|
+
private statePath;
|
|
4
|
+
constructor(statePath?: string);
|
|
5
|
+
initialize(goal: string): Promise<void>;
|
|
6
|
+
updatePhase(phase: WorkflowState['phase']): Promise<void>;
|
|
7
|
+
recordPlan(plan: Plan): Promise<void>;
|
|
8
|
+
recordTaskComplete(taskId: string, result: TaskResult): Promise<void>;
|
|
9
|
+
recordVerification(verification: VerificationResult): Promise<void>;
|
|
10
|
+
readCurrentState(): Promise<WorkflowState>;
|
|
11
|
+
private formatPlanSection;
|
|
12
|
+
private formatVerificationSection;
|
|
13
|
+
private replaceSection;
|
|
14
|
+
private appendToSection;
|
|
15
|
+
private parseState;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=state-md.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state-md.d.ts","sourceRoot":"","sources":["../../../src/persistence/state-md.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,UAAU,EAAE,kBAAkB,EAAE,cAAc,IAAI,eAAe,EAAE,MAAM,YAAY,CAAA;AAExH,qBAAa,cAAe,YAAW,eAAe;IACpD,OAAO,CAAC,SAAS,CAAQ;gBAEb,SAAS,GAAE,MAA6B;IAI9C,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgCvC,WAAW,CAAC,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAYzD,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAOrC,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAOrE,kBAAkB,CAAC,YAAY,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAOnE,gBAAgB,IAAI,OAAO,CAAC,aAAa,CAAC;IAKhD,OAAO,CAAC,iBAAiB;IAsBzB,OAAO,CAAC,yBAAyB;IAkBjC,OAAO,CAAC,cAAc;IAKtB,OAAO,CAAC,eAAe;IAUvB,OAAO,CAAC,UAAU;CA2BnB"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* STATE.md manager for workflow state persistence
|
|
3
|
+
*/
|
|
4
|
+
import { promises as fs } from 'fs';
|
|
5
|
+
import { dirname } from 'path';
|
|
6
|
+
export class StateMdManager {
|
|
7
|
+
statePath;
|
|
8
|
+
constructor(statePath = '.pi/state/STATE.md') {
|
|
9
|
+
this.statePath = statePath;
|
|
10
|
+
}
|
|
11
|
+
async initialize(goal) {
|
|
12
|
+
// Ensure directory exists
|
|
13
|
+
await fs.mkdir(dirname(this.statePath), { recursive: true });
|
|
14
|
+
const content = `# Workflow State
|
|
15
|
+
|
|
16
|
+
## Goal
|
|
17
|
+
${goal}
|
|
18
|
+
|
|
19
|
+
## Status
|
|
20
|
+
- Phase: planning
|
|
21
|
+
- Started: ${new Date().toISOString()}
|
|
22
|
+
- Last Updated: ${new Date().toISOString()}
|
|
23
|
+
|
|
24
|
+
## Plan
|
|
25
|
+
<!-- Populated by plan skill -->
|
|
26
|
+
|
|
27
|
+
## Completed Tasks
|
|
28
|
+
<!-- Updated during execution -->
|
|
29
|
+
|
|
30
|
+
## Verification Results
|
|
31
|
+
<!-- Populated by verify phase -->
|
|
32
|
+
|
|
33
|
+
## Token Usage
|
|
34
|
+
- Plan Phase: 0
|
|
35
|
+
- Execute Phase: 0
|
|
36
|
+
- Verify Phase: 0
|
|
37
|
+
- Total: 0 / 1000000
|
|
38
|
+
`;
|
|
39
|
+
await fs.writeFile(this.statePath, content, 'utf-8');
|
|
40
|
+
}
|
|
41
|
+
async updatePhase(phase) {
|
|
42
|
+
const content = await fs.readFile(this.statePath, 'utf-8');
|
|
43
|
+
const updated = content.replace(/- Phase: .*/, `- Phase: ${phase}`).replace(/- Last Updated: .*/, `- Last Updated: ${new Date().toISOString()}`);
|
|
44
|
+
await fs.writeFile(this.statePath, updated, 'utf-8');
|
|
45
|
+
}
|
|
46
|
+
async recordPlan(plan) {
|
|
47
|
+
const content = await fs.readFile(this.statePath, 'utf-8');
|
|
48
|
+
const planSection = this.formatPlanSection(plan);
|
|
49
|
+
const updated = this.replaceSection(content, 'Plan', planSection);
|
|
50
|
+
await fs.writeFile(this.statePath, updated, 'utf-8');
|
|
51
|
+
}
|
|
52
|
+
async recordTaskComplete(taskId, result) {
|
|
53
|
+
const content = await fs.readFile(this.statePath, 'utf-8');
|
|
54
|
+
const entry = `- [x] ${taskId}: ${result.success ? '✓' : '✗'} (${result.duration}ms) - ${result.notes || ''}\n`;
|
|
55
|
+
const updated = this.appendToSection(content, 'Completed Tasks', entry);
|
|
56
|
+
await fs.writeFile(this.statePath, updated, 'utf-8');
|
|
57
|
+
}
|
|
58
|
+
async recordVerification(verification) {
|
|
59
|
+
const content = await fs.readFile(this.statePath, 'utf-8');
|
|
60
|
+
const verificationSection = this.formatVerificationSection(verification);
|
|
61
|
+
const updated = this.replaceSection(content, 'Verification Results', verificationSection);
|
|
62
|
+
await fs.writeFile(this.statePath, updated, 'utf-8');
|
|
63
|
+
}
|
|
64
|
+
async readCurrentState() {
|
|
65
|
+
const content = await fs.readFile(this.statePath, 'utf-8');
|
|
66
|
+
return this.parseState(content);
|
|
67
|
+
}
|
|
68
|
+
formatPlanSection(plan) {
|
|
69
|
+
return `
|
|
70
|
+
### Goal
|
|
71
|
+
${plan.goal}
|
|
72
|
+
|
|
73
|
+
### Tasks (${plan.tasks.length})
|
|
74
|
+
${plan.tasks.map(t => `- ${t.id}: ${t.description} (${t.estimatedComplexity})`).join('\n')}
|
|
75
|
+
|
|
76
|
+
### Waves (${plan.waves.length})
|
|
77
|
+
${plan.waves.map(w => `- ${w.id}: ${w.tasks.join(', ')}`).join('\n')}
|
|
78
|
+
|
|
79
|
+
### Verification Criteria
|
|
80
|
+
${plan.verificationCriteria.map(c => `- ${c}`).join('\n')}
|
|
81
|
+
|
|
82
|
+
### Estimated Duration
|
|
83
|
+
${plan.estimatedDuration}ms
|
|
84
|
+
|
|
85
|
+
### Rationale
|
|
86
|
+
${plan.rationale}
|
|
87
|
+
`;
|
|
88
|
+
}
|
|
89
|
+
formatVerificationSection(verification) {
|
|
90
|
+
const results = [];
|
|
91
|
+
if (verification.dimensions.goals) {
|
|
92
|
+
results.push(`- Goals: ${verification.dimensions.goals.success ? '✓ PASS' : '✗ FAIL'}`);
|
|
93
|
+
}
|
|
94
|
+
if (verification.dimensions.quality) {
|
|
95
|
+
results.push(`- Quality: ${verification.dimensions.quality.success ? '✓ PASS' : '✗ FAIL'}`);
|
|
96
|
+
}
|
|
97
|
+
if (verification.dimensions.tests) {
|
|
98
|
+
results.push(`- Tests: ${verification.dimensions.tests.success ? '✓ PASS' : '✗ FAIL'}`);
|
|
99
|
+
}
|
|
100
|
+
results.push(`- Overall: ${verification.success ? '✓ PASSED' : '✗ FAILED'}`);
|
|
101
|
+
return `
|
|
102
|
+
${results.join('\n')}
|
|
103
|
+
`;
|
|
104
|
+
}
|
|
105
|
+
replaceSection(content, sectionName, newContent) {
|
|
106
|
+
const pattern = new RegExp(`(## ${sectionName}\\n)([\\s\\S]*?)(?=\\n## |$)`, 'g');
|
|
107
|
+
return content.replace(pattern, `## ${sectionName}\n${newContent}\n`);
|
|
108
|
+
}
|
|
109
|
+
appendToSection(content, sectionName, entry) {
|
|
110
|
+
const pattern = new RegExp(`(## ${sectionName}\\n)([\\s\\S]*?)(?=\\n## |$)`, 'g');
|
|
111
|
+
const match = pattern.exec(content);
|
|
112
|
+
if (match) {
|
|
113
|
+
const current = match[2] || '';
|
|
114
|
+
return content.replace(pattern, `## ${sectionName}\n${current}${entry}`);
|
|
115
|
+
}
|
|
116
|
+
return content;
|
|
117
|
+
}
|
|
118
|
+
parseState(content) {
|
|
119
|
+
const phaseMatch = content.match(/- Phase: (\w+)/);
|
|
120
|
+
const goalMatch = content.match(/## Goal\n(.+)/);
|
|
121
|
+
const startedMatch = content.match(/- Started: (.+)/);
|
|
122
|
+
const totalMatch = content.match(/### Tasks \((\d+)\)/);
|
|
123
|
+
const completedMatch = content.match(/## Completed Tasks\n([\s\S]*?)(?=\n## |$)/);
|
|
124
|
+
const completedTasks = completedMatch
|
|
125
|
+
? completedMatch[1].split('\n').filter(l => l.trim().startsWith('- [x]')).length
|
|
126
|
+
: 0;
|
|
127
|
+
const totalTasks = totalMatch ? parseInt(totalMatch[1], 10) : 0;
|
|
128
|
+
return {
|
|
129
|
+
goal: goalMatch?.[1] || '',
|
|
130
|
+
phase: phaseMatch?.[1] || 'planning',
|
|
131
|
+
started: startedMatch?.[1] || new Date().toISOString(),
|
|
132
|
+
lastUpdated: new Date().toISOString(),
|
|
133
|
+
totalTasks,
|
|
134
|
+
completedTasks: [],
|
|
135
|
+
tokenUsage: {
|
|
136
|
+
used: 0,
|
|
137
|
+
limit: 1000000,
|
|
138
|
+
percentage: 0
|
|
139
|
+
}
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=state-md.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state-md.js","sourceRoot":"","sources":["../../../src/persistence/state-md.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Persistence layer types for STATE.md and PLAN.md
|
|
3
|
+
*/
|
|
4
|
+
export interface Task {
|
|
5
|
+
id: string;
|
|
6
|
+
description: string;
|
|
7
|
+
estimatedComplexity: 'low' | 'medium' | 'high';
|
|
8
|
+
relatedFiles?: string[];
|
|
9
|
+
verificationCriteria?: string[];
|
|
10
|
+
}
|
|
11
|
+
export interface Wave {
|
|
12
|
+
id: string;
|
|
13
|
+
tasks: string[];
|
|
14
|
+
}
|
|
15
|
+
export interface Plan {
|
|
16
|
+
goal: string;
|
|
17
|
+
tasks: Task[];
|
|
18
|
+
dependencies: Record<string, string[]>;
|
|
19
|
+
waves: Wave[];
|
|
20
|
+
verificationCriteria: string[];
|
|
21
|
+
estimatedDuration: number;
|
|
22
|
+
rationale: string;
|
|
23
|
+
}
|
|
24
|
+
export interface TaskResult {
|
|
25
|
+
taskId: string;
|
|
26
|
+
success: boolean;
|
|
27
|
+
filesModified: string[];
|
|
28
|
+
testsAdded: string[];
|
|
29
|
+
duration: number;
|
|
30
|
+
notes: string;
|
|
31
|
+
error?: string;
|
|
32
|
+
phases?: {
|
|
33
|
+
phase: string;
|
|
34
|
+
status: string;
|
|
35
|
+
command?: string;
|
|
36
|
+
evidence?: string;
|
|
37
|
+
}[];
|
|
38
|
+
worktreePath?: string;
|
|
39
|
+
branchName?: string;
|
|
40
|
+
}
|
|
41
|
+
export interface VerificationResult {
|
|
42
|
+
success: boolean;
|
|
43
|
+
dimensions: {
|
|
44
|
+
goals?: DimensionResult;
|
|
45
|
+
quality?: DimensionResult;
|
|
46
|
+
tests?: DimensionResult;
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
export interface DimensionResult {
|
|
50
|
+
success: boolean;
|
|
51
|
+
details?: unknown;
|
|
52
|
+
evidence?: string[];
|
|
53
|
+
gaps?: string[];
|
|
54
|
+
}
|
|
55
|
+
export interface WorkflowState {
|
|
56
|
+
goal: string;
|
|
57
|
+
phase: 'planning' | 'executing' | 'verifying' | 'complete';
|
|
58
|
+
started: string;
|
|
59
|
+
lastUpdated: string;
|
|
60
|
+
totalTasks: number;
|
|
61
|
+
completedTasks: TaskResult[];
|
|
62
|
+
tokenUsage: {
|
|
63
|
+
used: number;
|
|
64
|
+
limit: number;
|
|
65
|
+
percentage: number;
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
export interface StateMdManager {
|
|
69
|
+
initialize(goal: string): Promise<void>;
|
|
70
|
+
updatePhase(phase: WorkflowState['phase']): Promise<void>;
|
|
71
|
+
recordPlan(plan: Plan): Promise<void>;
|
|
72
|
+
recordTaskComplete(taskId: string, result: TaskResult): Promise<void>;
|
|
73
|
+
recordVerification(verification: VerificationResult): Promise<void>;
|
|
74
|
+
readCurrentState(): Promise<WorkflowState>;
|
|
75
|
+
}
|
|
76
|
+
export interface PlanMdManager {
|
|
77
|
+
writePlan(plan: Plan): Promise<void>;
|
|
78
|
+
readPlan(): Promise<Plan>;
|
|
79
|
+
updateTaskStatus(taskId: string, status: 'pending' | 'in_progress' | 'complete'): Promise<void>;
|
|
80
|
+
}
|
|
81
|
+
export interface PersistenceManager {
|
|
82
|
+
state: StateMdManager;
|
|
83
|
+
plan: PlanMdManager;
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/persistence/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAA;IACV,WAAW,EAAE,MAAM,CAAA;IACnB,mBAAmB,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAA;IAC9C,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;IACvB,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAA;CAChC;AAED,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,EAAE,CAAA;CAChB;AAED,MAAM,WAAW,IAAI;IACnB,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,IAAI,EAAE,CAAA;IACb,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;IACtC,KAAK,EAAE,IAAI,EAAE,CAAA;IACb,oBAAoB,EAAE,MAAM,EAAE,CAAA;IAC9B,iBAAiB,EAAE,MAAM,CAAA;IACzB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,OAAO,CAAA;IAChB,aAAa,EAAE,MAAM,EAAE,CAAA;IACvB,UAAU,EAAE,MAAM,EAAE,CAAA;IACpB,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;IACjF,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,CAAA;IAChB,UAAU,EAAE;QACV,KAAK,CAAC,EAAE,eAAe,CAAA;QACvB,OAAO,CAAC,EAAE,eAAe,CAAA;QACzB,KAAK,CAAC,EAAE,eAAe,CAAA;KACxB,CAAA;CACF;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAA;IAChB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;IACnB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,UAAU,GAAG,WAAW,GAAG,WAAW,GAAG,UAAU,CAAA;IAC1D,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,MAAM,CAAA;IAClB,cAAc,EAAE,UAAU,EAAE,CAAA;IAC5B,UAAU,EAAE;QACV,IAAI,EAAE,MAAM,CAAA;QACZ,KAAK,EAAE,MAAM,CAAA;QACb,UAAU,EAAE,MAAM,CAAA;KACnB,CAAA;CACF;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACvC,WAAW,CAAC,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACzD,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACrC,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACrE,kBAAkB,CAAC,YAAY,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACnE,gBAAgB,IAAI,OAAO,CAAC,aAAa,CAAC,CAAA;CAC3C;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACpC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IACzB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAG,aAAa,GAAG,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAChG;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,cAAc,CAAA;IACrB,IAAI,EAAE,aAAa,CAAA;CACpB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/persistence/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Request Classifier - determines what type of subagent should handle a request.
|
|
3
|
+
*
|
|
4
|
+
* Analyzes user request text and contextual signals to produce an
|
|
5
|
+
* IntentClassification, then builds a RoutingDecision with the appropriate
|
|
6
|
+
* SubagentConfig and SubagentContract.
|
|
7
|
+
*
|
|
8
|
+
* Classification follows a priority-ordered chain:
|
|
9
|
+
* 1. execute (plan file exists / mid-execution)
|
|
10
|
+
* 2. quick-task (trivial typo/whitespace, small scoped change)
|
|
11
|
+
* 3. review (code review request)
|
|
12
|
+
* 4. debug (root cause analysis)
|
|
13
|
+
* 5. tdd (test-driven development request)
|
|
14
|
+
* 6. plan (new feature / significant change)
|
|
15
|
+
* 7. general (catch-all)
|
|
16
|
+
*/
|
|
17
|
+
import type { SubagentConfig } from '../agents/types.js';
|
|
18
|
+
import type { IntentType, IntentClassification, RoutingDecision, PermissionSet, RouterConfig } from './types.js';
|
|
19
|
+
/** Context signals used alongside the raw request text. */
|
|
20
|
+
export interface ClassificationContext {
|
|
21
|
+
/** Whether a plan file already exists for this task/feature */
|
|
22
|
+
planFileExists: boolean;
|
|
23
|
+
/** Whether the user is in the middle of executing a plan */
|
|
24
|
+
isExecutingPlan: boolean;
|
|
25
|
+
/** Whether there are uncommitted changes in the working tree */
|
|
26
|
+
hasUncommittedChanges: boolean;
|
|
27
|
+
/** The current branch name (if available) */
|
|
28
|
+
currentBranch?: string;
|
|
29
|
+
/** Any files the user explicitly mentioned */
|
|
30
|
+
mentionedFiles: string[];
|
|
31
|
+
}
|
|
32
|
+
/** Extended classification result with diagnostic metadata. */
|
|
33
|
+
export interface ClassifierResult {
|
|
34
|
+
/** The intent classification */
|
|
35
|
+
classification: IntentClassification;
|
|
36
|
+
/** The full routing decision (contract + config) */
|
|
37
|
+
routing: RoutingDecision;
|
|
38
|
+
/** Confidence score 0-1 */
|
|
39
|
+
confidence: number;
|
|
40
|
+
/** Which rule matched */
|
|
41
|
+
matchedRule: string;
|
|
42
|
+
/** Alternative classifications that were considered */
|
|
43
|
+
alternatives: Array<{
|
|
44
|
+
type: IntentType;
|
|
45
|
+
confidence: number;
|
|
46
|
+
}>;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Analyzes user requests and produces routing decisions.
|
|
50
|
+
*
|
|
51
|
+
* Classification runs through a priority-ordered chain:
|
|
52
|
+
* 1. Context-based: plan exists → 'execute'
|
|
53
|
+
* 2. Pattern-based: trivial-edit → quick-task, review, debug, tdd, plan, general
|
|
54
|
+
* 3. Fallback: 'general'
|
|
55
|
+
*
|
|
56
|
+
* Usage:
|
|
57
|
+
* ```typescript
|
|
58
|
+
* const classifier = new RequestClassifier(config)
|
|
59
|
+
* const result = classifier.classify("Fix the typo in src/utils.ts", {
|
|
60
|
+
* planFileExists: false,
|
|
61
|
+
* isExecutingPlan: false,
|
|
62
|
+
* hasUncommittedChanges: true,
|
|
63
|
+
* mentionedFiles: ['src/utils.ts'],
|
|
64
|
+
* })
|
|
65
|
+
* // result.classification.type === 'quick-task'
|
|
66
|
+
* ```
|
|
67
|
+
*/
|
|
68
|
+
export declare class RequestClassifier {
|
|
69
|
+
private readonly config;
|
|
70
|
+
/** Priority-ordered classification rules. */
|
|
71
|
+
private readonly rules;
|
|
72
|
+
constructor(config: RouterConfig);
|
|
73
|
+
/**
|
|
74
|
+
* If a plan file exists or we are mid-execution, route to execute.
|
|
75
|
+
*/
|
|
76
|
+
private checkContextExecute;
|
|
77
|
+
/**
|
|
78
|
+
* Classify a user request and produce a full routing decision.
|
|
79
|
+
*
|
|
80
|
+
* @param request - Raw user request text
|
|
81
|
+
* @param context - Contextual signals to improve accuracy
|
|
82
|
+
* @returns ClassifierResult with classification metadata and routing decision
|
|
83
|
+
*/
|
|
84
|
+
classify(request: string, context: ClassificationContext): ClassifierResult;
|
|
85
|
+
/**
|
|
86
|
+
* Classify intent only (without building a full routing decision).
|
|
87
|
+
*/
|
|
88
|
+
classifyIntent(request: string, context: ClassificationContext): IntentClassification;
|
|
89
|
+
/**
|
|
90
|
+
* Produce just the routing decision.
|
|
91
|
+
*/
|
|
92
|
+
route(request: string, context: ClassificationContext): RoutingDecision;
|
|
93
|
+
/** Get recommended token budget for an intent type. */
|
|
94
|
+
getTokenBudget(type: IntentType): number;
|
|
95
|
+
/** Get subagent role for an intent type. */
|
|
96
|
+
getSubagentRole(type: IntentType): SubagentConfig['role'];
|
|
97
|
+
/** Get default permissions for an intent type (returns a copy). */
|
|
98
|
+
getSubagentPermissions(type: IntentType): PermissionSet;
|
|
99
|
+
/**
|
|
100
|
+
* Generate a human-readable classification summary for logging.
|
|
101
|
+
*/
|
|
102
|
+
describeClassification(result: ClassifierResult): string;
|
|
103
|
+
/**
|
|
104
|
+
* Compute alternative classifications based on the winning type.
|
|
105
|
+
*/
|
|
106
|
+
private computeAlternatives;
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=classifier.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"classifier.d.ts","sourceRoot":"","sources":["../../../src/router/classifier.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AACxD,OAAO,KAAK,EACV,UAAU,EACV,oBAAoB,EACpB,eAAe,EAEf,aAAa,EACb,YAAY,EACb,MAAM,YAAY,CAAA;AAOnB,2DAA2D;AAC3D,MAAM,WAAW,qBAAqB;IACpC,+DAA+D;IAC/D,cAAc,EAAE,OAAO,CAAA;IACvB,4DAA4D;IAC5D,eAAe,EAAE,OAAO,CAAA;IACxB,gEAAgE;IAChE,qBAAqB,EAAE,OAAO,CAAA;IAC9B,6CAA6C;IAC7C,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,8CAA8C;IAC9C,cAAc,EAAE,MAAM,EAAE,CAAA;CACzB;AAED,+DAA+D;AAC/D,MAAM,WAAW,gBAAgB;IAC/B,gCAAgC;IAChC,cAAc,EAAE,oBAAoB,CAAA;IACpC,oDAAoD;IACpD,OAAO,EAAE,eAAe,CAAA;IACxB,2BAA2B;IAC3B,UAAU,EAAE,MAAM,CAAA;IAClB,yBAAyB;IACzB,WAAW,EAAE,MAAM,CAAA;IACnB,uDAAuD;IACvD,YAAY,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,UAAU,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAC9D;AAuVD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAwB;IAE/C,6CAA6C;IAC7C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAMpB;gBAEU,MAAM,EAAE,YAAY;IAchC;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAwB3B;;;;;;OAMG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,qBAAqB,GAAG,gBAAgB;IAqD3E;;OAEG;IACH,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,qBAAqB,GAAG,oBAAoB;IAIrF;;OAEG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,qBAAqB,GAAG,eAAe;IAQvE,uDAAuD;IACvD,cAAc,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM;IAIxC,4CAA4C;IAC5C,eAAe,CAAC,IAAI,EAAE,UAAU,GAAG,cAAc,CAAC,MAAM,CAAC;IAIzD,mEAAmE;IACnE,sBAAsB,CAAC,IAAI,EAAE,UAAU,GAAG,aAAa;IAQvD;;OAEG;IACH,sBAAsB,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM;IAmBxD;;OAEG;IACH,OAAO,CAAC,mBAAmB;CAa5B"}
|