JPCode 使用文档

基于自研 JPEngine 渲染库的桌面 AI 编程助手(Windows / macOS):纯 C++20 实现、无第三方界面库。

闭源商业软件 · 支持代理接入 · 可直接使用侏罗纪 AI 编程套餐

1. 安装与运行

1.1 安装包安装(Windows)

从发布目录获取 jpcode_setup.exe(单文件,已内嵌 JPCode 及全部运行库),双击运行安装向导: 欢迎页 → 安装位置 → 进度页 → 完成页,安装后桌面出现 JPCode 快捷方式,可从「应用和功能」正常卸载。

安装包单文件自包含:jpengine.dll、http_client.dll、jpssl_cpu.dll、zlib/brotli 等运行库全部内嵌,分发只需一个 exe。

1.2 macOS 安装

获取 macOS 安装包并拖入「应用程序」,首次打开若提示开发者验证, 在「系统设置 → 隐私与安全性」中允许即可。渲染默认 Metal。

JPCode 为闭源商业软件:单文件安装包自包含全部运行库,无需额外环境; 接入方式支持「侏罗纪 AI 编程套餐」订阅,或自带 Key 并配置代理(HTTP / SOCKS4 / SOCKS5)。

1.4 渲染后端

默认按 DX12 → Vulkan → DX11 → null 依次尝试;可用 JP_BACKEND 环境变量或 --backend 参数指定。

2. 快速开始

  1. 启动 JPCode → 左侧「设置」→ AI 页选择服务商,填写 API Key(可留空使用环境变量)。
  2. 底部工具条选择模型与思考模式(关闭 / 低 / 中 / 高)。
  3. 在底部输入框输入问题,回车或点「发送」。

API Key 可通过服务商对应的环境变量提供(优先级高于界面配置): OPENAI_API_KEY、DEEPSEEK_API_KEY、ZHIPU_API_KEY、MOONSHOT_API_KEY、 DASHSCOPE_API_KEY、ARK_API_KEY、TOKENHUB_API_KEY 等。

3. 界面说明

4. AI 对话

4.1 服务商预设

服务商默认模型API 形态
OpenAIgpt-4.1-miniResponses / Chat
DeepSeekdeepseek-v4-proResponses
GLM 智谱glm-4.6Chat
Kimi 月之暗面moonshot-v1-8kChat
MiniMaxMiniMax-Text-01Chat
千问AI(DashScope)qwen3.7-plusResponses
OpenCode Zen / Goopencode/claude-opus-4-6 等Chat
中国电信 TokenHubGLM-5-ProChat
火山方舟 Coding Planark-code-latestChat
火山方舟 Agent Planauto(智能路由)Chat

注:火山方舟(Coding Plan / Agent Plan)默认走 Chat Completions API。

切换预设时自动填充 base_url 与常用模型;自定义供应商支持填写名称、Base URL、Key、模型与 API 形态。 代理支持 http://、socks4://、socks5://(含认证),作用于所有 AI 请求(含 SSE 流式)。

4.2 上下文检测与自动续接

按会话估算上下文 token 并用 API 实际 usage 校准,超限标黄;发送前检测超限自动开新会话无缝承接(默认上限 128000,可在设置页调整)。

4.3 技能(skill)

技能是指令注入,可按会话独立开关。内置:代码审查、测试编写、文档撰写、通俗解释、安全检查、规划并行(默认开启)。 自定义 / 第三方技能放入 %USERPROFILE%\.jpcode\skills\(*.md / *.txt)即自动加载。详见 14. 自定义技能开发。

5. 命令执行

5.1 本机执行

!git status
!Get-ChildItem | Select-Object -First 5

以 ! 开头回车即执行本机 PowerShell(macOS 为 zsh),stdout/stderr 实时回流; 执行前后自动 diff 工作目录快照,追加文件变更统计(+N ~M -K)。

5.2 SSH 远程执行

!ssh uname -a    # 远程执行(空参数 = 连通性测试)

