fix(mcp-inject): liangjing.json 改为合并写入,重注入可回填缺失的 group_id
All checks were successful
Push & PR Check / check (push) Successful in 1m18s

旧版注入的项目 liangjing.json 缺 group_id,外部 agent 每个会话都要
先调 list_all_projects 反查归属组(多一次探路调用 + 权限弹框)。
group_id 写入已在 2116e54 补上,本次将整文件覆盖改为读取-合并-写回:
只更新 project_id / group_id / mcp_port 三个字段,保留文件已有其他字段。
存量修复路径:对旧项目重新执行 inject_mcp 即可回填。
文档同步说明:移入新产品组时自动刷新;group_id 缺失/过期时重新注入。
This commit is contained in:
lanrtop 2026-07-06 18:43:44 +09:00
parent 84ed61ac97
commit bce9a0a37c
3 changed files with 21 additions and 8 deletions

View File

@ -77,7 +77,10 @@ PR 别攒太大(建议每 3~5 个 commit 或几百行内就开一次),否
## PR 创建(炼境托管项目)
本项目由炼境管理MCP 已注入且 `.claude/liangjing.json``project_id`
本项目由炼境管理MCP 已注入且 `.claude/liangjing.json``project_id``group_id`
`group_id` 用于定位本项目对应的 MCP 服务器 `lian-jing-{group_id}`)。
注意:该文件在注入时生成快照——项目移入新产品组时炼境会自动刷新;若发现 `group_id`
缺失或过期,在炼境重新执行「注入 MCP」或调 MCP 工具 `inject_mcp`)即可回填。
**推送分支后,通过炼境 MCP 创建 PR禁止用 curl + git credential fill 提取 token**

View File

@ -77,7 +77,10 @@ PR 别攒太大(建议每 3~5 个 commit 或几百行内就开一次),否
## PR 创建(炼境托管项目)
本项目由炼境管理MCP 已注入且 `.claude/liangjing.json` 含 `project_id`。
本项目由炼境管理MCP 已注入且 `.claude/liangjing.json` 含 `project_id` 和 `group_id`
`group_id` 用于定位本项目对应的 MCP 服务器 `lian-jing-{group_id}`)。
注意:该文件在注入时生成快照——项目移入新产品组时炼境会自动刷新;若发现 `group_id`
缺失或过期,在炼境重新执行「注入 MCP」或调 MCP 工具 `inject_mcp`)即可回填。
**推送分支后,通过炼境 MCP 创建 PR禁止用 curl + git credential fill 提取 token**

View File

@ -47,18 +47,25 @@ fn liangjing_path(project_id: &str) -> Result<PathBuf, String> {
Ok(project_root(project_id)?.join(".claude").join("liangjing.json"))
}
/// 写炼境上下文文件,供子项目 Claude 会话直接读取 project_id / group_id
/// 写炼境上下文文件,供子项目 Claude 会话直接读取 project_id / group_id。
/// 合并写入:保留文件中已有的其他字段,只更新炼境管理的三个字段(重注入可回填缺失的 group_id
fn write_liangjing_context(project_id: &str, group_id: &str, port: u16) -> Result<(), String> {
let path = liangjing_path(project_id)?;
if let Some(parent) = path.parent() {
std::fs::create_dir_all(parent)
.map_err(|e| format!("创建 .claude 目录失败: {}", e))?;
}
let ctx = json!({
"project_id": project_id,
"group_id": group_id,
"mcp_port": port
});
let mut ctx = match std::fs::read_to_string(&path) {
Ok(s) => serde_json::from_str::<Value>(&s)
.ok()
.filter(|v| v.is_object())
.unwrap_or_else(|| json!({})),
Err(_) => json!({}),
};
let obj = ctx.as_object_mut().expect("ctx 必为 JSON 对象");
obj.insert("project_id".into(), json!(project_id));
obj.insert("group_id".into(), json!(group_id));
obj.insert("mcp_port".into(), json!(port));
let content = serde_json::to_string_pretty(&ctx).map_err(|e| e.to_string())?;
std::fs::write(&path, content)
.map_err(|e| format!("写入 liangjing.json 失败: {}", e))