duaer-spec 0.14.0 → 0.15.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.
@@ -1,6 +1,6 @@
1
1
  {
2
- "featureDir": ".duaer/specs/053-release-014",
3
- "branch": "feat/release-014",
4
- "worktree": ".worktree/feat-release-014",
2
+ "featureDir": ".duaer/specs/055-release-015",
3
+ "branch": "feat/release-015",
4
+ "worktree": ".worktree/feat-release-015",
5
5
  "status": "active"
6
6
  }
@@ -1,21 +1,22 @@
1
1
  # Testing expectations (project contract)
2
2
 
3
3
  Agents **must** read this file before marking work verified or accepting a job.
4
- Replace command examples with the adopting project's real scripts. Keep the
5
- level model and risk rules unless an ADR documents a change.
4
+ This file is the **duaer-spec** repo contract. Adopters replace command examples
5
+ with their product scripts; keep the level model and risk rules unless an ADR
6
+ documents a change.
6
7
 
7
8
  ## Levels
8
9
 
9
- | Level | What | Typical commands (replace) | Default owner |
10
+ | Level | What | Typical commands (this repo) | Default owner |
10
11
  |---|---|---|---|
11
- | **L0** | Lint / typecheck / static | `npm run lint`, `tsc --noEmit` | After every implementation pass |
12
- | **L1** | Unit tests for changed modules | `npm test` (or package subset) | Default for code changes |
12
+ | **L0** | Lint / typecheck / static | `node --check bin/duaer-live.mjs` `node --check web/live-dev/app.js` | After every implementation pass |
13
+ | **L1** | Unit tests for changed modules | `npm test` when unit files exist under `test/` | Default for code changes |
13
14
  | **L2** | Integration / product acceptance at changed boundaries | project acceptance or integration suite | When boundaries or core paths change |
14
- | **L3** | Automated E2E / browser for user-visible paths | `npm run test:e2e` or equivalent **subset** | When UI / protocol UX changes |
15
+ | **L3** | Automated E2E / protocol smoke for user-visible paths | **`npm run test:live`** (live desk shell + `/api/validate` gate; mock LLM, no paid API) | When live desk UI / protocol UX changes |
15
16
  | **L4** | Manual account / device path when automation cannot cover auth or real data | documented steps in the Brief | When UI/auth and no automated substitute |
16
17
 
17
18
  IDE Browser / MCP exploration is **optional discovery**. It does **not** replace
18
- L3 automation when the project has an E2E suite.
19
+ L3 when `npm run test:live` covers the touched path.
19
20
 
20
21
  ## Risk table (what to run)
21
22
 
@@ -24,12 +25,25 @@ L3 automation when the project has an E2E suite.
24
25
  | Docs / comments only | None (note in Brief) |
25
26
  | Internal code, same behavior | L0 + L1 for affected packages |
26
27
  | API / data / core path | L0 + L1 + L2 (or documented equivalent) |
27
- | User-visible or protocol-visible UI/UX | L0 + L1 + **L3 subset for touched flows** + update E2E catalog |
28
+ | User-visible or protocol-visible UI/UX (live desk) | L0 + **`npm run test:live` (L3)** + update E2E catalog |
28
29
  | Auth / payments / irreversible ops | Above + L4 if L3 cannot cover |
29
30
 
30
31
  Prefer **targeted subsets** over full monorepo suites. Do not skip a required
31
32
  level without an explicit waiver in the feature docs (`tasks.md` or Spec).
32
33
 
34
+ ## Live desk L3 (`npm run test:live`)
35
+
36
+ Covers without a paid LLM:
37
+
38
+ 1. Desk shell HTML/CSS/JS markers (three columns, structured confirm fields,
39
+ `validationAllowsSend`)
40
+ 2. Local validate failures (empty / too-short card)
41
+ 3. `/api/validate` pass and `/api/validate/fix` via an in-process mock
42
+ OpenAI-compatible server
43
+
44
+ Does **not** cover: real model quality, Terminal CLI launch, or full revise
45
+ dispatch. Those stay manual E2E catalog rows or future suites.
46
+
33
47
  ## Opt-in (still need an explicit ask or Spec note)
