feat: add bundle install and uninstall scripts

This commit is contained in:
叶林立
2026-08-18 20:34:03 +08:00
parent 78ce5bfb0c
commit a690d147d1
6 changed files with 218 additions and 6 deletions
+5
View File
@@ -0,0 +1,5 @@
# CodeGraph data files — local to each machine, not for committing.
# Ignore everything in .codegraph/ except this file itself, so transient
# files (the database, daemon.pid, sockets, logs) never show up in git.
*
!.gitignore
+13 -4
View File
@@ -1,6 +1,6 @@
# 仓库说明
本仓库用于维护可通过一次 `pi install` 部署的个人 Pi 扩展组合包。根 `package.json` 是唯一安装入口;依赖、默认行为和必要配置必须由组合包自身声明或部署,不把安装后的手工配置作为默认流程。每个自维护扩展使用独立的顶层目录,扩展源码、测试和说明应保留在各自目录内。
本仓库用于维护可通过一次 `pi install` 部署的个人 Pi 扩展组合包。根 `package.json` 是唯一的组合包安装入口;`install.sh``uninstall.sh` 只是对 `pi install` / `pi remove` 的便捷包装,不形成第二套部署机制。依赖、默认行为和必要配置必须由组合包自身声明或部署,不把安装后的手工配置作为默认流程。每个自维护扩展使用独立的顶层目录,扩展源码、测试和说明应保留在各自目录内。
## 当前扩展
@@ -19,6 +19,8 @@
- `@ogulcancelik/pi-auto-permissions@0.1.3`:根据当前对话复核配置命中的 Bash 命令,不是全工具审批层。
- `@ogulcancelik/pi-codex-compaction@0.1.3`:为 `openai-codex` 提供原生远程 compaction,默认阈值为 90%。
- 根包还固定安装 `pi-context-view``@firstpick/pi-extension-codex-fast-mode``@gotgenes/pi-permission-system`
- `install.sh`:先安装根组合包,再交互检查 CodeGraph、Kotlin LSP、Java 21+ 和 JDT LS;缺失依赖只在用户明确选择 `Y` 后安装。
- `uninstall.sh`:只移除根组合包,不卸载可能被其他项目共享的 CodeGraph、Kotlin LSP、JDT LS 或 Java。
## 当前职责与默认行为
@@ -28,7 +30,7 @@
- `readCompaction.enabled``sourceCodeFilteringEnabled``smartTruncate.enabled` 当前均默认 `false`,源码读取保持原样。未经用户明确决定,不因节省上下文而改变这些默认值。
- 若以后开启 read 压缩,优先考虑 `readCompaction + smartTruncate`,源码过滤仍独立评估;必须保留精确 `offset/limit` 读取、短文件和行锚点的完整性。
- Context Mode 负责避免批量读取、命令研究和网页原始内容直接撑大上下文;FFF 仍负责精确字面搜索,RTK 仍处理未走 Context Mode 的普通输出。
- CodeGraph 只配置 Pi 到外部 `codegraph` 命令的 MCP 连接。组合包不安装 CodeGraph不执行 `codegraph init`,不创建或管理 `.codegraph/`,也不改动索引、更新或遥测设置。
- CodeGraph 扩展只配置 Pi 到外部 `codegraph` 命令的 MCP 连接。根包安装本身不安装 CodeGraph;便捷脚本仅在组合包安装完成且用户明确选择 `Y` 后调用官方安装器。仓库不执行 `codegraph init`,不创建或管理 `.codegraph/`,也不改动索引、更新或遥测设置。
- CodeGraph MCP 使用 `keep-alive` 并只直接暴露 `codegraph_explore`;命令缺失、项目未初始化或连接失败时不得阻止其他扩展加载。
- `pi-context-view` 只观察上下文占用,不参与压缩策略。
- Codex fast mode 只为符合条件的 `openai-codex-responses` 请求设置 priority service tier,由 `/fast-mode` 在会话内控制。
@@ -37,8 +39,11 @@
- 两个权限扩展是彼此独立的 `tool_call` gate。若同一 Bash 命令同时命中 Auto Permissions 规则和 `pi-permission-system``ask`,会依次经过两层审批,而不是把旧系统的请求转交给 guardian;配置时不得为同一 Bash 类别重复设置审批。
- 当前只把 Git 非只读操作和包管理类 Bash 命令交给 `pi-auto-permissions` 根据用户上下文复核。低风险操作可自动允许;中风险操作仅在用户明确授权目标与约束时自动允许;高风险操作即使已有概括授权也必须回到用户确认。文件/系统/网络高风险操作继续由现有解析能力更强的 `pi-permission-system` 处理。
- 将 Auto Permissions 规则配置为 `.*` 最多只能复核所有 Bash 命令,不能覆盖其他工具,并会为普通 Bash 调用增加额外模型请求、延迟和成本。若未来目标是让现有所有 `ask` 先经模型裁决,必须另行实现 `pi-permission-system` authorizer 集成,不能仅靠该 npm 包配置实现。
- `pi-lsp` 使用组合包部署的 `kotlin-lsp --stdio``jdtls` 配置,但不安装这两个系统可执行文件。
- `pi-lsp` 使用组合包部署的 `kotlin-lsp --stdio``jdtls` 配置,但根包安装本身不安装这两个系统可执行文件;便捷脚本可在用户逐项明确确认后通过 Homebrew 安装 Kotlin LSP、Java 21 和 JDT LS
- Codex 远程压缩只对 `openai-codex` 生效,默认在 turn boundary 达到 90% 时触发;Hermes Memory 默认使用 policy-only 模式。
- `install.sh` 默认从 `git:git@bitbucket.org:siakitem/my-pi.git` 安装,并允许用 `PI_PACKAGE_SOURCE` 覆盖来源;组合包安装失败时立即停止,机器级依赖安装失败时继续检查其余依赖并最终返回非零状态。
- CodeGraph 的可选安装使用官方远程安装脚本;Kotlin LSP、Java 21 和 JDT LS 的可选安装使用 Homebrew。没有 Homebrew 时保留已经完成的组合包安装并报告依赖安装失败。
- `install.sh` 不检查默认不需要的 `rtk` CLI`uninstall.sh` 使用同一个 `PI_PACKAGE_SOURCE` 规则调用 `pi remove`,且不删除共享机器级工具。
## 修改边界
@@ -49,7 +54,9 @@
- 需要原生构建的依赖只按锁定版本加入根 `allowScripts`;当前仅允许 Hermes Memory 所需的 `better-sqlite3`,不得批量批准其他 install scripts。
- Pi 核心包只作为宿主 peer dependencies,不得在组合包内再安装或打包一套 Pi runtime;保留根 `.npmrc` 的 peer 安装策略。
- 上游仅作为参考来源。同步上游改动时先核对本仓库已有修改,再按明确范围移植;不要直接覆盖本地实现。
- 未经明确要求,不执行发布、提交、推送或安装到用户 Pi 运行目录等外部写操作
- `install.sh``uninstall.sh` 必须保持 POSIX `sh` 兼容和可执行权限,并包含在根 `package.json``files` 中;修改脚本行为时同步更新 README 和本文件
- 机器级依赖安装必须保持逐项询问且默认拒绝,不得在没有用户明确确认的情况下自动安装;卸载不得顺带删除共享机器级工具。
- 未经明确要求,不执行发布、提交、推送、运行安装/卸载脚本或安装到用户 Pi 运行目录等外部写操作。
## `pi-rtk-optimizer` 开发约定
@@ -65,6 +72,8 @@
组合包依赖或加载入口变化时,至少验证根 `npm install` 幂等、锁文件有效,以及全部扩展可在隔离的临时 Pi agent 目录加载。权限配置变化时使用当前固定版本的 `pi-permission-system` schema 校验,并验证包装入口部署后的文件与仓库源配置一致。
安装或卸载脚本变化时,至少运行 `sh -n install.sh``sh -n uninstall.sh` 和 ShellCheck,并核对脚本仍具有可执行权限、仍包含在根 `package.json``files` 中、README 描述与实际流程一致。涉及真实 `pi install``pi remove`、Homebrew 或远程 CodeGraph 安装器的端到端验证属于外部写操作,未经明确要求不得执行。
`pi-rtk-optimizer/` 内按改动范围选择最小充分验证:
- `npm run build`TypeScript 转译检查。
+29 -2
View File
@@ -14,14 +14,41 @@
- `@ogulcancelik/pi-auto-permissions@0.1.3`:按当前对话自动复核受控 Bash 操作。
- `@gotgenes/pi-permission-system@26.2.1`:负责工具、路径、MCP、硬拒绝和兜底权限基线。
## 安装
## 安装与卸载
仓库推送后,通过 Git 源安装整个组合包
推荐从仓库检出目录运行安装脚本
```bash
./install.sh
```
脚本会先执行:
```bash
pi install git:git@bitbucket.org:siakitem/my-pi.git
```
安装组合包成功后,脚本会检查 `codegraph``kotlin-lsp`、Java 21+ 和 `jdtls`。缺失的
依赖会逐项显示 `[y/N]` 选项,仅在用户明确选择 `Y` 后安装。Kotlin、Java 和 JDT LS 的
自动安装使用 Homebrew;如果机器没有 Homebrew,脚本会保留组合包安装结果并给出提示。
`rtk` 只供默认关闭的命令改写使用,因此不会作为必装依赖检查。
也可以绕过脚本,直接运行上面的 `pi install` 命令,此时机器级 CLI 不会被检查。
卸载组合包:
```bash
./uninstall.sh
```
卸载脚本只调用 `pi remove`,不会删除 CodeGraph、Kotlin LSP、JDT LS 或 Java,因为这些
机器级工具可能仍被其他项目使用。两个脚本都可通过 `PI_PACKAGE_SOURCE` 覆盖默认包源,
例如在本地检出中测试:
```bash
PI_PACKAGE_SOURCE="$PWD" ./install.sh
```
`package.json` 使用精确版本,`package-lock.json` 固定完整依赖树。不要再用项目级
`.pi/settings.json` 重复安装这些扩展,否则同一扩展可能被加载两次。
Executable
+155
View File
@@ -0,0 +1,155 @@
#!/bin/sh
set -u
PACKAGE_SOURCE=${PI_PACKAGE_SOURCE:-git:git@bitbucket.org:siakitem/my-pi.git}
CODEGRAPH_INSTALL_URL=https://raw.githubusercontent.com/colbymchenry/codegraph/main/install.sh
install_failed=0
say() {
printf '%s\n' "$*"
}
warn() {
printf '警告: %s\n' "$*" >&2
}
ask_to_install() {
dependency=$1
printf '未检测到 %s。是否现在安装?[y/N] ' "$dependency"
if ! IFS= read -r answer; then
answer=n
fi
case $answer in
y|Y|yes|YES|Yes) return 0 ;;
*) return 1 ;;
esac
}
require_brew() {
if command -v brew >/dev/null 2>&1; then
return 0
fi
warn "自动安装该依赖需要 Homebrew,但当前 PATH 中没有 brew。"
warn "请先安装 Homebrewhttps://brew.sh/),然后重新运行本脚本。"
return 1
}
record_install_failure() {
warn "$1 安装失败;其余依赖仍会继续检查。"
install_failed=1
}
java_major_version() {
java_version=$(java -version 2>&1 | awk -F '"' 'NR == 1 { print $2 }')
case $java_version in
1.*) java_version=${java_version#1.} ;;
esac
java_major=${java_version%%.*}
case $java_major in
''|*[!0-9]*) return 1 ;;
*) printf '%s\n' "$java_major" ;;
esac
}
install_codegraph() {
if ! command -v curl >/dev/null 2>&1; then
warn "安装 CodeGraph 需要 curl。"
return 1
fi
curl -fsSL "$CODEGRAPH_INSTALL_URL" | sh || return 1
# 官方安装器默认使用 ~/.local/bin;让本次检查立即看到新命令。
if [ -d "$HOME/.local/bin" ]; then
PATH="$HOME/.local/bin:$PATH"
export PATH
fi
command -v codegraph >/dev/null 2>&1
}
install_kotlin_lsp() {
require_brew || return 1
brew install JetBrains/utils/kotlin-lsp || return 1
command -v kotlin-lsp >/dev/null 2>&1
}
install_java_21() {
require_brew || return 1
brew install openjdk@21 || return 1
java_home=$(brew --prefix openjdk@21 2>/dev/null) || return 1
PATH="$java_home/bin:$PATH"
export PATH
installed_java_major=$(java_major_version || true)
if [ -z "$installed_java_major" ] || [ "$installed_java_major" -lt 21 ]; then
return 1
fi
say "已在本次安装流程中使用 $java_home/bin。若新终端仍找不到 Java,请把该目录加入 PATH。"
}
install_jdtls() {
require_brew || return 1
brew install jdtls || return 1
command -v jdtls >/dev/null 2>&1
}
if ! command -v pi >/dev/null 2>&1; then
warn "找不到 pi,无法安装组合包。请先安装 Pi 并确保 pi 位于 PATH。"
exit 127
fi
say "正在安装 Pi 组合包:$PACKAGE_SOURCE"
if ! pi install "$PACKAGE_SOURCE"; then
warn "pi install 执行失败,已停止后续依赖检查。"
exit 1
fi
say "Pi 组合包安装完成,开始检查机器级 CLI 依赖。"
if command -v codegraph >/dev/null 2>&1; then
say "✓ codegraph 已安装"
elif ask_to_install "CodeGraph(提供 codegraph_explore"; then
install_codegraph || record_install_failure "CodeGraph"
else
say "- 已跳过 CodeGraphcodegraph_explore 将不可用。"
fi
if command -v kotlin-lsp >/dev/null 2>&1; then
say "✓ kotlin-lsp 已安装"
elif ask_to_install "kotlin-lspKotlin LSP"; then
install_kotlin_lsp || record_install_failure "kotlin-lsp"
else
say "- 已跳过 kotlin-lspKotlin LSP 功能将不可用。"
fi
java_ok=0
if command -v java >/dev/null 2>&1; then
java_major=$(java_major_version || true)
if [ -n "$java_major" ] && [ "$java_major" -ge 21 ]; then
java_ok=1
say "✓ Java $java_major 已安装(满足 Java 21+"
fi
fi
if [ "$java_ok" -eq 0 ]; then
if ask_to_install "Java 21+JDT LS 运行时)"; then
if install_java_21; then
java_ok=1
else
record_install_failure "Java 21+"
fi
else
say "- 已跳过 Java 21+JDT LS 可能无法启动。"
fi
fi
if command -v jdtls >/dev/null 2>&1; then
say "✓ jdtls 已安装"
elif ask_to_install "jdtlsJava LSP"; then
install_jdtls || record_install_failure "jdtls"
else
say "- 已跳过 jdtlsJava LSP 功能将不可用。"
fi
say "依赖检查完成。RTK 命令改写默认关闭,因此未检查可选的 rtk CLI。"
exit "$install_failed"
+2
View File
@@ -12,6 +12,8 @@
"extensions",
"pi-rtk-optimizer",
"config",
"install.sh",
"uninstall.sh",
"README.md",
"AGENTS.md"
],
Executable
+14
View File
@@ -0,0 +1,14 @@
#!/bin/sh
set -u
PACKAGE_SOURCE=${PI_PACKAGE_SOURCE:-git:git@bitbucket.org:siakitem/my-pi.git}
if ! command -v pi >/dev/null 2>&1; then
printf '错误: 找不到 pi,无法卸载组合包。请确保 pi 位于 PATH。\n' >&2
exit 127
fi
printf '正在从 Pi 中移除组合包:%s\n' "$PACKAGE_SOURCE"
pi remove "$PACKAGE_SOURCE"
printf '%s\n' '组合包已移除。CodeGraph、Kotlin LSP、JDT LS 和 Java 均未卸载,因为它们可能仍被其他项目使用。'