duaer-spec 0.25.1 → 0.26.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 (60) hide show
  1. package/.claude/rules/ai-ui-copy.md +2 -2
  2. package/.cursor/rules/ai-ui-copy.mdc +3 -3
  3. package/.cursor/rules/fde-8787-only.mdc +7 -7
  4. package/.duaer/active-job.json +3 -3
  5. package/.duaer/specs/252-release-0251/delivery.json +14 -0
  6. package/.duaer/specs/252-release-0251/tasks.md +1 -1
  7. package/.duaer/specs/253-docs-cursor-claude/delivery.json +9 -0
  8. package/.duaer/specs/253-docs-cursor-claude/spec.md +25 -0
  9. package/.duaer/specs/253-docs-cursor-claude/tasks.md +3 -0
  10. package/.duaer/specs/254-console-rename/delivery.json +13 -0
  11. package/.duaer/specs/254-console-rename/spec.md +27 -0
  12. package/.duaer/specs/254-console-rename/tasks.md +4 -0
  13. package/.duaer/specs/255-dispatch-arch-view/delivery.json +13 -0
  14. package/.duaer/specs/255-dispatch-arch-view/spec.md +16 -0
  15. package/.duaer/specs/255-dispatch-arch-view/tasks.md +4 -0
  16. package/.duaer/specs/256-chat-voice/delivery.json +13 -0
  17. package/.duaer/specs/256-chat-voice/spec.md +15 -0
  18. package/.duaer/specs/256-chat-voice/tasks.md +6 -0
  19. package/.duaer/specs/257-composer-voice-compact/delivery.json +9 -0
  20. package/.duaer/specs/257-composer-voice-compact/spec.md +13 -0
  21. package/.duaer/specs/257-composer-voice-compact/tasks.md +4 -0
  22. package/.duaer/specs/258-chat-stt/delivery.json +14 -0
  23. package/.duaer/specs/258-chat-stt/spec.md +16 -0
  24. package/.duaer/specs/258-chat-stt/tasks.md +5 -0
  25. package/.duaer/specs/259-voice-guide-stt/delivery.json +13 -0
  26. package/.duaer/specs/259-voice-guide-stt/spec.md +13 -0
  27. package/.duaer/specs/259-voice-guide-stt/tasks.md +4 -0
  28. package/.duaer/specs/260-release-026/delivery.json +18 -0
  29. package/.duaer/specs/260-release-026/spec.md +12 -0
  30. package/.duaer/specs/260-release-026/tasks.md +5 -0
  31. package/ADOPT.md +7 -4
  32. package/AGENTS.md +2 -2
  33. package/CHANGELOG.md +38 -0
  34. package/README.md +29 -25
  35. package/README.zh-CN.md +21 -21
  36. package/bin/duaer-live.mjs +186 -8
  37. package/bin/live-bug-context.mjs +1 -1
  38. package/bin/live-deliverables.mjs +1 -1
  39. package/bin/live-verify-gate.mjs +2 -2
  40. package/docs/agent/e2e-test-plan.md +8 -0
  41. package/docs/agent/live-desk.md +9 -6
  42. package/docs/agent/worker-models.md +7 -5
  43. package/docs/agent/worker-models.zh-CN.md +5 -3
  44. package/package.json +5 -5
  45. package/web/live-dev/app.js +386 -0
  46. package/web/live-dev/dispatch-center.html +25 -1
  47. package/web/live-dev/dispatch-center.js +113 -16
  48. package/web/live-dev/employee-catalog.mjs +2 -2
  49. package/web/live-dev/i18n-de.js +32 -8
  50. package/web/live-dev/i18n-es.js +32 -8
  51. package/web/live-dev/i18n-fr.js +32 -8
  52. package/web/live-dev/i18n-ja.js +32 -8
  53. package/web/live-dev/i18n-ko.js +32 -8
  54. package/web/live-dev/i18n-pt-BR.js +32 -8
  55. package/web/live-dev/i18n-ru.js +32 -8
  56. package/web/live-dev/i18n-vi.js +32 -8
  57. package/web/live-dev/i18n-zh-TW.js +34 -10
  58. package/web/live-dev/i18n.js +67 -19
  59. package/web/live-dev/index.html +55 -9
  60. package/web/live-dev/styles.css +59 -3
@@ -13,7 +13,7 @@ AI-generated pages must not contain redundant explanatory text.
13
13
  Visible live-desk / FDE copy that names the product surface must include the
14
14
  **Duaer** brand (or **Duaer-spec FDE** where that full mark is already used).
15
15
 
16
- - Do not write anonymous「台面」/desk” alone when referring to this product’s
17
- chat surface or model setup — prefer「Duaer 台面」/ “Duaer desk
16
+ - Do not write anonymous「控制台」/console” alone when referring to this product’s
17
+ chat surface or model setup — prefer「Duaer 控制台」/ “Duaer console
18
18
  - Keep helper text short; branding is a name signal, not a slogan paragraph
