duaer-spec 0.4.0 → 0.5.1
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/agents-workflow.mdc +12 -5
- package/.cursor/rules/duaer-spec.mdc +31 -15
- package/.cursor/skills/duaer-do/SKILL.md +28 -33
- package/.duaer/memory/constitution.md +6 -11
- package/ADOPT.md +18 -21
- package/AGENTS.md +16 -7
- package/CHANGELOG.md +14 -22
- package/DUADER.md +24 -33
- package/README.md +19 -33
- package/bin/duaer.mjs +27 -15
- package/docs/agent/change-checklist.md +2 -2
- package/docs/agent/e2e-test-plan.md +12 -18
- package/docs/agent/workflow.md +4 -2
- package/package.json +2 -2
|
@@ -14,16 +14,23 @@ integration branch in their baseline.
|
|
|
14
14
|
Use English for code, identifiers, comments, commits, specs, and docs unless
|
|
15
15
|
the project explicitly overrides.
|
|
16
16
|
|
|
17
|
-
## Isolated development
|
|
17
|
+
## Isolated development (mandatory worktree)
|
|
18
18
|
|
|
19
19
|
Before editing files for a new request:
|
|
20
20
|
|
|
21
21
|
1. Update local integration branch (`main` here; or project override)
|
|
22
22
|
2. Create a unique branch: `<type>/<short-description>`
|
|
23
|
-
3. Create a dedicated worktree
|
|
24
|
-
4.
|
|
25
|
-
5. Never
|
|
26
|
-
|
|
23
|
+
3. Create a dedicated worktree at **`.worktree/<request-id>`** (required — not optional)
|
|
24
|
+
4. Develop only inside that worktree
|
|
25
|
+
5. Never develop in the primary checkout or on the long-lived branch
|
|
26
|
+
6. Never reuse or modify another agent's branch/worktree
|
|
27
|
+
7. Never commit `.worktree/` (must stay gitignored)
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
mkdir -p .worktree
|
|
31
|
+
git worktree add .worktree/<request-id> -b <type>/<request-id> main
|
|
32
|
+
cd .worktree/<request-id>
|
|
33
|
+
```
|
|
27
34
|
## Immutable habits
|
|
28
35
|
|
|
29
36
|
- Spec-sync: behavior changes update the relevant project specs/docs (and ADR when architecture/security/contracts change)
|
|
@@ -1,28 +1,44 @@
|
|
|
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
|
-
|
|
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`, …).
|
|
9
11
|
|
|
10
|
-
|
|
12
|
+
If this conflicts with root `AGENTS.md` (worktrees, commits, Issue/PR),
|
|
13
|
+
**AGENTS.md wins**.
|
|
11
14
|
|
|
12
|
-
|
|
15
|
+
## When the human asks for work
|
|
13
16
|
|
|
14
|
-
|
|
17
|
+
For new behavior, fixes, refactors that change product behavior, or architecture:
|
|
15
18
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
+
0. **Isolate first (mandatory):** update integration branch, create
|
|
20
|
+
`<type>/<short-description>`, add worktree at `.worktree/<request-id>`,
|
|
21
|
+
work only there. Never skip the worktree. Never commit `.worktree/`.
|
|
22
|
+
1. **Silently follow** the procedure in `.cursor/skills/duaer-do/SKILL.md`
|
|
23
|
+
(assign Brief → light tasks → implement → converge → handoff line).
|
|
24
|
+
2. Do **not** wait for `/duaer-do` or any other skill invocation.
|
|
25
|
+
3. Do **not** say “please run `/duaer-specify`” — you do it.
|
|
26
|
+
4. Do **not** dump a methodology tutorial unless they ask how Duaer works.
|
|
19
27
|
|
|
20
|
-
##
|
|
28
|
+
## Handoff
|
|
21
29
|
|
|
22
|
-
-
|
|
23
|
-
-
|
|
24
|
-
|
|
30
|
+
- End with whether the **job** is accepted or still open (one clear line).
|
|
31
|
+
- Do **not** claim “done” / “finished” / “complete” unless `delivery.json` is
|
|
32
|
+
`accepted` and open tasks are clear.
|
|
33
|
+
- Do **not** tell them to run `duaer status` unless they want a machine check;
|
|
34
|
+
you already know the handoff state.
|
|
25
35
|
|
|
26
|
-
|
|
36
|
+
## Forbidden
|
|
27
37
|
|
|
28
|
-
|
|
38
|
+
- Jump from chat to code with no Brief under `.duaer/specs/`.
|
|
39
|
+
- Making the human operate the workflow.
|
|
40
|
+
|
|
41
|
+
## Optional finer tools (agent-only)
|
|
42
|
+
|
|
43
|
+
Step skills (`duaer-specify`, `duaer-plan`, …) are **your** playbooks when a
|
|
44
|
+
job is large. The human should not need to know they exist.
|
|
@@ -1,62 +1,57 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: "duaer-do"
|
|
3
|
-
description: "
|
|
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
4
|
compatibility: "Requires duaer-spec project structure with .duaer/ directory"
|
|
5
5
|
metadata:
|
|
6
6
|
author: "duaer-spec"
|
|
7
7
|
source: "duaer-spec"
|
|
8
8
|
---
|
|
9
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
|
+
|
|
10
15
|
## User Input
|
|
11
16
|
|
|
12
17
|
```text
|
|
13
18
|
$ARGUMENTS
|
|
14
19
|
```
|
|
15
20
|
|
|
16
|
-
|
|
21
|
+
If empty, use the current conversation ask as the job.
|
|
17
22
|
|
|
18
23
|
## Goal
|
|
19
24
|
|
|
20
|
-
|
|
21
|
-
asking the user to chain slash commands.
|
|
25
|
+
Run one job end-to-end. The human should only review the result.
|
|
22
26
|
|
|
23
|
-
Do **not** lecture about methodology. Do
|
|
27
|
+
Do **not** lecture about methodology. Do **not** ask them to run commands.
|
|
24
28
|
|
|
25
|
-
## Steps (
|
|
29
|
+
## Steps (you perform these)
|
|
26
30
|
|
|
27
|
-
1. **Assign** — Ensure an active
|
|
28
|
-
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
(create `.duaer/specs/<nnn-slug>/spec.md`, write `.duaer/active-job.json`).
|
|
32
|
-
- For small asks: keep the Spec short (what / why / acceptance only).
|
|
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.
|
|
33
35
|
|
|
34
|
-
2. **Break down
|
|
35
|
-
|
|
36
|
-
- Skip `/duaer-plan` unless architecture or contracts clearly change.
|
|
37
|
-
- If `tasks.md` already exists, use it.
|
|
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
38
|
|
|
39
|
-
3. **Work** — Implement open tasks
|
|
40
|
-
Mark tasks `[x]` as you finish them. Do not expand scope past the Spec.
|
|
39
|
+
3. **Work** — Implement open tasks; mark `[x]` as you go. No scope beyond Spec.
|
|
41
40
|
|
|
42
|
-
4. **Accept** —
|
|
43
|
-
|
|
44
|
-
- If gaps were appended, either implement them now (preferred for small jobs)
|
|
45
|
-
or stop and tell the user what remains — once.
|
|
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.
|
|
46
43
|
|
|
47
|
-
5. **Handoff
|
|
48
|
-
-
|
|
49
|
-
-
|
|
50
|
-
|
|
51
|
-
(coach/strict policy). Git is not locked.
|
|
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.
|
|
52
48
|
|
|
53
49
|
## Hotfix
|
|
54
50
|
|
|
55
|
-
|
|
56
|
-
acceptance), then tasks → implement → converge. Same handoff line.
|
|
51
|
+
Still a short Spec (symptom / cause / acceptance), then work + accept. Same handoff.
|
|
57
52
|
|
|
58
|
-
##
|
|
53
|
+
## Never
|
|
59
54
|
|
|
60
|
-
-
|
|
61
|
-
-
|
|
62
|
-
-
|
|
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,14 +10,9 @@ Duaer for what to build.
|
|
|
10
10
|
|
|
11
11
|
### I. Spec before code (NON-NEGOTIABLE)
|
|
12
12
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
Default path for fine control:
|
|
17
|
-
|
|
18
|
-
`specify` → (optional plan/tasks) → `implement` → `converge` → `duaer status`
|
|
19
|
-
|
|
20
|
-
Hotfix may shorten; still Spec + converge (or `/duaer-do`).
|
|
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.
|
|
21
16
|
|
|
22
17
|
### II. Read as-is before changing
|
|
23
18
|
|
|
@@ -37,6 +32,6 @@ Do not expand scope without updating the spec and tasks.
|
|
|
37
32
|
Mark tasks complete only when the stated verification (tests, manual checks,
|
|
38
33
|
or converge) has been performed or explicitly waived in the feature docs.
|
|
39
34
|
|
|
40
|
-
**Job handoff (not a git lock):**
|
|
41
|
-
`coach` — do not claim "done" while the active job is unfinished.
|
|
42
|
-
not
|
|
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,45 +1,42 @@
|
|
|
1
1
|
# Adopt duaer-spec
|
|
2
2
|
|
|
3
|
-
Install
|
|
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.
|
|
4
5
|
|
|
5
|
-
## Install
|
|
6
|
+
## Install (human, once)
|
|
6
7
|
|
|
7
8
|
```bash
|
|
8
9
|
npx duaer-spec init --here
|
|
9
|
-
# pin: npx github:fujiezee/duaer-spec@v0.
|
|
10
|
+
# pin: npx github:fujiezee/duaer-spec@v0.5.0 duaer init --here
|
|
10
11
|
```
|
|
11
12
|
|
|
12
13
|
```bash
|
|
13
|
-
npx duaer-spec init --here --method
|
|
14
|
+
npx duaer-spec init --here --method
|
|
14
15
|
npx duaer-spec init --here --ops --branch develop
|
|
15
16
|
```
|
|
16
17
|
|
|
17
|
-
|
|
18
|
+
After that: talk to the agent in plain language. Do not teach them `/duaer-*`.
|
|
18
19
|
|
|
19
|
-
|
|
20
|
-
2. `duaer status` when you want to see if the job is accepted
|
|
20
|
+
## What gets installed
|
|
21
21
|
|
|
22
|
-
|
|
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`
|
|
23
26
|
|
|
24
|
-
##
|
|
27
|
+
## Power users / agents
|
|
25
28
|
|
|
26
|
-
|
|
|
29
|
+
| Tool | Who uses it |
|
|
27
30
|
|---|---|
|
|
28
|
-
| `/duaer-
|
|
29
|
-
| `/duaer-
|
|
30
|
-
|
|
|
31
|
-
| `/duaer-converge` | Re-check Spec vs code |
|
|
32
|
-
| `duaer policy . strict` | Harder “don’t claim done” (still not a git lock) |
|
|
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 |
|
|
33
34
|
|
|
34
35
|
## Precedence
|
|
35
36
|
|
|
36
37
|
1. `AGENTS.md` — how employees operate
|
|
37
|
-
2. `DUADER.md` / `.duaer/` —
|
|
38
|
+
2. `DUADER.md` / `.duaer/` — how jobs are briefed
|
|
38
39
|
|
|
39
40
|
## Updates
|
|
40
41
|
|
|
41
|
-
`duaer init --force` (review the diff) or pin a tag.
|
|
42
|
-
|
|
43
|
-
## Do not copy
|
|
44
|
-
|
|
45
|
-
`examples/`, `SOURCE.md`, `bin/` / `package.json` (unless vendoring the CLI)
|
|
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**.
|
|
@@ -114,20 +115,27 @@ Before modifying any file, the agent must:
|
|
|
114
115
|
|
|
115
116
|
1. Update the primary checkout's local `main`
|
|
116
117
|
2. Create a unique branch from the updated `main`
|
|
117
|
-
3. Create a dedicated worktree
|
|
118
|
-
4. Enter
|
|
118
|
+
3. Create a dedicated worktree **under the project** at `.worktree/<request-id>`
|
|
119
|
+
4. Enter that worktree
|
|
119
120
|
5. Only then begin development
|
|
120
121
|
|
|
122
|
+
Worktrees live in **`.worktree/`** at the repository root. That directory is
|
|
123
|
+
**mandatory**, not optional, and **must never be committed** (see `.gitignore`).
|
|
124
|
+
|
|
121
125
|
Example:
|
|
122
126
|
|
|
123
127
|
```bash
|
|
124
128
|
git switch main
|
|
125
129
|
git pull --ff-only
|
|
126
|
-
|
|
127
|
-
|
|
130
|
+
mkdir -p .worktree
|
|
131
|
+
git worktree add .worktree/<request-id> -b <type>/<request-id> main
|
|
132
|
+
cd .worktree/<request-id>
|
|
128
133
|
```
|
|
129
134
|
|
|
130
135
|
Branch and worktree names must be unique and clearly associated with the request.
|
|
136
|
+
Do **not** place request worktrees outside the repo (for example `../worktrees/`)
|
|
137
|
+
unless the project baseline explicitly overrides this and still keeps them
|
|
138
|
+
untracked.
|
|
131
139
|
|
|
132
140
|
**This repository's default integration branch is `main`.** Adopting projects
|
|
133
141
|
may substitute another long-lived branch (for example `develop`); document that
|
|
@@ -210,7 +218,7 @@ Once the request branch is merged into local `main`, remove its worktree and
|
|
|
210
218
|
delete the merged branch. Never leave a merged worktree on disk.
|
|
211
219
|
|
|
212
220
|
```bash
|
|
213
|
-
git worktree remove
|
|
221
|
+
git worktree remove .worktree/<request-id>
|
|
214
222
|
git branch -d <type>/<request-id>
|
|
215
223
|
git worktree prune
|
|
216
224
|
```
|
|
@@ -219,6 +227,7 @@ git worktree prune
|
|
|
219
227
|
* The worktree must be clean first
|
|
220
228
|
* Use `git branch -d` (not `-D`)
|
|
221
229
|
* Delete only your own worktree and branch
|
|
230
|
+
* Never commit `.worktree/` (ignored)
|
|
222
231
|
|
|
223
232
|
## Development Workflow
|
|
224
233
|
|
package/CHANGELOG.md
CHANGED
|
@@ -1,39 +1,31 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.5.0 — 2026-09-15
|
|
4
|
+
|
|
5
|
+
### Autonomous digital employee
|
|
6
|
+
|
|
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”
|
|
12
|
+
|
|
3
13
|
## 0.4.0 — 2026-09-15
|
|
4
14
|
|
|
5
15
|
### Simple everyday ops
|
|
6
16
|
|
|
7
|
-
-
|
|
8
|
-
-
|
|
9
|
-
- README / init / rules lead with hire → `/duaer-do` → `status`
|
|
10
|
-
- Step skills and policy remain available but are advanced, not the default story
|
|
17
|
+
- `/duaer-do` one-shot skill + `duaer status`
|
|
18
|
+
- Step skills demoted to advanced (later reframed as agent-only in 0.5)
|
|
11
19
|
|
|
12
20
|
## 0.3.0 — 2026-09-15
|
|
13
21
|
|
|
14
22
|
### Job handoff (not a repo lock)
|
|
15
23
|
|
|
16
|
-
-
|
|
17
|
-
**active job** is accepted — git merge is not blocked
|
|
18
|
-
- `.duaer/delivery-policy.json` modes: `off` | `coach` | `strict`
|
|
19
|
-
- `.duaer/active-job.json` set by `/duaer-specify`; `duaer job` reports status
|
|
20
|
-
- `duaer policy` to show/set mode
|
|
21
|
-
- `duaer check` defaults to active-job scope; `--strict` / policy `strict` optional
|
|
22
|
-
- `--gate` kept as deprecated alias for `--strict` (job handoff, not CI)
|
|
23
|
-
- `--all-jobs` optional; historical features no longer fail the default path
|
|
24
|
-
- Docs/rules/constitution demote merge-gate language
|
|
25
|
-
|
|
26
|
-
### E2E
|
|
27
|
-
|
|
28
|
-
- E2E-004–007 for coach default, strict optional, active-job scope
|
|
24
|
+
- `coach` / `strict` / `off` policy; active job; `duaer job` / `policy`
|
|
29
25
|
|
|
30
26
|
## 0.2.0 — 2026-09-15
|
|
31
27
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
- `/duaer-converge` writes `.duaer/specs/<feature>/delivery.json`
|
|
35
|
-
- `duaer check` / `--gate` for handoff state
|
|
36
|
-
- Honest scope: handoff state checkable; Spec↔code still agent-assisted
|
|
28
|
+
- `delivery.json` + checkable handoff state
|
|
37
29
|
|
|
38
30
|
## 0.1.1 — 2026-09-15
|
|
39
31
|
|
package/DUADER.md
CHANGED
|
@@ -1,54 +1,45 @@
|
|
|
1
1
|
# Duaer methodology
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
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.
|
|
5
5
|
|
|
6
6
|
**Precedence:** [`AGENTS.md`](AGENTS.md) wins on isolation, commits, Issue/PR.
|
|
7
7
|
|
|
8
|
-
##
|
|
8
|
+
## Human experience
|
|
9
9
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
`/duaer-do` assigns a Brief, implements, converges, and reports handoff.
|
|
15
|
-
Do not require the user to run every phase skill.
|
|
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)
|
|
16
13
|
|
|
17
|
-
##
|
|
14
|
+
## Agent procedure (autonomous)
|
|
18
15
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
3. `/duaer-tasks` — explicit checkbox breakdown
|
|
22
|
-
4. `/duaer-implement` — code from tasks
|
|
23
|
-
5. `/duaer-converge` — accept stamp (`delivery.json`)
|
|
24
|
-
6. `duaer status` — may we claim this job done?
|
|
16
|
+
Follow `.cursor/skills/duaer-do/SKILL.md` on every product ask — **without**
|
|
17
|
+
waiting for a slash invocation:
|
|
25
18
|
|
|
26
|
-
|
|
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
|
|
27
24
|
|
|
28
|
-
|
|
29
|
-
claim "done" while `duaer status` is unfinished. This is **job handoff**, not a
|
|
30
|
-
git merge lock.
|
|
25
|
+
Large jobs may use step playbooks (`duaer-specify`, `duaer-plan`, …) internally.
|
|
31
26
|
|
|
32
|
-
##
|
|
33
|
-
|
|
34
|
-
```bash
|
|
35
|
-
npx duaer-spec init --here
|
|
36
|
-
```
|
|
27
|
+
## Policy
|
|
37
28
|
|
|
38
|
-
|
|
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.
|
|
39
32
|
|
|
40
33
|
## Layout
|
|
41
34
|
|
|
42
35
|
```text
|
|
43
|
-
.duaer/
|
|
44
|
-
.duaer/
|
|
45
|
-
.duaer
|
|
46
|
-
|
|
47
|
-
tasks.md
|
|
48
|
-
delivery.json
|
|
36
|
+
.duaer/active-job.json
|
|
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
|
|
49
40
|
```
|
|
50
41
|
|
|
51
42
|
## Related
|
|
52
43
|
|
|
44
|
+
- Adopt: [`ADOPT.md`](ADOPT.md)
|
|
53
45
|
- Agent ops: [`AGENTS.md`](AGENTS.md)
|
|
54
|
-
- Maintainer notes: [`docs/maintaining.md`](docs/maintaining.md)
|
package/README.md
CHANGED
|
@@ -1,51 +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
|
+
You should **not** have to operate the workflow. After a one-time install, you
|
|
8
|
+
talk; the employee runs the process.
|
|
7
9
|
|
|
8
|
-
|
|
9
|
-
npx duaer-spec init --here
|
|
10
|
-
```
|
|
11
|
-
|
|
12
|
-
In Cursor, one command:
|
|
13
|
-
|
|
14
|
-
```text
|
|
15
|
-
/duaer-do <what you want built or fixed>
|
|
16
|
-
```
|
|
17
|
-
|
|
18
|
-
See if the job can be reported done:
|
|
10
|
+
## One-time install
|
|
19
11
|
|
|
20
12
|
```bash
|
|
21
|
-
duaer
|
|
13
|
+
npx duaer-spec init --here
|
|
22
14
|
```
|
|
23
15
|
|
|
24
|
-
|
|
16
|
+
Then use Cursor as usual — describe what you want. No slash-command chain
|
|
17
|
+
required.
|
|
25
18
|
|
|
26
|
-
## What
|
|
19
|
+
## What the employee does (by itself)
|
|
27
20
|
|
|
28
|
-
1. Writes a
|
|
29
|
-
2. Implements
|
|
30
|
-
3. Checks
|
|
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
|
|
31
25
|
|
|
32
|
-
|
|
33
|
-
|
|
26
|
+
Step skills and CLI checks exist for agents and power users — not as the
|
|
27
|
+
everyday human UI.
|
|
34
28
|
|
|
35
29
|
## Optional
|
|
36
30
|
|
|
37
31
|
```bash
|
|
38
|
-
duaer
|
|
39
|
-
npx duaer-spec@0.4.0 init --here --method # method only
|
|
32
|
+
npx duaer-spec@0.5.0 init --here --method # method only
|
|
40
33
|
```
|
|
41
34
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
## Two layers
|
|
45
|
-
|
|
46
|
-
| Layer | Role |
|
|
47
|
-
|---|---|
|
|
48
|
-
| **Agent ops** | How agents may operate — [`AGENTS.md`](AGENTS.md) |
|
|
49
|
-
| **Duaer method** | How jobs are briefed and accepted — [`.duaer/`](.duaer/), skills |
|
|
35
|
+
Details: [`ADOPT.md`](ADOPT.md) · Method: [`DUADER.md`](DUADER.md) · Ops: [`AGENTS.md`](AGENTS.md)
|
|
50
36
|
|
|
51
|
-
When
|
|
37
|
+
When agent ops and method conflict, **agent ops win**.
|
package/bin/duaer.mjs
CHANGED
|
@@ -26,23 +26,19 @@ const POLICY_MODES = new Set(['off', 'coach', 'strict'])
|
|
|
26
26
|
|
|
27
27
|
const USAGE = `duaer — digital-employee delivery (duaer-spec ${PKG.version})
|
|
28
28
|
|
|
29
|
-
|
|
30
|
-
duaer init [--here]
|
|
31
|
-
duaer status [dir] Is the active job accepted?
|
|
29
|
+
Human (once):
|
|
30
|
+
duaer init [--here] Install so the agent works as a digital employee
|
|
32
31
|
|
|
33
|
-
|
|
32
|
+
After install: talk to the agent in plain language. Do not operate /duaer-* phases.
|
|
34
33
|
|
|
35
|
-
|
|
36
|
-
duaer
|
|
37
|
-
duaer
|
|
38
|
-
duaer policy [dir] [off|coach|strict]
|
|
39
|
-
duaer version
|
|
34
|
+
Agent / optional diagnostics:
|
|
35
|
+
duaer status [dir]
|
|
36
|
+
duaer check | policy | version
|
|
40
37
|
|
|
41
38
|
Init: --all (default) | --method | --ops | --force | --branch <n> | --here
|
|
42
39
|
|
|
43
|
-
|
|
40
|
+
Example:
|
|
44
41
|
npx duaer-spec init --here
|
|
45
|
-
duaer status
|
|
46
42
|
`
|
|
47
43
|
|
|
48
44
|
function parseArgs(argv) {
|
|
@@ -198,6 +194,21 @@ function installMethod(target, opts) {
|
|
|
198
194
|
|
|
199
195
|
copyPath(join(PKG_ROOT, 'DUADER.md'), join(target, 'DUADER.md'), opts)
|
|
200
196
|
console.log(' DUADER.md')
|
|
197
|
+
ensureWorktreeGitignore(target)
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
function ensureWorktreeGitignore(target) {
|
|
201
|
+
const gi = join(target, '.gitignore')
|
|
202
|
+
const line = '.worktree/'
|
|
203
|
+
let text = existsSync(gi) ? readFileSync(gi, 'utf8') : ''
|
|
204
|
+
if (text.split(/\r?\n/).some((l) => l.trim() === line)) {
|
|
205
|
+
console.log(' .gitignore already ignores .worktree/')
|
|
206
|
+
return
|
|
207
|
+
}
|
|
208
|
+
if (text.length && !text.endsWith('\n')) text += '\n'
|
|
209
|
+
text += `# duaer-spec: mandatory request worktrees (do not commit)\n${line}\n`
|
|
210
|
+
writeFileSync(gi, text, 'utf8')
|
|
211
|
+
console.log(' .gitignore ← .worktree/')
|
|
201
212
|
}
|
|
202
213
|
|
|
203
214
|
function installOps(target, opts) {
|
|
@@ -224,6 +235,7 @@ function installOps(target, opts) {
|
|
|
224
235
|
)
|
|
225
236
|
}
|
|
226
237
|
console.log(' docs/agent/')
|
|
238
|
+
ensureWorktreeGitignore(target)
|
|
227
239
|
|
|
228
240
|
const baselineSrc = join(PKG_ROOT, 'docs', 'baseline.md')
|
|
229
241
|
const baselineDst = join(target, 'docs', 'baseline.md')
|
|
@@ -283,12 +295,12 @@ function cmdInit(opts) {
|
|
|
283
295
|
}
|
|
284
296
|
|
|
285
297
|
console.log(`
|
|
286
|
-
Hired.
|
|
298
|
+
Hired.
|
|
287
299
|
|
|
288
|
-
|
|
289
|
-
|
|
300
|
+
You: describe work in Cursor (plain language).
|
|
301
|
+
Agent: runs Brief → work → accept by itself — do not operate slash phases.
|
|
290
302
|
|
|
291
|
-
|
|
303
|
+
Optional diagnostic: duaer status
|
|
292
304
|
`)
|
|
293
305
|
}
|
|
294
306
|
|
|
@@ -45,7 +45,7 @@ See [R6](workflow.md#r6--merge-a-linked-pull-request-whose-principle-is-sound-th
|
|
|
45
45
|
- [ ] Existing uncommitted work is identified and preserved.
|
|
46
46
|
- [ ] `origin/main` fetched; local `main` fast-forwarded when clean.
|
|
47
47
|
- [ ] Dedicated `<type>/<short-description>` branch and worktree created from
|
|
48
|
-
that commit.
|
|
48
|
+
that commit under **`.worktree/<request-id>`** (mandatory; never commit `.worktree/`).
|
|
49
49
|
- [ ] Shared toolchains/caches reused where safe; mutable state stays local.
|
|
50
50
|
- [ ] Current branch is not `main` before implementation begins.
|
|
51
51
|
|
|
@@ -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,26 +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 |
|
|
35
|
-
| E2E-008 | `/duaer-do` skill is installed by `duaer init` | 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 |
|
|
36
34
|
|
|
37
35
|
## Traceability
|
|
38
36
|
|
|
39
|
-
Keep this matrix current when scenarios or specs change.
|
|
40
|
-
|
|
41
37
|
| Scenario | Spec / feature | Notes |
|
|
42
38
|
|---|---|---|
|
|
43
|
-
| E2E-001 |
|
|
44
|
-
| E2E-002 |
|
|
45
|
-
| E2E-003 | `duaer
|
|
46
|
-
| E2E-004 |
|
|
47
|
-
| E2E-005 |
|
|
48
|
-
| E2E-006 |
|
|
49
|
-
| E2E-007 | `--all-jobs` vs active | Scope |
|
|
50
|
-
| E2E-008 | `.cursor/skills/duaer-do` | One-shot skill |
|
|
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/docs/agent/workflow.md
CHANGED
|
@@ -45,10 +45,12 @@ handling. They cannot be relaxed without explicit human override.
|
|
|
45
45
|
> branch and finishes only after it is merged into `main`.**
|
|
46
46
|
|
|
47
47
|
- Before editing: preserve existing uncommitted work; fetch and fast-forward
|
|
48
|
-
local `main` when clean; create a new request branch and
|
|
49
|
-
|
|
48
|
+
local `main` when clean; create a new request branch and a dedicated worktree
|
|
49
|
+
at **`.worktree/<request-id>`** under the project root. Worktrees are
|
|
50
|
+
**mandatory**. Never stash or overwrite another agent's work merely to start.
|
|
50
51
|
- Name branches `<type>/<short-description>` (for example `feat/adopt-docs`).
|
|
51
52
|
- Do not implement in the primary checkout or reuse another request's worktree.
|
|
53
|
+
- Keep `.worktree/` gitignored — never commit request worktrees.
|
|
52
54
|
- Reuse shared toolchains and caches where safe; keep mutable or
|
|
53
55
|
concurrency-sensitive state worktree-local and ignored.
|
|
54
56
|
- After validation: merge into local `main` (or via PR/MR when required), then
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "duaer-spec",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.5.1",
|
|
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",
|