支持设置页配置主机或直接使用 ~/.ssh/config 的 Host 别名;支持 Linux / macOS / Windows 目标机,自动适配语法,可设远程工作目录。

安全建议(重要):远程 SSH 操作请尽量使用密钥登录—— 在 ~/.ssh/config 为主机配置别名与私钥,会话里只写「!ssh 主机别名 命令」即可连接:
# ~/.ssh/config
Host test
  HostName 192.168.10.8
  User jp
  IdentityFile ~/.ssh/id_ed25519
请避免把服务器 IP、用户名、密码直接写进命令或聊天内容(例如 ssh user@1.2.3.4、sshpass -p 密码), 这些凭据会随对话上下文暴露给大模型;改用 Host 别名 + 密钥登录后, 模型只能看到「test」这样的别名与命令本身,敏感信息不会进入上下文。

5.3 控制指令

指令作用
!cd 路径设置本地工作目录
!ssh 命令SSH 远程执行
!sshcd 目录设置当前会话的 SSH 远程工作目录
!open 路径用默认编辑器打开目录 / 文件

设置页可配置命令确认策略(全部允许 / 执行时询问)与常用命令库一键执行。

6. 多会话与 subagent

多会话并行:每个会话独立持有 AI 客户端与命令执行器,切换 / 新建不打断其它会话。

/agent 审查当前项目的 CMake 配置
/subagent 总结最近的 git 改动

派生子代理会话(继承最近 12 条上下文)→ 后台并行运行 → 完成后结果自动写回父会话,侧边栏紫色标题显示。

7. 任务队列

输入框「入队」编排多条任务,按顺序依次发送;每条可编辑 / 删除。 「SubAgent」把全部队列任务各派一个子代理并行执行;「GitPush」执行 add → commit → push。

8. Git 审查面板

9. 工具集

工具说明
tools/jpeditor跨平台命令行文件编辑器,编码 / 换行符自动识别
tools/jpbrowser自研 HTML5 浏览器 + JS 引擎 + WASM(暂不适用 macOS)
tools/jpdocx基于 ISO/IEC 29500 的 Office 工具(docx / xlsx / pptx)
tools/jphtml2mdHTML 转 Markdown
tools/code_scan代码识别(类 / 函数 / 枚举 → KV 缓存)

10. KV 缓存数据库

独立 KV 缓存进程 jpcode_kv_cache.exe,应用经 IPC 访问(Windows 命名管道 / macOS Unix domain socket ~/.jpcode/cache/kv.sock),用于代码识别结果缓存等键值存储。

11. 数据与配置文件

路径内容
%USERPROFILE%\.jpcode\config.json应用配置(服务商、UI 宽度、工作目录、自定义供应商等)
%USERPROFILE%\.jpcode\data\conversations.json会话与消息持久化
%USERPROFILE%\.jpcode\skills\第三方技能目录
工作目录 jpcode_ai.log / jpcode_error.logAI 请求日志 / 渲染失败日志

12. 常见问题(FAQ)

