duaer-spec 0.25.0 → 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 (66) 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/250-release-025/delivery.json +17 -0
  6. package/.duaer/specs/250-release-025/tasks.md +1 -1
  7. package/.duaer/specs/251-arch-claim-no-diagram/delivery.json +13 -0
  8. package/.duaer/specs/251-arch-claim-no-diagram/spec.md +23 -0
  9. package/.duaer/specs/251-arch-claim-no-diagram/tasks.md +5 -0
  10. package/.duaer/specs/252-release-0251/delivery.json +14 -0
  11. package/.duaer/specs/252-release-0251/spec.md +13 -0
  12. package/.duaer/specs/252-release-0251/tasks.md +3 -0
  13. package/.duaer/specs/253-docs-cursor-claude/delivery.json +9 -0
  14. package/.duaer/specs/253-docs-cursor-claude/spec.md +25 -0
  15. package/.duaer/specs/253-docs-cursor-claude/tasks.md +3 -0
  16. package/.duaer/specs/254-console-rename/delivery.json +13 -0
  17. package/.duaer/specs/254-console-rename/spec.md +27 -0
  18. package/.duaer/specs/254-console-rename/tasks.md +4 -0
  19. package/.duaer/specs/255-dispatch-arch-view/delivery.json +13 -0
  20. package/.duaer/specs/255-dispatch-arch-view/spec.md +16 -0
  21. package/.duaer/specs/255-dispatch-arch-view/tasks.md +4 -0
  22. package/.duaer/specs/256-chat-voice/delivery.json +13 -0
  23. package/.duaer/specs/256-chat-voice/spec.md +15 -0
  24. package/.duaer/specs/256-chat-voice/tasks.md +6 -0
  25. package/.duaer/specs/257-composer-voice-compact/delivery.json +9 -0
  26. package/.duaer/specs/257-composer-voice-compact/spec.md +13 -0
  27. package/.duaer/specs/257-composer-voice-compact/tasks.md +4 -0
  28. package/.duaer/specs/258-chat-stt/delivery.json +14 -0
  29. package/.duaer/specs/258-chat-stt/spec.md +16 -0
  30. package/.duaer/specs/258-chat-stt/tasks.md +5 -0
  31. package/.duaer/specs/259-voice-guide-stt/delivery.json +13 -0
  32. package/.duaer/specs/259-voice-guide-stt/spec.md +13 -0
  33. package/.duaer/specs/259-voice-guide-stt/tasks.md +4 -0
  34. package/.duaer/specs/260-release-026/delivery.json +18 -0
  35. package/.duaer/specs/260-release-026/spec.md +12 -0
  36. package/.duaer/specs/260-release-026/tasks.md +5 -0
  37. package/ADOPT.md +7 -4
  38. package/AGENTS.md +2 -2
  39. package/CHANGELOG.md +48 -0
  40. package/README.md +30 -26
  41. package/README.zh-CN.md +22 -22
  42. package/bin/duaer-live.mjs +186 -8
  43. package/bin/live-bug-context.mjs +1 -1
  44. package/bin/live-deliverables.mjs +1 -1
  45. package/bin/live-verify-gate.mjs +2 -2
  46. package/docs/agent/e2e-test-plan.md +10 -0
  47. package/docs/agent/live-desk.md +12 -6
  48. package/docs/agent/worker-models.md +7 -5
  49. package/docs/agent/worker-models.zh-CN.md +5 -3
  50. package/package.json +5 -5
  51. package/web/live-dev/app.js +445 -24
  52. package/web/live-dev/dispatch-center.html +25 -1
  53. package/web/live-dev/dispatch-center.js +113 -16
  54. package/web/live-dev/employee-catalog.mjs +2 -2
  55. package/web/live-dev/i18n-de.js +34 -10
  56. package/web/live-dev/i18n-es.js +34 -10
  57. package/web/live-dev/i18n-fr.js +34 -10
  58. package/web/live-dev/i18n-ja.js +34 -10
  59. package/web/live-dev/i18n-ko.js +34 -10
  60. package/web/live-dev/i18n-pt-BR.js +34 -10
  61. package/web/live-dev/i18n-ru.js +34 -10
  62. package/web/live-dev/i18n-vi.js +34 -10
  63. package/web/live-dev/i18n-zh-TW.js +36 -12
  64. package/web/live-dev/i18n.js +71 -23
  65. package/web/live-dev/index.html +55 -9
  66. 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": "250-release-025",
