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.
Files changed (35) hide show
  1. package/.duaer/active-job.json +2 -2
  2. package/.duaer/specs/212-release-0231/delivery.json +10 -0
  3. package/.duaer/specs/212-release-0231/tasks.md +3 -3
  4. package/.duaer/specs/213-drop-renhua-label/delivery.json +10 -0
  5. package/.duaer/specs/213-drop-renhua-label/spec.md +11 -0
  6. package/.duaer/specs/213-drop-renhua-label/tasks.md +4 -0
  7. package/.duaer/specs/214-deploy-employee/delivery.json +10 -0
  8. package/.duaer/specs/214-deploy-employee/spec.md +21 -0
  9. package/.duaer/specs/214-deploy-employee/tasks.md +6 -0
  10. package/.duaer/specs/215-live-i18n-common/delivery.json +10 -0
  11. package/.duaer/specs/215-live-i18n-common/spec.md +27 -0
  12. package/.duaer/specs/215-live-i18n-common/tasks.md +5 -0
  13. package/.duaer/specs/216-release-024/spec.md +12 -0
  14. package/.duaer/specs/216-release-024/tasks.md +5 -0
  15. package/CHANGELOG.md +18 -0
  16. package/README.md +17 -4
  17. package/README.zh-CN.md +18 -5
  18. package/bin/live-modules.mjs +11 -6
  19. package/docs/agent/e2e-test-plan.md +3 -3
  20. package/docs/agent/live-desk.md +6 -5
  21. package/package.json +1 -1
  22. package/web/live-dev/app.js +23 -7
  23. package/web/live-dev/employee-catalog.mjs +13 -0
  24. package/web/live-dev/i18n-de.js +496 -0
  25. package/web/live-dev/i18n-es.js +496 -0
  26. package/web/live-dev/i18n-fr.js +496 -0
  27. package/web/live-dev/i18n-ja.js +3 -1
  28. package/web/live-dev/i18n-ko.js +496 -0
  29. package/web/live-dev/i18n-pt-BR.js +496 -0
  30. package/web/live-dev/i18n-ru.js +496 -0
  31. package/web/live-dev/i18n-vi.js +496 -0
  32. package/web/live-dev/i18n-zh-TW.js +496 -0
  33. package/web/live-dev/i18n.js +50 -5
  34. package/web/live-dev/index.html +8 -0
  35. package/web/live-dev/task-graph.mjs +5 -1
@@ -1,4 +1,4 @@
1
1
  {
2
- "feature": "212-release-0231",
3
- "specDir": ".duaer/specs/212-release-0231"
2
+ "feature": "216-release-024",
3
+ "specDir": ".duaer/specs/216-release-024"
4
4
  }
@@ -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
- - [ ] T001 Bump to 0.23.1 and move CHANGELOG
4
- - [ ] T002 Merge to develop; promote main; push; tag; gh release; npm
5
- - [ ] T003 Stamp accepted
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,4 @@
1
+ # Tasks
2
+
3
+ - [x] T001 Remove 人话 / plain-language meta labels from README headings
4
+ - [x] T002 CHANGELOG + stamp
@@ -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,6 @@
1
+ # Tasks
2
+
3
+ - [x] T001 Catalog + role wiring + assign last lane
4
+ - [x] T002 i18n zh/en/ja
5
+ - [x] T003 README + live-desk docs for deploy methods
6
+ - [x] T004 Tests, CHANGELOG, stamp
@@ -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,5 @@
1
+ # Tasks
2
+
3
+ - [x] T001 Locale catalogs ko/zh-TW/es/pt-BR/fr/de/ru/vi (en key parity)
4
+ - [x] T002 Wire LOCALES, select, detectLocale, date/join helpers
5
+ - [x] T003 Tests + README/CHANGELOG; stamp accepted
@@ -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`.
@@ -0,0 +1,5 @@
1
+ # Tasks
2
+
3
+ - [ ] T001 Bump to 0.24.0 and move CHANGELOG
4
+ - [ ] T002 Promote main; push; tag; gh release; npm
5
+ - [ ] T003 Stamp accepted
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 (plain language)
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 / en / ja UI.** Desk copy follows the language you pick.
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
- - **Hosting when you need it.** Cloudflare / Alibaba Cloud / AWS / GitHub Pages; default is GitHub Actions when unset.
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
- - **你说人话,它自己跑流程。** 不用记 slash 命令、不用自己点「写 Spec / 拆任务」。
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
- - **数字员工分工。** 顶部有「数字员工」目录:实现员工负责写功能,功能回归负责按验收和测试规则验;可开多个并行(同一套 CLI)。
37
- - **中 / 英 / 日界面。** 台面文案可切换语种。
36
+ - **数字员工分工。** 顶部有「数字员工」目录:**实现员工**写功能,**功能回归**按验收和测试规则验,**部署员工**按你选的托管平台上线;可开多个并行(同一套 CLI)。
37
+ - **中 / 繁中 / 英 / / 韩 / 西 / 葡 / 法 / 德 / 俄 / 越界面。** 台面文案可切换语种。
38
38
  - **看交付物和结果。** 可打开交付物页(需求、架构、任务、交付记录);做完了可打开页面或项目文件夹。
39
39
  - **不满意就继续改。** 左侧继续聊改进 → 再确认 → 同一次任务上续派,不用从头建仓。
40
- - **要上线时可选托管。** Cloudflare / 阿里云 / AWS / GitHub Pages;没选时默认走 GitHub Actions。
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
 
@@ -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.IMPLEMENT,
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}\` 功能回归(Acceptance testing.md L0–L3 / Playwright
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 (regression employee).
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 employee owns the last lane when multiple workers.
419
- const verifyLane = `w${count}`;
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 (t.role === EMPLOYEE_ROLES.VERIFY_L3) t.workerId = verifyLane;
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 role |
336
+ | E2E-165 | `206-employee-directory` / `214-deploy-employee` | employee directory + verify-l3 + deploy roles |
@@ -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
- and **Functional regression** (Acceptance → testing.md L0–L3 / Playwright).
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 tasks go to
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "duaer-spec",
3
- "version": "0.23.1",
3
+ "version": "0.24.0",
4
4
  "description": "Norms → satisfactory delivery: digital employees for Cursor, Claude, Codex, Copilot, Windsurf, Cline, Continue, Gemini, Aider",
5
5
  "type": "module",
6
6
  "bin": {
@@ -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 "en";
33
- if (loc === "ja") return "ja";
34
- return "zh";
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
- return items.join(getLocale() === "en" ? ", " : "、");
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
- if (loc === "en") return "en-US";
44
- if (loc === "ja") return "ja-JP";
45
- return "zh-CN";
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
  }