流式回复没有输出?
确认服务商支持 SSE 且 API 形态正确;OpenAI 兼容服务商可在自定义供应商里切换 Responses ↔ Chat。
连接失败 / 超时?
检查代理配置(http:// / socks5://);查看 jpcode_error.log 与 jpcode_ai.log。
API Key 报鉴权错误?
确认 Key 与服务商匹配(尤其千问AI sk-ws- 与 Token Plan sk-sp- 不可混用),或改用对应环境变量。
上下文超限?
会自动开新会话续接;也可在设置页调整上限(默认 128000)。
命令执行没有反应?
检查命令确认策略(「执行时询问」会先弹窗);SSH 执行先用 !ssh(空参数)测试连通性。
渲染异常 / 黑屏?
用 --backend dx11 或 --backend null 排除后端问题;查看 jpcode_error.log。

13. 自定义工具(Custom Tools)

JPCode 支持用户自定义工具。自定义工具是一个命令模板工具:在 config.json 里声明工具名、说明、命令模板与参数,JPCode 会把它作为 OpenAI function calling 的工具随请求声明给模型;模型决定调用时,JPCode 把模型返回的实参替换进命令模板的 {{param}} 占位符,以本地脚本模式执行,并把输出回传给模型。

13.1 配置文件位置

自定义工具保存在用户配置目录下的 config.json(Windows:%USERPROFILE%\.jpcode\config.json;macOS / Linux:~/.jpcode/config.json),对应键为顶层数组 "custom_tools"(与 "ai"、"window" 等字段平级)。也可以在设置页修改后由程序自动写回(原子写入,保留其余字段)。

13.2 配置格式(Schema)

{
  "custom_tools": [
    {
      "name": "get_weather",
      "description": "查询指定城市的当前天气",
      "command": "tools/weather.exe --city {{city}} --unit {{unit}}",
      "params": [
        { "name": "city", "description": "城市名称,如 北京" },
        { "name": "unit", "description": "温度单位:celsius 或 fahrenheit" }
      ]
    }
  ]
}
字段类型必填说明
namestring是工具名(function name),留空的条目会被忽略;需唯一
descriptionstring建议工具功能说明,模型据此决定何时调用
commandstring是命令模板,可含 {{参数名}} 占位符,留空忽略
paramsarray否参数声明列表
params[].namestring是参数名(进入 JSON schema 的 properties,留空忽略)
params[].descriptionstring建议参数说明

13.3 工作原理

  1. 加载:JPCode 启动时读取 custom_tools 并注入 AI 层。
  2. 声明:每次对话请求,每个自定义工具生成为 function calling 声明:参数统一为 string 类型,required 包含全部参数;开启「工具 strict」时按 OpenAI strict 模式生成(strict: true、所有属性 required、additionalProperties: false)。
  3. 调用:模型返回 tool_call 后,按 call.name 查找自定义工具;命中则把 arguments JSON 中与参数名匹配的字符串值替换进模板的 {{参数名}} 占位符,未提供的参数替换为空字符串。
  4. 执行:渲染出的命令走本地脚本执行器(PowerShell / 跨平台 PsRunner),与内置 run_command 相同;支持 SSH 时可在目标机远程执行。输出实时流式回显到会话,并以 role=tool 消息回传给模型继续推理。

13.4 编写示例

无参数工具:

{
  "name": "list_ports",
  "description": "列出本机当前监听的 TCP 端口",
  "command": "netstat -ano | findstr LISTENING",
  "params": []
}

多参数工具:

{
  "name": "git_log",
  "description": "查看某个仓库的最近提交",
  "command": "git -C {{repo}} log --oneline -n {{count}}",
  "params": [
    { "name": "repo",  "description": "仓库本地路径" },
    { "name": "count", "description": "返回条数,如 10" }
  ]
}

模型返回 {"repo": "D:/work/demo", "count": "5"} 时,实际执行 git -C D:/work/demo log --oneline -n 5。

调用脚本 / 可执行文件:

{
  "name": "translate_file",
  "description": "把文本文件内容翻译为英文",
  "command": "python tools/translate.py --file {{file}} --lang {{lang}}",
  "params": [
    { "name": "file", "description": "待翻译文件路径" },
    { "name": "lang", "description": "目标语言,如 en" }
  ]
}

13.5 开发注意事项

验证清单:1) 在 config.json 中加入工具并重启 JPCode;2) 对话中让模型使用该工具(描述写清触发场景);3) 会话中可见「工具名 → 渲染后的命令」提示与实时输出;4) 检查退出码非 0 时模型是否收到错误信息并自行修正。

13.6 自定义工具下载地址(url)

自定义工具支持可选的 url 字段:把工具的脚本 / 可执行文件托管在 HTTP(S) 地址上,JPCode 会在启动时与工具执行前自动下载到本地安装目录,实现「声明即分发」。