19
19
  - Applies to i18n strings, HTML fallbacks, empty states, and setup/settings copy
@@ -13,10 +13,10 @@ AI-generated pages must not contain redundant explanatory text.
13
13
 
14
14
  ## Duaer brand (site-wide)
15
15
 
16
- Visible live-desk / FDE copy that names the product surface must include the
16
+ Visible live-console / FDE copy that names the product surface must include the
17
17
  **Duaer** brand (or **Duaer-spec FDE** where that full mark is already used).
18
18
 
19
- - Do not write anonymous「台面」/desk” alone when referring to this product’s
20
- chat surface or model setup — prefer「Duaer 台面」/ “Duaer desk
19
+ - Do not write anonymous「控制台」/console” alone when referring to this product’s
20
+ chat surface or model setup — prefer「Duaer 控制台」/ “Duaer console
21
21
  - Keep helper text short; branding is a name signal, not a slogan paragraph
22
22
  - Applies to i18n strings, HTML fallbacks, empty states, and setup/settings copy
@@ -1,11 +1,11 @@
1
1
  ---
2
- description: FDE live desk is only http://127.0.0.1:8787 — never alternate ports
2
+ description: FDE live console is only http://127.0.0.1:8787 — never alternate ports
3
3
  alwaysApply: true
4
4
  ---
5
5
 
6
- # FDE desk port (8787 only)
6
+ # FDE console port (8787 only)
7
7
 
8
- The Duaer-spec FDE desk has **one** URL:
8
+ The Duaer-spec FDE console has **one** URL:
9
9
 
10
10
  `http://127.0.0.1:8787`
11
11
 
@@ -16,16 +16,16 @@ Managed by LaunchAgent `com.duaer.live8787`.
16
16
  - Check / restart with `launchctl kickstart -k "gui/$(id -u)/com.duaer.live8787"`
17
17
  - Verify with `curl -s -o /dev/null -w '%{http_code}\n' http://127.0.0.1:8787/`
18
18
  - After merge handoff, restart that LaunchAgent only (see `.duaer/handoff.json`)
19
- - Open architecture / 派工图 via desk `POST /api/open-external` (OS browser on :8787)
19
+ - Open architecture / 派工图 via console `POST /api/open-external` (OS browser on :8787)
20
20
 
21
21
  ## Do not
22
22
 
23
23
  - Start `node bin/duaer-live.mjs` on any port other than **8787**
24
- - Start a second desk when 8787 is already listening
25
- - Use Cursor Browser / Simple Browser / browser MCP to open the desk or
24
+ - Start a second console when 8787 is already listening
25
+ - Use Cursor Browser / Simple Browser / browser MCP to open the console or
26
26
  architecture present pages — Cursor proxies those as random high ports
27
27
  (`:62489`, `:64074`, …). That is **not** a second FDE server.
28
- - Treat product preview ports (3000, 8081, …) as the FDE desk
28
+ - Treat product preview ports (3000, 8081, …) as the FDE console
29
29
 
30
30
  Interactive `duaer live` may still open the OS browser once; LaunchAgent sets
31
31
  `DUAER_LIVE_NO_BROWSER=1` so kickstart does not spam tabs.
@@ -1,5 +1,5 @@
1
1
  {
2
- "feature": "252-release-0251",
3
- "specPath": ".duaer/specs/252-release-0251/spec.md",
4
- "source": "chat"
2
+ "feature": "260-release-026",
3
+ "branch": "feat/release-026",
4
+ "worktree": ".worktree/feat-release-026"
5
5
  }
@@ -0,0 +1,14 @@
1
+ {
2
+ "status": "accepted",
3
+ "acceptedAt": "2026-09-20T09:25:00.000Z",
4
+ "verification": {
5
+ "levels": ["docs"],
6
+ "commands": ["gh release view v0.25.1", "gh run list --workflow=npm-publish.yml"],
7
+ "result": "pass",
8
+ "notes": "GitHub Release v0.25.1 published; npm Trusted Publishing triggered"
9
+ },
10
+ "preview": {
11
+ "url": "https://github.com/fujiezee/duaer-spec/releases/tag/v0.25.1",
12
+ "label": "GitHub Release v0.25.1"
13
+ }
14
+ }
@@ -1,3 +1,3 @@
1
1
  - [x] T001 Bump package.json to 0.25.1 and fold CHANGELOG
2
2
  - [x] T002 Update README architecture note (en + zh-CN)
