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.
@@ -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 and develop only there
24
- 4. Never develop in the primary checkout or on the long-lived branch
25
- 5. Never reuse or modify another agent's branch/worktree
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: Prefer simple /duaer-do; Spec before code; handoff before claiming done
2
+ description: Autonomous digital employee run Duaer job loop without asking the user to operate
3
3
  alwaysApply: true
4
4
  ---
5
5
 
6
- # Duaer (keep it simple)
6
+ # Digital employee (autonomous)
7
7
 
8
- Treat agents as digital employees. Prefer **one** everyday command:
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
- `/duaer-do <ask>` then `duaer status` if needed.
12
+ If this conflicts with root `AGENTS.md` (worktrees, commits, Issue/PR),
13
+ **AGENTS.md wins**.
11
14
 
12
- If this conflicts with `AGENTS.md` (worktrees, commits, Issue/PR), **AGENTS.md wins**.
15
+ ## When the human asks for work
13
16
 
14
- ## Everyday
17
+ For new behavior, fixes, refactors that change product behavior, or architecture:
15
18
 
16
- 1. `/duaer-do` assign Brief, implement, converge
17
- 2. Do **not** claim "done" unless the job is accepted (`duaer status`)
18
- 3. Do **not** make the user chain specify → plan → tasks → implement → converge for normal asks
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
- ## When to use step skills
28
+ ## Handoff
21
29
 
22
- - `/duaer-specify` only reshape the Brief
23
- - `/duaer-plan` / `/duaer-tasks` large or architectural work
24
- - `/duaer-implement` / `/duaer-converge` resume mid-job
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
- Hotfix: still a short Spec + accept (or `/duaer-do`).
36
+ ## Forbidden
27
37
 
28
- Forbidden: jump from chat to code with no Spec under `.duaer/specs/`.
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: "Simple one-shot: turn a user ask into an assigned job, implement it, and hand off. Prefer this for everyday work instead of chaining specify/plan/tasks/implement/converge."
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
- You **MUST** use the user input as the job request (if not empty).
21
+ If empty, use the current conversation ask as the job.
17
22
 
18
23
  ## Goal
19
24
 
20
- **Everyday path — keep it simple.** Run one digital-employee job end-to-end without
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 the work.
27
+ Do **not** lecture about methodology. Do **not** ask them to run commands.
24
28
 
25
- ## Steps (always in order)
29
+ ## Steps (you perform these)
26
30
 
27
- 1. **Assign** — Ensure an active feature Brief exists:
28
- - If there is already a clear active job (`.duaer/active-job.json` + `spec.md`)
29
- that matches this ask, update that `spec.md` acceptance as needed.
30
- - Otherwise run the same outcome as `/duaer-specify` for this ask
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 (lightweight)** — If `tasks.md` is missing:
35
- - Write a short `tasks.md` with a few `- [ ]` items from the Spec.
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 (same rules as `/duaer-implement`).
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** — Run the same outcome as `/duaer-converge`:
43
- - Compare code to Spec; append gap tasks or stamp `delivery.json` accepted.
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 line** — End with exactly one clear status:
48
- - If accepted: `✅ Job accepted — ready for your review.`
49
- - If not: `⏳ Job not accepted yet — <one sentence what to do next>.`
50
- - Do **not** claim "done" unless `delivery.json` is `accepted` and tasks are clear
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
- If the user says hotfix/bug/regression: still write a short Spec (symptom / cause /
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
- ## Out of scope for this command
53
+ ## Never
59
54
 
60
- - Do not require the user to run `/duaer-plan`, `/duaer-checklist`, or `/duaer-analyze`.
61
- - Do not discuss policy modes unless they ask.
62
- - Do not turn this into a merge/CI lecture.
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
- Everyday: `/duaer-do` (assigns Spec, implements, converges).
14
- Or the full chain. Never skip Spec or converge.
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):** prefer `duaer status`. Default policy is
41
- `coach` — do not claim "done" while the active job is unfinished. Users should
42
- not need to learn policy modes for everyday work.
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 Duaer so agents act like digital employees with a simple everyday loop.
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.4.0 duaer init --here
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 # lite
14
+ npx duaer-spec init --here --method
14
15
  npx duaer-spec init --here --ops --branch develop
