chore: rebuild release package
This commit is contained in:
@@ -19,6 +19,8 @@
|
||||
7. 关闭更新即使只提供 `child.threadId/status`,且工具载荷缺少 `receiverThreadIds/agentsStates`,也必须保留此前子代理卡片,将状态显示为“已关闭”。
|
||||
8. 空的 `wait/close` 协作工具不得把已有子代理数量重置为 0;普通工具调用不得进入子代理状态合并路径。
|
||||
9. 当历史中找不到原 `spawnToolId` 时,服务端应将 child 状态合并到最近的协作工具记录,保证刷新后仍可恢复关闭卡片;不得选择普通工具。
|
||||
10. 原生 `subAgentActivity` 必须归一化进同一子代理卡片:`agentThreadId` 作为线程 ID,`agentPath` 作为角色/标题来源,活动 `kind` 映射为状态;随后空 `wait` 复用这些状态,原始活动工具条不重复显示。
|
||||
11. 若 `subAgentActivity` 没有携带原始 prompt,应保守显示可读角色标题,不伪造任务简介;若同线程的其他事件提供 prompt,则继续按既有优先级保留为简介。
|
||||
|
||||
## 视觉要求
|
||||
|
||||
@@ -36,6 +38,7 @@
|
||||
- 无 prompt 时仍能回退到短线程 ID,不报错。
|
||||
- 关闭空载荷场景保留原标题、简介、线程 ID,并显示关闭状态与非零数量。
|
||||
- 页面刷新和历史重渲染后仍满足上述关闭卡片要求。
|
||||
- 仅包含 `subAgentActivity + 空 wait` 的历史消息显示非零子代理富卡片,标题来自 `agentPath`,且不再同时显示 `subAgentActivity` 原始工具条或 `ID call_...`。
|
||||
- JavaScript 语法检查及项目回归测试通过。
|
||||
|
||||
## 范围
|
||||
|
||||
2
.trellis/tasks/07-16-composer-slash-trigger/check.jsonl
Normal file
2
.trellis/tasks/07-16-composer-slash-trigger/check.jsonl
Normal file
@@ -0,0 +1,2 @@
|
||||
{"file":".trellis/spec/frontend/quality-guidelines.md","reason":"按项目质量检查入口审查前端行为与回归覆盖"}
|
||||
{"file":".trellis/tasks/07-16-composer-slash-trigger/research/composer-slash-analysis.md","reason":"核对根因、验收标准和已知风险是否全部覆盖"}
|
||||
@@ -0,0 +1,2 @@
|
||||
{"file":".trellis/spec/frontend/index.md","reason":"遵守项目前端开发入口与质量检查约定"}
|
||||
{"file":".trellis/tasks/07-16-composer-slash-trigger/research/composer-slash-analysis.md","reason":"提供已定位的前后端根因、推荐实现与风险边界"}
|
||||
29
.trellis/tasks/07-16-composer-slash-trigger/prd.md
Normal file
29
.trellis/tasks/07-16-composer-slash-trigger/prd.md
Normal file
@@ -0,0 +1,29 @@
|
||||
# 修复输入框快捷指令触发与发送
|
||||
|
||||
## 背景
|
||||
|
||||
输入框目前把所有以 `/` 开头的内容都当成内置命令。用户输入文件路径或其他未知 slash 文本时,系统虽显示“未知指令”,但原消息不会发送。同时,快捷选择中的 `/` 只在整段输入第一个字符生效,与 `@`、`$` 的 token 触发规则不一致。
|
||||
|
||||
## 需求
|
||||
|
||||
1. 已知内置 slash 命令继续走现有命令处理链路,不显示普通用户气泡。
|
||||
2. 未知 `/` 文本仍显示“未知指令”提示,但必须继续按普通消息发送给当前代理,并正常显示用户消息。
|
||||
3. 未知 `/` 文本按普通消息处理附件,不应被“命令消息不支持附件”拦截。
|
||||
4. `/` 快捷选择允许在行首或空白后触发,与 `@`、`$` 保持一致。
|
||||
5. token 内部的 `/`(如 `src/foo`)不应触发快捷选择;换行后的行首或空白后 `/` 应可触发。
|
||||
6. 保持现有 MCP、skill、prompt 建议来源与插入语义不变。
|
||||
|
||||
## 验收标准
|
||||
|
||||
- 输入 `/report/mcps?search` 时会看到未知指令提示,同时该文本作为普通消息发送。
|
||||
- 输入 `请查看 /rep` 且光标位于末尾时,显示 `/` 建议菜单。
|
||||
- 输入 `src/foo` 时不显示 `/` 建议菜单。
|
||||
- `@`、`$` 的触发行为保持不变。
|
||||
- `/help`、`/model`、`/mode` 等内置命令行为保持不变。
|
||||
- 回归测试覆盖未知 slash 放行、触发边界和已知命令保留,并全部通过。
|
||||
|
||||
## 非目标
|
||||
|
||||
- 不新增手动 MCP 参数表单。
|
||||
- 不重做输入框视觉样式。
|
||||
- 不调整 slash 命令集合或服务器能力注入方式。
|
||||
@@ -0,0 +1,21 @@
|
||||
# Composer slash 行为调研
|
||||
|
||||
## 根因
|
||||
|
||||
- `public/app.js` 的 `findActiveComposerToken` 对 `/` 使用 `value.startsWith('/')` 特判,只允许整段首字符触发;`@`、`$` 则允许行首或空白后触发。
|
||||
- `public/app.js` 的 `sendMessage` 对任意 `text.startsWith('/')` 都进入命令发送分支,未知路径也不会走 `submitUserMessage`。
|
||||
- `server.js` 的 WebSocket 消息分发对任意 slash 前缀调用 `handleSlashCommand`,其默认分支只发未知指令系统消息,随后不调用 `handleMessage`。
|
||||
- `scripts/regression.js` 现有契约断言未知 slash 必须恢复草稿,与新需求相反,需要更新为“提示但继续普通发送”。
|
||||
|
||||
## 推荐实现
|
||||
|
||||
- 前端新增基于 `SLASH_COMMANDS` 第一 token 精确匹配的已知命令判断,仅已知命令进入现有 slash 分支。
|
||||
- 服务端让 `handleSlashCommand` 返回是否已处理;未知分支先发送提示并返回 `false`,WebSocket 分发随后调用正常 `handleMessage`。
|
||||
- `findActiveComposerToken` 统一解析 `(^|\s)([/@$])([^\s]*)$` 的当前行 token 边界,保留既有插入逻辑。
|
||||
- 回归测试同时覆盖源码契约和 WebSocket 真实行为。
|
||||
|
||||
## 风险
|
||||
|
||||
- 必须确保未知 slash 的系统提示不带 `preserveComposerDraft`,否则会在普通发送后错误恢复已发送内容。
|
||||
- 必须确保已知命令仍携带 requestId,失败时仍可恢复草稿。
|
||||
- 服务端必须独立判断,不能只信任前端,避免旧客户端仍拦截未知 slash。
|
||||
26
.trellis/tasks/07-16-composer-slash-trigger/task.json
Normal file
26
.trellis/tasks/07-16-composer-slash-trigger/task.json
Normal file
@@ -0,0 +1,26 @@
|
||||
{
|
||||
"id": "composer-slash-trigger",
|
||||
"name": "composer-slash-trigger",
|
||||
"title": "修复输入框快捷指令触发与发送",
|
||||
"description": "",
|
||||
"status": "in_progress",
|
||||
"dev_type": null,
|
||||
"scope": null,
|
||||
"package": null,
|
||||
"priority": "P2",
|
||||
"creator": "shiyue",
|
||||
"assignee": "shiyue",
|
||||
"createdAt": "2026-07-16",
|
||||
"completedAt": null,
|
||||
"branch": null,
|
||||
"base_branch": "main",
|
||||
"worktree_path": null,
|
||||
"commit": null,
|
||||
"pr_url": null,
|
||||
"subtasks": [],
|
||||
"children": [],
|
||||
"parent": null,
|
||||
"relatedFiles": [],
|
||||
"notes": "",
|
||||
"meta": {}
|
||||
}
|
||||
Reference in New Issue
Block a user