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.
- package/.claude/rules/ai-ui-copy.md +2 -2
- package/.cursor/rules/ai-ui-copy.mdc +3 -3
- package/.cursor/rules/fde-8787-only.mdc +7 -7
- package/.duaer/active-job.json +3 -3
- package/.duaer/specs/250-release-025/delivery.json +17 -0
- package/.duaer/specs/250-release-025/tasks.md +1 -1
- package/.duaer/specs/251-arch-claim-no-diagram/delivery.json +13 -0
- package/.duaer/specs/251-arch-claim-no-diagram/spec.md +23 -0
- package/.duaer/specs/251-arch-claim-no-diagram/tasks.md +5 -0
- package/.duaer/specs/252-release-0251/delivery.json +14 -0
- package/.duaer/specs/252-release-0251/spec.md +13 -0
- package/.duaer/specs/252-release-0251/tasks.md +3 -0
- package/.duaer/specs/253-docs-cursor-claude/delivery.json +9 -0
- package/.duaer/specs/253-docs-cursor-claude/spec.md +25 -0
- package/.duaer/specs/253-docs-cursor-claude/tasks.md +3 -0
- package/.duaer/specs/254-console-rename/delivery.json +13 -0
- package/.duaer/specs/254-console-rename/spec.md +27 -0
- package/.duaer/specs/254-console-rename/tasks.md +4 -0
- package/.duaer/specs/255-dispatch-arch-view/delivery.json +13 -0
- package/.duaer/specs/255-dispatch-arch-view/spec.md +16 -0
- package/.duaer/specs/255-dispatch-arch-view/tasks.md +4 -0
- package/.duaer/specs/256-chat-voice/delivery.json +13 -0
- package/.duaer/specs/256-chat-voice/spec.md +15 -0
- package/.duaer/specs/256-chat-voice/tasks.md +6 -0
- package/.duaer/specs/257-composer-voice-compact/delivery.json +9 -0
- package/.duaer/specs/257-composer-voice-compact/spec.md +13 -0
- package/.duaer/specs/257-composer-voice-compact/tasks.md +4 -0
- package/.duaer/specs/258-chat-stt/delivery.json +14 -0
- package/.duaer/specs/258-chat-stt/spec.md +16 -0
- package/.duaer/specs/258-chat-stt/tasks.md +5 -0
- package/.duaer/specs/259-voice-guide-stt/delivery.json +13 -0
- package/.duaer/specs/259-voice-guide-stt/spec.md +13 -0
- package/.duaer/specs/259-voice-guide-stt/tasks.md +4 -0
- package/.duaer/specs/260-release-026/delivery.json +18 -0
- package/.duaer/specs/260-release-026/spec.md +12 -0
- package/.duaer/specs/260-release-026/tasks.md +5 -0
- package/ADOPT.md +7 -4
- package/AGENTS.md +2 -2
- package/CHANGELOG.md +48 -0
- package/README.md +30 -26
- package/README.zh-CN.md +22 -22
- package/bin/duaer-live.mjs +186 -8
- package/bin/live-bug-context.mjs +1 -1
- package/bin/live-deliverables.mjs +1 -1
- package/bin/live-verify-gate.mjs +2 -2
- package/docs/agent/e2e-test-plan.md +10 -0
- package/docs/agent/live-desk.md +12 -6
- package/docs/agent/worker-models.md +7 -5
- package/docs/agent/worker-models.zh-CN.md +5 -3
- package/package.json +5 -5
- package/web/live-dev/app.js +445 -24
- package/web/live-dev/dispatch-center.html +25 -1
- package/web/live-dev/dispatch-center.js +113 -16
- package/web/live-dev/employee-catalog.mjs +2 -2
- package/web/live-dev/i18n-de.js +34 -10
- package/web/live-dev/i18n-es.js +34 -10
- package/web/live-dev/i18n-fr.js +34 -10
- package/web/live-dev/i18n-ja.js +34 -10
- package/web/live-dev/i18n-ko.js +34 -10
- package/web/live-dev/i18n-pt-BR.js +34 -10
- package/web/live-dev/i18n-ru.js +34 -10
- package/web/live-dev/i18n-vi.js +34 -10
- package/web/live-dev/i18n-zh-TW.js +36 -12
- package/web/live-dev/i18n.js +71 -23
- package/web/live-dev/index.html +55 -9
- 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
|
|
17
|
-
chat surface or model setup — prefer「Duaer
|
|
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-
|
|
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
|
|
20
|
-
chat surface or model setup — prefer「Duaer
|
|
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
|
|
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
|
|
6
|
+
# FDE console port (8787 only)
|
|
7
7
|
|
|
8
|
-
The Duaer-spec FDE
|
|
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
|
|
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
|
|
25
|
-
- Use Cursor Browser / Simple Browser / browser MCP to open the
|
|
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
|
|
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.
|
package/.duaer/active-job.json
CHANGED
|
@@ -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
|
+
}
|
|
@@ -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,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,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,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,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,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,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,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,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`.
|
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
|
|
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
|
-
|
|
47
|
-
|
|
48
|
-
|
|
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
|
|
133
|
-
product’s chat surface or model setup — prefer「Duaer
|
|
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
|