duaer-spec 0.15.0 → 0.17.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/.duaer/active-job.json +4 -4
- package/.duaer/memory/testing.md +7 -2
- package/.duaer/specs/056-revise-reliability/delivery.json +13 -0
- package/.duaer/specs/056-revise-reliability/spec.md +44 -0
- package/.duaer/specs/056-revise-reliability/tasks.md +10 -0
- package/.duaer/specs/057-progress-accepted/delivery.json +9 -0
- package/.duaer/specs/057-progress-accepted/spec.md +42 -0
- package/.duaer/specs/057-progress-accepted/tasks.md +8 -0
- package/.duaer/specs/058-revise-progress-track/delivery.json +13 -0
- package/.duaer/specs/058-revise-progress-track/spec.md +48 -0
- package/.duaer/specs/058-revise-progress-track/tasks.md +9 -0
- package/.duaer/specs/059-revise-preempt-order/delivery.json +13 -0
- package/.duaer/specs/059-revise-preempt-order/spec.md +47 -0
- package/.duaer/specs/059-revise-preempt-order/tasks.md +8 -0
- package/.duaer/specs/060-release-016/delivery.json +10 -0
- package/.duaer/specs/060-release-016/spec.md +24 -0
- package/.duaer/specs/060-release-016/tasks.md +4 -0
- 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/spec.md +15 -0
- package/.duaer/specs/087-release-017/tasks.md +4 -0
- package/CHANGELOG.md +176 -0
- package/DUADER.md +11 -6
- package/README.md +22 -14
- package/README.zh-CN.md +11 -8
- package/bin/duaer-live.mjs +668 -143
- package/bin/duaer.mjs +1 -1
- package/bin/live-progress.mjs +189 -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/docs/agent/README.md +2 -0
- package/docs/agent/e2e-test-plan.md +39 -2
- package/docs/agent/worker-models.md +75 -0
- package/docs/agent/worker-models.zh-CN.md +68 -0
- package/package.json +2 -2
- package/web/live-dev/app.js +469 -144
- package/web/live-dev/choice-options.mjs +59 -0
- package/web/live-dev/i18n.js +147 -38
- package/web/live-dev/index.html +50 -15
- package/web/live-dev/structured-html.mjs +121 -0
- package/web/live-dev/styles.css +546 -114
package/.duaer/active-job.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
|
-
"featureDir": ".duaer/specs/
|
|
3
|
-
"
|
|
4
|
-
"
|
|
5
|
-
"
|
|
2
|
+
"featureDir": ".duaer/specs/087-release-017",
|
|
3
|
+
"slug": "087-release-017",
|
|
4
|
+
"branch": "chore/release-017",
|
|
5
|
+
"worktree": ".worktree/chore-release-017"
|
|
6
6
|
}
|
package/.duaer/memory/testing.md
CHANGED
|
@@ -41,8 +41,13 @@ Covers without a paid LLM:
|
|
|
41
41
|
3. `/api/validate` pass and `/api/validate/fix` via an in-process mock
|
|
42
42
|
OpenAI-compatible server
|
|
43
43
|
|
|
44
|
-
|
|
45
|
-
|
|
44
|
+
Also run `npm test` (includes revise-reliability contract tests: Brief
|
|
45
|
+
snapshot/rollback helpers + source markers for `PREEMPT_FAILED` / longer
|
|
46
|
+
client timeout).
|
|
47
|
+
|
|
48
|
+
Does **not** cover: real model quality, live Terminal CLI launch against a
|
|
49
|
+
real Cursor/Claude session. Those stay manual E2E catalog rows (E2E-055) or
|
|
50
|
+
future suites.
|
|
46
51
|
|
|
47
52
|
## Opt-in (still need an explicit ask or Spec note)
|
|
48
53
|
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"status": "accepted",
|
|
3
|
+
"summary": "Revise dispatch: honest preempt, Brief rollback on launch fail, structured retryable errors, terminal status line, longer client wait.",
|
|
4
|
+
"verification": {
|
|
5
|
+
"levels": ["L0", "L3"],
|
|
6
|
+
"commands": [
|
|
7
|
+
"node --check bin/duaer-live.mjs",
|
|
8
|
+
"npm run test:live",
|
|
9
|
+
"node --test test/revise-reliability.test.mjs"
|
|
10
|
+
],
|
|
11
|
+
"notes": "E2E-055 manual for live Terminal preempt path."
|
|
12
|
+
}
|
|
13
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# Feature Specification: Revise round reliability
|
|
2
|
+
|
|
3
|
+
**Feature Branch**: `feat/revise-reliability`
|
|
4
|
+
|
|
5
|
+
**Created**: 2026-09-17
|
|
6
|
+
|
|
7
|
+
**Status**: Active
|
|
8
|
+
|
|
9
|
+
## Goal
|
|
10
|
+
|
|
11
|
+
Revise dispatch is **observable**, **retryable**, and failures are **readable**:
|
|
12
|
+
confirm → Terminal enqueue must not report success when preempt failed; Brief
|
|
13
|
+
mutations must not stick after a failed launch; client timeout matches server
|
|
14
|
+
budgets; status exposes Terminal busy/queue; UI keeps dispatch unlocked when
|
|
15
|
+
retryable.
|
|
16
|
+
|
|
17
|
+
## In scope
|
|
18
|
+
|
|
19
|
+
- Honest preempt outcome (no false preempted / false HTTP 200)
|
|
20
|
+
- Rollback Brief writes if launch/enqueue fails
|
|
21
|
+
- Structured revise errors (`code`, `retryable`) + UI copy
|
|
22
|
+
- Align client `/api/revise` abort with recreate/init budgets (~3 min)
|
|
23
|
+
- `/api/status` includes `terminal: { busy, queueDepth, runnerHealthy }`
|
|
24
|
+
- Minimal status/hint line; extend L3 smoke for error shape / rollback unit
|
|
25
|
+
|
|
26
|
+
## Out of scope
|
|
27
|
+
|
|
28
|
+
- Desk layout / column redesign
|
|
29
|
+
- Full Playwright Terminal automation
|
|
30
|
+
- Paid live LLM quality
|
|
31
|
+
|
|
32
|
+
## Acceptance
|
|
33
|
+
|
|
34
|
+
1. When preempt cannot clear leftover agents, `/api/revise` fails with
|
|
35
|
+
`PREEMPT_FAILED` and does **not** lock the revise card
|
|
36
|
+
2. Failed launch does not leave a new Revision block in Brief (rollback)
|
|
37
|
+
3. Client wait ≥ worst-case recreate path; timeout message mentions retry
|
|
38
|
+
4. Status poll shows terminal busy/queue when revising
|
|
39
|
+
5. `npm run test:live` still passes; new smoke/unit covers rollback or error codes
|
|
40
|
+
|
|
41
|
+
## Assumptions
|
|
42
|
+
|
|
43
|
+
- Worktree: `.worktree/feat-revise-reliability`
|
|
44
|
+
- Brief: `.duaer/specs/056-revise-reliability/`
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
# Tasks: Revise round reliability
|
|
2
|
+
|
|
3
|
+
**Brief**: `.duaer/specs/056-revise-reliability/`
|
|
4
|
+
|
|
5
|
+
## Checklist
|
|
6
|
+
|
|
7
|
+
- [x] Honest preempt + PREEMPT_FAILED; Brief rollback on launch fail
|
|
8
|
+
- [x] Structured errors on `/api/revise`; status.terminal
|
|
9
|
+
- [x] UI: longer timeout, retryable unlock, terminal line, i18n
|
|
10
|
+
- [x] L3 / unit smoke; docs; accept; merge develop
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# Feature Specification: Progress sync when delivery accepted
|
|
2
|
+
|
|
3
|
+
**Feature Branch**: `fix/progress-accepted`
|
|
4
|
+
|
|
5
|
+
**Created**: 2026-09-17
|
|
6
|
+
|
|
7
|
+
**Status**: Active
|
|
8
|
+
|
|
9
|
+
## Goal
|
|
10
|
+
|
|
11
|
+
Task progress must not show `0/N · delivery accepted · 工单完成`. When
|
|
12
|
+
`delivery.json` is `accepted`, the desk treats tasks as complete (done ===
|
|
13
|
+
total) and reconciles unchecked boxes in `tasks.md` when safe.
|
|
14
|
+
|
|
15
|
+
## Problem
|
|
16
|
+
|
|
17
|
+
`dispatchStatus` only rewrites `progress.current` on accept; `done` stays at
|
|
18
|
+
the unchecked count. Agents often stamp `delivery.json` without flipping every
|
|
19
|
+
`- [ ]` to `- [x]`, so 任务跟进 shows a contradictory `0/3 · …工单完成`.
|
|
20
|
+
|
|
21
|
+
## In scope
|
|
22
|
+
|
|
23
|
+
- Normalize progress when accepted: `done = total`, all task rows `done: true`
|
|
24
|
+
- Reconcile `tasks.md` unchecked boxes to `[x]` once when accepted (idempotent)
|
|
25
|
+
- Unit/smoke coverage; short README/CHANGELOG/E2E note
|
|
26
|
+
|
|
27
|
+
## Out of scope
|
|
28
|
+
|
|
29
|
+
- Changing how agents are prompted (except if a one-line reminder helps)
|
|
30
|
+
- Progress column layout redesign
|
|
31
|
+
|
|
32
|
+
## Acceptance
|
|
33
|
+
|
|
34
|
+
1. Accepted delivery never surfaces `done < total` with an “工单完成 /
|
|
35
|
+
delivery accepted” current line
|
|
36
|
+
2. Unchecked tasks in Brief are marked `[x]` after status observes accept
|
|
37
|
+
3. `npm test` / `npm run test:live` pass
|
|
38
|
+
|
|
39
|
+
## Assumptions
|
|
40
|
+
|
|
41
|
+
- Worktree: `.worktree/fix-progress-accepted`
|
|
42
|
+
- Brief: `.duaer/specs/057-progress-accepted/`
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"status": "accepted",
|
|
3
|
+
"acceptedAt": "2026-09-17T09:50:00.000Z",
|
|
4
|
+
"summary": "Revise-round progress scopes to Revision N / R{n}-* tasks; lagging accepted + busy Terminal no longer freezes on 工单完成.",
|
|
5
|
+
"verification": {
|
|
6
|
+
"levels": ["L0", "L1", "L3"],
|
|
7
|
+
"commands": [
|
|
8
|
+
"node --check bin/duaer-live.mjs",
|
|
9
|
+
"npm test"
|
|
10
|
+
],
|
|
11
|
+
"result": "pass (14 tests)"
|
|
12
|
+
}
|
|
13
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# Feature Specification: Track revise-round task progress
|
|
2
|
+
|
|
3
|
+
**Feature Branch**: `fix/revise-progress-track`
|
|
4
|
+
|
|
5
|
+
**Created**: 2026-09-17
|
|
6
|
+
|
|
7
|
+
**Status**: Accepted
|
|
8
|
+
|
|
9
|
+
## Goal
|
|
10
|
+
|
|
11
|
+
After **Confirm revise and dispatch**, 任务跟进 shows **this revision’s**
|
|
12
|
+
checklist and updates as work starts — not the prior dispatch’s completed
|
|
13
|
+
`T001…` pile, and not a frozen “delivery accepted · 工单完成” while Terminal
|
|
14
|
+
is already running the revise.
|
|
15
|
+
|
|
16
|
+
## Problem
|
|
17
|
+
|
|
18
|
+
Progress parses the whole `tasks.md`. After revise, old tasks stay `[x]` so
|
|
19
|
+
the bar looks finished (or accepted-normalized to N/N) while the new `R{n}-*`
|
|
20
|
+
round has started. Live `revisionCount` can lag; status may still say
|
|
21
|
+
`accepted`, so the wrong run-block is updated and revise work looks untracked.
|
|
22
|
+
|
|
23
|
+
## In scope
|
|
24
|
+
|
|
25
|
+
- Scope progress to dispatch (pre-Revision section) vs active `Revision N`
|
|
26
|
+
- Infer active revision from job / delivery / tasks.md headers and `R{n}` ids
|
|
27
|
+
- While revising (or Terminal busy with open `R{n}` tasks), do not force
|
|
28
|
+
accept-complete progress
|
|
29
|
+
- Persist inferred `revisionCount` onto the live job when missing
|
|
30
|
+
- Tests + CHANGELOG / E2E note
|
|
31
|
+
|
|
32
|
+
## Out of scope
|
|
33
|
+
|
|
34
|
+
- Layout / column redesign
|
|
35
|
+
- Changing revise launch / preempt behavior
|
|
36
|
+
|
|
37
|
+
## Acceptance
|
|
38
|
+
|
|
39
|
+
1. After Confirm revise, progress shows only this revision’s tasks (e.g. `0/3`
|
|
40
|
+
then rising), under the Revision N run block
|
|
41
|
+
2. While revise is active, status is not stuck on `delivery accepted · 工单完成`
|
|
42
|
+
3. When revise delivery accepts, that revision shows `N/N · …完成`
|
|
43
|
+
4. `npm test` passes
|
|
44
|
+
|
|
45
|
+
## Assumptions
|
|
46
|
+
|
|
47
|
+
- Worktree: `.worktree/fix-revise-progress-track`
|
|
48
|
+
- Brief: `.duaer/specs/058-revise-progress-track/`
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# Tasks: Track revise-round task progress
|
|
2
|
+
|
|
3
|
+
**Brief**: `.duaer/specs/058-revise-progress-track/`
|
|
4
|
+
|
|
5
|
+
## Checklist
|
|
6
|
+
|
|
7
|
+
- [x] Scope parseTasksProgress by revision; infer active revision
|
|
8
|
+
- [x] Revising / busy Terminal skips accept-complete normalize
|
|
9
|
+
- [x] Tests + docs; merge develop
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"status": "accepted",
|
|
3
|
+
"acceptedAt": "2026-09-17T10:05:00.000Z",
|
|
4
|
+
"summary": "priorAccepted revise preempts leftovers before enqueue so Confirm revise no longer returns PREEMPT_FAILED while the revise Agent is already running.",
|
|
5
|
+
"verification": {
|
|
6
|
+
"levels": ["L0", "L1", "L3"],
|
|
7
|
+
"commands": [
|
|
8
|
+
"node --check bin/duaer-live.mjs",
|
|
9
|
+
"npm test"
|
|
10
|
+
],
|
|
11
|
+
"result": "pass (14 tests)"
|
|
12
|
+
}
|
|
13
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# Feature Specification: Honest revise preempt (enqueue after clear)
|
|
2
|
+
|
|
3
|
+
**Feature Branch**: `fix/revise-preempt-order`
|
|
4
|
+
|
|
5
|
+
**Created**: 2026-09-17
|
|
6
|
+
|
|
7
|
+
**Status**: Accepted
|
|
8
|
+
|
|
9
|
+
## Goal
|
|
10
|
+
|
|
11
|
+
After Confirm revise, either the revise Agent is launched and the desk
|
|
12
|
+
reports success, or preempt truly failed and nothing was started — never
|
|
13
|
+
“Could not preempt…” while Terminal is already running the revise job.
|
|
14
|
+
|
|
15
|
+
## Problem
|
|
16
|
+
|
|
17
|
+
`launchInTerminal` enqueues the revise job **before** preempt. Within the
|
|
18
|
+
post-preempt wait, the runner starts the new Agent; status then sees
|
|
19
|
+
`busy && agentsLeft > 0` and throws `PREEMPT_FAILED`. The API rolls back
|
|
20
|
+
Brief while the queued revise Agent keeps working — UI error, work already
|
|
21
|
+
underway; retries kill that Agent.
|
|
22
|
+
|
|
23
|
+
## In scope
|
|
24
|
+
|
|
25
|
+
- Preempt leftover agents **before** enqueueing the revise Terminal job
|
|
26
|
+
- Fail `PREEMPT_FAILED` only when prior agents remain (nothing queued yet)
|
|
27
|
+
- Do not treat the newly started revise Agent as a preempt failure
|
|
28
|
+
- Tests + CHANGELOG / E2E note
|
|
29
|
+
|
|
30
|
+
## Out of scope
|
|
31
|
+
|
|
32
|
+
- Progress scoping (058)
|
|
33
|
+
- Changing when priorAccepted revise preempts vs waits
|
|
34
|
+
|
|
35
|
+
## Acceptance
|
|
36
|
+
|
|
37
|
+
1. priorAccepted revise: preempt clears leftovers, then enqueue; HTTP 200
|
|
38
|
+
2. If leftover agents cannot be cleared, `PREEMPT_FAILED` and **no** new
|
|
39
|
+
Terminal job for that attempt
|
|
40
|
+
3. Desk does not show preempt failure while revise Agent is already running
|
|
41
|
+
from that same Confirm tap
|
|
42
|
+
4. `npm test` passes
|
|
43
|
+
|
|
44
|
+
## Assumptions
|
|
45
|
+
|
|
46
|
+
- Worktree: `.worktree/fix-revise-preempt-order`
|
|
47
|
+
- Brief: `.duaer/specs/059-revise-preempt-order/`
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"status": "accepted",
|
|
3
|
+
"acceptedAt": "2026-09-18T00:00:00.000Z",
|
|
4
|
+
"summary": "Release 0.16.0: honest revise preempt, revise progress scope, accept progress sync.",
|
|
5
|
+
"verification": {
|
|
6
|
+
"levels": ["L0", "L1", "L3"],
|
|
7
|
+
"commands": ["npm test"],
|
|
8
|
+
"result": "pass (14 tests)"
|
|
9
|
+
}
|
|
10
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# Feature Specification: Release 0.16.0
|
|
2
|
+
|
|
3
|
+
**Feature Branch**: `feat/release-016`
|
|
4
|
+
|
|
5
|
+
**Created**: 2026-09-18
|
|
6
|
+
|
|
7
|
+
**Status**: Accepted
|
|
8
|
+
|
|
9
|
+
## Goal
|
|
10
|
+
|
|
11
|
+
Ship **0.16.0** to `main` + npm: revise reliability (honest preempt order),
|
|
12
|
+
revise-round progress tracking, and accept progress sync.
|
|
13
|
+
|
|
14
|
+
## Acceptance
|
|
15
|
+
|
|
16
|
+
1. `package.json` version `0.16.0`; CHANGELOG dated section; Unreleased cleared
|
|
17
|
+
2. `main` tagged `v0.16.0`; GitHub Release; npm `latest` is `0.16.0`
|
|
18
|
+
3. `npm test` passes before promote
|
|
19
|
+
|
|
20
|
+
## Assumptions
|
|
21
|
+
|
|
22
|
+
- Worktree: `.worktree/feat-release-016`
|
|
23
|
+
- Brief: `.duaer/specs/060-release-016/`
|
|
24
|
+
- User ask「发版」authorizes push + promote `develop` → `main`
|
|
@@ -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
|