15
16
  ```
16
17
 
17
- ## Everyday use
18
+ After that: talk to the agent in plain language. Do not teach them `/duaer-*`.
18
19
 
19
- 1. `/duaer-do <ask>` in Cursor
20
- 2. `duaer status` when you want to see if the job is accepted
20
+ ## What gets installed
21
21
 
22
- No need to learn policy modes or the full skill chain for normal work.
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
- ## Finer control (optional)
27
+ ## Power users / agents
25
28
 
26
- | Command | When |
29
+ | Tool | Who uses it |
27
30
  |---|---|
28
- | `/duaer-specify` | Only write / reshape the Brief |
29
- | `/duaer-plan` · `/duaer-tasks` | Large or architectural jobs |
30
- | `/duaer-implement` | Resume coding from `tasks.md` |
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/` — what to build
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. No auto-update.
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**: this file is the workplace policy for
7
- *how* they may operate (isolation, commits, Issue/PR gates). Duaer
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 for that branch
118
- 4. Enter the new worktree
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
- git worktree add ../worktrees/<request-id> -b <type>/<request-id> main
127
- cd ../worktrees/<request-id>
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 ../worktrees/<request-id>
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
- - **`/duaer-do`** one Cursor skill for assign → work → accept
8
- - **`duaer status`** plain “accepted / not done” (alias of `job`)
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
- - Default policy **`coach`**: guide the employee; do not claim "done" until the
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
- ### Controllable delivery (machine gate)
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
- Treat AI coding agents as **digital employees**. Everyday path is short; the
4
- full chain exists when you need it.
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
- ## Everyday (default)
8
+ ## Human experience
9
9
 
10
- ```text
11
- /duaer-do <ask> → duaer status
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
- ## Full path (optional)
14
+ ## Agent procedure (autonomous)
18
15
 
19
- 1. `/duaer-specify` — Brief
20
- 2. `/duaer-plan` when architecture/contracts change
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
- Hotfix: short Spec tasks → implement → converge (or just `/duaer-do`).
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
- Never skip a Brief or an accept step. Under default **coach** policy, do not
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
- ## Install
33
-
34
- ```bash
35
- npx duaer-spec init --here
36
- ```
27
+ ## Policy
37
28
 
38
- See [`ADOPT.md`](ADOPT.md).
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/delivery-policy.json # default coach — usually ignore
44
- .duaer/active-job.json # current job
45
- .duaer/specs/<nnn-slug>/
46
- spec.md
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** makes AI coding agents work like digital employees: assign a job,
4
- get a controllable handoff without a rigid git lock.
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
- ## Everyday (this is enough)
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
- ```bash
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 status
13
+ npx duaer-spec init --here
22
14
  ```
23
15
 
24
- That’s the whole loop: **hire do status**.
16
+ Then use Cursor as usual describe what you want. No slash-command chain
17
+ required.
25
18
 
26
- ## What `/duaer-do` does
19
+ ## What the employee does (by itself)
27
20
 
28
- 1. Writes a short Brief (Spec)
29
- 2. Implements it
30
- 3. Checks against the Brief and stamps accept / still-open
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
- You do **not** need to chain specify plan tasks implement converge
33
- for normal work. Those remain available when you want finer control.
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 status # active job: accepted or not
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
- Advanced (policy, full check, step-by-step skills): [`ADOPT.md`](ADOPT.md) · [`DUADER.md`](DUADER.md)
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 they conflict, **agent ops win**.
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
- Everyday:
30
- duaer init [--here] Hire into a project
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
- In Cursor: /duaer-do <what you want>
32
+ After install: talk to the agent in plain language. Do not operate /duaer-* phases.
34
33
 
35
- Advanced:
36
- duaer check [dir] [--workplace|--job|--all-jobs|--strict]
37
- duaer job [dir] (same as status)
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
- Examples:
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. Everyday loop:
298
+ Hired.
287
299
 
288
- 1. In Cursor: /duaer-do <what you want>
289
- 2. Optional: duaer status
300
+ You: describe work in Cursor (plain language).
301
+ Agent: runs Brief → work → accept by itself — do not operate slash phases.
290
302
 
291
- That is enough for normal work. Advanced: ADOPT.md / DUADER.md
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: `duaer job .` (coach/strict: do not claim done if unfinished).
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`, CLI prints simple `/duaer-do` next steps | manual |
29
- | E2E-002 | README everyday path is hire → `/duaer-do` `status` | manual |
30
- | E2E-003 | `duaer status` shows accepted / not done in plain language | manual |
31
- | E2E-004 | Default `coach` policy: unfinished job warns but check exits 0 | manual |
32
- | E2E-005 | After converge stamps `accepted`, `duaer status` shows accepted | manual |
33
- | E2E-006 | `duaer policy . strict` then unfinished job makes check exit 1 | manual |
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 | `bin/duaer.mjs` init banner | Simple onboarding |
44
- | E2E-002 | `README.md` | Everyday path |
45
- | E2E-003 | `duaer status` | Plain language |
46
- | E2E-004 | `delivery-policy.json` coach | Not a repo lock |
47
- | E2E-005 | converge → `delivery.json` | Accept stamp |
48
- | E2E-006 | policy strict | Optional |
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 |
@@ -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 worktree from that
49
- commit. Never stash or overwrite another agent's work merely to start.
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.0",
4
- "description": "Simple digital-employee delivery: /duaer-do + duaer status",
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",