duaer-spec 0.23.1 → 0.24.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.
- package/.duaer/active-job.json +2 -2
- package/.duaer/specs/212-release-0231/delivery.json +10 -0
- package/.duaer/specs/212-release-0231/tasks.md +3 -3
- package/.duaer/specs/213-drop-renhua-label/delivery.json +10 -0
- package/.duaer/specs/213-drop-renhua-label/spec.md +11 -0
- package/.duaer/specs/213-drop-renhua-label/tasks.md +4 -0
- package/.duaer/specs/214-deploy-employee/delivery.json +10 -0
- package/.duaer/specs/214-deploy-employee/spec.md +21 -0
- package/.duaer/specs/214-deploy-employee/tasks.md +6 -0
- package/.duaer/specs/215-live-i18n-common/delivery.json +10 -0
- package/.duaer/specs/215-live-i18n-common/spec.md +27 -0
- package/.duaer/specs/215-live-i18n-common/tasks.md +5 -0
- package/.duaer/specs/216-release-024/spec.md +12 -0
- package/.duaer/specs/216-release-024/tasks.md +5 -0
- package/CHANGELOG.md +18 -0
- package/README.md +17 -4
- package/README.zh-CN.md +18 -5
- package/bin/live-modules.mjs +11 -6
- package/docs/agent/e2e-test-plan.md +3 -3
- package/docs/agent/live-desk.md +6 -5
- package/package.json +1 -1
- package/web/live-dev/app.js +23 -7
- package/web/live-dev/employee-catalog.mjs +13 -0
- package/web/live-dev/i18n-de.js +496 -0
- package/web/live-dev/i18n-es.js +496 -0
- package/web/live-dev/i18n-fr.js +496 -0
- package/web/live-dev/i18n-ja.js +3 -1
- package/web/live-dev/i18n-ko.js +496 -0
- package/web/live-dev/i18n-pt-BR.js +496 -0
- package/web/live-dev/i18n-ru.js +496 -0
- package/web/live-dev/i18n-vi.js +496 -0
- package/web/live-dev/i18n-zh-TW.js +496 -0
- package/web/live-dev/i18n.js +50 -5
- package/web/live-dev/index.html +8 -0
- package/web/live-dev/task-graph.mjs +5 -1
package/.duaer/active-job.json
CHANGED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"status": "accepted",
|
|
3
|
+
"acceptedAt": "2026-09-19T13:32:00.000Z",
|
|
4
|
+
"verification": {
|
|
5
|
+
"levels": ["L0"],
|
|
6
|
+
"commands": ["gh release v0.23.1", "npm view duaer-spec@0.23.1 → 0.23.1"],
|
|
7
|
+
"result": "pass"
|
|
8
|
+
},
|
|
9
|
+
"summary": "Released 0.23.1 (plain-language README features) to GitHub and npm."
|
|
10
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
# Tasks
|
|
2
2
|
|
|
3
|
-
- [
|
|
4
|
-
- [
|
|
5
|
-
- [
|
|
3
|
+
- [x] T001 Bump to 0.23.1 and move CHANGELOG
|
|
4
|
+
- [x] T002 Merge to develop; promote main; push; tag; gh release; npm
|
|
5
|
+
- [x] T003 Stamp accepted
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"status": "accepted",
|
|
3
|
+
"acceptedAt": "2026-09-19T13:35:00.000Z",
|
|
4
|
+
"verification": {
|
|
5
|
+
"levels": ["L0"],
|
|
6
|
+
"commands": ["rg -n '人话|plain language\\)' README.zh-CN.md README.md → no heading matches"],
|
|
7
|
+
"result": "pass"
|
|
8
|
+
},
|
|
9
|
+
"summary": "README feature headings no longer use 人话 / (plain language) meta labels."
|
|
10
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# Spec: Drop meta 人话 label from README headings
|
|
2
|
+
|
|
3
|
+
## Goal
|
|
4
|
+
|
|
5
|
+
README feature sections must not put「人话」or “(plain language)” in the
|
|
6
|
+
heading / copy as a meta label.
|
|
7
|
+
|
|
8
|
+
## Acceptance
|
|
9
|
+
|
|
10
|
+
- [ ] Chinese heading is「我们有什么」only (no「人话」in that section title or bullets as a label)
|
|
11
|
+
- [ ] English heading is「What you get」only
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"status": "accepted",
|
|
3
|
+
"acceptedAt": "2026-09-19T13:45:00.000Z",
|
|
4
|
+
"verification": {
|
|
5
|
+
"levels": ["L0", "L1"],
|
|
6
|
+
"commands": ["npm test (175 pass)"],
|
|
7
|
+
"result": "pass"
|
|
8
|
+
},
|
|
9
|
+
"summary": "Deploy digital employee (role deploy) + README hosting options table."
|
|
10
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# Spec: Deploy digital employee + docs for hosting options
|
|
2
|
+
|
|
3
|
+
## Goal
|
|
4
|
+
|
|
5
|
+
Add a **Deploy** digital employee to the desk catalog (role `deploy`), tag
|
|
6
|
+
deploy tasks with that role, and document supported hosting options in
|
|
7
|
+
READMEs (and live-desk) in plain product copy — no meta「人话」label.
|
|
8
|
+
|
|
9
|
+
## In scope
|
|
10
|
+
|
|
11
|
+
- Catalog + i18n (zh/en/ja) for deployer
|
|
12
|
+
- `buildTaskPoolFromModules` deploy task → `role: deploy`
|
|
13
|
+
- Multi-worker: deploy tasks on last lane (with verify-l3) when N≥2
|
|
14
|
+
- README.zh-CN / README.md: deploy employee + supported methods list
|
|
15
|
+
- live-desk.md + CHANGELOG + tests
|
|
16
|
+
|
|
17
|
+
## Acceptance
|
|
18
|
+
|
|
19
|
+
- [ ] Employee directory shows 部署员工 / Deployer
|
|
20
|
+
- [ ] Deploy pool tasks use `{deploy}`; docs list Cloudflare / 阿里云 / AWS / GitHub Pages / 暂不部署
|
|
21
|
+
- [ ] npm test passes
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"status": "accepted",
|
|
3
|
+
"acceptedAt": "2026-09-19T14:00:00.000Z",
|
|
4
|
+
"verification": {
|
|
5
|
+
"levels": ["L0", "L1"],
|
|
6
|
+
"commands": ["npm test (177 pass)", "key parity 493 for 8 new locales"],
|
|
7
|
+
"result": "pass"
|
|
8
|
+
},
|
|
9
|
+
"summary": "Added ko/zh-TW/es/pt-BR/fr/de/ru/vi live-desk locales with full English key parity."
|
|
10
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# Spec: Common live-desk locales beyond zh/en/ja
|
|
2
|
+
|
|
3
|
+
## Goal
|
|
4
|
+
|
|
5
|
+
Add commonly used desk languages with **complete** catalogs matching English
|
|
6
|
+
keys, wired into the language select and locale detection.
|
|
7
|
+
|
|
8
|
+
## Locales (in addition to zh-CN, en, ja)
|
|
9
|
+
|
|
10
|
+
| Code | Label |
|
|
11
|
+
|---|---|
|
|
12
|
+
| `ko` | 한국어 |
|
|
13
|
+
| `zh-TW` | 繁體中文 |
|
|
14
|
+
| `es` | Español |
|
|
15
|
+
| `pt-BR` | Português (Brasil) |
|
|
16
|
+
| `fr` | Français |
|
|
17
|
+
| `de` | Deutsch |
|
|
18
|
+
| `ru` | Русский |
|
|
19
|
+
| `vi` | Tiếng Việt |
|
|
20
|
+
|
|
21
|
+
## Acceptance
|
|
22
|
+
|
|
23
|
+
- [ ] Each new catalog has exact key parity with `en`
|
|
24
|
+
- [ ] Language `<select>` lists all locales; `detectLocale` / `setLocale` work
|
|
25
|
+
- [ ] Date/list separators and deliverables `lang` degrade gracefully
|
|
26
|
+
- [ ] Tests assert parity for all new locales; README notes the languages
|
|
27
|
+
- [ ] npm test passes
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# 216 — Release 0.24.0
|
|
2
|
+
|
|
3
|
+
## Goal
|
|
4
|
+
|
|
5
|
+
Ship 0.24.0: deploy digital employee, common locales, README polish.
|
|
6
|
+
Bump, CHANGELOG, promote develop → main, push, GitHub Release, npm.
|
|
7
|
+
|
|
8
|
+
## Acceptance
|
|
9
|
+
|
|
10
|
+
1. `package.json` is `0.24.0`; CHANGELOG has `0.24.0` (Unreleased cleared).
|
|
11
|
+
2. Tag `v0.24.0` on main; GitHub Release published.
|
|
12
|
+
3. npm shows `duaer-spec@0.24.0`.
|
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,24 @@
|
|
|
2
2
|
|
|
3
3
|
## Unreleased
|
|
4
4
|
|
|
5
|
+
## 0.24.0 — 2026-09-19
|
|
6
|
+
|
|
7
|
+
### Feat: common live-desk locales beyond zh/en/ja
|
|
8
|
+
|
|
9
|
+
- Language select adds 繁體中文 / 한국어 / Español / Português / Français /
|
|
10
|
+
Deutsch / Русский / Tiếng Việt (full catalog parity with English)
|
|
11
|
+
- Browser language detection covers the new codes
|
|
12
|
+
|
|
13
|
+
### Feat: deploy digital employee + documented hosting options
|
|
14
|
+
|
|
15
|
+
- Employee directory adds **Deployer** (`role: deploy`); deploy tasks use that role
|
|
16
|
+
- Multi-worker puts deploy (with verify-l3) on the last lane
|
|
17
|
+
- READMEs list supported hosts: none / GitHub Pages / Cloudflare / 阿里云 / AWS
|
|
18
|
+
|
|
19
|
+
### Docs: drop meta labels from README feature headings
|
|
20
|
+
|
|
21
|
+
- Section titles are「我们有什么」/「What you get」without a meta tag in the title
|
|
22
|
+
|
|
5
23
|
## 0.23.1 — 2026-09-19
|
|
6
24
|
|
|
7
25
|
### Docs: plain-language feature overview in READMEs
|
package/README.md
CHANGED
|
@@ -45,7 +45,7 @@ Install writes host adapters for each (see [`ADOPT.md`](ADOPT.md)).
|
|
|
45
45
|
|
|
46
46
|
Chinese guide: [`README.zh-CN.md`](README.zh-CN.md)
|
|
47
47
|
|
|
48
|
-
## What you get
|
|
48
|
+
## What you get
|
|
49
49
|
|
|
50
50
|
After install, these are the capabilities you actually use:
|
|
51
51
|
|
|
@@ -66,11 +66,24 @@ A local web desk (`duaer live`) for “chat → confirm → dispatch → watch
|
|
|
66
66
|
- **Architecture diagram.** After requirements, review the system diagram; click it for fullscreen; kickoff waits until architecture is confirmed.
|
|
67
67
|
- **Dispatch digital employees to code.** Pick a product folder and Cursor Agent or Claude Code; work happens in an isolated worktree, not directly on your long-lived branches.
|
|
68
68
|
- **Visible task progress.** Work is a checklist; each finished item is checked off and the desk refreshes; dependent tasks release in waves so agents don’t pile on blocked work.
|
|
69
|
-
- **Employee roles.** Top-bar **digital employee** directory: Implementer builds features; Functional regression verifies against acceptance and testing rules. Optional parallel workers on the same CLI.
|
|
70
|
-
- **zh-CN
|
|
69
|
+
- **Employee roles.** Top-bar **digital employee** directory: **Implementer** builds features; **Functional regression** verifies against acceptance and testing rules; **Deployer** ships to the planned host. Optional parallel workers on the same CLI.
|
|
70
|
+
- **Locales.** Desk UI: zh-CN, zh-TW, en, ja, ko, es, pt-BR, fr, de, ru, vi.
|
|
71
71
|
- **Deliverables and results.** Open a deliverables page (requirements, architecture, tasks, delivery); when done, open the page or the project folder.
|
|
72
72
|
- **Revise when it’s not right.** Continue in left chat → re-confirm → relaunch on the same job without starting from scratch.
|
|
73
|
-
|
|
73
|
+
|
|
74
|
+
### Deploy: supported hosts
|
|
75
|
+
|
|
76
|
+
Before kickoff, pick a **planned host** on the desk. Coding follows that platform; the **Deployer** employee publishes and writes the public URL into delivery preview.
|
|
77
|
+
|
|
78
|
+
| Option | Good for | You prepare |
|
|
79
|
+
|---|---|---|
|
|
80
|
+
| **No deploy yet** | Local delivery only | Nothing |
|
|
81
|
+
| **GitHub Pages** | Static / docs sites; default when hosting is implied but no host was chosen | GitHub repo + `gh` auth |
|
|
82
|
+
| **Cloudflare** | Pages for static; Workers for edge APIs | API Token + Account ID in desk Settings |
|
|
83
|
+
| **Alibaba Cloud** | OSS (+ CDN) for static; Function Compute and similar for APIs | AccessKey in desk Settings |
|
|
84
|
+
| **AWS** | S3 + CloudFront for static; Amplify / Lambda and similar when needed | Access keys in desk Settings |
|
|
85
|
+
|
|
86
|
+
Detail: [`docs/agent/deploy-targets.md`](docs/agent/deploy-targets.md) · GitHub default path: [`docs/agent/deploy-github.md`](docs/agent/deploy-github.md)
|
|
74
87
|
|
|
75
88
|
### Repo habits (for humans and employees)
|
|
76
89
|
|
package/README.zh-CN.md
CHANGED
|
@@ -12,13 +12,13 @@
|
|
|
12
12
|
|
|
13
13
|
`init` / `update` 会写入各宿主适配文件(详见 [`ADOPT.md`](ADOPT.md))。
|
|
14
14
|
|
|
15
|
-
##
|
|
15
|
+
## 我们有什么
|
|
16
16
|
|
|
17
17
|
装好之后,你主要用到的是这些能力:
|
|
18
18
|
|
|
19
19
|
### 在编辑器里:数字员工帮你干活
|
|
20
20
|
|
|
21
|
-
-
|
|
21
|
+
- **你平常怎么说,就怎么交代。** 不用记 slash 命令、不用自己点「写 Spec / 拆任务」。
|
|
22
22
|
- **先谈清楚再动手。** 它会把你的想法整理成:要做什么、不做什么、怎样算做完。
|
|
23
23
|
- **做完才算完。** 对照验收通过才会说「交付好了」;半成品不会假装完成。
|
|
24
24
|
- **多宿主可用。** Cursor、Claude Code、Codex、Copilot、Windsurf、Cline、Continue、Gemini、Aider 都行。
|
|
@@ -33,11 +33,24 @@
|
|
|
33
33
|
- **系统架构图。** 确认需求后一起看架构;点图可全屏查看;架构确认后才能派工。
|
|
34
34
|
- **一键派数字员工写代码。** 选产品目录、选 Cursor Agent 或 Claude Code,点开工;它在隔离目录里改代码,不直接乱动你的主分支。
|
|
35
35
|
- **任务进度看得见。** 任务拆成一条条可勾选项;做完勾一项,台面实时刷新;有依赖的任务会排队放行,不会一窝蜂乱做。
|
|
36
|
-
- **数字员工分工。**
|
|
37
|
-
- **中 / 英 /
|
|
36
|
+
- **数字员工分工。** 顶部有「数字员工」目录:**实现员工**写功能,**功能回归**按验收和测试规则验,**部署员工**按你选的托管平台上线;可开多个并行(同一套 CLI)。
|
|
37
|
+
- **中 / 繁中 / 英 / 日 / 韩 / 西 / 葡 / 法 / 德 / 俄 / 越界面。** 台面文案可切换语种。
|
|
38
38
|
- **看交付物和结果。** 可打开交付物页(需求、架构、任务、交付记录);做完了可打开页面或项目文件夹。
|
|
39
39
|
- **不满意就继续改。** 左侧继续聊改进 → 再确认 → 同一次任务上续派,不用从头建仓。
|
|
40
|
-
|
|
40
|
+
|
|
41
|
+
### 部署:支持的几种方式
|
|
42
|
+
|
|
43
|
+
开工前在台面选 **计划托管平台**。选好后,数字员工按该平台约束写代码,并由**部署员工**负责上线(把公网地址写进交付预览)。
|
|
44
|
+
|
|
45
|
+
| 方式 | 适合做什么 | 你要准备什么 |
|
|
46
|
+
|---|---|---|
|
|
47
|
+
| **暂不部署** | 只在本地做完、先不发公网 | 无 |
|
|
48
|
+
| **GitHub Pages** | 静态站 / 文档站;未选平台但文案要上线时的默认 | GitHub 仓库与 `gh` 登录 |
|
|
49
|
+
| **Cloudflare** | 静态站用 Pages;接口 / 边缘逻辑用 Workers | 在台面设置里保存 API Token 与 Account ID |
|
|
50
|
+
| **阿里云** | 静态多用 OSS(+ CDN);接口可用函数计算等 | 在台面设置里保存 AccessKey |
|
|
51
|
+
| **AWS** | 静态多用 S3 + CloudFront;也可用 Amplify / Lambda 等 | 在台面设置里保存 Access Key |
|
|
52
|
+
|
|
53
|
+
细则:[`docs/agent/deploy-targets.md`](docs/agent/deploy-targets.md) · GitHub 默认路径:[`docs/agent/deploy-github.md`](docs/agent/deploy-github.md)
|
|
41
54
|
|
|
42
55
|
### 仓库规矩(给协作和数字员工用)
|
|
43
56
|
|
package/bin/live-modules.mjs
CHANGED
|
@@ -335,7 +335,7 @@ export function buildTaskPoolFromModules(modules, { deployNeeded = false, deploy
|
|
|
335
335
|
deployTaskText ||
|
|
336
336
|
"Deploy with GitHub CLI (`gh`) + Actions; write public URL to preview.url",
|
|
337
337
|
dependsOn: [tasks[tasks.length - 1].id],
|
|
338
|
-
role: EMPLOYEE_ROLES.
|
|
338
|
+
role: EMPLOYEE_ROLES.DEPLOY,
|
|
339
339
|
});
|
|
340
340
|
}
|
|
341
341
|
|
|
@@ -361,7 +361,7 @@ ${lines.join("\n")}
|
|
|
361
361
|
|
|
362
362
|
做完一步就立刻把对应项改成 \`- [x]\`,方便 Duaer-spec FDE 监控进度与编排放行。
|
|
363
363
|
|
|
364
|
-
**角色:** \`{implement}\` 实现员工 · \`{verify-l3}\`
|
|
364
|
+
**角色:** \`{implement}\` 实现员工 · \`{verify-l3}\` 功能回归 · \`{deploy}\` 部署员工(Cloudflare / 阿里云 / AWS / GitHub Pages)
|
|
365
365
|
|
|
366
366
|
**原子任务规则(强制):**
|
|
367
367
|
- 每个勾选项只做一个可独立验证的功能点;不要把多项验收揉进同一条
|
|
@@ -374,7 +374,7 @@ ${lines.join("\n")}
|
|
|
374
374
|
/**
|
|
375
375
|
* Assign tasks to 1..N workers (same CLI family). Ready roots fan out;
|
|
376
376
|
* dependent tasks inherit the worker of their first dependency when possible.
|
|
377
|
-
* When count ≥ 2, verify-l3 tasks go to the last lane
|
|
377
|
+
* When count ≥ 2, verify-l3 and deploy tasks go to the last lane.
|
|
378
378
|
*/
|
|
379
379
|
export function assignTasksToWorkers(pool, workerCount = 1) {
|
|
380
380
|
const count = Math.max(1, Math.min(8, Number(workerCount) || 1));
|
|
@@ -415,10 +415,15 @@ export function assignTasksToWorkers(pool, workerCount = 1) {
|
|
|
415
415
|
if (!t.moduleId) t.workerId = "w1";
|
|
416
416
|
}
|
|
417
417
|
|
|
418
|
-
// Regression
|
|
419
|
-
const
|
|
418
|
+
// Regression + deploy employees own the last lane when multiple workers.
|
|
419
|
+
const specialtyLane = `w${count}`;
|
|
420
420
|
for (const t of tasks) {
|
|
421
|
-
if (
|
|
421
|
+
if (
|
|
422
|
+
t.role === EMPLOYEE_ROLES.VERIFY_L3 ||
|
|
423
|
+
t.role === EMPLOYEE_ROLES.DEPLOY
|
|
424
|
+
) {
|
|
425
|
+
t.workerId = specialtyLane;
|
|
426
|
+
}
|
|
422
427
|
}
|
|
423
428
|
|
|
424
429
|
return { workerCount: count, tasks };
|
|
@@ -52,7 +52,7 @@ the table for their app.
|
|
|
52
52
|
| E2E-035 | After handoff removes worktree, status/preview work; revise recreates wt | manual |
|
|
53
53
|
| E2E-036 | Confirm card unchanged; revise card stays in bottom panel | manual |
|
|
54
54
|
| E2E-037 | Preview/revise CTAs hidden until delivery accepted | manual |
|
|
55
|
-
| E2E-038 | Live desk language switch (zh-CN / en / ja) updates copy; reload keeps locale | manual |
|
|
55
|
+
| E2E-038 | Live desk language switch (zh-CN / zh-TW / en / ja / ko / es / pt-BR / fr / de / ru / vi) updates copy; reload keeps locale | manual |
|
|
56
56
|
| E2E-039 | After accept, revise confirm starts agent (fresh session if needed); stale runner opens new Terminal; revise card uses dark plate style | manual |
|
|
57
57
|
| E2E-040 | Live desk: left chat + right card stay viewport-aligned; right auto-scrolls to active stage on real stage changes — not on every status poll; manual scroll in 需求/运行 is held ~12s | manual |
|
|
58
58
|
| E2E-041 | Busy Terminal runner: revise/dispatch enqueue waits (no interrupt) while job is still in progress; after accept, see E2E-047 | manual |
|
|
@@ -143,7 +143,7 @@ the table for their app.
|
|
|
143
143
|
| E2E-162 | Architecture / task-path click opens present=1 fullscreen in a new tab | `npm test` + `npm run test:live` |
|
|
144
144
|
| E2E-163 | Task breakdown: multi-line acceptance → one atomic checkbox task per line; progress monitorable via `- [ ]`/`- [x]` | `npm test` |
|
|
145
145
|
| E2E-164 | Live desk Japanese (`ja`) locale: select option, catalog parity with en, deliverables `lang=ja` | `npm test` + manual |
|
|
146
|
-
| E2E-165 | Top 数字员工 directory lists Implementer + Functional regression; kickoff tasks carry role | `npm test` + `npm run test:live` |
|
|
146
|
+
| E2E-165 | Top 数字员工 directory lists Implementer + Functional regression + Deployer; kickoff tasks carry role | `npm test` + `npm run test:live` |
|
|
147
147
|
| E2E-093 | Header top actions share one button chrome; GitHub control links to duaer-spec and shows live stars via `/api/github` | `npm run test:live` + manual |
|
|
148
148
|
| E2E-063 | Duaer-spec FDE brand: header/title show Duaer-spec FDE; zh secondary mark is 现场开发; en mark is Field Development Environment; setup hint / desk-model guide name Duaer | `npm test` + manual |
|
|
149
149
|
| E2E-078 | Claude Terminal launch includes `--permission-mode bypassPermissions` and stamps `hasTrustDialogAccepted` for the worktree | `npm test` + manual |
|
|
@@ -333,4 +333,4 @@ the table for their app.
|
|
|
333
333
|
| E2E-162 | `201-arch-fullscreen` | architecture click → present fullscreen |
|
|
334
334
|
| E2E-163 | `203-atomic-monitorable-tasks` | atomic verifiable tasks; checkbox progress |
|
|
335
335
|
| E2E-164 | `204-live-i18n-ja` | Japanese locale on live desk |
|
|
336
|
-
| E2E-165 | `206-employee-directory` | employee directory + verify-l3
|
|
336
|
+
| E2E-165 | `206-employee-directory` / `214-deploy-employee` | employee directory + verify-l3 + deploy roles |
|
package/docs/agent/live-desk.md
CHANGED
|
@@ -75,13 +75,14 @@ registry linking into the requirements document (no duplicate full cards).
|
|
|
75
75
|
Kickoff owns Brief creation and dispatch:
|
|
76
76
|
|
|
77
77
|
- Builds a **dependency-aware task pool** (`dependsOn` edges).
|
|
78
|
-
- **Employee directory** (top bar): lists specialized roles — **Implementer
|
|
79
|
-
|
|
78
|
+
- **Employee directory** (top bar): lists specialized roles — **Implementer**,
|
|
79
|
+
**Functional regression** (Acceptance → testing.md L0–L3 / Playwright), and
|
|
80
|
+
**Deployer** (planned host: Cloudflare / Alibaba Cloud / AWS / GitHub Pages).
|
|
80
81
|
Runtime remains Cursor Agent / Claude Code; kickoff tasks carry
|
|
81
|
-
`role: implement | verify-l3`. With workerCount ≥ 2, verify-l3
|
|
82
|
-
the last lane.
|
|
82
|
+
`role: implement | verify-l3 | deploy`. With workerCount ≥ 2, verify-l3 and
|
|
83
|
+
deploy tasks go to the last lane.
|
|
83
84
|
- **Atomic + monitorable:** one checkbox task per independently verifiable
|
|
84
|
-
acceptance line (plus impl / verify / shared steps). Agents must mark
|
|
85
|
+
acceptance line (plus impl / verify / deploy / shared steps). Agents must mark
|
|
85
86
|
`- [x]` as each atom completes so the desk can poll progress and release waves.
|
|
86
87
|
- **Worker count** defaults to **1**. Optional **N** parallel workers on the
|
|
87
88
|
**same** CLI (Cursor Agent or Claude Code — not mixed).
|
package/package.json
CHANGED
package/web/live-dev/app.js
CHANGED
|
@@ -29,20 +29,36 @@ import { EMPLOYEE_CATALOG } from "./employee-catalog.mjs";
|
|
|
29
29
|
/** Deliverables API lang: en | ja | zh */
|
|
30
30
|
function deliverablesLang() {
|
|
31
31
|
const loc = getLocale();
|
|
32
|
-
if (loc === "en") return
|
|
33
|
-
if (loc === "
|
|
34
|
-
|
|
32
|
+
if (loc === "en" || loc === "ja") return loc;
|
|
33
|
+
if (loc === "zh-TW" || loc === "zh-CN") return "zh";
|
|
34
|
+
// Other desk locales: deliverables page uses English stage chrome for now.
|
|
35
|
+
return "en";
|
|
35
36
|
}
|
|
36
37
|
|
|
37
38
|
function localeListJoin(items) {
|
|
38
|
-
|
|
39
|
+
const loc = getLocale();
|
|
40
|
+
if (loc === "zh-CN" || loc === "zh-TW" || loc === "ja" || loc === "ko") {
|
|
41
|
+
return items.join("、");
|
|
42
|
+
}
|
|
43
|
+
return items.join(", ");
|
|
39
44
|
}
|
|
40
45
|
|
|
41
46
|
function localeDateTag() {
|
|
42
47
|
const loc = getLocale();
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
48
|
+
const map = {
|
|
49
|
+
en: "en-US",
|
|
50
|
+
ja: "ja-JP",
|
|
51
|
+
ko: "ko-KR",
|
|
52
|
+
"zh-CN": "zh-CN",
|
|
53
|
+
"zh-TW": "zh-TW",
|
|
54
|
+
es: "es-ES",
|
|
55
|
+
"pt-BR": "pt-BR",
|
|
56
|
+
fr: "fr-FR",
|
|
57
|
+
de: "de-DE",
|
|
58
|
+
ru: "ru-RU",
|
|
59
|
+
vi: "vi-VN",
|
|
60
|
+
};
|
|
61
|
+
return map[loc] || "en-US";
|
|
46
62
|
}
|
|
47
63
|
|
|
48
64
|
const FALLBACK_PROVIDERS = [
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
export const EMPLOYEE_ROLES = {
|
|
7
7
|
IMPLEMENT: "implement",
|
|
8
8
|
VERIFY_L3: "verify-l3",
|
|
9
|
+
DEPLOY: "deploy",
|
|
9
10
|
};
|
|
10
11
|
|
|
11
12
|
/** Built-in catalog (id stable for i18n keys employee.<id>.*). */
|
|
@@ -22,6 +23,12 @@ export const EMPLOYEE_CATALOG = [
|
|
|
22
23
|
runtime: "cursor-or-claude",
|
|
23
24
|
defaultOn: true,
|
|
24
25
|
},
|
|
26
|
+
{
|
|
27
|
+
id: "deployer",
|
|
28
|
+
role: EMPLOYEE_ROLES.DEPLOY,
|
|
29
|
+
runtime: "cursor-or-claude",
|
|
30
|
+
defaultOn: true,
|
|
31
|
+
},
|
|
25
32
|
];
|
|
26
33
|
|
|
27
34
|
export function employeeByRole(role) {
|
|
@@ -31,6 +38,7 @@ export function employeeByRole(role) {
|
|
|
31
38
|
export function clipEmployeeRole(raw) {
|
|
32
39
|
const r = String(raw || "").trim();
|
|
33
40
|
if (r === EMPLOYEE_ROLES.VERIFY_L3) return EMPLOYEE_ROLES.VERIFY_L3;
|
|
41
|
+
if (r === EMPLOYEE_ROLES.DEPLOY) return EMPLOYEE_ROLES.DEPLOY;
|
|
34
42
|
return EMPLOYEE_ROLES.IMPLEMENT;
|
|
35
43
|
}
|
|
36
44
|
|
|
@@ -50,5 +58,10 @@ export function rolePromptZh(roles) {
|
|
|
50
58
|
"【角色·功能回归】只做 role=verify-l3 任务:对照 Acceptance,按产品 .duaer/memory/testing.md 跑确定性回归(优先 Playwright / npm test / npm run test:live 等 L0–L3);写/补测试、执行并记录证据;不要改业务功能范围。失败则留下可复现说明,不要 stamp accepted。",
|
|
51
59
|
);
|
|
52
60
|
}
|
|
61
|
+
if (set.has(EMPLOYEE_ROLES.DEPLOY)) {
|
|
62
|
+
parts.push(
|
|
63
|
+
"【角色·部署】只做 role=deploy 任务:按台面选定的计划托管平台(Cloudflare / 阿里云 / AWS / GitHub Pages)完成上线;把公网 URL 写入 delivery.preview.url;不要改业务功能范围。密钥只用环境变量 / 平台密钥管理,不进仓库。",
|
|
64
|
+
);
|
|
65
|
+
}
|
|
53
66
|
return parts.join("\n");
|
|
54
67
|
}
|