@projectarachne/cli 0.1.0-beta.1 → 0.1.0-beta.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/tui/App.d.ts.map +1 -1
- package/dist/tui/App.js +54 -12
- package/dist/tui/App.js.map +1 -1
- package/dist/tui/components/ApprovalPrompt.d.ts +10 -0
- package/dist/tui/components/ApprovalPrompt.d.ts.map +1 -0
- package/dist/tui/components/ApprovalPrompt.js +50 -0
- package/dist/tui/components/ApprovalPrompt.js.map +1 -0
- package/dist/tui/components/Box.d.ts.map +1 -1
- package/dist/tui/components/Box.js +4 -1
- package/dist/tui/components/Box.js.map +1 -1
- package/dist/tui/components/ChatInput.d.ts.map +1 -1
- package/dist/tui/components/ChatInput.js +10 -2
- package/dist/tui/components/ChatInput.js.map +1 -1
- package/dist/tui/components/CommandInput.d.ts.map +1 -1
- package/dist/tui/components/CommandInput.js +9 -2
- package/dist/tui/components/CommandInput.js.map +1 -1
- package/dist/tui/components/Content.d.ts.map +1 -1
- package/dist/tui/components/Content.js +11 -4
- package/dist/tui/components/Content.js.map +1 -1
- package/dist/tui/components/DagView.d.ts.map +1 -1
- package/dist/tui/components/DagView.js +5 -3
- package/dist/tui/components/DagView.js.map +1 -1
- package/dist/tui/components/ElapsedTimer.d.ts +8 -0
- package/dist/tui/components/ElapsedTimer.d.ts.map +1 -0
- package/dist/tui/components/ElapsedTimer.js +35 -0
- package/dist/tui/components/ElapsedTimer.js.map +1 -0
- package/dist/tui/components/FileChangesList.d.ts +8 -0
- package/dist/tui/components/FileChangesList.d.ts.map +1 -0
- package/dist/tui/components/FileChangesList.js +40 -0
- package/dist/tui/components/FileChangesList.js.map +1 -0
- package/dist/tui/components/Footer.d.ts.map +1 -1
- package/dist/tui/components/Footer.js +10 -1
- package/dist/tui/components/Footer.js.map +1 -1
- package/dist/tui/components/Frame.d.ts.map +1 -1
- package/dist/tui/components/Frame.js +8 -1
- package/dist/tui/components/Frame.js.map +1 -1
- package/dist/tui/components/GoalInput.d.ts.map +1 -1
- package/dist/tui/components/GoalInput.js +10 -1
- package/dist/tui/components/GoalInput.js.map +1 -1
- package/dist/tui/components/Header.d.ts +1 -1
- package/dist/tui/components/Header.d.ts.map +1 -1
- package/dist/tui/components/Header.js +9 -2
- package/dist/tui/components/Header.js.map +1 -1
- package/dist/tui/components/Help.d.ts.map +1 -1
- package/dist/tui/components/Help.js +8 -1
- package/dist/tui/components/Help.js.map +1 -1
- package/dist/tui/components/HomeView.d.ts.map +1 -1
- package/dist/tui/components/HomeView.js +2 -1
- package/dist/tui/components/HomeView.js.map +1 -1
- package/dist/tui/components/OutputView.d.ts.map +1 -1
- package/dist/tui/components/OutputView.js +9 -2
- package/dist/tui/components/OutputView.js.map +1 -1
- package/dist/tui/components/PlannerView.d.ts +6 -2
- package/dist/tui/components/PlannerView.d.ts.map +1 -1
- package/dist/tui/components/PlannerView.js +19 -4
- package/dist/tui/components/PlannerView.js.map +1 -1
- package/dist/tui/components/Settings.d.ts.map +1 -1
- package/dist/tui/components/Settings.js +171 -4
- package/dist/tui/components/Settings.js.map +1 -1
- package/dist/tui/components/Sidebar.d.ts.map +1 -1
- package/dist/tui/components/Sidebar.js +11 -2
- package/dist/tui/components/Sidebar.js.map +1 -1
- package/dist/tui/components/Splash.d.ts.map +1 -1
- package/dist/tui/components/Splash.js +4 -1
- package/dist/tui/components/Splash.js.map +1 -1
- package/dist/tui/components/StepEditor.d.ts.map +1 -1
- package/dist/tui/components/StepEditor.js +10 -3
- package/dist/tui/components/StepEditor.js.map +1 -1
- package/dist/tui/components/ThemeDesigner.d.ts.map +1 -1
- package/dist/tui/components/ThemeDesigner.js +297 -8
- package/dist/tui/components/ThemeDesigner.js.map +1 -1
- package/dist/tui/components/VerboseOutput.d.ts +8 -0
- package/dist/tui/components/VerboseOutput.d.ts.map +1 -0
- package/dist/tui/components/VerboseOutput.js +34 -0
- package/dist/tui/components/VerboseOutput.js.map +1 -0
- package/dist/tui/components/WorkflowPicker.d.ts.map +1 -1
- package/dist/tui/components/WorkflowPicker.js +3 -2
- package/dist/tui/components/WorkflowPicker.js.map +1 -1
- package/dist/tui/components/index.d.ts +4 -0
- package/dist/tui/components/index.d.ts.map +1 -1
- package/dist/tui/components/index.js +4 -0
- package/dist/tui/components/index.js.map +1 -1
- package/dist/tui/services/executor.d.ts +3 -2
- package/dist/tui/services/executor.d.ts.map +1 -1
- package/dist/tui/services/executor.js +56 -1
- package/dist/tui/services/executor.js.map +1 -1
- package/dist/tui/services/fileWatcher.d.ts +17 -0
- package/dist/tui/services/fileWatcher.d.ts.map +1 -0
- package/dist/tui/services/fileWatcher.js +150 -0
- package/dist/tui/services/fileWatcher.js.map +1 -0
- package/dist/tui/services/generateSteps.d.ts +12 -1
- package/dist/tui/services/generateSteps.d.ts.map +1 -1
- package/dist/tui/services/generateSteps.js +66 -3
- package/dist/tui/services/generateSteps.js.map +1 -1
- package/dist/tui/services/settings.d.ts +12 -1
- package/dist/tui/services/settings.d.ts.map +1 -1
- package/dist/tui/services/settings.js +79 -0
- package/dist/tui/services/settings.js.map +1 -1
- package/dist/tui/services/theme.d.ts +48 -0
- package/dist/tui/services/theme.d.ts.map +1 -1
- package/dist/tui/services/theme.js +209 -0
- package/dist/tui/services/theme.js.map +1 -1
- package/dist/tui/services/themeGenerator.d.ts.map +1 -1
- package/dist/tui/services/themeGenerator.js +26 -1
- package/dist/tui/services/themeGenerator.js.map +1 -1
- package/dist/tui/types.d.ts +47 -0
- package/dist/tui/types.d.ts.map +1 -1
- package/dist/tui.js +1 -1
- package/dist/tui.js.map +1 -1
- package/package.json +6 -3
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import type { Step, ApprovalMode } from '../types.js';
|
|
1
|
+
import type { Step, ApprovalMode, ApprovalRequest, ExecutionSettings } from '../types.js';
|
|
2
2
|
import type { ProjectContext } from './context.js';
|
|
3
3
|
export type ExecutorCallback = (output: string) => void;
|
|
4
|
+
export type ApprovalCallback = (request: ApprovalRequest) => Promise<boolean>;
|
|
4
5
|
export interface ExecutionResult {
|
|
5
6
|
success: boolean;
|
|
6
7
|
output: string;
|
|
@@ -8,6 +9,6 @@ export interface ExecutionResult {
|
|
|
8
9
|
commitHash?: string;
|
|
9
10
|
duration: number;
|
|
10
11
|
}
|
|
11
|
-
export declare function executeStep(step: Step, workingDir: string, approvalMode: ApprovalMode, context: ProjectContext | null, onOutput?: ExecutorCallback): Promise<ExecutionResult>;
|
|
12
|
+
export declare function executeStep(step: Step, workingDir: string, approvalMode: ApprovalMode, context: ProjectContext | null, executionSettings?: ExecutionSettings, onOutput?: ExecutorCallback, onApproval?: ApprovalCallback): Promise<ExecutionResult>;
|
|
12
13
|
export declare function rollbackStep(commitHash: string, workingDir: string): Promise<boolean>;
|
|
13
14
|
//# sourceMappingURL=executor.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../../src/tui/services/executor.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../../src/tui/services/executor.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,eAAe,EAAuB,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAG/G,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAEnD,MAAM,MAAM,gBAAgB,GAAG,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;AACxD,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,EAAE,eAAe,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AA+F9E,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAmCD,wBAAsB,WAAW,CAC/B,IAAI,EAAE,IAAI,EACV,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,YAAY,EAC1B,OAAO,EAAE,cAAc,GAAG,IAAI,EAC9B,iBAAiB,CAAC,EAAE,iBAAiB,EACrC,QAAQ,CAAC,EAAE,gBAAgB,EAC3B,UAAU,CAAC,EAAE,gBAAgB,GAC5B,OAAO,CAAC,eAAe,CAAC,CA+H1B;AAED,wBAAsB,YAAY,CAChC,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,OAAO,CAAC,CAclB"}
|
|
@@ -1,6 +1,61 @@
|
|
|
1
1
|
import { spawn, execSync } from 'node:child_process';
|
|
2
2
|
import { buildExecutionCommand } from './providers.js';
|
|
3
3
|
import { getProviderEnv, hasApiKey } from './settings.js';
|
|
4
|
+
// Patterns that trigger approval prompts
|
|
5
|
+
const APPROVAL_PATTERNS = [
|
|
6
|
+
{
|
|
7
|
+
type: 'packageInstall',
|
|
8
|
+
patterns: [
|
|
9
|
+
/npm install\s+([^\s]+)/i,
|
|
10
|
+
/npm i\s+([^\s]+)/i,
|
|
11
|
+
/yarn add\s+([^\s]+)/i,
|
|
12
|
+
/pnpm add\s+([^\s]+)/i,
|
|
13
|
+
/pip install\s+([^\s]+)/i,
|
|
14
|
+
/cargo add\s+([^\s]+)/i,
|
|
15
|
+
],
|
|
16
|
+
descriptionExtractor: (match) => `Installing package: ${match}`,
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
type: 'fileDelete',
|
|
20
|
+
patterns: [
|
|
21
|
+
/rm\s+-rf?\s+([^\s]+)/i,
|
|
22
|
+
/rm\s+([^\s]+)/i,
|
|
23
|
+
/unlink\s+([^\s]+)/i,
|
|
24
|
+
/rmdir\s+([^\s]+)/i,
|
|
25
|
+
],
|
|
26
|
+
descriptionExtractor: (match) => `Deleting: ${match}`,
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
type: 'configChange',
|
|
30
|
+
patterns: [
|
|
31
|
+
/writing to.*\.env/i,
|
|
32
|
+
/modifying.*config\.(json|yaml|yml|toml)/i,
|
|
33
|
+
/updating.*\.env/i,
|
|
34
|
+
],
|
|
35
|
+
descriptionExtractor: (match) => `Modifying configuration: ${match}`,
|
|
36
|
+
},
|
|
37
|
+
];
|
|
38
|
+
function detectApprovalNeeded(output, settings) {
|
|
39
|
+
for (const { type, patterns, descriptionExtractor } of APPROVAL_PATTERNS) {
|
|
40
|
+
// Check if this approval type is enabled
|
|
41
|
+
const isEnabled = settings.approvalPrompts[type];
|
|
42
|
+
if (!isEnabled)
|
|
43
|
+
continue;
|
|
44
|
+
for (const pattern of patterns) {
|
|
45
|
+
const match = output.match(pattern);
|
|
46
|
+
if (match) {
|
|
47
|
+
return {
|
|
48
|
+
id: `approval-${Date.now()}`,
|
|
49
|
+
type,
|
|
50
|
+
description: descriptionExtractor(match[0]),
|
|
51
|
+
command: match[0],
|
|
52
|
+
timestamp: Date.now(),
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
4
59
|
// Strip ANSI escape codes that corrupt Ink rendering
|
|
5
60
|
function stripAnsi(text) {
|
|
6
61
|
// Remove all ANSI escape sequences
|
|
@@ -59,7 +114,7 @@ function gitCommit(workingDir, message) {
|
|
|
59
114
|
return null;
|
|
60
115
|
}
|
|
61
116
|
}
|
|
62
|
-
export async function executeStep(step, workingDir, approvalMode, context, onOutput) {
|
|
117
|
+
export async function executeStep(step, workingDir, approvalMode, context, executionSettings, onOutput, onApproval) {
|
|
63
118
|
const startTime = Date.now();
|
|
64
119
|
// Warn if manual mode - it's limited
|
|
65
120
|
if (approvalMode === 'manual') {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executor.js","sourceRoot":"","sources":["../../../src/tui/services/executor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAErD,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"executor.js","sourceRoot":"","sources":["../../../src/tui/services/executor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAErD,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAM1D,yCAAyC;AACzC,MAAM,iBAAiB,GAIlB;IACH;QACE,IAAI,EAAE,gBAAgB;QACtB,QAAQ,EAAE;YACR,yBAAyB;YACzB,mBAAmB;YACnB,sBAAsB;YACtB,sBAAsB;YACtB,yBAAyB;YACzB,uBAAuB;SACxB;QACD,oBAAoB,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,uBAAuB,KAAK,EAAE;KAChE;IACD;QACE,IAAI,EAAE,YAAY;QAClB,QAAQ,EAAE;YACR,uBAAuB;YACvB,gBAAgB;YAChB,oBAAoB;YACpB,mBAAmB;SACpB;QACD,oBAAoB,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,aAAa,KAAK,EAAE;KACtD;IACD;QACE,IAAI,EAAE,cAAc;QACpB,QAAQ,EAAE;YACR,oBAAoB;YACpB,0CAA0C;YAC1C,kBAAkB;SACnB;QACD,oBAAoB,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,4BAA4B,KAAK,EAAE;KACrE;CACF,CAAC;AAEF,SAAS,oBAAoB,CAC3B,MAAc,EACd,QAA2B;IAE3B,KAAK,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,oBAAoB,EAAE,IAAI,iBAAiB,EAAE,CAAC;QACzE,yCAAyC;QACzC,MAAM,SAAS,GAAG,QAAQ,CAAC,eAAe,CAAC,IAA6C,CAAC,CAAC;QAC1F,IAAI,CAAC,SAAS;YAAE,SAAS;QAEzB,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACpC,IAAI,KAAK,EAAE,CAAC;gBACV,OAAO;oBACL,EAAE,EAAE,YAAY,IAAI,CAAC,GAAG,EAAE,EAAE;oBAC5B,IAAI;oBACJ,WAAW,EAAE,oBAAoB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;oBAC3C,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;oBACjB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;iBACtB,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,qDAAqD;AACrD,SAAS,SAAS,CAAC,IAAY;IAC7B,mCAAmC;IACnC,OAAO,IAAI,CAAC,OAAO,CAAC,wBAAwB,EAAE,EAAE,CAAC;SAC9C,OAAO,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAAC,gBAAgB;SACnD,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,yCAAyC;AAClE,CAAC;AAED,gEAAgE;AAChE,SAAS,WAAW,CAAC,IAAY;IAC/B,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;IACrC,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAExB,gCAAgC;IAChC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;QAC5C,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QACtB,yBAAyB;QACzB,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;QAC7E,IAAI,CAAC,CAAC,UAAU,CAAC,aAAa,CAAC;YAAE,OAAO,IAAI,CAAC;QAC7C,oBAAoB;QACpB,IAAI,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,EAAE;YAAE,OAAO,KAAK,CAAC;QAC9D,2BAA2B;QAC3B,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,KAAK,CAAC;QAC/B,OAAO,KAAK,CAAC,CAAC,8BAA8B;IAC9C,CAAC,CAAC,CAAC;IAEH,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACpD,CAAC;AAUD,SAAS,SAAS,CAAC,UAAkB,EAAE,OAAe;IACpD,IAAI,CAAC;QACH,uCAAuC;QACvC,MAAM,MAAM,GAAG,QAAQ,CAAC,wBAAwB,EAAE;YAChD,GAAG,EAAE,UAAU;YACf,QAAQ,EAAE,OAAO;SAClB,CAAC,CAAC,IAAI,EAAE,CAAC;QAEV,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,IAAI,CAAC,CAAC,uBAAuB;QACtC,CAAC;QAED,oBAAoB;QACpB,QAAQ,CAAC,YAAY,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QAE3D,SAAS;QACT,QAAQ,CAAC,kBAAkB,OAAO,GAAG,EAAE;YACrC,GAAG,EAAE,UAAU;YACf,KAAK,EAAE,MAAM;SACd,CAAC,CAAC;QAEH,kBAAkB;QAClB,MAAM,IAAI,GAAG,QAAQ,CAAC,4BAA4B,EAAE;YAClD,GAAG,EAAE,UAAU;YACf,QAAQ,EAAE,OAAO;SAClB,CAAC,CAAC,IAAI,EAAE,CAAC;QAEV,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,IAAU,EACV,UAAkB,EAClB,YAA0B,EAC1B,OAA8B,EAC9B,iBAAqC,EACrC,QAA2B,EAC3B,UAA6B;IAE7B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE7B,qCAAqC;IACrC,IAAI,YAAY,KAAK,QAAQ,EAAE,CAAC;QAC9B,QAAQ,EAAE,CAAC,iDAAiD,CAAC,CAAC;QAC9D,QAAQ,EAAE,CAAC,6CAA6C,CAAC,CAAC;QAC1D,QAAQ,EAAE,CAAC,mDAAmD,CAAC,CAAC;IAClE,CAAC;IAED,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,kDAAkD;QAClD,MAAM,cAAc,GAAG,OAAO,CAAC,CAAC,CAAC;;EAEnC,OAAO,CAAC,OAAO;;;CAGhB,CAAC,CAAC,CAAC,EAAE,CAAC;QAEH,MAAM,eAAe,GAAG,2BAA2B,IAAI,CAAC,EAAE;EAC5D,cAAc;QACR,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,EAAE;;;EAG3B,IAAI,CAAC,MAAM;;mJAEsI,CAAC;QAEhJ,yEAAyE;QACzE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,qBAAqB,CAC7C,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,KAAK,EACV,YAAY,EACZ,eAAe,CAChB,CAAC;QAEF,yCAAyC;QACzC,MAAM,WAAW,GAAG,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAClD,MAAM,WAAW,GAAG,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAE7C,QAAQ,EAAE,CAAC,KAAK,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;QACpC,QAAQ,EAAE,CAAC,SAAS,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;QAC/C,QAAQ,EAAE,CAAC,aAAa,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QAClF,QAAQ,EAAE,CAAC,SAAS,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC;QAC9D,QAAQ,EAAE,CAAC,SAAS,YAAY,IAAI,CAAC,CAAC;QACtC,IAAI,OAAO,EAAE,CAAC;YACZ,QAAQ,EAAE,CAAC,YAAY,OAAO,CAAC,WAAW,cAAc,OAAO,CAAC,SAAS,IAAI,CAAC,CAAC;QACjF,CAAC;QACD,QAAQ,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;QAEpC,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE;YACjC,GAAG,EAAE,UAAU;YACf,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;YAC/B,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,WAAW,EAAE;SACxC,CAAC,CAAC;QAEH,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,MAAM,GAAG,EAAE,CAAC;QAEhB,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC7B,MAAM,IAAI,IAAI,CAAC;YACf,uDAAuD;YACvD,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;YAC9B,IAAI,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;gBACjB,QAAQ,EAAE,CAAC,KAAK,CAAC,CAAC;YACpB,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC7B,MAAM,IAAI,IAAI,CAAC;YACf,0CAA0C;YAC1C,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;YACjC,IAAI,MAAM,EAAE,CAAC;gBACX,QAAQ,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YAExC,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;gBACf,QAAQ,EAAE,CAAC,8BAA8B,IAAI,KAAK,CAAC,CAAC;gBACpD,IAAI,MAAM,EAAE,CAAC;oBACX,QAAQ,EAAE,CAAC,UAAU,MAAM,IAAI,CAAC,CAAC;gBACnC,CAAC;gBACD,OAAO,CAAC;oBACN,OAAO,EAAE,KAAK;oBACd,MAAM,EAAE,MAAM;oBACd,KAAK,EAAE,MAAM,IAAI,qCAAqC;oBACtD,QAAQ;iBACT,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YAED,wBAAwB;YACxB,MAAM,UAAU,GAAG,SAAS,CAAC,UAAU,EAAE,YAAY,IAAI,CAAC,EAAE,MAAM,IAAI,CAAC,KAAK,IAAI,WAAW,EAAE,CAAC,CAAC;YAE/F,QAAQ,EAAE,CAAC,KAAK,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;YACpC,IAAI,UAAU,EAAE,CAAC;gBACf,QAAQ,EAAE,CAAC,uBAAuB,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;gBACrE,QAAQ,EAAE,CAAC,wBAAwB,UAAU,IAAI,CAAC,CAAC;YACrD,CAAC;iBAAM,CAAC;gBACN,QAAQ,EAAE,CAAC,uBAAuB,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC;YACzF,CAAC;YAED,OAAO,CAAC;gBACN,OAAO,EAAE,IAAI;gBACb,MAAM,EAAE,MAAM;gBACd,UAAU,EAAE,UAAU,IAAI,SAAS;gBACnC,QAAQ;aACT,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YAC1B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YACxC,QAAQ,EAAE,CAAC,uBAAuB,IAAI,CAAC,QAAQ,KAAK,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC;YACvE,QAAQ,EAAE,CAAC,cAAc,OAAO,oCAAoC,CAAC,CAAC;YACtE,OAAO,CAAC;gBACN,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,EAAE;gBACV,KAAK,EAAE,KAAK,CAAC,OAAO;gBACpB,QAAQ;aACT,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,UAAkB,EAClB,UAAkB;IAElB,IAAI,CAAC;QACH,QAAQ,CAAC,0BAA0B,UAAU,EAAE,EAAE;YAC/C,GAAG,EAAE,UAAU;YACf,KAAK,EAAE,MAAM;SACd,CAAC,CAAC;QACH,QAAQ,CAAC,mCAAmC,EAAE;YAC5C,GAAG,EAAE,UAAU;YACf,KAAK,EAAE,MAAM;SACd,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { FileChange } from '../types.js';
|
|
2
|
+
export type FileChangeCallback = (changes: FileChange[]) => void;
|
|
3
|
+
export declare class FileWatcher {
|
|
4
|
+
private watcher;
|
|
5
|
+
private changes;
|
|
6
|
+
private callback;
|
|
7
|
+
private workingDir;
|
|
8
|
+
private debounceTimer;
|
|
9
|
+
private initialFiles;
|
|
10
|
+
start(workingDir: string, onChange: FileChangeCallback): void;
|
|
11
|
+
private handleChange;
|
|
12
|
+
private emitChanges;
|
|
13
|
+
stop(): void;
|
|
14
|
+
getChanges(): FileChange[];
|
|
15
|
+
clearChanges(): void;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=fileWatcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fileWatcher.d.ts","sourceRoot":"","sources":["../../../src/tui/services/fileWatcher.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAoD9C,MAAM,MAAM,kBAAkB,GAAG,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,IAAI,CAAC;AAEjE,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAA0B;IACzC,OAAO,CAAC,OAAO,CAAsC;IACrD,OAAO,CAAC,QAAQ,CAAmC;IACnD,OAAO,CAAC,UAAU,CAAc;IAChC,OAAO,CAAC,aAAa,CAA8C;IACnE,OAAO,CAAC,YAAY,CAA0B;IAE9C,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,kBAAkB,GAAG,IAAI;IA8B7D,OAAO,CAAC,YAAY;IA4CpB,OAAO,CAAC,WAAW;IASnB,IAAI,IAAI,IAAI;IAeZ,UAAU,IAAI,UAAU,EAAE;IAK1B,YAAY,IAAI,IAAI;CAMrB"}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import { watch, existsSync } from 'node:fs';
|
|
2
|
+
import { join, relative } from 'node:path';
|
|
3
|
+
// Directories to ignore
|
|
4
|
+
const IGNORE_DIRS = [
|
|
5
|
+
'node_modules',
|
|
6
|
+
'.git',
|
|
7
|
+
'.next',
|
|
8
|
+
'.nuxt',
|
|
9
|
+
'dist',
|
|
10
|
+
'build',
|
|
11
|
+
'.cache',
|
|
12
|
+
'coverage',
|
|
13
|
+
'__pycache__',
|
|
14
|
+
'.pytest_cache',
|
|
15
|
+
'target', // Rust
|
|
16
|
+
'vendor', // Go
|
|
17
|
+
];
|
|
18
|
+
// Files to ignore
|
|
19
|
+
const IGNORE_FILES = [
|
|
20
|
+
'.DS_Store',
|
|
21
|
+
'Thumbs.db',
|
|
22
|
+
'*.swp',
|
|
23
|
+
'*.swo',
|
|
24
|
+
'*~',
|
|
25
|
+
];
|
|
26
|
+
function shouldIgnore(path) {
|
|
27
|
+
const parts = path.split('/');
|
|
28
|
+
// Check if any path segment is in ignore list
|
|
29
|
+
for (const part of parts) {
|
|
30
|
+
if (IGNORE_DIRS.includes(part)) {
|
|
31
|
+
return true;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
// Check file patterns
|
|
35
|
+
const filename = parts[parts.length - 1];
|
|
36
|
+
for (const pattern of IGNORE_FILES) {
|
|
37
|
+
if (pattern.startsWith('*')) {
|
|
38
|
+
if (filename.endsWith(pattern.slice(1))) {
|
|
39
|
+
return true;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
else if (filename === pattern) {
|
|
43
|
+
return true;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
export class FileWatcher {
|
|
49
|
+
watcher = null;
|
|
50
|
+
changes = new Map();
|
|
51
|
+
callback = null;
|
|
52
|
+
workingDir = '';
|
|
53
|
+
debounceTimer = null;
|
|
54
|
+
initialFiles = new Set();
|
|
55
|
+
start(workingDir, onChange) {
|
|
56
|
+
this.workingDir = workingDir;
|
|
57
|
+
this.callback = onChange;
|
|
58
|
+
this.changes.clear();
|
|
59
|
+
this.initialFiles.clear();
|
|
60
|
+
// Don't watch if directory doesn't exist
|
|
61
|
+
if (!existsSync(workingDir)) {
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
try {
|
|
65
|
+
// Try recursive watch (works on macOS and Windows, may not work on older Linux)
|
|
66
|
+
this.watcher = watch(workingDir, { recursive: true }, (eventType, filename) => {
|
|
67
|
+
if (!filename)
|
|
68
|
+
return;
|
|
69
|
+
this.handleChange(eventType, filename);
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
// Fallback: watch without recursive option
|
|
74
|
+
this.watcher = watch(workingDir, (eventType, filename) => {
|
|
75
|
+
if (!filename)
|
|
76
|
+
return;
|
|
77
|
+
this.handleChange(eventType, filename);
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
handleChange(eventType, filename) {
|
|
82
|
+
// Ignore filtered paths
|
|
83
|
+
if (shouldIgnore(filename)) {
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
const fullPath = join(this.workingDir, filename);
|
|
87
|
+
const relativePath = relative(this.workingDir, fullPath);
|
|
88
|
+
// Determine change type
|
|
89
|
+
let changeType;
|
|
90
|
+
if (!existsSync(fullPath)) {
|
|
91
|
+
changeType = 'deleted';
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
// Check if it's a new file or modification
|
|
95
|
+
const isNew = !this.initialFiles.has(relativePath) &&
|
|
96
|
+
!this.changes.has(relativePath);
|
|
97
|
+
if (isNew) {
|
|
98
|
+
changeType = 'created';
|
|
99
|
+
this.initialFiles.add(relativePath);
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
changeType = 'modified';
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
// Update change record
|
|
106
|
+
this.changes.set(relativePath, {
|
|
107
|
+
path: relativePath,
|
|
108
|
+
type: changeType,
|
|
109
|
+
timestamp: Date.now(),
|
|
110
|
+
});
|
|
111
|
+
// Debounce callback to batch rapid changes
|
|
112
|
+
if (this.debounceTimer) {
|
|
113
|
+
clearTimeout(this.debounceTimer);
|
|
114
|
+
}
|
|
115
|
+
this.debounceTimer = setTimeout(() => {
|
|
116
|
+
this.emitChanges();
|
|
117
|
+
}, 100);
|
|
118
|
+
}
|
|
119
|
+
emitChanges() {
|
|
120
|
+
if (this.callback) {
|
|
121
|
+
// Sort by timestamp, most recent first
|
|
122
|
+
const sortedChanges = Array.from(this.changes.values())
|
|
123
|
+
.sort((a, b) => b.timestamp - a.timestamp);
|
|
124
|
+
this.callback(sortedChanges);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
stop() {
|
|
128
|
+
if (this.debounceTimer) {
|
|
129
|
+
clearTimeout(this.debounceTimer);
|
|
130
|
+
this.debounceTimer = null;
|
|
131
|
+
}
|
|
132
|
+
if (this.watcher) {
|
|
133
|
+
this.watcher.close();
|
|
134
|
+
this.watcher = null;
|
|
135
|
+
}
|
|
136
|
+
this.changes.clear();
|
|
137
|
+
this.callback = null;
|
|
138
|
+
}
|
|
139
|
+
getChanges() {
|
|
140
|
+
return Array.from(this.changes.values())
|
|
141
|
+
.sort((a, b) => b.timestamp - a.timestamp);
|
|
142
|
+
}
|
|
143
|
+
clearChanges() {
|
|
144
|
+
this.changes.clear();
|
|
145
|
+
if (this.callback) {
|
|
146
|
+
this.callback([]);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=fileWatcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fileWatcher.js","sourceRoot":"","sources":["../../../src/tui/services/fileWatcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,18 @@
|
|
|
1
|
-
import type { Step, ProviderName, PlannerPhase } from '../types.js';
|
|
1
|
+
import type { Step, ProviderName, PlannerPhase, ProviderAssignmentConfig } from '../types.js';
|
|
2
2
|
import type { ProjectContext } from './context.js';
|
|
3
3
|
export type GenerateCallback = (status: string) => void;
|
|
4
4
|
export type GenerateStreamCallback = (chunk: string, source: 'stdout' | 'stderr') => void;
|
|
5
5
|
export declare const generateStepsFromGoal: (goal: string, context: ProjectContext, provider?: ProviderName, onStatus?: GenerateCallback, onStream?: GenerateStreamCallback) => Promise<Step[]>;
|
|
6
6
|
export declare const generatePlanFromGoal: (goal: string, context: ProjectContext, provider?: ProviderName, onStatus?: GenerateCallback, onStream?: GenerateStreamCallback) => Promise<PlannerPhase[]>;
|
|
7
|
+
/**
|
|
8
|
+
* Apply user's provider assignment settings to override AI-chosen providers.
|
|
9
|
+
* - aiDecide: Keep AI's choices (no override)
|
|
10
|
+
* - singleProvider: Override all steps to use the default provider/model
|
|
11
|
+
* - byTaskType: Override based on each step's taskType
|
|
12
|
+
*/
|
|
13
|
+
export declare const applyProviderAssignment: (steps: Step[], config?: ProviderAssignmentConfig) => Step[];
|
|
14
|
+
/**
|
|
15
|
+
* Apply provider assignment to all steps in all phases
|
|
16
|
+
*/
|
|
17
|
+
export declare const applyProviderAssignmentToPhases: (phases: PlannerPhase[], config?: ProviderAssignmentConfig) => PlannerPhase[];
|
|
7
18
|
//# sourceMappingURL=generateSteps.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generateSteps.d.ts","sourceRoot":"","sources":["../../../src/tui/services/generateSteps.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"generateSteps.d.ts","sourceRoot":"","sources":["../../../src/tui/services/generateSteps.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,YAAY,EAAY,wBAAwB,EAAE,MAAM,aAAa,CAAC;AACxG,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AA8EnD,MAAM,MAAM,gBAAgB,GAAG,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;AACxD,MAAM,MAAM,sBAAsB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAG,QAAQ,KAAK,IAAI,CAAC;AAE1F,eAAO,MAAM,qBAAqB,GAChC,MAAM,MAAM,EACZ,SAAS,cAAc,EACvB,WAAU,YAAuB,EACjC,WAAW,gBAAgB,EAC3B,WAAW,sBAAsB,KAChC,OAAO,CAAC,IAAI,EAAE,CAgGhB,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAC/B,MAAM,MAAM,EACZ,SAAS,cAAc,EACvB,WAAU,YAAuB,EACjC,WAAW,gBAAgB,EAC3B,WAAW,sBAAsB,KAChC,OAAO,CAAC,YAAY,EAAE,CAkHxB,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB,GAAI,OAAO,IAAI,EAAE,EAAE,SAAS,wBAAwB,KAAG,IAAI,EA+B9F,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,+BAA+B,GAAI,QAAQ,YAAY,EAAE,EAAE,SAAS,wBAAwB,KAAG,YAAY,EAKvH,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { spawn } from 'node:child_process';
|
|
2
|
+
import { getProviderAssignment } from './settings.js';
|
|
2
3
|
const PLANNER_PROMPT = `You are a workflow planner for an AI coding assistant. Given a goal and project context, break it down into discrete steps that will be executed by AI agents with FULL FILESYSTEM ACCESS.
|
|
3
4
|
|
|
4
5
|
Each step will be executed by an AI agent (claude/codex/gemini) that can:
|
|
@@ -15,8 +16,8 @@ Generate steps that are:
|
|
|
15
16
|
|
|
16
17
|
Respond with ONLY a JSON array, no markdown, no explanation:
|
|
17
18
|
[
|
|
18
|
-
{"id": "step_1", "provider": "codex", "title": "Short title", "prompt": "Detailed instruction..."},
|
|
19
|
-
{"id": "step_2", "provider": "
|
|
19
|
+
{"id": "step_1", "provider": "codex", "taskType": "coding", "title": "Short title", "prompt": "Detailed instruction..."},
|
|
20
|
+
{"id": "step_2", "provider": "claude", "taskType": "analysis", "title": "Short title", "prompt": "..."},
|
|
20
21
|
]
|
|
21
22
|
|
|
22
23
|
Use providers appropriately:
|
|
@@ -24,6 +25,14 @@ Use providers appropriately:
|
|
|
24
25
|
- claude: Analysis, planning, documentation, complex reasoning
|
|
25
26
|
- gemini: Multi-modal tasks, alternative to claude
|
|
26
27
|
|
|
28
|
+
Assign a taskType to each step:
|
|
29
|
+
- planning: High-level planning, architecture design, breaking down work
|
|
30
|
+
- coding: Writing code, implementing features, fixing bugs
|
|
31
|
+
- analysis: Code review, debugging, understanding existing code
|
|
32
|
+
- research: Investigating libraries, APIs, best practices
|
|
33
|
+
- documentation: Writing docs, comments, READMEs
|
|
34
|
+
- commands: Running shell commands, git operations, builds
|
|
35
|
+
|
|
27
36
|
PROJECT CONTEXT:
|
|
28
37
|
`;
|
|
29
38
|
const PHASED_PLANNER_PROMPT = `You are a workflow planner for an AI coding assistant. Given a goal and project context, break it down into PHASES with concrete steps for each phase.
|
|
@@ -42,7 +51,7 @@ Return ONLY JSON (no markdown) in this exact shape:
|
|
|
42
51
|
"id": "phase_1",
|
|
43
52
|
"title": "Phase title",
|
|
44
53
|
"steps": [
|
|
45
|
-
{ "id": "step_1", "provider": "codex", "title": "Short title", "prompt": "Detailed instruction..." }
|
|
54
|
+
{ "id": "step_1", "provider": "codex", "taskType": "coding", "title": "Short title", "prompt": "Detailed instruction..." }
|
|
46
55
|
]
|
|
47
56
|
}
|
|
48
57
|
]
|
|
@@ -54,6 +63,14 @@ Rules:
|
|
|
54
63
|
- Steps must be actionable and reference real files where possible
|
|
55
64
|
- Use providers appropriately: codex for coding, claude for analysis/planning
|
|
56
65
|
|
|
66
|
+
Assign a taskType to each step:
|
|
67
|
+
- planning: High-level planning, architecture design, breaking down work
|
|
68
|
+
- coding: Writing code, implementing features, fixing bugs
|
|
69
|
+
- analysis: Code review, debugging, understanding existing code
|
|
70
|
+
- research: Investigating libraries, APIs, best practices
|
|
71
|
+
- documentation: Writing docs, comments, READMEs
|
|
72
|
+
- commands: Running shell commands, git operations, builds
|
|
73
|
+
|
|
57
74
|
PROJECT CONTEXT:
|
|
58
75
|
`;
|
|
59
76
|
export const generateStepsFromGoal = async (goal, context, provider = 'claude', onStatus, onStream) => {
|
|
@@ -119,6 +136,7 @@ export const generateStepsFromGoal = async (goal, context, provider = 'claude',
|
|
|
119
136
|
model: item.model,
|
|
120
137
|
title: item.title || `Step ${index + 1}`,
|
|
121
138
|
prompt: item.prompt || '',
|
|
139
|
+
taskType: (item.taskType || 'coding'),
|
|
122
140
|
status: 'pending',
|
|
123
141
|
}));
|
|
124
142
|
if (steps.length === 0) {
|
|
@@ -196,6 +214,7 @@ export const generatePlanFromGoal = async (goal, context, provider = 'claude', o
|
|
|
196
214
|
model: item.model,
|
|
197
215
|
title: item.title || `Step ${index + 1}`,
|
|
198
216
|
prompt: item.prompt || '',
|
|
217
|
+
taskType: (item.taskType || 'coding'),
|
|
199
218
|
status: 'pending',
|
|
200
219
|
}));
|
|
201
220
|
phases = [
|
|
@@ -216,6 +235,7 @@ export const generatePlanFromGoal = async (goal, context, provider = 'claude', o
|
|
|
216
235
|
model: item.model,
|
|
217
236
|
title: item.title || `Step ${stepIndex + 1}`,
|
|
218
237
|
prompt: item.prompt || '',
|
|
238
|
+
taskType: (item.taskType || 'coding'),
|
|
219
239
|
status: 'pending',
|
|
220
240
|
})),
|
|
221
241
|
}));
|
|
@@ -235,4 +255,47 @@ export const generatePlanFromGoal = async (goal, context, provider = 'claude', o
|
|
|
235
255
|
});
|
|
236
256
|
});
|
|
237
257
|
};
|
|
258
|
+
/**
|
|
259
|
+
* Apply user's provider assignment settings to override AI-chosen providers.
|
|
260
|
+
* - aiDecide: Keep AI's choices (no override)
|
|
261
|
+
* - singleProvider: Override all steps to use the default provider/model
|
|
262
|
+
* - byTaskType: Override based on each step's taskType
|
|
263
|
+
*/
|
|
264
|
+
export const applyProviderAssignment = (steps, config) => {
|
|
265
|
+
const settings = config || getProviderAssignment();
|
|
266
|
+
if (settings.mode === 'aiDecide') {
|
|
267
|
+
return steps;
|
|
268
|
+
}
|
|
269
|
+
if (settings.mode === 'singleProvider') {
|
|
270
|
+
return steps.map(step => ({
|
|
271
|
+
...step,
|
|
272
|
+
provider: settings.defaultProvider || step.provider,
|
|
273
|
+
model: settings.defaultModel || step.model,
|
|
274
|
+
}));
|
|
275
|
+
}
|
|
276
|
+
if (settings.mode === 'byTaskType' && settings.taskProviders) {
|
|
277
|
+
return steps.map(step => {
|
|
278
|
+
const taskType = step.taskType || 'coding';
|
|
279
|
+
const taskConfig = settings.taskProviders[taskType];
|
|
280
|
+
if (taskConfig) {
|
|
281
|
+
return {
|
|
282
|
+
...step,
|
|
283
|
+
provider: taskConfig.provider,
|
|
284
|
+
model: taskConfig.model || step.model,
|
|
285
|
+
};
|
|
286
|
+
}
|
|
287
|
+
return step;
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
return steps;
|
|
291
|
+
};
|
|
292
|
+
/**
|
|
293
|
+
* Apply provider assignment to all steps in all phases
|
|
294
|
+
*/
|
|
295
|
+
export const applyProviderAssignmentToPhases = (phases, config) => {
|
|
296
|
+
return phases.map(phase => ({
|
|
297
|
+
...phase,
|
|
298
|
+
steps: applyProviderAssignment(phase.steps, config),
|
|
299
|
+
}));
|
|
300
|
+
};
|
|
238
301
|
//# sourceMappingURL=generateSteps.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generateSteps.js","sourceRoot":"","sources":["../../../src/tui/services/generateSteps.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"generateSteps.js","sourceRoot":"","sources":["../../../src/tui/services/generateSteps.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ProviderName, ApprovalMode, RunMode } from '../types.js';
|
|
1
|
+
import type { ProviderName, ApprovalMode, RunMode, ExecutionSettings, ApprovalPromptConfig, ProviderAssignmentConfig } from '../types.js';
|
|
2
2
|
export declare const API_KEY_ENV_VARS: Record<ProviderName, string>;
|
|
3
3
|
export interface ArachneConfig {
|
|
4
4
|
apiKeys: {
|
|
@@ -16,6 +16,13 @@ export interface ArachneConfig {
|
|
|
16
16
|
showSplash: boolean;
|
|
17
17
|
theme?: string;
|
|
18
18
|
};
|
|
19
|
+
execution: {
|
|
20
|
+
verboseOutput: boolean;
|
|
21
|
+
showFileChanges: boolean;
|
|
22
|
+
showElapsedTimer: boolean;
|
|
23
|
+
approvalPrompts: ApprovalPromptConfig;
|
|
24
|
+
};
|
|
25
|
+
providerAssignment: ProviderAssignmentConfig;
|
|
19
26
|
}
|
|
20
27
|
export declare function loadConfig(): ArachneConfig;
|
|
21
28
|
export declare function saveConfig(config: ArachneConfig): void;
|
|
@@ -26,4 +33,8 @@ export declare function hasApiKey(provider: ProviderName): boolean;
|
|
|
26
33
|
export declare function maskApiKey(key: string): string;
|
|
27
34
|
export declare function getDefaults(): ArachneConfig['defaults'];
|
|
28
35
|
export declare function setDefaults(defaults: Partial<ArachneConfig['defaults']>): void;
|
|
36
|
+
export declare function getExecutionSettings(): ExecutionSettings;
|
|
37
|
+
export declare function setExecutionSettings(settings: Partial<ExecutionSettings>): void;
|
|
38
|
+
export declare function getProviderAssignment(): ProviderAssignmentConfig;
|
|
39
|
+
export declare function setProviderAssignment(settings: Partial<ProviderAssignmentConfig>): void;
|
|
29
40
|
//# sourceMappingURL=settings.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../../src/tui/services/settings.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../../src/tui/services/settings.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,wBAAwB,EAAiB,MAAM,aAAa,CAAC;AAOzJ,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,YAAY,EAAE,MAAM,CAKzD,CAAC;AAGF,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE;QACP,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,QAAQ,EAAE;QACR,QAAQ,EAAE,YAAY,CAAC;QACvB,KAAK,EAAE,MAAM,CAAC;QACd,YAAY,EAAE,YAAY,CAAC;QAC3B,OAAO,EAAE,OAAO,CAAC;KAClB,CAAC;IACF,EAAE,EAAE;QACF,UAAU,EAAE,OAAO,CAAC;QACpB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,SAAS,EAAE;QACT,aAAa,EAAE,OAAO,CAAC;QACvB,eAAe,EAAE,OAAO,CAAC;QACzB,gBAAgB,EAAE,OAAO,CAAC;QAC1B,eAAe,EAAE,oBAAoB,CAAC;KACvC,CAAC;IACF,kBAAkB,EAAE,wBAAwB,CAAC;CAC9C;AA+CD,wBAAgB,UAAU,IAAI,aAAa,CAmC1C;AAGD,wBAAgB,UAAU,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAGtD;AAGD,wBAAgB,SAAS,CAAC,QAAQ,EAAE,YAAY,GAAG,MAAM,GAAG,SAAS,CAGpE;AAGD,wBAAgB,SAAS,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAQ/E;AAGD,wBAAgB,cAAc,CAAC,QAAQ,EAAE,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAU7E;AAGD,wBAAgB,SAAS,CAAC,QAAQ,EAAE,YAAY,GAAG,OAAO,CAGzD;AAGD,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAG9C;AAGD,wBAAgB,WAAW,IAAI,aAAa,CAAC,UAAU,CAAC,CAEvD;AAGD,wBAAgB,WAAW,CAAC,QAAQ,EAAE,OAAO,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,GAAG,IAAI,CAI9E;AAGD,wBAAgB,oBAAoB,IAAI,iBAAiB,CAExD;AAGD,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,OAAO,CAAC,iBAAiB,CAAC,GAAG,IAAI,CAW/E;AAGD,wBAAgB,qBAAqB,IAAI,wBAAwB,CAEhE;AAGD,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,OAAO,CAAC,wBAAwB,CAAC,GAAG,IAAI,CAkBvF"}
|
|
@@ -23,6 +23,29 @@ const DEFAULT_CONFIG = {
|
|
|
23
23
|
showSplash: true,
|
|
24
24
|
theme: 'obsidian-web',
|
|
25
25
|
},
|
|
26
|
+
execution: {
|
|
27
|
+
verboseOutput: false,
|
|
28
|
+
showFileChanges: true,
|
|
29
|
+
showElapsedTimer: true,
|
|
30
|
+
approvalPrompts: {
|
|
31
|
+
packageInstall: true,
|
|
32
|
+
fileDelete: true,
|
|
33
|
+
configChanges: false,
|
|
34
|
+
},
|
|
35
|
+
},
|
|
36
|
+
providerAssignment: {
|
|
37
|
+
mode: 'aiDecide',
|
|
38
|
+
defaultProvider: 'codex',
|
|
39
|
+
defaultModel: 'o4-mini',
|
|
40
|
+
taskProviders: {
|
|
41
|
+
planning: { provider: 'claude', model: 'claude-sonnet-4-20250514' },
|
|
42
|
+
coding: { provider: 'codex', model: 'o4-mini' },
|
|
43
|
+
analysis: { provider: 'claude', model: 'claude-sonnet-4-20250514' },
|
|
44
|
+
research: { provider: 'claude', model: 'claude-sonnet-4-20250514' },
|
|
45
|
+
documentation: { provider: 'claude', model: 'claude-sonnet-4-20250514' },
|
|
46
|
+
commands: { provider: 'codex', model: 'o4-mini' },
|
|
47
|
+
},
|
|
48
|
+
},
|
|
26
49
|
};
|
|
27
50
|
// Ensure config directory exists
|
|
28
51
|
function ensureConfigDir() {
|
|
@@ -46,6 +69,22 @@ export function loadConfig() {
|
|
|
46
69
|
apiKeys: { ...DEFAULT_CONFIG.apiKeys, ...parsed.apiKeys },
|
|
47
70
|
defaults: { ...DEFAULT_CONFIG.defaults, ...parsed.defaults },
|
|
48
71
|
ui: { ...DEFAULT_CONFIG.ui, ...parsed.ui },
|
|
72
|
+
execution: {
|
|
73
|
+
...DEFAULT_CONFIG.execution,
|
|
74
|
+
...parsed.execution,
|
|
75
|
+
approvalPrompts: {
|
|
76
|
+
...DEFAULT_CONFIG.execution.approvalPrompts,
|
|
77
|
+
...parsed.execution?.approvalPrompts,
|
|
78
|
+
},
|
|
79
|
+
},
|
|
80
|
+
providerAssignment: {
|
|
81
|
+
...DEFAULT_CONFIG.providerAssignment,
|
|
82
|
+
...parsed.providerAssignment,
|
|
83
|
+
taskProviders: {
|
|
84
|
+
...DEFAULT_CONFIG.providerAssignment.taskProviders,
|
|
85
|
+
...parsed.providerAssignment?.taskProviders,
|
|
86
|
+
},
|
|
87
|
+
},
|
|
49
88
|
};
|
|
50
89
|
}
|
|
51
90
|
catch {
|
|
@@ -104,4 +143,44 @@ export function setDefaults(defaults) {
|
|
|
104
143
|
config.defaults = { ...config.defaults, ...defaults };
|
|
105
144
|
saveConfig(config);
|
|
106
145
|
}
|
|
146
|
+
// Get execution settings
|
|
147
|
+
export function getExecutionSettings() {
|
|
148
|
+
return loadConfig().execution;
|
|
149
|
+
}
|
|
150
|
+
// Update execution settings
|
|
151
|
+
export function setExecutionSettings(settings) {
|
|
152
|
+
const config = loadConfig();
|
|
153
|
+
config.execution = {
|
|
154
|
+
...config.execution,
|
|
155
|
+
...settings,
|
|
156
|
+
approvalPrompts: {
|
|
157
|
+
...config.execution.approvalPrompts,
|
|
158
|
+
...settings.approvalPrompts,
|
|
159
|
+
},
|
|
160
|
+
};
|
|
161
|
+
saveConfig(config);
|
|
162
|
+
}
|
|
163
|
+
// Get provider assignment settings
|
|
164
|
+
export function getProviderAssignment() {
|
|
165
|
+
return loadConfig().providerAssignment;
|
|
166
|
+
}
|
|
167
|
+
// Update provider assignment settings
|
|
168
|
+
export function setProviderAssignment(settings) {
|
|
169
|
+
const config = loadConfig();
|
|
170
|
+
const currentTaskProviders = config.providerAssignment.taskProviders || DEFAULT_CONFIG.providerAssignment.taskProviders;
|
|
171
|
+
const newTaskProviders = settings.taskProviders || {};
|
|
172
|
+
config.providerAssignment = {
|
|
173
|
+
...config.providerAssignment,
|
|
174
|
+
...settings,
|
|
175
|
+
taskProviders: {
|
|
176
|
+
planning: newTaskProviders.planning ?? currentTaskProviders.planning,
|
|
177
|
+
coding: newTaskProviders.coding ?? currentTaskProviders.coding,
|
|
178
|
+
analysis: newTaskProviders.analysis ?? currentTaskProviders.analysis,
|
|
179
|
+
research: newTaskProviders.research ?? currentTaskProviders.research,
|
|
180
|
+
documentation: newTaskProviders.documentation ?? currentTaskProviders.documentation,
|
|
181
|
+
commands: newTaskProviders.commands ?? currentTaskProviders.commands,
|
|
182
|
+
},
|
|
183
|
+
};
|
|
184
|
+
saveConfig(config);
|
|
185
|
+
}
|
|
107
186
|
//# sourceMappingURL=settings.js.map
|