@travisennis/acai 0.0.12 → 0.0.14
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 +5 -2
- package/dist/agent/index.d.ts.map +1 -1
- package/dist/agent/index.js +91 -5
- package/dist/commands/history/types.d.ts +3 -2
- package/dist/commands/history/types.d.ts.map +1 -1
- package/dist/commands/init-project/utils.d.ts +0 -1
- package/dist/commands/init-project/utils.d.ts.map +1 -1
- package/dist/commands/init-project/utils.js +1 -1
- package/dist/commands/manager.d.ts.map +1 -1
- package/dist/commands/manager.js +0 -18
- package/dist/commands/share/html-renderer.d.ts.map +1 -1
- package/dist/commands/share/html-renderer.js +54 -48
- package/dist/commands/tools/index.js +39 -38
- package/dist/config/index.d.ts +0 -2
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +3 -7
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +94 -76
- package/dist/models/manager.d.ts +1 -10
- package/dist/models/manager.d.ts.map +1 -1
- package/dist/models/manager.js +2 -2
- package/dist/models/opencode-go-provider.d.ts +6 -4
- package/dist/models/opencode-go-provider.d.ts.map +1 -1
- package/dist/models/opencode-go-provider.js +55 -35
- package/dist/models/providers.d.ts +1 -1
- package/dist/models/providers.d.ts.map +1 -1
- package/dist/prompts/system-prompt.d.ts +0 -2
- package/dist/prompts/system-prompt.d.ts.map +1 -1
- package/dist/prompts/system-prompt.js +6 -10
- package/dist/repl/index.d.ts +27 -11
- package/dist/repl/index.d.ts.map +1 -1
- package/dist/repl/index.js +238 -254
- package/dist/sessions/manager.d.ts +41 -0
- package/dist/sessions/manager.d.ts.map +1 -1
- package/dist/sessions/manager.js +53 -0
- package/dist/sessions/summary.d.ts.map +1 -1
- package/dist/sessions/summary.js +18 -0
- package/dist/skills/index.d.ts +12 -2
- package/dist/skills/index.d.ts.map +1 -1
- package/dist/skills/index.js +123 -73
- package/dist/terminal/control.d.ts +1 -21
- package/dist/terminal/control.d.ts.map +1 -1
- package/dist/terminal/control.js +1 -32
- package/dist/terminal/formatting.d.ts +0 -33
- package/dist/terminal/formatting.d.ts.map +1 -1
- package/dist/terminal/formatting.js +0 -91
- package/dist/terminal/highlight/theme.d.ts +0 -37
- package/dist/terminal/highlight/theme.d.ts.map +1 -1
- package/dist/terminal/highlight/theme.js +1 -79
- package/dist/terminal/keys.d.ts +0 -97
- package/dist/terminal/keys.d.ts.map +1 -1
- package/dist/terminal/keys.js +0 -194
- package/dist/terminal/select-prompt.d.ts.map +1 -1
- package/dist/terminal/select-prompt.js +65 -51
- package/dist/terminal/style.d.ts +1 -1
- package/dist/terminal/style.d.ts.map +1 -1
- package/dist/terminal/supports-color.d.ts.map +1 -1
- package/dist/terminal/supports-color.js +38 -20
- package/dist/terminal/supports-hyperlinks.d.ts +3 -0
- package/dist/terminal/supports-hyperlinks.d.ts.map +1 -1
- package/dist/terminal/supports-hyperlinks.js +72 -31
- package/dist/terminal/table/layout-manager.d.ts +0 -20
- package/dist/terminal/table/layout-manager.d.ts.map +1 -1
- package/dist/terminal/table/layout-manager.js +68 -44
- package/dist/terminal/table/utils.d.ts +0 -1
- package/dist/terminal/table/utils.d.ts.map +1 -1
- package/dist/terminal/table/utils.js +2 -4
- package/dist/tools/apply-patch.d.ts +5 -3
- package/dist/tools/apply-patch.d.ts.map +1 -1
- package/dist/tools/apply-patch.js +154 -123
- package/dist/tools/bash.d.ts.map +1 -1
- package/dist/tools/bash.js +11 -8
- package/dist/tools/dynamic-tool-loader.d.ts +6 -1
- package/dist/tools/dynamic-tool-loader.d.ts.map +1 -1
- package/dist/tools/dynamic-tool-loader.js +154 -135
- package/dist/tools/index.d.ts +3 -133
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +0 -20
- package/dist/tools/read-file.d.ts.map +1 -1
- package/dist/tools/read-file.js +32 -13
- package/dist/tools/skill.d.ts.map +1 -1
- package/dist/tools/skill.js +20 -13
- package/dist/tools/web-fetch.d.ts +2 -6
- package/dist/tools/web-fetch.d.ts.map +1 -1
- package/dist/tools/web-fetch.js +59 -36
- package/dist/tools/web-search.d.ts +0 -4
- package/dist/tools/web-search.d.ts.map +1 -1
- package/dist/tools/web-search.js +40 -32
- package/dist/tui/autocomplete/utils.d.ts +0 -15
- package/dist/tui/autocomplete/utils.d.ts.map +1 -1
- package/dist/tui/autocomplete/utils.js +0 -85
- package/dist/tui/autocomplete.d.ts +1 -1
- package/dist/tui/autocomplete.d.ts.map +1 -1
- package/dist/tui/autocomplete.js +1 -1
- package/dist/tui/components/editor.d.ts +12 -0
- package/dist/tui/components/editor.d.ts.map +1 -1
- package/dist/tui/components/editor.js +181 -195
- package/dist/tui/components/input.d.ts +4 -0
- package/dist/tui/components/input.d.ts.map +1 -1
- package/dist/tui/components/input.js +33 -31
- package/dist/tui/components/markdown.d.ts +30 -0
- package/dist/tui/components/markdown.d.ts.map +1 -1
- package/dist/tui/components/markdown.js +274 -242
- package/dist/tui/components/modal.d.ts.map +1 -1
- package/dist/tui/components/modal.js +11 -11
- package/dist/tui/components/select-list.d.ts +5 -0
- package/dist/tui/components/select-list.d.ts.map +1 -1
- package/dist/tui/components/select-list.js +69 -98
- package/dist/tui/components/table.d.ts +6 -0
- package/dist/tui/components/table.d.ts.map +1 -1
- package/dist/tui/components/table.js +61 -52
- package/dist/tui/index.d.ts +1 -8
- package/dist/tui/index.d.ts.map +1 -1
- package/dist/tui/index.js +0 -8
- package/dist/tui/tui.d.ts +9 -0
- package/dist/tui/tui.d.ts.map +1 -1
- package/dist/tui/tui.js +78 -48
- package/dist/tui/utils.d.ts +7 -0
- package/dist/tui/utils.d.ts.map +1 -1
- package/dist/tui/utils.js +117 -53
- package/dist/utils/bash.d.ts.map +1 -1
- package/dist/utils/bash.js +156 -104
- package/dist/utils/command-protection.d.ts +3 -6
- package/dist/utils/command-protection.d.ts.map +1 -1
- package/dist/utils/command-protection.js +213 -100
- package/dist/utils/filesystem/operations.d.ts +0 -15
- package/dist/utils/filesystem/operations.d.ts.map +1 -1
- package/dist/utils/filesystem/operations.js +1 -38
- package/dist/utils/filesystem/security.d.ts.map +1 -1
- package/dist/utils/filesystem/security.js +22 -15
- package/dist/utils/filetype-detection.d.ts +0 -1
- package/dist/utils/filetype-detection.d.ts.map +1 -1
- package/dist/utils/filetype-detection.js +0 -12
- package/dist/utils/formatting.d.ts +0 -30
- package/dist/utils/formatting.d.ts.map +1 -1
- package/dist/utils/formatting.js +0 -44
- package/dist/utils/git.d.ts +4 -6
- package/dist/utils/git.d.ts.map +1 -1
- package/dist/utils/git.js +36 -46
- package/dist/utils/ignore.d.ts +1 -1
- package/dist/utils/ignore.d.ts.map +1 -1
- package/dist/utils/ignore.js +1 -1
- package/dist/utils/process.d.ts.map +1 -1
- package/dist/utils/process.js +77 -79
- package/dist/utils/yaml.d.ts +0 -1
- package/dist/utils/yaml.d.ts.map +1 -1
- package/dist/utils/yaml.js +80 -89
- package/dist/utils/zod.d.ts +0 -3
- package/dist/utils/zod.d.ts.map +1 -1
- package/dist/utils/zod.js +0 -7
- package/package.json +25 -24
- package/dist/agent/sub-agent.d.ts +0 -23
- package/dist/agent/sub-agent.d.ts.map +0 -1
- package/dist/agent/sub-agent.js +0 -109
- package/dist/commands/add-directory/index.d.ts +0 -3
- package/dist/commands/add-directory/index.d.ts.map +0 -1
- package/dist/commands/add-directory/index.js +0 -50
- package/dist/commands/add-directory/utils.d.ts +0 -3
- package/dist/commands/add-directory/utils.d.ts.map +0 -1
- package/dist/commands/add-directory/utils.js +0 -15
- package/dist/commands/clear/index.d.ts +0 -3
- package/dist/commands/clear/index.d.ts.map +0 -1
- package/dist/commands/clear/index.js +0 -13
- package/dist/commands/generate-rules/index.d.ts +0 -3
- package/dist/commands/generate-rules/index.d.ts.map +0 -1
- package/dist/commands/generate-rules/index.js +0 -206
- package/dist/commands/generate-rules/service.d.ts +0 -22
- package/dist/commands/generate-rules/service.d.ts.map +0 -1
- package/dist/commands/generate-rules/service.js +0 -103
- package/dist/commands/generate-rules/utils.d.ts +0 -5
- package/dist/commands/generate-rules/utils.d.ts.map +0 -1
- package/dist/commands/generate-rules/utils.js +0 -25
- package/dist/commands/handoff/index.d.ts +0 -3
- package/dist/commands/handoff/index.d.ts.map +0 -1
- package/dist/commands/handoff/index.js +0 -97
- package/dist/commands/handoff/utils.d.ts +0 -4
- package/dist/commands/handoff/utils.d.ts.map +0 -1
- package/dist/commands/handoff/utils.js +0 -123
- package/dist/commands/list-directories/index.d.ts +0 -3
- package/dist/commands/list-directories/index.d.ts.map +0 -1
- package/dist/commands/list-directories/index.js +0 -35
- package/dist/commands/pickup/index.d.ts +0 -3
- package/dist/commands/pickup/index.d.ts.map +0 -1
- package/dist/commands/pickup/index.js +0 -141
- package/dist/commands/pickup/types.d.ts +0 -6
- package/dist/commands/pickup/types.d.ts.map +0 -1
- package/dist/commands/pickup/types.js +0 -1
- package/dist/commands/pickup/utils.d.ts +0 -7
- package/dist/commands/pickup/utils.d.ts.map +0 -1
- package/dist/commands/pickup/utils.js +0 -56
- package/dist/commands/remove-directory/index.d.ts +0 -3
- package/dist/commands/remove-directory/index.d.ts.map +0 -1
- package/dist/commands/remove-directory/index.js +0 -55
- package/dist/commands/review/index.d.ts +0 -3
- package/dist/commands/review/index.d.ts.map +0 -1
- package/dist/commands/review/index.js +0 -12
- package/dist/commands/review/review-panel.d.ts +0 -3
- package/dist/commands/review/review-panel.d.ts.map +0 -1
- package/dist/commands/review/review-panel.js +0 -186
- package/dist/commands/review/utils.d.ts +0 -18
- package/dist/commands/review/utils.d.ts.map +0 -1
- package/dist/commands/review/utils.js +0 -146
- package/dist/commands/shell/index.d.ts +0 -3
- package/dist/commands/shell/index.d.ts.map +0 -1
- package/dist/commands/shell/index.js +0 -96
- package/dist/subagents/index.d.ts +0 -16
- package/dist/subagents/index.d.ts.map +0 -1
- package/dist/subagents/index.js +0 -231
- package/dist/terminal/index.d.ts +0 -9
- package/dist/terminal/index.d.ts.map +0 -1
- package/dist/terminal/index.js +0 -8
- package/dist/tools/agent.d.ts +0 -27
- package/dist/tools/agent.d.ts.map +0 -1
- package/dist/tools/agent.js +0 -81
- package/dist/tools/directory-tree.d.ts +0 -28
- package/dist/tools/directory-tree.d.ts.map +0 -1
- package/dist/tools/directory-tree.js +0 -154
- package/dist/tools/glob.d.ts +0 -35
- package/dist/tools/glob.d.ts.map +0 -1
- package/dist/tools/glob.js +0 -167
- package/dist/tools/grep.d.ts +0 -100
- package/dist/tools/grep.d.ts.map +0 -1
- package/dist/tools/grep.js +0 -608
- package/dist/tools/ls.d.ts +0 -26
- package/dist/tools/ls.d.ts.map +0 -1
- package/dist/tools/ls.js +0 -83
- package/dist/tui/components/header.d.ts +0 -21
- package/dist/tui/components/header.d.ts.map +0 -1
- package/dist/tui/components/header.js +0 -63
- package/dist/utils/bash/parse.d.ts +0 -19
- package/dist/utils/bash/parse.d.ts.map +0 -1
- package/dist/utils/bash/parse.js +0 -223
- package/dist/utils/bash/quote.d.ts +0 -6
- package/dist/utils/bash/quote.d.ts.map +0 -1
- package/dist/utils/bash/quote.js +0 -23
- package/dist/utils/generators.d.ts +0 -3
- package/dist/utils/generators.d.ts.map +0 -1
- package/dist/utils/generators.js +0 -25
- package/dist/utils/glob.d.ts +0 -52
- package/dist/utils/glob.d.ts.map +0 -1
- package/dist/utils/glob.js +0 -376
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../source/commands/remove-directory/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/D,eAAO,MAAM,sBAAsB,GAAI,gBAEpC,cAAc,KAAG,WAkGnB,CAAC"}
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
import path from "node:path";
|
|
2
|
-
import style from "../../terminal/style.js";
|
|
3
|
-
import { Text } from "../../tui/index.js";
|
|
4
|
-
export const removeDirectoryCommand = ({ workspace, }) => {
|
|
5
|
-
return {
|
|
6
|
-
command: "/remove-directory",
|
|
7
|
-
description: "Remove a directory from the list of allowed working directories",
|
|
8
|
-
getSubCommands: async () => {
|
|
9
|
-
// Return only non-primary directories for tab completion
|
|
10
|
-
return workspace.allowedDirs.filter((dir) => dir !== workspace.primaryDir);
|
|
11
|
-
},
|
|
12
|
-
async handle(args, { tui, container, editor, }) {
|
|
13
|
-
const directoryPath = args?.[0];
|
|
14
|
-
if (!directoryPath) {
|
|
15
|
-
container.addChild(new Text(style.red("Usage: /remove-directory <path>"), 0, 1));
|
|
16
|
-
tui.requestRender();
|
|
17
|
-
editor.setText("");
|
|
18
|
-
return "continue";
|
|
19
|
-
}
|
|
20
|
-
try {
|
|
21
|
-
// Resolve the directory path
|
|
22
|
-
const resolvedPath = path.resolve(directoryPath);
|
|
23
|
-
// Check if it's the primary directory
|
|
24
|
-
if (resolvedPath === workspace.primaryDir) {
|
|
25
|
-
container.addChild(new Text(style.red("Cannot remove the primary working directory"), 1, 0));
|
|
26
|
-
tui.requestRender();
|
|
27
|
-
editor.setText("");
|
|
28
|
-
return "continue";
|
|
29
|
-
}
|
|
30
|
-
// Find the directory in the list
|
|
31
|
-
const index = workspace.allowedDirs.indexOf(resolvedPath);
|
|
32
|
-
if (index === -1) {
|
|
33
|
-
container.addChild(new Text(style.red(`Directory not found in allowed list: ${resolvedPath}`), 1, 0));
|
|
34
|
-
tui.requestRender();
|
|
35
|
-
editor.setText("");
|
|
36
|
-
return "continue";
|
|
37
|
-
}
|
|
38
|
-
// Remove the directory
|
|
39
|
-
workspace.allowedDirs.splice(index, 1);
|
|
40
|
-
container.addChild(new Text(`Removed directory from allowed list: ${style.blue(resolvedPath)}`, 1, 0));
|
|
41
|
-
container.addChild(new Text(`Current allowed directories: ${style.blue(workspace.allowedDirs.join(", "))}`, 2, 0));
|
|
42
|
-
tui.requestRender();
|
|
43
|
-
editor.setText("");
|
|
44
|
-
return "continue";
|
|
45
|
-
}
|
|
46
|
-
catch (error) {
|
|
47
|
-
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
48
|
-
container.addChild(new Text(style.red(`Failed to remove directory: ${errorMessage}`), 1, 0));
|
|
49
|
-
tui.requestRender();
|
|
50
|
-
editor.setText("");
|
|
51
|
-
return "continue";
|
|
52
|
-
}
|
|
53
|
-
},
|
|
54
|
-
};
|
|
55
|
-
};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../source/commands/review/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG/D,eAAO,MAAM,aAAa,GAAI,UAAU,cAAc,KAAG,WAuBxD,CAAC"}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { showReviewPanel } from "./review-panel.js";
|
|
2
|
-
export const reviewCommand = (_options) => {
|
|
3
|
-
return {
|
|
4
|
-
command: "/review",
|
|
5
|
-
description: "Shows a diff of all changes in the current directory.",
|
|
6
|
-
getSubCommands: () => Promise.resolve([]),
|
|
7
|
-
async handle(_args, { tui, container, editor, inputContainer, }) {
|
|
8
|
-
await showReviewPanel(tui, container, inputContainer, editor);
|
|
9
|
-
return "continue";
|
|
10
|
-
},
|
|
11
|
-
};
|
|
12
|
-
};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"review-panel.d.ts","sourceRoot":"","sources":["../../../source/commands/review/review-panel.ts"],"names":[],"mappings":"AAOA,OAAO,EACL,SAAS,EACT,KAAK,MAAM,EAGX,KAAK,GAAG,EACT,MAAM,oBAAoB,CAAC;AAQ5B,wBAAsB,eAAe,CACnC,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,SAAS,EACpB,cAAc,EAAE,SAAS,EACzB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CA8Of"}
|
|
@@ -1,186 +0,0 @@
|
|
|
1
|
-
import { join } from "node:path";
|
|
2
|
-
import { initExecutionEnvironment } from "../../execution/index.js";
|
|
3
|
-
import { getTerminalSize } from "../../terminal/control.js";
|
|
4
|
-
import style from "../../terminal/style.js";
|
|
5
|
-
import { Markdown } from "../../tui/components/markdown.js";
|
|
6
|
-
import { Spacer } from "../../tui/components/spacer.js";
|
|
7
|
-
import { Container, SelectList, Text, } from "../../tui/index.js";
|
|
8
|
-
import { formatFileDiffForDisplay, getUntrackedFiles, openFileInEditor, parseGitDiffFiles, } from "./utils.js";
|
|
9
|
-
export async function showReviewPanel(tui, container, inputContainer, editor) {
|
|
10
|
-
try {
|
|
11
|
-
const execEnv = await initExecutionEnvironment();
|
|
12
|
-
const stagedResult = await execEnv.executeCommand("git diff --cached", {
|
|
13
|
-
cwd: process.cwd(),
|
|
14
|
-
timeout: 5000,
|
|
15
|
-
preserveOutputOnError: true,
|
|
16
|
-
captureStderr: true,
|
|
17
|
-
throwOnError: false,
|
|
18
|
-
});
|
|
19
|
-
const unstagedResult = await execEnv.executeCommand("git diff", {
|
|
20
|
-
cwd: process.cwd(),
|
|
21
|
-
timeout: 5000,
|
|
22
|
-
preserveOutputOnError: true,
|
|
23
|
-
captureStderr: true,
|
|
24
|
-
throwOnError: false,
|
|
25
|
-
});
|
|
26
|
-
const untrackedResult = await execEnv.executeCommand("git ls-files --others --exclude-standard", {
|
|
27
|
-
cwd: process.cwd(),
|
|
28
|
-
timeout: 5000,
|
|
29
|
-
preserveOutputOnError: true,
|
|
30
|
-
captureStderr: true,
|
|
31
|
-
throwOnError: false,
|
|
32
|
-
});
|
|
33
|
-
const stagedOutput = stagedResult.exitCode === 0 ? stagedResult.output : "";
|
|
34
|
-
const unstagedOutput = unstagedResult.exitCode === 0 ? unstagedResult.output : "";
|
|
35
|
-
const untrackedOutput = untrackedResult.exitCode === 0 ? untrackedResult.output : "";
|
|
36
|
-
const combinedOutput = stagedOutput +
|
|
37
|
-
(stagedOutput && unstagedOutput ? "\n" : "") +
|
|
38
|
-
unstagedOutput;
|
|
39
|
-
if (!combinedOutput.trim()) {
|
|
40
|
-
container.addChild(new Spacer(1));
|
|
41
|
-
container.addChild(new Markdown("No changes detected in the current directory.", {
|
|
42
|
-
customBgRgb: {
|
|
43
|
-
r: 52,
|
|
44
|
-
g: 53,
|
|
45
|
-
b: 65,
|
|
46
|
-
},
|
|
47
|
-
paddingX: 1,
|
|
48
|
-
paddingY: 1,
|
|
49
|
-
}));
|
|
50
|
-
tui.requestRender();
|
|
51
|
-
return;
|
|
52
|
-
}
|
|
53
|
-
const fileChanges = parseGitDiffFiles(combinedOutput);
|
|
54
|
-
const untrackedFiles = await getUntrackedFiles(untrackedOutput, process.cwd());
|
|
55
|
-
fileChanges.push(...untrackedFiles);
|
|
56
|
-
if (fileChanges.length === 0) {
|
|
57
|
-
container.addChild(new Spacer(1));
|
|
58
|
-
container.addChild(new Markdown("No file changes could be parsed.", {
|
|
59
|
-
customBgRgb: {
|
|
60
|
-
r: 52,
|
|
61
|
-
g: 53,
|
|
62
|
-
b: 65,
|
|
63
|
-
},
|
|
64
|
-
paddingX: 1,
|
|
65
|
-
paddingY: 1,
|
|
66
|
-
}));
|
|
67
|
-
tui.requestRender();
|
|
68
|
-
return;
|
|
69
|
-
}
|
|
70
|
-
const selectItems = fileChanges.map((file) => ({
|
|
71
|
-
value: file.fileName,
|
|
72
|
-
label: file.fileName,
|
|
73
|
-
description: file.stats,
|
|
74
|
-
}));
|
|
75
|
-
const selectList = new SelectList(selectItems, 10);
|
|
76
|
-
const selectContainer = new Container();
|
|
77
|
-
const { columns } = getTerminalSize();
|
|
78
|
-
selectContainer.addChild(new Text(style.blue("─".repeat(columns)), 0, 0));
|
|
79
|
-
selectContainer.addChild(new Spacer(1));
|
|
80
|
-
selectContainer.addChild(selectList);
|
|
81
|
-
selectContainer.addChild(new Spacer(1));
|
|
82
|
-
selectContainer.addChild(new Text(style.blue("─".repeat(columns)), 0, 0));
|
|
83
|
-
const originalEditor = editor;
|
|
84
|
-
inputContainer.clear();
|
|
85
|
-
inputContainer.addChild(selectContainer);
|
|
86
|
-
tui.setFocus(selectList);
|
|
87
|
-
selectList.onSelect = (selectedItem) => {
|
|
88
|
-
const selectedFile = fileChanges.find((file) => file.fileName === selectedItem.value);
|
|
89
|
-
if (!selectedFile) {
|
|
90
|
-
container.addChild(new Spacer(1));
|
|
91
|
-
container.addChild(new Markdown(style.red("Error: Selected file not found."), {
|
|
92
|
-
customBgRgb: {
|
|
93
|
-
r: 52,
|
|
94
|
-
g: 53,
|
|
95
|
-
b: 65,
|
|
96
|
-
},
|
|
97
|
-
paddingX: 1,
|
|
98
|
-
paddingY: 1,
|
|
99
|
-
}));
|
|
100
|
-
tui.requestRender();
|
|
101
|
-
return;
|
|
102
|
-
}
|
|
103
|
-
const actionItems = [
|
|
104
|
-
{ value: "diff", label: "View diff", description: "Show changes" },
|
|
105
|
-
{
|
|
106
|
-
value: "edit",
|
|
107
|
-
label: "Open in editor",
|
|
108
|
-
description: `Open in ${process.env["EDITOR"] || process.env["VISUAL"] || "vi"}`,
|
|
109
|
-
},
|
|
110
|
-
];
|
|
111
|
-
const actionSelectList = new SelectList(actionItems, 5);
|
|
112
|
-
const actionContainer = new Container();
|
|
113
|
-
actionContainer.addChild(new Spacer(1));
|
|
114
|
-
actionContainer.addChild(new Text(style.blue(`Selected: ${selectedFile.fileName}`), 0, 0));
|
|
115
|
-
actionContainer.addChild(new Spacer(1));
|
|
116
|
-
actionContainer.addChild(actionSelectList);
|
|
117
|
-
actionContainer.addChild(new Spacer(1));
|
|
118
|
-
actionContainer.addChild(new Text(style.blue("─".repeat(columns)), 0, 0));
|
|
119
|
-
inputContainer.clear();
|
|
120
|
-
inputContainer.addChild(actionContainer);
|
|
121
|
-
tui.setFocus(actionSelectList);
|
|
122
|
-
tui.requestRender();
|
|
123
|
-
actionSelectList.onSelect = (actionItem) => {
|
|
124
|
-
if (actionItem.value === "diff") {
|
|
125
|
-
container.addChild(new Spacer(1));
|
|
126
|
-
container.addChild(new Markdown(formatFileDiffForDisplay(selectedFile.fileName, selectedFile.diff), {
|
|
127
|
-
customBgRgb: {
|
|
128
|
-
r: 52,
|
|
129
|
-
g: 53,
|
|
130
|
-
b: 65,
|
|
131
|
-
},
|
|
132
|
-
paddingX: 1,
|
|
133
|
-
paddingY: 1,
|
|
134
|
-
}));
|
|
135
|
-
}
|
|
136
|
-
else if (actionItem.value === "edit") {
|
|
137
|
-
const filePath = join(process.cwd(), selectedFile.fileName);
|
|
138
|
-
const result = openFileInEditor(filePath, tui.getTerminal());
|
|
139
|
-
if (!result.success) {
|
|
140
|
-
container.addChild(new Spacer(1));
|
|
141
|
-
container.addChild(new Markdown(`Failed to open file in editor: ${result.error || "Unknown error"}`, {
|
|
142
|
-
customBgRgb: {
|
|
143
|
-
r: 52,
|
|
144
|
-
g: 53,
|
|
145
|
-
b: 65,
|
|
146
|
-
},
|
|
147
|
-
paddingX: 1,
|
|
148
|
-
paddingY: 1,
|
|
149
|
-
}));
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
inputContainer.clear();
|
|
153
|
-
inputContainer.addChild(originalEditor);
|
|
154
|
-
tui.setFocus(originalEditor);
|
|
155
|
-
tui.requestRender();
|
|
156
|
-
};
|
|
157
|
-
actionSelectList.onCancel = () => {
|
|
158
|
-
inputContainer.clear();
|
|
159
|
-
inputContainer.addChild(selectContainer);
|
|
160
|
-
tui.setFocus(selectList);
|
|
161
|
-
tui.requestRender();
|
|
162
|
-
};
|
|
163
|
-
};
|
|
164
|
-
selectList.onCancel = () => {
|
|
165
|
-
inputContainer.clear();
|
|
166
|
-
inputContainer.addChild(originalEditor);
|
|
167
|
-
tui.setFocus(originalEditor);
|
|
168
|
-
tui.requestRender();
|
|
169
|
-
};
|
|
170
|
-
tui.requestRender();
|
|
171
|
-
}
|
|
172
|
-
catch (error) {
|
|
173
|
-
console.error("Error executing git diff:", error);
|
|
174
|
-
container.addChild(new Spacer(1));
|
|
175
|
-
container.addChild(new Markdown("Failed to retrieve git changes. Ensure git is installed and initialized.", {
|
|
176
|
-
customBgRgb: {
|
|
177
|
-
r: 52,
|
|
178
|
-
g: 53,
|
|
179
|
-
b: 65,
|
|
180
|
-
},
|
|
181
|
-
paddingX: 1,
|
|
182
|
-
paddingY: 1,
|
|
183
|
-
}));
|
|
184
|
-
tui.requestRender();
|
|
185
|
-
}
|
|
186
|
-
}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import type { Terminal } from "../../tui/terminal.ts";
|
|
2
|
-
interface FileChange {
|
|
3
|
-
fileName: string;
|
|
4
|
-
diff: string;
|
|
5
|
-
stats: string;
|
|
6
|
-
}
|
|
7
|
-
export declare function parseGitDiffFiles(diffOutput: string): FileChange[];
|
|
8
|
-
export declare function formatFileDiffForDisplay(fileName: string, diff: string): string;
|
|
9
|
-
export declare function getUntrackedFiles(untrackedOutput: string, cwd: string): Promise<FileChange[]>;
|
|
10
|
-
/**
|
|
11
|
-
* Open a file in the user's preferred editor ($EDITOR or $VISUAL)
|
|
12
|
-
*/
|
|
13
|
-
export declare function openFileInEditor(filePath: string, terminal: Terminal): {
|
|
14
|
-
success: boolean;
|
|
15
|
-
error?: string;
|
|
16
|
-
};
|
|
17
|
-
export {};
|
|
18
|
-
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../source/commands/review/utils.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEtD,UAAU,UAAU;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AA6CD,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU,EAAE,CAwBlE;AAgBD,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,GACX,MAAM,CAaR;AAED,wBAAsB,iBAAiB,CACrC,eAAe,EAAE,MAAM,EACvB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,UAAU,EAAE,CAAC,CAsCvB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,QAAQ,GACjB;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAyBtC"}
|
|
@@ -1,146 +0,0 @@
|
|
|
1
|
-
import { spawnSync } from "node:child_process";
|
|
2
|
-
import fs from "node:fs";
|
|
3
|
-
import { join } from "node:path";
|
|
4
|
-
function isDiffContentLine(line) {
|
|
5
|
-
return ((line.startsWith("+") && !line.startsWith("+++")) ||
|
|
6
|
-
(line.startsWith("-") && !line.startsWith("---")) ||
|
|
7
|
-
line.startsWith(" ") ||
|
|
8
|
-
line.startsWith("index") ||
|
|
9
|
-
line.startsWith("old mode") ||
|
|
10
|
-
line.startsWith("new mode") ||
|
|
11
|
-
line.startsWith("deleted file") ||
|
|
12
|
-
line.startsWith("new file"));
|
|
13
|
-
}
|
|
14
|
-
function parseHunkStats(line, isNewFile) {
|
|
15
|
-
const statsMatch = line.match(/@@ -(\d+),(\d+) \+(\d+),(\d+) @@/);
|
|
16
|
-
if (!statsMatch) {
|
|
17
|
-
return "Additions: 1, Deletions: 0";
|
|
18
|
-
}
|
|
19
|
-
const deletions = isNewFile ? 0 : Number.parseInt(statsMatch[2], 10);
|
|
20
|
-
const additions = Number.parseInt(statsMatch[4], 10);
|
|
21
|
-
return `Additions: ${additions}, Deletions: ${deletions}`;
|
|
22
|
-
}
|
|
23
|
-
function startNewFile(state, line) {
|
|
24
|
-
if (state.currentFile) {
|
|
25
|
-
state.fileChanges.push(state.currentFile);
|
|
26
|
-
}
|
|
27
|
-
const fileMatch = line.match(/diff --git a\/(.*) b\/(.*)/);
|
|
28
|
-
if (!fileMatch)
|
|
29
|
-
return;
|
|
30
|
-
state.currentFile = { fileName: fileMatch[1], diff: "", stats: "" };
|
|
31
|
-
state.inDiff = true;
|
|
32
|
-
state.isNewFile =
|
|
33
|
-
fileMatch[1] === "/dev/null" || fileMatch[2] === "/dev/null";
|
|
34
|
-
}
|
|
35
|
-
export function parseGitDiffFiles(diffOutput) {
|
|
36
|
-
const lines = diffOutput.split("\n");
|
|
37
|
-
const state = {
|
|
38
|
-
fileChanges: [],
|
|
39
|
-
currentFile: null,
|
|
40
|
-
inDiff: false,
|
|
41
|
-
isNewFile: false,
|
|
42
|
-
};
|
|
43
|
-
for (const line of lines) {
|
|
44
|
-
if (line.startsWith("diff --git")) {
|
|
45
|
-
startNewFile(state, line);
|
|
46
|
-
}
|
|
47
|
-
else if (line.startsWith("@@") && state.currentFile) {
|
|
48
|
-
state.currentFile.stats = parseHunkStats(line, state.isNewFile);
|
|
49
|
-
}
|
|
50
|
-
else if (state.inDiff && state.currentFile && isDiffContentLine(line)) {
|
|
51
|
-
state.currentFile.diff += `${line}\n`;
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
if (state.currentFile) {
|
|
55
|
-
state.fileChanges.push(state.currentFile);
|
|
56
|
-
}
|
|
57
|
-
return state.fileChanges;
|
|
58
|
-
}
|
|
59
|
-
function formatDiffLine(line) {
|
|
60
|
-
if (line.trim() === "")
|
|
61
|
-
return null;
|
|
62
|
-
if (line.startsWith("+") && !line.startsWith("+++")) {
|
|
63
|
-
return `+${line.substring(1)}`;
|
|
64
|
-
}
|
|
65
|
-
if (line.startsWith("-") && !line.startsWith("---")) {
|
|
66
|
-
return `-${line.substring(1)}`;
|
|
67
|
-
}
|
|
68
|
-
if (line.startsWith(" ")) {
|
|
69
|
-
return ` ${line.substring(1)}`;
|
|
70
|
-
}
|
|
71
|
-
return line;
|
|
72
|
-
}
|
|
73
|
-
export function formatFileDiffForDisplay(fileName, diff) {
|
|
74
|
-
const lines = diff.split("\n");
|
|
75
|
-
const formattedLines = [`### ${fileName}`, "", "```diff"];
|
|
76
|
-
for (const line of lines) {
|
|
77
|
-
const formatted = formatDiffLine(line);
|
|
78
|
-
if (formatted !== null) {
|
|
79
|
-
formattedLines.push(formatted);
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
formattedLines.push("```");
|
|
83
|
-
return formattedLines.join("\n");
|
|
84
|
-
}
|
|
85
|
-
export async function getUntrackedFiles(untrackedOutput, cwd) {
|
|
86
|
-
const fileChanges = [];
|
|
87
|
-
const untrackedFiles = untrackedOutput
|
|
88
|
-
.trim()
|
|
89
|
-
.split("\n")
|
|
90
|
-
.filter((file) => file.length > 0);
|
|
91
|
-
for (const fileName of untrackedFiles) {
|
|
92
|
-
try {
|
|
93
|
-
const filePath = join(cwd, fileName);
|
|
94
|
-
const fileContent = await fs.promises.readFile(filePath, "utf-8");
|
|
95
|
-
const lines = fileContent.split("\n").length;
|
|
96
|
-
// Create a diff-like representation for the untracked file
|
|
97
|
-
const diff = `diff --git a/${fileName} b/${fileName}
|
|
98
|
-
new file mode 100644
|
|
99
|
-
index 0000000..0000000
|
|
100
|
-
--- /dev/null
|
|
101
|
-
+++ b/${fileName}
|
|
102
|
-
@@ -0,0 +1,${lines} @@
|
|
103
|
-
${fileContent
|
|
104
|
-
.split("\n")
|
|
105
|
-
.map((line) => `+${line}`)
|
|
106
|
-
.join("\n")}
|
|
107
|
-
`;
|
|
108
|
-
fileChanges.push({
|
|
109
|
-
fileName,
|
|
110
|
-
diff,
|
|
111
|
-
stats: `Additions: ${lines}, Deletions: 0`,
|
|
112
|
-
});
|
|
113
|
-
}
|
|
114
|
-
catch (error) {
|
|
115
|
-
// Skip files that can't be read (e.g., directories, binary files)
|
|
116
|
-
console.error(`Failed to read untracked file: ${fileName}`, error);
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
return fileChanges;
|
|
120
|
-
}
|
|
121
|
-
/**
|
|
122
|
-
* Open a file in the user's preferred editor ($EDITOR or $VISUAL)
|
|
123
|
-
*/
|
|
124
|
-
export function openFileInEditor(filePath, terminal) {
|
|
125
|
-
const editor = process.env["EDITOR"] || process.env["VISUAL"] || "vi";
|
|
126
|
-
terminal.enterExternalMode();
|
|
127
|
-
try {
|
|
128
|
-
const result = spawnSync(editor, [filePath], {
|
|
129
|
-
stdio: "inherit",
|
|
130
|
-
});
|
|
131
|
-
if (result.error) {
|
|
132
|
-
return { success: false, error: result.error.message };
|
|
133
|
-
}
|
|
134
|
-
// Note: Editors often exit with non-zero codes (e.g., :cq in vim, or when
|
|
135
|
-
// quitting without saving). We only treat spawn errors as failures, not
|
|
136
|
-
// exit codes, since the user may intentionally exit with an error code.
|
|
137
|
-
return { success: true };
|
|
138
|
-
}
|
|
139
|
-
catch (error) {
|
|
140
|
-
const errorMessage = error instanceof Error ? error.message : "Unknown error";
|
|
141
|
-
return { success: false, error: errorMessage };
|
|
142
|
-
}
|
|
143
|
-
finally {
|
|
144
|
-
terminal.exitExternalMode();
|
|
145
|
-
}
|
|
146
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../source/commands/shell/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAK/D,eAAO,MAAM,YAAY,GAAI,SAAS,cAAc,KAAG,WAuItD,CAAC"}
|
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
import { initExecutionEnvironment } from "../../execution/index.js";
|
|
2
|
-
import style from "../../terminal/style.js";
|
|
3
|
-
import { Loader, SelectList, Spacer, Text } from "../../tui/index.js";
|
|
4
|
-
// Command execution timeout in milliseconds
|
|
5
|
-
const DEFAULT_TIMEOUT = 1.5 * 60 * 1000; // 1.5 minutes
|
|
6
|
-
export const shellCommand = (options) => {
|
|
7
|
-
const { promptManager, tokenCounter } = options;
|
|
8
|
-
return {
|
|
9
|
-
command: "/shell",
|
|
10
|
-
aliases: ["/sh"],
|
|
11
|
-
description: "Run a non-interactive shell command on the local machine.",
|
|
12
|
-
getSubCommands: () => Promise.resolve([]),
|
|
13
|
-
async handle(args, { tui, container, editor, }) {
|
|
14
|
-
const commandStr = args.join(" ");
|
|
15
|
-
if (!commandStr.trim()) {
|
|
16
|
-
container.addChild(new Text(style.red("Provide a non-empty command."), 0, 1));
|
|
17
|
-
tui.requestRender();
|
|
18
|
-
editor.setText("");
|
|
19
|
-
return "continue";
|
|
20
|
-
}
|
|
21
|
-
const execEnv = await initExecutionEnvironment();
|
|
22
|
-
const colorEnv = {
|
|
23
|
-
["FORCE_COLOR"]: "1",
|
|
24
|
-
["CLICOLOR"]: "1",
|
|
25
|
-
["CLICOLOR_FORCE"]: "1",
|
|
26
|
-
["TERM"]: process.env["TERM"] ?? "xterm-256color",
|
|
27
|
-
["COLORTERM"]: process.env["COLORTERM"] ?? "truecolor",
|
|
28
|
-
["npm_config_color"]: "true",
|
|
29
|
-
};
|
|
30
|
-
// Show loader before execution
|
|
31
|
-
const truncatedCommand = commandStr.length > 50
|
|
32
|
-
? `${commandStr.substring(0, 50)}...`
|
|
33
|
-
: commandStr;
|
|
34
|
-
const loader = new Loader(tui, `Running: ${truncatedCommand}`);
|
|
35
|
-
container.addChild(loader);
|
|
36
|
-
tui.requestRender();
|
|
37
|
-
const { output, exitCode, duration } = await execEnv.executeCommand(commandStr, {
|
|
38
|
-
cwd: process.cwd(),
|
|
39
|
-
timeout: DEFAULT_TIMEOUT,
|
|
40
|
-
preserveOutputOnError: true,
|
|
41
|
-
captureStderr: true,
|
|
42
|
-
throwOnError: false,
|
|
43
|
-
env: colorEnv,
|
|
44
|
-
});
|
|
45
|
-
// Cleanup loader
|
|
46
|
-
loader.stop();
|
|
47
|
-
container.removeChild(loader);
|
|
48
|
-
// Display results with spacing
|
|
49
|
-
container.addChild(new Spacer(1));
|
|
50
|
-
container.addChild(new Text(style.gray(`Exit code: ${exitCode}, Duration: ${duration}ms`), 1, 0));
|
|
51
|
-
container.addChild(new Spacer(1));
|
|
52
|
-
container.addChild(new Text(output, 2, 0));
|
|
53
|
-
// Create context selection component
|
|
54
|
-
const contextSelector = new SelectList([
|
|
55
|
-
{
|
|
56
|
-
value: "yes",
|
|
57
|
-
label: "Yes",
|
|
58
|
-
description: "Add output to prompt context",
|
|
59
|
-
},
|
|
60
|
-
{
|
|
61
|
-
value: "no",
|
|
62
|
-
label: "No",
|
|
63
|
-
description: "Do not add output to context",
|
|
64
|
-
},
|
|
65
|
-
]);
|
|
66
|
-
contextSelector.onSelect = (item) => {
|
|
67
|
-
if (item.value === "yes") {
|
|
68
|
-
const tokenCount = tokenCounter.count(output);
|
|
69
|
-
promptManager.addContext(output);
|
|
70
|
-
container.addChild(new Text(style.green(`Output added to prompt context. (${tokenCount} tokens)`), 3, 0));
|
|
71
|
-
}
|
|
72
|
-
else {
|
|
73
|
-
container.addChild(new Text(style.gray("Output not added to context."), 3, 0));
|
|
74
|
-
}
|
|
75
|
-
// Remove the selector and show final result
|
|
76
|
-
container.removeChild(contextSelector);
|
|
77
|
-
tui.setFocus(editor);
|
|
78
|
-
tui.requestRender();
|
|
79
|
-
editor.setText("");
|
|
80
|
-
};
|
|
81
|
-
contextSelector.onCancel = () => {
|
|
82
|
-
// User cancelled - default to not adding to context
|
|
83
|
-
container.addChild(new Text(style.gray("Output not added to context."), 3, 0));
|
|
84
|
-
container.removeChild(contextSelector);
|
|
85
|
-
tui.setFocus(editor);
|
|
86
|
-
tui.requestRender();
|
|
87
|
-
editor.setText("");
|
|
88
|
-
};
|
|
89
|
-
// Add the selector to the container
|
|
90
|
-
container.addChild(contextSelector);
|
|
91
|
-
tui.setFocus(contextSelector);
|
|
92
|
-
tui.requestRender();
|
|
93
|
-
return "continue";
|
|
94
|
-
},
|
|
95
|
-
};
|
|
96
|
-
};
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
interface Subagent {
|
|
2
|
-
name: string;
|
|
3
|
-
description: string;
|
|
4
|
-
model?: string;
|
|
5
|
-
tools?: string[];
|
|
6
|
-
timeout: number;
|
|
7
|
-
systemPrompt: string;
|
|
8
|
-
filePath: string;
|
|
9
|
-
source: string;
|
|
10
|
-
}
|
|
11
|
-
export declare function loadSubagents(): Promise<Subagent[]>;
|
|
12
|
-
export declare function getSubagent(name: string): Promise<Subagent | undefined>;
|
|
13
|
-
export declare function formatSubagentsForDescription(subagents: Subagent[]): string;
|
|
14
|
-
export declare function formatSubagentsForPrompt(subagents: Subagent[]): string;
|
|
15
|
-
export {};
|
|
16
|
-
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../source/subagents/index.ts"],"names":[],"mappings":"AAeA,UAAU,QAAQ;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAkND,wBAAsB,aAAa,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC,CAgBzD;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,CAG7E;AAED,wBAAgB,6BAA6B,CAAC,SAAS,EAAE,QAAQ,EAAE,GAAG,MAAM,CAa3E;AAED,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,QAAQ,EAAE,GAAG,MAAM,CA6CtE"}
|