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.
- 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/252-release-0251/delivery.json +14 -0
- package/.duaer/specs/252-release-0251/tasks.md +1 -1
- 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 +38 -0
- package/README.md +29 -25
- package/README.zh-CN.md +21 -21
- 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 +8 -0
- package/docs/agent/live-desk.md +9 -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 +386 -0
- 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 +32 -8
- package/web/live-dev/i18n-es.js +32 -8
- package/web/live-dev/i18n-fr.js +32 -8
- package/web/live-dev/i18n-ja.js +32 -8
- package/web/live-dev/i18n-ko.js +32 -8
- package/web/live-dev/i18n-pt-BR.js +32 -8
- package/web/live-dev/i18n-ru.js +32 -8
- package/web/live-dev/i18n-vi.js +32 -8
- package/web/live-dev/i18n-zh-TW.js +34 -10
- package/web/live-dev/i18n.js +67 -19
- 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,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,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,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
|
|
13
|
+
to operate Spec phases, slash commands, or a professional delivery process.
|
|
14
14
|
|
|
15
|
-
You
|
|
16
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
- **
|
|
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
|
|
63
|
+
### In the browser: Duaer-spec FDE (live console)
|
|
60
64
|
|
|
61
|
-
A local web
|
|
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
|
|
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.**
|
|
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
|
|
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
|
|
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
|
|
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
|
|
107
|
-
| **Alibaba Cloud** | OSS (+ CDN) for static; Function Compute and similar for APIs | AccessKey in
|
|
108
|
-
| **AWS** | S3 + CloudFront for static; Amplify / Lambda and similar when needed | Access keys in
|
|
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
|
|
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
|
|
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
|
|
146
|
-
If the model is missing, use **Settings** in the page. The
|
|
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:
|
|
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
|
|
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
|
|
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**
|