3
- "specPath": ".duaer/specs/250-release-025/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,17 @@
1
+ {
2
+ "status": "accepted",
3
+ "acceptedAt": "2026-09-20T06:20:00.000Z",
4
+ "verification": {
5
+ "levels": ["docs"],
6
+ "commands": [
7
+ "gh release view v0.25.0",
8
+ "gh run list --workflow=npm-publish.yml"
9
+ ],
10
+ "result": "pass",
11
+ "notes": "GitHub Release published; npm Trusted Publishing succeeded for 0.25.0 (registry may lag briefly)"
12
+ },
13
+ "preview": {
14
+ "url": "https://github.com/fujiezee/duaer-spec/releases/tag/v0.25.0",
15
+ "label": "GitHub Release v0.25.0"
16
+ }
17
+ }
@@ -2,4 +2,4 @@
2
2
 
3
3
  - [x] T001 Bump package.json to 0.25.0 and fold CHANGELOG
4
4
  - [x] T002 Update README feature bullets (en + zh-CN)
5
- - [ ] T003 Merge to develop, promote main, push, GitHub release
5
+ - [x] T003 Merge to develop, promote main, push, GitHub release
@@ -0,0 +1,13 @@
1
+ {
2
+ "status": "accepted",
3
+ "acceptedAt": "2026-09-20T06:50:00.000Z",
4
+ "verification": {
5
+ "levels": ["L0", "L1", "L3"],
6
+ "commands": [
7
+ "node --check web/live-dev/app.js",
8
+ "npm test",
9
+ "npm run test:live"
10
+ ],
11
+ "result": "pass"
12
+ }
13
+ }
@@ -0,0 +1,23 @@
1
+ # Fix: architecture chat must not claim diagram ready without render
2
+
3
+ ## Symptom
4
+
5
+ Left chat shows「架构图已生成」(or equivalent) while the middle「系统架构」
6
+ panel has no diagram. Users think the desk failed silently.
7
+
8
+ ## Cause
9
+
10
+ The model is prompted to say “diagram ready” in prose while putting IR after
11
+ `<<<JSON>>>`. When IR is missing or fails to render, the desk already shows a
12
+ missing hint, but the **original bubble still claims success**.
13
+
14
+ ## Acceptance
15
+
16
+ 1. If architecture chat claims ready but no `architectureUrl` / renderable IR,
17
+ the **same** assistant bubble is rewritten to the missing-diagram copy (no
18
+ leftover “已生成” text).
19
+ 2. That bubble offers「重新生成架构图」; middle panel uses `missing` hint.
20
+ 3. Continue chips are not shown as if a diagram already exists when there is
21
+ no render URL / no components.
22
+ 4. E2E catalog row + L0/L1/L3 smoke markers updated.
23
+ 5. English docs stay CJK-free.
@@ -0,0 +1,5 @@
1
+ - [x] T001 Rewrite claim-without-render bubble (no duplicate “已生成”)
2
+ - [x] T002 Tighten continue-options gate (need URL or components)
3
+ - [x] T003 i18n copy: missing diagram, not “model said ready”
4
+ - [x] T004 E2E catalog + smoke assertion; verify L0/L1/L3
5
+ - [x] T005 Stamp delivery.json
@@ -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
+ }
@@ -0,0 +1,13 @@
1
+ # Feature Specification: Release 0.25.1
2
+
3
+ ## Goal
4
+
5
+ Ship 0.25.1: architecture chat no longer leaves a false “diagram ready” line
6
+ when the middle panel has no diagram; promote develop → main; GitHub Release;
7
+ npm Trusted Publishing.
8
+
9
+ ## Acceptance
10
+
11
+ 1. `package.json` is `0.25.1`; CHANGELOG has `0.25.1` (Unreleased cleared).
12
+ 2. README notes the architecture claim / regenerate behavior (en + zh-CN).
13
+ 3. Tag `v0.25.1` on main; GitHub Release published; npm shows `0.25.1`.
@@ -0,0 +1,3 @@
1
+ - [x] T001 Bump package.json to 0.25.1 and fold CHANGELOG
2
+ - [x] T002 Update README architecture note (en + zh-CN)
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,54 @@
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
+
43
+ ## 0.25.1 — 2026-09-20
44
+
45
+ ### Fix: architecture chat must not keep a false “diagram ready” line
46
+
47
+ - When chat claims the diagram is ready but no renderable IR/URL arrives, the
48
+ same assistant bubble is rewritten to the missing-diagram copy with
49
+ Regenerate — the left chat no longer leaves a false “diagram ready” line
50
+ without a middle-panel diagram
51
+ - Continue chips only clear when a render URL or real components exist
52
+
5
53
  ## 0.25.0 — 2026-09-20
6
54
 
7
55
  ### Feat: bug path, project timeline, and desk navigation