duaer-spec 0.11.0 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. package/.claude/rules/agents-workflow.md +3 -1
  2. package/.cursor/rules/agents-workflow.mdc +3 -1
  3. package/.duaer/active-job.json +3 -3
  4. package/.duaer/specs/011-live-agent-launch/delivery.json +15 -0
  5. package/.duaer/specs/011-live-agent-launch/spec.md +33 -0
  6. package/.duaer/specs/011-live-agent-launch/tasks.md +5 -0
  7. package/.duaer/specs/012-live-dispatch-progress/delivery.json +12 -0
  8. package/.duaer/specs/012-live-dispatch-progress/spec.md +29 -0
  9. package/.duaer/specs/012-live-dispatch-progress/tasks.md +5 -0
  10. package/.duaer/specs/013-fix-live-agent-run/delivery.json +9 -0
  11. package/.duaer/specs/013-fix-live-agent-run/spec.md +18 -0
  12. package/.duaer/specs/013-fix-live-agent-run/tasks.md +4 -0
  13. package/.duaer/specs/014-fix-live-agent-auto/delivery.json +9 -0
  14. package/.duaer/specs/014-fix-live-agent-auto/spec.md +18 -0
  15. package/.duaer/specs/014-fix-live-agent-auto/tasks.md +4 -0
  16. package/.duaer/specs/015-fix-live-open-worktree/delivery.json +9 -0
  17. package/.duaer/specs/015-fix-live-open-worktree/spec.md +17 -0
  18. package/.duaer/specs/015-fix-live-open-worktree/tasks.md +4 -0
  19. package/.duaer/specs/016-live-cursor-cli/delivery.json +9 -0
  20. package/.duaer/specs/016-live-cursor-cli/spec.md +18 -0
  21. package/.duaer/specs/016-live-cursor-cli/tasks.md +4 -0
  22. package/.duaer/specs/017-live-cli-install-prompt/delivery.json +9 -0
  23. package/.duaer/specs/017-live-cli-install-prompt/spec.md +18 -0
  24. package/.duaer/specs/017-live-cli-install-prompt/tasks.md +5 -0
  25. package/.duaer/specs/018-fix-live-cursor-terminal/delivery.json +9 -0
  26. package/.duaer/specs/018-fix-live-cursor-terminal/spec.md +17 -0
  27. package/.duaer/specs/018-fix-live-cursor-terminal/tasks.md +4 -0
  28. package/.duaer/specs/019-fix-live-terminal-open/delivery.json +1 -0
  29. package/.duaer/specs/019-fix-live-terminal-open/spec.md +17 -0
  30. package/.duaer/specs/019-fix-live-terminal-open/tasks.md +4 -0
  31. package/.duaer/specs/020-fix-live-dispatch-hang/delivery.json +1 -0
  32. package/.duaer/specs/020-fix-live-dispatch-hang/spec.md +16 -0
  33. package/.duaer/specs/020-fix-live-dispatch-hang/tasks.md +3 -0
  34. package/.duaer/specs/021-fix-live-cli-only/delivery.json +1 -0
  35. package/.duaer/specs/021-fix-live-cli-only/spec.md +17 -0
  36. package/.duaer/specs/021-fix-live-cli-only/tasks.md +4 -0
  37. package/.duaer/specs/022-live-preview-link/delivery.json +9 -0
  38. package/.duaer/specs/022-live-preview-link/spec.md +19 -0
  39. package/.duaer/specs/022-live-preview-link/tasks.md +5 -0
  40. package/.duaer/specs/023-gh-deploy-docs-lang/delivery.json +12 -0
  41. package/.duaer/specs/023-gh-deploy-docs-lang/spec.md +47 -0
  42. package/.duaer/specs/023-gh-deploy-docs-lang/tasks.md +7 -0
  43. package/.duaer/specs/024-live-revise-feedback/delivery.json +12 -0
  44. package/.duaer/specs/024-live-revise-feedback/spec.md +43 -0
  45. package/.duaer/specs/024-live-revise-feedback/tasks.md +6 -0
  46. package/.duaer/specs/025-revise-dialogue-continue/delivery.json +12 -0
  47. package/.duaer/specs/025-revise-dialogue-continue/spec.md +40 -0
  48. package/.duaer/specs/025-revise-dialogue-continue/tasks.md +6 -0
  49. package/.duaer/specs/026-auto-fix-accept/delivery.json +9 -0
  50. package/.duaer/specs/026-auto-fix-accept/spec.md +27 -0
  51. package/.duaer/specs/026-auto-fix-accept/tasks.md +6 -0
  52. package/.duaer/specs/027-duaer-prefix/delivery.json +9 -0
  53. package/.duaer/specs/027-duaer-prefix/spec.md +21 -0
  54. package/.duaer/specs/027-duaer-prefix/tasks.md +4 -0
  55. package/.duaer/specs/028-fix-revise-stuck/delivery.json +9 -0
  56. package/.duaer/specs/028-fix-revise-stuck/spec.md +20 -0
  57. package/.duaer/specs/028-fix-revise-stuck/tasks.md +4 -0
  58. package/.duaer/specs/029-self-update/delivery.json +19 -0
  59. package/.duaer/specs/029-self-update/spec.md +28 -0
  60. package/.duaer/specs/029-self-update/tasks.md +6 -0
  61. package/.duaer/specs/030-revise-card-ui/delivery.json +13 -0
  62. package/.duaer/specs/030-revise-card-ui/spec.md +40 -0
  63. package/.duaer/specs/030-revise-card-ui/tasks.md +5 -0
  64. package/.duaer/specs/031-dispatch-init/delivery.json +13 -0
  65. package/.duaer/specs/031-dispatch-init/spec.md +38 -0
  66. package/.duaer/specs/031-dispatch-init/tasks.md +5 -0
  67. package/.duaer/specs/032-revise-ux/delivery.json +13 -0
  68. package/.duaer/specs/032-revise-ux/spec.md +32 -0
  69. package/.duaer/specs/032-revise-ux/tasks.md +5 -0
  70. package/.duaer/templates/deploy-github-pages.yml +43 -0
  71. package/ADOPT.md +11 -0
  72. package/AGENTS.md +14 -2
  73. package/CHANGELOG.md +86 -4
  74. package/README.md +27 -4
  75. package/README.zh-CN.md +26 -1
  76. package/bin/duaer-live.mjs +1756 -115
  77. package/bin/duaer.mjs +36 -3
  78. package/bin/update-check.mjs +202 -0
  79. package/docs/agent/README.md +1 -0
  80. package/docs/agent/branching-and-release.md +10 -2
  81. package/docs/agent/deploy-github.md +62 -0
  82. package/docs/agent/e2e-test-plan.md +28 -3
  83. package/package.json +1 -1
  84. package/web/live-dev/app.js +962 -49
  85. package/web/live-dev/index.html +57 -8
  86. package/web/live-dev/styles.css +277 -0