34
48
 
35
49
  Mark these in the project table when they are expensive:
@@ -0,0 +1,9 @@
1
+ {
2
+ "status": "accepted",
3
+ "summary": "Added npm run test:live L3 smoke for desk shell + validate gate; documented in manuals and testing.md; CI on develop/main.",
4
+ "verification": {
5
+ "levels": ["L0", "L3"],
6
+ "commands": ["npm run test:live", "node --check bin/duaer-live.mjs"],
7
+ "notes": "Mock LLM; no paid API. E2E-054."
8
+ }
9
+ }
@@ -0,0 +1,41 @@
1
+ # Feature Specification: Live desk L3 smoke suite
2
+
3
+ **Feature Branch**: `feat/live-l3-smoke`
4
+
5
+ **Created**: 2026-09-17
6
+
7
+ **Status**: Active
8
+
9
+ ## Goal
10
+
11
+ Add an automated L3 smoke suite for the live desk (confirm validate gate +
12
+ desk shell markers) that agents run before accept on live UI changes, and
13
+ document it in the manuals / testing contract.
14
+
15
+ ## In scope
16
+
17
+ - `npm run test:live` — start isolated live + mock LLM; cover validate fail/pass,
18
+ validate/fix path, static desk markers (three columns, structured fields,
19
+ validationAllowsSend)
20
+ - Wire into `.duaer/memory/testing.md` as the L3 command for this repo
21
+ - Update README EN/ZH + CHANGELOG + E2E catalog
22
+ - Optional lightweight CI job on push/PR
23
+
24
+ ## Out of scope
25
+
26
+ - Full Playwright browser interaction / paid live LLM
27
+ - Revise Terminal dispatch end-to-end
28
+ - npm version bump / publish (docs only unless user asks)
29
+
30
+ ## Acceptance
31
+
32
+ 1. `npm run test:live` passes without network LLM
33
+ 2. Covers: empty/short card fail, good card pass via mock, fix endpoint,
34
+ HTML/JS/CSS desk markers for layout + gate
35
+ 3. README (EN/ZH) and testing.md document the command
36
+ 4. E2E catalog notes automated subset
37
+
38
+ ## Assumptions
39
+
40
+ - Worktree: `.worktree/feat-live-l3-smoke`
41
+ - Brief: `.duaer/specs/054-live-l3-smoke/`
@@ -0,0 +1,10 @@
1
+ # Tasks: Live desk L3 smoke suite
2
+
3
+ **Brief**: `.duaer/specs/054-live-l3-smoke/`
4
+
5
+ ## Checklist
6
+
7
+ - [x] Add `test/live-smoke.test.mjs` + mock LLM helper
8
+ - [x] `package.json` script `test:live`; update testing.md
9
+ - [x] README EN/ZH + CHANGELOG + E2E-054; CI workflow
10
+ - [x] Run `npm run test:live`; accept; merge develop
@@ -0,0 +1,8 @@
1
+ {
2
+ "status": "accepted",
3
+ "summary": "Release 0.15.0 with live L3 smoke suite.",
4
+ "verification": {
5
+ "levels": ["L3"],
6
+ "commands": ["npm run test:live"]
7
+ }
8
+ }
@@ -0,0 +1,16 @@
1
+ # Feature Specification: Release 0.15.0
2
+
3
+ **Feature Branch**: `feat/release-015`
4
+
5
+ **Created**: 2026-09-17
6
+
7
+ **Status**: Active
8
+
9
+ ## Goal
10
+
11
+ Ship **0.15.0** (live L3 smoke) to main + npm.
12
+
13
+ ## Acceptance
14
+
15
+ 1. package.json 0.15.0; CHANGELOG section dated
16
+ 2. main tagged v0.15.0; GitHub Release; npm latest 0.15.0
@@ -0,0 +1,4 @@
1
+ # Tasks: Release 0.15.0
2
+
3
+ - [x] Bump 0.15.0 + CHANGELOG
4
+ - [ ] Promote main; push; tag; gh release
package/CHANGELOG.md CHANGED
@@ -1,5 +1,12 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.15.0 — 2026-09-17
4
+
5
+ ### Live desk L3 smoke
6
+
7
+ - `npm run test:live` — automated desk shell + `/api/validate` / `/api/validate/fix` with mock LLM
8
+ - Documented in `.duaer/memory/testing.md`, README EN/ZH; CI runs on push/PR to develop/main
9
+
3
10
  ## 0.14.0 — 2026-09-17
