yc-software/qm
GitHub: yc-software/qm
QM 是一个面向团队协作的多场景 AI agent 框架,让组织内每位成员在独立沙箱中工作并共享协作能力。
Stars: 1381 | Forks: 127
# qm
一款用于工作的多人协作 agent 框架。支持在 Slack 和 Web 端使用。

## 什么是 QM?
大多数 agent 的设计类似于个人助手。你可以让一个 agent 为整个公司工作,但这很快就会变得复杂。QM 是专为初创公司设计的。每位员工都有自己的独立工作区,可以互不影响地独立工作,同时也可以在频道、群组和项目中进行协作。
每个人和每个房间都有自己作用域内的 memory、文件、keychain 视图、权限、crons、Web 应用和持久化沙箱。
它的构建理念是开源的。你可以选择自己的框架和模型并在它们之间切换——Pi、OpenCode、Codex 和 Claude Code 都驱动同一个核心,因此部署不会绑定到任何单一供应商。
## 功能
- **个人与共享作用域。** 人们可以将 agent 定制为_专属于自己_的,同时仍能在 Slack 频道和项目中进行协作。
- **Slack 与 Web 端。** 相同的身份和配置可在 Slack 和 Web 应用之间通用。
- **管理员控制。** 设置组织级别的配置、安全态势,以及可用的框架和模型。
- **Web 应用。** 快速构建自定义内部应用,并将其发布给特定人员。
- **共享 skills。** Skills 由作用域拥有,并可通过授权共享,管理员可审批将其提升至全组织范围,还支持从 git 仓库导入 skill pack。
- **后台工作。** Crons 和 watches 可以在无人值守时自动运行任务。
## 你可以用它做什么
- 同时搜索内部笔记、电子邮件、文档、数据库和 Web
- 从你的公司知识库中检索信息
- 构建内部应用,将其发布给特定人员,并保持其数据最新
- 从历史发送记录中学习你的写作风格,然后按计划处理你的收件箱——包括打标签和草拟回复
- 在现有 repository 中工作:运行测试、发起 PR、监控 CI、检查系统日志
- 在共享频道中跟踪项目,并发布更新和后续任务
## 架构
```
flowchart LR
DB[("Postgres
sessions · memory · queue")] subgraph CORE["Headless core"] API["API · identity · policy · scheduler"] LOOP["Agent loop
(Pi, OpenCode, Claude Code)"] API <--> LOOP end SBX["Per-scope sandbox
files · tools · logged-in services"] DB <--> API LOOP <--> SBX ``` 每一轮对话都会通过一个中央核心处理,该核心可以使用多种模型和框架来生成回复。Postgres 持久化层用于保存用户数据、会话历史和其他持久状态。该 agent 拥有一个小型且固定的工具集;其中一个是 `execute`,用于在作用域专属的独立沙箱(其持久化的计算机环境,已安装的工具会保留在其中)中运行命令。Web UI、管理面板和公共门户都是核心 HTTP API 之上的可选插件;Slack 是一个可选的进程内插件,由核心通过直接的服务客户端启动并监督。 核心直接在 Node 上运行 TypeScript,并使用 Fastify 处理 HTTP。Slack 插件使用 Bolt;Web UI 使用 Vite 构建并使用 Lit 渲染。 核心本身是通用的。所有特定于某家公司的内容——组织配置、自定义工具和 skills、沙箱镜像、基础设施——都存放在一个**部署目录**中,由 [`qm` CLI](./cli/README.md) 进行验证和部署。每个底层实现(框架、会话存储、沙箱、memory)都位于接口之后,因此生产环境的实现只需通过一个装配文件即可替换接入。 ## 安全与机密 QM 的方案遵循像 OpenCode、Codex 和 Claude Code 这样的本地编码 agent 的做法:agent 以其服务对象的身份行事,使用他们的凭证和权限,并且其所有操作都会被审计。组织需选择一种安全态势, narrower scopes(更小范围的作用域)只能在此基础上进一步收紧: - **Strict** —— 每个 harness 工具调用都会暂停并等待人工批准,但那两种无副作用的结束对话操作除外。 - **Auto**(默认) —— 分类器会在带来源标签的外部数据和工具结果发送给模型之前对其进行审查;部署环境可以将其指向自有的审查代理。 - **Dangerous** —— 不进行任何内容审查,工具调用之间也没有暂停。 预声明的命令策略——批准规则,以及对诸如递归删除或破坏性 SQL 等操作的硬性拒绝——适用于所有安全态势,包括 Dangerous。[`SECURITY.md`](./SECURITY.md) 包含了威胁模型、运营者假设和已知限制。 ## 为你的组织部署 创建一个由组织拥有的部署 repository,该 repository 依赖于 `@yc-software/qm`: ``` npm exec --yes --package=@yc-software/qm@latest -- \ qm init . --org --target
npm install
```
初始化过程会为 agent 生成部署 skill,并引导你完成基础设施配置、Web 登录、connector 凭证、可选的 Slack 访问权限、部署以及线上验证——无需签出源码。每次部署都在运营者自己的云账户中运行;初始化过程不会生成或启用部署 CI,且本 repository 没有生产部署工作流。详情请参阅 [`deployment.md`](./deployment.md)。
## 自定义你的实例
上述部署 repository 包含配置和沙箱层,且永远不需要签出源码。一些组织想要的是相反的权衡:将整个代码库集中在一个地方,以便工程师和编码 agent 可以同时阅读核心代码和自定义内容,同时保持自定义内容本身的私密性。为此,请保留一个**私有 fork**:一个独立的私有 repository,其历史始于 qm 的克隆,且其核心代码与上游保持一致。
只需填充一次数据,然后将其克隆到工作环境中:
```
gh repo create /qm-private --private
git clone --bare git@github.com:yc-software/qm qm-seed.git
git -C qm-seed.git push --mirror git@github.com:/qm-private
rm -rf qm-seed.git
git clone git@github.com:/qm-private
git -C qm-private remote add upstream git@github.com:yc-software/qm
```
请像上面展示的那样,通过普通的克隆来创建私有 fork,切勿使用 GitHub 的 fork 功能。这里的“fork”一词指的是一种概念——即一个刻意产生分歧并从上游合并的下游副本——而不是指 GitHub 的 Fork 按钮。GitHub fork 会继承其源 repository 的可见性,因此公共 repository 的 fork 无法设为私有。GitHub fork 还会与其源 repository 共享同一个对象网络,因此推送到该 fork 的 commit 依然可以通过 SHA 从公共端获取。许多组织也不允许 fork 私有 repository。普通克隆则没有这些问题,但它有一个代价:克隆出来的就是一个普通的 repository,因此上游的 CI 工作流会在你自己的账户中实时运行。你需要为这些工作流提供所需的机密,或者禁用那些你不想运行的工作流。
所有特定于你组织的内容都放在 `deploy/layers//` 目录下——包括配置、沙箱工具和 skills、插件镜像、基础设施——其结构与 `qm init` 生成的完全一致。请参阅 [`deploy/layers/README.md`](./deploy/layers/README.md)。核心代码与上游保持逐字节一致,这正是让合并保持轻量的关键。
有两个 skill 负责双向维护此边界。`update-qm` 会将上游的 qm 合并到私有 fork 中并发起同步 PR;`upstream-pr` 则会将与组织无关的修复发送回 qm,它会从 `upstream/main` 切出分支,并在推送前检查发出的 diff、commit 信息和截图中是否包含组织标识符。`deploy/layers/` 下的任何内容都绝不会提交到上游。
## 深入了解
- [`docs/getting-started.md`](./docs/getting-started.md) —— 从头到尾的首次运行指南
- [`cli/README.md`](./cli/README.md) —— `qm` CLI 和部署目录契约
- [`docs/deploy-directory.md`](./docs/deploy-directory.md) —— 完整的部署目录说明
- [`.env.example`](./.env.example) —— 每一个配置项,均有就地文档说明
- [`plugins/`](./plugins) —— 各个交互界面(Slack、Web UI、管理面板、公共门户)
## 许可证
除非另有说明,否则 QM 均在 [MIT License](./LICENSE) 下提供。
sessions · memory · queue")] subgraph CORE["Headless core"] API["API · identity · policy · scheduler"] LOOP["Agent loop
(Pi, OpenCode, Claude Code)"] API <--> LOOP end SBX["Per-scope sandbox
files · tools · logged-in services"] DB <--> API LOOP <--> SBX ``` 每一轮对话都会通过一个中央核心处理,该核心可以使用多种模型和框架来生成回复。Postgres 持久化层用于保存用户数据、会话历史和其他持久状态。该 agent 拥有一个小型且固定的工具集;其中一个是 `execute`,用于在作用域专属的独立沙箱(其持久化的计算机环境,已安装的工具会保留在其中)中运行命令。Web UI、管理面板和公共门户都是核心 HTTP API 之上的可选插件;Slack 是一个可选的进程内插件,由核心通过直接的服务客户端启动并监督。 核心直接在 Node 上运行 TypeScript,并使用 Fastify 处理 HTTP。Slack 插件使用 Bolt;Web UI 使用 Vite 构建并使用 Lit 渲染。 核心本身是通用的。所有特定于某家公司的内容——组织配置、自定义工具和 skills、沙箱镜像、基础设施——都存放在一个**部署目录**中,由 [`qm` CLI](./cli/README.md) 进行验证和部署。每个底层实现(框架、会话存储、沙箱、memory)都位于接口之后,因此生产环境的实现只需通过一个装配文件即可替换接入。 ## 安全与机密 QM 的方案遵循像 OpenCode、Codex 和 Claude Code 这样的本地编码 agent 的做法:agent 以其服务对象的身份行事,使用他们的凭证和权限,并且其所有操作都会被审计。组织需选择一种安全态势, narrower scopes(更小范围的作用域)只能在此基础上进一步收紧: - **Strict** —— 每个 harness 工具调用都会暂停并等待人工批准,但那两种无副作用的结束对话操作除外。 - **Auto**(默认) —— 分类器会在带来源标签的外部数据和工具结果发送给模型之前对其进行审查;部署环境可以将其指向自有的审查代理。 - **Dangerous** —— 不进行任何内容审查,工具调用之间也没有暂停。 预声明的命令策略——批准规则,以及对诸如递归删除或破坏性 SQL 等操作的硬性拒绝——适用于所有安全态势,包括 Dangerous。[`SECURITY.md`](./SECURITY.md) 包含了威胁模型、运营者假设和已知限制。 ## 为你的组织部署 创建一个由组织拥有的部署 repository,该 repository 依赖于 `@yc-software/qm`: ``` npm exec --yes --package=@yc-software/qm@latest -- \ qm init . --org
标签:AI智能体, DLL 劫持, MITM代理, Slack集成, 企业级工具, 协同办公, 大语言模型, 工作流自动化, 暗色界面, 自动化攻击