3
- - [ ] T003 Merge develop, promote main, push, GitHub release + npm
3
+ - [x] T003 Merge develop, promote main, push, GitHub release + npm
@@ -0,0 +1,9 @@
1
+ {
2
+ "status": "accepted",
3
+ "acceptedAt": "2026-09-20T09:35:00.000Z",
4
+ "verification": {
5
+ "levels": ["docs"],
6
+ "commands": ["docs-only review"],
7
+ "result": "pass"
8
+ }
9
+ }
@@ -0,0 +1,25 @@
1
+ # Docs: Cursor + Claude Code primary; no professional workflow required
2
+
3
+ ## Goal
4
+
5
+ User-facing docs lead with **Cursor** and **Claude Code** as the supported
6
+ way to use Duaer. Copy must say the human does **not** need to learn Spec
7
+ phases, slash commands, or a professional delivery process — install once,
8
+ then talk in normal language.
9
+
10
+ ## In scope
11
+
12
+ - `README.md` / `README.zh-CN.md` hero and “what you get” host bullets
13
+ - Light note in `ADOPT.md` / worker-models if they over-list hosts as “supported”
14
+ - CHANGELOG Unreleased
15
+
16
+ ## Out of scope
17
+
18
+ - Removing init adapters for other hosts (still installed; not the pitch)
19
+ - Product code / FDE UI copy unless README already covers it
20
+
21
+ ## Acceptance
22
+
23
+ 1. Hero no longer pitches the long host list as the primary support claim.
24
+ 2. Explicit: Cursor + Claude Code; no need to understand professional workflow.
25
+ 3. English docs stay CJK-free; Chinese README may keep English product names.
@@ -0,0 +1,3 @@
1
+ - [x] T001 Rewrite README.md + README.zh-CN.md hero / host bullets
2
+ - [x] T002 Align ADOPT.md / worker-models support wording if needed
3
+ - [x] T003 CHANGELOG Unreleased; stamp delivery
@@ -0,0 +1,13 @@
1
+ {
2
+ "status": "accepted",
3
+ "acceptedAt": "2026-09-20T09:40:00.000Z",
4
+ "verification": {
5
+ "levels": ["L0", "L1", "L3"],
6
+ "commands": [
7
+ "node --test test/duaer-fde-brand.test.mjs",
8
+ "npm test",
9
+ "npm run test:live"
10
+ ],
11
+ "result": "pass"
12
+ }
13
+ }
@@ -0,0 +1,27 @@
1
+ # Rename product surface「台面」→「控制台」
2
+
3
+ ## Goal
4
+
5
+ User-visible Chinese copy must say **控制台** (not 台面) for the FDE product
6
+ surface. English parallel: **console** (not desk) in the same user-facing spots.
7
+ Brand form: **Duaer 控制台** / **Duaer console**.
8
+
9
+ ## In scope
10
+
11
+ - live-dev i18n (zh-CN + en + locales that say desk/台面)
12
+ - HTML fallbacks, employee-catalog, duaer-live user messages, README.zh-CN,
13
+ worker-models.zh-CN, brand rules (AGENTS / ai-ui-copy), brand tests
14
+ - README.md “live desk” → “console” where it names the product surface
15
+
16
+ ## Out of scope
17
+
18
+ - Renaming DOM ids (`#desk`), `deskKind`, `live-desk.md` filename, or historical
19
+ Brief folders
20
+ - Rewriting entire CHANGELOG history
21
+
22
+ ## Acceptance
23
+
24
+ 1. No user-facing「台面」in zh i18n / README.zh-CN for the product surface.
25
+ 2. Setup strings use「Duaer 控制台」/ “Duaer console”.
26
+ 3. Brand rules prefer 控制台 / console.
27
+ 4. Brand + live smoke tests updated and pass.
@@ -0,0 +1,4 @@
1
+ - [x] T001 i18n + HTML: 台面/desk → 控制台/console
2
+ - [x] T002 README / worker-models / brand rules
3
+ - [x] T003 Server/user prompts + employee-catalog
4
+ - [x] T004 Tests + CHANGELOG; stamp delivery
@@ -0,0 +1,13 @@
1
+ {
2
+ "status": "accepted",
3
+ "acceptedAt": "2026-09-20T09:50:00.000Z",
4
+ "verification": {
5
+ "levels": ["L0", "L1", "L3"],
6
+ "commands": [
7
+ "node --test test/arch-fullscreen.test.mjs test/task-graph.test.mjs",
8
+ "npm test",
9
+ "npm run test:live"
10
+ ],
11
+ "result": "pass"
12
+ }
13
+ }
@@ -0,0 +1,16 @@
1
+ # Feat: dispatch center — view system architecture per project
2
+
3
+ ## Goal
4
+
5
+ On the **调度中心** (dispatch center) page, each project can show its
6
+ **系统架构** (system architecture diagram), not only the task/dispatch graph.
7
+
8
+ ## Acceptance
9
+
10
+ 1. Dispatch center has a view switch: 派工图 | 系统架构 (per selected project).
11
+ 2. Architecture view loads that project’s saved `architecture.url` from
12
+ `/api/projects/chat`; empty state when missing.
13
+ 3. Switching projects updates both views for the selected project.
14
+ 4. Architecture can open fullscreen via the same open-external path as the
15
+ console (optional button or click).
16
+ 5. i18n (zh + en minimum), live-desk / E2E row, L0–L3 smoke markers pass.
@@ -0,0 +1,4 @@
1
+ - [x] T001 HTML/CSS: stage view tabs (graph | architecture)
2
+ - [x] T002 dispatch-center.js: load & mount project architecture.url
3
+ - [x] T003 i18n + docs/E2E + tests
4
+ - [x] T004 Stamp delivery
@@ -0,0 +1,13 @@
1
+ {
2
+ "status": "accepted",
3
+ "acceptedAt": "2026-09-20T10:00:00.000Z",
4
+ "verification": {
5
+ "levels": ["L0", "L1", "L3"],
6
+ "commands": [
7
+ "node --check web/live-dev/app.js",
8
+ "node --test test/live-i18n-common.test.mjs test/live-i18n-ja.test.mjs",
9
+ "npm run test:live"
10
+ ],
11
+ "result": "pass"
12
+ }
13
+ }
@@ -0,0 +1,15 @@
1
+ # Feat: chat voice input next to Send
2
+
3
+ ## Goal
4
+
5
+ Operators can **record speech** beside Send to collect requirements by talking.
6
+ Transcript lands in the composer (editable), then Send as usual.
7
+
8
+ ## Acceptance
9
+
10
+ 1. Composer has a voice control next to Send (label via i18n).
11
+ 2. Uses browser SpeechRecognition when available; unsupported / denied shows a
12
+ short bot or aria notice — no silent fail.
13
+ 3. Listening state is visible; interim/final text appends into `#input`.
14
+ 4. Voice respects the same enable rules as Send (ready + project + not busy).
15
+ 5. README (en/zh) + live-desk note the voice path; E2E row; L0/L3 smoke pass.
@@ -0,0 +1,6 @@
1
+ # Tasks — 256-chat-voice
2
+
3
+ - [x] T001 HTML/CSS: voice button in composer
4
+ - [x] T002 app.js: SpeechRecognition wire + enable sync
5
+ - [x] T003 i18n (zh/en + locales)
6
+ - [x] T004 Docs + E2E + tests; stamp delivery
@@ -0,0 +1,9 @@
1
+ {
2
+ "status": "accepted",
3
+ "acceptedAt": "2026-09-20T10:05:00.000Z",
4
+ "verification": {
5
+ "levels": ["L0", "L3"],
6
+ "commands": ["node --check web/live-dev/app.js", "npm run test:live"],
7
+ "result": "pass"
8
+ }
9
+ }
@@ -0,0 +1,13 @@
1
+ # Fix: compact composer voice control
2
+
3
+ ## Goal
4
+
5
+ Composer Record + Send sit compact beside the input; the textarea stays on one
6
+ row and is not pushed down or squeezed away.
7
+
8
+ ## Acceptance
9
+
10
+ 1. Composer is one compact row: input + small Record + Send (or input + stacked
11
+ compact actions) without the textarea dropping below the buttons.
12
+ 2. Voice button uses tighter padding / type; listening state still visible.
13
+ 3. L0 + L3 smoke markers still pass; E2E note if layout contract changes.
@@ -0,0 +1,4 @@
1
+ # Tasks — 257-composer-voice-compact
2
+
3
+ - [x] T001 Fix composer CSS/HTML for compact voice+send beside input
4
+ - [x] T002 Smoke assert + brief stamp; merge develop
@@ -0,0 +1,14 @@
1
+ {
2
+ "status": "accepted",
3
+ "acceptedAt": "2026-09-20T10:20:00.000Z",
4
+ "verification": {
5
+ "levels": ["L0", "L1", "L3"],
6
+ "commands": [
7
+ "node --check bin/duaer-live.mjs",
8
+ "node --check web/live-dev/app.js",
9
+ "node --test test/stt-transcribe-url.test.mjs test/live-i18n-common.test.mjs test/live-i18n-ja.test.mjs",
10
+ "npm run test:live"
11
+ ],
12
+ "result": "pass"
13
+ }
14
+ }
@@ -0,0 +1,16 @@
1
+ # Feat: speech-to-text model for composer Record
2
+
3
+ ## Goal
4
+
5
+ After Record stops, decode speech to text via a configurable STT model in
6
+ Settings (alongside the console chat model). Transcript lands in the composer.
7
+
8
+ ## Acceptance
9
+
10
+ 1. Settings has an STT / speech model block (Base URL, API Key, Model) saved in
11
+ live config; OpenAI-compatible `/audio/transcriptions` (e.g. whisper-1).
12
+ 2. Record uses MediaRecorder when STT is configured; stop → `/api/transcribe` →
13
+ text in `#input`. Visible recognizing state; errors are not silent.
14
+ 3. Without STT config, browser SpeechRecognition remains a fallback (or a short
15
+ bot hint to configure STT).
16
+ 4. Docs (README / live-desk) + E2E + L0/L3 smoke pass.
@@ -0,0 +1,5 @@
1
+ # Tasks — 258-chat-stt
2
+
3
+ - [x] T001 Config + Settings STT fields + /api/transcribe
4
+ - [x] T002 MediaRecorder → transcribe into composer
5
+ - [x] T003 i18n + docs + tests; stamp; merge develop
@@ -0,0 +1,13 @@
1
+ {
2
+ "status": "accepted",
3
+ "acceptedAt": "2026-09-20T10:25:00.000Z",
4
+ "verification": {
5
+ "levels": ["L0", "L1", "L3"],
6
+ "commands": [
7
+ "node --check web/live-dev/app.js",
8
+ "node --test test/live-i18n-common.test.mjs",
9
+ "npm run test:live"
10
+ ],
11
+ "result": "pass"
12
+ }
13
+ }
@@ -0,0 +1,13 @@
1
+ # Fix: Record without STT opens Settings
2
+
3
+ ## Goal
4
+
5
+ Clicking Record with no speech model configured guides the operator to Settings
6
+ instead of falling back to browser speech.
7
+
8
+ ## Acceptance
9
+
10
+ 1. If `sttReady` is false, Record shows a short bot notice and opens Settings
11
+ (speech model block).
12
+ 2. Recording / transcribe only runs when STT is configured.
13
+ 3. L0 + L3 smoke still pass.
@@ -0,0 +1,4 @@
1
+ # Tasks — 259-voice-guide-stt
2
+
3
+ - [x] T001 Gate Record → open Settings when STT missing
4
+ - [x] T002 Smoke/docs tweak; stamp; merge
@@ -0,0 +1,18 @@
1
+ {
2
+ "status": "accepted",
3
+ "acceptedAt": "2026-09-20T13:33:00.000Z",
4
+ "verification": {
5
+ "levels": ["docs"],
6
+ "commands": [
7
+ "git push origin develop main",
8
+ "gh release create v0.26.0",
9
+ "gh run view 35513791762"
10
+ ],
11
+ "result": "partial",
12
+ "notes": "GitHub Release v0.26.0 on main. npm Trusted Publishing failed: GitHub Actions account locked (billing). Re-run workflow npm-publish.yml after billing is cleared."
13
+ },
14
+ "preview": {
15
+ "url": "https://github.com/Duaer/duaer-spec/releases/tag/v0.26.0",
16
+ "label": "GitHub Release v0.26.0"
17
+ }
18
+ }
@@ -0,0 +1,12 @@
1
+ # Feature Specification: Release 0.26.0
2
+
3
+ ## Goal
4
+
5
+ Ship 0.26.0: STT / composer Record, dispatch architecture view, console rename,
6
+ Cursor+Claude docs lead; promote develop → main; GitHub Release; npm Trusted
7
+ Publishing.
8
+
9
+ ## Acceptance
10
+
11
+ 1. `package.json` is `0.26.0`; CHANGELOG has `0.26.0` (Unreleased empty).
12
+ 2. Tag `v0.26.0` on main; GitHub Release published; npm shows `0.26.0`.
@@ -0,0 +1,5 @@
1
+ # Tasks: Release 0.26.0
2
+
3
+ - [x] T001 Bump package.json to 0.26.0 and fold CHANGELOG
4
+ - [x] T002 Merge develop, promote main, push, GitHub release
5
+ - [x] T003 Stamp delivery.json (npm blocked: Actions billing lock — re-run npm-publish.yml after unlock)
package/ADOPT.md CHANGED
@@ -33,7 +33,8 @@ Ensure the repo has **`main`** and **`develop`**. See
33
33
  [`docs/agent/branching-and-release.md`](docs/agent/branching-and-release.md)
