makecindy / makecindy/cindy

讨论:飞书渠道支持 /project 项目切换(借鉴已落地的硬切 + 下拉卡方案)

Open
#3,704 2 comments 0 reactions 0 assignees View on GitHub
Dominant language
TypeScript
Stars
2.7k
Forks
395
Avg merge
21h 48m
Merged PRs (30d)
776

Description

## 背景

当前 `/project` 项目切换只有个人 Telegram 开启(`ImChannelAdapter.projectSwitching`,`apps/desktop/src/main/im/telegram/adapter.ts`)。飞书侧没有这个能力:会话工作目录跟 bot 配置或 `/ctr` 接管走。想在飞书里远程切项目干活,只能改 bot 设置或先在桌面端开好任务再接管,链路长。

## 我其他项目已落地的做法(可借鉴)

### 1. opencode-feishu-bot:`/switch_project <路径>` — 硬切语义

`session/manager.ts` 的 `switchProject()` 核心逻辑:

```ts
async switchProject(key, projectPath) {
const oldSession = this.sessions.get(keyStr);
if (oldSession) {
this.sessions.delete(keyStr); // 删旧会话
this.activeTasks.delete(keyStr);
}
await this.createSession(key, projectPath, oldSession?.model); // 新目录开新会话
}
```

**关键裁决:切项目 = 销毁旧会话 + 新目录开新会话,上下文不跨目录带过去。**

这个硬切语义直接绕开了 Cindy `sessionRepo` 里「路径推断归属」的整个难题(`sessionRepo.ts:132` 注释):不需要从目录路径反推「这是对话还是项目」——切过去的行**必然**是项目,因为它是这条命令的显式产物。

### 2. opencode-coordinator:命令 + 飞书原生下拉双入口

- `/switch_project <路径>`:手输路径
- `/menu` 面板里嵌飞书 `select_static` 下拉(`menu.ts`),action = `switch_project_in_chat`,选项来自**预配置项目清单**(不是任意路径浏览)

预配置清单比自由输路径更安全:聊天侧不能把 bot 指向任意文件系统位置,只能选管理员配好的工作区。

## 给 Cindy 飞书的提案(讨论点)

1. **语义采纳硬切**:飞书 `/project` 选中项目后,当前 lane 的会话行直接切目录 + 重开会话(等价 `/new` + 换目录),不做上下文迁移。这与 `sessionRepo` 的归属推断天然兼容——`pathImpliesProject` 对显式切换成立。

2. **入口用卡片下拉而非自由路径**:复用 Telegram 版的 `ui.cards.project` 选择卡,但飞书侧项目清单建议从 desktop 项目工作区读(与 Telegram 同源),不做任意路径输入。

3. **作用维度需要产品裁决**:Telegram 是「bot+user」粒度;飞书是 lane(群/话题)粒度。切项目切的是**当前 lane 的会话**还是 **bot 级默认**?倾向 lane 级(群/话题内独立切换,互不影响),与 `/ctr` 接管的 binding 粒度一致。

4. **与 `/ctr` 的互斥**:接管期间禁 `/project`(Telegram 版已有同样裁决:接管中切项目先 `/exctr`),避免接管 binding 的 workdir 与会话行 workdir 分叉。

5. **访客不可用**:`/project` 属控制命令,天然落在 owner-only 门内(`wsClient.ts` 非 owner 斜杠命令直接丢),无需额外处理。

6. **接线成本**:adapter 开 `projectSwitching` + 补 `ui.cards.project` 文案包 + `cardActionHandler` 加 project-pick 分支。`orchestrator` 已有断言护栏,接线不完整会启动报错,风险可控。

## 想听的意见

- 硬切语义(丢上下文)是否可接受?还是需要「切走再切回」保留两个会话行?
- 飞书版切项目的粒度:lane 级 vs bot 级?
- 项目清单来源:desktop 项目工作区 vs 飞书侧独立配置?

相关代码:`apps/desktop/src/main/im/shared/slashCommands.ts`、`sessionRepo.ts`、`cardBuilders.ts`、`cardActionHandler.ts`、`telegram/adapter.ts`。

Contributor guide

Open the contributing guide

Research direction

Start by reading apps/desktop/src/main/im/shared/slashCommands.ts, sessionRepo.ts, cardBuilders.ts, cardActionHandler.ts, and telegram/adapter.ts. Before implementation, resolve the open decisions about hard-cut behavior, lane versus bot scope, and project-list ownership. Done should include an agreed Feishu flow with owner and /ctr handling, wired adapter and card-action paths, and passing startup assertions.

Written by the indexing model from the issue text.

Assessment

Tech stack
typescript
Domain
backend
Issue type
Feature
Difficulty
5/5
Estimated time
Over a week
Activity status
Active
Clarity
Needs clarification
Newbie friendliness
32/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.