完美。这是为 Hermes Agent 准备的、可直接执行的完整提示词。每一步都包含
你要执行的命令、
预期的正常反馈、
可能出现的异常情况,以及
针对每种异常你必须采取的具体行动。请严格逐条执行,不要跳跃。遇到任何无法解决的问题,立即停止并输出完整错误信息。
任务目标
将你面前已有的
CmdCode-V0.3 文件夹,通过“挑选必需文件、重新组装”的方式,创建出一个全新的最小化版本
CmdCode-V0.4。最终这个新版本只需要能完成一个基础编程循环:接收一句编程要求,调用工具(读/写/编辑文件、执行命令),最后把代码写进文件并报告完成。
准备工作
你要执行的命令:
pwd
ls -d CmdCode-V0.3
正常预期:
第一行输出当前目录路径,第二行输出
CmdCode-V0.3 说明该文件夹存在。
异常处理:
如果 ls 报错 No such file or directory,说明你不在正确位置。使用 find / -type d -name "CmdCode-V0.3" 2>/dev/null 查找该文件夹,然后 cd 到它的上一级目录。如果找不到,立即停止并报告:“找不到 CmdCode-V0.3 文件夹,无法继续”。
你要执行的命令:
bun --version
正常预期: 输出版本号,且数字部分 >= 1.0(例如
1.0.0 或
1.2.3)。
异常处理:
如果提示 bun: command not found,说明未安装。去 https://bun.sh 安装后再试。
如果版本号小于 1.0,执行 bun upgrade 升级到最新版。
第一阶段:搭建新项目骨架
步骤 1.1 创建新文件夹
必须执行的命令:
mkdir CmdCode-V0.4
预期反馈: 无输出,或仅提示
created directory。
异常处理:
如果提示 File exists,说明该文件夹已存在。不要删除它,直接进入下一步。
如果提示权限不足,执行 chmod u+w . 后再试,若仍失败则报告错误并停止。
紧接着执行:
cd CmdCode-V0.4
然后再次执行
pwd,确认当前路径末尾是
/CmdCode-V0.4。
步骤 1.2 初始化 bun 项目
必须执行的命令:
bun init -y
正常预期: 终端显示类似
Done init,并列出生成的文件
package.json,可能还有
tsconfig.json 等。
异常处理:
如果提示 bun init 不是合法命令,说明 bun 版本太旧,执行 bun upgrade 后重试。
如果出现任何错误退出,报告完整错误信息并停止。
验证生成:
执行
ls package.json,必须看到该文件。如果没有,说明初始化未成功,重复初始化直到出现该文件。
步骤 1.3 删除默认入口文件
必须执行的命令:
rm -f index.ts
预期反馈: 无输出。如果文件不存在,
-f 会阻止报错。
步骤 1.4 配置启动脚本
用文本编辑器打开
package.json。你可以使用
nano 或
vi,如果都不会,使用
cat 配合重写的方式。最简单的方法:
必须执行的命令(一次性覆盖写入):
cat > package.json << 'PKGJSON'
{
"name": "cmdcode-v0.4",
"version": "1.0.0",
"scripts": {
"cmdcode": "bun run src/entrypoints/cli.tsx"
},
"dependencies": {}
}
PKGJSON
预期反馈: 无输出。验证:执行
cat package.json,确认内容完全一致。特别注意
scripts 里的键必须是
"cmdcode",值必须是
"bun run src/entrypoints/cli.tsx"。
第二阶段:复制核心入口文件
步骤 2.1 创建目录结构
必须执行的命令:
mkdir -p src/entrypoints
预期反馈: 无输出。验证:
ls src/entrypoints 应为空目录。
步骤 2.2 复制四个入口文件
注意: 源路径在
../CmdCode-V0.3 下面,必须保证这些源文件存在。按顺序逐条执行,每执行一条都检查是否成功。
复制 cli.tsx:
cp ../CmdCode-V0.3/src/entrypoints/cli.tsx src/entrypoints/cli.tsx
检查: ls src/entrypoints/cli.tsx 必须存在且大小大于0。如果源文件不存在,立即停止并报告:“源文件 ../CmdCode-V0.3/src/entrypoints/cli.tsx 不存在,无法继续”。
复制 main.tsx:
cp ../CmdCode-V0.3/src/main.tsx src/main.tsx
检查: ls src/main.tsx 必须存在。
复制 replLauncher.tsx:
cp ../CmdCode-V0.3/src/replLauncher.tsx src/replLauncher.tsx
检查: ls src/replLauncher.tsx 必须存在。
复制 commands.ts:
cp ../CmdCode-V0.3/src/commands.ts src/commands.ts
检查: ls src/commands.ts 必须存在。
如果任何一个源文件缺失,立即报告缺失的文件名并停止。
第三阶段:首次启动尝试与依赖补齐
步骤 3.1 首次运行
执行命令:
bun run cmdcode
正常预期会出现的情况及应对:
情况 A:程序直接启动,并出现类似 `> ` 的交互提示符
这意味着所有依赖已满足。跳过本阶段剩余步骤,直接进入第四阶段。
情况 B:报错 `Cannot find module 'xxxx'` 或类似模块未找到
这是缺少 npm 包。
你必须这样处理:
1. 仔细阅读错误信息,找出缺失的模块名。通常是单引号括起来的部分,例如
Cannot find module 'ink' 中的
'ink'。
2. 打开原项目
package.json 查看该模块对应的版本:
cat ../CmdCode-V0.3/package.json | grep '"模块名"'
例如:
cat ../CmdCode-V0.3/package.json | grep '"ink"'
输出类似:
"ink": "^4.0.0"。记下这个版本号(例如
^4.0.0)。
3. 安装该依赖:
bun add ink@^4.0.0
(把
ink 替换成实际模块名,
^4.0.0 替换成实际版本号)
4. 安装后,再次运行
bun run cmdcode。
5. 重复这个循环:每次报缺失模块,都按上述方法添加,直到不再报模块缺失。
如果 grep 在原来 package.json 中找不到该模块名,可能是需要别的包名,尝试:
bun add 模块名
不指定版本,让 bun 安装最新版(通常可以兼容)。
情况 C:报错不是模块缺失,而是所复制的源码文件内部报错
例如:
TypeError: xxx is not a function
ReferenceError: xxx is not defined
SyntaxError ...
这说明你还需要复制更多本地源文件。错误信息会给出文件名和行号,例如:
Error in src/main.tsx:42: Cannot find module './hooks/useSomething'
这表示
main.tsx 第 42 行试图导入
./hooks/useSomething。
处理流程:
1. 根据错误找出缺失的本地模块路径。以上面的例子,缺失的是
src/hooks/useSomething.ts 或
src/hooks/useSomething.tsx。
2. 到原版目录中寻找该文件并复制:
cp ../CmdCode-V0.3/src/hooks/useSomething.ts src/hooks/useSomething.ts
(如果不知道具体文件名,可以先用
ls ../CmdCode-V0.3/src/hooks/ 查看类似文件名)
3. 复制后重新运行
bun run cmdcode。
4. 重复此过程,直到不再有源码错误。如果遇到一个错误你完全无法定位需要哪个文件,停止并报告完整错误信息。
阶段性成功标志: 你能看到类似 REPL 的界面(即使界面很简陋,有输入光标即可)。
第四阶段:安装核心大脑与工具
现在要让程序能调用工具来理解需求并操作文件。
步骤 4.1 复制核心工具文件
mkdir -p src/tools
cp ../CmdCode-V0.3/src/tools/BashTool.ts src/tools/BashTool.ts
cp ../CmdCode-V0.3/src/tools/FileReadTool.ts src/tools/FileReadTool.ts
cp ../CmdCode-V0.3/src/tools/FileWriteTool.ts src/tools/FileWriteTool.ts
cp ../CmdCode-V0.3/src/tools/FileEditTool.ts src/tools/FileEditTool.ts
cp ../CmdCode-V0.3/src/tools.ts src/tools.ts
检查: 逐个用
ls 确认每个文件都已存在。如果有源文件缺失,报告缺失文件名并停止。
步骤 4.2 复制核心推理引擎
cp ../CmdCode-V0.3/src/QueryEngine.ts src/QueryEngine.ts
cp ../CmdCode-V0.3/src/query.ts src/query.ts
cp ../CmdCode-V0.3/src/Tool.ts src/Tool.ts
检查: 逐个
ls 确认存在。
步骤 4.3 复制 API 通信层
先查看原版 services 目录下有什么文件:
ls ../CmdCode-V0.3/src/services/
正常预期: 列出若干
.ts 文件,例如
api.ts,
stream.ts,
auth.ts 等。
操作: 必须把该目录下所有文件复制过来:
mkdir -p src/services
cp -r ../CmdCode-V0.3/src/services/* src/services/
如果 services 目录不存在,则根据
QueryEngine.ts 中的 import 寻找。执行:
grep 'from.*services' src/QueryEngine.ts
会输出类似
import { ... } from '../services/...' 的行,记录下每个路径,然后逐个复制对应的文件。如果
grep 也没找到 services 相关引用,说明 API 通信逻辑可能内聚在引擎内,可以跳过此步。
步骤 4.4 重新运行并继续解决缺失问题
执行:
bun run cmdcode
仍然使用第三阶段的策略:缺 npm 包就装,缺源文件就复制,直到能进入交互界面。
步骤 4.5 验证核心编程闭环
执行测试命令(一次性任务):
bun run cmdcode -p "用 TypeScript 写一个名为 add 的函数,接收两个 number 并返回它们的和,将函数写入文件 add.ts"
正确的结果:
终端输出一些处理过程信息,没有致命错误。
当前目录下出现 add.ts 文件。
你执行 cat add.ts,能看到内容中包含 function add 并且参数是两个 number,返回值是它们的和。
异常及处理:
如果提示无法写入文件或工具未找到: 检查 src/tools.ts 是否已复制,打开它确认里面注册了 FileWriteTool。如果缺少,从原版重新复制正确的文件。
如果报 API 认证错误(如 401、403、缺少 API key): 说明缺少认证模块。到 ../CmdCode-V0.3/src 下查找包含 auth 或 login 的文件,复制到对应位置:
find ../CmdCode-V0.3/src -iname '*auth*' -o -iname '*login*'
然后将找到的
.ts 或
.tsx 文件复制到
src/ 下相应位置(例如复制到
src/commands/auth.ts,可能需要先创建 commands 目录)。复制后重新运行测试。
如果程序崩溃或报其他错误: 继续按照“缺文件补文件,缺包装包”的原则处理,直到测试通过。
第五阶段:补充上下文与记忆
步骤 5.1 复制上下文与历史
cp ../CmdCode-V0.3/src/context.ts src/context.ts
cp ../CmdCode-V0.3/src/history.ts src/history.ts
检查文件存在。
步骤 5.2 复制记忆目录
cp -r ../CmdCode-V0.3/src/memdir src/memdir
如果
memdir 不存在,跳过。
步骤 5.3 复制全局类型和常量
mkdir -p src/types src/constants
cp -r ../CmdCode-V0.3/src/types/* src/types/
cp -r ../CmdCode-V0.3/src/constants/* src/constants/
如果 types 或 constants 目录为空或不存在,跳过。
步骤 5.4 复制核心 UI 组件
先检查
replLauncher.tsx 导入了哪些组件:
grep 'from.*components' src/replLauncher.tsx
输出会显示需要的组件,例如
./components/REPL 或
./components/App。
按需复制:
mkdir -p src/components
cp ../CmdCode-V0.3/src/components/REPL.tsx src/components/REPL.tsx
cp ../CmdCode-V0.3/src/components/App.tsx src/components/App.tsx
之后如果仍报缺少组件,继续用同样方法从原版复制。
步骤 5.5 复制关键 hooks
找出 main.tsx 或 replLauncher.tsx 中导入的 hooks:
grep 'from.*hooks' src/main.tsx src/replLauncher.tsx
根据输出复制,例如有
useMailbox:
mkdir -p src/hooks
cp ../CmdCode-V0.3/src/hooks/useMailbox.ts src/hooks/useMailbox.ts
还有其他 hooks 都一一复制。
步骤 5.6 多轮对话测试
先确保能启动:
bun run cmdcode
在出现的交互界面中,输入以下两轮指令:
第一轮(直接输入文字并回车):
创建一个文件 math.ts,里面写一个二分查找函数 binarySearch,接收排序数组和目标值,返回索引或 -1。
预期: 它应该创建
math.ts,并且里面包含
binarySearch 函数的定义。
第二轮(紧接上一轮,不要退出程序):
为 binarySearch 函数添加 JSDoc 注释,并添加一个简单的测试用例,调用该函数并打印结果。
预期: 文件被修改,注释添加成功,包含测试代码。
成功标志: 两次修改都正确完成,程序不报错。
如果失败:
若提示缺少文件写入权限,用 chmod u+w math.ts 增加权限后重试(但大概率不是这个原因)。
若报错缺少某些模块,继续补文件或包。
如果第二轮它忘记了第一轮的内容,说明上下文管理未生效,检查 context.ts 和 history.ts 是否已复制并正常工作,以及 memdir 目录是否可写。
第六阶段:压力测试与异常处理
步骤 6.1 中断测试
在 REPL 中让程序执行一个耗时命令,例如输入:
执行 sleep 10 然后输出 "done"
在命令执行过程中(还没返回结果时),按下
Ctrl+C。
正常预期: 程序退出或回到提示符,没有残留后台进程。
验证: 运行
ps aux | grep cmdcode,确认没有多余的 cmdcode 进程。
异常: 如果界面卡死或进程残留,需要补充信号处理逻辑。查找原版:
find ../CmdCode-V0.3/src -iname '*signal*'
将找到的文件复制到
src/utils/ 下(创建 utils 目录),然后重新运行再测。
步骤 6.2 错误命令处理
在 REPL 中输入:
运行一个肯定不存在的命令:non_existent_command_xyz
正常预期: 程序返回一条清晰的错误信息(例如 “Command failed: non_existent_command_xyz”),而不是崩溃退出。
异常: 如果程序直接闪退或报错
Unhandled rejection,说明错误处理有缺陷。记录错误信息并继续复制相关文件(如
src/utils/errorHandler.ts 等),直到程序能优雅地报告错误。
第七阶段:清理与交付
步骤 7.1 删除测试文件
rm -f add.ts math.ts
步骤 7.2 创建 README.md
cat > README.md << 'EOF'
# CmdCode-V0.4 最小化版本
这是原项目 CmdCode 的精简发行版,只保留最核心的编程对话循环功能。
启动交互模式:
bun run cmdcode
执行一次性任务:
bun run cmdcode -p "你的编程需求"
EOF
步骤 7.3 初始化 Git 仓库
git init
git add .
git commit -m "Init minimal CmdCode-V0.4"
预期反馈: 显示提交成功,包含一定数量的文件。
最终检查清单
在结束前,请自己逐项确认:
[ ] bun run cmdcode 能启动 REPL 界面
[ ] 一次性任务 -p 能成功生成文件
[ ] 多轮对话中具备上下文记忆
[ ] 中断不会留下僵尸进程
[ ] 错误命令不会导致崩溃
[ ] README.md 和 .git 已创建
全部确认后,输出:“最小化版本 CmdCode-V0.4 构建成功!”。
执行过程中如果遇到任何无法按上述指令解决的情况,请立即停止,并输出完整的错误信息和你已经尝试的操作,等待进一步指令。