@@ -45,8 +45,10 @@ cd .worktree/feat-login
45
45
  - Merge into **`develop`** when done (hotfix: **`main`**, then back-merge **`develop`**)
46
46
  - **Handoff (mandatory):** stop worktree-bound processes → remove `.worktree/<id>` →
47
47
  restart from primary checkout on `develop` (`duaer handoff [--run]`, `.duaer/handoff.json`)
48
- - Push only when the user explicitly asks
48
+ - Push only when the user explicitly asks (a deploy/hosting ask authorizes
49
+ the `gh` + push needed for that publish — see `docs/agent/deploy-github.md`)
49
50
  - Promote **`develop` → `main`** only when the user asks to go online
51
+ - English docs: no Chinese (CJK); Chinese docs may include English terms
50
52
 
51
53
  ## GitHub issue / PR intake
52
54
 
@@ -48,8 +48,10 @@ cd .worktree/feat-login
48
48
  - Merge into **`develop`** when done (hotfix: **`main`**, then back-merge **`develop`**)
49
49
  - **Handoff (mandatory):** stop worktree-bound processes → remove `.worktree/<id>` →
50
50
  restart from primary checkout on `develop` (`duaer handoff [--run]`, `.duaer/handoff.json`)
51
- - Push only when the user explicitly asks
51
+ - Push only when the user explicitly asks (a deploy/hosting ask authorizes
52
+ the `gh` + push needed for that publish — see `docs/agent/deploy-github.md`)
52
53
  - Promote **`develop` → `main`** only when the user asks to go online
54
+ - English docs: no Chinese (CJK); Chinese docs may include English terms
53
55
 
54
56
  ## GitHub issue / PR intake
