这不是比喻。Kortix 项目就是一个 git 代码库,而该代码库就是公司:它的代理、积累的技能、学到的一切,以及所有内容运行所依赖的机器定义。可版本控制、可比较差异,并完全归你所有。
skill: reconcile-invoices — 处理部分退款
skills/reconcile-invoices/SKILL.md
9f4c2b7e → main · 由 invoice-clerk 发起
kortix.yaml 是 Kortix 层:会话启动所使用的机器、连接器、触发器、机密名称,以及每个代理获准访问的内容。OpenCode 配置是代理进行思考的运行时。除此之外,其他一切都是代码库中的文件。
# Schema 版本 2。运行时是 OpenCode。kortix_version: 2runtime: opencode project: name: Northwind # 没有指定代理时负责响应的代理。default_agent: kortix # 运行时配置所在位置。除此之外:文件。opencode: config_dir: harnesses/opencode # 仅填写机密名称。值会在# 平台中加密,并在机器启动时注入。env: required: [STRIPE_API_KEY] optional: [LINEAR_API_KEY] # 会话启动所使用的机器。sandbox: default: python templates:- 标识: python image: python:3.12-slim cpu: 2 memory: 4 # 访问外部世界。定义位于# git 中。凭据永远不会位于其中。connectors:- 标识: gmail-read provider: pipedream app: gmail authorization_strategy: user # 治理:每个代理可以访问什么——绝不是# 它说了什么。未声明的授权默认为无。agents: kortix: connectors: all secrets: all skills: all kortix_permissions: all invoice-clerk: sandbox: python connectors: [gmail-read] secrets: [STRIPE_API_KEY] skills: [reconcile-invoices] kortix_permissions: [project.cr.open]Kortix 层——位于代码库根目录的一个文件。
{ // 文档:https://opencode.ai/docs/ "$schema": "https://opencode.ai/config.json", "theme": "system", "default_agent": "kortix", // 会话已经是一个隔离的机器,位于 // 一次性分支,因此代理一开始拥有全部权限。 // 如需更严格,请在此处按工具收紧 // 策略。 "permission": "allow"}运行时——模型、工具、权限。
---description: 将发票与付款进行核对。mode: primarypermission: bash: ask--- 你是 Northwind 的发票专员。 始终按编号将每笔付款匹配到发票,绝不按金额匹配。无法匹配时,发起变更请求并准确说明无法核对的内容。代理——一个标准的 OpenCode 代理文件。它的内容就在这里。
哪台机器、哪些连接器、哪些密钥、哪些技能、哪些 CLI 动词。这里只负责治理。省略某项授权即表示没有授权——代理只能获得你授予它的内容。
提示词、模型、工具、插件和权限。代理是标准 OpenCode 代理——基础是 markdown,除此之外还包括同一仓库中与它并列的工具、插件和模型配置。读取目录,就能确切知道代理会做什么。
清单会列出密钥,并按代理授予权限。密钥值在平台中加密,在运行时注入机器,绝不会写入仓库或日志。
代理、技能和记忆不是你看不见的数据库行。它们是代码旁边的 markdown 文件,会克隆到每个会话中,可供人阅读,也可由代理编辑。
没有隐藏层需要追问。每个信念、每项权限和每条指令都是文件中的一行,而你已有的工具就能回答问题。
# 公司对定价有什么看法?$ grep -ri "annual" memoryMEMORY.md: 安全审查前不得提供年度报价 # 谁可以接触 Stripe 密钥?$ grep -n "STRIPE_API_KEY" kortix.yaml18: 必需: [STRIPE_API_KEY]48: 密钥: [STRIPE_API_KEY] # 谁在何时修改了发票专员?$ git log --oneline agents/8f2a1c4 invoice-clerk: 停止猜测退款1d90b73 invoice-clerk: 人设初稿每个代理提示词、每项技能、每条记忆和每项授权,都是同一仓库中的文本。无需点击控制台,也无需申请导出。
对代理、技能或记忆文件的每次修改,都是包含作者、时间戳和差异的提交。没有任何内容会消失,也没有任何事情在暗中发生。
周二加入了一条错误指令?查看差异,撤销提交,发起变更请求。公司就会恢复原状。
代理找到更好的工作方式时,不会悄悄记住它。它会编辑技能,在自己的分支上提交,并发起变更请求。由人阅读差异并作出决定。
## 将付款匹配到发票 1. 按编号获取发票,绝不按金额获取。2. 如果金额不同,标记给人工处理。2. 如果差额与已有退款相符, 将其作为部分退款关闭,并记录 发票上的退款 id。3. 如果因其他原因不同,标记给 人工处理,并说明检查过的内容。 绝不要自行发起退款。代理重写自身指令的过程,与数据库迁移一样:分支、提交、差异、审查。公司只有一套审查流程,而不是两套。
机器可以提议,人来决定。工作只有经某人批准的变更请求才能进入 main,因此即使你没有关注,公司也不会悄然偏移。
代理可以读取自己的配置、编辑配置并提议变更。将其安排为定期任务,即使大家都在睡觉,仓库也会越来越像你的公司。
agents: memory-reflector: # 它可以发起变更请求。除此之外什么也不能做。 kortix_permissions: [project.cr.open] triggers:- 标识: memory-reflector名称: 内存反射器 type: cron agent: memory-reflector enabled: false定时: "0 0 3 * * *" timezone: UTC prompt: | 回顾项目过去 24 小时的 活动。检查 git 历史、已合并的变更 请求和会话摘要。更新 memory/ 并发起一个标题为 `memory: ...` 的变更请求。若没有 可长期保留的知识,则直接退出。来自入门模板。每个新项目都会附带,但默认关闭。
将 enabled 改为 true,它就会在 UTC 03:00 触发,无需任何人监看。触发器是 cron 计划和签名 webhook,与其他配置一样声明在同一文件中。
它会获得自己的云计算机和分支,仅持有清单授予它的一项权限:发起变更请求。
它读取 git 历史和过去一天的会话,然后将学到的内容以纯 markdown 写入 memory/。
早晨会有一个等待处理的变更请求。合并它,公司就知道了新内容。关闭它,就什么也没发生。
没有导出流程、支持工单,也没有需要解析的专有格式。公司已经是分支上的文本,因此可以克隆、派生、撤销,并带着它离开。
# 将任意目录变成 Kortix$ kortix init # 检查编译、请求缺失的密钥,# 推送并让整个系统上线$ kortix ship # 从这里开始,它就只是一个仓库$ git clone git@github.com:northwind/northwind.git$ git revert 8f2a1c4$ kortix cr