Skip to content

让 Pi 新建任务直接使用项目技能 - #2482

Draft
nanaco666 wants to merge 20 commits into
makecindy:mainfrom
xindong:fix/issue-2465-pi-skills-admission
Draft

让 Pi 新建任务直接使用项目技能#2482
nanaco666 wants to merge 20 commits into
makecindy:mainfrom
xindong:fix/issue-2465-pi-skills-admission

Conversation

@nanaco666

@nanaco666 nanaco666 commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

当前状态

修复代码已推送到本 Draft PR,当前 head 为 ea210f6f。本 PR 尚未合并,用户当前安装的版本尚未获得此修复;仍需等待 CI、评审以及前置 #2295 的处理。

Refs #1991
Fixes #2403
Refs #2465
Depends on #2295

这次改了什么

摘要

修复 Electron 新建本地 Pi 项目任务时,项目 Skill 虽然能被发现、却无法在首条消息中真正执行的问题。

本 PR 保留 #2295 的 skills-only 安全装配:不启用 Pi --approve,不读取项目 settings,不安装 packages,不执行 extensions。满足 containment 与 runtime provenance 校验的项目 Skill 会自动准入,不再要求用户经过确认窗或修改审批权限。

在此基础上,本轮补齐了用户实际操作链路:

  • 新建本地 Pi 项目任务时,命令面板可直接选择已发现的项目 Skill。
  • 普通项目任务会先启动 Pi runtime、刷新真实 command catalog,确认 Skill 已 loaded 后再把首条消息交给 Pi。
  • 新建 worktree 时,将用户选择绑定到原项目根、Skill 源路径和项目内相对路径;worktree 建成后只接受新目录中同一项目 Skill 的 loaded 证明。
  • 同名全局 Skill、不同相对路径的 Skill、目标分支缺失的 Skill,以及路径身份不一致均不能冒充。
  • 无法确认时 fail closed:不发送普通文本,恢复首条消息草稿并提示用户检查目标分支。
  • 修复 Skill 的输入框表达:选中 demo 后,输入框、排队消息与历史气泡都保持现有 /demo Skill 胶囊,不再显示为普通文本 /skill:demo
  • Pi runtime 所需的 /skill:demo 只在 Main 构造最终 Agent 输入时投影;落库正文、auto-title 和 Ghost 拦截层均保留用户看到的 alias。
  • 排队编辑只能在 alias 不变时保留原有 runtime 映射;改名、伪造或替换实际执行命令均 fail closed。

变更类型

  • fix 缺陷修复

范围

UI 变化

有交互变化但无新视觉组件:命令面板中符合条件的项目 Skill 从不可选变为可选;选中后复用现有 Skill 胶囊,输入框、排队行和历史气泡显示同一个 /name。沿用现有行样式、键盘导航、焦点与 Light/Dark token。

  • 设计依据:docs/design-rules/DESIGN.md §4 Select & Dropdown、§10 双模式状态覆盖、§14.2 Focus Management、§14.3 Keyboard & IME。
  • 未新增审批入口,也未修改权限选择器。

怎么验证的

自动验证

  • NODE_OPTIONS=--no-experimental-webstorage pnpm test:unit:最终 head 全部适用 workspace 通过;runner 383 passed / 1 skipped,Desktop、Mobile、Maker Core 等均通过。
  • pnpm --filter desktop run --if-present typecheck:通过。
  • 本轮定向测试:104 项通过;覆盖命令面板选择、Skill 胶囊坐标、普通项目发送、worktree 重绑定、排队编辑、最终 Agent 输入投影、失败恢复、同名碰撞、POSIX、Windows drive 与 UNC 路径。
  • pnpm check:i18n-glossary:通过。
  • pnpm check:dco:通过,13 个普通提交均 signed-off,6 个 merge commit 按规则豁免。
  • git diff --check origin/main...HEAD:通过。
  • 最终 head 已包含 origin/main@4f274001,无合并冲突。

手工验证

本轮未把“测试代码通过”表述成“已上线”。真实用户体验仍需在 PR 合并并由包含该提交的 Desktop 构建中验收。

未执行的验证

  • 尚未在已发布安装包中验收,因为本 PR 仍未合并。
  • CI 正在基于当前 head 重新运行,最终以 GitHub checks 为准。

风险

风险分类

  • 权限 / 安全 / 用户数据
  • 跨平台差异

影响与回滚

  • 安全边界:只自动准入项目目录型 Skill;canonical repo/workdir、realpath containment、快照稳定性与 runtime provenance 任一不成立即 fail closed。
  • worktree 边界:仅按项目内相对路径接受目标 worktree 中的同一 Skill;不信任原目录快照直接执行。
  • 兼容性:不传 --approve,不扩大工具审批权限,不启用项目 package、extension 或 settings;全局 Skill 行为保持。
  • 回滚方式:回退本 PR,即恢复项目 Skill 在新任务命令面板中不可直接使用的原行为。

提交前检查

  • 已 review 完整最终 diff,无已知 P0/P1
  • 每个非 merge commit 均带 DCO 签名
  • UI 交互变化已注明设计依据
  • 未提交凭证、令牌或授权文件
  • 已补充必要测试与文案
  • 已确认最终 head 本地测试结果