4
11
 
5
12
  ### Live desk layout
package/README.md CHANGED
@@ -64,6 +64,10 @@ Open the printed URL (default `http://127.0.0.1:8787`). The desk is **full-width
64
64
  with three columns: **chat** | **requirements / confirm / dispatch / revise** |
65
65
  **task progress**.
66
66
 
67
+ **Verify (maintainers / agents):** after live desk UI or validate-gate changes,
68
+ run `npm run test:live` (L3 smoke: desk shell markers + `/api/validate` with a
69
+ mock LLM — no paid API).
70
+
67
71
  **Flow**
68
72
 
69
73
  1. Dialogue → fill the confirm card (structured goal / out-of-scope / acceptance /
package/README.zh-CN.md CHANGED
@@ -64,6 +64,10 @@ duaer live
64
64
  浏览器打开提示地址(默认 `http://127.0.0.1:8787`)。台面**全屏宽**,三列:
65
65
  **对话** | **需求 / 确认 / 派工 / 改进** | **任务进度**。
66
66
 
67
+ **验收(维护者 / 数字员工):** 改现场台 UI 或确认校验门禁后,跑
68
+ `npm run test:live`(L3 冒烟:台面结构标记 + `/api/validate`,内置 mock 模型,
69
+ 不产生付费 API 调用)。
70
+
67
71
  **流程**
68
72
 
69
73
  1. 多轮对话 → 确认卡(目标 / 不做 / 验收 / 假设,结构化展示)。须**校验通过**后才能点确认;失败可自动修订
@@ -66,6 +66,7 @@ the table for their app.
66
66
  | E2E-051 | Validate-before-send: Confirm and revise-dispatch stay blocked until `/api/validate` passes for current card fields; fail shows issues + auto-fix; agent launch prompt forbids Confirming-intent / multi-choice re-confirm | manual |
67
67
  | E2E-052 | Confirm column wider than chat; requirements (and revise) fields fully expanded without inner scroll; structured paragraphs/lists display with click-to-edit | manual |
68
68
  | E2E-053 | Full-screen desk (no 1440 shell cap); chat column ~50px wider than prior confirm-wide min; confirm still wider than chat | manual |
69
+ | E2E-054 | Live L3 smoke: `npm run test:live` covers desk shell markers + validate fail/pass + validate/fix via mock LLM (no paid API) | `npm run test:live` |
69
70
  | E2E-041 | Busy Terminal runner: revise/re-dispatch queues (`pending.cmd`), waits (no interrupt); API `queued`/`busy`/`reused`; UI does not claim agent already started | manual |
70
71
  | E2E-007 | Request worktrees use `.worktree/<id>`; `.worktree/` gitignored | manual |
71
72
  | E2E-008 | Docs require main+develop+feat+fix and typed go-live flows | manual |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "duaer-spec",
3
- "version": "0.14.0",
3
+ "version": "0.15.0",
4
4
  "description": "Digital employees for Cursor, Claude, Codex, Copilot, Windsurf, Cline, Continue, Gemini, Aider",
5
5
  "type": "module",
6
6
  "bin": {
@@ -63,6 +63,8 @@
63
63
  "license": "MIT",
64
64
  "scripts": {
65
65
  "duaer": "node ./bin/duaer.mjs",
66
- "live": "node ./bin/duaer-live.mjs"
66
+ "live": "node ./bin/duaer-live.mjs",
67
+ "test": "node --test test/**/*.test.mjs",
68
+ "test:live": "node --test test/live-smoke.test.mjs"
67
69
  }
68
70
  }