@caoxupei/ai-agent-cli 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +350 -0
- package/bin/ai-agent-cli.js +14 -0
- package/dist/adapters/anthropic.d.ts +15 -0
- package/dist/adapters/anthropic.d.ts.map +1 -0
- package/dist/adapters/anthropic.js +83 -0
- package/dist/adapters/anthropic.js.map +1 -0
- package/dist/adapters/base.d.ts +45 -0
- package/dist/adapters/base.d.ts.map +1 -0
- package/dist/adapters/base.js +27 -0
- package/dist/adapters/base.js.map +1 -0
- package/dist/adapters/factory.d.ts +17 -0
- package/dist/adapters/factory.d.ts.map +1 -0
- package/dist/adapters/factory.js +34 -0
- package/dist/adapters/factory.js.map +1 -0
- package/dist/adapters/gemini.d.ts +16 -0
- package/dist/adapters/gemini.d.ts.map +1 -0
- package/dist/adapters/gemini.js +164 -0
- package/dist/adapters/gemini.js.map +1 -0
- package/dist/adapters/openai.d.ts +15 -0
- package/dist/adapters/openai.d.ts.map +1 -0
- package/dist/adapters/openai.js +175 -0
- package/dist/adapters/openai.js.map +1 -0
- package/dist/commands/skillCommands.d.ts +21 -0
- package/dist/commands/skillCommands.d.ts.map +1 -0
- package/dist/commands/skillCommands.js +320 -0
- package/dist/commands/skillCommands.js.map +1 -0
- package/dist/config/Config.d.ts +35 -0
- package/dist/config/Config.d.ts.map +1 -0
- package/dist/config/Config.js +108 -0
- package/dist/config/Config.js.map +1 -0
- package/dist/config/types.d.ts +48 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +32 -0
- package/dist/config/types.js.map +1 -0
- package/dist/core/agents.d.ts +32 -0
- package/dist/core/agents.d.ts.map +1 -0
- package/dist/core/agents.js +93 -0
- package/dist/core/agents.js.map +1 -0
- package/dist/core/constants.d.ts +97 -0
- package/dist/core/constants.d.ts.map +1 -0
- package/dist/core/constants.js +119 -0
- package/dist/core/constants.js.map +1 -0
- package/dist/core/loop.d.ts +33 -0
- package/dist/core/loop.d.ts.map +1 -0
- package/dist/core/loop.js +134 -0
- package/dist/core/loop.js.map +1 -0
- package/dist/core/outputStyles.d.ts +50 -0
- package/dist/core/outputStyles.d.ts.map +1 -0
- package/dist/core/outputStyles.js +165 -0
- package/dist/core/outputStyles.js.map +1 -0
- package/dist/core/planMode.d.ts +40 -0
- package/dist/core/planMode.d.ts.map +1 -0
- package/dist/core/planMode.js +143 -0
- package/dist/core/planMode.js.map +1 -0
- package/dist/core/projectContext.d.ts +68 -0
- package/dist/core/projectContext.d.ts.map +1 -0
- package/dist/core/projectContext.js +183 -0
- package/dist/core/projectContext.js.map +1 -0
- package/dist/core/prompts.d.ts +26 -0
- package/dist/core/prompts.d.ts.map +1 -0
- package/dist/core/prompts.js +267 -0
- package/dist/core/prompts.js.map +1 -0
- package/dist/core/reminder.d.ts +72 -0
- package/dist/core/reminder.d.ts.map +1 -0
- package/dist/core/reminder.js +152 -0
- package/dist/core/reminder.js.map +1 -0
- package/dist/core/theme.d.ts +35 -0
- package/dist/core/theme.d.ts.map +1 -0
- package/dist/core/theme.js +56 -0
- package/dist/core/theme.js.map +1 -0
- package/dist/core/types.d.ts +55 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +5 -0
- package/dist/core/types.js.map +1 -0
- package/dist/core/ui/Banner.d.ts +47 -0
- package/dist/core/ui/Banner.d.ts.map +1 -0
- package/dist/core/ui/Banner.js +122 -0
- package/dist/core/ui/Banner.js.map +1 -0
- package/dist/core/ui/Input.d.ts +51 -0
- package/dist/core/ui/Input.d.ts.map +1 -0
- package/dist/core/ui/Input.js +322 -0
- package/dist/core/ui/Input.js.map +1 -0
- package/dist/core/ui/Logo.d.ts +21 -0
- package/dist/core/ui/Logo.d.ts.map +1 -0
- package/dist/core/ui/Logo.js +31 -0
- package/dist/core/ui/Logo.js.map +1 -0
- package/dist/core/ui/Messages.d.ts +45 -0
- package/dist/core/ui/Messages.d.ts.map +1 -0
- package/dist/core/ui/Messages.js +76 -0
- package/dist/core/ui/Messages.js.map +1 -0
- package/dist/core/ui/Spinner.d.ts +29 -0
- package/dist/core/ui/Spinner.d.ts.map +1 -0
- package/dist/core/ui/Spinner.js +64 -0
- package/dist/core/ui/Spinner.js.map +1 -0
- package/dist/core/ui/ToolDisplay.d.ts +49 -0
- package/dist/core/ui/ToolDisplay.d.ts.map +1 -0
- package/dist/core/ui/ToolDisplay.js +99 -0
- package/dist/core/ui/ToolDisplay.js.map +1 -0
- package/dist/core/ui/index.d.ts +16 -0
- package/dist/core/ui/index.d.ts.map +1 -0
- package/dist/core/ui/index.js +17 -0
- package/dist/core/ui/index.js.map +1 -0
- package/dist/core/ui/utils.d.ts +28 -0
- package/dist/core/ui/utils.d.ts.map +1 -0
- package/dist/core/ui/utils.js +76 -0
- package/dist/core/ui/utils.js.map +1 -0
- package/dist/entrypoints/cli.d.ts +5 -0
- package/dist/entrypoints/cli.d.ts.map +1 -0
- package/dist/entrypoints/cli.js +199 -0
- package/dist/entrypoints/cli.js.map +1 -0
- package/dist/entrypoints/index.d.ts +18 -0
- package/dist/entrypoints/index.d.ts.map +1 -0
- package/dist/entrypoints/index.js +21 -0
- package/dist/entrypoints/index.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/services/ai/adapters/anthropic.d.ts +15 -0
- package/dist/services/ai/adapters/anthropic.d.ts.map +1 -0
- package/dist/services/ai/adapters/anthropic.js +83 -0
- package/dist/services/ai/adapters/anthropic.js.map +1 -0
- package/dist/services/ai/adapters/base.d.ts +47 -0
- package/dist/services/ai/adapters/base.d.ts.map +1 -0
- package/dist/services/ai/adapters/base.js +24 -0
- package/dist/services/ai/adapters/base.js.map +1 -0
- package/dist/services/ai/adapters/factory.d.ts +17 -0
- package/dist/services/ai/adapters/factory.d.ts.map +1 -0
- package/dist/services/ai/adapters/factory.js +34 -0
- package/dist/services/ai/adapters/factory.js.map +1 -0
- package/dist/services/ai/adapters/gemini.d.ts +16 -0
- package/dist/services/ai/adapters/gemini.d.ts.map +1 -0
- package/dist/services/ai/adapters/gemini.js +164 -0
- package/dist/services/ai/adapters/gemini.js.map +1 -0
- package/dist/services/ai/adapters/openai.d.ts +15 -0
- package/dist/services/ai/adapters/openai.d.ts.map +1 -0
- package/dist/services/ai/adapters/openai.js +175 -0
- package/dist/services/ai/adapters/openai.js.map +1 -0
- package/dist/services/ai/index.d.ts +10 -0
- package/dist/services/ai/index.d.ts.map +1 -0
- package/dist/services/ai/index.js +11 -0
- package/dist/services/ai/index.js.map +1 -0
- package/dist/services/config/Config.d.ts +41 -0
- package/dist/services/config/Config.d.ts.map +1 -0
- package/dist/services/config/Config.js +131 -0
- package/dist/services/config/Config.js.map +1 -0
- package/dist/services/config/configStore.d.ts +42 -0
- package/dist/services/config/configStore.d.ts.map +1 -0
- package/dist/services/config/configStore.js +77 -0
- package/dist/services/config/configStore.js.map +1 -0
- package/dist/services/config/index.d.ts +7 -0
- package/dist/services/config/index.d.ts.map +1 -0
- package/dist/services/config/index.js +6 -0
- package/dist/services/config/index.js.map +1 -0
- package/dist/services/config/setup.d.ts +13 -0
- package/dist/services/config/setup.d.ts.map +1 -0
- package/dist/services/config/setup.js +157 -0
- package/dist/services/config/setup.js.map +1 -0
- package/dist/services/config/types.d.ts +56 -0
- package/dist/services/config/types.d.ts.map +1 -0
- package/dist/services/config/types.js +32 -0
- package/dist/services/config/types.js.map +1 -0
- package/dist/services/customCommands.d.ts +37 -0
- package/dist/services/customCommands.d.ts.map +1 -0
- package/dist/services/customCommands.js +453 -0
- package/dist/services/customCommands.js.map +1 -0
- package/dist/services/index.d.ts +7 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +10 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/skillMarketplace.d.ts +74 -0
- package/dist/services/skillMarketplace.d.ts.map +1 -0
- package/dist/services/skillMarketplace.js +486 -0
- package/dist/services/skillMarketplace.js.map +1 -0
- package/dist/services/system/index.d.ts +6 -0
- package/dist/services/system/index.d.ts.map +1 -0
- package/dist/services/system/index.js +6 -0
- package/dist/services/system/index.js.map +1 -0
- package/dist/services/system/security.d.ts +30 -0
- package/dist/services/system/security.d.ts.map +1 -0
- package/dist/services/system/security.js +124 -0
- package/dist/services/system/security.js.map +1 -0
- package/dist/tools/agent/index.d.ts +6 -0
- package/dist/tools/agent/index.d.ts.map +1 -0
- package/dist/tools/agent/index.js +6 -0
- package/dist/tools/agent/index.js.map +1 -0
- package/dist/tools/agent/planMode.d.ts +12 -0
- package/dist/tools/agent/planMode.d.ts.map +1 -0
- package/dist/tools/agent/planMode.js +23 -0
- package/dist/tools/agent/planMode.js.map +1 -0
- package/dist/tools/agent/task.d.ts +10 -0
- package/dist/tools/agent/task.d.ts.map +1 -0
- package/dist/tools/agent/task.js +127 -0
- package/dist/tools/agent/task.js.map +1 -0
- package/dist/tools/ai/index.d.ts +5 -0
- package/dist/tools/ai/index.d.ts.map +1 -0
- package/dist/tools/ai/index.js +5 -0
- package/dist/tools/ai/index.js.map +1 -0
- package/dist/tools/ai/skill.d.ts +78 -0
- package/dist/tools/ai/skill.d.ts.map +1 -0
- package/dist/tools/ai/skill.js +315 -0
- package/dist/tools/ai/skill.js.map +1 -0
- package/dist/tools/askQuestion.d.ts +25 -0
- package/dist/tools/askQuestion.d.ts.map +1 -0
- package/dist/tools/askQuestion.js +99 -0
- package/dist/tools/askQuestion.js.map +1 -0
- package/dist/tools/bash.d.ts +11 -0
- package/dist/tools/bash.d.ts.map +1 -0
- package/dist/tools/bash.js +58 -0
- package/dist/tools/bash.js.map +1 -0
- package/dist/tools/definitions.d.ts +26 -0
- package/dist/tools/definitions.d.ts.map +1 -0
- package/dist/tools/definitions.js +599 -0
- package/dist/tools/definitions.js.map +1 -0
- package/dist/tools/dispatcher.d.ts +38 -0
- package/dist/tools/dispatcher.d.ts.map +1 -0
- package/dist/tools/dispatcher.js +75 -0
- package/dist/tools/dispatcher.js.map +1 -0
- package/dist/tools/fileOps.d.ts +16 -0
- package/dist/tools/fileOps.d.ts.map +1 -0
- package/dist/tools/fileOps.js +115 -0
- package/dist/tools/fileOps.js.map +1 -0
- package/dist/tools/filesystem/bash.d.ts +11 -0
- package/dist/tools/filesystem/bash.d.ts.map +1 -0
- package/dist/tools/filesystem/bash.js +58 -0
- package/dist/tools/filesystem/bash.js.map +1 -0
- package/dist/tools/filesystem/fileOps.d.ts +16 -0
- package/dist/tools/filesystem/fileOps.d.ts.map +1 -0
- package/dist/tools/filesystem/fileOps.js +115 -0
- package/dist/tools/filesystem/fileOps.js.map +1 -0
- package/dist/tools/filesystem/index.d.ts +1 -0
- package/dist/tools/filesystem/index.d.ts.map +1 -0
- package/dist/tools/filesystem/index.js +2 -0
- package/dist/tools/filesystem/index.js.map +1 -0
- package/dist/tools/glob.d.ts +18 -0
- package/dist/tools/glob.d.ts.map +1 -0
- package/dist/tools/glob.js +63 -0
- package/dist/tools/glob.js.map +1 -0
- package/dist/tools/grep.d.ts +26 -0
- package/dist/tools/grep.d.ts.map +1 -0
- package/dist/tools/grep.js +137 -0
- package/dist/tools/grep.js.map +1 -0
- package/dist/tools/index.d.ts +13 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +14 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/interaction/askQuestion.d.ts +25 -0
- package/dist/tools/interaction/askQuestion.d.ts.map +1 -0
- package/dist/tools/interaction/askQuestion.js +99 -0
- package/dist/tools/interaction/askQuestion.js.map +1 -0
- package/dist/tools/interaction/index.d.ts +6 -0
- package/dist/tools/interaction/index.d.ts.map +1 -0
- package/dist/tools/interaction/index.js +6 -0
- package/dist/tools/interaction/index.js.map +1 -0
- package/dist/tools/interaction/todo.d.ts +36 -0
- package/dist/tools/interaction/todo.d.ts.map +1 -0
- package/dist/tools/interaction/todo.js +137 -0
- package/dist/tools/interaction/todo.js.map +1 -0
- package/dist/tools/network/index.d.ts +6 -0
- package/dist/tools/network/index.d.ts.map +1 -0
- package/dist/tools/network/index.js +6 -0
- package/dist/tools/network/index.js.map +1 -0
- package/dist/tools/network/webFetch.d.ts +8 -0
- package/dist/tools/network/webFetch.d.ts.map +1 -0
- package/dist/tools/network/webFetch.js +87 -0
- package/dist/tools/network/webFetch.js.map +1 -0
- package/dist/tools/network/webSearch.d.ts +8 -0
- package/dist/tools/network/webSearch.d.ts.map +1 -0
- package/dist/tools/network/webSearch.js +84 -0
- package/dist/tools/network/webSearch.js.map +1 -0
- package/dist/tools/planMode.d.ts +12 -0
- package/dist/tools/planMode.d.ts.map +1 -0
- package/dist/tools/planMode.js +23 -0
- package/dist/tools/planMode.js.map +1 -0
- package/dist/tools/search/glob.d.ts +18 -0
- package/dist/tools/search/glob.d.ts.map +1 -0
- package/dist/tools/search/glob.js +63 -0
- package/dist/tools/search/glob.js.map +1 -0
- package/dist/tools/search/grep.d.ts +26 -0
- package/dist/tools/search/grep.d.ts.map +1 -0
- package/dist/tools/search/grep.js +137 -0
- package/dist/tools/search/grep.js.map +1 -0
- package/dist/tools/search/index.d.ts +6 -0
- package/dist/tools/search/index.d.ts.map +1 -0
- package/dist/tools/search/index.js +6 -0
- package/dist/tools/search/index.js.map +1 -0
- package/dist/tools/skill.d.ts +41 -0
- package/dist/tools/skill.d.ts.map +1 -0
- package/dist/tools/skill.js +149 -0
- package/dist/tools/skill.js.map +1 -0
- package/dist/tools/system/index.d.ts +6 -0
- package/dist/tools/system/index.d.ts.map +1 -0
- package/dist/tools/system/index.js +6 -0
- package/dist/tools/system/index.js.map +1 -0
- package/dist/tools/task.d.ts +10 -0
- package/dist/tools/task.d.ts.map +1 -0
- package/dist/tools/task.js +127 -0
- package/dist/tools/task.js.map +1 -0
- package/dist/tools/todo.d.ts +36 -0
- package/dist/tools/todo.d.ts.map +1 -0
- package/dist/tools/todo.js +137 -0
- package/dist/tools/todo.js.map +1 -0
- package/dist/tools/types.d.ts +139 -0
- package/dist/tools/types.d.ts.map +1 -0
- package/dist/tools/types.js +5 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/tools/webFetch.d.ts +8 -0
- package/dist/tools/webFetch.d.ts.map +1 -0
- package/dist/tools/webFetch.js +87 -0
- package/dist/tools/webFetch.js.map +1 -0
- package/dist/tools/webSearch.d.ts +8 -0
- package/dist/tools/webSearch.d.ts.map +1 -0
- package/dist/tools/webSearch.js +84 -0
- package/dist/tools/webSearch.js.map +1 -0
- package/dist/ui/Banner.d.ts +47 -0
- package/dist/ui/Banner.d.ts.map +1 -0
- package/dist/ui/Banner.js +122 -0
- package/dist/ui/Banner.js.map +1 -0
- package/dist/ui/Input.d.ts +42 -0
- package/dist/ui/Input.d.ts.map +1 -0
- package/dist/ui/Input.js +270 -0
- package/dist/ui/Input.js.map +1 -0
- package/dist/ui/Logo.d.ts +21 -0
- package/dist/ui/Logo.d.ts.map +1 -0
- package/dist/ui/Logo.js +31 -0
- package/dist/ui/Logo.js.map +1 -0
- package/dist/ui/Messages.d.ts +45 -0
- package/dist/ui/Messages.d.ts.map +1 -0
- package/dist/ui/Messages.js +76 -0
- package/dist/ui/Messages.js.map +1 -0
- package/dist/ui/Spinner.d.ts +29 -0
- package/dist/ui/Spinner.d.ts.map +1 -0
- package/dist/ui/Spinner.js +64 -0
- package/dist/ui/Spinner.js.map +1 -0
- package/dist/ui/ToolDisplay.d.ts +49 -0
- package/dist/ui/ToolDisplay.d.ts.map +1 -0
- package/dist/ui/ToolDisplay.js +99 -0
- package/dist/ui/ToolDisplay.js.map +1 -0
- package/dist/ui/components/Banner.d.ts +46 -0
- package/dist/ui/components/Banner.d.ts.map +1 -0
- package/dist/ui/components/Banner.js +121 -0
- package/dist/ui/components/Banner.js.map +1 -0
- package/dist/ui/components/Input.d.ts +51 -0
- package/dist/ui/components/Input.d.ts.map +1 -0
- package/dist/ui/components/Input.js +322 -0
- package/dist/ui/components/Input.js.map +1 -0
- package/dist/ui/components/Logo.d.ts +21 -0
- package/dist/ui/components/Logo.d.ts.map +1 -0
- package/dist/ui/components/Logo.js +31 -0
- package/dist/ui/components/Logo.js.map +1 -0
- package/dist/ui/components/Messages.d.ts +45 -0
- package/dist/ui/components/Messages.d.ts.map +1 -0
- package/dist/ui/components/Messages.js +76 -0
- package/dist/ui/components/Messages.js.map +1 -0
- package/dist/ui/components/Spinner.d.ts +29 -0
- package/dist/ui/components/Spinner.d.ts.map +1 -0
- package/dist/ui/components/Spinner.js +64 -0
- package/dist/ui/components/Spinner.js.map +1 -0
- package/dist/ui/components/ToolDisplay.d.ts +49 -0
- package/dist/ui/components/ToolDisplay.d.ts.map +1 -0
- package/dist/ui/components/ToolDisplay.js +99 -0
- package/dist/ui/components/ToolDisplay.js.map +1 -0
- package/dist/ui/index.d.ts +16 -0
- package/dist/ui/index.d.ts.map +1 -0
- package/dist/ui/index.js +17 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/ui/theme.d.ts +34 -0
- package/dist/ui/theme.d.ts.map +1 -0
- package/dist/ui/theme.js +55 -0
- package/dist/ui/theme.js.map +1 -0
- package/dist/ui/utils.d.ts +28 -0
- package/dist/ui/utils.d.ts.map +1 -0
- package/dist/ui/utils.js +76 -0
- package/dist/ui/utils.js.map +1 -0
- package/dist/utils/fs/index.d.ts +24 -0
- package/dist/utils/fs/index.d.ts.map +1 -0
- package/dist/utils/fs/index.js +50 -0
- package/dist/utils/fs/index.js.map +1 -0
- package/dist/utils/index.d.ts +7 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +10 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/security.d.ts +26 -0
- package/dist/utils/security.d.ts.map +1 -0
- package/dist/utils/security.js +123 -0
- package/dist/utils/security.js.map +1 -0
- package/dist/utils/text/index.d.ts +28 -0
- package/dist/utils/text/index.d.ts.map +1 -0
- package/dist/utils/text/index.js +51 -0
- package/dist/utils/text/index.js.map +1 -0
- package/package.json +84 -0
- package/skills/web-dev/SKILL.md +91 -0
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 安全工具 - 防止路径遍历和危险命令
|
|
3
|
+
*/
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
/**
|
|
6
|
+
* 防止路径遍历攻击
|
|
7
|
+
* 确保用户提供的路径在工作目录内
|
|
8
|
+
*/
|
|
9
|
+
export function safePath(workdir, userPath) {
|
|
10
|
+
// 解析绝对路径
|
|
11
|
+
const resolved = path.resolve(workdir, userPath);
|
|
12
|
+
const normalized = path.normalize(resolved);
|
|
13
|
+
const normalizedWorkdir = path.normalize(workdir);
|
|
14
|
+
// 确保路径在工作目录内
|
|
15
|
+
if (!normalized.startsWith(normalizedWorkdir)) {
|
|
16
|
+
throw new Error(`路径越界访问被阻止: ${userPath}`);
|
|
17
|
+
}
|
|
18
|
+
return normalized;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* 验证 bash 命令,阻止危险操作
|
|
22
|
+
*/
|
|
23
|
+
export function validateBashCommand(cmd) {
|
|
24
|
+
// 危险命令模式列表
|
|
25
|
+
const dangerousPatterns = [
|
|
26
|
+
'rm -rf /',
|
|
27
|
+
'rm -rf ~',
|
|
28
|
+
'rm -rf *',
|
|
29
|
+
'sudo',
|
|
30
|
+
'shutdown',
|
|
31
|
+
'reboot',
|
|
32
|
+
'poweroff',
|
|
33
|
+
'halt',
|
|
34
|
+
'mkfs',
|
|
35
|
+
'dd if=',
|
|
36
|
+
'dd of=/dev/',
|
|
37
|
+
'> /dev/',
|
|
38
|
+
'format',
|
|
39
|
+
':(){:|:&};:', // Fork bomb
|
|
40
|
+
'chmod -R 777 /',
|
|
41
|
+
'chown -R',
|
|
42
|
+
'> /etc/',
|
|
43
|
+
'cat /dev/zero'
|
|
44
|
+
];
|
|
45
|
+
const lowerCmd = cmd.toLowerCase();
|
|
46
|
+
for (const pattern of dangerousPatterns) {
|
|
47
|
+
if (lowerCmd.includes(pattern.toLowerCase())) {
|
|
48
|
+
throw new Error(`危险命令被阻止: ${pattern}`);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
// 检查是否尝试修改关键系统目录
|
|
52
|
+
const systemDirs = ['/etc', '/bin', '/sbin', '/usr/bin', '/usr/sbin', '/boot', '/sys'];
|
|
53
|
+
for (const dir of systemDirs) {
|
|
54
|
+
if (lowerCmd.includes(`rm`) && lowerCmd.includes(dir)) {
|
|
55
|
+
throw new Error(`禁止删除系统目录: ${dir}`);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* 限制输出大小
|
|
61
|
+
*/
|
|
62
|
+
export function truncateOutput(output, maxBytes) {
|
|
63
|
+
if (output.length <= maxBytes) {
|
|
64
|
+
return output;
|
|
65
|
+
}
|
|
66
|
+
const truncated = output.slice(0, maxBytes);
|
|
67
|
+
const lines = truncated.split('\n').length;
|
|
68
|
+
return `${truncated}\n\n[输出被截断: 超过 ${maxBytes} 字节限制,共 ${lines} 行]`;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* 清理路径用于显示(隐藏敏感信息)
|
|
72
|
+
*/
|
|
73
|
+
export function sanitizePathForDisplay(filePath, workdir) {
|
|
74
|
+
// 将绝对路径转换为相对路径
|
|
75
|
+
const relative = path.relative(workdir, filePath);
|
|
76
|
+
// 如果路径在工作目录外,只显示文件名
|
|
77
|
+
if (relative.startsWith('..')) {
|
|
78
|
+
return path.basename(filePath);
|
|
79
|
+
}
|
|
80
|
+
return relative;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* 验证只读 bash 命令(用于 explore 代理)
|
|
84
|
+
* 确保命令不会修改文件系统
|
|
85
|
+
*/
|
|
86
|
+
export function validateReadOnlyCommand(cmd) {
|
|
87
|
+
// 写入操作模式
|
|
88
|
+
const writePatterns = [
|
|
89
|
+
'>', // 重定向写入
|
|
90
|
+
'>>', // 追加写入
|
|
91
|
+
'echo', // 写入命令
|
|
92
|
+
'sed -i', // 原地编辑
|
|
93
|
+
'tee', // 写入文件
|
|
94
|
+
'cp', // 复制(可能写入)
|
|
95
|
+
'mv', // 移动(修改)
|
|
96
|
+
'rm', // 删除
|
|
97
|
+
'mkdir', // 创建目录
|
|
98
|
+
'touch', // 创建文件
|
|
99
|
+
'dd', // 磁盘操作
|
|
100
|
+
'git commit', // Git 写入操作
|
|
101
|
+
'git push',
|
|
102
|
+
'npm install', // 包管理写入
|
|
103
|
+
'yarn install',
|
|
104
|
+
'pip install',
|
|
105
|
+
'curl -O', // 下载文件
|
|
106
|
+
'wget', // 下载文件
|
|
107
|
+
];
|
|
108
|
+
const lowerCmd = cmd.toLowerCase();
|
|
109
|
+
for (const pattern of writePatterns) {
|
|
110
|
+
if (lowerCmd.includes(pattern.toLowerCase())) {
|
|
111
|
+
throw new Error(`只读代理不允许写入操作: 命令包含 "${pattern}"\n` +
|
|
112
|
+
`提示: explore 代理只能用于读取和分析,不能修改文件。`);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
// 允许的只读命令示例
|
|
116
|
+
const readOnlyCommands = ['ls', 'cat', 'head', 'tail', 'grep', 'find', 'wc', 'file', 'stat'];
|
|
117
|
+
const hasReadOnlyCommand = readOnlyCommands.some(cmd => lowerCmd.startsWith(cmd));
|
|
118
|
+
if (!hasReadOnlyCommand && !lowerCmd.match(/^(git (status|diff|log)|pwd|tree|du)/)) {
|
|
119
|
+
// 如果不是明确的只读命令,给出警告但不阻止(允许一些灵活性)
|
|
120
|
+
console.warn(`⚠️ 命令 "${cmd}" 可能不是只读命令,请确保不会修改文件`);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=security.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security.js","sourceRoot":"","sources":["../../src/utils/security.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 文本处理工具函数
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* 截断文本到指定长度
|
|
6
|
+
*/
|
|
7
|
+
export declare function truncateText(text: string, maxLength: number, suffix?: string): string;
|
|
8
|
+
/**
|
|
9
|
+
* 截断文本到指定行数
|
|
10
|
+
*/
|
|
11
|
+
export declare function truncateLines(text: string, maxLines: number): string;
|
|
12
|
+
/**
|
|
13
|
+
* 计算文本行数
|
|
14
|
+
*/
|
|
15
|
+
export declare function countLines(text: string): number;
|
|
16
|
+
/**
|
|
17
|
+
* 移除空行
|
|
18
|
+
*/
|
|
19
|
+
export declare function removeEmptyLines(text: string): string;
|
|
20
|
+
/**
|
|
21
|
+
* 缩进文本
|
|
22
|
+
*/
|
|
23
|
+
export declare function indent(text: string, spaces?: number): string;
|
|
24
|
+
/**
|
|
25
|
+
* 移除缩进
|
|
26
|
+
*/
|
|
27
|
+
export declare function dedent(text: string): string;
|
|
28
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utils/text/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,SAAQ,GAAG,MAAM,CAGpF;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAIpE;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAErD;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,SAAI,GAAG,MAAM,CAGvD;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAU3C"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 文本处理工具函数
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* 截断文本到指定长度
|
|
6
|
+
*/
|
|
7
|
+
export function truncateText(text, maxLength, suffix = '...') {
|
|
8
|
+
if (text.length <= maxLength)
|
|
9
|
+
return text;
|
|
10
|
+
return text.slice(0, maxLength - suffix.length) + suffix;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* 截断文本到指定行数
|
|
14
|
+
*/
|
|
15
|
+
export function truncateLines(text, maxLines) {
|
|
16
|
+
const lines = text.split('\n');
|
|
17
|
+
if (lines.length <= maxLines)
|
|
18
|
+
return text;
|
|
19
|
+
return lines.slice(0, maxLines).join('\n') + `\n... (还有 ${lines.length - maxLines} 行)`;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* 计算文本行数
|
|
23
|
+
*/
|
|
24
|
+
export function countLines(text) {
|
|
25
|
+
return text.split('\n').length;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* 移除空行
|
|
29
|
+
*/
|
|
30
|
+
export function removeEmptyLines(text) {
|
|
31
|
+
return text.split('\n').filter(line => line.trim()).join('\n');
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* 缩进文本
|
|
35
|
+
*/
|
|
36
|
+
export function indent(text, spaces = 2) {
|
|
37
|
+
const prefix = ' '.repeat(spaces);
|
|
38
|
+
return text.split('\n').map(line => prefix + line).join('\n');
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* 移除缩进
|
|
42
|
+
*/
|
|
43
|
+
export function dedent(text) {
|
|
44
|
+
const lines = text.split('\n');
|
|
45
|
+
const nonEmptyLines = lines.filter(line => line.trim());
|
|
46
|
+
if (nonEmptyLines.length === 0)
|
|
47
|
+
return text;
|
|
48
|
+
const minIndent = Math.min(...nonEmptyLines.map(line => line.match(/^(\s*)/)?.[1].length ?? 0));
|
|
49
|
+
return lines.map(line => line.slice(minIndent)).join('\n');
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/utils/text/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,SAAiB,EAAE,MAAM,GAAG,KAAK;IAC1E,IAAI,IAAI,CAAC,MAAM,IAAI,SAAS;QAAE,OAAO,IAAI,CAAC;IAC1C,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;AAC3D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,QAAgB;IAC1D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,KAAK,CAAC,MAAM,IAAI,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC1C,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,aAAa,KAAK,CAAC,MAAM,GAAG,QAAQ,KAAK,CAAC;AACzF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;AACjC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACjE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,MAAM,CAAC,IAAY,EAAE,MAAM,GAAG,CAAC;IAC7C,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAClC,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAChE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,MAAM,CAAC,IAAY;IACjC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IACxD,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAE5C,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CACxB,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CACpE,CAAC;IAEF,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC7D,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@caoxupei/ai-agent-cli",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "A powerful AI coding agent with multi-provider support (Anthropic, OpenAI, Gemini)",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/entrypoints/index.js",
|
|
7
|
+
"types": "./dist/entrypoints/index.d.ts",
|
|
8
|
+
"bin": {
|
|
9
|
+
"ai-agent-cli": "./bin/ai-agent-cli.js",
|
|
10
|
+
"aac": "./bin/ai-agent-cli.js"
|
|
11
|
+
},
|
|
12
|
+
"files": [
|
|
13
|
+
"dist",
|
|
14
|
+
"bin",
|
|
15
|
+
"skills",
|
|
16
|
+
"README.md",
|
|
17
|
+
"LICENSE"
|
|
18
|
+
],
|
|
19
|
+
"scripts": {
|
|
20
|
+
"dev": "tsx src/entrypoints/cli.ts",
|
|
21
|
+
"build": "tsc",
|
|
22
|
+
"test": "vitest",
|
|
23
|
+
"test:ui": "vitest --ui",
|
|
24
|
+
"test:coverage": "vitest --coverage",
|
|
25
|
+
"lint": "eslint src --ext .ts",
|
|
26
|
+
"lint:fix": "eslint src --ext .ts --fix",
|
|
27
|
+
"prepublishOnly": "npm run build"
|
|
28
|
+
},
|
|
29
|
+
"keywords": [
|
|
30
|
+
"ai",
|
|
31
|
+
"agent",
|
|
32
|
+
"cli",
|
|
33
|
+
"coding-assistant",
|
|
34
|
+
"anthropic",
|
|
35
|
+
"openai",
|
|
36
|
+
"gemini",
|
|
37
|
+
"claude",
|
|
38
|
+
"gpt",
|
|
39
|
+
"typescript"
|
|
40
|
+
],
|
|
41
|
+
"engines": {
|
|
42
|
+
"node": ">=18.0.0"
|
|
43
|
+
},
|
|
44
|
+
"repository": {
|
|
45
|
+
"type": "git",
|
|
46
|
+
"url": "git+https://github.com/xpnobug/ai-agent-cli.git"
|
|
47
|
+
},
|
|
48
|
+
"homepage": "https://github.com/xpnobug/ai-agent-cli#readme",
|
|
49
|
+
"bugs": {
|
|
50
|
+
"url": "https://github.com/xpnobug/ai-agent-cli/issues"
|
|
51
|
+
},
|
|
52
|
+
"author": "xpnobug",
|
|
53
|
+
"license": "MIT",
|
|
54
|
+
"dependencies": {
|
|
55
|
+
"@anthropic-ai/sdk": "^0.39.0",
|
|
56
|
+
"@google/generative-ai": "^0.17.0",
|
|
57
|
+
"@types/turndown": "^5.0.6",
|
|
58
|
+
"boxen": "^7.1.1",
|
|
59
|
+
"chalk": "^5.3.0",
|
|
60
|
+
"cheerio": "^1.0.0-rc.12",
|
|
61
|
+
"cli-table3": "^0.6.5",
|
|
62
|
+
"dotenv": "^16.3.1",
|
|
63
|
+
"enquirer": "^2.4.1",
|
|
64
|
+
"execa": "^8.0.1",
|
|
65
|
+
"fast-glob": "^3.3.2",
|
|
66
|
+
"fs-extra": "^11.2.0",
|
|
67
|
+
"gray-matter": "^4.0.3",
|
|
68
|
+
"openai": "^4.51.0",
|
|
69
|
+
"ora": "^8.0.1",
|
|
70
|
+
"turndown": "^7.2.2",
|
|
71
|
+
"zod": "^3.22.4"
|
|
72
|
+
},
|
|
73
|
+
"devDependencies": {
|
|
74
|
+
"@types/fs-extra": "^11.0.4",
|
|
75
|
+
"@types/node": "^20.10.0",
|
|
76
|
+
"@typescript-eslint/eslint-plugin": "^6.15.0",
|
|
77
|
+
"@typescript-eslint/parser": "^6.15.0",
|
|
78
|
+
"@vitest/ui": "^1.0.4",
|
|
79
|
+
"eslint": "^8.56.0",
|
|
80
|
+
"tsx": "^4.7.0",
|
|
81
|
+
"typescript": "^5.3.3",
|
|
82
|
+
"vitest": "^1.0.4"
|
|
83
|
+
}
|
|
84
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: web-dev
|
|
3
|
+
description: Web 开发最佳实践和现代前端技术栈指导
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Web 开发技能
|
|
7
|
+
|
|
8
|
+
## 技术栈
|
|
9
|
+
|
|
10
|
+
### 前端框架
|
|
11
|
+
- **React** - 组件化 UI 库
|
|
12
|
+
- **Vue.js** - 渐进式框架
|
|
13
|
+
- **Next.js** - React 全栈框架
|
|
14
|
+
- **Vite** - 现代构建工具
|
|
15
|
+
|
|
16
|
+
### 样式
|
|
17
|
+
- **Tailwind CSS** - 实用优先的 CSS 框架
|
|
18
|
+
- **CSS Modules** - 模块化 CSS
|
|
19
|
+
- **styled-components** - CSS-in-JS
|
|
20
|
+
|
|
21
|
+
### 状态管理
|
|
22
|
+
- **Zustand** - 轻量级状态管理
|
|
23
|
+
- **Redux Toolkit** - Redux 官方工具集
|
|
24
|
+
- **React Query** - 服务端状态管理
|
|
25
|
+
|
|
26
|
+
## 最佳实践
|
|
27
|
+
|
|
28
|
+
### 组件设计
|
|
29
|
+
1. **单一职责** - 每个组件只做一件事
|
|
30
|
+
2. **可复用性** - 提取通用组件
|
|
31
|
+
3. **Props 接口** - 明确定义 TypeScript 接口
|
|
32
|
+
4. **错误边界** - 处理组件错误
|
|
33
|
+
|
|
34
|
+
### 性能优化
|
|
35
|
+
- 使用 `React.memo` 避免不必要的重渲染
|
|
36
|
+
- 懒加载路由和组件
|
|
37
|
+
- 图片优化(WebP、懒加载)
|
|
38
|
+
- 代码分割
|
|
39
|
+
|
|
40
|
+
### 代码规范
|
|
41
|
+
- ESLint + Prettier
|
|
42
|
+
- 统一的命名约定
|
|
43
|
+
- 组件文件结构一致
|
|
44
|
+
- 注释关键逻辑
|
|
45
|
+
|
|
46
|
+
## 项目结构
|
|
47
|
+
|
|
48
|
+
```
|
|
49
|
+
src/
|
|
50
|
+
├── components/ # 组件
|
|
51
|
+
│ ├── common/ # 通用组件
|
|
52
|
+
│ └── features/ # 功能组件
|
|
53
|
+
├── hooks/ # 自定义 Hooks
|
|
54
|
+
├── utils/ # 工具函数
|
|
55
|
+
├── services/ # API 服务
|
|
56
|
+
├── store/ # 状态管理
|
|
57
|
+
└── types/ # TypeScript 类型
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## 常用命令
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
# 创建 React 项目
|
|
64
|
+
npm create vite@latest my-app -- --template react-ts
|
|
65
|
+
|
|
66
|
+
# 创建 Next.js 项目
|
|
67
|
+
npx create-next-app@latest
|
|
68
|
+
|
|
69
|
+
# 安装常用依赖
|
|
70
|
+
npm install zustand react-query axios
|
|
71
|
+
|
|
72
|
+
# 开发服务器
|
|
73
|
+
npm run dev
|
|
74
|
+
|
|
75
|
+
# 构建生产版本
|
|
76
|
+
npm run build
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
## 调试技巧
|
|
80
|
+
|
|
81
|
+
1. **React DevTools** - 检查组件树和 Props
|
|
82
|
+
2. **Chrome DevTools** - 性能分析
|
|
83
|
+
3. **console.log** - 基础调试
|
|
84
|
+
4. **debugger** - 断点调试
|
|
85
|
+
|
|
86
|
+
## 安全注意事项
|
|
87
|
+
|
|
88
|
+
- XSS 防护:永远不要使用 `dangerouslySetInnerHTML` 处理用户输入
|
|
89
|
+
- CSRF 防护:使用 CSRF token
|
|
90
|
+
- 敏感数据:不要在前端存储敏感信息
|
|
91
|
+
- 依赖审计:定期运行 `npm audit`
|