34
34
  (Chinese: [`README.zh-CN.md`](README.zh-CN.md)).
35
35
 
36
- Then talk to the agent in plain language.
36
+ Then talk in **Cursor** or **Claude Code** in plain language — you do not need
37
+ to learn Spec phases or a professional delivery process.
37
38
 
38
39
  ## Options
39
40
 
@@ -43,9 +44,11 @@ npx duaer-spec init --here --ops
43
44
  npx duaer-spec update --method # rare; usually omit
44
45
  ```
45
46
 
46
- Works with **Cursor**, **Claude Code**, **Codex**, **GitHub Copilot**,
47
- **Windsurf / Devin**, **Cline**, **Continue**, **Gemini CLI**, and **Aider**
48
- (adapters installed by default).
47
+ **Supported for day-to-day use:** **Cursor** and **Claude Code** (FDE desk
48
+ dispatch also launches only Cursor Agent / Claude Code).
49
+
50
+ `init` still installs optional adapters for Codex, GitHub Copilot, Windsurf /
51
+ Devin, Cline, Continue, Gemini CLI, and Aider — see the file list below.
49
52
 
50
53
  ## What you get
51
54
 
package/AGENTS.md CHANGED
@@ -129,8 +129,8 @@ copy limited to the information and actions users need to complete the task:
129
129
 
130
130
  **Duaer brand (site-wide):** Visible live-desk / FDE copy that names the
131
131
  product surface must include **Duaer** (or **Duaer-spec FDE** where that full
132
- mark is already used). Do not write anonymous「台面」/desk” alone for this
133
- product’s chat surface or model setup — prefer「Duaer 台面」/ “Duaer desk”.
132
+ mark is already used). Do not write anonymous「控制台」/console” alone for this
133
+ product’s chat surface or model setup — prefer「Duaer 控制台」/ “Duaer console”.
134
134
  Branding is a short name signal, not a slogan paragraph.
135
135
 
136
136
  ## Mandatory branch model
package/CHANGELOG.md CHANGED
@@ -2,6 +2,44 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## 0.26.0 — 2026-09-20
6
+
7
+ ### Fix: npm provenance repository URL after GitHub move
8
+
9
+ - `package.json` repository / bugs / homepage point at `Duaer/duaer-spec`
10
+ so Trusted Publishing provenance matches the Actions OIDC subject
11
+
12
+
13
+ ### Feat: speech recognition (STT) model for composer Record
14
+
15
+ - Settings: configure STT Base URL / API Key / Model (OpenAI-compatible
16
+ `/audio/transcriptions`, e.g. whisper-1)
17
+ - Record captures audio; stop decodes via `/api/transcribe` into the composer
18
+ - When STT is unset, Record guides the operator to Settings
19
+
20
+ ### Feat: composer Record to collect requirements by speech
21
+
22
+ - Voice control beside Send fills the chat input via browser SpeechRecognition
23
+ - Listening state visible; unsupported / denied mic shows a short bot notice
24
+
25
+ ### Feat: dispatch center can view system architecture per project
26
+
27
+ - Stage tabs: Dispatch graph | Architecture
28
+ - Architecture loads that project’s saved `architecture.url`; empty hint when missing
29
+ - Fullscreen control removed from the architecture stage (open the saved URL)
30
+
31
+ ### Fix: rename product surface 台面 → 控制台
32
+
33
+ - User-facing Chinese copy uses **控制台** (brand: **Duaer 控制台**)
34
+ - English parallel uses **console** (**Duaer console**) instead of desk
35
+ - DOM ids / `deskKind` / `live-desk.md` path unchanged
36
+
37
+ ### Docs: Cursor + Claude Code primary; no professional workflow required
38
+
39
+ - README / ADOPT lead with Cursor and Claude Code; humans need not learn Spec
40
+ phases or a professional delivery process
41
+ - Other editor adapters remain optional via `init` (not the primary pitch)
42
+
5
43
  ## 0.25.1 — 2026-09-20
6
44
 
7
45
  ### Fix: architecture chat must not keep a false “diagram ready” line
package/README.md CHANGED
@@ -10,10 +10,11 @@ into a checkable Brief (goal / boundary / acceptance), implements only that
10
10
  scope, and only claims done when acceptance is met.
11
11
 
12
12
  The product pitch is **norms → satisfactory delivery** — not teaching humans
13
- to operate Spec phases or slash commands.
13
+ to operate Spec phases, slash commands, or a professional delivery process.
14
14
 
15
- You should **not** have to operate the workflow. After a one-time install, you
16
- talk; the employee runs the process.
15
+ You do **not** need to understand that process. After a one-time install, talk
16
+ in **Cursor** or **Claude Code** in plain language; the employee runs the
17
+ workflow.
17
18
 
18
19
  ## One-time install
19
20
 
@@ -39,9 +40,12 @@ The CLI also prints a one-line hint when a newer npm release exists
39
40
  npx duaer-spec update
40
41
  ```
