@posthog/agent 1.11.0 → 1.12.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.
Files changed (55) hide show
  1. package/README.md +26 -65
  2. package/dist/index.d.ts +0 -1
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/src/adapters/types.d.ts +1 -1
  5. package/dist/src/agent.d.ts +0 -13
  6. package/dist/src/agent.d.ts.map +1 -1
  7. package/dist/src/agent.js +2 -214
  8. package/dist/src/agent.js.map +1 -1
  9. package/dist/src/agents/execution.d.ts +1 -1
  10. package/dist/src/agents/execution.js +2 -2
  11. package/dist/src/agents/execution.js.map +1 -1
  12. package/dist/src/git-manager.js +1 -1
  13. package/dist/src/git-manager.js.map +1 -1
  14. package/dist/src/posthog-api.d.ts +0 -8
  15. package/dist/src/posthog-api.d.ts.map +1 -1
  16. package/dist/src/posthog-api.js +0 -32
  17. package/dist/src/posthog-api.js.map +1 -1
  18. package/dist/src/task-progress-reporter.d.ts +0 -6
  19. package/dist/src/task-progress-reporter.d.ts.map +1 -1
  20. package/dist/src/task-progress-reporter.js +2 -26
  21. package/dist/src/task-progress-reporter.js.map +1 -1
  22. package/dist/src/template-manager.d.ts.map +1 -1
  23. package/dist/src/template-manager.js +26 -4
  24. package/dist/src/template-manager.js.map +1 -1
  25. package/dist/src/types.d.ts +0 -4
  26. package/dist/src/types.d.ts.map +1 -1
  27. package/dist/src/types.js +0 -1
  28. package/dist/src/types.js.map +1 -1
  29. package/package.json +2 -3
  30. package/src/adapters/types.ts +1 -1
  31. package/src/agent.ts +3 -234
  32. package/src/agents/execution.ts +2 -2
  33. package/src/git-manager.ts +1 -1
  34. package/src/posthog-api.ts +0 -40
  35. package/src/task-progress-reporter.ts +2 -34
  36. package/src/template-manager.ts +35 -5
  37. package/src/types.ts +0 -7
  38. package/dist/src/agent-registry.d.ts +0 -16
  39. package/dist/src/agent-registry.d.ts.map +0 -1
  40. package/dist/src/agent-registry.js +0 -62
  41. package/dist/src/agent-registry.js.map +0 -1
  42. package/dist/src/stage-executor.d.ts +0 -20
  43. package/dist/src/stage-executor.d.ts.map +0 -1
  44. package/dist/src/stage-executor.js +0 -178
  45. package/dist/src/stage-executor.js.map +0 -1
  46. package/dist/src/workflow-registry.d.ts +0 -11
  47. package/dist/src/workflow-registry.d.ts.map +0 -1
  48. package/dist/src/workflow-registry.js +0 -27
  49. package/dist/src/workflow-registry.js.map +0 -1
  50. package/dist/src/workflow-types.d.ts +0 -45
  51. package/dist/src/workflow-types.d.ts.map +0 -1
  52. package/src/agent-registry.ts +0 -65
  53. package/src/stage-executor.ts +0 -210
  54. package/src/workflow-registry.ts +0 -30
  55. package/src/workflow-types.ts +0 -52
