duaer-spec 0.16.0 → 0.18.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 +11 -1
- package/.cursor/rules/ai-ui-copy.mdc +11 -1
- package/.duaer/active-job.json +1 -6
- package/.duaer/handoff.json +5 -3
- package/.duaer/specs/061-satisfactory-delivery/delivery.json +10 -0
- package/.duaer/specs/061-satisfactory-delivery/spec.md +39 -0
- package/.duaer/specs/061-satisfactory-delivery/tasks.md +5 -0
- package/.duaer/specs/062-deepseek-cli/delivery.json +10 -0
- package/.duaer/specs/062-deepseek-cli/spec.md +37 -0
- package/.duaer/specs/062-deepseek-cli/tasks.md +4 -0
- package/.duaer/specs/063-queued-count/delivery.json +10 -0
- package/.duaer/specs/063-queued-count/spec.md +12 -0
- package/.duaer/specs/063-queued-count/tasks.md +3 -0
- package/.duaer/specs/064-cli-install-show/delivery.json +10 -0
- package/.duaer/specs/064-cli-install-show/spec.md +17 -0
- package/.duaer/specs/064-cli-install-show/tasks.md +3 -0
- package/.duaer/specs/065-detailed-progress/delivery.json +18 -0
- package/.duaer/specs/065-detailed-progress/spec.md +19 -0
- package/.duaer/specs/065-detailed-progress/tasks.md +4 -0
- package/.duaer/specs/066-duaer-fed/delivery.json +16 -0
- package/.duaer/specs/066-duaer-fed/spec.md +18 -0
- package/.duaer/specs/066-duaer-fed/tasks.md +4 -0
- package/.duaer/specs/067-duaer-spec-fed/delivery.json +11 -0
- package/.duaer/specs/067-duaer-spec-fed/spec.md +16 -0
- package/.duaer/specs/067-duaer-spec-fed/tasks.md +3 -0
- package/.duaer/specs/068-fed-ux-polish/delivery.json +11 -0
- package/.duaer/specs/068-fed-ux-polish/spec.md +18 -0
- package/.duaer/specs/068-fed-ux-polish/tasks.md +4 -0
- package/.duaer/specs/069-history-btn-size/delivery.json +6 -0
- package/.duaer/specs/069-history-btn-size/spec.md +14 -0
- package/.duaer/specs/069-history-btn-size/tasks.md +3 -0
- package/.duaer/specs/070-validate-autofix-btn/delivery.json +9 -0
- package/.duaer/specs/070-validate-autofix-btn/spec.md +17 -0
- package/.duaer/specs/070-validate-autofix-btn/tasks.md +3 -0
- package/.duaer/specs/071-req-structured-display/delivery.json +9 -0
- package/.duaer/specs/071-req-structured-display/spec.md +17 -0
- package/.duaer/specs/071-req-structured-display/tasks.md +3 -0
- package/.duaer/specs/072-chat-send/delivery.json +14 -0
- package/.duaer/specs/072-chat-send/spec.md +48 -0
- package/.duaer/specs/072-chat-send/tasks.md +5 -0
- package/.duaer/specs/073-empty-structured/delivery.json +10 -0
- package/.duaer/specs/073-empty-structured/spec.md +28 -0
- package/.duaer/specs/073-empty-structured/tasks.md +4 -0
- package/.duaer/specs/074-chat-blank/delivery.json +10 -0
- package/.duaer/specs/074-chat-blank/spec.md +22 -0
- package/.duaer/specs/074-chat-blank/tasks.md +4 -0
- package/.duaer/specs/075-header-beginner/delivery.json +10 -0
- package/.duaer/specs/075-header-beginner/spec.md +17 -0
- package/.duaer/specs/075-header-beginner/tasks.md +4 -0
- package/.duaer/specs/076-click-options/delivery.json +10 -0
- package/.duaer/specs/076-click-options/spec.md +23 -0
- package/.duaer/specs/076-click-options/tasks.md +4 -0
- package/.duaer/specs/077-dispatch-unique/delivery.json +10 -0
- package/.duaer/specs/077-dispatch-unique/spec.md +18 -0
- package/.duaer/specs/077-dispatch-unique/tasks.md +4 -0
- package/.duaer/specs/078-chip-tone/delivery.json +10 -0
- package/.duaer/specs/078-chip-tone/spec.md +16 -0
- package/.duaer/specs/078-chip-tone/tasks.md +4 -0
- package/.duaer/specs/079-desk-equal-cols/delivery.json +10 -0
- package/.duaer/specs/079-desk-equal-cols/spec.md +17 -0
- package/.duaer/specs/079-desk-equal-cols/tasks.md +4 -0
- package/.duaer/specs/080-progress-polish/delivery.json +10 -0
- package/.duaer/specs/080-progress-polish/spec.md +18 -0
- package/.duaer/specs/080-progress-polish/tasks.md +4 -0
- package/.duaer/specs/081-beginner-copy/delivery.json +10 -0
- package/.duaer/specs/081-beginner-copy/spec.md +14 -0
- package/.duaer/specs/081-beginner-copy/tasks.md +4 -0
- package/.duaer/specs/082-git-cli-ensure/delivery.json +15 -0
- package/.duaer/specs/082-git-cli-ensure/spec.md +27 -0
- package/.duaer/specs/082-git-cli-ensure/tasks.md +5 -0
- package/.duaer/specs/083-deepseek-w-flag/delivery.json +14 -0
- package/.duaer/specs/083-deepseek-w-flag/spec.md +23 -0
- package/.duaer/specs/083-deepseek-w-flag/tasks.md +4 -0
- package/.duaer/specs/084-drop-deepseek-cli/delivery.json +14 -0
- package/.duaer/specs/084-drop-deepseek-cli/spec.md +25 -0
- package/.duaer/specs/084-drop-deepseek-cli/tasks.md +6 -0
- package/.duaer/specs/085-repo-mkdir/delivery.json +14 -0
- package/.duaer/specs/085-repo-mkdir/spec.md +26 -0
- package/.duaer/specs/085-repo-mkdir/tasks.md +5 -0
- package/.duaer/specs/086-claude-auto-perms/delivery.json +14 -0
- package/.duaer/specs/086-claude-auto-perms/spec.md +17 -0
- package/.duaer/specs/086-claude-auto-perms/tasks.md +4 -0
- package/.duaer/specs/087-release-017/delivery.json +9 -0
- package/.duaer/specs/087-release-017/spec.md +15 -0
- package/.duaer/specs/087-release-017/tasks.md +4 -0
- package/.duaer/specs/088-result-versions/delivery.json +14 -0
- package/.duaer/specs/088-result-versions/spec.md +37 -0
- package/.duaer/specs/088-result-versions/tasks.md +8 -0
- package/.duaer/specs/089-deploy-target-tasks/delivery.json +13 -0
- package/.duaer/specs/089-deploy-target-tasks/spec.md +28 -0
- package/.duaer/specs/089-deploy-target-tasks/tasks.md +9 -0
- package/.duaer/specs/090-project-first/delivery.json +13 -0
- package/.duaer/specs/090-project-first/spec.md +41 -0
- package/.duaer/specs/090-project-first/tasks.md +7 -0
- package/.duaer/specs/091-project-meta/delivery.json +13 -0
- package/.duaer/specs/091-project-meta/spec.md +35 -0
- package/.duaer/specs/091-project-meta/tasks.md +6 -0
- package/.duaer/specs/092-project-chat-gate/delivery.json +9 -0
- package/.duaer/specs/092-project-chat-gate/spec.md +17 -0
- package/.duaer/specs/092-project-chat-gate/tasks.md +4 -0
- package/.duaer/specs/093-project-auto-chat/delivery.json +9 -0
- package/.duaer/specs/093-project-auto-chat/spec.md +16 -0
- package/.duaer/specs/093-project-auto-chat/tasks.md +4 -0
- package/.duaer/specs/094-dispatch-project-simple/delivery.json +9 -0
- package/.duaer/specs/094-dispatch-project-simple/spec.md +17 -0
- package/.duaer/specs/094-dispatch-project-simple/tasks.md +4 -0
- package/.duaer/specs/095-project-chat-persist/delivery.json +9 -0
- package/.duaer/specs/095-project-chat-persist/spec.md +17 -0
- package/.duaer/specs/095-project-chat-persist/tasks.md +5 -0
- package/.duaer/specs/096-project-card-persist/delivery.json +15 -0
- package/.duaer/specs/096-project-card-persist/spec.md +25 -0
- package/.duaer/specs/096-project-card-persist/tasks.md +9 -0
- package/.duaer/specs/097-validate-persist/delivery.json +15 -0
- package/.duaer/specs/097-validate-persist/spec.md +24 -0
- package/.duaer/specs/097-validate-persist/tasks.md +7 -0
- package/.duaer/specs/098-req-structured-edit/delivery.json +14 -0
- package/.duaer/specs/098-req-structured-edit/spec.md +18 -0
- package/.duaer/specs/098-req-structured-edit/tasks.md +7 -0
- package/.duaer/specs/099-setup-cli-guide/delivery.json +14 -0
- package/.duaer/specs/099-setup-cli-guide/spec.md +19 -0
- package/.duaer/specs/099-setup-cli-guide/tasks.md +7 -0
- package/.duaer/specs/100-architecture-archify/delivery.json +16 -0
- package/.duaer/specs/100-architecture-archify/spec.md +39 -0
- package/.duaer/specs/100-architecture-archify/tasks.md +8 -0
- package/.duaer/specs/101-archify-ir-sanitize/delivery.json +11 -0
- package/.duaer/specs/101-archify-ir-sanitize/spec.md +22 -0
- package/.duaer/specs/101-archify-ir-sanitize/tasks.md +5 -0
- package/.duaer/specs/102-archify-brand-duaer/delivery.json +5 -0
- package/.duaer/specs/102-archify-brand-duaer/spec.md +9 -0
- package/.duaer/specs/103-arch-chat-kickoff/delivery.json +11 -0
- package/.duaer/specs/103-arch-chat-kickoff/spec.md +13 -0
- package/.duaer/specs/103-arch-chat-kickoff/tasks.md +5 -0
- package/.duaer/specs/104-settings-modal/delivery.json +8 -0
- package/.duaer/specs/104-settings-modal/spec.md +14 -0
- package/.duaer/specs/104-settings-modal/tasks.md +5 -0
- package/.duaer/specs/105-arch-chat-continue/delivery.json +11 -0
- package/.duaer/specs/105-arch-chat-continue/spec.md +12 -0
- package/.duaer/specs/105-arch-chat-continue/tasks.md +5 -0
- package/.duaer/specs/106-arch-hint-copy/delivery.json +5 -0
- package/.duaer/specs/106-arch-hint-copy/spec.md +9 -0
- package/.duaer/specs/107-arch-frame-layout/delivery.json +8 -0
- package/.duaer/specs/107-arch-frame-layout/spec.md +12 -0
- package/.duaer/specs/107-arch-frame-layout/tasks.md +5 -0
- package/.duaer/specs/108-arch-no-chrome/delivery.json +8 -0
- package/.duaer/specs/108-arch-no-chrome/spec.md +11 -0
- package/.duaer/specs/109-arch-layout-repair/delivery.json +8 -0
- package/.duaer/specs/109-arch-layout-repair/spec.md +12 -0
- package/.duaer/specs/109-arch-layout-repair/tasks.md +5 -0
- package/.duaer/specs/110-arch-ready-copy/delivery.json +10 -0
- package/.duaer/specs/110-arch-ready-copy/spec.md +12 -0
- package/.duaer/specs/110-arch-ready-copy/tasks.md +7 -0
- package/.duaer/specs/111-arch-confirm-click/delivery.json +10 -0
- package/.duaer/specs/111-arch-confirm-click/spec.md +18 -0
- package/.duaer/specs/111-arch-confirm-click/tasks.md +5 -0
- package/.duaer/specs/112-duaer-brand-copy/delivery.json +10 -0
- package/.duaer/specs/112-duaer-brand-copy/spec.md +27 -0
- package/.duaer/specs/112-duaer-brand-copy/tasks.md +5 -0
- package/.duaer/specs/113-arch-diagram-height/delivery.json +10 -0
- package/.duaer/specs/113-arch-diagram-height/spec.md +14 -0
- package/.duaer/specs/113-arch-diagram-height/tasks.md +5 -0
- package/.duaer/specs/114-guide-doc-github/delivery.json +10 -0
- package/.duaer/specs/114-guide-doc-github/spec.md +15 -0
- package/.duaer/specs/114-guide-doc-github/tasks.md +5 -0
- package/.duaer/specs/115-panel-scroll-hold/delivery.json +10 -0
- package/.duaer/specs/115-panel-scroll-hold/spec.md +19 -0
- package/.duaer/specs/115-panel-scroll-hold/tasks.md +5 -0
- package/.duaer/specs/116-arch-node-zoom/delivery.json +10 -0
- package/.duaer/specs/116-arch-node-zoom/spec.md +18 -0
- package/.duaer/specs/116-arch-node-zoom/tasks.md +5 -0
- package/.duaer/specs/117-dispatch-done-state/delivery.json +14 -0
- package/.duaer/specs/117-dispatch-done-state/spec.md +30 -0
- package/.duaer/specs/117-dispatch-done-state/tasks.md +6 -0
- package/.duaer/specs/118-preview-result-visible/delivery.json +14 -0
- package/.duaer/specs/118-preview-result-visible/spec.md +30 -0
- package/.duaer/specs/118-preview-result-visible/tasks.md +5 -0
- package/.duaer/specs/119-arch-revise-keep/delivery.json +14 -0
- package/.duaer/specs/119-arch-revise-keep/spec.md +34 -0
- package/.duaer/specs/119-arch-revise-keep/tasks.md +5 -0
- package/.duaer/specs/120-preview-required/delivery.json +14 -0
- package/.duaer/specs/120-preview-required/spec.md +31 -0
- package/.duaer/specs/120-preview-required/tasks.md +5 -0
- package/.duaer/specs/121-preview-start-service/delivery.json +15 -0
- package/.duaer/specs/121-preview-start-service/spec.md +26 -0
- package/.duaer/specs/121-preview-start-service/tasks.md +5 -0
- package/.duaer/specs/122-revise-chat-persist/delivery.json +13 -0
- package/.duaer/specs/122-revise-chat-persist/spec.md +18 -0
- package/.duaer/specs/122-revise-chat-persist/tasks.md +5 -0
- package/.duaer/specs/123-remove-beginner-slogan/delivery.json +9 -0
- package/.duaer/specs/123-remove-beginner-slogan/spec.md +26 -0
- package/.duaer/specs/123-remove-beginner-slogan/tasks.md +6 -0
- package/.duaer/specs/124-header-github-stars/delivery.json +9 -0
- package/.duaer/specs/124-header-github-stars/spec.md +31 -0
- package/.duaer/specs/124-header-github-stars/tasks.md +6 -0
- package/.duaer/specs/125-result-service-status/delivery.json +10 -0
- package/.duaer/specs/125-result-service-status/spec.md +32 -0
- package/.duaer/specs/125-result-service-status/tasks.md +5 -0
- package/.duaer/specs/126-new-project-full-reset/delivery.json +10 -0
- package/.duaer/specs/126-new-project-full-reset/spec.md +30 -0
- package/.duaer/specs/126-new-project-full-reset/tasks.md +4 -0
- package/.duaer/specs/127-progress-text-overflow/delivery.json +8 -0
- package/.duaer/specs/127-progress-text-overflow/spec.md +12 -0
- package/.duaer/specs/127-progress-text-overflow/tasks.md +4 -0
- package/.duaer/specs/128-claude-trust-dialog/delivery.json +9 -0
- package/.duaer/specs/128-claude-trust-dialog/spec.md +31 -0
- package/.duaer/specs/128-claude-trust-dialog/tasks.md +5 -0
- package/.duaer/specs/129-result-one-line/delivery.json +8 -0
- package/.duaer/specs/129-result-one-line/spec.md +14 -0
- package/.duaer/specs/129-result-one-line/tasks.md +4 -0
- package/.duaer/specs/130-result-bar-layout/delivery.json +8 -0
- package/.duaer/specs/130-result-bar-layout/spec.md +13 -0
- package/.duaer/specs/130-result-bar-layout/tasks.md +5 -0
- package/.duaer/specs/131-revise-card-versions/delivery.json +9 -0
- package/.duaer/specs/131-revise-card-versions/spec.md +27 -0
- package/.duaer/specs/131-revise-card-versions/tasks.md +7 -0
- package/.duaer/specs/132-revise-arch-after-plan/delivery.json +9 -0
- package/.duaer/specs/132-revise-arch-after-plan/spec.md +29 -0
- package/.duaer/specs/132-revise-arch-after-plan/tasks.md +7 -0
- package/.duaer/specs/133-button-styles/delivery.json +5 -0
- package/.duaer/specs/133-button-styles/spec.md +14 -0
- package/.duaer/specs/133-button-styles/tasks.md +6 -0
- package/.duaer/specs/134-revise-version-expand/delivery.json +9 -0
- package/.duaer/specs/134-revise-version-expand/spec.md +21 -0
- package/.duaer/specs/134-revise-version-expand/tasks.md +6 -0
- package/.duaer/specs/135-revise-chat-visible/delivery.json +5 -0
- package/.duaer/specs/135-revise-chat-visible/spec.md +13 -0
- package/.duaer/specs/135-revise-chat-visible/tasks.md +3 -0
- package/.duaer/specs/136-revise-click/delivery.json +1 -0
- package/.duaer/specs/136-revise-click/spec.md +16 -0
- package/.duaer/specs/136-revise-click/tasks.md +5 -0
- package/.duaer/specs/137-btn-chrome/delivery.json +11 -0
- package/.duaer/specs/137-btn-chrome/spec.md +11 -0
- package/.duaer/specs/137-btn-chrome/tasks.md +5 -0
- package/.duaer/specs/138-revise-send-msg/delivery.json +11 -0
- package/.duaer/specs/138-revise-send-msg/spec.md +18 -0
- package/.duaer/specs/138-revise-send-msg/tasks.md +5 -0
- package/.duaer/specs/139-revise-first-click/delivery.json +11 -0
- package/.duaer/specs/139-revise-first-click/spec.md +22 -0
- package/.duaer/specs/139-revise-first-click/tasks.md +6 -0
- package/.duaer/specs/140-revise-kickoff-stack/delivery.json +11 -0
- package/.duaer/specs/140-revise-kickoff-stack/spec.md +19 -0
- package/.duaer/specs/140-revise-kickoff-stack/tasks.md +6 -0
- package/.duaer/specs/141-revise-stack-2/delivery.json +11 -0
- package/.duaer/specs/141-revise-stack-2/spec.md +19 -0
- package/.duaer/specs/141-revise-stack-2/tasks.md +6 -0
- package/.duaer/specs/142-arch-node-popup/delivery.json +11 -0
- package/.duaer/specs/142-arch-node-popup/spec.md +18 -0
- package/.duaer/specs/142-arch-node-popup/tasks.md +4 -0
- package/.duaer/specs/143-arch-popup-upgrade/delivery.json +10 -0
- package/.duaer/specs/143-arch-popup-upgrade/spec.md +12 -0
- package/.duaer/specs/143-arch-popup-upgrade/tasks.md +4 -0
- package/.duaer/specs/144-arch-popup-offset/delivery.json +10 -0
- package/.duaer/specs/144-arch-popup-offset/spec.md +11 -0
- package/.duaer/specs/144-arch-popup-offset/tasks.md +4 -0
- package/.duaer/specs/145-arch-popup-visible/delivery.json +10 -0
- package/.duaer/specs/145-arch-popup-visible/spec.md +13 -0
- package/.duaer/specs/145-arch-popup-visible/tasks.md +4 -0
- package/.duaer/specs/146-arch-popup-gutter/delivery.json +10 -0
- package/.duaer/specs/146-arch-popup-gutter/spec.md +17 -0
- package/.duaer/specs/146-arch-popup-gutter/tasks.md +4 -0
- package/.duaer/specs/147-arch-expand-noscroll/delivery.json +10 -0
- package/.duaer/specs/147-arch-expand-noscroll/spec.md +14 -0
- package/.duaer/specs/147-arch-expand-noscroll/tasks.md +5 -0
- package/.duaer/specs/148-release-018/spec.md +12 -0
- package/.duaer/specs/148-release-018/tasks.md +4 -0
- package/AGENTS.md +15 -4
- package/CHANGELOG.md +267 -0
- package/DUADER.md +11 -6
- package/README.md +32 -16
- package/README.zh-CN.md +17 -10
- package/bin/deploy-targets.mjs +148 -0
- package/bin/duaer-live.mjs +1353 -220
- package/bin/duaer.mjs +14 -3
- package/bin/live-archify.mjs +808 -0
- package/bin/live-claude-trust.mjs +111 -0
- package/bin/live-preview.mjs +362 -0
- package/bin/live-progress.mjs +203 -0
- package/bin/live-project-chat.mjs +319 -0
- package/bin/live-projects.mjs +113 -0
- package/bin/live-repo-path.mjs +88 -0
- package/bin/live-tooling.mjs +308 -0
- package/bin/live-worktree-name.mjs +57 -0
- package/bin/update-check.mjs +1 -1
- package/docs/agent/README.md +3 -0
- package/docs/agent/deploy-github.md +1 -1
- package/docs/agent/deploy-targets.md +81 -0
- package/docs/agent/e2e-test-plan.md +110 -4
- package/docs/agent/worker-models.md +108 -0
- package/docs/agent/worker-models.zh-CN.md +99 -0
- package/package.json +2 -2
- package/web/live-dev/app.js +3580 -386
- package/web/live-dev/architecture-ir.mjs +170 -0
- package/web/live-dev/choice-options.mjs +59 -0
- package/web/live-dev/i18n.js +413 -84
- package/web/live-dev/index.html +239 -67
- package/web/live-dev/structured-html.mjs +204 -0
- package/web/live-dev/styles.css +1301 -136
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<!--
|
|
1
|
+
<!-- Desk UI copy — minimal + Duaer brand (duaer-spec agent ops) -->
|
|
2
2
|
|
|
3
3
|
# AI-generated page content
|
|
4
4
|
|
|
@@ -7,3 +7,13 @@ AI-generated pages must not contain redundant explanatory text.
|
|
|
7
7
|
- No filler introductions, repeated summaries, or prose that only explains an obvious control
|
|
8
8
|
- Prefer concise labels, headings, helper text, and empty states
|
|
9
9
|
- Put rationale and implementation detail in docs or code comments, not in the UI, unless the user asks for explanatory content
|
|
10
|
+
|
|
11
|
+
## Duaer brand (site-wide)
|
|
12
|
+
|
|
13
|
+
Visible live-desk / FED copy that names the product surface must include the
|
|
14
|
+
**Duaer** brand (or **Duaer-spec FED** where that full mark is already used).
|
|
15
|
+
|
|
16
|
+
- Do not write anonymous「台面」/ “desk” alone when referring to this product’s
|
|
17
|
+
chat surface or model setup — prefer「Duaer 台面」/ “Duaer desk”
|
|
18
|
+
- Keep helper text short; branding is a name signal, not a slogan paragraph
|
|
19
|
+
- Applies to i18n strings, HTML fallbacks, empty states, and setup/settings copy
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
description:
|
|
2
|
+
description: Desk UI copy — minimal + Duaer brand (duaer-spec agent ops)
|
|
3
3
|
alwaysApply: true
|
|
4
4
|
---
|
|
5
5
|
|
|
@@ -10,3 +10,13 @@ AI-generated pages must not contain redundant explanatory text.
|
|
|
10
10
|
- No filler introductions, repeated summaries, or prose that only explains an obvious control
|
|
11
11
|
- Prefer concise labels, headings, helper text, and empty states
|
|
12
12
|
- Put rationale and implementation detail in docs or code comments, not in the UI, unless the user asks for explanatory content
|
|
13
|
+
|
|
14
|
+
## Duaer brand (site-wide)
|
|
15
|
+
|
|
16
|
+
Visible live-desk / FED copy that names the product surface must include the
|
|
17
|
+
**Duaer** brand (or **Duaer-spec FED** where that full mark is already used).
|
|
18
|
+
|
|
19
|
+
- Do not write anonymous「台面」/ “desk” alone when referring to this product’s
|
|
20
|
+
chat surface or model setup — prefer「Duaer 台面」/ “Duaer desk”
|
|
21
|
+
- Keep helper text short; branding is a name signal, not a slogan paragraph
|
|
22
|
+
- Applies to i18n strings, HTML fallbacks, empty states, and setup/settings copy
|
package/.duaer/active-job.json
CHANGED
package/.duaer/handoff.json
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 1,
|
|
3
3
|
"onWorktreeRemove": {
|
|
4
|
-
"stop": "Stop any process whose working directory is under the request worktree (dev servers, file watchers, local APIs).",
|
|
4
|
+
"stop": "Stop any process whose working directory is under the request worktree (dev servers, file watchers, local APIs). Also stop the FED desk if it was started from a worktree copy of duaer-live.",
|
|
5
5
|
"restartFromPrimary": true,
|
|
6
|
-
"commands": [
|
|
6
|
+
"commands": [
|
|
7
|
+
"launchctl kickstart -k \"gui/$(id -u)/com.duaer.live8787\" 2>/dev/null || (lsof -t -iTCP:8787 -sTCP:LISTEN | xargs kill 2>/dev/null; sleep 1; node bin/duaer-live.mjs --port 8787)"
|
|
8
|
+
]
|
|
7
9
|
},
|
|
8
|
-
"notes": "After
|
|
10
|
+
"notes": "After merge to develop: remove worktree, then restart Duaer-spec FED (LaunchAgent com.duaer.live8787) so /api/projects and other new routes load from primary checkout."
|
|
9
11
|
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"status": "accepted",
|
|
3
|
+
"acceptedAt": "2026-09-18T01:00:00.000Z",
|
|
4
|
+
"summary": "Position norms → satisfactory delivery; stricter checkable acceptance gate for confirm/revise; docs and live hints updated.",
|
|
5
|
+
"verification": {
|
|
6
|
+
"levels": ["L0", "L1", "L3"],
|
|
7
|
+
"commands": ["npm test"],
|
|
8
|
+
"result": "pass (18 tests)"
|
|
9
|
+
}
|
|
10
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# Feature Specification: Spec AI for satisfactory delivery
|
|
2
|
+
|
|
3
|
+
**Feature Branch**: `feat/satisfactory-delivery`
|
|
4
|
+
|
|
5
|
+
**Created**: 2026-09-18
|
|
6
|
+
|
|
7
|
+
**Status**: Accepted
|
|
8
|
+
|
|
9
|
+
## Goal
|
|
10
|
+
|
|
11
|
+
Position Duaer as **规范 AI → 满意交付**: acceptance must be objectively
|
|
12
|
+
checkable before confirm/revise dispatch, and public docs lead with that
|
|
13
|
+
promise—not phase/skill names.
|
|
14
|
+
|
|
15
|
+
## In scope
|
|
16
|
+
|
|
17
|
+
- Stricter local + LLM validate gate for confirm and revise cards
|
|
18
|
+
- Positioning copy: README EN/ZH, package description, DUADER, live desk tag/hints
|
|
19
|
+
- Dispatch/revise agent prompts emphasize meeting Acceptance + openable preview
|
|
20
|
+
- Tests + CHANGELOG / E2E note
|
|
21
|
+
|
|
22
|
+
## Out of scope
|
|
23
|
+
|
|
24
|
+
- npm release / promote to main (ship when asked)
|
|
25
|
+
- Layout redesign
|
|
26
|
+
- New columns or cloud hosting
|
|
27
|
+
|
|
28
|
+
## Acceptance
|
|
29
|
+
|
|
30
|
+
1. Vague acceptance (e.g.「更好用」/ “looks better”) fails `/api/validate` locally
|
|
31
|
+
2. Checkable acceptance (open X / see Y / command passes) can still pass the gate
|
|
32
|
+
3. README EN/ZH lead with 规范 → 满意交付 (English: norms → satisfactory delivery)
|
|
33
|
+
4. `npm test` passes
|
|
34
|
+
|
|
35
|
+
## Assumptions
|
|
36
|
+
|
|
37
|
+
- Worktree: `.worktree/feat-satisfactory-delivery`
|
|
38
|
+
- Brief: `.duaer/specs/061-satisfactory-delivery/`
|
|
39
|
+
- User confirmed evolution direction; no further intent wait
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"status": "accepted",
|
|
3
|
+
"acceptedAt": "2026-09-18T01:20:00.000Z",
|
|
4
|
+
"summary": "Live desk launches DeepSeek TUI (deepseek) as a third CLI digital employee with PATH discovery for npm/nvm/cargo.",
|
|
5
|
+
"verification": {
|
|
6
|
+
"levels": ["L0", "L1", "L3"],
|
|
7
|
+
"commands": ["npm test"],
|
|
8
|
+
"result": "pass (19 tests)"
|
|
9
|
+
}
|
|
10
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# Feature Specification: DeepSeek CLI digital employee
|
|
2
|
+
|
|
3
|
+
**Feature Branch**: `feat/deepseek-cli`
|
|
4
|
+
|
|
5
|
+
**Created**: 2026-09-18
|
|
6
|
+
|
|
7
|
+
**Status**: Accepted
|
|
8
|
+
|
|
9
|
+
## Goal
|
|
10
|
+
|
|
11
|
+
Live desk can launch **DeepSeek TUI** (`deepseek` / `deepseek-tui`) as a third
|
|
12
|
+
CLI digital employee alongside Cursor Agent and Claude Code.
|
|
13
|
+
|
|
14
|
+
## In scope
|
|
15
|
+
|
|
16
|
+
- Detect `deepseek` on PATH (incl. npm global / nvm / cargo bins under launchd)
|
|
17
|
+
- Dispatch + revise Terminal launch with workspace, YOLO tools, optional `--continue`
|
|
18
|
+
- Preempt matching for deepseek processes; install hint `npm install -g deepseek-tui`
|
|
19
|
+
- README / i18n / tests
|
|
20
|
+
|
|
21
|
+
## Out of scope
|
|
22
|
+
|
|
23
|
+
- Embedding DeepSeek API chat (already used for desk validate) as the worker
|
|
24
|
+
- Shipping npm release unless asked
|
|
25
|
+
|
|
26
|
+
## Acceptance
|
|
27
|
+
|
|
28
|
+
1. With `deepseek` installed, desk lists **DeepSeek** as available CLI
|
|
29
|
+
2. Dispatch/revise enqueue a Terminal command using `deepseek -w <worktree> …`
|
|
30
|
+
3. Without `deepseek`, missing list shows install command
|
|
31
|
+
4. `npm test` passes
|
|
32
|
+
|
|
33
|
+
## Assumptions
|
|
34
|
+
|
|
35
|
+
- Target CLI: DeepSeek-TUI entrypoint `deepseek` (`npm i -g deepseek-tui`)
|
|
36
|
+
- Worktree: `.worktree/feat-deepseek-cli`
|
|
37
|
+
- Brief: `.duaer/specs/062-deepseek-cli/`
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# Feature Specification: Fix queuedCount ReferenceError
|
|
2
|
+
|
|
3
|
+
**Feature Branch**: `fix/queued-count`
|
|
4
|
+
**Brief**: `.duaer/specs/063-queued-count/`
|
|
5
|
+
**Status**: Active
|
|
6
|
+
|
|
7
|
+
## Goal
|
|
8
|
+
Fresh Terminal open path must not throw `queuedCount is not defined`.
|
|
9
|
+
|
|
10
|
+
## Acceptance
|
|
11
|
+
1. Unhealthy-runner launch return uses a defined queue depth
|
|
12
|
+
2. `npm test` passes
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"status": "accepted",
|
|
3
|
+
"acceptedAt": "2026-09-18T02:00:00.000Z",
|
|
4
|
+
"summary": "Missing CLI chips show install commands; install panel + redetect for PATH refresh.",
|
|
5
|
+
"verification": {
|
|
6
|
+
"levels": ["L0", "L1", "L3"],
|
|
7
|
+
"commands": ["npm test"],
|
|
8
|
+
"result": "pass (19 tests)"
|
|
9
|
+
}
|
|
10
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# Feature Specification: Show CLI install commands when missing
|
|
2
|
+
|
|
3
|
+
**Feature Branch**: `feat/cli-install-show`
|
|
4
|
+
**Brief**: `.duaer/specs/064-cli-install-show/`
|
|
5
|
+
**Status**: Accepted
|
|
6
|
+
|
|
7
|
+
## Goal
|
|
8
|
+
|
|
9
|
+
「用哪个 CLI 数字员工启动」must detect install status; if not installed,
|
|
10
|
+
show the install command clearly (on the chip + install panel), with redetect.
|
|
11
|
+
|
|
12
|
+
## Acceptance
|
|
13
|
+
|
|
14
|
+
1. Missing CLIs render as distinct chips with install command text visible
|
|
15
|
+
2. Install panel lists the selected missing CLI’s command + copy button
|
|
16
|
+
3. Redetect button refreshes `/api/agents`
|
|
17
|
+
4. `npm test` passes
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"status": "accepted",
|
|
3
|
+
"acceptedAt": "2026-09-18T00:00:00.000Z",
|
|
4
|
+
"featureDir": ".duaer/specs/065-detailed-progress",
|
|
5
|
+
"branch": "feat/detailed-progress",
|
|
6
|
+
"worktree": ".worktree/feat-detailed-progress",
|
|
7
|
+
"verification": {
|
|
8
|
+
"levels": ["L0", "L1", "L3"],
|
|
9
|
+
"commands": [
|
|
10
|
+
"node --check bin/duaer-live.mjs",
|
|
11
|
+
"node --check bin/live-progress.mjs",
|
|
12
|
+
"node --check web/live-dev/app.js",
|
|
13
|
+
"npm test",
|
|
14
|
+
"npm run test:live"
|
|
15
|
+
],
|
|
16
|
+
"notes": "Richer default tasks.md, status.activity, progress-activity UI"
|
|
17
|
+
}
|
|
18
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# Feature Specification: Detailed coding progress
|
|
2
|
+
|
|
3
|
+
**Feature Branch**: `feat/detailed-progress`
|
|
4
|
+
**Brief**: `.duaer/specs/065-detailed-progress/`
|
|
5
|
+
**Status**: Active
|
|
6
|
+
|
|
7
|
+
## Goal
|
|
8
|
+
|
|
9
|
+
Live desk progress shows more than 3 coarse tasks: a finer `tasks.md`
|
|
10
|
+
checklist on dispatch, stronger agent check-off rules, and live worktree
|
|
11
|
+
file activity while the CLI runs.
|
|
12
|
+
|
|
13
|
+
## Acceptance
|
|
14
|
+
|
|
15
|
+
1. New dispatch writes ≥6 checkbox tasks (not only T001–T003)
|
|
16
|
+
2. `/api/status` includes `activity` (recent changed files / git porcelain)
|
|
17
|
+
3. Progress column shows activity under the task list while work is running
|
|
18
|
+
4. Agent launch prompt requires expanding/checking detailed tasks
|
|
19
|
+
5. `npm test` passes
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"status": "accepted",
|
|
3
|
+
"acceptedAt": "2026-09-18T00:00:00.000Z",
|
|
4
|
+
"featureDir": ".duaer/specs/066-duaer-fed",
|
|
5
|
+
"branch": "feat/duaer-fed",
|
|
6
|
+
"worktree": ".worktree/feat-duaer-fed",
|
|
7
|
+
"verification": {
|
|
8
|
+
"levels": ["L0", "L1", "L3"],
|
|
9
|
+
"commands": [
|
|
10
|
+
"node --check bin/duaer-live.mjs",
|
|
11
|
+
"node --check web/live-dev/i18n.js",
|
|
12
|
+
"npm test",
|
|
13
|
+
"npm run test:live"
|
|
14
|
+
]
|
|
15
|
+
}
|
|
16
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# Feature Specification: Brand live desk as Duaer FED
|
|
2
|
+
|
|
3
|
+
**Feature Branch**: `feat/duaer-fed`
|
|
4
|
+
**Brief**: `.duaer/specs/066-duaer-fed/`
|
|
5
|
+
**Status**: Active
|
|
6
|
+
|
|
7
|
+
## Goal
|
|
8
|
+
|
|
9
|
+
User-facing name for the web confirm desk is **Duaer FED** (Field
|
|
10
|
+
Engineering Desk). Chinese keeps「现场开发」as the secondary mark.
|
|
11
|
+
|
|
12
|
+
## Acceptance
|
|
13
|
+
|
|
14
|
+
1. Desk header brand + document title show `Duaer FED`
|
|
15
|
+
2. zh mark is「现场开发」; en mark is `Field Engineering Desk`
|
|
16
|
+
3. README EN/ZH section titles use Duaer FED; CLI help / start banner say FED
|
|
17
|
+
4. Agent/system prompts refer to Duaer FED (not only「现场开发」)
|
|
18
|
+
5. `duaer live` command path unchanged; `npm test` + `npm run test:live` pass
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"status": "accepted",
|
|
3
|
+
"acceptedAt": "2026-09-18T00:00:00.000Z",
|
|
4
|
+
"featureDir": ".duaer/specs/067-duaer-spec-fed",
|
|
5
|
+
"branch": "feat/duaer-spec-fed",
|
|
6
|
+
"worktree": ".worktree/feat-duaer-spec-fed",
|
|
7
|
+
"verification": {
|
|
8
|
+
"levels": ["L0", "L1", "L3"],
|
|
9
|
+
"commands": ["npm test", "npm run test:live"]
|
|
10
|
+
}
|
|
11
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# Feature Specification: Brand as Duaer-spec FED
|
|
2
|
+
|
|
3
|
+
**Feature Branch**: `feat/duaer-spec-fed`
|
|
4
|
+
**Brief**: `.duaer/specs/067-duaer-spec-fed/`
|
|
5
|
+
**Status**: Active
|
|
6
|
+
|
|
7
|
+
## Goal
|
|
8
|
+
|
|
9
|
+
Correct the live desk product name from `Duaer FED` to **Duaer-spec FED**
|
|
10
|
+
(tied to the duaer-spec product).
|
|
11
|
+
|
|
12
|
+
## Acceptance
|
|
13
|
+
|
|
14
|
+
1. Header, title, CLI banner/help, README, and agent prompts say `Duaer-spec FED`
|
|
15
|
+
2. Secondary marks unchanged (zh on-site desk / en Field Engineering Desk)
|
|
16
|
+
3. Brand tests updated; `npm test` + `npm run test:live` pass
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"status": "accepted",
|
|
3
|
+
"acceptedAt": "2026-09-18T00:00:00.000Z",
|
|
4
|
+
"featureDir": ".duaer/specs/068-fed-ux-polish",
|
|
5
|
+
"branch": "feat/fed-ux-polish",
|
|
6
|
+
"worktree": ".worktree/feat-fed-ux-polish",
|
|
7
|
+
"verification": {
|
|
8
|
+
"levels": ["L0", "L1", "L3"],
|
|
9
|
+
"commands": ["npm test", "npm run test:live"]
|
|
10
|
+
}
|
|
11
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# Feature Specification: FED UX polish
|
|
2
|
+
|
|
3
|
+
**Feature Branch**: `feat/fed-ux-polish`
|
|
4
|
+
**Brief**: `.duaer/specs/068-fed-ux-polish/`
|
|
5
|
+
**Status**: Active
|
|
6
|
+
|
|
7
|
+
## Goal
|
|
8
|
+
|
|
9
|
+
Raise Duaer-spec FED visual and interaction quality: fix missing surface
|
|
10
|
+
styles, clearer hierarchy (brand / CTAs / empty states), without a layout
|
|
11
|
+
redesign or light-theme flip.
|
|
12
|
+
|
|
13
|
+
## Acceptance
|
|
14
|
+
|
|
15
|
+
1. History drawer and install/code chips have readable dark surfaces
|
|
16
|
+
2. Brand shows `Duaer-spec` + accented `FED`; chat + progress have empty states
|
|
17
|
+
3. Primary / confirm CTAs read as stronger go-actions; scrollbars + selection styled
|
|
18
|
+
4. `npm test` + `npm run test:live` pass
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# Feature Specification: Align history button size
|
|
2
|
+
|
|
3
|
+
**Feature Branch**: `fix/history-btn-size`
|
|
4
|
+
**Brief**: `.duaer/specs/069-history-btn-size/`
|
|
5
|
+
**Status**: Active
|
|
6
|
+
|
|
7
|
+
## Goal
|
|
8
|
+
|
|
9
|
+
Header **History** control matches the language `<select>` height and padding.
|
|
10
|
+
|
|
11
|
+
## Acceptance
|
|
12
|
+
|
|
13
|
+
1. History button and lang select share the same control height / type size
|
|
14
|
+
2. `npm test` + `npm run test:live` pass
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# Feature Specification: Auto-handle on validate fail
|
|
2
|
+
|
|
3
|
+
**Feature Branch**: `feat/validate-autofix-btn`
|
|
4
|
+
**Brief**: `.duaer/specs/070-validate-autofix-btn/`
|
|
5
|
+
**Status**: Active
|
|
6
|
+
|
|
7
|
+
## Goal
|
|
8
|
+
|
|
9
|
+
When the confirm/revise card shows validation failed, offer an **自动处理**
|
|
10
|
+
button that runs auto-fix and reports progress in the chat column.
|
|
11
|
+
|
|
12
|
+
## Acceptance
|
|
13
|
+
|
|
14
|
+
1. Failed validate shows an **自动处理** button near the fail hint
|
|
15
|
+
2. Click posts a chat bubble and calls `/api/validate/fix`, then updates the card
|
|
16
|
+
3. Success unlocks confirm/revise dispatch without forcing silent lock; failure stays retryable in chat
|
|
17
|
+
4. `npm test` + `npm run test:live` pass
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# Feature Specification: Structured requirements display
|
|
2
|
+
|
|
3
|
+
**Feature Branch**: `feat/req-structured-display`
|
|
4
|
+
**Brief**: `.duaer/specs/071-req-structured-display/`
|
|
5
|
+
**Status**: Active
|
|
6
|
+
|
|
7
|
+
## Goal
|
|
8
|
+
|
|
9
|
+
Middle confirm/revise card fields show structured blocks (lists / items),
|
|
10
|
+
not one jammed paragraph when the model returns `;` / `;` / numbered clauses.
|
|
11
|
+
|
|
12
|
+
## Acceptance
|
|
13
|
+
|
|
14
|
+
1. Semicolon-joined acceptance renders as separate list items
|
|
15
|
+
2. Inline `1、… 2、…` renders as an ordered list
|
|
16
|
+
3. List items have clear visual separation (req-item)
|
|
17
|
+
4. `npm test` + `npm run test:live` pass
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"status": "accepted",
|
|
3
|
+
"acceptedAt": "2026-09-18T00:00: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
|
+
"summary": "Chat send no longer silent when locked; Enter-to-send; composer sync; locked card skips applyCard writes."
|
|
14
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# Feature Specification: Chat send not silent / stuck
|
|
2
|
+
|
|
3
|
+
**Feature Branch**: `fix/chat-send`
|
|
4
|
+
**Brief**: `.duaer/specs/072-chat-send/`
|
|
5
|
+
**Status**: Active
|
|
6
|
+
|
|
7
|
+
## Goal
|
|
8
|
+
|
|
9
|
+
Live desk chat must always give clear feedback when send is blocked, keep the
|
|
10
|
+
Send control in sync with gate state, support Enter-to-send, and remain usable
|
|
11
|
+
after Confirm / History restore (conversation without silently mutating a
|
|
12
|
+
locked Brief).
|
|
13
|
+
|
|
14
|
+
## Problem
|
|
15
|
+
|
|
16
|
+
Composer submit returns early when `locked` / `busy` / not ready with **no**
|
|
17
|
+
UI feedback; Send stays enabled while locked, so clicks look broken. Enter in
|
|
18
|
+
the textarea only inserts a newline. After Confirm or History restore, chat is
|
|
19
|
+
fully blocked even for clarifying dialogue.
|
|
20
|
+
|
|
21
|
+
## In scope
|
|
22
|
+
|
|
23
|
+
- `chatAllowed` / block reasons surfaced in chat (not silent)
|
|
24
|
+
- `syncComposerEnabled` for Send (+ optional placeholder)
|
|
25
|
+
- Enter sends; Shift+Enter newline
|
|
26
|
+
- When specify card is locked: still allow chat; skip applying card field
|
|
27
|
+
updates from the model (direct user to Revise for Brief changes)
|
|
28
|
+
- Stuck `busy` recovery when user retries after a long wait
|
|
29
|
+
|
|
30
|
+
## Out of scope
|
|
31
|
+
|
|
32
|
+
- Changing validate-before-confirm gate
|
|
33
|
+
- Revise dispatch / Terminal behavior
|
|
34
|
+
|
|
35
|
+
## Acceptance
|
|
36
|
+
|
|
37
|
+
1. Locked specify job: typing + Send (or Enter) posts a user bubble and gets a
|
|
38
|
+
reply (or a clear busy/not-ready message); locked card fields are not
|
|
39
|
+
overwritten by chat `goal`/`acceptance` patches
|
|
40
|
+
2. While busy / not ready / revise-dispatching: Send is disabled or a bot bubble
|
|
41
|
+
explains why; no silent no-op
|
|
42
|
+
3. Enter sends; Shift+Enter keeps newline
|
|
43
|
+
4. `node --check web/live-dev/app.js`; `npm test`; `npm run test:live`
|
|
44
|
+
|
|
45
|
+
## Assumptions
|
|
46
|
+
|
|
47
|
+
- Worktree: `.worktree/fix-chat-send` (not named `072-chat-send`)
|
|
48
|
+
- Hotfix: clear repro → implement after Brief without blocking confirm wait
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"status": "accepted",
|
|
3
|
+
"acceptedAt": "2026-09-18T00:00:00.000Z",
|
|
4
|
+
"verification": {
|
|
5
|
+
"levels": ["L0", "L1", "L3"],
|
|
6
|
+
"commands": ["node --check web/live-dev/i18n.js", "npm test", "npm run test:live"],
|
|
7
|
+
"result": "pass"
|
|
8
|
+
},
|
|
9
|
+
"summary": "Chat empty hint is three numbered steps instead of one semicolon line."
|
|
10
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# Feature Specification: Structured chat empty hint
|
|
2
|
+
|
|
3
|
+
**Feature Branch**: `feat/empty-structured`
|
|
4
|
+
**Brief**: `.duaer/specs/073-empty-structured/`
|
|
5
|
+
**Status**: Active
|
|
6
|
+
|
|
7
|
+
## Goal
|
|
8
|
+
|
|
9
|
+
Chat empty-state guidance (“用大白话说想要什么…”) shows as a **structured
|
|
10
|
+
step list**, not one jammed semicolon sentence.
|
|
11
|
+
|
|
12
|
+
## In scope
|
|
13
|
+
|
|
14
|
+
- Empty hint as ordered / stepped blocks (zh + en)
|
|
15
|
+
- Styles matching desk (no cards clutter)
|
|
16
|
+
- Locale switch updates the steps
|
|
17
|
+
|
|
18
|
+
## Out of scope
|
|
19
|
+
|
|
20
|
+
- Confirm-card structuredHtml changes
|
|
21
|
+
- Onboarding wizard beyond empty state
|
|
22
|
+
|
|
23
|
+
## Acceptance
|
|
24
|
+
|
|
25
|
+
1. Empty state shows discrete steps (plain words → confirm/dispatch → deliver
|
|
26
|
+
to acceptance), not a single `;`/`;` line
|
|
27
|
+
2. Locale switch updates steps; first bubble still hides empty state
|
|
28
|
+
3. `npm test` + `npm run test:live` pass
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"status": "accepted",
|
|
3
|
+
"acceptedAt": "2026-09-18T00:00:00.000Z",
|
|
4
|
+
"verification": {
|
|
5
|
+
"levels": ["L0", "L1", "L3"],
|
|
6
|
+
"commands": ["node --check bin/duaer-live.mjs", "npm test", "npm run test:live"],
|
|
7
|
+
"result": "pass"
|
|
8
|
+
},
|
|
9
|
+
"summary": "Serve .mjs as text/javascript so structured-html module loads and desk chat UI runs."
|
|
10
|
+
}
|