41
42
 
42
- Then use **Cursor**, **Claude Code**, **Codex**, **Copilot**, **Windsurf**, **Cline**, **Continue**, **Gemini**, or **Aider** — describe what you want.
43
+ Then use **Cursor** or **Claude Code** — describe what you want in plain
44
+ language. You do not need to learn Spec phases or slash commands.
43
45
 
44
- Install writes host adapters for each (see [`ADOPT.md`](ADOPT.md)).
46
+ `init` / `update` also write optional adapters for other editors (see
47
+ [`ADOPT.md`](ADOPT.md)). FDE console dispatch launches **Cursor Agent** or
48
+ **Claude Code** only.
45
49
 
46
50
  Chinese guide: [`README.zh-CN.md`](README.zh-CN.md)
47
51
 
@@ -54,20 +58,20 @@ After install, these are the capabilities you actually use:
54
58
  - **You talk; it runs the process.** No slash commands, no “you must run Spec phases.”
55
59
  - **Clarify before coding.** It turns your ask into: what to build, what not to build, how we know it’s done.
56
60
  - **Done means accepted.** It only claims finished when acceptance checks out — not when code merely exists.
57
- - **Works in many hosts.** Cursor, Claude Code, Codex, Copilot, Windsurf, Cline, Continue, Gemini, Aider.
61
+ - **Supported in Cursor and Claude Code.** Install once, then speak there no professional Spec workflow required. (Optional adapters for other editors: [`ADOPT.md`](ADOPT.md).)
58
62
 
