From dad70a7647a70e031d0de817e6a9a4c39844d9af Mon Sep 17 00:00:00 2001 From: xingleiwu <13015600+xingleiwu@users.noreply.github.com> Date: Sat, 12 Sep 2026 13:52:32 +0800 Subject: [PATCH 1/2] =?UTF-8?q?feat(pi.workspace-file-guard):=20=E5=B8=82?= =?UTF-8?q?=E5=9C=BA=E5=90=8D=E7=A7=B0=E6=94=B9=E4=B8=BA=E3=80=8C=E9=98=B2?= =?UTF-8?q?C=E7=9B=98=E6=8B=89=E5=B1=8E=E3=80=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 卡片名称和介绍改成直白中文,一眼能看懂:拦住模型往 C 盘、桌面、下载乱写垃圾文件。 --- catalog.json | 36 ++++---- packages/pi.workspace-file-guard-0.2.6.piplug | Bin 0 -> 39364 bytes plugins/pi.workspace-file-guard/README.md | 8 +- plugins/pi.workspace-file-guard/manifest.json | 79 +++++++++++++----- .../skills/workspace-file-guard.md | 4 +- tests/workspace-file-guard-main.test.js | 2 +- 6 files changed, 81 insertions(+), 48 deletions(-) create mode 100644 packages/pi.workspace-file-guard-0.2.6.piplug diff --git a/catalog.json b/catalog.json index 61ba601..d658fb9 100644 --- a/catalog.json +++ b/catalog.json @@ -2,7 +2,7 @@ "schemaVersion": 1, "providerId": "official", "name": "PI-Desktop Official Plugins", - "updatedAt": "2026-09-11T18:47:58Z", + "updatedAt": "2026-09-12T05:51:37Z", "homepage": "https://github.com/vastsa/pi-desktop-plugins", "plugins": [ { @@ -864,20 +864,20 @@ } ] }, - { + { "id": "pi.workspace-file-guard", - "name": "Workspace File Guard", - "description": "Keep test, temp, scratch, log and cache files inside the current workspace or PI scratch. Works on any machine: Windows, macOS, Linux, any drive letter, any username.", + "name": "防C盘拉屎", + "description": "防止模型把测试、日志、缓存、临时文件往 C 盘、桌面、下载里乱写。垃圾只能待在当前项目或 scratch。", "i18n": { "en": { - "name": "Workspace File Guard", - "description": "Keep test, temp, scratch, log and cache files inside the current workspace or PI scratch. Never spill onto the system volume, Desktop, Downloads, Documents or system temp.", - "safetyNotes": "Behavioral confinement only. The plugin reads the local XDG user-dirs configuration to classify paths, injects agent rules, and does not write files or access the network." + "name": "防C盘拉屎", + "description": "防止模型把测试、日志、缓存、临时文件往 C 盘、桌面、下载里乱写。垃圾只能待在当前项目或 scratch。", + "safetyNotes": "这是行为约束,不是磁盘锁。插件只分类路径并注入 Agent 规则,不改 ACL、不联网。" }, "zh-CN": { - "name": "\u5de5\u4f5c\u533a\u6587\u4ef6\u62a4\u680f", - "description": "\u628a\u6d4b\u8bd5\u3001\u4e34\u65f6\u3001\u8349\u7a3f\u3001\u65e5\u5fd7\u3001\u7f13\u5b58\u7b49\u5783\u573e\u6587\u4ef6\u5173\u5728\u5f53\u524d\u5de5\u4f5c\u533a\u6216 PI scratch \u91cc\u3002\u4efb\u610f\u673a\u5668\u3001\u4efb\u610f\u76d8\u7b26\u3001\u4efb\u610f\u7528\u6237\u540d\u90fd\u53ef\u7528\uff0c\u4e0d\u5199\u6b7b C: \u6216\u672c\u673a\u8def\u5f84\u3002", - "safetyNotes": "\u8fd9\u662f\u884c\u4e3a\u7ea6\u675f\uff0c\u4e0d\u662f\u78c1\u76d8\u9501\u3002\u63d2\u4ef6\u4f1a\u8bfb\u53d6\u672c\u673a XDG \u7528\u6237\u76ee\u5f55\u914d\u7f6e\u6765\u5206\u7c7b\u8def\u5f84\uff0c\u6ce8\u5165 Agent \u89c4\u5219\uff0c\u4e0d\u5199\u5165\u6587\u4ef6\u3001\u4e0d\u6539 ACL\u3001\u4e0d\u8054\u7f51\u3002" + "name": "防C盘拉屎", + "description": "防止模型把测试、日志、缓存、临时文件往 C 盘、桌面、下载里乱写。垃圾只能待在当前项目或 scratch。", + "safetyNotes": "这是行为约束,不是磁盘锁。插件只分类路径并注入 Agent 规则,不改 ACL、不联网。" } }, "author": "xingleiwu", @@ -888,17 +888,17 @@ "downloads": 0, "homepage": "https://github.com/vastsa/pi-desktop-plugins/tree/main/plugins/pi.workspace-file-guard", "repository": "https://github.com/vastsa/pi-desktop-plugins", - "readmeMarkdown": "# \u5de5\u4f5c\u533a\u6587\u4ef6\u62a4\u680f\n\n\u628a\u6d4b\u8bd5\u3001\u4e34\u65f6\u3001\u8349\u7a3f\u3001\u65e5\u5fd7\u3001\u7f13\u5b58\u7b49\u5783\u573e\u6587\u4ef6\u5173\u5728\u5f53\u524d\u5de5\u4f5c\u533a\u6216 PI scratch \u91cc\u3002\u8fd9\u662f\u884c\u4e3a\u7ea6\u675f\uff0c\u4e0d\u662f\u78c1\u76d8\u9501\u3002\n\n\u4fbf\u643a\u7684 PI-Desktop skill \u5305\uff1a\u542f\u7528\u4e00\u6b21\u540e\uff0c\u6bcf\u4e2a\u4f1a\u8bdd\u90fd\u4f1a\u6ce8\u5165\u89c4\u5219\u5e76\u6ce8\u518c\u5206\u7c7b\u5de5\u5177\u3002\u8def\u5f84\u6309\u5f53\u524d\u64cd\u4f5c\u7cfb\u7edf\u3001\u7528\u6237\u4e3b\u76ee\u5f55\u3001\u5de5\u4f5c\u533a\u548c\u73af\u5883\u53d8\u91cf\u89e3\u6790\uff0c\u4e0d\u5199\u6b7b `C:`\u3001\u7528\u6237\u540d\u6216\u67d0\u53f0\u673a\u5668\u7684\u76ee\u5f55\u3002\n\n## \u63d0\u4f9b\u4ec0\u4e48\n\n- Skill\uff1a`skills/workspace-file-guard.md`\uff08\u63d2\u4ef6\u542f\u7528\u671f\u95f4\u6ce8\u5165 Agent\uff09\n- \u5de5\u5177\uff1a`project_root` / `check_path` / `temp_env` / `tmp_layout`\n- \u62d2\u7edd\u6e05\u5355\uff1a`references/denied-paths.md`\n- \u5206\u7c7b\u5668\uff1a`guard.js`\n\n## \u6587\u4ef6\u8be5\u5199\u5230\u54ea\n\n| \u7c7b\u578b | \u4f4d\u7f6e |\n| --- | --- |\n| \u7528\u6237\u8981\u6c42\u4fdd\u7559\u7684\u6e90\u7801 | \u5de5\u4f5c\u533a\uff08`src/`\u3001`tests/` \u7b49\uff09 |\n| \u4e00\u6b21\u6027\u8349\u7a3f\u3001\u8f6c\u50a8\u3001\u65e5\u5fd7 | `$PI_SCRATCH_DIR` |\n| \u9879\u76ee\u672c\u5730\u7f13\u5b58 | `$project/.tmp/cache` |\n\n\u7981\u6b62\uff1a\u684c\u9762\u3001\u4e0b\u8f7d\u3001\u6587\u6863\u3001\u7cfb\u7edf\u4e34\u65f6\u76ee\u5f55\uff1b\u9879\u76ee\u5728\u5176\u4ed6\u76d8\u65f6\u7981\u6b62\u5199\u5230\u7cfb\u7edf\u76d8\uff1bProgram Files\u3001`/usr`\u3001`/Applications`\u3002\n\n## \u6743\u9650\n\n| \u6743\u9650 | \u7528\u9014 |\n| --- | --- |\n| `agent.prompt.inject` | \u6ce8\u5165\u62a4\u680f\u89c4\u5219\uff0c\u8ba9 Agent \u9ed8\u8ba4\u628a\u5783\u573e\u6587\u4ef6\u5173\u5728\u5de5\u4f5c\u533a / scratch |\n| `agent.tool.register` | \u6ce8\u518c\u8def\u5f84\u5206\u7c7b\u5de5\u5177\uff0c\u4f9b Agent \u5728\u5199\u6587\u4ef6\u524d\u67e5\u8be2 |\n\n\u4e0d\u7533\u8bf7 `fs.*` \u5bbf\u4e3b\u6587\u4ef6\u7cfb\u7edf\u6743\u9650\u3001\u7f51\u7edc\u3001\u526a\u8d34\u677f\u6216\u540e\u53f0\u670d\u52a1\u6743\u9650\u3002\u4e3a\u8bc6\u522b Linux/XDG \u81ea\u5b9a\u4e49\u7528\u6237\u76ee\u5f55\uff0c\u5206\u7c7b\u5668\u4f1a\u53ea\u8bfb\u672c\u673a `~/.config/user-dirs.dirs`\uff08\u82e5\u5b58\u5728\uff09\uff0c\u4e0d\u4f1a\u4e0a\u4f20\u6216\u8fd4\u56de\u8be5\u6587\u4ef6\u539f\u6587\u3002\u63d2\u4ef6\u672c\u8eab\u4e0d\u5199\u76d8\u3001\u4e0d\u6539 ACL\u3001\u4e0d\u8054\u7f51\uff1b\u771f\u6b63\u843d\u76d8\u7684\u4ecd\u662f Agent \u81ea\u5df1\u7684 Write / Bash\u3002\n\n## \u5b89\u88c5\n\n1. PI-Desktop \u2192 \u6269\u5c55 \u2192 \u5b89\u88c5\u63d2\u4ef6\u5305\uff0c\u9009\u62e9 `packages/pi.workspace-file-guard-0.2.5.piplug`\u3002\n2. \u82e5\u51fa\u73b0\u6743\u9650\u786e\u8ba4\uff0c\u52fe\u9009 `agent.prompt.inject` \u4e0e `agent.tool.register`\uff08\u5f53\u524d\u5bbf\u4e3b\u5bf9\u672c\u5730 `.piplug` \u53ef\u80fd\u6309\u6e05\u5355\u9759\u9ed8\u5168\u6388\uff09\u3002\n3. \u65b0\u5f00\u4e00\u4e2a Agent \u4f1a\u8bdd\uff0cskill \u624d\u4f1a\u6ce8\u5165\u3002\n\n\u4e5f\u53ef\u628a\u672c\u76ee\u5f55\u5f53\u4f5c\u5f00\u53d1\u63d2\u4ef6\u52a0\u8f7d\uff08\u4fdd\u5b58\u540e\u70ed\u91cd\u8f7d\uff09\u3002\u5f00\u53d1\u63d2\u4ef6\u6269\u6743\u540e\u8bf7\u91cd\u65b0\u300c\u52a0\u8f7d\u5f00\u53d1\u63d2\u4ef6\u300d\uff0c\u4e0d\u8981\u53ea\u70b9\u300c\u91cd\u65b0\u52a0\u8f7d\u300d\u3002\n\n## \u5f00\u53d1\u9a8c\u8bc1\n\n```bash\nnode tests/workspace-file-guard-guard.test.js\nnode tests/workspace-file-guard-main.test.js\npython scripts/pack_plugin.py plugins/pi.workspace-file-guard\npython scripts/rebuild_catalog.py\npython scripts/security_audit.py --check-packages\n```\n\n## \u80fd\u529b\u8fb9\u754c\n\n- \u4e0d\u662f\u4e8b\u540e\u6e05\u7406\u78c1\u76d8\u3002\n- \u4e0d\u662f\u8de8\u9879\u76ee\u8bbf\u95ee\u9694\u79bb\u3002\n- \u4e0d\u662f\u64cd\u4f5c\u7cfb\u7edf\u6c99\u7bb1\u3001BitLocker\u3001SIP \u6216\u6587\u4ef6\u5939 ACL\u3002\n- `root` \u8986\u76d6\u53ea\u5728\u7528\u6237\u660e\u786e\u9009\u62e9\u9879\u76ee\u6839\u65f6\u4f7f\u7528\uff1b\u5de5\u5177\u65e0\u6cd5\u9a8c\u8bc1\u8be5\u9009\u62e9\uff0c\u4e0d\u80fd\u628a\u5b83\u5f53\u6210\u5b89\u5168\u8fb9\u754c\u3002\n- `explicit` \u53ea\u662f\u6a21\u578b\u5bf9\u7528\u6237\u610f\u56fe\u7684\u58f0\u660e\uff1b\u684c\u9762\u3001\u4e0b\u8f7d\u3001\u6587\u6863\u548c\u7cfb\u7edf\u4e34\u65f6\u76ee\u5f55\u5373\u4f7f\u6807\u8bb0\u4e5f\u7981\u6b62\u3002\n\n## \u80fd\u529b / \u6570\u636e\u6d41\n\n| \u80fd\u529b | \u6570\u636e | \u65b9\u5411 |\n| --- | --- | --- |\n| `agent.prompt.inject` | \u672c\u63d2\u4ef6 `skills/workspace-file-guard.md` \u89c4\u5219\u6587\u672c | \u6ce8\u5165\u5f53\u524d\u4f1a\u8bdd\u7684\u7cfb\u7edf\u63d0\u793a\uff0c\u4e0d\u8bfb\u804a\u5929\u8bb0\u5f55 |\n| `agent.tool.register` | \u8c03\u7528\u53c2\u6570\u91cc\u7684\u8def\u5f84\u5b57\u7b26\u4e32\uff1b`pi.workspace.get()` \u7684\u5de5\u4f5c\u533a\u8def\u5f84\uff1b`PI_SCRATCH_DIR` / \u4e3b\u76ee\u5f55 / \u5e38\u89c1\u7cfb\u7edf\u76ee\u5f55 | \u53ea\u8fd4\u56de\u5206\u7c7b\u7ed3\u679c\u4e0e\u73af\u5883\u53d8\u91cf\u5efa\u8bae\uff0c\u4e0d\u5199\u76d8 |\n| \u6587\u4ef6\u7cfb\u7edf | \u672c\u673a `~/.config/user-dirs.dirs`\uff08\u82e5\u5b58\u5728\uff09 | \u4ec5\u7528\u4e8e\u8bc6\u522b XDG \u7528\u6237\u76ee\u5f55\uff0c\u4e0d\u4e0a\u4f20\u3001\u4e0d\u8fd4\u56de\u539f\u6587 |\n| \u7f51\u7edc / \u526a\u8d34\u677f / \u540e\u53f0\u670d\u52a1 | \u65e0 | \u4e0d\u7533\u8bf7\u3001\u4e0d\u4f7f\u7528 |\n\n\u5931\u8d25\u8def\u5f84\uff1a\u6ca1\u6709\u6253\u5f00\u5de5\u4f5c\u533a\u4e14\u672a\u4f20 `root` \u65f6\u5de5\u5177\u8fd4\u56de `ok: false`\uff0c\u4e0d\u4f1a\u56de\u9000\u5230\u63d2\u4ef6\u5b89\u88c5\u76ee\u5f55\u6216 cwd\u3002\u684c\u9762\u3001\u4e0b\u8f7d\u3001\u6587\u6863\u3001\u7cfb\u7edf\u4e34\u65f6\u76ee\u5f55\u5373\u4f7f `explicit=true` \u4e5f\u62d2\u7edd\u3002\n", - "safetyNotes": "Behavioral confinement only. The plugin reads the local XDG user-dirs configuration to classify paths, injects agent rules, and does not write files or access the network.", + "readmeMarkdown": "# 防C盘拉屎\n\n防止模型往 C 盘拉屎:测试、日志、缓存、临时文件不许写到系统盘、桌面、下载。垃圾只能待在当前项目或 scratch。\n\n启用一次即可。路径按当前机器解析,不写死盘符或用户名。这是行为约束,不是磁盘锁。\n\n## 提供什么\n\n- Skill:`skills/workspace-file-guard.md`(插件启用期间注入 Agent)\n- 工具:`project_root` / `check_path` / `temp_env` / `tmp_layout`\n- 拒绝清单:`references/denied-paths.md`\n- 分类器:`guard.js`\n\n## 文件该写到哪\n\n| 类型 | 位置 |\n| --- | --- |\n| 用户要求保留的源码 | 工作区(`src/`、`tests/` 等) |\n| 一次性草稿、转储、日志 | `$PI_SCRATCH_DIR` |\n| 项目本地缓存 | `$project/.tmp/cache` |\n\n禁止:桌面、下载、文档、系统临时目录;项目在其他盘时禁止写到系统盘;Program Files、`/usr`、`/Applications`。\n\n## 权限\n\n| 权限 | 用途 |\n| --- | --- |\n| `agent.prompt.inject` | 注入护栏规则,让 Agent 默认把垃圾文件关在工作区 / scratch |\n| `agent.tool.register` | 注册路径分类工具,供 Agent 在写文件前查询 |\n\n不申请 `fs.*` 宿主文件系统权限、网络、剪贴板或后台服务权限。为识别 Linux/XDG 自定义用户目录,分类器会只读本机 `~/.config/user-dirs.dirs`(若存在),不会上传或返回该文件原文。插件本身不写盘、不改 ACL、不联网;真正落盘的仍是 Agent 自己的 Write / Bash。\n\n## 安装\n\n1. PI-Desktop → 扩展 → 安装插件包,选择 `packages/pi.workspace-file-guard-0.2.6.piplug`。\n2. 若出现权限确认,勾选 `agent.prompt.inject` 与 `agent.tool.register`(当前宿主对本地 `.piplug` 可能按清单静默全授)。\n3. 新开一个 Agent 会话,skill 才会注入。\n\n也可把本目录当作开发插件加载(保存后热重载)。开发插件扩权后请重新「加载开发插件」,不要只点「重新加载」。\n\n## 开发验证\n\n```bash\nnode tests/workspace-file-guard-guard.test.js\nnode tests/workspace-file-guard-main.test.js\npython scripts/pack_plugin.py plugins/pi.workspace-file-guard\npython scripts/rebuild_catalog.py\npython scripts/security_audit.py --check-packages\n```\n\n## 能力边界\n\n- 不是事后清理磁盘。\n- 不是跨项目访问隔离。\n- 不是操作系统沙箱、BitLocker、SIP 或文件夹 ACL。\n- `root` 覆盖只在用户明确选择项目根时使用;工具无法验证该选择,不能把它当成安全边界。\n- `explicit` 只是模型对用户意图的声明;桌面、下载、文档和系统临时目录即使标记也禁止。\n\n## 能力 / 数据流\n\n| 能力 | 数据 | 方向 |\n| --- | --- | --- |\n| `agent.prompt.inject` | 本插件 `skills/workspace-file-guard.md` 规则文本 | 注入当前会话的系统提示,不读聊天记录 |\n| `agent.tool.register` | 调用参数里的路径字符串;`pi.workspace.get()` 的工作区路径;`PI_SCRATCH_DIR` / 主目录 / 常见系统目录 | 只返回分类结果与环境变量建议,不写盘 |\n| 文件系统 | 本机 `~/.config/user-dirs.dirs`(若存在) | 仅用于识别 XDG 用户目录,不上传、不返回原文 |\n| 网络 / 剪贴板 / 后台服务 | 无 | 不申请、不使用 |\n\n失败路径:没有打开工作区且未传 `root` 时工具返回 `ok: false`,不会回退到插件安装目录或 cwd。桌面、下载、文档、系统临时目录即使 `explicit=true` 也拒绝。\n", + "safetyNotes": "这是行为约束,不是磁盘锁。插件只分类路径并注入 Agent 规则,不改 ACL、不联网。", "versions": [ { - "version": "0.2.5", - "publishedAt": "2026-09-11T18:47:58Z", - "changelog": "0.2.5: Quote generated bash and PowerShell assignments safely, reject unsafe cmd values, enforce canonical root/scratch and symlink boundaries, include negative-path tests in CI, and sync the package. 0.2.4\uff1a\u8bf4\u660e\u6539\u4e3a\u4e2d\u6587\u30020.2.3\uff1a\u53bb\u6389 git/cwd \u4f5c\u4e3a\u9879\u76ee\u6839\u56de\u9000\uff1bcmd \u73af\u5883\u53d8\u91cf\u62d2\u7edd\u5185\u5d4c\u5f15\u53f7\uff1b\u8986\u76d6\u5de5\u4f5c\u533a API \u5931\u8d25\u4e0e explicit \u4e34\u65f6\u76ee\u5f55\u62d2\u7edd\u30020.2.2\uff1a\u76f8\u5bf9\u8def\u5f84\u76f8\u5bf9\u5de5\u4f5c\u533a\u89e3\u6790\u30020.2.1\uff1aexplicit \u76ee\u6807\u4e0e XDG_DOWNLOAD_DIR\u30020.2.0\uff1a\u8de8\u673a\u5668\u4fbf\u643a\u3002", + "version": "0.2.6", + "publishedAt": "2026-09-12T05:51:37Z", + "changelog": "0.2.6:市场名称改为「防C盘拉屎」,介绍改成直白中文。 0.2.5: Quote generated bash and PowerShell assignments safely, reject unsafe cmd values, enforce canonical root/scratch and symlink boundaries, include negative-path tests in CI, and sync the package. 0.2.4:说明改为中文。0.2.3:去掉 git/cwd 作为项目根回退;cmd 环境变量拒绝内嵌引号;覆盖工作区 API 失败与 explicit 临时目录拒绝。0.2.2:相对路径相对工作区解析。0.2.1:explicit 目标与 XDG_DOWNLOAD_DIR。0.2.0:跨机器便携。", "minPiDesktop": ">=0.2.0", - "shasum": "3404330cda3d8fa51fb1bc8e8eefb97c0b3e589b58c2163901a9985ea0b040de", - "url": "packages/pi.workspace-file-guard-0.2.5.piplug", - "sizeBytes": 38271, + "shasum": "51d6269a3ef40c069da4b52fa8eae79907a3f8586c4f675452bbc94f033b324a", + "url": "packages/pi.workspace-file-guard-0.2.6.piplug", + "sizeBytes": 39364, "permissions": [ "agent.prompt.inject", "agent.tool.register" diff --git a/packages/pi.workspace-file-guard-0.2.6.piplug b/packages/pi.workspace-file-guard-0.2.6.piplug new file mode 100644 index 0000000000000000000000000000000000000000..41b6e4849a8fcc063a8beecdc04687c225e5eabc GIT binary patch literal 39364 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.2.0" }, - "categories": ["productivity"], - "changelog": "0.2.5: Quote generated bash and PowerShell assignments safely, reject unsafe cmd values, enforce canonical root/scratch and symlink boundaries, include negative-path tests in CI, and sync the package. 0.2.4:说明改为中文。0.2.3:去掉 git/cwd 作为项目根回退;cmd 环境变量拒绝内嵌引号;覆盖工作区 API 失败与 explicit 临时目录拒绝。0.2.2:相对路径相对工作区解析。0.2.1:explicit 目标与 XDG_DOWNLOAD_DIR。0.2.0:跨机器便携。", - "safetyNotes": "Behavioral confinement only. The plugin reads the local XDG user-dirs configuration to classify paths, injects agent rules, and does not write files or access the network.", - "activationEvents": ["onStartup"] + "permissions": [ + "agent.prompt.inject", + "agent.tool.register" + ], + "engines": { + "piDesktop": ">=0.2.0" + }, + "categories": [ + "productivity" + ], + "changelog": "0.2.6:市场名称改为「防C盘拉屎」,介绍改成直白中文。 0.2.5: Quote generated bash and PowerShell assignments safely, reject unsafe cmd values, enforce canonical root/scratch and symlink boundaries, include negative-path tests in CI, and sync the package. 0.2.4:说明改为中文。0.2.3:去掉 git/cwd 作为项目根回退;cmd 环境变量拒绝内嵌引号;覆盖工作区 API 失败与 explicit 临时目录拒绝。0.2.2:相对路径相对工作区解析。0.2.1:explicit 目标与 XDG_DOWNLOAD_DIR。0.2.0:跨机器便携。", + "safetyNotes": "这是行为约束,不是磁盘锁。插件只分类路径并注入 Agent 规则,不改 ACL、不联网。", + "activationEvents": [ + "onStartup" + ] } diff --git a/plugins/pi.workspace-file-guard/skills/workspace-file-guard.md b/plugins/pi.workspace-file-guard/skills/workspace-file-guard.md index 17d5b37..1fede3f 100644 --- a/plugins/pi.workspace-file-guard/skills/workspace-file-guard.md +++ b/plugins/pi.workspace-file-guard/skills/workspace-file-guard.md @@ -3,9 +3,9 @@ name: workspace-file-guard description: 把测试文件、临时文件、草稿脚本、日志、转储、缓存和垃圾文件关在当前工作区或 PI scratch。创建文件、跑测试、生成产物、写辅助脚本、使用 TEMP/TMP/TMPDIR、下载缓存,或在 Windows / macOS / Linux 上工作时使用。不要把这些文件写到其他卷、工作区外的系统盘、桌面、下载、文档或系统临时目录。只读检查、用户明确要求的插件/skill 安装、以及用户本轮点名的外部目标不要套用本 skill。 --- -# 工作区文件护栏 +# 防C盘拉屎 -把 Agent 产生的垃圾文件关在当前项目或 PI scratch 里。这是行为约束,不是操作系统锁。 +拦住 Agent 往 C 盘、桌面、下载乱写测试/日志/缓存。垃圾只许待在当前项目或 PI scratch。这是行为约束,不是操作系统锁。 插件工具(宿主前缀 `plugin_pi_workspace_file_guard_`): diff --git a/tests/workspace-file-guard-main.test.js b/tests/workspace-file-guard-main.test.js index 3670b48..5a6d0c0 100644 --- a/tests/workspace-file-guard-main.test.js +++ b/tests/workspace-file-guard-main.test.js @@ -28,7 +28,7 @@ async function run() { const manifest = JSON.parse( fs.readFileSync(path.join(__dirname, "..", "plugins", "pi.workspace-file-guard", "manifest.json"), "utf8") ); - assert(manifest.version === "0.2.5", "manifest version must match the reviewed release"); + assert(manifest.version === "0.2.6", "manifest version must match the reviewed release"); assert( JSON.stringify(manifest.permissions) === JSON.stringify(["agent.prompt.inject", "agent.tool.register"]), "manifest permissions must remain minimal and exact" From 063b33a5bd9c361759fdcd189824e444ea7b4f64 Mon Sep 17 00:00:00 2001 From: xingleiwu <13015600+xingleiwu@users.noreply.github.com> Date: Mon, 14 Sep 2026 03:08:26 +0800 Subject: [PATCH 2/2] =?UTF-8?q?fix(pi.workspace-file-guard):=20=E7=94=A8?= =?UTF-8?q?=20LF=20=E6=BA=90=E7=A0=81=E9=87=8D=E6=96=B0=E6=89=93=E5=8C=85?= =?UTF-8?q?=200.2.6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CI 按字节比对 packages 与 plugins。Windows 打包把 CRLF 打进了 .piplug。 源码与包统一为 LF 后重跑 pack_plugin.py,并同步 catalog sha256/size。 --- catalog.json | 8 ++++---- packages/pi.workspace-file-guard-0.2.6.piplug | Bin 39364 -> 38306 bytes 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/catalog.json b/catalog.json index d658fb9..d99d752 100644 --- a/catalog.json +++ b/catalog.json @@ -2,7 +2,7 @@ "schemaVersion": 1, "providerId": "official", "name": "PI-Desktop Official Plugins", - "updatedAt": "2026-09-12T05:51:37Z", + "updatedAt": "2026-09-13T19:08:18Z", "homepage": "https://github.com/vastsa/pi-desktop-plugins", "plugins": [ { @@ -893,12 +893,12 @@ "versions": [ { "version": "0.2.6", - "publishedAt": "2026-09-12T05:51:37Z", + "publishedAt": "2026-09-13T19:08:18Z", "changelog": "0.2.6:市场名称改为「防C盘拉屎」,介绍改成直白中文。 0.2.5: Quote generated bash and PowerShell assignments safely, reject unsafe cmd values, enforce canonical root/scratch and symlink boundaries, include negative-path tests in CI, and sync the package. 0.2.4:说明改为中文。0.2.3:去掉 git/cwd 作为项目根回退;cmd 环境变量拒绝内嵌引号;覆盖工作区 API 失败与 explicit 临时目录拒绝。0.2.2:相对路径相对工作区解析。0.2.1:explicit 目标与 XDG_DOWNLOAD_DIR。0.2.0:跨机器便携。", "minPiDesktop": ">=0.2.0", - "shasum": "51d6269a3ef40c069da4b52fa8eae79907a3f8586c4f675452bbc94f033b324a", + "shasum": "f9cc6b451805b6edb692358a609ce5a7341ead3ddf2054270643b54c24e8210b", "url": "packages/pi.workspace-file-guard-0.2.6.piplug", - "sizeBytes": 39364, + "sizeBytes": 38306, "permissions": [ "agent.prompt.inject", "agent.tool.register" diff --git a/packages/pi.workspace-file-guard-0.2.6.piplug b/packages/pi.workspace-file-guard-0.2.6.piplug index 41b6e4849a8fcc063a8beecdc04687c225e5eabc..10a3a7c079deb5d8c8936b3ffc9843bac8989db4 100644 GIT binary patch delta 8623 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