设计要点
- 本地优先:文件和命令在工作区执行
- 单一 Runtime:Agent、Session、ToolRegistry、Provider 共用一套语义
- 缓存优先:稳定内容前置,易变内容后置
- 结构化改文件:Search/Replace Diff,先校验再写入
本地编码 Agent 工作台:读项目、改文件、跑命令、预览结果。为 LLM 前缀缓存做逐字节优化。
| 组件 | 最低版本 | 用途 |
|---|---|---|
| Node.js | 20.19+ | 运行时和包管理 |
| npm | 9+ | 依赖管理 |
| Rust toolchain + Cargo | stable | 桌面端编译(debug/release/publish) |
| .NET SDK | - | C# Roslyn analyzer(release 构建需要) |
npm run build 会执行 build:host-server 编译 codepapr-server,因此也需要 Rust toolchain。只有单跑 npm run lint、npm run test(纯 vitest 部分)这类命令才不需要碰 Rust。
# 克隆仓库
npm install
npm run build
桌面端构建(cargo check / npm run debug / release / publish)从 crates.io 拉取 tree-sitter 及各语言 grammar 的最新兼容版本,不再依赖 .cargo-vendor/* 子模块。npm run build 已经包含 codepapr-server 宿主进程的编译,跑完这两步本机就有一个可用的宿主二进制;桌面端启动时会把它当 Tauri externalBin sidecar 拉起。
npm run verify
通过这一步,说明当前机器至少满足:Node 依赖安装正确、workspace 构建正常(含 codepapr-server 编译)、workspace 测试正常、Tauri cargo check 正常。
| 平台 | 架构 | 状态 |
|---|---|---|
| macOS | arm64 (Apple Silicon) | 支持(输出 .dmg 安装包) |
| Windows | x64 | 支持(输出 .msi 安装包) |
两个平台共用同一套 Rust 后端与前端代码,发布流程会同时输出 dmg / msi 安装包。
根据你要执行的操作,可能还需要:
| 命令 | 用途 |
|---|---|
npm run debug | 开发调试,热重载,适合长会话和日常使用 |
npm run release | 直接启动优化后的桌面端运行文件(不打包安装包) |
npm run publish | 生成当前平台的安装包(.dmg / .msi)并整理到 Release/ |
| 层级 | 路径 | 作用 |
|---|---|---|
| 应用级 | ~/.codepapr/codepapr.sqlite | provider、model、API key、语言、采样参数 |
| 项目级 | <workspace>/.CodePapr/ | 项目状态、会话记录、规则、Agents、Skills |
| 模式 | 说明 | 适用场景 |
|---|---|---|
deepseek | DeepSeek 官方 provider | 推荐默认,缓存优化效果最好 |
openai | OpenAI 兼容格式 | 接入 OpenAI 或兼容服务 |
claude | Claude/Anthropic 兼容格式 | 接入 Claude 或兼容端点 |
# OpenAI 格式(DeepSeek provider 默认使用)
https://api.deepseek.com/v1
CodePapr 的 DeepSeek provider 固定使用 OpenAI 兼容的 https://api.deepseek.com/v1。如果你想用 Anthropic 协议接 DeepSeek,可在 provider 中选择 Claude,并把 baseURL 设为 DeepSeek 提供的 Anthropic 兼容端点。
桌面端 provider 兼容层会按以下顺序读取 API key:
DEEPSEEK_API_KEYOPENAI_API_KEYANTHROPIC_API_KEYdeepseek-flash)| 场景 | 使用模型 | 温度 |
|---|---|---|
| 主 Agent 对话 | 主模型(默认 deepseek-v4-pro) | 默认 |
| 上下文压缩(Compactor 内部代理) | compactionModel 档位(默认快速模型 deepseek-flash,可切主模型) | 0.1 |
| 子代理派发(重型/执行类) | 主模型 | 用户配置 |
| 子代理派发(Explore/Scout 快速模式) | 快速模型(可切换为主模型) | 用户配置 |
Slash 命令声明 model: fast(如 /search、/lint、/clean、/commit、/summary) | 快速模型(未启用时回退主模型) | 0.3 |
通用 / LLM / 搜索 / 子Agent / 高级 / App。语音在角色面板。
npm install
npm run build
npm run debug
| 入口 | 适合场景 |
|---|---|
| Desktop Workbench | 长会话、文件树、Git、预览、浏览器交互——可视化工作台 |
注意:Explore、Scout、Mentor 三个内置子代理均可在桌面端设置面板(Mentor Tab)启用并配置;内部代理 Verifier / Compactor 的模型档位在高级 Tab 配置(verifierModelTier / compactionModel),不经 task 工具暴露。
Ask、Plan、Agent、App 不是不同产品,而是同一套 Runtime 的四种工作方式。
适合:解释架构、梳理模块职责、分析报错原因、先问清楚再决定是否执行。
特点:
适合:大改动前先出执行方案、确认影响文件和验证方式、把复杂任务拆成清晰步骤。
特点:
question 工具向用户提问确认决策适合:修复 bug、实现功能、跑测试与验证、需要真正读写文件和调用工具的任务。
特点:
bash 等长命令会在工具调用卡片中显示运行状态和日志适合:数据探索与可视化、生成交互式图表和仪表盘、一句话将分析结果变成可交互的应用。
核心理念:
工作流程:
.CodePapr/apps/<appId>/app_render({ appId }) 挂到右侧"应用"面板(不写文件)应用规范:
sandbox="allow-scripts allow-same-origin")window.papr)调用 Agent、存储、HTTP、文件系统inbox 并用 papr.events.on(channel, cb) 订阅——契约会进入会话上下文「已启用插件」,Agent 模式用 app_publish 按 example 推送(不要 app_list);历史经 papr.db.get('inbox:<channel>') 回放。自刷新小组件不要声明 inbox。papr.agent.run 采用 300 秒空闲超时:只要 Agent 持续产出进度事件(流式输出/工具调用)就可运行任意时长,仅连续 300 秒无事件才超时;工具轮数受 maxToolRounds 限制(默认/上限 50,搜索调用计入总轮数)app_render({ appId }) 刷新——支持迭代改进会话隔离:
模型策略:始终使用主模型以保证应用生成质量。
应用管理:右侧面板的"应用"Tab 显示所有已注册的 .papr App。绿/红圆点指示运行状态。底部工具栏:▶ 启动 / 打开 / ■ 停止 / 🗑 删除。LLM 可通过 app_list、app_start、app_stop、app_delete 工具管理应用生命周期。完整开发与插件规范详见 App 模式与插件生成 章节。
权限模型:App 用 local(none / read / write)× network(true / false)两轴声明访问档。设置 → App Tab 可收窄全局默认与逐 app 覆盖;保存后正在运行的后端会按新沙箱重启。
CodePapr 的实际表现很依赖任务描述质量。最有效的提示词通常包含:
修复 packages/@codepapr/ui 里预览关闭后后台进程未停止的问题。
先找当前预览会话和后台进程的绑定逻辑,再做最小修改。
改完后至少跑受影响范围的验证,如果没有窄验证,再说明原因。
帮我修一下预览。
顶部 AgentOps 工具栏点击 审查 可打开 Code Review 面板:
HEAD~1..HEAD 的 diff对话区域右侧有一个紧凑的轮次指示条,每条横线对应一个用户消息:
#1 编号 + 用户输入首句)顶部工具栏搜索框,支持对话和文件搜索,通过 对话 | 文件 双 Tab 切换:
↑↓ 选择 Enter 跳转桌面端使用非阻塞 Toast 替代 alert:
info / success / warning / errorerror 默认 8 秒当 Agent 请求读取或列出项目外的绝对路径时,桌面端会弹出权限对话框:
授权结果保存在白名单中,后续同路径不再弹窗。写入、编辑、命令执行仍限制在工作区内。
每条用户消息进入对话历史之前,CodePapr 会通过独立的 Shadow Git 仓库(.CodePapr/git/,基于 libgit2 — 无需系统 Git CLI)抓取代码快照:
.gitignore 并自动排除 node_modules/、dist/、.next/、大文件(>100MB)等index.add_path 逐文件添加,提交为 checkpoint #N · "消息预览"当你需要回退时:
refs/codepapr-backup-before-reset,可随时撤销Agent 注册了 全面的工具集,覆盖文件操作、ProjectGraph 分析、Git、预览、浏览器、Shell、LSP 等全部本地开发场景。以下是按能力分组的关键工具。
统一的项目语义图工具,通过 action 参数选择操作。同时返回目录树、代码结构骨架和文件/符号关系图,是所有符号查找、依赖分析、影响分析的基础。
| 工具 / Action | 能力 |
|---|---|
graph full | 生成完整 ProjectGraph:目录树 + 代码结构骨架 + 依赖图 |
graph overview | 轻量概览(不含完整代码骨架),适合快速感知项目轮廓 |
graph lookup | 按名称/路径查找符号,返回 symbolId、文件和行号 |
graph dependency | 提取依赖子图,支持 incoming / outgoing / both |
graph entrypoints | 查找项目入口文件和入口符号 |
graph impact | 反向影响分析:修改某符号会影响哪些地方 |
graph implementations | 查找接口或基类的实现/派生符号 |
graph smart_context | 根据任务描述智能获取最相关项目上下文 |
graph dead_code | 检测未使用的符号(类、函数、变量) |
graph circular_deps | 检测文件间循环导入依赖 |
graph type_hierarchy | 构建类、接口、类型的继承/实现层次树 |
graph suggest_refactors | 基于代码结构分析,建议可提取的方法和可独立成文件的符号 |
graph test_impact | 根据变更文件列表,分析哪些现有测试会受影响 |
graph generate_tests | 为项目中导出的可测试符号自动生成测试骨架 |
| 工具 | 能力 |
|---|---|
read | 读取文件内容,支持行范围、行窗口、上下文行数、字节限制 |
write | 创建或完整覆盖写入文件;局部修改请用 edit |
edit | 单文件精确 SEARCH/REPLACE 修改;search 必须精确匹配源文件 |
patch | 多文件原子 SEARCH/REPLACE;全部校验成功后一起写入,任一失败即回滚 |
grep | 正则搜索文件内容,返回匹配位置与上下文;semantic:true 切换 LSP 语义检索 |
glob | 按文件名 glob 模式搜索项目文件,支持正则合并 |
list | 浏览项目目录树,逐文件嵌入轻量符号(AST);无 AST 语言仅返回路径 |
| 工具 / Action | 能力 |
|---|---|
lsp definition / references | 语言服务只读导航:跳转到定义、查找所有引用 |
lsp_edit rename / code_action / format | 语言服务语义修改:重命名、代码动作、格式化 |
diagnostics | 单文件 LSP 诊断或项目级 lint / typecheck |
| 工具 / Action | 能力 |
|---|---|
bash run / list / stop / stop_all | 在项目环境执行 shell 命令(穿过 shell,支持管道/&&/变量);默认阻塞,background:true 后台运行返回 pid,workdir 指定工作目录;list/stop/stop_all 管理后台进程 |
| 工具 / Action | 能力 |
|---|---|
git status / diff / log | 读取工作区状态、差异、提交历史 |
git branch / stage / commit | 切换或创建分支、暂存改动、创建提交 |
git restore / reset | 恢复改动或安全回退(自动创建备份分支和快照) |
| 工具 / Action | 能力 |
|---|---|
browser open / navigate / reload / close | 内置浏览器:打开 URL、导航、刷新、关闭 |
browser click / type / read / screenshot / get | 浏览器交互:点击元素、输入文本、读取 DOM、截图、读状态 |
| 工具 | 能力 |
|---|---|
app_render | 打开已写入磁盘的 .papr App 到应用面板。只传 appId。manifest.json 和入口 HTML 必须先用 write/edit/patch 写到 .CodePapr/apps/<appId>/。访问档在 manifest 的 local/network(旧 level 0-3 仍兼容)。HTML 可使用 window.papr SDK。修改文件后再 app_render 刷新。 |
app_list | 列出所有已注册 .papr App(名称、kind、pinned、是否有后端、是否运行中、inbox)。仅 App 模式:创建前检查重复。编程 Agent 的推送契约在会话上下文,不靠此工具。 |
app_start | 按 appId 启动后端服务。检查端口可用性,成功后绿点亮起。 |
app_stop | 按 appId 停止后端服务。停止后绿点变红。 |
app_delete | 按 appId 彻底删除 App。停止后端、删除文件、清除存储。不可恢复。 |
app_publish | 向 App/插件频道推送内容(app_publish({ appId, channel, payload }))。只推会话上下文「已启用插件」里列出的目标(已启用且声明了 inbox);不要先 app_list。事件原子落库(并发安全,保留最近 200 条),App 挂载时经 papr://event 实时送达;未挂载时短暂排队(约 30 秒),App 随后打开仍会实时收到。画布/看板:分析完 → 按 example 推一张图或一张卡片。 |
| 工具 | 能力 |
|---|---|
websearch | 在线搜索网页,聚合多源结果 |
webfetch | 读取网页内容,自动提取正文并转为纯文本;save: true 下载原始内容到项目并返回路径 |
| 工具 | 能力 |
|---|---|
skill | 加载项目 .CodePapr/skills/ 下的 Skill 说明文件 |
local_time_now | 获取当前本地时间、日期和时区,适合时效性问题(市场开闭盘、活动截止时间等) |
question | Plan 模式下向用户提问,支持预定义选项和多选 |
task | 把子任务委派给声明式子代理(Explore / Scout / Mentor)执行 |
todo | 规划和追踪多步任务清单,支持初始化、进度汇报、重规划 |
桌面端对项目外绝对路径的 read / list 操作会触发 PermissionDialog 弹窗授权;写入仍限制在工作区内。根目录直属文件选择「允许此文件夹」时会自动降级为仅授权该文件本身,避免一次点击授予整个文件系统根。
单次 read / write / edit / patch 操作的上限为 20MB,可覆盖大多数源码和二进制资源文件,但大文件会显著增加 token 消耗。
tools 配置白名单限制权限。代码修改优先用 edit/patch 走 Search/Replace Diff,新建文件才用 write。命令执行统一用 bash:短命令直接 bash(command: ...),长驻进程用 bash(command: ..., background: true),后台进程用 bash(action: list/stop) 管理。网络访问用 websearch(搜索)和 webfetch(读网页;save: true 下载文件);在系统浏览器打开用 bash。
实验性功能,默认关闭:需在 设置 → 通用 → 实验性功能 中勾选「角色」,工具栏才会出现角色入口。CodePapr 支持创建、导入和管理 AI 角色,让 Agent 以特定人设与你对话。启用角色后,人设进入 Session Bootstrap(由 promptBuilders.ts / characterTypes.ts 组装),不是 core 的 promptSystem.ts,也不进入 ImmutablePrefix。
每个角色包含以下字段:
| 字段 | 说明 |
|---|---|
| 名称 | 角色显示名 |
| 头像 | 上传的图片,也会显示在聊天界面 |
| 描述 | 外貌、背景故事、身份设定 |
| 个性 | 说话风格、性格特征、行为习惯 |
| 场景 | 当前对话发生的情境 |
| 开场白 | 角色第一次对话时会说的话 |
| 示例对话 | 用 <START> 分隔的多组对话,引导 LLM 理解角色风格 |
| 系统提示词 | 追加到角色人设后面的额外指令 |
| 标签 | 自定义标签,用于分类和检索 |
「角色扮演」模式下,系统提示词会明确以下格式规则,确保 TTS 能正确区分对话和动作;Ask / Plan 模式中角色一律按「编码人设」注入,不适用该格式:
| 格式 | 含义 | TTS 行为 |
|---|---|---|
*动作描述* | 叙述、场景描写、角色动作 | 不朗读 |
| 纯文本 | 角色说的话 | 朗读 |
**加粗文字** | 重读、强调 | 朗读时加重语气 |
(括号)或 (轻声) | 语气提示 | 不朗读 |
CodePapr 兼容 chara-card-v3 规范,可从其他工具导入角色:
支持的 PNG chunk 关键字:chara、ccv3、character、character_card
在角色列表中点击角色的导出按钮,角色将被导出为 PNG 角色卡。PNG 中嵌入完整的 CCv3 JSON,可在 SillyTavern 等工具中使用。语音配置中可跨机移植的参数(语速、采样步数、合并句数、播放模式、语言设置)会写入 extensions.codepapr.voice;本机参考音频与微调模型文件路径不随卡片导出。
在角色编辑页点击启用,只对当前会话生效;若面板中有未保存的修改,会先自动保存再启用。列表里点击角色名是进入编辑,不会激活。打开面板时会选中当前会话已启用的角色。空会话中切换角色时,旧角色的开场白会被替换为新角色的开场白。
角色人设放在 Session Bootstrap 中(不在系统提示词的 ImmutablePrefix 中),因此切换角色不会破坏 LLM 前缀缓存。Ask / Plan 模式下角色固定按「编码人设」注入(角色扮演格式仅在 Agent 模式生效)。新会话默认不带角色。
实验性功能,默认关闭:需在 设置 → 通用 → 实验性功能 中勾选「语音」才会显示语音控件;自动朗读还需同时开启「角色」并为已启用角色配置语音。CodePapr 集成了 GPT-SoVITS 语音克隆引擎,可在本地将角色的文字回复合成为语音。只需 3-10 秒的参考音频即可克隆一个角色的声音。
首次使用语音功能需要安装 GPT-SoVITS。安装入口有两处:
安装向导会自动完成 5 步:检查 Python → 克隆 GPT-SoVITS 仓库 → pip 安装依赖 → 下载预训练模型(约 2GB,使用 hf-mirror 源)→ 验证。
需要本机已安装 Python 3.10+。安装过程会写入 ~/.codepapr/gpt-sovits/。
ws-batch,可选 streamed-pipeline / streamed-pcm / whole角色面板 Voice Tab 提供四种播放模式,默认且推荐 WebSocket 批量流式(ws-batch):句子先按「合并句数」(默认 3 句)合成 chunk,再经由一条持久 WebSocket 连接逐请求发送、逐条返回,首字延迟约 1-2 秒,句间衔接流畅。
其余三种:streamed-pipeline / streamed-pcm(逐句 HTTP 请求,PCM 直推播放器,兼容性最好)、whole(等整条回复生成完毕后一次性合成播放,启动最慢但整体最连贯)。
对音质有更高要求时,可在 Voice Tab 中使用微调功能:
全项目规则会注入主 Agent 和所有子代理。适合写:
.CodePapr/AGENTS.md 并拼进稳定系统提示词。文件不存在会被自动跳过。
跨会话记忆就是工作区里的一个文件 .CodePapr/MEMORY.md(三节:用户偏好与约束 / 技术栈与环境约束 / 架构与业务已知事实),可读、可 diff、可进 git。它由内置记忆管家(internal 子代理)后台维护,记忆面板就是它的编辑器。分层与时间线见 上下文分层。
memory_write / memory_search / memory_list / memory_forget 已退役;Agent 直写 MEMORY.md 会被拦截拒绝,值得记住的事实在回答中说明即可。手动触发 v4 骨架压缩,将更早回合折叠为检查点释放 token 空间:
桌面端项目头部的"配置"入口可以:
.CodePapr/AGENTS.md(不存在时生成默认模板).CodePapr/agents/*.md).CodePapr/skills/**/SKILL.md)| 路径 | 作用 |
|---|---|
~/.codepapr/codepapr.sqlite | 应用级设置、会话和缓存统计 |
~/.codepapr/lsp-tools/ | 托管 LSP 工具下载缓存(首次需要时下载,下次复用) |
<workspace>/.CodePapr/project.sqlite | 项目级状态、聊天记录、缓存统计 |
<workspace>/.CodePapr/MEMORY.md | 跨会话项目记忆(记忆管家维护;面板可编辑;每回合注入会话引导) |
<workspace>/.CodePapr/skills | 项目级技能文件 |
<workspace>/.CodePapr/agents | 项目级子代理定义 |
<workspace>/.CodePapr/commands | 项目级自定义命令 |
<workspace>/.CodePapr/downloads/ | Scout 子代理下载文件的默认目录 |
~/.codepapr/voices/ | 角色参考音频文件 |
~/.codepapr/gpt-sovits/ | GPT-SoVITS 安装与预训练模型 |
CodePapr 的自动修改不依赖标准 Git diff 行号。多处局部修改会优先生成 Search/Replace 块:
<<<<<<< SEARCH
文件里已经存在的旧代码
=======
替换后的新代码
>>>>>>> REPLACE
SEARCH 必须能在目标文件中精确匹配SEARCH 如果匹配多处,会被拒绝,避免误改Skill 是主 Agent 的可复用操作手册,适合沉淀搜索策略、排错流程、发布检查、审查清单和项目固定工作方法。它不会创建独立子代理,而是作为项目级上下文供模型按需选择。
以目录包为标准,放在 .CodePapr/skills/**/SKILL.md,目录里可放 assets/、references/、scripts/ 等资源。
---
name: search
description: 使用公开网页、官方文档和社区资料进行可验证搜索
---
# 搜索 Skill
当任务需要公开资料、当前事实、第三方 API 用法或报错排查时:
- 官方文档优先,其次 GitHub issue / PR,再看社区答案。
- 精确报错使用双引号,例如 "Cannot find module"。
- 限定站点使用 site:,例如 site:developer.mozilla.org fetch abort。
- 同时带上库名、版本号、运行环境和关键错误码。
skill 读取完整内容.CodePapr/project.sqlite默认 search Skill 包含常用资料源和方法:
site: 限定站点、双引号精确报错、包名加版本号CodePapr 自带三个内置子代理,主 Agent 可通过 task 工具直接调度,无需额外配置:
| Agent | 用途 | 模型 | 工具 |
|---|---|---|---|
| explore | 只读代码分析:搜索项目文件、定位符号、分析依赖关系 | fast | read, read_image, list, lsp, diagnostics, grep |
| scout | 网络搜索:查找文档、API 参考、最新资料 | fast | websearch, webfetch, browser, read_image |
| mentor | 架构/算法/调试高层指导(不写代码、不调工具) | mentor* | 无 |
* Mentor 默认使用主模型,可在设置中启用独立导师模型(支持独立的 API Key、Base URL 和模型选择;未单独配置 API Key 时回退到主 API Key)。
| Agent | 用途 | 模型 | 工具 |
|---|---|---|---|
| verifier | Goal 验收:只读核实 Worker 是否真正达成目标,防完工偏见、防伪造成功(/goal) | verifierModelTier(快速/主/导师) | read, grep, glob, list |
| compactor | 上下文压缩的二级摘要:仅当确定性骨架装不下预算时,把骨架合并成一份摘要(轮间 / mid-loop / Goal / 子代理共用) | compactionModel(快速/主) | 无(纯推理) |
三个内部代理均 internal: true,由运行时直接调用:Verifier 由 GoalRunner 验收循环调用(专属预算:6 轮工具 / 3 分钟墙钟);Compactor 由压缩管线在骨架超预算时调用;Memory-curator 由记忆管线在交付 / 压缩前两个卡点调用(素材绝不含原始工具输出)。三者均零工具、不注入 skills/memory/project-graph(bootstrap 隔离),墙钟沿用子代理默认 20 分钟。v4 压缩主路径是确定性骨架(零 LLM),Compactor 只在骨架超预算时做一次二级摘要;未启用快速模型或摘要失败时降级为按行截断,绝不递归。
在 .CodePapr/agents/<name>.md 中用 YAML frontmatter + 正文声明一个子代理,主代理可以把子任务委派给它。同名 Agent 会覆盖内置定义。
---
description: reviewer 负责审查当前改动、定位风险并给出最小修复建议
mode: subagent
model: fast
temperature: 0.2
tools:
read: true
grep: true
diagnostics: true
git: true
write: false
exec: false
---
你是 reviewer,一个只读代码审查子代理。
职责:
- 阅读主代理委派的目标、相关文件和当前 diff。
- 优先找真实 bug、行为回归、边界条件遗漏和缺失验证。
- 给出最小修复建议,指出应修改的文件和验证命令。
边界:
- 默认不直接改文件。
- 不重复总结无关代码风格,只报告影响正确性、可靠性或可维护性的发现。
输出格式:
1. Findings:按严重程度列出问题
2. Suggested Fix:给出最小修改方向
3. Verification:列出建议运行的验证命令
model:覆盖模型,可选 fast(快速模型)或具体模型名temperature:温度参数,可选数字tools:工具开关,缺省继承全部工具,声明空对象 {} 表示无工具.md)即子代理名称,与内置 Agent 同名则覆盖description 让主代理知道何时调用它tools 控制读写/命令权限| 方式 | 触发 | 说明 |
|---|---|---|
| 编排层自动拆解 | 系统自动决策 | Agent 模式下,任务含执行动词且够复杂时,LLM 判断是否需要拆成 2-5 个子任务并行/串行执行 |
| Task 工具主动委派 | Agent 主动调用 | 主 Agent 推理过程中显式调用 task 工具,将子任务委派给独立子 Agent(含内置和自定义) |
.CodePapr/AGENTS.md 是全局项目规则,所有模式、所有子代理都会继承;自定义 Agent 是专职子代理,只有主代理通过 task 工具委派子任务时才启用。前者适合写"所有任务都遵守什么",后者适合写"某一类任务交给谁做、能用哪些工具"。
命令支持 --name(推荐)和 /name(兼容旧版)两种格式。命令的 model 字段决定路由:未声明时使用主模型,声明 fast 时使用快速模型,本地命令不消耗 token。
| 命令 | 作用 | 模型 | 示例 |
|---|---|---|---|
/help | 列出所有命令及说明 | 本地 | /help |
/commands | /help 的别名 | 本地 | /commands |
/compact | 强制压缩当前会话上下文——确定性骨架检查点(零 LLM;骨架超预算时一次二级摘要) | 本地 / 快速 | /compact |
/undo | 撤销上一次对话重置(恢复被截断的对话与代码快照) | 本地 | /undo |
/goal | 自主循环:Worker 执行 + Verifier 验收,直到验证条件通过 | 主模型 | /goal exec:npm test |
/review | 审查当前改动或指定范围 | 主模型 | /review src/App.tsx |
/fix | 定位并修复指定问题 | 主模型 | /fix 登录按钮无响应 |
/test | 补测试或运行相关测试 | 主模型 | /test src/utils/format.ts |
/explain | 解释文件、符号、错误或实现 | 主模型 | /explain handleSubmit 函数 |
/diagnose | 诊断报错、慢操作或异常行为 | 主模型 | /diagnose 页面加载超过 5 秒 |
/refactor | 保持行为不变的前提下整理代码 | 主模型 | /refactor src/components/Modal.tsx |
/doc | 为变更或功能更新文档 | 主模型 | /doc 新增的退款接口 |
/new | 根据描述从零创建新文件、组件或功能 | 主模型 | /new 创建用户重置密码 REST API |
/optimize | 分析并修复性能瓶颈 | 主模型 | /optimize src/pages/Dashboard.tsx |
/build | 构建项目并诊断/修复构建错误 | 主模型 | /build |
/search | 搜索代码库中的模式、用法、定义或引用 | 快速模型 | /search auth middleware |
/lint | 运行 linter 并修复违规 | 快速模型 | /lint src/ |
/clean | 清理死代码、未用导入和遗留调试语句 | 快速模型 | /clean src/utils/ |
/commit | 暂存改动并生成规范的 commit message | 快速模型 | /commit |
/summary | 对文件、模块或整个项目做高层概述 | 快速模型 | /summary src/core/ |
在 .CodePapr/commands/<name>.md 中声明可复用的提示词模板,即可注册为斜杠命令 /<name>:
| 语法 / 占位符 | 说明 |
|---|---|
$ARGUMENTS | 用户在命令后输入的所有参数(以空格拼接) |
$1 $2 ... | 第 N 个位置参数(支持带引号的传参) |
@path | 只读读取工作区相对路径文件内容,并以内联代码块嵌入 Prompt |
!`cmd` | 执行简单命令行并将命令输出嵌入 Prompt(仅支持简单命令,不支持管道复合操作) |
示例 1:静态页面与画面渲染诊断(纯前端/零 Git 风险)
---
description: 诊断 index.html 页面结构与画面逻辑
usage: /pagecheck [问题描述]
model: fast
---
请帮我诊断当前静态项目的页面结构与画面逻辑。
页面入口:@index.html
用户关注问题:$ARGUMENTS
示例 2:依赖与脚本分析
---
description: 分析 package.json 依赖与脚本
model: fast
---
请基于项目根配置回答用户问题:
配置内容:@package.json
问题:$ARGUMENTS
示例 3:代码审查与修复(委派 Subagent + 运行状态)
---
description: 审查并修复 lint
agent: code-reviewer
---
请审查 $ARGUMENTS 的改动,并修复其中的 lint 问题。
参考规则见 @.CodePapr/AGENTS.md
当前状态:!`git status -s`
/ 弹出命令面板,支持键盘 ↑↓ 快速选择;输入 /命令名 参数 发送即可。在聊天框输入 /help 可随时查看已注册的项目命令。
在 CodePapr 中,App 模式(应用模式)不仅是写代码的助手,更是交互式应用的即时工厂。只需用自然语言描述需求,Agent 会在几秒钟内完成数据分析、架构设计与前端开发,生成一个开箱即用的 .papr 应用或桌面插件,并挂载到主窗口中运行。
每个 .papr 应用在 manifest.json 中通过 kind 字段声明形态:
| 产物形态 | 声明方式 | 运行机制 | 典型适用场景 |
|---|---|---|---|
| 全屏微应用 (App) | kind: "app"(默认缺省) |
在工作台上方以全屏独立视图打开,独占主区域展示。支持后端 Command 进程服务。 | SQLite Database Explorer、三维拓扑图、复杂大屏仪表盘、文档静态站点预览器 |
| 桌面插件 (Plugin) | kind: "plugin" |
在主窗口内以轻量悬浮层 (Overlay / HUD) 呈现,与编程工作台共存常驻。写代码时可随时查看,支持自由拖动位置、通过 papr.window 自适应大小,并在应用 Dock 中一键钉住 (Pin) 与收起。 |
股票/数字货币实时行情条、架构演进实时看板、任务进度浮窗、代码灵感便利贴 |
kind: "plugin" 插件。local: "write" 项目写权限,确保轻量与安全性。
所有应用与插件均保存在项目的 .CodePapr/apps/<appId>/ 目录下。为了便于后续通过 Agent 进行精确 patch 和持续迭代,CodePapr 强制要求模块化拆分(原生 ES Modules,零构建链,import 必须带 .js 后缀):
.CodePapr/apps/<appId>/
├── manifest.json # 应用清单:元数据、kind、surface、权限、inbox 契约、agents
├── index.html # 骨架页面:只放 DOM 骨架,引入 CSS 与 js/main.js,禁止巨石代码
├── css/
│ └── theme.css # 样式定义:适配 html[data-mode="dark"] 与 html[data-mode="light"]
├── js/
│ ├── main.js # 入口模块:初始化、DOM 绑定与事件监听
│ ├── db.js # 数据持久化封装(papr.db)
│ ├── ui.js # 视图渲染、Loading 与交互动效
│ ├── api.js # 外部数据拉取封装(papr.http,可选)
│ └── agent.js # AI Agent 多轮调用封装(papr.agent.run,可选)
├── data/ # 应用私有沙箱文件存储(papr.fs,运行时自动维护)
└── db.sqlite # papr.db 键值数据与 inbox 历史(运行时自动生成)
注:对于轻量级插件(kind: "plugin"),推荐遵循三文件结构(index.html + css/theme.css + js/main.js),单文件超过 200 行再做职责拆分。
window.papr)应用运行在安全沙箱 iframe 中,无需安装任何 npm 包,宿主环境会自动注入 window.papr 运行时 SDK:
| SDK 模块 | 主要 API 方法 | 权限要求 | 功能与说明 |
|---|---|---|---|
papr.db |
get(key)set(key, val)delete(key)keys() |
无权限要求(永远可用) | 基于 SQLite 的持久化键值存储,按应用天然隔离。应用重启后数据永不丢失。 |
papr.agent.run |
run({ agent, task }, onProgress?) |
按 local/network 访问档 |
在 App 内唤起多轮推理 AI 子代理。支持实时流式事件(tool-call-start、content-delta)与 300 秒空闲超时机制。 |
papr.http |
get(url)post(url, body)request(opts) |
network: true |
安全公网 HTTP 请求。支持自定义 Header,严格拦截本地与私有 IP 请求以防内网 SSRF。 |
papr.fs |
readFile(path)writeFile(path, data)exists(path)list()delete(path) |
无权限要求(限定 app data 目录) | 应用专用沙箱文件系统。writeFile 自动创建父级目录,支持 base64 存取二进制资产与图片。 |
papr.events |
on(channel, callback) |
无权限要求(永远可用) | 实时事件总线。监听编程 Agent 经 app_publish 推送的频道事件,返回解绑函数。 |
papr.window |
setSize({ width, height })getBounds()onBounds(cb) |
无权限要求(仅 kind: "plugin") |
插件视口控制。运行时动态调整悬浮插件 Overlay 尺寸(默认调节内容区,宿主自动附加拖拽顶栏)。 |
papr.app.info |
info() |
无权限要求 | 返回应用元数据:appId、name、version、local、network、生效权限等。 |
app_publish + inbox 契约)在「Agent 负责在终端敲代码/跑测试,悬浮插件负责实时展示任务进展/架构节点」的协同场景中,CodePapr 提供了轻量高效的推送机制:
manifest.json 中定义 inbox 频道和最小数据示例 example。app_publish({ appId, channel, payload })。db.sqlite(保留最新 200 条);插件已挂载时经 papr://event 实时更新;未挂载时事件短暂排队(约 30 秒),刚打开的实例仍会实时收到;更晚启动则通过 papr.db.get("inbox:<channel>") 无缝回放历史(实时与回放可能重叠,按 seq 去重)。manifest.json 采用 本地访问(local) × 网络访问(network) 两轴安全声明:
| 权限轴 | 取值 | 允许的能力与工具范围 |
|---|---|---|
local |
"none" |
纯计算沙箱:仅允许 papr.db 与 papr.fs(私有存储)。 |
"read" |
允许读取工作区文件:解锁 Agent 只读工具(read / grep / list / lsp 等)。 |
|
"write" |
允许修改项目:解锁 Agent 写文件与命令执行工具(write / edit / patch / bash)。注:Plugin 插件禁用此级别。 |
|
network |
false |
完全离线沙箱:CSP 策略拦截任何外部网络连接。 |
true |
允许联网:解锁 papr.http、Agent websearch / webfetch 与 MCP 联网服务。 |
在工作台右侧切到 应用 选项卡,即可浏览项目中所有已生成的 .papr 应用与插件:
.zip 便于分享或备份。提示词:“帮我生成一个悬浮在右上角的数字货币实时行情小组件,支持 BTC/ETH,每 10 秒自动刷新,高密度小窗展示。”
manifest.json 配置:
{
"spec": "papr/0.1",
"name": "加密行情小组件",
"version": "1.0.0",
"kind": "plugin",
"surface": {
"type": "overlay",
"width": 300,
"height": 180,
"position": "top-right"
},
"local": "none",
"network": true
}
js/main.js 核心逻辑:
async function fetchPrices() {
try {
const data = await window.papr.http.get('https://api.coingecko.com/api/v3/simple/price?ids=bitcoin,ethereum&vs_currencies=usd&include_24hr_change=true');
render(data);
} catch (err) {
console.error('行情拉取失败:', err);
}
}
// 定时轮询与启动拉取
fetchPrices();
setInterval(fetchPrices, 10000);
提示词:“生成一个架构任务看板插件,声明 cards 频道接收你在编码过程中推送的执行步骤和状态。”
manifest.json 配置(含 inbox 契约):
{
"spec": "papr/0.1",
"name": "架构演进看板",
"kind": "plugin",
"surface": {
"type": "overlay",
"width": 360,
"height": 260,
"position": "bottom-right"
},
"local": "none",
"network": false,
"inbox": {
"cards": {
"description": "推送任务状态变更卡片",
"example": { "id": "task-1", "title": "重构 Auth", "status": "done" }
}
}
}
js/main.js 订阅与历史回放:
// 1. 启动时回放历史事件
const history = await window.papr.db.get('inbox:cards') || [];
history.forEach(evt => applyCard(evt.payload));
// 2. 监听 Agent 实时推送
window.papr.events.on('cards', (evt) => {
applyCard(evt.payload);
});
提示词:“分析项目中的 stats.sqlite 数据库,生成一个全屏的 Database Explorer 应用,支持表格分页预览与 SQL 查询。”
Agent 会声明 local: "read",利用多文件拆分构建前端表格组件与 SQL 结果视窗,并在右侧应用面板中无缝挂载全屏交互页面。
/goal 是控制命令(与 /compact 同级),启动 Worker + Evaluator 双模型自主循环。它将 AI 编程助手从"一问一答"模式变成一个长周期自主运行代理——直到机器可验证的验收条件通过才结束。
核心机制不是在 prompt 里加"请一直工作到完成为止",而是建立了一套工程化的自对弈系统:
三者协作:条件函数判定 + Verifier 反伪造 = 双保险。只有条件满足且 Verifier 确认 Worker 没有作弊,才判定为 SATISFIED。
# 退出码为 0 即满足
/goal exec:npm test
# 退出码 0 且 stdout 匹配正则
/goal exec:npm test match:"\d+ passed"
# 复合条件,全部满足
/goal exec:npm run lint && exec:npm test
# 自然语言目标 + 验收条件(| 分隔)
/goal 修复 auth 测试 | exec:npm test
| 语法 | 说明 |
|---|---|
exec:<command> | 执行命令,退出码必须为 0 |
exec:<cmd> match:"<pattern>" | 退出码 0 且 stdout 匹配正则模式 |
exec:<cmd1> && exec:<cmd2> | 复合条件,所有子句都必须通过 |
<目标> | exec:<cmd> | 自然语言目标 + 验收条件,| 分隔 |
.CodePapr/goal-state.md| 限制 | 默认值 | 说明 |
|---|---|---|
| 最大迭代轮数 | 20 | 外循环最大轮数,超过自动停止 |
| 最大运行时间 | 30 分钟 | 墙钟超时自动停止 |
| 用户中断 | 随时 | GoalBanner 上的"停止"按钮 |
| 状态持久化 | 每轮 | 写入 .CodePapr/goal-state.md,防上下文腐烂 |
在设置面板的高级标签页中配置 Goal 循环参数:
Model Context Protocol(MCP)是一种开放协议,允许 Agent 通过外部工具服务器扩展能力。CodePapr 内置 MCP host,可同时连接多个 MCP 服务器,把外部工具透出给主 Agent 调用。
每个 MCP 工具会以 mcp__<serverId>__<toolName> 形式注册,与内置 30 个工具并列出现在 ToolRegistry 中。
| Transport | 说明 | 适用场景 |
|---|---|---|
stdio | 子进程 + stdin/stdout JSON-RPC | 本地命令行 MCP 服务器(npx / uvx / python 等) |
sse | Server-Sent Events | 远程 HTTP MCP 服务器,单向流式 |
streamable-http | Streamable HTTP | 远程 HTTP MCP 服务器,双向流式 |
| 字段 | 类型 | 说明 |
|---|---|---|
name | string | 显示名称 |
category | search / database / custom | 分类,search 启用后会替代 websearch 路由 |
transport | stdio / sse / streamable-http | 传输模式 |
command / args | string | 仅 stdio 使用:可执行命令和参数(参数支持引号分组) |
url | string | 仅 sse / streamable-http 使用:HTTP 端点 URL |
env | 多行 KEY=value | 仅 stdio 使用:环境变量;不会进入模型上下文 |
headers | 多行 Header-Name: value | 仅 sse / streamable-http 使用:HTTP 请求头,常用于认证 |
allowedTools | 逗号分隔,支持 * 通配 | 白名单,留空表示允许全部 |
deniedTools | 逗号分隔,支持 * 通配 | 黑名单,优先级高于白名单 |
permissionMode | read-only / read-write / dangerous | 权限分级,决定调用前是否需要确认 |
requireConfirmation | boolean | 每次调用前都弹出确认 |
timeoutSeconds | 5–600 | 单次工具调用超时 |
桌面端默认提供三个开箱可用的 MCP 服务器(默认全部禁用,需手动启用):
| 名称 | 分类 | 命令 | 用途 |
|---|---|---|---|
| DuckDuckGo Search MCP | search | npx -y duckduckgo-mcp-server | 免 API key 网页搜索 |
| Postgres MCP | database | npx -y @modelcontextprotocol/server-postgres <DSN> | SQL 查询、表结构发现,默认禁写 |
| SQLite MCP | database | uvx mcp-server-sqlite --db-path ./database.sqlite | 本地 SQLite 数据库分析 |
# 名称
DuckDuckGo Search MCP
# Transport
stdio
# 命令 / 参数
command: npx
args: -y duckduckgo-mcp-server
# 环境变量(每行一个 KEY=value)
env:
HTTP_PROXY=http://127.0.0.1:7890
USER_AGENT=CodePapr/0.1.0
# 工具过滤
allowedTools: duckduckgo_web_search
# 名称
Remote Knowledge Base
# Transport
streamable-http
# URL
url: https://example.com/mcp
# Headers(每行一个 Header-Name: value)
headers:
Authorization: Bearer your-token-here
X-API-Key: your-api-key
requireConfirmation 使用requireConfirmation通过 allowedTools 和 deniedTools 控制每个服务器暴露的工具子集:
* 通配符(如 describe*、list_*)allowedTools=query,describe*,list* + deniedTools=delete*,drop*,truncate*,update*,insert*,确保只读| 设置 | 默认 | 说明 |
|---|---|---|
enabled | false | MCP 总开关,关闭后所有 MCP 服务器停用 |
exposeTools | true | 是否把 MCP 工具透出给 Agent;关闭后 MCP 仅作为后台连接,不进入工具列表 |
resultMaxBytes | 200,000 | 单次工具调用结果的最大字节数(1KB – 5MB) |
ImmutablePrefix 的工具定义哈希。新增/删除/修改 MCP 服务器都会破坏前缀缓存,下一轮请求需要重新建立缓存。建议在长会话开始前就完成 MCP 配置。
| 包 | 角色 | 主要责任 |
|---|---|---|
@codepapr/types | 共享协议层 | 统一消息、请求、响应、工具和统计类型 |
@codepapr/common | 公共基础设施 | 日志、哈希与通用工具 |
@codepapr/core | 运行时核心 | Agent、Session、ToolRegistry、缓存分区、ProjectGraph、Prompt 组装 |
@codepapr/api | Provider 适配层 | RequestBuilder、CacheValidator、provider 实现 |
@codepapr/editor | 编辑器契约 | 框架无关的 Monaco 类型、标记、导航与静态检查契约 |
@codepapr/ui | 桌面工作台 | React、Zustand、Tauri、WorkerBackedAgent;Tauri 命令作为瘦 JSON-RPC 客户端,主 SQLite 由 codepapr-core::db 在宿主进程中持有 |
Tauri 桌面端不是单体后端:src-tauri 保留 GUI 专属能力与薄 RPC 代理;文件系统、Git、Shell、LSP、数据库、MCP、Web 等领域实现位于 codepapr-core,统一由 codepapr-server 通过 JSON-RPC 提供。
src-tauri/src/commands.rs:Tauri 命令,将 UI 请求代理给 host.rssrc-tauri/src/host.rs:启动/连接 codepapr-server、发送 JSON-RPC、把通知转发到 Tauri 事件总线crates/codepapr-server:RPC 路由、参数校验、事件广播与任务队列crates/codepapr-core:workspace_fs、git_operations、shell、lsp、db、mcp_host、web 等领域子系统桌面端不直接调用 core Agent,而是通过 WorkerBackedAgent 将 LLM 聊天循环卸载到 Web Worker 中,确保长任务不阻塞 UI。
WorkerCrashError,自动清空当前 agent 实例(下次发送会创建新 Worker),并在错误消息前追加"Agent Worker 崩溃。"前缀STREAM_SNAPSHOT_INTERVAL_MS)触发一次 onStreamSnapshot,把 in-flight 内容持久化到项目 SQLite| 层 | 技术 |
|---|---|
| 前端 UI | React 18、TypeScript、Zustand 5、Monaco Editor、Tailwind CSS 3、Vite 8 |
| 桌面框架 | Tauri 2(Rust) |
| Rust 宿主 / 客户端 | codepapr-server + codepapr-core(JSON-RPC、SQLite、tree-sitter、LSP 等领域能力);Tauri 瘦客户端持有 GUI 专属能力 |
| Agent 卸载 | Web Workers |
| 测试 | Vitest 4、Playwright(UI E2E) |
发给模型的不是一锅炖。完整分层与记忆流程见 上下文分层。越靠前越稳,前缀缓存越好用:
| 装什么 | 何时变 | 缓存 | |
|---|---|---|---|
| 01 系统核心 | 系统提示、工具、参数、AGENTS.md | 会话内冻结 | 命中 |
| 02 会话引导 | Skills 目录、项目记忆段、长期指导 | MEMORY.md 保存后下一回合换 | 通常命中 |
| 03 会话状态 | 检查点 + 保留的近期对话 | 压缩时重写 | epoch 内命中 |
| 04 本轮对话 | 当前用户消息 + 工具结果 | 只追加 | 尾部增量 |
前缀缓存按字节前缀逐字匹配自动命中(无显式断点)。架构的第一性原则是:epoch 内前缀字节稳定(只追加),epoch 之间通过压缩有意重置。
工具循环内上下文会随 tool 结果增长。Agent.chat 在每轮构建请求之前估算上下文大小,超过有效阈值时压缩(重置日志开启新 epoch)后继续:
旧版按保护窗口裁剪工具结果的 prune 层随 v4 移除:工具结果本来就只存在于最近 ≤5 个逐字回合内,更早的已被骨架整体折叠——独立剪枝不再有意义。单条巨型输出由入口护栏约束(工具输出截断与大结果 artifact 外置,模型可用 history_read_artifact 回读),触发器始终只有「窗口 90%」一条线。
maxContextTokens 声明模型输入窗口,默认 200K,对 DeepSeek / OpenAI 兼容 / Claude 统一生效(不按 provider 钳制;兼容端点常是转发大上下文模型的网关)。压缩触发线 = 窗口 × 90%(常量 COMPACT_TRIGGER_RATIO),主会话、mid-loop、Goal、task 子代理全部同源;实测用量(provider usage)与估算取大者参与判定,超限请求仍可走紧急压缩兜底。窗口设得越高 → 压缩越少 → 命中率越高(缓存读取廉价)。
sortedStringify(与实时路径一致);空助手内容为 ''reasoning_content 按"是否存在 + 模型能力"回传,与每请求 thinking 开关解耦已知限制:LLM 前缀缓存有存活时间,长时间空闲后首次调用会重新 miss 整段前缀(与客户端无关);压缩是有损的,阈值越高单次压缩覆盖的历史越多。
桌面端 LSP 采用Tauri 原生宿主 + stdio JSON-RPC 的结构,通过 src-tauri/src/lsp.rs 管理 language server 子进程、stdin 写入、stdout reader 线程和消息队列。
| 语言 | 主 LSP Server | 类型 | 内置 |
|---|---|---|---|
| TypeScript / JS / TSX / JSX | typescript-language-server | Node.js npm | 是 |
| HTML | vscode-html-language-server | Node.js npm | 是 |
| CSS / SCSS / LESS | vscode-css-language-server | Node.js npm | 是 |
| JSON / JSONC | vscode-json-language-server | Node.js npm | 是 |
| YAML | yaml-language-server | Node.js npm | 是 |
| Python | pyright | Node.js npm | 是 |
| ShellScript | bash-language-server | Node.js npm | 是 |
| C# | csharp-ls / CodePapr.CSharp.Analyzer / omnisharp | .NET binary | 是 |
| Rust | rust-analyzer | Native binary | 是 |
| Java | Eclipse JDTLS + Temurin JRE 21 | Java binary | 是 |
| C / C++ | clangd v22.1.6 | Native binary | 是 |
| Go | gopls | Native binary | 是(尽力) |
| Swift | sourcekit-lsp(macOS Xcode toolchain) | 系统 | 否 |
| SQL | sqls | Native binary | 是 |
| Markdown | marksman | Native binary | 是 |
C# 的 LSP 有多层回退机制:
~/.dotnet/tools 中的 csharp-lscsharp-ls 二进制(generated/lsp-tools/csharp-ls/bin/)CodePapr.CSharp.Analyzer(自定义 Roslyn sidecar,支持跨文件和跨 ProjectReference 解析)dotnet run --project CodePapr.CSharp.Analyzer.csproj(开发态 / 源码 fallback)omnisharp -lsp 或 OmniSharp -lsp(仅静态候选)桌面端会在运行时按需托管安装缺失的 LSP:
dotnet tool install -g csharp-ls 安装,或使用内置 Roslyn sidecarCODEPAPR_DISABLE_MANAGED_LSP_DOWNLOAD=1 禁用自动托管下载内建 tree-sitter 语法树解析,用于 ProjectGraph 和 fallback 符号提取:TypeScript、JavaScript、Python、Rust、Java、Go、C++、Bash、C#、CSS、HTML、JSON、PHP、Ruby、Kotlin、Swift。
| 命令 | 范围 | 适合场景 |
|---|---|---|
npm run build | 全 workspace 构建 | 改完源码后确认产物可生成 |
npm run test | 全 workspace 测试 | 日常主回归 |
npm run test:e2e:ui | Playwright UI E2E | 改到桌面端 UI 组件、Toast、权限、Code Review |
npm run test:e2e:ui:install | 安装 Playwright Chromium | 首次运行 UI E2E 前准备 |
npm run lint | 静态检查 | 提交前质量门禁 |
npm run audit | 安全审计 | 发布前或依赖变更后 |
npm run smoke:agent-tools | 真实模型工具烟测 | 改到工具选择、shell、浏览器交互 |
npm run smoke:lsp-preview | 多语言 LSP 烟测 | 改到 LSP hover、definition |
npm run verify | 最完整验证 | 本地发布前(含 cargo check) |
npm run build
npm run test
npm run test:e2e
npm run test:e2e:ui
npm run verify
首次运行 UI E2E 前需要安装浏览器依赖:
npm run test:e2e:ui:install
# 开发调试
npm run debug
# 优化后的桌面运行版本(不打包)
npm run release
# 生成安装包(.dmg / .msi)并整理到 Release/
npm run publish
./publish-codepapr.commandpublish-codepapr.cmdnpm run release:prep
npm run publish:dry-run
适合第一次接手仓库或需求还不够清晰时:
适合你已经知道目标,只是不想手动查和改:
修复 packages/@codepapr/api 里缓存统计不正确的问题。
先定位统计汇总逻辑,再做最小修改,最后跑相关测试。
适合 UI 调整、页面行为验证和预览联动:
适合脚本、REPL、交互式 CLI 或多步 shell 流程:
| 模型 | 上下文 | 最大输出 | 缓存命中输入 | 缓存未命中输入 | 输出 | 并发 |
|---|---|---|---|---|---|---|
deepseek-flash | 1M | 384K | 0.02 元/M tokens | 1 元/M tokens | 2 元/M tokens | 2500 |
deepseek-v4-pro | 1M | 384K | 0.025 元/M tokens | 3 元/M tokens | 6 元/M tokens | 500 |
deepseek-v4-pro——用于 Ask、Plan、Agent、App 主执行流程;App 模式始终使用主模型以确保生成质量deepseek-flash——用于上下文压缩、子任务规划、只读轻型子代理max(最强推理),可在 LLM 设置 tab 中切换为 high先检查桌面端设置是否已保存,以及是否设置了对应环境变量(DEEPSEEK_API_KEY / OPENAI_API_KEY / ANTHROPIC_API_KEY)。
确认是否执行过 npm install 和 npm run build,以及当前仓库是否位于 OneDrive 路径下导致 .bin shim 异常。
优先当成依赖未安装或本地包未构建,而不是先怀疑云同步或磁盘问题。
通常是因为本机没有可检测到的 Chrome 或 Chromium 兼容浏览器。
这个仓库里不少包会通过各自的 dist 入口参与测试或引用。改了源文件后,如果结果看起来没变,先重新 build 受影响包,再跑验证。
重要:改源码 → 先 build → 再跑受影响测试 → 再跑更大范围验证。当结果看起来像"没生效"时,先怀疑 build 没补,而不是先怀疑运行时异常。
在设置中可以接入本地模型 provider(OpenAI 兼容端点),用于离线或私有部署场景。在支持的模型下,可直接向聊天框粘贴或拖入图片作为输入。
这是桌面端的外部路径权限机制。当 Agent 尝试读取或列出项目外的绝对路径时,会请求你显式授权,保证不会未经允许访问系统文件。
先确认是否已安装 Playwright 浏览器依赖:
npm run test:e2e:ui:install
UI E2E 使用 Chromium 在无 Tauri webview 的 mock 环境下运行,不需要真实模型配置。
新手:先用 Ask 理解系统 → 再用 Plan 看清楚改动范围 → 最后用 Agent 做真正执行。需要数据可视化时切到 App 模式,一句话生成交互式图表。
老手:直接在 Agent 模式里给明确目标 → 明确影响文件和验证要求 → 用桌面端完成对话、Git、预览和浏览器联动。
CodePapr v0.1.0 · 本教程基于项目源码及文档编写 · 内容持续更新中