59
- ### In the browser: Duaer-spec FDE (live desk)
63
+ ### In the browser: Duaer-spec FDE (live console)
60
64
 
61
- A local web desk (`duaer live`) for “chat → confirm → dispatch → watch → open result”:
65
+ A local web console (`duaer live`) for “chat → confirm → dispatch → watch → open result”:
62
66
 
63
67
  - **Projects.** Create and switch projects; each keeps its own chat and progress.
64
- - **Chat until the ask is clear.** Left chat; center confirm cards (goal / out of scope / checkable acceptance). Vague acceptance cannot be confirmed.
68
+ - **Chat until the ask is clear.** Left chat; center confirm cards (goal / out of scope / checkable acceptance). Vague acceptance cannot be confirmed. Beside **Send**, tap **Record** to capture speech; with a **speech recognition (STT) model** in Settings (OpenAI-compatible `/audio/transcriptions`, e.g. whisper-1), the clip is decoded into the composer—edit, then send.
65
69
  - **Split big work into modules.** Confirm module by module; nothing starts until you kick off after the ones you care about are confirmed.
66
70
  - **Architecture diagram.** After requirements, review the system diagram; click it for fullscreen; kickoff waits until architecture is confirmed. If chat claims the diagram is ready but the middle panel is empty, the same bubble offers Regenerate — it does not leave a false “ready” line.
