diff --git a/src/claude/router.ts b/src/claude/router.ts index 24754ae9..63745c85 100644 --- a/src/claude/router.ts +++ b/src/claude/router.ts @@ -114,7 +114,7 @@ ${projectsSection}## 快速决策规则(优先级从高到低,匹配即停 当用户提到一个**不在已知项目列表中的**仓库名时,按以下顺序查找: 1. **本地缓存** — 运行 \`find ${cacheDir} -maxdepth 3 -name "*.git" -type d\`,查找匹配的 bare clone。如果找到,从缓存路径推导 URL(如 \`${cacheDir}/github.com/org/repo.git\` → \`https://github.com/org/repo\`),返回 \`clone_remote\`。**不要凭猜测构造 URL。** -2. **项目目录** — \`ls ${projectsDir}\`,看有没有匹配的目录 +2. **项目目录** — \`ls ${projectsDir}\`,看有没有匹配的目录。**注意:只有包含 \`.git\` 子目录的才是有效仓库**,编译产物目录(如 \`xxx-target\`、\`build\`)不是仓库,不要选它们。如果目录名只是部分匹配(如 \`talktype-target\` 不等于 \`talktype\`),优先继续查找更精确的匹配。 3. **GitHub 搜索** — \`gh search repos <关键词> --json fullName,url --limit 20\`(不要用 \`gh repo list\`) 4. 都找不到 → 用户给了 URL 就用 URL;否则 \`need_clarification\` diff --git a/src/feishu/event-handler.ts b/src/feishu/event-handler.ts index c41d7337..81457e6a 100644 --- a/src/feishu/event-handler.ts +++ b/src/feishu/event-handler.ts @@ -1346,8 +1346,8 @@ async function executeClaudeTask( ); } - // 将最后一个 turn 的文本也刷入文本卡片并标记完成 - await flushTextCard(pendingTurn?.textContent, true); + // 文本卡片标记完成(最后一个 turn 的文本由结果卡片展示,不重复追加) + await flushTextCard(undefined, true); await sendResultCard( prompt, restartResult, totalDurationMs, totalCostUsd, @@ -1414,8 +1414,8 @@ async function executeClaudeTask( ); } - // 将最后一个 turn 的文本也刷入文本卡片并标记完成 - await flushTextCard(pendingTurn?.textContent, true); + // 文本卡片标记完成(最后一个 turn 的文本由结果卡片展示,不重复追加) + await flushTextCard(undefined, true); await sendResultCard( prompt, result, result.durationMs, result.costUsd, diff --git a/vitest.config.ts b/vitest.config.ts index 9e455184..ffdb9c4a 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -1,4 +1,7 @@ import { defineConfig } from 'vitest/config'; +import dotenv from 'dotenv'; + +dotenv.config(); export default defineConfig({ test: {