终端不再失忆:如何用AI Shell构建持久记忆(你的终端也该这样)
每个开发者都有这样的经历:前一天刚在终端里敲了一串复杂的 docker exec 命令,第二天打开新会话又得重新查。终端是最常用、也是最健忘的工具。好消息是,2026年的AI终端代理正在改变这一切——不是靠更大的上下文窗口,而是靠持久记忆。
为什么信任在下降,但使用率却在飙升?
Stack Overflow 2025 调查显示:84%的开发者使用AI编程工具,但对准确率的信任度从40%跌到了29%。原因很简单:每个新会话都从零开始。你的AI助手不记得你总用 staging 分支部署,不记得你的项目用 Yarn 而不是 npm,也不记得 users 表有个软删除列。你每次都要重新教一遍。
JetBrains 2026 年1月的调查发现,Claude Code 的工作采用率在9个月内从3%暴涨到18%——不是因为它模型更聪明,而是因为它通过子代理和持久上下文记住了你的偏好。工作流适配比基准分数更重要,而工作流适配的本质就是记忆。
nsh:一套值得研究的记忆架构
最有趣的终端代理可能是你没听说过的 nsh(由门罗币核心成员 fluffypony 创建)。它是一个基于 Rust 的 AI shell 助手,实现了 六层记忆系统(MIRIX 架构)。每次查询前,nsh 会从记忆库中检索相关上下文,并作为结构化 XML 注入到系统提示中。
六层记忆系统
第一层:核心记忆(Core Memory)
- 三个固定块:用户事实、代理人格、环境
- 始终加载到上下文中,永不修剪
- 例子:"这个用户用 Rust;优先用 cargo 命令"
第二层:情景记忆(Episodic Memory)
- 带时间戳的事件:命令执行、错误、解决方案
- 自动从会话历史中提取
- 例子:"2026-05-20:用户通过给 docker run 添加 --network=host 解决了 Docker 网络问题"
第三层:语义记忆(Semantic Memory)
- 知识及关系,存储在向量索引条目中
- 跨会话关联概念
- 例子:"项目X使用 PostgreSQL 15 和 pgvector 扩展"
第四层:程序记忆(Procedural Memory)
- 可复用的工作流和技能模板
- 可安装、共享、组合
- 例子:"部署到暂存:git push origin staging && ssh staging 'cd /app && git pull && docker compose up -d'"
第五层:资源记忆(Resource Memory)
- 参考资料:文档、配置、架构决策
- 索引后按需检索,不常驻上下文
- 例子:"API 遵循 REST 惯例,使用 /v2/ 前缀"
第六层:知识库(Knowledge Vault)
- 加密的密钥、API 密钥、敏感凭证
- 按需检索,附带审计日志
- 从不会明文保留在对话日志中
这不是纸上谈兵——nsh 目前已经可以运行。下面是如何配置一个核心记忆块:
# 安装 nsh(curl -fsSL https://nsh.sh/install.sh | bash)
# 第一次运行 nsh 后,它会创建 ~/.nsh/ 目录
# 核心记忆块存放在 ~/.nsh/core/
# 设置你的用户事实 —— 这些将始终存在于上下文中
cat > ~/.nsh/core/user_facts.md << 'EOF'
- 主要语言:TypeScript 和 Python
- 包管理器:pnpm(绝对不用 npm)
- 容器运行时:Docker + docker compose
- Git 惯例:约定式提交,squash-merge PR
- 部署:通过 ArgoCD 管理 Kubernetes
EOF
# 设置你的代理人格
cat > ~/.nsh/core/agent_persona.md << 'EOF'
- 执行命令前给出解释
- 优先参考官方文档,而不是 Stack Overflow
- 任何破坏性命令都要标注安全风险
- 总是建议先加 --dry-run 参数
EOF
结果:每次你敲 ? 提问时,nsh 会自动带上你的持久上下文。不用再重复解释你的开发环境。
为什么这比上下文窗口更重要
考虑实际对比:
# 没有持久记忆(每个新会话都从零开始):
you: ? 部署 API 到暂存环境
agent: 好的,让我先看看你的项目结构……
[花3分钟发现你用 docker compose、找到 staging 配置、搞清楚 CI 流程]
# 有持久记忆(nsh,从第二次会话开始):
you: ? 部署 API 到暂存环境
agent: [搜索情景记忆] -> [找到 "deploy-to-staging" 程序记忆] -> [预填命令]
$ git push origin staging && ssh staging 'cd /app && git pull && docker compose up -d'
按回车执行。可先编辑。Ctrl-C取消。
同样的模型、终端、开发者。区别在于:一个是每次从零开始的工具,另一个是不断积累关于你本人经验的工具。
使用 nsh 一周后,你的情景记忆里会包含你运行过的每条命令、遇到的每个错误和每个解决办法。语义记忆索引了你项目的架构。程序记忆把你的工作流存储为可复用的技能。工具通过观察你工作而变得更好——这正是好的结对编程能做到的。
安全模型就是架构
nsh 把安全作为设计基础:
- 密钥脱敏:内置100多种模式,在将上下文发送给LLM之前检测并脱敏API密钥、令牌、私钥、JWT、数据库URL等。可自定义模式。
- 命令风险评估:每条建议的命令被分类为
safe、elevated或dangerous。危险命令(递归删除系统路径、格式化磁盘、fork 炸弹、管道执行远程脚本等)总是需要明确确认。 - 敏感目录拦截:默认禁止读写
~/.ssh、~/.gnupg、~/.aws、~/.kube、~/.docker。 - 工具输出沙箱:来自
web_search、github等工具的结果用随机边界标记分隔,并视为不可信数据。工具输出中的提示注入会被过滤。 - 保护设置:安全关键的配置(API密钥、白名单、脱敏设置)不能被AI修改。绝对禁止。
# nsh 的风险评估示例:
you: ? 清理旧的 Docker 镜像
nsh: [评估命令风险:危险]
⚠️ 这条命令将执行:docker image prune -a --filter "until=168h"
分类:危险(删除所有超过7天的未使用镜像)
需要明确确认?[y/N]
这不同于 Codex CLI 的操作系统级沙箱(macOS 的 Apple Seatbelt、Linux 的 Landlock/seccomp),后者创建硬性边界但没有内部智能。nsh 的方法是基于上下文的——它理解命令的含义,而不仅仅是它访问了什么。两种方法都有价值,解决不同问题。
工具循环:为什么自主多步骤很重要
nsh 默认每个查询最多链式调用50个工具。这不只是聊天机器人建议一条命令,而是一个代理:
- 搜索命令历史,找出相似的失败记录
- 检查哪些包管理器可用
- 读取相关配置文件
- 运行安全的诊断命令
- 预填修复命令供你审查
you: ? 为什么我上一条命令失败了?
nsh: [search_history] -> 找到3条相似失败记录
[read_file] -> 检查 /var/log/app/error.log
[run_command] -> docker logs api-server-1 --tail 20
[chat] -> API 容器以状态码 137 退出(OOM 被杀死)。
你的容器内存限制为 512MB,但 JVM 堆配置了 1GB。修复方法:
[command] -> docker compose config | grep memory
[command] -> docker compose up -d --memory=2g api-server
code 工具更进一步:它将编程任务委托给一个工作目录受限的子代理,该子代理可以读写文件、用 grep 和 glob 搜索代码库、运行构建/测试/lint 命令来验证结果。这类似于 Claude Code 的子代理架构,但发生在 shell 层级,而非 IDE 级别。
竞争格局:记忆在哪里
用记忆的视角审视主流 CLI 代理:
- Claude Code:持久记忆通过
CLAUDE.md文件 + 子代理。项目级记忆,没有跨会话的情景记忆。 - Gemini CLI:无。每次会话无状态。
- Codex CLI:无。每次调用独立。
- OpenCode:有限。基于配置,没有情景层级。
- Aider:
.aider*文件。内嵌于 Git,但结构扁平。 - Warp:仅有命令历史。没有语义或程序记忆。
- Goose:YAML 配方。仅程序记忆,没有情景记忆。
- nsh:六层 MIRIX 架构。包含核心、情景、语义、程序、资源、知识库。
Claude Code 的 CLAUDE.md 是最接近的竞争对手——它会在会话开始时读取项目级别指令。但它是手动的(需要你写文件)、静态的(不会从你的行为中学习)、局限在单个项目(不能跨项目学习)。nsh 的方法是自动的(从行为中提取)、动态的(每次会话后更新)、全局的(跨项目和机器携带知识)。
搭建你自己的记忆层
即使不用 nsh,你也可以从这种架构模式中受益。下面是一个最小实现,可以添加到任何终端代理中:
#!/usr/bin/env bash
# persistent-context.sh —— 添加到你的 shell 配置文件
# 一个简陋的开发者自建记忆层级系统,适用于任何 AI CLI
MEMORY_DIR="$HOME/.ai-memory"
mkdir -p "$MEMORY_DIR"/{core,episodic,semantic}
# 第一层:核心记忆 —— 每次 AI 提示都包含这些
cat > "$MEMORY_DIR/core/preferences.md" << 'EOF'
- 语言:TypeScript/Python
- 包管理器:pnpm
- Git:约定式提交
- 部署:Kubernetes/ArgoCD
EOF
# 第二层:情景记忆 —— 从命令历史自动追加
# 每次会话结束后提取模式
append_episode() {
local timestamp=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
local cmd="$1"
local exit_code="$2"
echo "- [$timestamp] exit=$exit_code cmd='$cmd'" \
>> "$MEMORY_DIR/episodic/$(date +%Y-%m-%d).md"
}
# 挂接到 bash 历史(添加到 .bashrc)
PROMPT_COMMAND='last_cmd=$(history 1 | sed "s/^ *[0-9]* //");
append_episode "$last_cmd" "$?"'
# 第三层:语义记忆 —— 随着学习手动整理
# 例如:项目架构决策
cat > "$MEMORY_DIR/semantic/project-alpha.md" << 'EOF'
## Project Alpha 架构
- 单体仓库:pnpm workspaces
- API:Express + PostgreSQL(端口5432)
- 前端:Next.js 15 with App Router
- 认证:Clerk(不是 Auth0 ——2026年Q1迁移)
- 部署:ArgoCD 从 /manifests/ 目录同步
EOF
# 与任何 AI CLI 代理一起使用:
# 在提示中包含记忆:
context_prompt() {
echo "用户偏好:"
cat "$MEMORY_DIR/core/preferences.md"
echo -e "\n最近事件:"
cat "$MEMORY_DIR/episodic/$(date +%Y-%m-%d).md" 2>/dev/null || echo "(今天暂无)"
echo -e "\n项目上下文:"
cat "$MEMORY_DIR/semantic/$(basename "$(pwd)").md" 2>/dev/null || echo "(未知项目)"
}
# 例子:将上下文输入 Claude Code
# context_prompt | claude --prompt "$(cat) $USER_PROMPT"
这段脚本用大约40行 bash 实现了 nsh 六个层级中的三个。虽然没有向量搜索、自动语义提取或加密保险箱,但它展示了原则:结构化的、持久的上下文,能够跨会话存活。
接下来是什么
2026年的终端代理市场,能力、访问权限和沙箱已经是入场券。下一轮竞争的焦点是记忆。
留意这些信号:
- Claude Code 增加情景记忆——它的子代理架构已经为此做好了准备。
- OpenCode 社区构建基于插件的记忆层级——15万+ star 给了他们足够贡献者基础。
- nsh 的 MIRIX 方法成为标准——六层模型足够通用,可以变成一个协议。
能记住你的终端,才是真正替代你更少、增强你更多的工具。这才是真正重要的指标——不是 SWE-bench 分数、不是 token 数量、不是免费层请求限制,而是你少重复了多少次。
直达网址:https://github.com/fluffypony/nsh{:target=”_blank”}