@@ -1,20 +0,0 @@
1
- import { Logger } from './utils/logger.js';
2
- import { AgentRegistry } from './agent-registry.js';
3
- import type { AgentEvent, Task, McpServerConfig } from './types.js';
4
- import type { WorkflowStage, WorkflowStageExecutionResult, WorkflowExecutionOptions } from './workflow-types.js';
5
- import { PromptBuilder } from './prompt-builder.js';
6
- export declare class StageExecutor {
7
- private registry;
8
- private logger;
9
- private adapter;
10
- private promptBuilder;
11
- private eventHandler?;
12
- private mcpServers?;
13
- constructor(registry: AgentRegistry, logger: Logger, promptBuilder?: PromptBuilder, eventHandler?: (event: AgentEvent) => void, mcpServers?: Record<string, McpServerConfig>);
14
- setEventHandler(handler?: (event: AgentEvent) => void): void;
15
- execute(task: Task, stage: WorkflowStage, options: WorkflowExecutionOptions): Promise<WorkflowStageExecutionResult>;
16
- private runResearch;
17
- private runPlanning;
18
- private runExecution;
19
- }
20
- //# sourceMappingURL=stage-executor.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"stage-executor.d.ts","sourceRoot":"","sources":["../../src/stage-executor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAE3C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AACpE,OAAO,KAAK,EAAE,aAAa,EAAE,4BAA4B,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAIjH,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAgB;IAChC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,YAAY,CAAC,CAA8B;IACnD,OAAO,CAAC,UAAU,CAAC,CAAkC;gBAGnD,QAAQ,EAAE,aAAa,EACvB,MAAM,EAAE,MAAM,EACd,aAAa,CAAC,EAAE,aAAa,EAC7B,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,EAC1C,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC;IAc9C,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,GAAG,IAAI;IAItD,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,wBAAwB,GAAG,OAAO,CAAC,4BAA4B,CAAC;YAiC3G,WAAW;YA+CX,WAAW;YA+CX,YAAY;CAwC3B"}
@@ -1,178 +0,0 @@
1
- import { query } from '@anthropic-ai/claude-agent-sdk';
2
- import './utils/logger.js';
3
- import { ClaudeAdapter } from './adapters/claude/claude-adapter.js';
4
- import { RESEARCH_SYSTEM_PROMPT } from './agents/research.js';
5
- import { PLANNING_SYSTEM_PROMPT } from './agents/planning.js';
6
- import { EXECUTION_SYSTEM_PROMPT } from './agents/execution.js';
7
- import { PromptBuilder } from './prompt-builder.js';
8
-
9
- class StageExecutor {
10
- registry;
11
- logger;
12
- adapter;
13
- promptBuilder;
14
- eventHandler;
15
- mcpServers;
16
- constructor(registry, logger, promptBuilder, eventHandler, mcpServers) {
17
- this.registry = registry;
18
- this.logger = logger.child('StageExecutor');
19
- this.adapter = new ClaudeAdapter();
20
- this.promptBuilder = promptBuilder || new PromptBuilder({
21
- getTaskFiles: async () => [],
22
- generatePlanTemplate: async () => '',
23
- logger,
24
- });
25
- this.eventHandler = eventHandler;
26
- this.mcpServers = mcpServers;
27
- }
28
- setEventHandler(handler) {
29
- this.eventHandler = handler;
30
- }
31
- async execute(task, stage, options) {
32
- const isManual = stage.is_manual_only === true;
33
- if (isManual) {
34
- this.logger.info('Manual stage detected; skipping agent execution', { stage: stage.key });
35
- return { results: [] };
36
- }
37
- const inferredAgent = stage.key.toLowerCase().includes('plan') ? 'planning_basic' : 'code_generation';
38
- const agentName = stage.agent_name || inferredAgent;
39
- const agent = this.registry.getAgent(agentName);
40
- if (!agent) {
41
- throw new Error(`Unknown agent '${agentName}' for stage '${stage.key}'`);
42
- }
43
- const permissionMode = options.permissionMode || 'acceptEdits';
44
- const cwd = options.repositoryPath || process.cwd();
45
- switch (agent.agent_type) {
46
- case 'research':
47
- return this.runResearch(task, cwd, options, stage.key);
48
- case 'planning':
49
- return this.runPlanning(task, cwd, options, stage.key);
50
- case 'execution':
51
- return this.runExecution(task, cwd, permissionMode, options, stage.key);
52
- case 'review': // TODO: Implement review
53
- case 'testing': // TODO: Implement testing
54
- default:
55
- // throw new Error(`Unsupported agent type: ${agent.agent_type}`);
56
- console.warn(`Unsupported agent type: ${agent.agent_type}`);
57
- return { results: [] };
58
- }
59
- }
60
- async runResearch(task, cwd, options, stageKey) {
61
- const contextPrompt = await this.promptBuilder.buildResearchPrompt(task, cwd);
62
- let prompt = RESEARCH_SYSTEM_PROMPT + '\n\n' + contextPrompt;
63
- const stageOverrides = options.stageOverrides?.[stageKey] || options.stageOverrides?.['research'];
64
- const mergedOverrides = {
65
- ...(options.queryOverrides || {}),
66
- ...(stageOverrides?.queryOverrides || {}),
67
- };
68
- const baseOptions = {
69
- model: 'claude-sonnet-4-5-20250929',
70
- cwd,
71
- permissionMode: 'plan',
72
- settingSources: ['local'],
73
- mcpServers: this.mcpServers
74
- };
75
- const response = query({
76
- prompt,
77
- options: { ...baseOptions, ...mergedOverrides },
78
- });
79
- let research = '';
80
- for await (const message of response) {
81
- // Emit raw SDK event first
82
- this.eventHandler?.(this.adapter.createRawSDKEvent(message));
83
- // Then emit transformed event
84
- const transformed = this.adapter.transform(message);
85
- if (transformed) {
86
- if (transformed.type !== 'token') {
87
- this.logger.debug('Research event', { type: transformed.type });
88
- }
89
- this.eventHandler?.(transformed);
90
- }
91
- if (message.type === 'assistant' && message.message?.content) {
92
- for (const c of message.message.content) {
93
- if (c.type === 'text' && c.text)
94
- research += c.text + '\n';
95
- }
96
- }
97
- }
98
- return { plan: research.trim() }; // Return as 'plan' field to match existing interface
99
- }
100
- async runPlanning(task, cwd, options, stageKey) {
101
- const contextPrompt = await this.promptBuilder.buildPlanningPrompt(task, cwd);
102
- let prompt = PLANNING_SYSTEM_PROMPT + '\n\n' + contextPrompt;
103
- const stageOverrides = options.stageOverrides?.[stageKey] || options.stageOverrides?.['plan'];
104
- const mergedOverrides = {
105
- ...(options.queryOverrides || {}),
106
- ...(stageOverrides?.queryOverrides || {}),
107
- };
108
- const baseOptions = {
109
- model: 'claude-sonnet-4-5-20250929',
110
- cwd,
111
- permissionMode: 'plan',
112
- settingSources: ['local'],
113
- mcpServers: this.mcpServers
114
- };
115
- const response = query({
116
- prompt,
117
- options: { ...baseOptions, ...mergedOverrides },
118
- });
119
- let plan = '';
120
- for await (const message of response) {
121
- // Emit raw SDK event first
122
- this.eventHandler?.(this.adapter.createRawSDKEvent(message));
123
- // Then emit transformed event
124
- const transformed = this.adapter.transform(message);
125
- if (transformed) {
126
- if (transformed.type !== 'token') {
127
- this.logger.debug('Planning event', { type: transformed.type });
128
- }
129
- this.eventHandler?.(transformed);
130
- }
131
- if (message.type === 'assistant' && message.message?.content) {
132
- for (const c of message.message.content) {
133
- if (c.type === 'text' && c.text)
134
- plan += c.text + '\n';
135
- }
136
- }
137
- }
138
- return { plan: plan.trim() };
139
- }
140
- async runExecution(task, cwd, permissionMode, options, stageKey) {
141
- const contextPrompt = await this.promptBuilder.buildExecutionPrompt(task, cwd);
142
- let prompt = EXECUTION_SYSTEM_PROMPT + '\n\n' + contextPrompt;
143
- const stageOverrides = options.stageOverrides?.[stageKey];
144
- const mergedOverrides = {
145
- ...(options.queryOverrides || {}),
146
- ...(stageOverrides?.queryOverrides || {}),
147
- };
148
- const baseOptions = {
149
- model: 'claude-sonnet-4-5-20250929',
150
- cwd,
151
- permissionMode,
152
- settingSources: ['local'],
153
- mcpServers: this.mcpServers
154
- };
155
- const response = query({
156
- prompt,
157
- options: { ...baseOptions, ...mergedOverrides },
158
- });
159
- const results = [];
160
- for await (const message of response) {
161
- // Emit raw SDK event first
162
- this.eventHandler?.(this.adapter.createRawSDKEvent(message));
163
- // Then emit transformed event
164
- const transformed = this.adapter.transform(message);
165
- if (transformed) {
166
- if (transformed.type !== 'token') {
167
- this.logger.debug('Execution event', { type: transformed.type });
168
- }
169
- this.eventHandler?.(transformed);
170
- }
171
- results.push(message);
172
- }
173
- return { results };
174
- }
175
- }
176
-
177
- export { StageExecutor };
178
- //# sourceMappingURL=stage-executor.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"stage-executor.js","sources":["../../src/stage-executor.ts"],"sourcesContent":["import { query } from '@anthropic-ai/claude-agent-sdk';\nimport { Logger } from './utils/logger.js';\nimport { ClaudeAdapter } from './adapters/claude/claude-adapter.js';\nimport { AgentRegistry } from './agent-registry.js';\nimport type { AgentEvent, Task, McpServerConfig } from './types.js';\nimport type { WorkflowStage, WorkflowStageExecutionResult, WorkflowExecutionOptions } from './workflow-types.js';\nimport { RESEARCH_SYSTEM_PROMPT } from './agents/research.js';\nimport { PLANNING_SYSTEM_PROMPT } from './agents/planning.js';\nimport { EXECUTION_SYSTEM_PROMPT } from './agents/execution.js';\nimport { PromptBuilder } from './prompt-builder.js';\n\nexport class StageExecutor {\n private registry: AgentRegistry;\n private logger: Logger;\n private adapter: ClaudeAdapter;\n private promptBuilder: PromptBuilder;\n private eventHandler?: (event: AgentEvent) => void;\n private mcpServers?: Record<string, McpServerConfig>;\n\n constructor(\n registry: AgentRegistry,\n logger: Logger,\n promptBuilder?: PromptBuilder,\n eventHandler?: (event: AgentEvent) => void,\n mcpServers?: Record<string, McpServerConfig>,\n ) {\n this.registry = registry;\n this.logger = logger.child('StageExecutor');\n this.adapter = new ClaudeAdapter();\n this.promptBuilder = promptBuilder || new PromptBuilder({\n getTaskFiles: async () => [],\n generatePlanTemplate: async () => '',\n logger,\n });\n this.eventHandler = eventHandler;\n this.mcpServers = mcpServers;\n }\n\n setEventHandler(handler?: (event: AgentEvent) => void): void {\n this.eventHandler = handler;\n }\n\n async execute(task: Task, stage: WorkflowStage, options: WorkflowExecutionOptions): Promise<WorkflowStageExecutionResult> {\n const isManual = stage.is_manual_only === true;\n if (isManual) {\n this.logger.info('Manual stage detected; skipping agent execution', { stage: stage.key });\n return { results: [] };\n }\n\n const inferredAgent = stage.key.toLowerCase().includes('plan') ? 'planning_basic' : 'code_generation';\n const agentName = stage.agent_name || inferredAgent;\n const agent = this.registry.getAgent(agentName);\n if (!agent) {\n throw new Error(`Unknown agent '${agentName}' for stage '${stage.key}'`);\n }\n\n const permissionMode = (options.permissionMode as any) || 'acceptEdits';\n const cwd = options.repositoryPath || process.cwd();\n\n switch (agent.agent_type) {\n case 'research':\n return this.runResearch(task, cwd, options, stage.key);\n case 'planning':\n return this.runPlanning(task, cwd, options, stage.key);\n case 'execution':\n return this.runExecution(task, cwd, permissionMode, options, stage.key);\n case 'review': // TODO: Implement review\n case 'testing': // TODO: Implement testing\n default:\n // throw new Error(`Unsupported agent type: ${agent.agent_type}`);\n console.warn(`Unsupported agent type: ${agent.agent_type}`);\n return { results: [] };\n }\n }\n\n private async runResearch(task: Task, cwd: string, options: WorkflowExecutionOptions, stageKey: string): Promise<WorkflowStageExecutionResult> {\n const contextPrompt = await this.promptBuilder.buildResearchPrompt(task, cwd);\n let prompt = RESEARCH_SYSTEM_PROMPT + '\\n\\n' + contextPrompt;\n\n const stageOverrides = options.stageOverrides?.[stageKey] || options.stageOverrides?.['research'];\n const mergedOverrides = {\n ...(options.queryOverrides || {}),\n ...(stageOverrides?.queryOverrides || {}),\n } as Record<string, any>;\n\n const baseOptions: Record<string, any> = {\n model: 'claude-sonnet-4-5-20250929',\n cwd,\n permissionMode: 'plan',\n settingSources: ['local'],\n mcpServers: this.mcpServers\n };\n\n const response = query({\n prompt,\n options: { ...baseOptions, ...mergedOverrides },\n });\n\n let research = '';\n for await (const message of response) {\n // Emit raw SDK event first\n this.eventHandler?.(this.adapter.createRawSDKEvent(message));\n\n // Then emit transformed event\n const transformed = this.adapter.transform(message);\n if (transformed) {\n if (transformed.type !== 'token') {\n this.logger.debug('Research event', { type: transformed.type });\n }\n this.eventHandler?.(transformed);\n }\n\n if (message.type === 'assistant' && message.message?.content) {\n for (const c of message.message.content) {\n if (c.type === 'text' && c.text) research += c.text + '\\n';\n }\n }\n }\n\n return { plan: research.trim() }; // Return as 'plan' field to match existing interface\n }\n\n private async runPlanning(task: Task, cwd: string, options: WorkflowExecutionOptions, stageKey: string): Promise<WorkflowStageExecutionResult> {\n const contextPrompt = await this.promptBuilder.buildPlanningPrompt(task, cwd);\n let prompt = PLANNING_SYSTEM_PROMPT + '\\n\\n' + contextPrompt;\n\n const stageOverrides = options.stageOverrides?.[stageKey] || options.stageOverrides?.['plan'];\n const mergedOverrides = {\n ...(options.queryOverrides || {}),\n ...(stageOverrides?.queryOverrides || {}),\n } as Record<string, any>;\n\n const baseOptions: Record<string, any> = {\n model: 'claude-sonnet-4-5-20250929',\n cwd,\n permissionMode: 'plan',\n settingSources: ['local'],\n mcpServers: this.mcpServers\n };\n\n const response = query({\n prompt,\n options: { ...baseOptions, ...mergedOverrides },\n });\n\n let plan = '';\n for await (const message of response) {\n // Emit raw SDK event first\n this.eventHandler?.(this.adapter.createRawSDKEvent(message));\n\n // Then emit transformed event\n const transformed = this.adapter.transform(message);\n if (transformed) {\n if (transformed.type !== 'token') {\n this.logger.debug('Planning event', { type: transformed.type });\n }\n this.eventHandler?.(transformed);\n }\n\n if (message.type === 'assistant' && message.message?.content) {\n for (const c of message.message.content) {\n if (c.type === 'text' && c.text) plan += c.text + '\\n';\n }\n }\n }\n\n return { plan: plan.trim() };\n }\n\n private async runExecution(task: Task, cwd: string, permissionMode: WorkflowExecutionOptions['permissionMode'], options: WorkflowExecutionOptions, stageKey: string): Promise<WorkflowStageExecutionResult> {\n const contextPrompt = await this.promptBuilder.buildExecutionPrompt(task, cwd);\n let prompt = EXECUTION_SYSTEM_PROMPT + '\\n\\n' + contextPrompt;\n\n const stageOverrides = options.stageOverrides?.[stageKey];\n const mergedOverrides = {\n ...(options.queryOverrides || {}),\n ...(stageOverrides?.queryOverrides || {}),\n } as Record<string, any>;\n\n const baseOptions: Record<string, any> = {\n model: 'claude-sonnet-4-5-20250929',\n cwd,\n permissionMode,\n settingSources: ['local'],\n mcpServers: this.mcpServers\n };\n\n const response = query({\n prompt,\n options: { ...baseOptions, ...mergedOverrides },\n });\n const results: any[] = [];\n for await (const message of response) {\n // Emit raw SDK event first\n this.eventHandler?.(this.adapter.createRawSDKEvent(message));\n\n // Then emit transformed event\n const transformed = this.adapter.transform(message);\n if (transformed) {\n if (transformed.type !== 'token') {\n this.logger.debug('Execution event', { type: transformed.type });\n }\n this.eventHandler?.(transformed);\n }\n\n results.push(message);\n }\n return { results };\n }\n}\n"],"names":[],"mappings":"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"}
@@ -1,11 +0,0 @@
1
- import type { WorkflowDefinition } from './workflow-types.js';
2
- import { PostHogAPIClient } from './posthog-api.js';
3
- export declare class WorkflowRegistry {
4
- private workflowsById;
5
- private apiClient?;
6
- constructor(apiClient?: PostHogAPIClient, staticDefinitions?: WorkflowDefinition[]);
7
- loadWorkflows(): Promise<void>;
8
- getWorkflow(id: string): WorkflowDefinition | undefined;
9
- listWorkflows(): WorkflowDefinition[];
10
- }
11
- //# sourceMappingURL=workflow-registry.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"workflow-registry.d.ts","sourceRoot":"","sources":["../../src/workflow-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,aAAa,CAA8C;IACnE,OAAO,CAAC,SAAS,CAAC,CAAmB;gBAEzB,SAAS,CAAC,EAAE,gBAAgB,EAAE,iBAAiB,CAAC,EAAE,kBAAkB,EAAE;IAO5E,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAOpC,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS;IAIvD,aAAa,IAAI,kBAAkB,EAAE;CAGtC"}
@@ -1,27 +0,0 @@
1
- class WorkflowRegistry {
2
- workflowsById = new Map();
3
- apiClient;
4
- constructor(apiClient, staticDefinitions) {
5
- this.apiClient = apiClient;
6
- if (staticDefinitions) {
7
- for (const w of staticDefinitions)
8
- this.workflowsById.set(w.id, w);
9
- }
10
- }
11
- async loadWorkflows() {
12
- if (this.apiClient) {
13
- const workflows = await this.apiClient.listWorkflows();
14
- for (const w of workflows)
15
- this.workflowsById.set(w.id, w);
16
- }
17
- }
18
- getWorkflow(id) {
19
- return this.workflowsById.get(id);
20
- }
21
- listWorkflows() {
22
- return Array.from(this.workflowsById.values());
23
- }
24
- }
25
-
26
- export { WorkflowRegistry };
27
- //# sourceMappingURL=workflow-registry.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"workflow-registry.js","sources":["../../src/workflow-registry.ts"],"sourcesContent":["import type { WorkflowDefinition } from './workflow-types.js';\nimport { PostHogAPIClient } from './posthog-api.js';\n\nexport class WorkflowRegistry {\n private workflowsById: Map<string, WorkflowDefinition> = new Map();\n private apiClient?: PostHogAPIClient;\n\n constructor(apiClient?: PostHogAPIClient, staticDefinitions?: WorkflowDefinition[]) {\n this.apiClient = apiClient;\n if (staticDefinitions) {\n for (const w of staticDefinitions) this.workflowsById.set(w.id, w);\n }\n }\n\n async loadWorkflows(): Promise<void> {\n if (this.apiClient) {\n const workflows = await this.apiClient.listWorkflows();\n for (const w of workflows) this.workflowsById.set(w.id, w);\n }\n }\n\n getWorkflow(id: string): WorkflowDefinition | undefined {\n return this.workflowsById.get(id);\n }\n\n listWorkflows(): WorkflowDefinition[] {\n return Array.from(this.workflowsById.values());\n }\n}\n\n"],"names":[],"mappings":"MAGa,gBAAgB,CAAA;AACnB,IAAA,aAAa,GAAoC,IAAI,GAAG,EAAE;AAC1D,IAAA,SAAS;IAEjB,WAAA,CAAY,SAA4B,EAAE,iBAAwC,EAAA;AAChF,QAAA,IAAI,CAAC,SAAS,GAAG,SAAS;QAC1B,IAAI,iBAAiB,EAAE;YACrB,KAAK,MAAM,CAAC,IAAI,iBAAiB;gBAAE,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACpE;IACF;AAEA,IAAA,MAAM,aAAa,GAAA;AACjB,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE;YAClB,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE;YACtD,KAAK,MAAM,CAAC,IAAI,SAAS;gBAAE,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC5D;IACF;AAEA,IAAA,WAAW,CAAC,EAAU,EAAA;QACpB,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC;IACnC;IAEA,aAAa,GAAA;QACX,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC;IAChD;AACD;;;;"}
@@ -1,45 +0,0 @@
1
- import type { PermissionMode, AgentEvent } from './types.js';
2
- export type AgentType = 'research' | 'planning' | 'execution' | 'review' | 'testing';
3
- export interface AgentDefinition {
4
- id: string;
5
- name: string;
6
- agent_type: AgentType;
7
- description?: string;
8
- config?: Record<string, any>;
9
- }
10
- export interface WorkflowStage {
11
- id: string;
12
- key: string;
13
- name: string;
14
- position: number;
15
- agent_name?: string | null;
16
- is_manual_only?: boolean;
17
- color?: string;
18
- }
19
- export interface WorkflowDefinition {
20
- id: string;
21
- name: string;
22
- description?: string;
23
- stages: WorkflowStage[];
24
- }
25
- export interface StageOverrideOptions {
26
- permissionMode?: PermissionMode;
27
- createPlanningBranch?: boolean;
28
- createImplementationBranch?: boolean;
29
- openPullRequest?: boolean;
30
- queryOverrides?: Record<string, any>;
31
- }
32
- export interface WorkflowStageExecutionResult {
33
- plan?: string;
34
- results?: any[];
35
- }
36
- export interface WorkflowExecutionOptions {
37
- repositoryPath?: string;
38
- permissionMode?: PermissionMode;
39
- autoProgress?: boolean;
40
- resumeFromCurrentStage?: boolean;
41
- stageOverrides?: Record<string, StageOverrideOptions>;
42
- onEvent?: (event: AgentEvent) => void;
43
- queryOverrides?: Record<string, any>;
44
- }
45
- //# sourceMappingURL=workflow-types.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"workflow-types.d.ts","sourceRoot":"","sources":["../../src/workflow-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7D,MAAM,MAAM,SAAS,GAAG,UAAU,GAAG,UAAU,GAAG,WAAW,GAAG,QAAQ,GAAG,SAAS,CAAC;AAErF,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,SAAS,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,aAAa,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,oBAAoB;IACnC,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,0BAA0B,CAAC,EAAE,OAAO,CAAC;IACrC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CACtC;AAED,MAAM,WAAW,4BAA4B;IAC3C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,wBAAwB;IACvC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC;IACtD,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;IACtC,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CACtC"}
@@ -1,65 +0,0 @@
1
- import type { AgentDefinition, AgentType } from './workflow-types.js';
2
-
3
- export class AgentRegistry {
4
- private agentsByName: Map<string, AgentDefinition> = new Map();
5
-
6
- constructor(definitions?: AgentDefinition[]) {
7
- if (definitions) {
8
- for (const def of definitions) this.register(def);
9
- } else {
10
- for (const def of AgentRegistry.getDefaultAgents()) this.register(def);
11
- }
12
- }
13
-
14
- static getDefaultAgents(): AgentDefinition[] {
15
- return [
16
- {
17
- id: 'research',
18
- name: 'research',
19
- agent_type: 'research',
20
- description: 'Explore codebase and generate clarifying questions',
21
- },
22
- {
23
- id: 'planning',
24
- name: 'planning',
25
- agent_type: 'planning',
26
- description: 'Analyze repo and produce implementation plan',
27
- },
28
- {
29
- id: 'code_generation',
30
- name: 'code_generation',
31
- agent_type: 'execution',
32
- description: 'Implements code changes using Claude SDK',
33
- },
34
- {
35
- id: 'review',
36
- name: 'review',
37
- agent_type: 'review',
38
- description: 'Reviews changes and suggests fixes',
39
- },
40
- {
41
- id: 'testing',
42
- name: 'testing',
43
- agent_type: 'testing',
44
- description: 'Runs tests and reports results',
45
- },
46
- ];
47
- }
48
-
49
- register(def: AgentDefinition): void {
50
- this.agentsByName.set(def.name, def);
51
- }
52
-
53
- getAgent(name: string): AgentDefinition | undefined {
54
- return this.agentsByName.get(name);
55
- }
56
-
57
- listAgents(): AgentDefinition[] {
58
- return Array.from(this.agentsByName.values());
59
- }
60
-
61
- exportForPostHog(): { id: string; name: string; agent_type: AgentType; description?: string }[] {
62
- return this.listAgents().map(({ id, name, agent_type, description }) => ({ id, name, agent_type, description }));
63
- }
64
- }
65
-
@@ -1,210 +0,0 @@
1
- import { query } from '@anthropic-ai/claude-agent-sdk';
2
- import { Logger } from './utils/logger.js';
3
- import { ClaudeAdapter } from './adapters/claude/claude-adapter.js';
4
- import { AgentRegistry } from './agent-registry.js';
5
- import type { AgentEvent, Task, McpServerConfig } from './types.js';
6
- import type { WorkflowStage, WorkflowStageExecutionResult, WorkflowExecutionOptions } from './workflow-types.js';
7
- import { RESEARCH_SYSTEM_PROMPT } from './agents/research.js';
8
- import { PLANNING_SYSTEM_PROMPT } from './agents/planning.js';
9
- import { EXECUTION_SYSTEM_PROMPT } from './agents/execution.js';
10
- import { PromptBuilder } from './prompt-builder.js';
11
-
12
- export class StageExecutor {
13
- private registry: AgentRegistry;
14
- private logger: Logger;
15
- private adapter: ClaudeAdapter;
16
- private promptBuilder: PromptBuilder;
17
- private eventHandler?: (event: AgentEvent) => void;
18
- private mcpServers?: Record<string, McpServerConfig>;
19
-
20
- constructor(
21
- registry: AgentRegistry,
22
- logger: Logger,
23
- promptBuilder?: PromptBuilder,
24
- eventHandler?: (event: AgentEvent) => void,
25
- mcpServers?: Record<string, McpServerConfig>,
26
- ) {
27
- this.registry = registry;
28
- this.logger = logger.child('StageExecutor');
29
- this.adapter = new ClaudeAdapter();
30
- this.promptBuilder = promptBuilder || new PromptBuilder({
31
- getTaskFiles: async () => [],
32
- generatePlanTemplate: async () => '',
33
- logger,
34
- });
35
- this.eventHandler = eventHandler;
36
- this.mcpServers = mcpServers;
37
- }
38
-
39
- setEventHandler(handler?: (event: AgentEvent) => void): void {
40
- this.eventHandler = handler;
41
- }
42
-
43
- async execute(task: Task, stage: WorkflowStage, options: WorkflowExecutionOptions): Promise<WorkflowStageExecutionResult> {
44
- const isManual = stage.is_manual_only === true;
45
- if (isManual) {
46
- this.logger.info('Manual stage detected; skipping agent execution', { stage: stage.key });
47
- return { results: [] };
48
- }
49
-
50
- const inferredAgent = stage.key.toLowerCase().includes('plan') ? 'planning_basic' : 'code_generation';
51
- const agentName = stage.agent_name || inferredAgent;
52
- const agent = this.registry.getAgent(agentName);
53
- if (!agent) {
54
- throw new Error(`Unknown agent '${agentName}' for stage '${stage.key}'`);
55
- }
56
-
57
- const permissionMode = (options.permissionMode as any) || 'acceptEdits';
58
- const cwd = options.repositoryPath || process.cwd();
59
-
60
- switch (agent.agent_type) {
61
- case 'research':
62
- return this.runResearch(task, cwd, options, stage.key);
63
- case 'planning':
64
- return this.runPlanning(task, cwd, options, stage.key);
65
- case 'execution':
66
- return this.runExecution(task, cwd, permissionMode, options, stage.key);
67
- case 'review': // TODO: Implement review
68
- case 'testing': // TODO: Implement testing
69
- default:
70
- // throw new Error(`Unsupported agent type: ${agent.agent_type}`);
71
- console.warn(`Unsupported agent type: ${agent.agent_type}`);
72
- return { results: [] };
73
- }
74
- }
75
-
76
- private async runResearch(task: Task, cwd: string, options: WorkflowExecutionOptions, stageKey: string): Promise<WorkflowStageExecutionResult> {
77
- const contextPrompt = await this.promptBuilder.buildResearchPrompt(task, cwd);
78
- let prompt = RESEARCH_SYSTEM_PROMPT + '\n\n' + contextPrompt;
79
-
80
- const stageOverrides = options.stageOverrides?.[stageKey] || options.stageOverrides?.['research'];
81
- const mergedOverrides = {
82
- ...(options.queryOverrides || {}),
83
- ...(stageOverrides?.queryOverrides || {}),
84
- } as Record<string, any>;
85
-
86
- const baseOptions: Record<string, any> = {
87
- model: 'claude-sonnet-4-5-20250929',
88
- cwd,
89
- permissionMode: 'plan',
90
- settingSources: ['local'],
91
- mcpServers: this.mcpServers
92
- };
93
-
94
- const response = query({
95
- prompt,
96
- options: { ...baseOptions, ...mergedOverrides },
97
- });
98
-
99
- let research = '';
100
- for await (const message of response) {
101
- // Emit raw SDK event first
102
- this.eventHandler?.(this.adapter.createRawSDKEvent(message));
103
-
104
- // Then emit transformed event
105
- const transformed = this.adapter.transform(message);
106
- if (transformed) {
107
- if (transformed.type !== 'token') {
108
- this.logger.debug('Research event', { type: transformed.type });
109
- }
110
- this.eventHandler?.(transformed);
111
- }
112
-
113
- if (message.type === 'assistant' && message.message?.content) {
114
- for (const c of message.message.content) {
115
- if (c.type === 'text' && c.text) research += c.text + '\n';
116
- }
117
- }
118
- }
119
-
120
- return { plan: research.trim() }; // Return as 'plan' field to match existing interface
121
- }
122
-
123
- private async runPlanning(task: Task, cwd: string, options: WorkflowExecutionOptions, stageKey: string): Promise<WorkflowStageExecutionResult> {
124
- const contextPrompt = await this.promptBuilder.buildPlanningPrompt(task, cwd);
125
- let prompt = PLANNING_SYSTEM_PROMPT + '\n\n' + contextPrompt;
126
-
127
- const stageOverrides = options.stageOverrides?.[stageKey] || options.stageOverrides?.['plan'];
128
- const mergedOverrides = {
129
- ...(options.queryOverrides || {}),
130
- ...(stageOverrides?.queryOverrides || {}),
131
- } as Record<string, any>;
132
-
133
- const baseOptions: Record<string, any> = {
134
- model: 'claude-sonnet-4-5-20250929',
135
- cwd,
136
- permissionMode: 'plan',
137
- settingSources: ['local'],
138
- mcpServers: this.mcpServers
139
- };
140
-
141
- const response = query({
142
- prompt,
143
- options: { ...baseOptions, ...mergedOverrides },
144
- });
145
-
146
- let plan = '';
147
- for await (const message of response) {
148
- // Emit raw SDK event first
149
- this.eventHandler?.(this.adapter.createRawSDKEvent(message));
150
-
151
- // Then emit transformed event
152
- const transformed = this.adapter.transform(message);
153
- if (transformed) {
154
- if (transformed.type !== 'token') {
155
- this.logger.debug('Planning event', { type: transformed.type });
156
- }
157
- this.eventHandler?.(transformed);
158
- }
159
-
160
- if (message.type === 'assistant' && message.message?.content) {
161
- for (const c of message.message.content) {
162
- if (c.type === 'text' && c.text) plan += c.text + '\n';
163
- }
164
- }
165
- }
166
-
167
- return { plan: plan.trim() };
168
- }
169
-
170
- private async runExecution(task: Task, cwd: string, permissionMode: WorkflowExecutionOptions['permissionMode'], options: WorkflowExecutionOptions, stageKey: string): Promise<WorkflowStageExecutionResult> {
171
- const contextPrompt = await this.promptBuilder.buildExecutionPrompt(task, cwd);
172
- let prompt = EXECUTION_SYSTEM_PROMPT + '\n\n' + contextPrompt;
173
-
174
- const stageOverrides = options.stageOverrides?.[stageKey];
175
- const mergedOverrides = {
176
- ...(options.queryOverrides || {}),
177
- ...(stageOverrides?.queryOverrides || {}),
178
- } as Record<string, any>;
179
-
180
- const baseOptions: Record<string, any> = {
181
- model: 'claude-sonnet-4-5-20250929',
182
- cwd,
183
- permissionMode,
184
- settingSources: ['local'],
185
- mcpServers: this.mcpServers
186
- };
187
-
188
- const response = query({
189
- prompt,
190
- options: { ...baseOptions, ...mergedOverrides },
191
- });
192
- const results: any[] = [];
193
- for await (const message of response) {
194
- // Emit raw SDK event first
195
- this.eventHandler?.(this.adapter.createRawSDKEvent(message));
196
-
197
- // Then emit transformed event
198
- const transformed = this.adapter.transform(message);
199
- if (transformed) {
200
- if (transformed.type !== 'token') {
201
- this.logger.debug('Execution event', { type: transformed.type });
202
- }
203
- this.eventHandler?.(transformed);
204
- }
205
-
206
- results.push(message);
207
- }
208
- return { results };
209
- }
210
- }
@@ -1,30 +0,0 @@
1
- import type { WorkflowDefinition } from './workflow-types.js';
2
- import { PostHogAPIClient } from './posthog-api.js';
3
-
4
- export class WorkflowRegistry {
5
- private workflowsById: Map<string, WorkflowDefinition> = new Map();
6
- private apiClient?: PostHogAPIClient;
7
-
8
- constructor(apiClient?: PostHogAPIClient, staticDefinitions?: WorkflowDefinition[]) {
9
- this.apiClient = apiClient;
10
- if (staticDefinitions) {
11
- for (const w of staticDefinitions) this.workflowsById.set(w.id, w);
12
- }
13
- }
14
-
15
- async loadWorkflows(): Promise<void> {
16
- if (this.apiClient) {
17
- const workflows = await this.apiClient.listWorkflows();
18
- for (const w of workflows) this.workflowsById.set(w.id, w);
19
- }
20
- }
21
-
22
- getWorkflow(id: string): WorkflowDefinition | undefined {
23
- return this.workflowsById.get(id);
24
- }
25
-
26
- listWorkflows(): WorkflowDefinition[] {
27
- return Array.from(this.workflowsById.values());
28
- }
29
- }
30
-