合并状态说明:我们没有 makecindy/cindy 的合并权限,本 PR 保持 Draft,未尝试 merge。

nana added 15 commits August 10, 2026 01:09
Signed-off-by: nana <823073145@qq.com>
Signed-off-by: nana <823073145@qq.com>
Signed-off-by: nana <823073145@qq.com>
Signed-off-by: nana <823073145@qq.com>
Signed-off-by: nana <823073145@qq.com>
Signed-off-by: nana <823073145@qq.com>
Signed-off-by: nana <823073145@qq.com>
Signed-off-by: nana <823073145@qq.com>
Signed-off-by: nana <823073145@qq.com>
Signed-off-by: nana <823073145@qq.com>
Signed-off-by: nana <823073145@qq.com>
Signed-off-by: nana <823073145@qq.com>
Signed-off-by: nana <823073145@qq.com>
@nanaco666
nanaco666 requested a review from a team as a code owner August 12, 2026 01:45
@greptile-apps

greptile-apps Bot commented Aug 12, 2026

Copy link
Copy Markdown

Greptile Summary

本 PR 为 Desktop 本地 Pi runtime 接入 host-owned、skills-only 的项目资源 admission,并在 maker-core 中加入隔离 staging、启动硬门和运行时 provenance 诊断。

  • 每次新建本地 runtime 重新解析 canonical repo/workdir,并双次扫描受 containment 约束的项目 skills
  • 将获准的 skill 完整复制到每会话隔离的 configHome 后再通过 --skill 显式加载
  • 始终传入 --no-approve --no-extensions,保持 settings、packages、项目 extensions 和远程 runtime fail closed
  • 补充身份变化、symlink retarget、并发会话、Windows 路径语义及资源复制竞态测试

Confidence Score: 5/5

未发现需要阻止合并的具体缺陷,本 PR 的项目 skill 接入在身份、containment、复制和启动边界上均保持 fail closed。

获准资源在传给 Pi 前经过重复身份解析、双次发现、完整目录指纹和隔离 staging,异常、远程会话及非 skill 资源均不会进入启动参数。

Important Files Changed

Filename Overview
apps/desktop/src/main/maker-host/pi-project-skill-admission-resolver.ts 新增 Desktop 项目身份解析、containment 扫描、双次稳定性复核及不可变 skills-only admission snapshot。
apps/desktop/src/main/maker-host/index.ts 将 Desktop resolver 注入 Pi agent,保持 admission authority 由 host 持有。
apps/desktop/src/main/maker-host/pi-host.ts 扩展 Pi agent 构造选项并透传项目 trust resolver。
packages/maker-core/src/agents/pi/project-resource-assembly.ts 新增批准校验、完整目录指纹、抗竞态复制、隔离 staging 和运行时 provenance reconciliation。
packages/maker-core/src/agents/pi/project-trust.ts 新增 canonical project identity、approval scope 和 skills eligibility 的纯函数边界。
packages/maker-core/src/agents/pi/index.ts Pi 启动固定关闭隐式 project trust/extensions,仅显式装载 Cindy extensions 和已 staging 的 skills。
packages/maker-core/src/agents/pi/cindy-subagent-source.ts 子代理启动同样固定禁用隐式 approval/extensions,仅回装 Cindy 权限桥。
packages/maker-core/src/types/pi-project-trust.ts 定义 host-owned 项目身份、approval、发现证据及启动决策契约。
packages/maker-core/src/types/pi-runtime-capabilities.ts 扩展运行时能力清单以报告项目资源 admission、加载数量和诊断原因。

Sequence Diagram

sequenceDiagram
  participant Host as Desktop Host
  participant Resolver as Admission Resolver
  participant Assembly as maker-core Assembly
  participant Stage as Session configHome
  participant Pi as Pi Runtime

  Host->>Resolver: resolve identity + scan skills
  Resolver->>Resolver: re-resolve identity + rescan
  alt identity/evidence changed or remote
    Resolver-->>Host: null (fail closed)
  else stable and contained
    Resolver-->>Host: immutable approval snapshot
    Host->>Assembly: validate approval and containment
    Assembly->>Stage: fingerprint and materialize skill trees
    Assembly->>Stage: verify copied contents and publish atomically
    alt any validation or copy failure
      Assembly-->>Host: no launch skill paths
    else staging succeeds
      Host->>Pi: "--no-approve --no-extensions --skill <staged path>"
      Pi-->>Host: get_commands runtime manifest
      Host->>Assembly: reconcile exact temporary/local provenance
    end
  end
Loading

Reviews (1): Last reviewed commit: "fix(pi): auto-admit contained project sk..." | Re-trigger Greptile

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 53dbb91435

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@nanaco666 nanaco666 changed the title fix(pi): 自动接入受 containment 约束的项目 skills 让 Pi 新建任务直接使用项目技能 Aug 12, 2026
nana added 2 commits August 12, 2026 19:58
Signed-off-by: nana <823073145@qq.com>
Signed-off-by: nana <823073145@qq.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0.1.43 版本:项目级技能无法使用,提示「需要信任此项目后可用」

1 participant