67
71
  - **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
- - **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.
72
+ - **Visible task progress.** Work is a checklist; each finished item is checked off and the console refreshes; dependent tasks release in waves so agents don’t pile on blocked work.
69
73
  - **Employee roles.** Top-bar **digital employee** directory (Implementer / Functional regression / Deployer). Optional parallel workers on the same CLI. See the next section.
70
- - **Locales.** Desk UI: zh-CN, zh-TW, en, ja, ko, es, pt-BR, fr, de, ru, vi.
74
+ - **Locales.** Console UI: zh-CN, zh-TW, en, ja, ko, es, pt-BR, fr, de, ru, vi.
71
75
  - **Deliverables and results.** Open a deliverables page (requirements timeline,
72
76
  architecture, tasks, delivery); when done, open the page or the project folder.
73
77
  - **Revise when it’s not right.** Continue in left chat → re-confirm → relaunch on
@@ -78,8 +82,8 @@ A local web desk (`duaer live`) for “chat → confirm → dispatch → watch
78
82
  facts autofill; defects join the same project timeline as revisions.
79
83
  - **Quick nav.** Chat-column edge control jumps to chat bottom · confirm card ·
80
84
  result · progress.
81
- - **Dispatch center.** Own page for the task graph with desk top nav; long chains
82
- wrap; nodes show live status.
85
+ - **Dispatch center.** Own page for the task graph and each project’s system
86
+ architecture, with console top nav; long chains wrap; nodes show live status.
83
87
 
84
88
  ### Digital employees: three roles
85
89
 
@@ -93,19 +97,19 @@ Open **Employees** in the top bar. Runtime is still Cursor Agent or Claude Code;
93
97
 
94
98
  With multiple workers, the **last lane** owns functional regression (and deploy tasks); implement work stays on earlier lanes. With one worker, the same CLI session runs roles in task order.
95
99
 
96
- Before a job can stay accepted, the desk runs the commands in the product `.duaer/memory/verify.json`. A non-zero exit, or a missing contract, reopens delivery. Docs-only work must set `{ "waiver": "docs-only" }` explicitly.
100
+ Before a job can stay accepted, the console runs the commands in the product `.duaer/memory/verify.json`. A non-zero exit, or a missing contract, reopens delivery. Docs-only work must set `{ "waiver": "docs-only" }` explicitly.
97
101
 