55
57
 
@@ -1,5 +1,5 @@
1
1
  {
2
- "specDir": ".duaer/specs/009-live-repo-pick",
3
- "branch": "feat/live-repo-pick",
4
- "startedAt": "2026-09-16T00:40:00.000Z"
2
+ "specDir": ".duaer/specs/032-revise-ux",
3
+ "branch": "fix/revise-ux",
4
+ "startedAt": "2026-09-16T03:40:00.000Z"
5
5
  }
@@ -0,0 +1,15 @@
1
+ {
2
+ "status": "accepted",
3
+ "acceptedAt": "2026-09-16T00:45:00.000Z",
4
+ "verification": {
5
+ "levels": ["L0", "L1", "L3"],
6
+ "commands": [
7
+ "node --check bin/duaer-live.mjs",
8
+ "curl GET /api/agents (cursor-agent,claude,cursor,code,none)",
9
+ "curl POST /api/dispatch agentId=none",
10
+ "curl POST /api/dispatch agentId=cursor (open)",
11
+ "curl POST /api/dispatch/launch agentId=none"
12
+ ],
13
+ "result": "pass"
14
+ }
15
+ }
@@ -0,0 +1,33 @@
1
+ # Feature Specification: Live desk agent detect + launch
2
+
3
+ **Feature Branch**: `feat/live-agent-launch`
4
+
5
+ **Created**: 2026-09-16
6
+
7
+ **Status**: Active
8
+
9
+ ## Goal
10
+
11
+ 派工后不只给文案:检测本机已安装的数字员工(Cursor Agent、Claude Code,以及仅打开仓库的 Cursor / VS Code),在现场开发页面列出可选,用户选中后启动并带上开工 prompt。
12
+
13
+ ## Out of scope
14
+
15
+ - 远程/云端 Agent 编排
16
+ - 代填各工具的 API Key / 登录
17
+ - 默认开启 bypassPermissions / dangerously-skip-permissions(Claude)
18
+ - 自动合入 / 自动 stamp delivery(仍由被启动的数字员工完成)
19
+
20
+ ## Acceptance
21
+
22
+ 1. `GET /api/agents` 返回本机检测到的启动器列表(至少探测 `agent`/`cursor agent`、`claude`、`cursor`、`code`)
23
+ 2. 派工面板展示可用启动器供点选;可「仅派工不启动」
24
+ 3. 派工时可带 `agentId`;或派工后再 `POST /api/dispatch/launch` 启动
25
+ 4. Cursor Agent:在 worktree 上以 prompt 启动(非交互 `-p`,记录日志);Claude Code:`--bg` 后台开工;`cursor`/`code`:打开 worktree
26
+ 5. UI 文案不再暗示「请手动复制给数字员工」为唯一路径
27
+ 6. E2E catalog 增加场景;smoke curl 覆盖 detect + launch(launch 可用假/探测级)
28
+
29
+ ## Assumptions
30
+
31
+ - macOS/Linux PATH 上有 CLI 即视为已安装
32
+ - Cursor Agent 启动使用 `--trust`;为无人值守加 `--force`(用户显式点启动)
33
+ - 上次选用的 agentId 可记在 live 配置里作默认
@@ -0,0 +1,5 @@
1
+ # Tasks
2
+
3
+ - [x] T001 Server: detectAgents + /api/agents + launchAgent + wire dispatch
4
+ - [x] T002 UI: agent picker + launch after dispatch + copy update
5
+ - [x] T003 Spec/CHANGELOG/E2E + smoke verify + delivery
@@ -0,0 +1,12 @@
1
+ {
2
+ "status": "accepted",
3
+ "acceptedAt": "2026-09-16T00:50:00.000Z",
4
+ "verification": {
5
+ "levels": ["L0", "L1", "L3"],
6
+ "commands": [
7
+ "node --check bin/duaer-live.mjs",
8
+ "curl status progress 0/3 → 1/3 after T001 → accepted"
9
+ ],
10
+ "result": "pass"
11
+ }
12
+ }
@@ -0,0 +1,29 @@
1
+ # Feature Specification: Live dispatch progress
2
+
3
+ **Feature Branch**: `feat/live-dispatch-progress`
4
+
5
+ **Created**: 2026-09-16
6
+
7
+ **Status**: Active
8
+
9
+ ## Goal
10
+
11
+ 派工后现场开发能看到数字员工做到哪一步:轮询产品仓 Brief 的 `tasks.md` 勾选状态,并展示当前步骤;可选附带启动日志尾部。
12
+
13
+ ## Out of scope
14
+
15
+ - 实时流式推送 Agent token
16
+ - 解析 IDE 内部会话状态
17
+ - 强制远程 Agent 上报自定义协议(依赖 tasks.md 勾选约定)
18
+
19
+ ## Acceptance
20
+
21
+ 1. `GET /api/status` 返回 `progress`:tasks 列表(done/pending)、done/total、current 文案
22
+ 2. 派工面板展示进度清单,随轮询更新
23
+ 3. delivery accepted 时进度显示完成并停止轮询
24
+ 4. 派工写入的 tasks / agentPrompt 明确要求边做边勾选
25
+ 5. Smoke curl + E2E catalog
26
+
27
+ ## Assumptions
28
+
29
+ - 数字员工按 Duaer 流程会更新 `tasks.md` 的 `- [x]`
@@ -0,0 +1,5 @@
1
+ # Tasks
2
+
3
+ - [x] T001 Extend /api/status with tasks.md progress (+ log tail)
4
+ - [x] T002 UI progress list + poll render
5
+ - [x] T003 Prompt/tasks template + CHANGELOG/E2E + smoke + delivery
@@ -0,0 +1,9 @@
1
+ {
2
+ "status": "accepted",
3
+ "acceptedAt": "2026-09-16T01:05:00.000Z",
4
+ "verification": {
5
+ "levels": ["L0", "L1"],
6
+ "commands": ["node --check", "preferred ignores open-only cursor"],
7
+ "result": "pass"
8
+ }
9
+ }
@@ -0,0 +1,18 @@
1
+ # Feature Specification: Live agent actually runs
2
+
3
+ **Feature Branch**: `fix/live-agent-run`
4
+
5
+ **Created**: 2026-09-16
6
+
7
+ **Status**: Active
8
+
9
+ ## Goal
10
+
11
+ 选 Cursor Agent / Claude 派工后,真正启动可运行的数字员工会话(终端可见),而不是只打开 Cursor 窗口;默认不要记住「仅打开 IDE」。
12
+
13
+ ## Acceptance
14
+
15
+ 1. cursor-agent:打开 worktree,并在 Terminal(macOS)或等效方式启动 `agent --workspace … --trust --force`(交互,不用 `-p` 静默)
16
+ 2. claude:在终端启动交互 `claude`(或明确后台时写清日志);不再让用户误以为「打开 Cursor」就是开工
17
+ 3. preferredAgentId 只持久化 worker;open-only 不覆盖默认
18
+ 4. UI 文案区分「开工」与「仅打开」
@@ -0,0 +1,4 @@
1
+ # Tasks
2
+
3
+ - [x] T001 Fix launchAgent + preferred persistence
4
+ - [x] T002 UI hints + CHANGELOG + smoke + delivery
@@ -0,0 +1,9 @@
1
+ {
2
+ "status": "accepted",
3
+ "acceptedAt": "2026-09-16T01:10:00.000Z",
4
+ "verification": {
5
+ "levels": ["L0", "L1"],
6
+ "commands": ["fake agent receives -p --force --trust; mode=background"],
7
+ "result": "pass"
8
+ }
9
+ }
@@ -0,0 +1,18 @@
1
+ # Feature Specification: Live agent auto-run (no wait for input)
2
+
3
+ **Feature Branch**: `fix/live-agent-auto`
4
+
5
+ **Created**: 2026-09-16
6
+
7
+ **Status**: Active
8
+
9
+ ## Goal
10
+
11
+ 派工选 Cursor Agent / Claude 后立刻非交互开工,不落在终端/IDE 里等用户再输入。
12
+
13
+ ## Acceptance
14
+
15
+ 1. cursor-agent:`agent -p --force --trust --workspace` 后台 spawn,prompt 作 argv;日志写入 agent-launch.log
16
+ 2. claude:`claude --bg` 后台开工(非交互)
17
+ 3. 不再为 worker 打开交互 Terminal;不默认只打开 Cursor 空窗导致误以为要手输
18
+ 4. UI 说明「已后台自动开工」
@@ -0,0 +1,4 @@
1
+ # Tasks
2
+
3
+ - [x] T001 Non-interactive launch for cursor-agent + claude
4
+ - [x] T002 UI/CHANGELOG + smoke + delivery
@@ -0,0 +1,9 @@
1
+ {
2
+ "status": "accepted",
3
+ "acceptedAt": "2026-09-16T01:15:00.000Z",
4
+ "verification": {
5
+ "levels": ["L0"],
6
+ "commands": ["node --check bin/duaer-live.mjs"],
7
+ "result": "pass"
8
+ }
9
+ }
@@ -0,0 +1,17 @@
1
+ # Feature Specification: Open named worktree on auto-start
2
+
3
+ **Feature Branch**: `fix/live-open-worktree`
4
+
5
+ **Created**: 2026-09-16
6
+
7
+ **Status**: Active
8
+
9
+ ## Goal
10
+
11
+ 后台自动开工时,同时用 Cursor 打开派工得到的命名 worktree(如 `.worktree/feat-1`),方便查看与操作。
12
+
13
+ ## Acceptance
14
+
15
+ 1. cursor-agent:后台 `-p` 开工 + `cursor <worktreePath>`
16
+ 2. claude:`--bg` + 尽量打开 Cursor/VS Code 到该 worktree
17
+ 3. UI 提示已打开 worktree
@@ -0,0 +1,4 @@
1
+ # Tasks
2
+
3
+ - [x] T001 Open worktree on worker launch + UI + CHANGELOG
4
+ - [x] T002 Smoke + delivery
@@ -0,0 +1,9 @@
1
+ {
2
+ "status": "accepted",
3
+ "acceptedAt": "2026-09-16T01:25:00.000Z",
4
+ "verification": {
5
+ "levels": ["L0", "L1"],
6
+ "commands": ["fake cursor -n + agent --workspace -p --force --sandbox disabled"],
7
+ "result": "pass"
8
+ }
9
+ }
@@ -0,0 +1,18 @@
1
+ # Feature Specification: Cursor CLI dispatch support
2
+
3
+ **Feature Branch**: `feat/live-cursor-cli`
4
+
5
+ **Created**: 2026-09-16
6
+
7
+ **Status**: Active
8
+
9
+ ## Goal
10
+
11
+ 派工启动对齐 Cursor 官方 CLI:用 `cursor -n` 打开命名 worktree,用 `agent` / `cursor agent` 非交互开工(`--workspace --trust -p --force`,不用 `-w`),并暴露 CLI 检测信息。
12
+
13
+ ## Acceptance
14
+
15
+ 1. Open: `cursor -n <worktree>`;尽量 `-g` 到 Brief `tasks.md`
16
+ 2. Run: prefer `agent` else `cursor agent`; args include `--workspace --trust -p --force --sandbox disabled`; never pass `-w`
17
+ 3. `/api/agents` includes cursor/agent binary paths (+ optional version)
18
+ 4. UI hint reflects Cursor CLI behavior
@@ -0,0 +1,4 @@
1
+ # Tasks
2
+
3
+ - [x] T001 Cursor CLI open + agent argv helpers
4
+ - [x] T002 detectAgents enrichment + UI/CHANGELOG + smoke
@@ -0,0 +1,9 @@
1
+ {
2
+ "status": "accepted",
3
+ "acceptedAt": "2026-09-16T01:35:00.000Z",
4
+ "verification": {
5
+ "levels": ["L0", "L1"],
6
+ "commands": ["node --check", "missing cursor-agent exposes install curl"],
7
+ "result": "pass"
8
+ }
9
+ }
@@ -0,0 +1,18 @@
1
+ # Feature Specification: CLI install hints + Agent start command box
2
+
3
+ **Feature Branch**: `feat/live-cli-install-prompt`
4
+
5
+ **Created**: 2026-09-16
6
+
7
+ **Status**: Active
8
+
9
+ ## Goal
10
+
11
+ 未安装 Cursor CLI 时提示安装命令;派工区提供「启动命令」输入框,默认以 `Agent` 开头,派工时把该内容交给 Cursor Agent。
12
+
13
+ ## Acceptance
14
+
15
+ 1. missing Cursor / Cursor Agent 带 `installCommand: curl https://cursor.com/install -fsS | bash`,UI 展示可复制
16
+ 2. 派工面板有启动命令输入框;选 Cursor Agent 时默认以 `Agent` 开头
17
+ 3. `POST /api/dispatch` 接受 `startCommand`,用作 agent prompt(并补全 worktree/Brief 路径)
18
+ 4. 未安装却选 Cursor Agent 时阻止启动并提示安装
@@ -0,0 +1,5 @@
1
+ # Tasks
2
+
3
+ - [x] T001 Server: installCommand on missing + startCommand in dispatch
4
+ - [x] T002 UI: install hint + start command box + wire
5
+ - [x] T003 CHANGELOG + delivery
@@ -0,0 +1,9 @@
1
+ {
2
+ "status": "accepted",
3
+ "acceptedAt": "2026-09-16T01:40:00.000Z",
4
+ "verification": {
5
+ "levels": ["L0"],
6
+ "commands": ["node --check bin/duaer-live.mjs"],
7
+ "result": "pass"
8
+ }
9
+ }
@@ -0,0 +1,17 @@
1
+ # Feature Specification: Cursor Agent launches Terminal + CLI
2
+
3
+ **Feature Branch**: `fix/live-cursor-terminal`
4
+
5
+ **Created**: 2026-09-16
6
+
7
+ **Status**: Active
8
+
9
+ ## Goal
10
+
11
+ Cursor Agent 派工打开 Terminal,在终端里执行 `agent` / `cursor agent` CLI(带启动命令),不再 `cursor -n` 开 IDE,也不后台静默 `-p`。
12
+
13
+ ## Acceptance
14
+
15
+ 1. cursor-agent → launchInTerminal with cursor CLI; mode=terminal
16
+ 2. Hint/UI 文案反映 Terminal + CLI
17
+ 3. 不调用 openCursorWorktree for cursor-agent
@@ -0,0 +1,4 @@
1
+ # Tasks
2
+
3
+ - [x] T001 Terminal + Cursor CLI launch
4
+ - [x] T002 UI/CHANGELOG + delivery
@@ -0,0 +1 @@
1
+ {"status":"accepted","acceptedAt":"2026-09-16T01:45:00.000Z","verification":{"levels":["L0"],"commands":["node --check","open .command"],"result":"pass"}}
@@ -0,0 +1,17 @@
1
+ # Feature Specification: Reliable Terminal open for Cursor Agent
2
+
3
+ **Feature Branch**: `fix/live-terminal-open`
4
+
5
+ **Created**: 2026-09-16
6
+
7
+ **Status**: Active
8
+
9
+ ## Goal
10
+
11
+ Cursor Agent 派工时真正弹出 Terminal:用 `.command` + `open`(并修正 osascript 引号)。
12
+
13
+ ## Acceptance
14
+
15
+ 1. macOS uses `open *.command` to launch Terminal with Cursor CLI
16
+ 2. Failed open falls back to correctly quoted osascript; both fail → error with command
17
+ 3. Launch log records open result
@@ -0,0 +1,4 @@
1
+ # Tasks
2
+
3
+ - [x] T001 Fix launchInTerminal via open .command
4
+ - [x] T002 CHANGELOG + delivery
@@ -0,0 +1 @@
1
+ {"status":"accepted","acceptedAt":"2026-09-16T01:50:00.000Z","verification":{"levels":["L0"],"commands":["node --check"],"result":"pass"}}
@@ -0,0 +1,16 @@
1
+ # Feature Specification: Unstick dispatch UI
2
+
3
+ **Feature Branch**: `fix/live-dispatch-hang`
4
+
5
+ **Created**: 2026-09-16
6
+
7
+ **Status**: Active
8
+
9
+ ## Goal
10
+
11
+ 派工不再因同步打开 Terminal / osascript 卡住;接口快速返回,UI 有超时。
12
+
13
+ ## Acceptance
14
+
15
+ 1. launchInTerminal non-blocking
16
+ 2. fetch abort 60s; finally clears 派工中
@@ -0,0 +1,3 @@
1
+ # Tasks
2
+
3
+ - [x] T001 Async terminal + UI timeout
@@ -0,0 +1 @@
1
+ {"status":"accepted","acceptedAt":"2026-09-16T01:55:00.000Z","verification":{"levels":["L0"],"commands":["node --check"],"result":"pass"}}
@@ -0,0 +1,17 @@
1
+ # Feature Specification: CLI-only digital employees
2
+
3
+ **Feature Branch**: `fix/live-cli-only`
4
+
5
+ **Created**: 2026-09-16
6
+
7
+ **Status**: Active
8
+
9
+ ## Goal
10
+
11
+ 派工「用哪个数字员工」只保留 CLI:Cursor Agent、Claude Code;二者均在 Terminal 执行。
12
+
13
+ ## Acceptance
14
+
15
+ 1. `/api/agents` only lists cursor-agent / claude (plus missing install hints)
16
+ 2. No Cursor-open-only / VS Code / 仅派工 options
17
+ 3. Claude launches via Terminal like Cursor Agent
@@ -0,0 +1,4 @@
1
+ # Tasks
2
+
3
+ - [x] T001 CLI-only catalog + Claude Terminal
4
+ - [x] T002 UI + delivery
@@ -0,0 +1,9 @@
1
+ {
2
+ "status": "accepted",
3
+ "acceptedAt": "2026-09-16T02:05:00.000Z",
4
+ "verification": {
5
+ "levels": ["L0", "L1"],
6
+ "commands": ["node --check", "status preview + /api/artifact serves index.html"],
7
+ "result": "pass"
8
+ }
9
+ }
@@ -0,0 +1,19 @@
1
+ # Feature Specification: Live delivery preview link
2
+
3
+ **Feature Branch**: `feat/live-preview-link`
4
+
5
+ **Created**: 2026-09-16
6
+
7
+ **Status**: Active
8
+
9
+ ## Goal
10
+
11
+ delivery accepted 后现场开发展示可点击的成品链接(`delivery.preview` 或 worktree 内常见静态页),用户可直接打开查看。
12
+
13
+ ## Acceptance
14
+
15
+ 1. Agents stamp `preview.url` (http(s) or worktree-relative path) in delivery.json when there is a viewable artifact
16
+ 2. `/api/status` returns `preview: { url, label, source }`
17
+ 3. Live serves worktree files at `/api/artifact?jobId=&path=` (path confined to worktree)
18
+ 4. UI shows 「查看成品」 link/button on accept; bubble mentions the link
19
+ 5. Dispatch prompt/tasks require preview for UI deliverables
@@ -0,0 +1,5 @@
1
+ # Tasks
2
+
3
+ - [x] T001 resolvePreview + artifact API + status field
4
+ - [x] T002 Prompt/tasks + UI preview panel
5
+ - [x] T003 CHANGELOG/E2E + smoke + delivery
@@ -0,0 +1,12 @@
1
+ {
2
+ "status": "accepted",
3
+ "acceptedAt": "2026-09-16T02:20:00.000Z",
4
+ "verification": {
5
+ "levels": ["docs", "L0"],
6
+ "commands": [
7
+ "node --check bin/duaer-live.mjs",
8
+ "rg -n '[\\p{Han}]' README.md CHANGELOG.md AGENTS.md docs/agent docs/npm-trusted-publishing.md docs/adr (expect empty)"
9
+ ],
10
+ "result": "pass"
11
+ }
12
+ }
@@ -0,0 +1,47 @@
1
+ # Feature Specification: GitHub CLI deploy + English docs language
2
+
3
+ **Feature Branch**: `feat/gh-deploy`
4
+
5
+ **Created**: 2026-09-16
6
+
7
+ **Status**: Accepted
8
+
9
+ ## Goal
10
+
11
+ When a product job needs hosting/deploy, digital employees use **GitHub CLI
12
+ (`gh`) + GitHub Actions** as the default automation path (not third-party
13
+ host CLIs). English documentation must not contain Chinese characters;
14
+ Chinese docs may include English terms.
15
+
16
+ ## In scope
17
+
18
+ - Live dispatch: detect deploy need from Brief text; add tasks + agent prompt
19
+ rules for `gh` / Actions / Pages
20
+ - Template workflow adopters/agents can copy
21
+ - Agent-ops + README (EN/ZH) document the policy
22
+ - Scrub Chinese from English tracked docs (`README.md`, `CHANGELOG.md`,
23
+ `docs/agent/*`, etc.)
24
+
25
+ ## Out of scope
26
+
27
+ - Rewriting Chinese Live Dev UI copy to English
28
+ - Non-GitHub cloud vendors as first-class defaults
29
+ - Auto-push without an explicit deploy/ship ask in the job
30
+
31
+ ## Acceptance
32
+
33
+ 1. Deploy-needed live jobs get an extra task and prompt block pointing to
34
+ `gh` + Actions (Pages template available under `.duaer/templates/`)
35
+ 2. `docs/agent/deploy-github.md` exists (English only) and is linked from
36
+ branching/README
37
+ 3. English docs contain no CJK characters
38
+ 4. Chinese README documents the same deploy preference (may use English
39
+ tool names)
40
+ 5. E2E catalog lists the deploy policy scenario
41
+
42
+ ## Assumptions
43
+
44
+ - “Needs deploy” includes 部署 / host / publish / Pages / go online for a
45
+ user-facing site or app artifact
46
+ - User asking for a deployable site authorizes `gh` setup and the push
47
+ required to publish that deployment
@@ -0,0 +1,7 @@
1
+ # Tasks
2
+
3
+ - [x] T001 Spec + active-job
4
+ - [x] T002 Live dispatch: needsDeploy → tasks + prompt; Pages workflow template
5
+ - [x] T003 Docs: deploy-github.md, AGENTS/README EN+ZH, scrub CJK from English docs
6
+ - [x] T004 E2E catalog + CHANGELOG Unreleased
7
+ - [x] T005 Verify (docs + static checks) and accept
@@ -0,0 +1,12 @@
1
+ {
2
+ "status": "accepted",
3
+ "acceptedAt": "2026-09-16T02:30:00.000Z",
4
+ "verification": {
5
+ "levels": ["docs", "L0"],
6
+ "commands": [
7
+ "node --check bin/duaer-live.mjs",
8
+ "rg revise README.md / api / UI"
9
+ ],
10
+ "result": "pass"
11
+ }
12
+ }
@@ -0,0 +1,43 @@
1
+ # Feature Specification: Live revise after preview feedback
2
+
3
+ **Feature Branch**: `feat/live-revise`
4
+
5
+ **Created**: 2026-09-16
6
+
7
+ **Status**: Accepted
8
+
9
+ ## Goal
10
+
11
+ After the user opens the finished product and is not satisfied, they can give
12
+ feedback on the live desk; the system understands the ask and relaunches the
13
+ digital employee on the **same** product worktree to improve.
14
+
15
+ ## In scope
16
+
17
+ - UI after `delivery.json` accepted: feedback box +「继续改进」
18
+ - `POST /api/revise`: append revision to product Brief/tasks, reopen delivery,
19
+ relaunch CLI agent (same worktree)
20
+ - Optional light restatement of feedback into the Brief
21
+ - Resume progress polling after revise
22
+ - Docs (EN no CJK) + E2E scenario
23
+
24
+ ## Out of scope
25
+
26
+ - Creating a brand-new worktree for every revision
27
+ - Changing the original confirm-card flow before first dispatch
28
+ - Automatic satisfaction scoring
29
+
30
+ ## Acceptance
31
+
32
+ 1. When status is accepted and preview is shown (or missing), revise panel is
33
+ visible
34
+ 2. Submitting non-empty feedback calls `/api/revise`, updates product
35
+ `spec.md` / `tasks.md`, sets delivery back to open (not accepted)
36
+ 3. Agent Terminal relaunches with a revise prompt that cites the feedback
37
+ 4. Status poll resumes until the next accept
38
+ 5. English docs mention the revise loop without CJK
39
+
40
+ ## Assumptions
41
+
42
+ - Same `dispatch.worktreePath` / Brief folder is reused
43
+ - User feedback authorizes another agent run (not a remote push by itself)
@@ -0,0 +1,6 @@
1
+ # Tasks
2
+
3
+ - [x] T001 Spec + active-job
4
+ - [x] T002 `reviseDispatchedJob` + `POST /api/revise`
5
+ - [x] T003 Live UI feedback panel + poll resume
6
+ - [x] T004 Docs + E2E + CHANGELOG; verify; accept
@@ -0,0 +1,12 @@
1
+ {
2
+ "status": "accepted",
3
+ "acceptedAt": "2026-09-16T02:50:00.000Z",
4
+ "verification": {
5
+ "levels": ["docs", "L0"],
6
+ "commands": [
7
+ "node --check bin/duaer-live.mjs",
8
+ "rg --continue bin/duaer-live.mjs"
9
+ ],
10
+ "result": "pass"
11
+ }
12
+ }