duaer-spec 0.6.1 → 0.6.3
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/ADOPT.md +22 -48
- package/CHANGELOG.md +22 -28
- package/DUADER.md +5 -3
- package/README.md +10 -11
- package/README.zh-CN.md +34 -0
- package/bin/duaer.mjs +45 -24
- package/docs/agent/README.md +3 -1
- package/docs/agent/branching-and-release.md +12 -1
- package/docs/agent/e2e-test-plan.md +6 -2
- package/package.json +4 -3
package/ADOPT.md
CHANGED
|
@@ -1,70 +1,44 @@
|
|
|
1
1
|
# Adopt duaer-spec
|
|
2
2
|
|
|
3
|
-
Install
|
|
4
|
-
Brief → work → accept **without** the human operating slash commands or CLI.
|
|
5
|
-
|
|
6
|
-
## Install (human, once)
|
|
3
|
+
## Install
|
|
7
4
|
|
|
8
5
|
```bash
|
|
9
6
|
npx duaer-spec init --here
|
|
10
|
-
# pin: npx github:fujiezee/duaer-spec@v0.6.1 duaer init --here
|
|
11
7
|
```
|
|
12
8
|
|
|
9
|
+
## Update
|
|
10
|
+
|
|
13
11
|
```bash
|
|
14
|
-
npx duaer-spec
|
|
15
|
-
npx duaer-spec init --here --ops
|
|
12
|
+
npx duaer-spec update
|
|
16
13
|
```
|
|
17
14
|
|
|
18
|
-
|
|
19
|
-
|
|
15
|
+
Do **not** use `init --here --force` as the everyday refresh. `update` reuses
|
|
16
|
+
the mode/branch from `.duaer/duaer-init.json`.
|
|
20
17
|
|
|
21
|
-
|
|
18
|
+
If you customized constitution / baseline / `.duaer/handoff.json` commands,
|
|
19
|
+
glance at `git diff` once and keep your overrides.
|
|
22
20
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
```bash
|
|
28
|
-
npx duaer-spec@latest init --here --force
|
|
29
|
-
```
|
|
30
|
-
|
|
31
|
-
Then:
|
|
21
|
+
Ensure the repo has **`main`** and **`develop`**. See
|
|
22
|
+
[`docs/agent/branching-and-release.md`](docs/agent/branching-and-release.md)
|
|
23
|
+
(Chinese: [`README.zh-CN.md`](README.zh-CN.md)).
|
|
32
24
|
|
|
33
|
-
|
|
34
|
-
`.duaer/memory/constitution.md`, `project-context.md`, `docs/baseline.md`,
|
|
35
|
-
and especially **`.duaer/handoff.json` `commands`** (your restart scripts).
|
|
36
|
-
2. Restore any local overrides you still need.
|
|
37
|
-
3. Confirm `.gitignore` still contains `.worktree/`.
|
|
38
|
-
4. No need to re-learn slash commands — talk to the agent as before.
|
|
25
|
+
Then talk to the agent in plain language.
|
|
39
26
|
|
|
40
|
-
|
|
27
|
+
## Options
|
|
41
28
|
|
|
42
29
|
```bash
|
|
43
|
-
npx duaer-spec
|
|
44
|
-
|
|
45
|
-
npx
|
|
30
|
+
npx duaer-spec init --here --method
|
|
31
|
+
npx duaer-spec init --here --ops
|
|
32
|
+
npx duaer-spec update --method # rare; usually omit
|
|
46
33
|
```
|
|
47
34
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
## What gets installed
|
|
51
|
-
|
|
52
|
-
- Always-on autonomous job loop
|
|
53
|
-
- `.duaer/handoff.json` — restart services on **develop** after worktree remove
|
|
54
|
-
- Agent ops: `AGENTS.md`, branching/release docs, mandatory `.worktree/`
|
|
55
|
-
|
|
56
|
-
## Branch model (mandatory)
|
|
57
|
-
|
|
58
|
-
| Branch | Role |
|
|
59
|
-
|---|---|
|
|
60
|
-
| `main` | Production / online |
|
|
61
|
-
| `develop` | Day-to-day integration |
|
|
62
|
-
| `feat/<name>` | Features → `develop` |
|
|
63
|
-
| `fix/<name>` | Fixes → `develop` (hotfix via `main`) |
|
|
35
|
+
## What you get
|
|
64
36
|
|
|
65
|
-
|
|
37
|
+
- Autonomous job loop (ask → Brief → work → accept)
|
|
38
|
+
- `.duaer/handoff.json` + `duaer handoff` after worktree remove
|
|
39
|
+
- Agent ops: `main` / `develop` / `feat` / `fix` + `.worktree/`
|
|
66
40
|
|
|
67
41
|
## Precedence
|
|
68
42
|
|
|
69
|
-
1. `AGENTS.md`
|
|
70
|
-
2. `DUADER.md` / `.duaer/`
|
|
43
|
+
1. `AGENTS.md`
|
|
44
|
+
2. `DUADER.md` / `.duaer/`
|
package/CHANGELOG.md
CHANGED
|
@@ -1,46 +1,40 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
-
## 0.6.
|
|
4
|
-
|
|
5
|
-
### Worktree → develop service handoff
|
|
6
|
-
|
|
7
|
-
- Mandatory handoff after merge: stop worktree-bound processes, remove
|
|
8
|
-
`.worktree/<id>`, restart from primary checkout on `develop`
|
|
9
|
-
- `.duaer/handoff.json` configures restart commands (e.g. `npm run dev`)
|
|
10
|
-
- CLI: `duaer handoff` / `duaer handoff --run`
|
|
11
|
-
- Docs: update path for existing installs (`init --force` + review diff)
|
|
3
|
+
## 0.6.3 — 2026-09-15
|
|
12
4
|
|
|
13
|
-
|
|
5
|
+
### Docs: update path in installed 说明
|
|
14
6
|
|
|
15
|
-
|
|
7
|
+
- `DUADER.md` and `docs/agent/branching-and-release.md` document `npx duaer-spec update`
|
|
8
|
+
- Add `README.zh-CN.md` (install / update / branches)
|
|
9
|
+
- ADOPT clarifies: do not use `init --force` for everyday refresh
|
|
16
10
|
|
|
17
|
-
|
|
18
|
-
- [`docs/agent/branching-and-release.md`](docs/agent/branching-and-release.md)
|
|
11
|
+
## 0.6.2 — 2026-09-15
|
|
19
12
|
|
|
20
|
-
|
|
13
|
+
### Simple update
|
|
21
14
|
|
|
22
|
-
-
|
|
15
|
+
- `npx duaer-spec update` refreshes an existing install (no `--force` flags to remember)
|
|
16
|
+
- Remembers prior init mode from `.duaer/duaer-init.json`
|
|
17
|
+
- README / ADOPT: install + update are each one line
|
|
23
18
|
|
|
24
|
-
## 0.
|
|
25
|
-
|
|
26
|
-
- Autonomous digital employee (ask, don’t operate phases)
|
|
19
|
+
## 0.6.1 — 2026-09-15
|
|
27
20
|
|
|
28
|
-
|
|
21
|
+
### Worktree → develop service handoff
|
|
29
22
|
|
|
30
|
-
-
|
|
23
|
+
- `.duaer/handoff.json` + `duaer handoff [--run]`
|
|
24
|
+
- Mandatory restart on develop after worktree remove
|
|
31
25
|
|
|
32
|
-
## 0.
|
|
26
|
+
## 0.6.0 — 2026-09-15
|
|
33
27
|
|
|
34
|
-
-
|
|
28
|
+
- Mandatory `main` / `develop` / `feat/*` / `fix/*` + release flows
|
|
35
29
|
|
|
36
|
-
## 0.
|
|
30
|
+
## 0.5.1 — 2026-09-15
|
|
37
31
|
|
|
38
|
-
-
|
|
32
|
+
- Mandatory `.worktree/` (gitignored)
|
|
39
33
|
|
|
40
|
-
## 0.
|
|
34
|
+
## 0.5.0 — 2026-09-15
|
|
41
35
|
|
|
42
|
-
-
|
|
36
|
+
- Autonomous digital employee
|
|
43
37
|
|
|
44
|
-
## 0.
|
|
38
|
+
## 0.4.0 — 0.1.0
|
|
45
39
|
|
|
46
|
-
|
|
40
|
+
See git history for earlier notes.
|
package/DUADER.md
CHANGED
|
@@ -7,9 +7,10 @@ runs Brief → work → accept. Humans are not the operators of the phase machin
|
|
|
7
7
|
|
|
8
8
|
## Human experience
|
|
9
9
|
|
|
10
|
-
1. One-time: `npx duaer-spec init --here`
|
|
11
|
-
2.
|
|
12
|
-
3.
|
|
10
|
+
1. One-time install: `npx duaer-spec init --here`
|
|
11
|
+
2. Later refresh: `npx duaer-spec update`
|
|
12
|
+
3. Ongoing: describe work in chat
|
|
13
|
+
4. Review the handoff line (accepted / not yet)
|
|
13
14
|
|
|
14
15
|
## Agent procedure (autonomous)
|
|
15
16
|
|
|
@@ -42,4 +43,5 @@ Humans need not configure it for everyday use.
|
|
|
42
43
|
## Related
|
|
43
44
|
|
|
44
45
|
- Adopt: [`ADOPT.md`](ADOPT.md)
|
|
46
|
+
- Branches / go-live: [`docs/agent/branching-and-release.md`](docs/agent/branching-and-release.md)
|
|
45
47
|
- Agent ops: [`AGENTS.md`](AGENTS.md)
|
package/README.md
CHANGED
|
@@ -13,8 +13,15 @@ talk; the employee runs the process.
|
|
|
13
13
|
npx duaer-spec init --here
|
|
14
14
|
```
|
|
15
15
|
|
|
16
|
-
|
|
17
|
-
|
|
16
|
+
## Update
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
npx duaer-spec update
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
Then use Cursor as usual — describe what you want.
|
|
23
|
+
|
|
24
|
+
中文说明:[`README.zh-CN.md`](README.zh-CN.md)
|
|
18
25
|
|
|
19
26
|
## What the employee does (by itself)
|
|
20
27
|
|
|
@@ -41,18 +48,10 @@ Go-live and flows by issue type:
|
|
|
41
48
|
**After merge:** `duaer handoff [--run]` restarts local services on `develop`
|
|
42
49
|
(configure commands in `.duaer/handoff.json`).
|
|
43
50
|
|
|
44
|
-
## Updating
|
|
45
|
-
|
|
46
|
-
```bash
|
|
47
|
-
npx duaer-spec@latest init --here --force # review diff; keep handoff commands
|
|
48
|
-
```
|
|
49
|
-
|
|
50
|
-
Details: [`ADOPT.md`](ADOPT.md)#updating-an-existing-install
|
|
51
|
-
|
|
52
51
|
## Optional
|
|
53
52
|
|
|
54
53
|
```bash
|
|
55
|
-
npx duaer-spec
|
|
54
|
+
npx duaer-spec init --here --method
|
|
56
55
|
```
|
|
57
56
|
|
|
58
57
|
Details: [`ADOPT.md`](ADOPT.md) · Method: [`DUADER.md`](DUADER.md) · Ops: [`AGENTS.md`](AGENTS.md)
|
package/README.zh-CN.md
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# duaer-spec
|
|
2
|
+
|
|
3
|
+
**Duaer** 把 AI 编程助手变成**数字员工**:你用自然语言提需求,它自己跑 Spec → 实现 → 验收;只有交接干净才算完成。
|
|
4
|
+
|
|
5
|
+
你**不用**操作流程。装一次之后,说话即可。
|
|
6
|
+
|
|
7
|
+
## 安装
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npx duaer-spec init --here
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## 更新
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
npx duaer-spec update
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
若你改过本地 constitution / baseline / `handoff.json` 命令,看一眼 `git diff` 即可。
|
|
20
|
+
|
|
21
|
+
## 必须有的分支
|
|
22
|
+
|
|
23
|
+
| 分支 | 作用 |
|
|
24
|
+
|---|---|
|
|
25
|
+
| `main` | 生产 / 正式上线 |
|
|
26
|
+
| `develop` | 日常集成、联调 |
|
|
27
|
+
| `feat/<name>` | 功能 → 合进 `develop` |
|
|
28
|
+
| `fix/<name>` | 缺陷 → 合进 `develop`(紧急从 `main` 出,再回补 `develop`) |
|
|
29
|
+
|
|
30
|
+
不同问题怎么上线:[`docs/agent/branching-and-release.md`](docs/agent/branching-and-release.md)
|
|
31
|
+
|
|
32
|
+
合并后:`duaer handoff [--run]` 在 `develop` 上重启本地服务(命令写在 `.duaer/handoff.json`)。
|
|
33
|
+
|
|
34
|
+
英文源:[`README.md`](README.md) · 采纳细节:[`ADOPT.md`](ADOPT.md)
|
package/bin/duaer.mjs
CHANGED
|
@@ -27,25 +27,16 @@ const POLICY_MODES = new Set(['off', 'coach', 'strict'])
|
|
|
27
27
|
|
|
28
28
|
const USAGE = `duaer — digital-employee delivery (duaer-spec ${PKG.version})
|
|
29
29
|
|
|
30
|
-
|
|
31
|
-
|
|
30
|
+
Install: npx duaer-spec init --here
|
|
31
|
+
Update: npx duaer-spec update
|
|
32
32
|
|
|
33
|
-
|
|
33
|
+
Then talk to the agent in plain language.
|
|
34
34
|
|
|
35
|
-
|
|
36
|
-
duaer handoff [
|
|
37
|
-
duaer status
|
|
38
|
-
duaer check | policy | version
|
|
35
|
+
Also:
|
|
36
|
+
duaer handoff [--run] Restart services on develop after worktree remove
|
|
37
|
+
duaer status | check | policy | version | help
|
|
39
38
|
|
|
40
|
-
Init: --all
|
|
41
|
-
|
|
42
|
-
Update existing install:
|
|
43
|
-
npx duaer-spec@latest init --here --force
|
|
44
|
-
# then review git diff; keep project-specific constitution / baseline / handoff commands
|
|
45
|
-
|
|
46
|
-
Example:
|
|
47
|
-
npx duaer-spec init --here
|
|
48
|
-
duaer handoff --run
|
|
39
|
+
Init options: --all | --method | --ops | --force | --branch <n> | --here
|
|
49
40
|
`
|
|
50
41
|
|
|
51
42
|
function parseArgs(argv) {
|
|
@@ -63,14 +54,21 @@ function parseArgs(argv) {
|
|
|
63
54
|
strict: false,
|
|
64
55
|
policyMode: null,
|
|
65
56
|
run: false,
|
|
57
|
+
modeExplicit: false,
|
|
66
58
|
}
|
|
67
59
|
const rest = args.slice(1)
|
|
68
60
|
for (let i = 0; i < rest.length; i++) {
|
|
69
61
|
const a = rest[i]
|
|
70
|
-
if (a === '--all')
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
else if (a === '--
|
|
62
|
+
if (a === '--all') {
|
|
63
|
+
out.mode = 'all'
|
|
64
|
+
out.modeExplicit = true
|
|
65
|
+
} else if (a === '--method') {
|
|
66
|
+
out.mode = 'method'
|
|
67
|
+
out.modeExplicit = true
|
|
68
|
+
} else if (a === '--ops') {
|
|
69
|
+
out.mode = 'ops'
|
|
70
|
+
out.modeExplicit = true
|
|
71
|
+
} else if (a === '--force') out.force = true
|
|
74
72
|
else if (a === '--here') out.dir = '.'
|
|
75
73
|
else if (a === '--workplace') out.workplace = true
|
|
76
74
|
else if (a === '--delivery') out.delivery = true
|
|
@@ -338,11 +336,31 @@ function cmdInit(opts) {
|
|
|
338
336
|
console.log(`
|
|
339
337
|
Hired.
|
|
340
338
|
|
|
341
|
-
|
|
342
|
-
|
|
339
|
+
Talk to the agent in plain language.
|
|
340
|
+
Later update: npx duaer-spec update
|
|
341
|
+
`)
|
|
342
|
+
}
|
|
343
343
|
|
|
344
|
-
|
|
345
|
-
|
|
344
|
+
function cmdUpdate(opts) {
|
|
345
|
+
const target = resolve(opts.dir)
|
|
346
|
+
const marker = readJson(join(target, '.duaer', 'duaer-init.json'), null)
|
|
347
|
+
if (!marker && !existsSync(join(target, '.duaer')) && !existsSync(join(target, 'DUADER.md'))) {
|
|
348
|
+
console.log('No duaer install found here. Use: npx duaer-spec init --here')
|
|
349
|
+
process.exitCode = 1
|
|
350
|
+
return
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
if (!opts.modeExplicit && marker?.mode && ['all', 'method', 'ops'].includes(marker.mode)) {
|
|
354
|
+
opts.mode = marker.mode
|
|
355
|
+
}
|
|
356
|
+
if (marker?.branch) opts.branch = marker.branch
|
|
357
|
+
opts.force = true
|
|
358
|
+
|
|
359
|
+
console.log(`Updating → ${PKG.version}`)
|
|
360
|
+
cmdInit(opts)
|
|
361
|
+
console.log(`
|
|
362
|
+
Updated.
|
|
363
|
+
If you customized constitution / baseline / handoff commands, check git diff once.
|
|
346
364
|
`)
|
|
347
365
|
}
|
|
348
366
|
|
|
@@ -690,6 +708,9 @@ function main() {
|
|
|
690
708
|
case 'init':
|
|
691
709
|
cmdInit(opts)
|
|
692
710
|
break
|
|
711
|
+
case 'update':
|
|
712
|
+
cmdUpdate(opts)
|
|
713
|
+
break
|
|
693
714
|
case 'check':
|
|
694
715
|
cmdCheck(opts)
|
|
695
716
|
break
|
package/docs/agent/README.md
CHANGED
|
@@ -10,4 +10,6 @@ Wins over Duaer and `examples/` when they conflict.
|
|
|
10
10
|
| [change-checklist.md](change-checklist.md) | Finish checklist |
|
|
11
11
|
| [e2e-test-plan.md](e2e-test-plan.md) | E2E scenario catalog template |
|
|
12
12
|
|
|
13
|
-
Root contract: [`AGENTS.md`](../../AGENTS.md).
|
|
13
|
+
Root contract: [`AGENTS.md`](../../AGENTS.md).
|
|
14
|
+
Adoption: [`ADOPT.md`](../../ADOPT.md) — `npx duaer-spec init --here` / `npx duaer-spec update`.
|
|
15
|
+
Chinese summary: [`README.zh-CN.md`](../../README.zh-CN.md).
|
|
@@ -199,9 +199,20 @@ All implementation edits happen inside the request worktree.
|
|
|
199
199
|
|
|
200
200
|
---
|
|
201
201
|
|
|
202
|
+
## 7. Install and update (adopters)
|
|
203
|
+
|
|
204
|
+
```bash
|
|
205
|
+
npx duaer-spec init --here # once
|
|
206
|
+
npx duaer-spec update # later refresh — no --force recipe
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
Details: [`ADOPT.md`](../../ADOPT.md). Chinese summary: [`README.zh-CN.md`](../../README.zh-CN.md).
|
|
210
|
+
|
|
202
211
|
## Related
|
|
203
212
|
|
|
204
213
|
- [workflow.md](workflow.md) — R4 and development loop
|
|
205
214
|
- [change-checklist.md](change-checklist.md) — finish checklist
|
|
206
215
|
- [baseline.md](../baseline.md) — frozen: `develop` + `main`
|
|
207
|
-
- [ADOPT.md](../../ADOPT.md) — install into another repo
|
|
216
|
+
- [ADOPT.md](../../ADOPT.md) — install / update into another repo
|
|
217
|
+
- [README.zh-CN.md](../../README.zh-CN.md) — Chinese install, update, branches
|
|
218
|
+
|
|
@@ -34,7 +34,9 @@ the table for their app.
|
|
|
34
34
|
| E2E-007 | Request worktrees use `.worktree/<id>`; `.worktree/` gitignored | manual |
|
|
35
35
|
| E2E-008 | Docs require main+develop+feat+fix and typed go-live flows | manual |
|
|
36
36
|
| E2E-009 | After merge, handoff restarts services on develop (`duaer handoff`) | manual |
|
|
37
|
-
| E2E-010 |
|
|
37
|
+
| E2E-010 | `npx duaer-spec update` refreshes an existing install | manual |
|
|
38
|
+
| E2E-011 | Installed docs (`DUADER.md`, `docs/agent/`) document `update` | manual |
|
|
39
|
+
| E2E-012 | `README.zh-CN.md` covers install, update, branch model | manual |
|
|
38
40
|
|
|
39
41
|
## Traceability
|
|
40
42
|
|
|
@@ -49,4 +51,6 @@ the table for their app.
|
|
|
49
51
|
| E2E-007 | `.worktree/` + `.gitignore` | Mandatory isolation |
|
|
50
52
|
| E2E-008 | `branching-and-release.md` | Branch + release matrix |
|
|
51
53
|
| E2E-009 | `.duaer/handoff.json` / `duaer handoff` | Service handoff |
|
|
52
|
-
| E2E-010 | `
|
|
54
|
+
| E2E-010 | `duaer update` | One-line refresh |
|
|
55
|
+
| E2E-011 | DUADER + agent docs | Update path in installed 说明 |
|
|
56
|
+
| E2E-012 | `README.zh-CN.md` | Chinese 说明文档 |
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "duaer-spec",
|
|
3
|
-
"version": "0.6.
|
|
4
|
-
"description": "Digital employees: autonomous delivery; main/develop/feat/fix;
|
|
3
|
+
"version": "0.6.3",
|
|
4
|
+
"description": "Digital employees: autonomous delivery; main/develop/feat/fix; simple update",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
7
7
|
"duaer": "bin/duaer.mjs",
|
|
@@ -18,7 +18,8 @@
|
|
|
18
18
|
"docs/agent",
|
|
19
19
|
"docs/baseline.md",
|
|
20
20
|
"LICENSE",
|
|
21
|
-
"README.md"
|
|
21
|
+
"README.md",
|
|
22
|
+
"README.zh-CN.md"
|
|
22
23
|
],
|
|
23
24
|
"publishConfig": {
|
|
24
25
|
"access": "public"
|