98
102
  ### Deploy: supported hosts
99
103
 
100
- 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.
104
+ Before kickoff, pick a **planned host** on the console. Coding follows that platform; the **Deployer** employee publishes and writes the public URL into delivery preview.
101
105
 
102
106
  | Option | Good for | You prepare |
103
107
  |---|---|---|
104
108
  | **No deploy yet** | Local delivery only | Nothing |
105
109
  | **GitHub Pages** | Static / docs sites; default when hosting is implied but no host was chosen | GitHub repo + `gh` auth |
106
- | **Cloudflare** | Pages for static; Workers for edge APIs | API Token + Account ID in desk Settings |
107
- | **Alibaba Cloud** | OSS (+ CDN) for static; Function Compute and similar for APIs | AccessKey in desk Settings |
108
- | **AWS** | S3 + CloudFront for static; Amplify / Lambda and similar when needed | Access keys in desk Settings |
110
+ | **Cloudflare** | Pages for static; Workers for edge APIs | API Token + Account ID in console Settings |
111
+ | **Alibaba Cloud** | OSS (+ CDN) for static; Function Compute and similar for APIs | AccessKey in console Settings |
112
+ | **AWS** | S3 + CloudFront for static; Amplify / Lambda and similar when needed | Access keys in console Settings |
109
113
 
110
114
  Detail: [`docs/agent/deploy-targets.md`](docs/agent/deploy-targets.md) · GitHub default path: [`docs/agent/deploy-github.md`](docs/agent/deploy-github.md)
111
115
 
@@ -126,13 +130,13 @@ The sections below are **how to run it**; this section is **what it can do**.
126
130
  Step skills and CLI checks exist for agents and power users — not as the
127
131
  everyday human UI.
128
132
 
129
- ## Duaer-spec FDE (live desk)
133
+ ## Duaer-spec FDE (live console)
130
134
 
131
135
  Isolated from product repos. Config and Briefs live under `~/.duaer/live/`.
132
136
  **Duaer-spec FDE** = Field Development Environment.
133
137
 
134
138
  ```bash
135
- # Start anytime (opens the desk even if the model is not configured yet)
139
+ # Start anytime (opens the console even if the model is not configured yet)
136
140
  duaer live
137
141
 
138
142
  # In the page Settings, or via CLI:
@@ -142,21 +146,21 @@ duaer live config --provider deepseek --api-key sk-...
142
146
  duaer live repo add
143
147
  ```
144
148
 
145
- `duaer live` opens the browser to the desk URL (default `http://127.0.0.1:8787`).
146
- If the model is missing, use **Settings** in the page. The desk is **full-width**
149
+ `duaer live` opens the browser to the console URL (default `http://127.0.0.1:8787`).
150
+ If the model is missing, use **Settings** in the page. The console is **full-width**
147
151
  with three columns: **chat** | **modules / confirm / architecture / kickoff /
148
152
  revise** | **task progress**. Detail:
149
153
  [`docs/agent/live-desk.md`](docs/agent/live-desk.md).
150
154
 
151
155
  **Verify (maintainers / agents):** after Duaer-spec FDE UI or validate-gate changes,
152
- run `npm run test:live` (L3 smoke: desk shell markers + `/api/validate` with a
156
+ run `npm run test:live` (L3 smoke: console shell markers + `/api/validate` with a
153
157
  mock LLM — no paid API).
154
158
 
155
159
  **Flow**
156
160
 
157
161
  1. Open or create a **project**, then chat. The **Projects** drawer shows each
158
162
  project’s **delivery status**; open **Deliverables** when the session has
159
- content. Messy multi-topic talk is fine: the desk evolves **`modules[]`**
163
+ content. Messy multi-topic talk is fine: the console evolves **`modules[]`**
160
164
  (tabs). Chat bubbles render **Markdown** (`**bold**`, code, links).
161
165
  2. Per module: fill the confirm card (goal / out-of-scope / **checkable**
162
166
  acceptance / assumptions). Vague acceptance fails the gate; validate must
@@ -190,7 +194,7 @@ mock LLM — no paid API).
190
194
  → relaunch on the same worktree (preempt leftover Agents before enqueue).
191
195
  Progress tracks this revision’s `R{n}-*` tasks. Failed launch rolls back the
192
196
  Brief Revision; status shows Terminal busy/queue per lane.
193
- 9. If the job needs hosting / a public URL, pick a **planned host** on the desk
197
+ 9. If the job needs hosting / a public URL, pick a **planned host** on the console
194
198
  (Cloudflare / Alibaba Cloud / AWS / GitHub Pages) so code matches that
195
199
  platform ([`docs/agent/deploy-targets.md`](docs/agent/deploy-targets.md)).
196
200
  Default when unspecified: **GitHub CLI (`gh`) + Actions**