{
  "custom_tools": [
    {
      "name": "repo_stat",
      "description": "统计当前仓库代码行数(首次调用自动下载工具脚本)",
      "url": "https://example.com/jptools/repo_stat.py",
      "command": "python {{tool_dir}}/repo_stat.py {{path}}",
      "params": [
        { "name": "path", "description": "仓库路径" }
      ]
    }
  ]
}

新增字段:

字段类型必填说明
urlstring否工具文件下载地址(HTTP/HTTPS,单文件)
{{tool_dir}}模板占位符-在 command 中使用,执行时替换为本地安装目录

安装目录与生命周期:

实现要点:下载经 httpclient 的 HttpClient(HTTP/1.1 ~ HTTP/3,自动 TLS 与重定向),同步等待、超时 60 秒;下载成功先写临时文件再原子替换。命令渲染时支持两种占位符:{{param}}(模型实参)与 {{tool_dir}}(安装目录)。

注意事项:目前仅支持单文件下载,多文件依赖请打进一个自解压脚本或在 command 里自行处理;仅支持 HTTP/HTTPS 明文直链,带鉴权的地址需 URL 自带 token 或改用内网可直连的镜像;下载地址应固定文件名(带版本号的文件名会导致 command 模板里的文件名同步变更),建议结合删除目录来升级版本。

14. 自定义技能开发

JPCode 的技能(Skill)是一段注入给 AI 的指令/规则,用于让模型按特定方式工作(如代码审查、测试编写、文档撰写、视觉操作等)。技能可以多个并存,按会话单独启用,启用后其指令会随请求一起注入给模型。本文说明 JPCode 的技能体系,以及如何添加一个或多个自定义技能。

14.1 技能体系总览

JPCode 的技能分三类,三者会在输入栏「技能」下拉中一起列出:

