duaer-spec 0.3.0 → 0.5.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/.cursor/rules/duaer-spec.mdc +26 -36
- package/.cursor/skills/duaer-do/SKILL.md +57 -0
- package/.duaer/memory/constitution.md +6 -17
- package/ADOPT.md +21 -57
- package/AGENTS.md +3 -2
- package/CHANGELOG.md +19 -52
- package/DUADER.md +25 -47
- package/README.md +20 -68
- package/bin/duaer.mjs +31 -65
- package/docs/agent/change-checklist.md +1 -1
- package/docs/agent/e2e-test-plan.md +12 -16
- package/package.json +2 -2
|
@@ -1,51 +1,41 @@
|
|
|
1
1
|
---
|
|
2
|
-
description:
|
|
2
|
+
description: Autonomous digital employee — run Duaer job loop without asking the user to operate
|
|
3
3
|
alwaysApply: true
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
#
|
|
6
|
+
# Digital employee (autonomous)
|
|
7
7
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
8
|
+
You are a **digital employee** in this repo. The human gives intent in normal
|
|
9
|
+
language. **You** run the delivery process. Do **not** ask them to type slash
|
|
10
|
+
commands, CLI flags, or phase names (`specify`, `plan`, `tasks`, …).
|
|
11
11
|
|
|
12
|
-
If this
|
|
13
|
-
|
|
12
|
+
If this conflicts with root `AGENTS.md` (worktrees, commits, Issue/PR),
|
|
13
|
+
**AGENTS.md wins**.
|
|
14
14
|
|
|
15
|
-
##
|
|
15
|
+
## When the human asks for work
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
For new behavior, fixes, refactors that change product behavior, or architecture:
|
|
18
18
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
19
|
+
1. **Silently follow** the procedure in `.cursor/skills/duaer-do/SKILL.md`
|
|
20
|
+
(assign Brief → light tasks → implement → converge → handoff line).
|
|
21
|
+
2. Do **not** wait for `/duaer-do` or any other skill invocation.
|
|
22
|
+
3. Do **not** say “please run `/duaer-specify`” — you do it.
|
|
23
|
+
4. Do **not** dump a methodology tutorial unless they ask how Duaer works.
|
|
23
24
|
|
|
24
|
-
|
|
25
|
-
|---|---|
|
|
26
|
-
| `off` | May continue; do not invent an accept stamp |
|
|
27
|
-
| `coach` | Warn; guide to specify / tasks / converge; **do not say "done"** |
|
|
28
|
-
| `strict` | **Refuse** to report delivery complete until `duaer job` shows accepted |
|
|
25
|
+
## Handoff
|
|
29
26
|
|
|
30
|
-
|
|
27
|
+
- End with whether the **job** is accepted or still open (one clear line).
|
|
28
|
+
- Do **not** claim “done” / “finished” / “complete” unless `delivery.json` is
|
|
29
|
+
`accepted` and open tasks are clear.
|
|
30
|
+
- Do **not** tell them to run `duaer status` unless they want a machine check;
|
|
31
|
+
you already know the handoff state.
|
|
31
32
|
|
|
32
|
-
|
|
33
|
+
## Forbidden
|
|
33
34
|
|
|
34
|
-
-
|
|
35
|
-
-
|
|
36
|
-
- Hotfixes / regressions (still Spec; shorter path allowed)
|
|
35
|
+
- Jump from chat to code with no Brief under `.duaer/specs/`.
|
|
36
|
+
- Making the human operate the workflow.
|
|
37
37
|
|
|
38
|
-
|
|
38
|
+
## Optional finer tools (agent-only)
|
|
39
39
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
`/duaer-specify` → `/duaer-plan` → `/duaer-tasks` → `/duaer-implement` → `/duaer-converge` → `duaer job`
|
|
43
|
-
|
|
44
|
-
## Hotfix (still Spec, shortened)
|
|
45
|
-
|
|
46
|
-
`/duaer-specify` (mark hotfix: symptom / root cause / acceptance) → `/duaer-tasks` → `/duaer-implement` → `/duaer-converge`
|
|
47
|
-
|
|
48
|
-
- Implement only from `tasks.md` when it exists
|
|
49
|
-
- Update `.duaer/memory/project-context.md` when architecture changes
|
|
50
|
-
- Run the verification named in the feature docs
|
|
51
|
-
- Before claiming done: `duaer job .` shows accepted (coach/strict)
|
|
40
|
+
Step skills (`duaer-specify`, `duaer-plan`, …) are **your** playbooks when a
|
|
41
|
+
job is large. The human should not need to know they exist.
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: "duaer-do"
|
|
3
|
+
description: "Autonomous job loop for digital employees: Brief → work → accept. Agents must follow this whenever the user asks for product work — without waiting for the user to invoke this skill or any CLI."
|
|
4
|
+
compatibility: "Requires duaer-spec project structure with .duaer/ directory"
|
|
5
|
+
metadata:
|
|
6
|
+
author: "duaer-spec"
|
|
7
|
+
source: "duaer-spec"
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## Trigger
|
|
11
|
+
|
|
12
|
+
Any human ask that needs code or product behavior changed.
|
|
13
|
+
**Do not require** the human to type `/duaer-do` or name phases.
|
|
14
|
+
|
|
15
|
+
## User Input
|
|
16
|
+
|
|
17
|
+
```text
|
|
18
|
+
$ARGUMENTS
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
If empty, use the current conversation ask as the job.
|
|
22
|
+
|
|
23
|
+
## Goal
|
|
24
|
+
|
|
25
|
+
Run one job end-to-end. The human should only review the result.
|
|
26
|
+
|
|
27
|
+
Do **not** lecture about methodology. Do **not** ask them to run commands.
|
|
28
|
+
|
|
29
|
+
## Steps (you perform these)
|
|
30
|
+
|
|
31
|
+
1. **Assign** — Ensure an active Brief:
|
|
32
|
+
- Matching active job (`.duaer/active-job.json` + `spec.md`) → update acceptance if needed.
|
|
33
|
+
- Else create `.duaer/specs/<nnn-slug>/spec.md` and `.duaer/active-job.json`
|
|
34
|
+
(same outcome as specify). Keep small asks short: what / why / acceptance.
|
|
35
|
+
|
|
36
|
+
2. **Break down** — If `tasks.md` missing, write a short checklist from the Spec.
|
|
37
|
+
Skip a heavy plan unless architecture or contracts change.
|
|
38
|
+
|
|
39
|
+
3. **Work** — Implement open tasks; mark `[x]` as you go. No scope beyond Spec.
|
|
40
|
+
|
|
41
|
+
4. **Accept** — Converge against Spec: stamp `delivery.json` `accepted`, or append
|
|
42
|
+
gap tasks and implement them when small enough; otherwise one clear remaining note.
|
|
43
|
+
|
|
44
|
+
5. **Handoff** — One line to the human:
|
|
45
|
+
- `✅ Job accepted — ready for your review.`
|
|
46
|
+
- `⏳ Job not accepted yet — <one sentence>.`
|
|
47
|
+
Never claim done unless accepted + tasks clear. Git is not locked by this.
|
|
48
|
+
|
|
49
|
+
## Hotfix
|
|
50
|
+
|
|
51
|
+
Still a short Spec (symptom / cause / acceptance), then work + accept. Same handoff.
|
|
52
|
+
|
|
53
|
+
## Never
|
|
54
|
+
|
|
55
|
+
- Ask the human to run `/duaer-*`, `duaer status`, or `duaer policy`.
|
|
56
|
+
- Discuss policy modes unless they ask.
|
|
57
|
+
- Block on slash-command invocation.
|
|
@@ -10,13 +10,9 @@ Duaer for what to build.
|
|
|
10
10
|
|
|
11
11
|
### I. Spec before code (NON-NEGOTIABLE)
|
|
12
12
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
`constitution` → `specify` → (optional `clarify`) → `plan` → (optional `checklist` / `analyze`) → `tasks` → `implement` → `converge`
|
|
17
|
-
|
|
18
|
-
Hotfix may shorten to: `specify` (mark hotfix) → `tasks` → `implement` → `converge`.
|
|
19
|
-
Never skip `specify` or `converge`.
|
|
13
|
+
The **agent** starts a Brief before coding — the human does not operate phases.
|
|
14
|
+
Autonomous default: follow `duaer-do` (Brief → tasks → implement → converge).
|
|
15
|
+
Never skip Spec or converge. Never ask the human to run `/duaer-*` for normal work.
|
|
20
16
|
|
|
21
17
|
### II. Read as-is before changing
|
|
22
18
|
|
|
@@ -36,13 +32,6 @@ Do not expand scope without updating the spec and tasks.
|
|
|
36
32
|
Mark tasks complete only when the stated verification (tests, manual checks,
|
|
37
33
|
or converge) has been performed or explicitly waived in the feature docs.
|
|
38
34
|
|
|
39
|
-
**Job handoff (not a git lock):**
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
- `coach` (default): if the active job is not `accepted`, warn and guide — do
|
|
43
|
-
**not** claim "done"
|
|
44
|
-
- `strict`: refuse to report delivery complete until accepted
|
|
45
|
-
- `off`: record only
|
|
46
|
-
|
|
47
|
-
Converge still stamps `delivery.json`. Judgment Spec↔code remains
|
|
48
|
-
agent-assisted; the stamp makes the **job** checkable.
|
|
35
|
+
**Job handoff (not a git lock):** the agent reports accept/open itself.
|
|
36
|
+
Default policy `coach` — do not claim "done" while the active job is unfinished.
|
|
37
|
+
Do not send the human to run `duaer status` for routine work.
|
package/ADOPT.md
CHANGED
|
@@ -1,78 +1,42 @@
|
|
|
1
1
|
# Adopt duaer-spec
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
Install once so the coding agent behaves as a **digital employee**: it runs
|
|
4
|
+
Brief → work → accept **without** the human operating slash commands or CLI.
|
|
5
5
|
|
|
6
|
-
##
|
|
7
|
-
|
|
8
|
-
From the target project (Node 18+):
|
|
6
|
+
## Install (human, once)
|
|
9
7
|
|
|
10
8
|
```bash
|
|
11
9
|
npx duaer-spec init --here
|
|
12
|
-
|
|
13
|
-
# Pin a release
|
|
14
|
-
npx github:fujiezee/duaer-spec@v0.3.0 duaer init --here
|
|
15
|
-
|
|
16
|
-
# Lite (method only) / ops only / other integration branch
|
|
17
|
-
npx duaer-spec init --here --method
|
|
18
|
-
npx duaer-spec init --here --ops --branch develop
|
|
10
|
+
# pin: npx github:fujiezee/duaer-spec@v0.5.0 duaer init --here
|
|
19
11
|
```
|
|
20
12
|
|
|
21
|
-
From a clone of this repo:
|
|
22
|
-
|
|
23
13
|
```bash
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
node bin/duaer.mjs policy /path/to/project
|
|
14
|
+
npx duaer-spec init --here --method
|
|
15
|
+
npx duaer-spec init --here --ops --branch develop
|
|
27
16
|
```
|
|
28
17
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
Then:
|
|
18
|
+
After that: talk to the agent in plain language. Do not teach them `/duaer-*`.
|
|
32
19
|
|
|
33
|
-
|
|
34
|
-
2. **Policy** — `duaer policy .` (default `coach`; optional `off` | `strict`)
|
|
35
|
-
3. **Assign → work → accept → handoff** — `/duaer-specify` → … → `/duaer-converge` → `duaer job .`
|
|
20
|
+
## What gets installed
|
|
36
21
|
|
|
37
|
-
|
|
38
|
-
|
|
22
|
+
- Always-on rule: agent must run the autonomous job loop on product work
|
|
23
|
+
- Playbook skill `duaer-do` (agent follows it; human need not invoke it)
|
|
24
|
+
- Optional step skills for large jobs (agent-only)
|
|
25
|
+
- Agent ops (`AGENTS.md`) when using `--all` / `--ops`
|
|
39
26
|
|
|
40
|
-
##
|
|
27
|
+
## Power users / agents
|
|
41
28
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
cp .cursor/rules/agents-workflow.mdc /path/to/project/.cursor/rules/
|
|
48
|
-
cp .cursor/rules/ai-ui-copy.mdc /path/to/project/.cursor/rules/
|
|
49
|
-
cp docs/agent/workflow.md docs/agent/change-checklist.md docs/agent/e2e-test-plan.md \
|
|
50
|
-
/path/to/project/docs/agent/
|
|
51
|
-
```
|
|
52
|
-
|
|
53
|
-
### Duaer method
|
|
54
|
-
|
|
55
|
-
```bash
|
|
56
|
-
rsync -a .duaer/ /path/to/project/.duaer/
|
|
57
|
-
mkdir -p /path/to/project/.cursor/skills /path/to/project/.cursor/rules
|
|
58
|
-
rsync -a .cursor/skills/ /path/to/project/.cursor/skills/
|
|
59
|
-
cp .cursor/rules/duaer-spec.mdc /path/to/project/.cursor/rules/
|
|
60
|
-
cp DUADER.md /path/to/project/
|
|
61
|
-
```
|
|
29
|
+
| Tool | Who uses it |
|
|
30
|
+
|---|---|
|
|
31
|
+
| `/duaer-do` procedure | Agent (automatic) |
|
|
32
|
+
| `/duaer-specify` … `/duaer-converge` | Agent, when splitting a large job |
|
|
33
|
+
| `duaer status` / `duaer policy` | Optional diagnostics — not required of humans |
|
|
62
34
|
|
|
63
35
|
## Precedence
|
|
64
36
|
|
|
65
|
-
1. `AGENTS.md`
|
|
66
|
-
2. `DUADER.md` / `.duaer/` —
|
|
67
|
-
3. Product overlays (do not copy `examples/` blindly)
|
|
37
|
+
1. `AGENTS.md` — how employees operate
|
|
38
|
+
2. `DUADER.md` / `.duaer/` — how jobs are briefed
|
|
68
39
|
|
|
69
40
|
## Updates
|
|
70
41
|
|
|
71
|
-
|
|
72
|
-
are not auto-updated.
|
|
73
|
-
|
|
74
|
-
## Do not copy
|
|
75
|
-
|
|
76
|
-
- `examples/` — samples only
|
|
77
|
-
- `SOURCE.md` — provenance for maintainers
|
|
78
|
-
- `bin/` / `package.json` — only needed if you vendor the CLI itself
|
|
42
|
+
`duaer init --force` (review the diff) or pin a tag.
|
package/AGENTS.md
CHANGED
|
@@ -3,8 +3,9 @@
|
|
|
3
3
|
Mandatory rules for AI coding agents working in **duaer-spec**, and for any
|
|
4
4
|
repository that adopts this file as its agent-ops contract.
|
|
5
5
|
|
|
6
|
-
Treat agents as **digital employees**:
|
|
7
|
-
|
|
6
|
+
Treat agents as **digital employees**: they execute the job loop themselves.
|
|
7
|
+
Humans state intent; they do not operate Duaer phases. This file is workplace
|
|
8
|
+
policy for *how* agents may operate (isolation, commits, Issue/PR gates). Duaer
|
|
8
9
|
([`DUADER.md`](DUADER.md)) is how jobs are briefed and accepted. If Duaer
|
|
9
10
|
(`.duaer/`), `examples/`, or other overlays conflict with this file,
|
|
10
11
|
**follow this file**.
|
package/CHANGELOG.md
CHANGED
|
@@ -1,69 +1,36 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
-
## 0.
|
|
3
|
+
## 0.5.0 — 2026-09-15
|
|
4
4
|
|
|
5
|
-
###
|
|
5
|
+
### Autonomous digital employee
|
|
6
6
|
|
|
7
|
-
-
|
|
8
|
-
|
|
9
|
-
-
|
|
10
|
-
-
|
|
11
|
-
-
|
|
12
|
-
- `duaer check` defaults to active-job scope; `--strict` / policy `strict` optional
|
|
13
|
-
- `--gate` kept as deprecated alias for `--strict` (job handoff, not CI)
|
|
14
|
-
- `--all-jobs` optional; historical features no longer fail the default path
|
|
15
|
-
- Docs/rules/constitution demote merge-gate language
|
|
7
|
+
- **Simplicity = humans do not operate the workflow**
|
|
8
|
+
- Always-on rule: on product asks, the agent runs Brief → work → accept itself
|
|
9
|
+
- Do not require `/duaer-do`, phase slash commands, or `duaer status` from humans
|
|
10
|
+
- `duaer-do` is the agent’s internal playbook; install once, then talk
|
|
11
|
+
- README / init / ADOPT / DUADER rewritten around “ask, don’t operate”
|
|
16
12
|
|
|
17
|
-
|
|
13
|
+
## 0.4.0 — 2026-09-15
|
|
18
14
|
|
|
19
|
-
|
|
15
|
+
### Simple everyday ops
|
|
20
16
|
|
|
21
|
-
|
|
17
|
+
- `/duaer-do` one-shot skill + `duaer status`
|
|
18
|
+
- Step skills demoted to advanced (later reframed as agent-only in 0.5)
|
|
22
19
|
|
|
23
|
-
|
|
20
|
+
## 0.3.0 — 2026-09-15
|
|
24
21
|
|
|
25
|
-
|
|
26
|
-
(`accepted` | `open`)
|
|
27
|
-
- `duaer check` reports workplace **and** delivery status
|
|
28
|
-
- `duaer check --gate` fails on missing Spec, open tasks, or non-accepted stamp
|
|
29
|
-
- Constitution, DUADER, README, ADOPT, and merge checklist require the gate
|
|
30
|
-
- Honest scope: gate checks **handoff state**; Spec↔code judgment remains
|
|
31
|
-
agent-assisted
|
|
22
|
+
### Job handoff (not a repo lock)
|
|
32
23
|
|
|
33
|
-
|
|
24
|
+
- `coach` / `strict` / `off` policy; active job; `duaer job` / `policy`
|
|
34
25
|
|
|
35
|
-
|
|
26
|
+
## 0.2.0 — 2026-09-15
|
|
36
27
|
|
|
37
|
-
|
|
28
|
+
- `delivery.json` + checkable handoff state
|
|
38
29
|
|
|
39
|
-
|
|
30
|
+
## 0.1.1 — 2026-09-15
|
|
40
31
|
|
|
41
|
-
-
|
|
42
|
-
(Spec) → work → accept (converge)
|
|
43
|
-
- README, ADOPT, DUADER, AGENTS intro, and CLI `init` / `check` / help copy
|
|
44
|
-
use that language
|
|
45
|
-
- E2E catalog: E2E-001 (init next steps), E2E-002 (README positioning)
|
|
32
|
+
- Digital-employee delivery OS positioning
|
|
46
33
|
|
|
47
34
|
## 0.1.0 — 2026-09-15
|
|
48
35
|
|
|
49
|
-
First public methodology release
|
|
50
|
-
|
|
51
|
-
### Method
|
|
52
|
-
|
|
53
|
-
- Own **Duaer** Spec-Driven loop: specify → plan → tasks → implement → converge
|
|
54
|
-
- Home directory: `.duaer/` (not an embedded third-party kit)
|
|
55
|
-
- Cursor skills: `/duaer-specify`, `/duaer-plan`, `/duaer-tasks`, `/duaer-implement`, `/duaer-converge`, …
|
|
56
|
-
- Agent ops (`AGENTS.md`) remain authoritative over the method when they conflict
|
|
57
|
-
|
|
58
|
-
### CLI
|
|
59
|
-
|
|
60
|
-
- `duaer init [dir] --all|--method|--ops [--force] [--branch <name>]`
|
|
61
|
-
- `duaer check [dir]`
|
|
62
|
-
- `duaer version`
|
|
63
|
-
|
|
64
|
-
### Install
|
|
65
|
-
|
|
66
|
-
```bash
|
|
67
|
-
npx github:fujiezee/duaer-spec@v0.1.0 duaer init --here
|
|
68
|
-
npx duaer-spec init --here
|
|
69
|
-
```
|
|
36
|
+
- First public methodology release
|
package/DUADER.md
CHANGED
|
@@ -1,67 +1,45 @@
|
|
|
1
1
|
# Duaer methodology
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
counts as done after **converge** accepts it — then `duaer job` shows accepted.
|
|
3
|
+
AI coding agents are **digital employees**. The human states intent; the agent
|
|
4
|
+
runs Brief → work → accept. Humans are not the operators of the phase machine.
|
|
6
5
|
|
|
7
|
-
|
|
6
|
+
**Precedence:** [`AGENTS.md`](AGENTS.md) wins on isolation, commits, Issue/PR.
|
|
8
7
|
|
|
9
|
-
|
|
10
|
-
over anything here for isolation, commits, and Issue/PR gates.
|
|
8
|
+
## Human experience
|
|
11
9
|
|
|
12
|
-
|
|
13
|
-
|
|
10
|
+
1. One-time: `npx duaer-spec init --here`
|
|
11
|
+
2. Ongoing: describe work in chat
|
|
12
|
+
3. Review the handoff line (accepted / not yet)
|
|
14
13
|
|
|
15
|
-
##
|
|
14
|
+
## Agent procedure (autonomous)
|
|
16
15
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
3. `.duaer/memory/testing.md` — verification expectations
|
|
20
|
-
4. Active job: `.duaer/active-job.json` → feature under `.duaer/specs/<nnn-slug>/`
|
|
16
|
+
Follow `.cursor/skills/duaer-do/SKILL.md` on every product ask — **without**
|
|
17
|
+
waiting for a slash invocation:
|
|
21
18
|
|
|
22
|
-
|
|
19
|
+
1. Assign Brief + `active-job.json`
|
|
20
|
+
2. Light `tasks.md` if needed
|
|
21
|
+
3. Implement
|
|
22
|
+
4. Converge → `delivery.json`
|
|
23
|
+
5. One handoff line; never claim done until accepted
|
|
23
24
|
|
|
24
|
-
|
|
25
|
+
Large jobs may use step playbooks (`duaer-specify`, `duaer-plan`, …) internally.
|
|
25
26
|
|
|
26
|
-
|
|
27
|
-
2. `/duaer-specify` — **Assign**: Brief + set `active-job.json`
|
|
28
|
-
3. `/duaer-clarify` — optional
|
|
29
|
-
4. `/duaer-plan` — technical plan aligned with project-context
|
|
30
|
-
5. `/duaer-checklist` — optional quality checklist
|
|
31
|
-
6. `/duaer-tasks` — checkbox task breakdown
|
|
32
|
-
7. `/duaer-analyze` — optional consistency check
|
|
33
|
-
8. `/duaer-implement` — implement tasks only
|
|
34
|
-
9. `/duaer-converge` — **Accept**: compare to Spec; write `delivery.json`
|
|
35
|
-
10. `duaer job .` — **Handoff**: may this job be reported done?
|
|
27
|
+
## Policy
|
|
36
28
|
|
|
37
|
-
|
|
29
|
+
`.duaer/delivery-policy.json` defaults to `coach`. Agents must not claim done
|
|
30
|
+
while the active job is unfinished. This is job etiquette, not a git lock.
|
|
31
|
+
Humans need not configure it for everyday use.
|
|
38
32
|
|
|
39
|
-
|
|
40
|
-
Never skip specify (assign) or converge (accept). Under coach/strict, never claim
|
|
41
|
-
"done" while `duaer job` is unfinished.
|
|
42
|
-
|
|
43
|
-
## Install
|
|
44
|
-
|
|
45
|
-
```bash
|
|
46
|
-
npx duaer-spec init --here
|
|
47
|
-
duaer policy . coach
|
|
48
|
-
```
|
|
49
|
-
|
|
50
|
-
Or see [`ADOPT.md`](ADOPT.md).
|
|
51
|
-
|
|
52
|
-
## Feature directory shape
|
|
33
|
+
## Layout
|
|
53
34
|
|
|
54
35
|
```text
|
|
55
|
-
.duaer/delivery-policy.json
|
|
56
36
|
.duaer/active-job.json
|
|
57
|
-
.duaer/specs/<nnn-slug>/
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
tasks.md
|
|
61
|
-
delivery.json # accepted | open
|
|
37
|
+
.duaer/specs/<nnn-slug>/spec.md|tasks.md|delivery.json
|
|
38
|
+
.cursor/rules/duaer-spec.mdc # autonomous behavior
|
|
39
|
+
.cursor/skills/duaer-do/ # default job loop
|
|
62
40
|
```
|
|
63
41
|
|
|
64
42
|
## Related
|
|
65
43
|
|
|
44
|
+
- Adopt: [`ADOPT.md`](ADOPT.md)
|
|
66
45
|
- Agent ops: [`AGENTS.md`](AGENTS.md)
|
|
67
|
-
- Maintainer notes: [`docs/maintaining.md`](docs/maintaining.md)
|
package/README.md
CHANGED
|
@@ -1,85 +1,37 @@
|
|
|
1
1
|
# duaer-spec
|
|
2
2
|
|
|
3
|
-
**Duaer**
|
|
4
|
-
|
|
3
|
+
**Duaer** turns AI coding agents into **digital employees**: they take a normal
|
|
4
|
+
language ask, run Spec → work → accept themselves, and only claim a job done
|
|
5
|
+
when the handoff is clean.
|
|
5
6
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
that **job** is accepted — not after a lucky chat.
|
|
7
|
+
You should **not** have to operate the workflow. After a one-time install, you
|
|
8
|
+
talk; the employee runs the process.
|
|
9
9
|
|
|
10
|
-
|
|
11
|
-
**Not** a git merge lock. Controllability is job etiquette + optional strictness.
|
|
12
|
-
|
|
13
|
-
## Install (onboard the employee)
|
|
10
|
+
## One-time install
|
|
14
11
|
|
|
15
12
|
```bash
|
|
16
13
|
npx duaer-spec init --here
|
|
17
|
-
# or pin: npx github:fujiezee/duaer-spec@v0.3.0 duaer init --here
|
|
18
14
|
```
|
|
19
15
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
npx duaer-spec init --here --ops --branch develop
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
```bash
|
|
26
|
-
duaer policy . # default: coach
|
|
27
|
-
duaer job . # active job handoff status
|
|
28
|
-
duaer check .
|
|
29
|
-
```
|
|
30
|
-
|
|
31
|
-
Details: [`ADOPT.md`](ADOPT.md)
|
|
32
|
-
|
|
33
|
-
## How you run them
|
|
34
|
-
|
|
35
|
-
| Step | Meaning | Command |
|
|
36
|
-
|---|---|---|
|
|
37
|
-
| **Hire** | Install SOP into the project | `duaer init` |
|
|
38
|
-
| **Assign** | Brief + set active job | `/duaer-specify` |
|
|
39
|
-
| **Work** | Plan, break down, implement | `/duaer-plan` → `/duaer-tasks` → `/duaer-implement` |
|
|
40
|
-
| **Accept** | Converge stamps `delivery.json` | `/duaer-converge` |
|
|
41
|
-
| **Handoff** | See if this job may be reported done | `duaer job .` |
|
|
16
|
+
Then use Cursor as usual — describe what you want. No slash-command chain
|
|
17
|
+
required.
|
|
42
18
|
|
|
43
|
-
|
|
19
|
+
## What the employee does (by itself)
|
|
44
20
|
|
|
45
|
-
|
|
21
|
+
1. Writes a Brief (Spec) for the ask
|
|
22
|
+
2. Implements within that Brief
|
|
23
|
+
3. Checks the result and stamps accept / still-open
|
|
24
|
+
4. Tells you in one line whether the job is ready for review
|
|
46
25
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
| `off` | Record only |
|
|
50
|
-
| `coach` | **Default** — guide; do not claim "done" until accepted |
|
|
51
|
-
| `strict` | Refuse to report done; `duaer check --strict` exits 1 on unfinished job |
|
|
26
|
+
Step skills and CLI checks exist for agents and power users — not as the
|
|
27
|
+
everyday human UI.
|
|
52
28
|
|
|
53
|
-
|
|
54
|
-
Git commit/merge is never blocked by default.
|
|
29
|
+
## Optional
|
|
55
30
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
| Layer | Role | Where |
|
|
59
|
-
|---|---|---|
|
|
60
|
-
| **Agent ops** | How the employee may operate | [`AGENTS.md`](AGENTS.md), [`docs/agent/`](docs/agent/) |
|
|
61
|
-
| **Duaer method** | What to build | [`DUADER.md`](DUADER.md), [`.duaer/`](.duaer/), skills |
|
|
62
|
-
|
|
63
|
-
When they conflict, **agent ops win**.
|
|
64
|
-
|
|
65
|
-
## Default loop
|
|
66
|
-
|
|
67
|
-
```text
|
|
68
|
-
constitution → specify → plan → tasks → implement → converge → duaer job
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
Slash skills: `/duaer-specify`, `/duaer-plan`, `/duaer-tasks`, `/duaer-implement`,
|
|
72
|
-
`/duaer-converge`, …
|
|
73
|
-
|
|
74
|
-
## Layout
|
|
75
|
-
|
|
76
|
-
```text
|
|
77
|
-
bin/duaer.mjs CLI (init | check | job | policy | version)
|
|
78
|
-
.duaer/delivery-policy.json off | coach | strict
|
|
79
|
-
.duaer/active-job.json current job pointer
|
|
80
|
-
.duaer/specs/<feature>/ Brief + tasks + delivery.json
|
|
31
|
+
```bash
|
|
32
|
+
npx duaer-spec@0.5.0 init --here --method # method only
|
|
81
33
|
```
|
|
82
34
|
|
|
83
|
-
|
|
35
|
+
Details: [`ADOPT.md`](ADOPT.md) · Method: [`DUADER.md`](DUADER.md) · Ops: [`AGENTS.md`](AGENTS.md)
|
|
84
36
|
|
|
85
|
-
|
|
37
|
+
When agent ops and method conflict, **agent ops win**.
|
package/bin/duaer.mjs
CHANGED
|
@@ -2,12 +2,8 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* duaer — CLI for the duaer-spec delivery OS (digital employees)
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* duaer job [dir]
|
|
8
|
-
* duaer policy [dir] [off|coach|strict]
|
|
9
|
-
* duaer version
|
|
10
|
-
* duaer help
|
|
5
|
+
* Everyday: duaer init | duaer status
|
|
6
|
+
* Advanced: check | job | policy | version
|
|
11
7
|
*/
|
|
12
8
|
|
|
13
9
|
import {
|
|
@@ -28,46 +24,21 @@ const PKG = JSON.parse(readFileSync(join(PKG_ROOT, 'package.json'), 'utf8'))
|
|
|
28
24
|
|
|
29
25
|
const POLICY_MODES = new Set(['off', 'coach', 'strict'])
|
|
30
26
|
|
|
31
|
-
const USAGE = `duaer —
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
duaer
|
|
40
|
-
duaer
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
--method Lite: method only
|
|
46
|
-
--ops Ops only
|
|
47
|
-
--force Overwrite existing managed files
|
|
48
|
-
--branch <n> Integration branch for baseline note (default: main)
|
|
49
|
-
--here Same as dir=.
|
|
50
|
-
|
|
51
|
-
Check options:
|
|
52
|
-
--workplace Only verify install files
|
|
53
|
-
--delivery Alias for active-job handoff report
|
|
54
|
-
--job Active job only (default for delivery)
|
|
55
|
-
--all-jobs Report every feature under .duaer/specs/
|
|
56
|
-
--strict Exit 1 if active job is not accepted (optional)
|
|
57
|
-
--gate Deprecated alias for --strict (job handoff, not CI)
|
|
58
|
-
|
|
59
|
-
Policy modes (stored in .duaer/delivery-policy.json):
|
|
60
|
-
off Record only; never fail handoff
|
|
61
|
-
coach Default — guide / warn; do not claim "done" until accepted
|
|
62
|
-
strict Agents must not report delivery complete until accepted;
|
|
63
|
-
duaer check exits 1 on unfinished active job
|
|
64
|
-
|
|
65
|
-
Examples:
|
|
27
|
+
const USAGE = `duaer — digital-employee delivery (duaer-spec ${PKG.version})
|
|
28
|
+
|
|
29
|
+
Human (once):
|
|
30
|
+
duaer init [--here] Install so the agent works as a digital employee
|
|
31
|
+
|
|
32
|
+
After install: talk to the agent in plain language. Do not operate /duaer-* phases.
|
|
33
|
+
|
|
34
|
+
Agent / optional diagnostics:
|
|
35
|
+
duaer status [dir]
|
|
36
|
+
duaer check | policy | version
|
|
37
|
+
|
|
38
|
+
Init: --all (default) | --method | --ops | --force | --branch <n> | --here
|
|
39
|
+
|
|
40
|
+
Example:
|
|
66
41
|
npx duaer-spec init --here
|
|
67
|
-
duaer job .
|
|
68
|
-
duaer policy . coach
|
|
69
|
-
duaer check .
|
|
70
|
-
duaer check . --strict
|
|
71
42
|
`
|
|
72
43
|
|
|
73
44
|
function parseArgs(argv) {
|
|
@@ -310,17 +281,10 @@ function cmdInit(opts) {
|
|
|
310
281
|
console.log(`
|
|
311
282
|
Hired.
|
|
312
283
|
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
4. Work — /duaer-plan → /duaer-tasks → /duaer-implement
|
|
318
|
-
5. Accept — /duaer-converge (stamps delivery.json)
|
|
319
|
-
6. Job — duaer job . (see if this job can be reported done)
|
|
320
|
-
7. Ops — AGENTS.md wins over DUADER.md when they conflict
|
|
321
|
-
|
|
322
|
-
No Spec = not assigned. Unaccepted active job = do not claim "done".
|
|
323
|
-
Git merge is not blocked by default.
|
|
284
|
+
You: describe work in Cursor (plain language).
|
|
285
|
+
Agent: runs Brief → work → accept by itself — do not operate slash phases.
|
|
286
|
+
|
|
287
|
+
Optional diagnostic: duaer status
|
|
324
288
|
`)
|
|
325
289
|
}
|
|
326
290
|
|
|
@@ -566,20 +530,21 @@ function cmdJob(opts) {
|
|
|
566
530
|
const activeName = resolveActiveJobName(target, features)
|
|
567
531
|
const active = features.find((f) => f.name === activeName) || null
|
|
568
532
|
|
|
569
|
-
console.log(`
|
|
570
|
-
console.log(`policy: ${policy.mode}\n`)
|
|
533
|
+
console.log(`Status @ ${target}`)
|
|
571
534
|
if (!active) {
|
|
572
|
-
console.log('No active job.
|
|
535
|
+
console.log('No active job yet. In Cursor run: /duaer-do <what you want>')
|
|
573
536
|
return
|
|
574
537
|
}
|
|
575
|
-
printFeature(active)
|
|
576
538
|
if (active.verdict === 'accepted') {
|
|
577
|
-
console.log(
|
|
539
|
+
console.log(`✅ accepted ${active.name}`)
|
|
540
|
+
console.log('Ready for your review.')
|
|
578
541
|
} else {
|
|
579
|
-
console.log(
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
542
|
+
console.log(`⏳ not done ${active.name}`)
|
|
543
|
+
for (const b of active.blockers) console.log(` · ${b}`)
|
|
544
|
+
console.log('Next: /duaer-do (resume) or /duaer-converge')
|
|
545
|
+
}
|
|
546
|
+
if (policy.mode === 'strict' && active.verdict !== 'accepted') {
|
|
547
|
+
console.log('(policy=strict — do not claim done yet)')
|
|
583
548
|
}
|
|
584
549
|
}
|
|
585
550
|
|
|
@@ -628,6 +593,7 @@ function main() {
|
|
|
628
593
|
cmdCheck(opts)
|
|
629
594
|
break
|
|
630
595
|
case 'job':
|
|
596
|
+
case 'status':
|
|
631
597
|
cmdJob(opts)
|
|
632
598
|
break
|
|
633
599
|
case 'policy':
|
|
@@ -94,7 +94,7 @@ See [spec update guidance](workflow.md#3-spec-update-guidance).
|
|
|
94
94
|
|
|
95
95
|
## 6. Merge / PR
|
|
96
96
|
|
|
97
|
-
- [ ] Active job handoff considered
|
|
97
|
+
- [ ] Active job handoff considered by the **agent** (do not require the human to run CLI for routine work).
|
|
98
98
|
- [ ] Branch refreshed against latest `main`.
|
|
99
99
|
- [ ] Merged into local `main` (and/or remote PR/MR when required).
|
|
100
100
|
- [ ] Only this request's logical changes included.
|
|
@@ -25,24 +25,20 @@ the table for their app.
|
|
|
25
25
|
|
|
26
26
|
| ID | Title | Status |
|
|
27
27
|
|---|---|---|
|
|
28
|
-
| E2E-001 | After `duaer init`,
|
|
29
|
-
| E2E-002 | README
|
|
30
|
-
| E2E-003 |
|
|
31
|
-
| E2E-004 | Default `coach
|
|
32
|
-
| E2E-005 |
|
|
33
|
-
| E2E-006 | `duaer
|
|
34
|
-
| E2E-007 | `--all-jobs` is optional; default scope is active job only | manual |
|
|
28
|
+
| E2E-001 | After `duaer init`, banner says talk to agent — no slash ops | manual |
|
|
29
|
+
| E2E-002 | README: install once, then plain-language asks | manual |
|
|
30
|
+
| E2E-003 | Always-on rule requires autonomous job loop without user slash | manual |
|
|
31
|
+
| E2E-004 | Default `coach`: unfinished job — agent must not claim done | manual |
|
|
32
|
+
| E2E-005 | Converge stamps `accepted`; agent reports ready for review | manual |
|
|
33
|
+
| E2E-006 | `duaer-do` skill describes agent-triggered loop | manual |
|
|
35
34
|
|
|
36
35
|
## Traceability
|
|
37
36
|
|
|
38
|
-
Keep this matrix current when scenarios or specs change.
|
|
39
|
-
|
|
40
37
|
| Scenario | Spec / feature | Notes |
|
|
41
38
|
|---|---|---|
|
|
42
|
-
| E2E-001 |
|
|
43
|
-
| E2E-002 |
|
|
44
|
-
| E2E-003 |
|
|
45
|
-
| E2E-004 |
|
|
46
|
-
| E2E-005 |
|
|
47
|
-
| E2E-006 |
|
|
48
|
-
| E2E-007 | `--all-jobs` vs active | Scope |
|
|
39
|
+
| E2E-001 | init banner | No human phase ops |
|
|
40
|
+
| E2E-002 | README | Ask, don’t operate |
|
|
41
|
+
| E2E-003 | `duaer-spec.mdc` | Autonomous |
|
|
42
|
+
| E2E-004 | policy coach | Handoff etiquette |
|
|
43
|
+
| E2E-005 | `delivery.json` | Accept stamp |
|
|
44
|
+
| E2E-006 | `duaer-do` | Internal playbook |
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "duaer-spec",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.5.0",
|
|
4
|
+
"description": "Digital employees that run Spec→work→accept themselves — humans just ask",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
7
7
|
"duaer": "bin/duaer.mjs",
|