myc 是一个面向 AI 编程智能体的本地、快速的任务与记忆层,由 aistastudio 开源在 GitHub。它提供任务队列、事实与决策的操作日志(oplog)、项目记忆的混合(词法+向量)搜索,以及内置代码索引。myc 自身不发起网络调用,也不强制要求 LLM 密钥;只有在用户主动执行 myc models fetch、myc code fetch、myc version --check(或设置 MYC_UPDATE_CHECK=1 触发每天最多一次的后台版本检查)时才会访问网络。
用途与定位 myc 解决的核心问题是“智能体会遗忘”:决策在上下文压缩后仍能保留,工作成果在进程结束后仍能保留,并且两者都能通过普通 git 在机器之间迁移。设计文档位于 docs/design/(从 00-brief.md 开始),相关测量数据可从 bench/ 和 scripts/ 复现。
运行环境要求 myc 的运行时绑定 bun:sqlite,在纯 Node.js 或 Deno 上无法启动。要求 Bun ≥ 1.3.0(在 package.json 的 engines.bun 中固定),以及 SQLite ≥ 3.50.4。SQLite 版本下限有两个原因:低于 3.44.0 时,在 trusted_schema = OFF 下 FTS5 无法从触发器写入,导致每次写入失败;在 3.43.2 和 3.46.0 上,并行 myc 进程被测量到会重复运行同一个后台任务两到三次,失败任务报告“database disk image is malformed”,原因未知,因此 myc 拒绝低于受支持配置的库。在 Linux 上,Bun 链接自带的 SQLite(Bun 1.3.0 中为 3.50.4,Bun 1.3.14 中为 3.53.0);在 macOS 上,Bun 会使用系统 SQLite(macOS 14 上为 3.43.2),因此包自带 vendor/sqlite/libmyc-sqlite3.dylib(SQLite 3.53.4,从官方 amalgamation 为 arm64 和 x86_64 构建),除非显式设置 MYC_SQLITE=/path/to/libsqlite3.dylib。如果使用的 SQLite 仍低于 3.50.4,所有命令(包括 myc init)都会以 precond.sqlite_unsupported 拒绝并说明如何处理。从 3.50.4 到 3.51.2 之间 myc 可运行但会警告(WARN degraded.sqlite_old)。myc doctor 会说明正在使用的 SQLite 及其来源。
安装与初始化 安装 Bun 后,安装 myc 只需一条命令。它运行在 macOS 和 Linux 上;Windows 需使用 WSL 并在其中安装 Bun 和 myc。启动器按设计拒绝 cmd 和 PowerShell。安装时不会下载嵌入模型;语义搜索是可选且显式的:myc models fetch(129 MB,约 7 秒),在此之前搜索为词法搜索并在每次回答中说明(WARN degraded.embeddings)。代码索引的语法也以同样方式一次性获取:myc code fetch。若要从源码构建最新代码,可将二进制放到 myc wire 能找到的位置(MYC_BIN、node_modules/.bin、~/.myc/bin/myc 或 PATH)。
项目接入与智能体集成 myc wire 只完整写入自己的文件,并以逐节点合并方式合并 JSON 配置,同时保留 .myc.bak;CLAUDE.md 从不被触碰。重复运行不会产生变化。myc wire --scope user 可将相同内容放入 Claude Code 的用户层(~/.claude/helpers/myc-hooks.mjs、SessionStart/PreCompact/PostToolUse 钩子、~/.claude/settings.json 中的 Bash(myc <command>:*) 规则、~/.claude/skills/myc 中的技能,以及通过 claude mcp add --scope user 添加的 MCP 服务器)。--agents opencode 可接入 opencode 的全局配置($XDG_CONFIG_HOME/opencode 或 ~/.config/opencode),将 myc 服务器作为一个节点写入 opencode.json[c],并放置 plugin/myc.ts。--status-line 可为用户层添加 myc 的状态行。myc unwire --scope user 可逐节点恢复设置并移除 MCP 服务器。myc doctor --hooks 会对照日志检查整个用户层。
任务队列 myc run 将重型命令(完整测试套件、构建、基准测试)放入一个由机器用户所有仓库共享的队列(~/.myc/queue.db),按先到先服务等待空闲槽位后运行,保留终端和退出码。等待中的命令会在 stderr 说明等待对象;超过 --max-wait 后以退出码 9 放弃并说明前方任务。持有者死亡(即使 SIGKILL)会释放槽位;嵌套的 myc run 会立即在父槽位中运行。默认每条通道一个槽位,MYC_HEAVY_SLOTS=2 可设为两个。myc wire --queue-hook 可安装 Claude Code PreToolUse 钩子,在运行前将重型 Bash 命令改写为 myc run -- <同一命令>。重型指完整测试运行或构建:无路径的 bun test、bun run build/typecheck、npm/pnpm/yarn test 和 build、cargo test/build、go test ./...、无路径的 pytest、make。有针对性的 bun test <path>、已在 myc run 下的命令、后台命令和嵌套命令不受影响。MYC_QUEUE_HEAVY 可替换列表(+… 添加,off 关闭)。该钩子为可选,且开销低(中位数 3.4 ms,p99 4.3 ms)。myc run 不是绕过权限的方式:排队命令只有在用户自己的规则允许原命令通过时才会无提问执行。
代码智能 代码智能内置,使用与替代方案相同的引擎 tree-sitter,语法按需获取而非随包发布。符号、调用者和代码搜索支持 TypeScript、TSX、JavaScript(js、jsx、mjs、cjs)、Python、C# 和 Java——即 myc 有定义规则的语言。语法包包含 36 种;语言以“规则+目录条目”成对添加。其他文件仍可获得 code grep、锚点和过期检测。myc code fetch 按 sha256 校验下载本仓库文件所需的语法,这是唯一联网步骤;索引从不联网,缺少语法的语言会被跳过并列出。myc code index 增量构建索引:对未变更的树重复运行不读取任何内容,之后索引在后台刷新。文件列表来自 git 自身(git ls-files,因此 .gitignore 生效;无 git 的树会被遍历并说明)。在任意列表之上,秘密命名的文件从不被索引:.env 和 .env.(.env.example 等模板会被索引)、.pem、*.key、密钥库、私有 SSH 密钥、.npmrc、.netrc 等凭据文件。嵌套仓库和 git worktree 有专门处理:工作区可以是一个生态系统,根是 git 仓库,内部有独立仓库(非子模块),只有一个从根构建的代码索引;从嵌套仓库内部,每个代码命令从根索引中该仓库的部分回答,路径相对于所在仓库。索引也会自我保持新鲜:任何 myc 命令后,若上次运行超过 15 分钟(MYC_CODE_INDEX_PERIOD_MS),每个工作区会排队一个后台代码索引,以低优先级分离运行,从不延迟命令。git worktree(即使在工作区树之外)从主检出的索引回答;当 worktree 处于另一提交或对已跟踪文件有未提交更改时,每个回答都带有 WARN code_index.worktree_divergent 并指明两个分支。锚点将知识绑定到代码跨度并随代码移动;当代码不再位于锚点放置的位置时,知识不会被删除,而是排名降低并说明原因(recall 标记该行 [code moved ×0.64])。
适用场景与限制 myc 适用于需要跨上下文压缩、进程重启和机器迁移保持记忆的 AI 编程智能体工作流,尤其适合多智能体共享一台机器、需要排队重型命令的场景。限制包括:必须使用 Bun 运行时,不支持纯 Node.js 或 Deno;SQLite 版本有硬性下限;Windows 需通过 WSL;语义搜索和代码语法需显式下载;代码智能仅覆盖有定义规则的语言;秘密命名的文件不会被索引。