类型来源存储位置说明
内置技能程序内 kBuiltinSkills代码内code_review、test_writer、docs_writer、explain_simple、security_check、coding、testing、plan_parallel_subagent、vision_control
用户自定义设置面板「技能」标签页或 config.json~/.jpcode/config.json 的 skills 数组填「技能名 + 指令内容」,程序自动保存
第三方技能手动放置的 Markdown 文件~/.jpcode/skills/*.md / *.txt一个文件一个技能,文件头可带 frontmatter(id/name)

三者都会出现在同一个下拉里,并且可以同时启用多个。

14.2 添加多个自定义技能

方式一:手动放置 .md 文件(推荐,便于批量)

在技能目录下每个文件放一个技能,多个技能就是多个文件:

~/.jpcode/skills/
├── 代码审查.md
├── 写文案.md
├── 整理笔记.md
└── 生成周报.md

LoadThirdPartySkills 会扫描该目录下所有顶层 .md / .txt 文件,全部加载(放 N 个就是 N 个技能),并在「技能」下拉中全部列出。

文件格式(推荐带 frontmatter):

---
id: my_code_review
name: 我的代码审查
---
对提交的代码进行逐行审查:先看正确性,再看健壮性与安全,
按严重程度分级(严重 / 一般 / 建议)给出修改建议。
字段说明
id技能唯一标识(frontmatter 中可选;缺省用文件名去扩展名)
name下拉中显示的名字(frontmatter 中可选;缺省用 id)
正文注入给模型的指令,不能全空白(全空白会被忽略)

没有 frontmatter 也可以:直接写正文,id/name 会用文件名(去掉 .md)代替。

方式二:设置面板添加(存到 config.json)

设置面板 →「技能」标签页 → 在底部输入「技能名」和「指令内容」→ 点「添加」。

{
  "skills": [
    {
      "id": "my_skill",
      "name": "我的技能",
      "instruction": "注入给模型的规则,不能为空"
    }
  ]
}
字段类型必填说明
idstring是技能唯一标识
namestring是下拉显示的名字
instructionstring是注入给模型的指令(全空白会被忽略)

14.3 两种方式的区别

手动 .md(第三方)设置面板 / config.json(自定义)
批量管理方便,一文件一技能需逐条在 UI 加或用 JSON 编辑
frontmatter支持(id/name)无,直接在对象里写字段
加载时机启动 + 打开下拉时重扫启动时加载

14.4 加载时机

14.5 技能下拉:显示与启用

三类技能统一列在输入栏「技能」下拉中;勾选即对当前会话启用,可同时启用多个,启用后指令随请求一并注入。第三方技能在下拉打开时重扫目录,新增 / 删除 .md 文件即时生效。

15. JAC-1.1 通信标准 与 Response API

15.1 JAC-1.1 侏罗纪AI通信标准

JAC-1.1(Jurassic AI Communication Standard,侏罗纪AI通信标准)是由 侏罗纪AI标准工作组(JASWG)发布的、运行于 WebSocket 之上的 JAI 实体间 JSON 应用层协议。文档编号 JAC-SPEC-1.1,状态:正式发布(Release), 发布日期 2026-09-05。

项目说明
文档编号 / 版本JAC-SPEC-1.1(正式版,在 1.0 基础上并入文件传输扩展,向下兼容)
传输基础RFC 6455(WebSocket,唯一传输基础)+ RFC 8259(JSON)
会话端点wss://<authority>/jac/v1/session(子协议 jac.v1)
核心特性一连接一会话、上下文一次声明、纯流式输出、工具调用兼容 Chat API、思考披露与深度控制、三级 Token 统计、双向文件传输(credit 流控 + SHA-256 + 断点续传)
一致性等级L1 / L2 / L3(L2/L3 含文件传输能力)

1.1 相对 1.0 的增补(全部向下兼容):新增 file.* 控制面消息族与 file.data 二进制数据帧(双向文件传输,§9.5);能力声明 server_caps 新增 "file.transfer";错误码新增 4403~4406;L2/L3 一致性等级纳入文件传输。

完整标准文本:已收录到本仓库 docs/JAC-1.1-jurassic-ai-communication-standard.md (共 17 章:范围与术语 / 核心模型 / 传输层 / 会话建立 / 消息格式 / 消息类型注册表 / 用户消息 / 工具定义与工具调用 / 代码模块与文件传输 / 流式输出与统计 / 心跳超时关闭 / 安全 / 一致性等级 / 附录 A~D)。需要完整条款、消息 JSON Schema、错误码表与会话示例时,请查阅该文档。

15.2 Response API 调用说明

JPCode 的 AI 接入服务提供 OpenAI Responses 兼容的 HTTP API(SSE 流式), 可直接在自定义供应商 / 第三方程序中使用。Base URL:

https://ai.jurassic-period.com/

鉴权:HTTP 头 Authorization: Bearer <你的 API Key>。

① Responses 接口(默认推荐):POST /v1/responses

curl https://ai.jurassic-period.com/v1/responses \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "jurassic-1.1-tyranno",
    "input": "用中文介绍侏罗纪AI通信标准",
    "stream": true
  }'

② 在 JPCode 中配置为自定义供应商

配置项填写值
服务商名称侏罗纪 AI(自定义)
Base URLhttps://ai.jurassic-period.com/
Key你的 API Key
API 形态Responses(本服务暂不支持 Chat API)
模型侏罗纪支持接入的模型名(如 jurassic-1.1-tyranno)

流式响应:两个接口均返回 text/event-stream 的 SSE 数据, 事件类型遵循 OpenAI Responses 惯例(如 response.output_text.delta),末尾以 data: [DONE] 结束。

16. 第三方插件 SDK(第三方插件开发)

本章讲如何用工具包(tool package)形态交付第三方插件:一个包目录 = 清单 jpcode-tool.json + 设置页布局 tools_tab.json + 工具脚本。JPCode 扫描包目录后把工具 导入「设置 → 工具」,并把布局渲染成竖排表单;用户填完点「保存设置页」,值写进包目录下的 settings.json,工具脚本启动时自行读取。协议契约见 sdk/PROTOCOL.md, 设置页细则见 sdk/SETTINGS_PAGE.md。

16.1 SDK 位置与内容(随安装包分发)

SDK 随安装包分发(安装目录 sdk/ 内已包含,无需单独下载),装好 JPCode 后即可在安装目录内找到:

路径内容
sdk/PROTOCOL.md工具包协议契约:目录约定(§5)、工具包与设置页(§6)、插件自有窗口(§9.6)
sdk/SETTINGS_PAGE.md设置页构建说明:控件全表、键规则、校验规则、示例包解读、自检命令(本章与之同源)
sdk/examples/echo-package/示例包(清单 + 布局 + echo.py + 自己的 README),可整体复制到扫描根试用
sdk/tools/check_settings_page.py离线自检脚本(纯标准库,不启动 JPCode)

16.2 第三方插件(工具包)是什么

第三方插件就是一个普通文件夹,满足三点即被 JPCode 识别为工具包:

端到端流程(设置页只负责「收参数」,不参与工具执行):

包目录(jpcode-tool.json + tools_tab.json + 工具脚本)
        │  扫描(设置 → 工具,首次进入自动扫描 / 「重新扫描」)
        ▼
JPCode 校验 → 导入(工具进 config.json、设置页登记进 ~/.jpcode/tool_pages.json)
        │
        ▼
竖排表单渲染(先序拍平,几何字段忽略)→ 用户填写 → 「保存设置页」
        │
        ▼
<包目录>/settings.json(键 tp:<页 id>:<控件 id>)→ 工具脚本读取
布局是数据:不支持表达式、条件显示、控件联动;需要复杂逻辑请在工具脚本里做。

16.3 包目录与清单 jpcode-tool.json

扫描根下的一级子目录各为一个包,清单、布局与脚本放在同一个目录:

my-tool/
├── jpcode-tool.json      # 清单(必需)
├── tools_tab.json        # 设置页布局(可选,惯例文件名)
├── settings.json         # 用户填写的值(「保存设置页」时生成)
└── my_tool.py            # 工具脚本(随包分发)

清单字段:

字段说明
name包名,必须匹配 ^[A-Za-z0-9_-]{1,128}$(不含空格、中文、.、/)
title显示标题;也是设置页标题的兜底来源之一(见 16.5)
settings_id可选,显式指定设置页 id(优先级最高)
settings_page设置页布局:指向包内文件(如 "tools_tab.json"),也可直接写成内联布局对象

未声明 settings_page 时,按 tools_tab.json → settings_page.json → settings.json 顺序探测;三个文件名都没命中只告警(纯命令行工具包可以不提供设置页)。

16.4 设置页布局 tools_tab.json 与控件全表

布局是一份 JPEngine JSON 页面:顶层含 root 对象,或布局自身即根节点(自带 type / children)。 JPCode 把布局先序拍平成竖排表单逐控件呈现,呈现顺序由节点先后决定。

① 公共字段

字段类型说明
typestring控件类型,决定呈现方式(见 ②)
idstring控件 id,建议显式书写;留空时键由 JPCode 按序生成 __node<n>
labelstring输入框上方标签;缺省则不显示标签行
placeholderstring输入框占位提示(无内容时显示;不落盘)
textstringtext / markdown:说明文字;input / inputfield:默认值(无存档时回填);button / checkbox:显示文字
checkedboolcheckbox 初始勾选状态,缺省 false
itemsarraylist / grid 条目:字符串元素直接作为一行;对象元素取其 text 字段;其他类型元素忽略
columnsintgrid 列数,缺省 1(非整数 / 非正数一律按 1 处理)
childrenarray容器子节点,递归处理
rect / flex / padding / spacing / colors …各种几何与样式字段,JPCode 侧一律忽略(不按绝对坐标绘制,固定竖排表单)

② 类型对照表

typeJPCode 呈现是否落盘落盘值
text说明文字(取 text)否—
markdown说明文字(取 text)否—
input标签(label)+ 输入框;默认值取 text,占位取 placeholder是字符串(原样保存)
inputfield与 input 相同是字符串
checkbox复选框;显示文字取 text,初始勾选取 checked是"1"(勾选)/ "0"(未勾选)
button按钮(显示文字取 text)否—
list只读列表(条目取 items);仅插件自有窗口渲染,设置页忽略否—
grid只读网格(条目取 items、列数取 columns,缺省 1);仅插件自有窗口渲染,设置页忽略否—
vbox / hbox / view / layout 等容器不单独呈现,递归展开 children否—
未知类型只递归其 children,并在导入列表给出 [warn]否—

③ 最小骨架模板(存成包内 tools_tab.json,再把清单的 settings_page 指向它)

{
  "root": {
    "id": "my_tool_page",
    "type": "vbox",
    "children": [
      {
        "id": "intro",
        "type": "markdown",
        "text": "填写后点「保存设置页」,值写入本包 settings.json(键 tp:my_tool_page:<控件 id>)。"
      },
      {
        "id": "api_key",
        "type": "input",
        "label": "API Key",
        "placeholder": "粘贴服务端 API Key",
        "text": "demo-key"
      },
      {
        "id": "endpoint",
        "type": "inputfield",
        "label": "服务地址",
        "placeholder": "https://example.com/api"
      },
      {
        "id": "verbose",
        "type": "checkbox",
        "text": "输出详细日志",
        "checked": true
      },
      {
        "id": "hint",
        "type": "text",
        "text": "提示:几何字段(rect / height / padding 等)会被忽略,无需书写。"
      },
      {
        "id": "actions",
        "type": "hbox",
        "children": [
          { "id": "save", "type": "button", "text": "保存" }
        ]
      }
    ]
  }
}

对照上表:intro(markdown)不落盘;api_key / endpoint 落盘键为 tp:my_tool_page:api_key / tp:my_tool_page:endpoint;verbose(checkbox) 落盘 "1" / "0";actions 只是容器,其中 button 仅作视觉呈现。

16.5 页 id、标题与设置键规则

设置页 id(页 id)优先级从高到低:清单 settings_id → 布局根节点 id → <包名>_page(包名即清单 name)。

设置页标题优先级从高到低:根节点 title → 根节点 text → 清单 title → 清单 name。

设置键:所有落盘控件都按下面的键写进 <包目录>/settings.json:

tp:<页 id>:<控件 id>

例如 echo-package(settings_id = echo_tool_page)里输入框 echo_text 的键就是 tp:echo_tool_page:echo_text。settings.json 是一层扁平对象,只含 tp: 前缀的字符串键值 (JPCode 保存时会保留包内其它既有键):

{
  "tp:echo_tool_page:echo_text": "hello",
  "tp:echo_tool_page:echo_prefix": ">> ",
  "tp:echo_tool_page:echo_strict": "1"
}
请显式写控件 id:留空时键会退化成 __node<n> (n 由 JPCode 按布局顺序生成)——布局一改动(增删节点)键就会漂移,旧值再也读不回来。

16.6 校验规则与扫描根

导入时(以及点「重新扫描」时)逐包校验,全部通过才在列表里可用:

项规则
布局大小布局文本 ≤ 256KB;超限则该包被跳过,并在设置页列表显示原因
JSON必须是合法 JSON,且顶层是对象(不允许注释 / 尾随逗号)
根节点顶层含 root 对象;或布局自身即根节点(自带 type / children)
文件存在清单 settings_page 指定了文件时该文件必须存在(不存在 = 该包报错)
包名^[A-Za-z0-9_-]{1,128}$(清单 name)
无设置页清单未声明 settings_page、探测也没命中:只告警(仍只导入工具)

扫描根(存在即扫描;一级子目录各为一个包):

平台扫描根
Windows%USERPROFILE%\.jpcode\tools\、%USERPROFILE%\.jpcode\sdk\、<JPCode.exe 所在目录>\sdk\
macOS / Linux~/.jpcode/tools/、~/.jpcode/sdk/、<JPCode 目录>/sdk/

16.7 本地自检(不启动 JPCode)

用随包分发的 sdk/tools/check_settings_page.py 离线校验(不启动 JPCode):

python sdk/tools/check_settings_page.py <包目录|布局文件> [--page-id X] [--json]

check_settings_page.py 退出码:

退出码含义
0通过
1有 [error](原因在同批输出或 JSON 里)
2用法 / 路径错误

不依赖脚本的最简 JSON 自检(PowerShell):

Get-Content -Raw -Encoding UTF8 sdk/examples/echo-package/tools_tab.json | ConvertFrom-Json

16.8 示例包 echo-package

sdk/examples/echo-package/ 是最小可用示例:清单 + tools_tab.json + echo.py + 自己的 README。 把整个目录复制到任一扫描根(如 ~/.jpcode/sdk/)后,进「设置 → 工具」点「重新扫描」即可看到设置页。

布局各节点解读:

节点作用
screen / 根节点的 rect、padding、spacingJPEngine 视图字段,JPCode 设置页忽略(保留只为兼容原生布局渲染)
root.id / root.title页 id 来源(清单另有 settings_id,以清单优先);页标题取 root.title → 「回显工具设置」
root.type = vbox容器:递归展开 children,本身不呈现
echo_title(text)说明文字「回显工具设置」,不落盘
echo_help(markdown)说明文字(多行提示),不落盘
echo_text(input)标签「要回显的文本」+ 输入框,默认值 hello(无存档时回填),键 tp:echo_tool_page:echo_text
echo_prefix(input)标签「输出前缀」+ 输入框,无默认值,键 tp:echo_tool_page:echo_prefix(echo.py 读它当输出前缀)
echo_strict(checkbox)复选框(初始勾选),键 tp:echo_tool_page:echo_strict,落盘 "1" / "0"(echo.py 依据它决定是否加前缀)
echo_actions(hbox)容器,仅递归 children
echo_save / echo_reset(button)按钮:仅视觉呈现,不触发 echo.py

保存后包内 settings.json 示例:

{
  "tp:echo_tool_page:echo_text": "hello",
  "tp:echo_tool_page:echo_prefix": ">> ",
  "tp:echo_tool_page:echo_strict": "1"
}
设置页上的按钮点击不触发第三方脚本:让脚本启动时自己读 settings.json 才是正解。

16.9 常见错误对照表

症状原因修法
列表提示布局 JSON 解析失败 / 该包被跳过布局里有注释、尾随逗号、单引号或未转义换行(JSON 不支持注释)删掉注释与多余逗号,用 16.7 的自检命令复核
列表提示布局超过 256KB把长文塞进 text,或清单里写成巨大的内联布局对象精简文案;改用 settings_page 指向文件;长文本放包内其它文件由脚本读取
清单指定了 settings_page,但提示该文件不存在相对路径写错(子目录、扩展名),或文件没一起打包路径按包目录相对书写并核对文件名
包被跳过:包名非法name 含空格、中文、.、/ 等改成 ^[A-Za-z0-9_-]{1,128}$,如 my-tool
同一页里两个输入框互相覆盖 / 只有一个值两个落盘控件的 id 重复每个落盘控件给唯一 id(同一页内唯一)
重开设置页值丢了,或改了布局后旧值读不回来控件 id 留空 → 键退化成 __node<n>,节点顺序一变键就漂移所有落盘控件显式写 id
点设置页上的按钮,脚本没反应button 仅视觉呈现,不触发第三方脚本用 input / checkbox 的落盘值,脚本启动时自己读 settings.json
另两点容易踩:checkbox 落盘值是字符串 "1" / "0"(没有 true / false,脚本按字符串比较); 写了 rect / x / y / height 完全没效果,是因为几何字段在 JPCode 侧被忽略(竖排表单,顺序由节点先后决定)。

16.10 相关文件与进阶

进阶建议:先把 echo-package 跑通(扫描 → 导入 → 填表 → 保存 → 脚本读 settings.json), 再替换成自己的 tools_tab.json 与脚本;每次改布局都用 16.7 的自检命令复核,避免导入阶段才发现问题。