duaer-spec 0.3.0 → 0.4.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 +15 -38
- package/.cursor/skills/duaer-do/SKILL.md +62 -0
- package/.duaer/memory/constitution.md +9 -15
- package/ADOPT.md +20 -53
- package/CHANGELOG.md +13 -38
- package/DUADER.md +26 -39
- package/README.md +27 -61
- package/bin/duaer.mjs +35 -65
- package/docs/agent/e2e-test-plan.md +11 -9
- package/package.json +2 -2
|
@@ -1,51 +1,28 @@
|
|
|
1
1
|
---
|
|
2
|
-
description:
|
|
2
|
+
description: Prefer simple /duaer-do; Spec before code; handoff before claiming done
|
|
3
3
|
alwaysApply: true
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
# Duaer
|
|
6
|
+
# Duaer (keep it simple)
|
|
7
7
|
|
|
8
|
-
Treat agents as
|
|
9
|
-
via converge; only then claim the **job** is done. See `DUADER.md` and
|
|
10
|
-
`.duaer/memory/constitution.md`.
|
|
8
|
+
Treat agents as digital employees. Prefer **one** everyday command:
|
|
11
9
|
|
|
12
|
-
|
|
13
|
-
Issue/PR), **AGENTS.md wins**.
|
|
10
|
+
`/duaer-do <ask>` → then `duaer status` if needed.
|
|
14
11
|
|
|
15
|
-
|
|
12
|
+
If this conflicts with `AGENTS.md` (worktrees, commits, Issue/PR), **AGENTS.md wins**.
|
|
16
13
|
|
|
17
|
-
|
|
14
|
+
## Everyday
|
|
18
15
|
|
|
19
|
-
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
- Check with `duaer job .` before telling the user work is finished.
|
|
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
|
|
23
19
|
|
|
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 |
|
|
20
|
+
## When to use step skills
|
|
29
21
|
|
|
30
|
-
|
|
22
|
+
- `/duaer-specify` only — reshape the Brief
|
|
23
|
+
- `/duaer-plan` / `/duaer-tasks` — large or architectural work
|
|
24
|
+
- `/duaer-implement` / `/duaer-converge` — resume mid-job
|
|
31
25
|
|
|
32
|
-
|
|
26
|
+
Hotfix: still a short Spec + accept (or `/duaer-do`).
|
|
33
27
|
|
|
34
|
-
|
|
35
|
-
- Architecture or contract changes
|
|
36
|
-
- Hotfixes / regressions (still Spec; shorter path allowed)
|
|
37
|
-
|
|
38
|
-
Forbidden: jump from chat to code with no `spec.md` / feature directory under `.duaer/specs/`.
|
|
39
|
-
|
|
40
|
-
## Default flow
|
|
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)
|
|
28
|
+
Forbidden: jump from chat to code with no Spec under `.duaer/specs/`.
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
---
|
|
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."
|
|
4
|
+
compatibility: "Requires duaer-spec project structure with .duaer/ directory"
|
|
5
|
+
metadata:
|
|
6
|
+
author: "duaer-spec"
|
|
7
|
+
source: "duaer-spec"
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## User Input
|
|
11
|
+
|
|
12
|
+
```text
|
|
13
|
+
$ARGUMENTS
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
You **MUST** use the user input as the job request (if not empty).
|
|
17
|
+
|
|
18
|
+
## Goal
|
|
19
|
+
|
|
20
|
+
**Everyday path — keep it simple.** Run one digital-employee job end-to-end without
|
|
21
|
+
asking the user to chain slash commands.
|
|
22
|
+
|
|
23
|
+
Do **not** lecture about methodology. Do the work.
|
|
24
|
+
|
|
25
|
+
## Steps (always in order)
|
|
26
|
+
|
|
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).
|
|
33
|
+
|
|
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.
|
|
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.
|
|
41
|
+
|
|
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.
|
|
46
|
+
|
|
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.
|
|
52
|
+
|
|
53
|
+
## Hotfix
|
|
54
|
+
|
|
55
|
+
If the user says hotfix/bug/regression: still write a short Spec (symptom / cause /
|
|
56
|
+
acceptance), then tasks → implement → converge. Same handoff line.
|
|
57
|
+
|
|
58
|
+
## Out of scope for this command
|
|
59
|
+
|
|
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.
|
|
@@ -10,13 +10,14 @@ Duaer for what to build.
|
|
|
10
10
|
|
|
11
11
|
### I. Spec before code (NON-NEGOTIABLE)
|
|
12
12
|
|
|
13
|
-
|
|
14
|
-
|
|
13
|
+
Everyday: `/duaer-do` (assigns Spec, implements, converges).
|
|
14
|
+
Or the full chain. Never skip Spec or converge.
|
|
15
15
|
|
|
16
|
-
|
|
16
|
+
Default path for fine control:
|
|
17
17
|
|
|
18
|
-
|
|
19
|
-
|
|
18
|
+
`specify` → (optional plan/tasks) → `implement` → `converge` → `duaer status`
|
|
19
|
+
|
|
20
|
+
Hotfix may shorten; still Spec + converge (or `/duaer-do`).
|
|
20
21
|
|
|
21
22
|
### II. Read as-is before changing
|
|
22
23
|
|
|
@@ -36,13 +37,6 @@ Do not expand scope without updating the spec and tasks.
|
|
|
36
37
|
Mark tasks complete only when the stated verification (tests, manual checks,
|
|
37
38
|
or converge) has been performed or explicitly waived in the feature docs.
|
|
38
39
|
|
|
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.
|
|
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.
|
package/ADOPT.md
CHANGED
|
@@ -1,78 +1,45 @@
|
|
|
1
1
|
# Adopt duaer-spec
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
agent-ops contract. Controllability is **job handoff**, not a git merge lock.
|
|
3
|
+
Install Duaer so agents act like digital employees with a simple everyday loop.
|
|
5
4
|
|
|
6
|
-
##
|
|
7
|
-
|
|
8
|
-
From the target project (Node 18+):
|
|
5
|
+
## Install
|
|
9
6
|
|
|
10
7
|
```bash
|
|
11
8
|
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
|
|
9
|
+
# pin: npx github:fujiezee/duaer-spec@v0.4.0 duaer init --here
|
|
19
10
|
```
|
|
20
11
|
|
|
21
|
-
From a clone of this repo:
|
|
22
|
-
|
|
23
12
|
```bash
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
node bin/duaer.mjs policy /path/to/project
|
|
13
|
+
npx duaer-spec init --here --method # lite
|
|
14
|
+
npx duaer-spec init --here --ops --branch develop
|
|
27
15
|
```
|
|
28
16
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
Then:
|
|
17
|
+
## Everyday use
|
|
32
18
|
|
|
33
|
-
1.
|
|
34
|
-
2.
|
|
35
|
-
3. **Assign → work → accept → handoff** — `/duaer-specify` → … → `/duaer-converge` → `duaer job .`
|
|
19
|
+
1. `/duaer-do <ask>` in Cursor
|
|
20
|
+
2. `duaer status` when you want to see if the job is accepted
|
|
36
21
|
|
|
37
|
-
|
|
38
|
-
as done under `coach`/`strict`. Git is not blocked by default.
|
|
22
|
+
No need to learn policy modes or the full skill chain for normal work.
|
|
39
23
|
|
|
40
|
-
##
|
|
24
|
+
## Finer control (optional)
|
|
41
25
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
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
|
-
```
|
|
26
|
+
| Command | When |
|
|
27
|
+
|---|---|
|
|
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) |
|
|
62
33
|
|
|
63
34
|
## Precedence
|
|
64
35
|
|
|
65
|
-
1. `AGENTS.md`
|
|
36
|
+
1. `AGENTS.md` — how employees operate
|
|
66
37
|
2. `DUADER.md` / `.duaer/` — what to build
|
|
67
|
-
3. Product overlays (do not copy `examples/` blindly)
|
|
68
38
|
|
|
69
39
|
## Updates
|
|
70
40
|
|
|
71
|
-
|
|
72
|
-
are not auto-updated.
|
|
41
|
+
`duaer init --force` (review the diff) or pin a tag. No auto-update.
|
|
73
42
|
|
|
74
43
|
## Do not copy
|
|
75
44
|
|
|
76
|
-
|
|
77
|
-
- `SOURCE.md` — provenance for maintainers
|
|
78
|
-
- `bin/` / `package.json` — only needed if you vendor the CLI itself
|
|
45
|
+
`examples/`, `SOURCE.md`, `bin/` / `package.json` (unless vendoring the CLI)
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.4.0 — 2026-09-15
|
|
4
|
+
|
|
5
|
+
### Simple everyday ops
|
|
6
|
+
|
|
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
|
|
11
|
+
|
|
3
12
|
## 0.3.0 — 2026-09-15
|
|
4
13
|
|
|
5
14
|
### Job handoff (not a repo lock)
|
|
@@ -23,47 +32,13 @@
|
|
|
23
32
|
### Controllable delivery (machine gate)
|
|
24
33
|
|
|
25
34
|
- `/duaer-converge` writes `.duaer/specs/<feature>/delivery.json`
|
|
26
|
-
|
|
27
|
-
-
|
|
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
|
|
32
|
-
|
|
33
|
-
### E2E
|
|
34
|
-
|
|
35
|
-
- E2E-003 / E2E-004 / E2E-005 for delivery report and gate
|
|
35
|
+
- `duaer check` / `--gate` for handoff state
|
|
36
|
+
- Honest scope: handoff state checkable; Spec↔code still agent-assisted
|
|
36
37
|
|
|
37
38
|
## 0.1.1 — 2026-09-15
|
|
38
39
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
- Position Duaer as a **delivery OS for AI digital employees**: hire → assign
|
|
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)
|
|
40
|
+
- Digital-employee delivery OS positioning
|
|
46
41
|
|
|
47
42
|
## 0.1.0 — 2026-09-15
|
|
48
43
|
|
|
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
|
-
```
|
|
44
|
+
- First public methodology release
|
package/DUADER.md
CHANGED
|
@@ -1,64 +1,51 @@
|
|
|
1
1
|
# Duaer methodology
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
counts as done after **converge** accepts it — then `duaer job` shows accepted.
|
|
3
|
+
Treat AI coding agents as **digital employees**. Everyday path is short; the
|
|
4
|
+
full chain exists when you need it.
|
|
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
|
+
## Everyday (default)
|
|
11
9
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
## Read before work
|
|
16
|
-
|
|
17
|
-
1. `.duaer/memory/constitution.md` — process principles
|
|
18
|
-
2. `.duaer/memory/project-context.md` — as-is implementation truth
|
|
19
|
-
3. `.duaer/memory/testing.md` — verification expectations
|
|
20
|
-
4. Active job: `.duaer/active-job.json` → feature under `.duaer/specs/<nnn-slug>/`
|
|
10
|
+
```text
|
|
11
|
+
/duaer-do <ask> → duaer status
|
|
12
|
+
```
|
|
21
13
|
|
|
22
|
-
|
|
14
|
+
`/duaer-do` assigns a Brief, implements, converges, and reports handoff.
|
|
15
|
+
Do not require the user to run every phase skill.
|
|
23
16
|
|
|
24
|
-
|
|
17
|
+
## Full path (optional)
|
|
25
18
|
|
|
26
|
-
1. `/duaer-
|
|
27
|
-
2. `/duaer-
|
|
28
|
-
3. `/duaer-
|
|
29
|
-
4. `/duaer-
|
|
30
|
-
5. `/duaer-
|
|
31
|
-
6.
|
|
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?
|
|
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?
|
|
36
25
|
|
|
37
|
-
|
|
26
|
+
Hotfix: short Spec → tasks → implement → converge (or just `/duaer-do`).
|
|
38
27
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
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.
|
|
42
31
|
|
|
43
32
|
## Install
|
|
44
33
|
|
|
45
34
|
```bash
|
|
46
35
|
npx duaer-spec init --here
|
|
47
|
-
duaer policy . coach
|
|
48
36
|
```
|
|
49
37
|
|
|
50
|
-
|
|
38
|
+
See [`ADOPT.md`](ADOPT.md).
|
|
51
39
|
|
|
52
|
-
##
|
|
40
|
+
## Layout
|
|
53
41
|
|
|
54
42
|
```text
|
|
55
|
-
.duaer/delivery-policy.json
|
|
56
|
-
.duaer/active-job.json
|
|
43
|
+
.duaer/delivery-policy.json # default coach — usually ignore
|
|
44
|
+
.duaer/active-job.json # current job
|
|
57
45
|
.duaer/specs/<nnn-slug>/
|
|
58
|
-
spec.md
|
|
59
|
-
plan.md
|
|
46
|
+
spec.md
|
|
60
47
|
tasks.md
|
|
61
|
-
delivery.json
|
|
48
|
+
delivery.json
|
|
62
49
|
```
|
|
63
50
|
|
|
64
51
|
## Related
|
package/README.md
CHANGED
|
@@ -1,85 +1,51 @@
|
|
|
1
1
|
# duaer-spec
|
|
2
2
|
|
|
3
|
-
**Duaer**
|
|
4
|
-
|
|
3
|
+
**Duaer** makes AI coding agents work like digital employees: assign a job,
|
|
4
|
+
get a controllable handoff — without a rigid git lock.
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
has a Brief (Spec), follows a fixed work order, and only counts as done when
|
|
8
|
-
that **job** is accepted — not after a lucky chat.
|
|
9
|
-
|
|
10
|
-
Cursor is the labor. Duaer is hire → assign → accept.
|
|
11
|
-
**Not** a git merge lock. Controllability is job etiquette + optional strictness.
|
|
12
|
-
|
|
13
|
-
## Install (onboard the employee)
|
|
6
|
+
## Everyday (this is enough)
|
|
14
7
|
|
|
15
8
|
```bash
|
|
16
9
|
npx duaer-spec init --here
|
|
17
|
-
# or pin: npx github:fujiezee/duaer-spec@v0.3.0 duaer init --here
|
|
18
10
|
```
|
|
19
11
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
12
|
+
In Cursor, one command:
|
|
13
|
+
|
|
14
|
+
```text
|
|
15
|
+
/duaer-do <what you want built or fixed>
|
|
23
16
|
```
|
|
24
17
|
|
|
18
|
+
See if the job can be reported done:
|
|
19
|
+
|
|
25
20
|
```bash
|
|
26
|
-
duaer
|
|
27
|
-
duaer job . # active job handoff status
|
|
28
|
-
duaer check .
|
|
21
|
+
duaer status
|
|
29
22
|
```
|
|
30
23
|
|
|
31
|
-
|
|
24
|
+
That’s the whole loop: **hire → do → status**.
|
|
32
25
|
|
|
33
|
-
##
|
|
26
|
+
## What `/duaer-do` does
|
|
34
27
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
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 .` |
|
|
28
|
+
1. Writes a short Brief (Spec)
|
|
29
|
+
2. Implements it
|
|
30
|
+
3. Checks against the Brief and stamps accept / still-open
|
|
42
31
|
|
|
43
|
-
|
|
32
|
+
You do **not** need to chain specify → plan → tasks → implement → converge
|
|
33
|
+
for normal work. Those remain available when you want finer control.
|
|
44
34
|
|
|
45
|
-
|
|
35
|
+
## Optional
|
|
46
36
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
| `strict` | Refuse to report done; `duaer check --strict` exits 1 on unfinished job |
|
|
37
|
+
```bash
|
|
38
|
+
duaer status # active job: accepted or not
|
|
39
|
+
npx duaer-spec@0.4.0 init --here --method # method only
|
|
40
|
+
```
|
|
52
41
|
|
|
53
|
-
|
|
54
|
-
Git commit/merge is never blocked by default.
|
|
42
|
+
Advanced (policy, full check, step-by-step skills): [`ADOPT.md`](ADOPT.md) · [`DUADER.md`](DUADER.md)
|
|
55
43
|
|
|
56
44
|
## Two layers
|
|
57
45
|
|
|
58
|
-
| Layer | Role |
|
|
59
|
-
|
|
60
|
-
| **Agent ops** | How
|
|
61
|
-
| **Duaer method** |
|
|
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 |
|
|
62
50
|
|
|
63
51
|
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
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
## Learn more
|
|
84
|
-
|
|
85
|
-
Method: [`DUADER.md`](DUADER.md) · Agent ops: [`AGENTS.md`](AGENTS.md)
|
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,25 @@ 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
|
-
duaer
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
duaer
|
|
41
|
-
duaer
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
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
|
|
27
|
+
const USAGE = `duaer — digital-employee delivery (duaer-spec ${PKG.version})
|
|
28
|
+
|
|
29
|
+
Everyday:
|
|
30
|
+
duaer init [--here] Hire into a project
|
|
31
|
+
duaer status [dir] Is the active job accepted?
|
|
32
|
+
|
|
33
|
+
In Cursor: /duaer-do <what you want>
|
|
34
|
+
|
|
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
|
|
40
|
+
|
|
41
|
+
Init: --all (default) | --method | --ops | --force | --branch <n> | --here
|
|
64
42
|
|
|
65
43
|
Examples:
|
|
66
44
|
npx duaer-spec init --here
|
|
67
|
-
duaer
|
|
68
|
-
duaer policy . coach
|
|
69
|
-
duaer check .
|
|
70
|
-
duaer check . --strict
|
|
45
|
+
duaer status
|
|
71
46
|
`
|
|
72
47
|
|
|
73
48
|
function parseArgs(argv) {
|
|
@@ -308,19 +283,12 @@ function cmdInit(opts) {
|
|
|
308
283
|
}
|
|
309
284
|
|
|
310
285
|
console.log(`
|
|
311
|
-
Hired.
|
|
312
|
-
|
|
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.
|
|
286
|
+
Hired. Everyday loop:
|
|
287
|
+
|
|
288
|
+
1. In Cursor: /duaer-do <what you want>
|
|
289
|
+
2. Optional: duaer status
|
|
290
|
+
|
|
291
|
+
That is enough for normal work. Advanced: ADOPT.md / DUADER.md
|
|
324
292
|
`)
|
|
325
293
|
}
|
|
326
294
|
|
|
@@ -566,20 +534,21 @@ function cmdJob(opts) {
|
|
|
566
534
|
const activeName = resolveActiveJobName(target, features)
|
|
567
535
|
const active = features.find((f) => f.name === activeName) || null
|
|
568
536
|
|
|
569
|
-
console.log(`
|
|
570
|
-
console.log(`policy: ${policy.mode}\n`)
|
|
537
|
+
console.log(`Status @ ${target}`)
|
|
571
538
|
if (!active) {
|
|
572
|
-
console.log('No active job.
|
|
539
|
+
console.log('No active job yet. In Cursor run: /duaer-do <what you want>')
|
|
573
540
|
return
|
|
574
541
|
}
|
|
575
|
-
printFeature(active)
|
|
576
542
|
if (active.verdict === 'accepted') {
|
|
577
|
-
console.log(
|
|
543
|
+
console.log(`✅ accepted ${active.name}`)
|
|
544
|
+
console.log('Ready for your review.')
|
|
578
545
|
} else {
|
|
579
|
-
console.log(
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
546
|
+
console.log(`⏳ not done ${active.name}`)
|
|
547
|
+
for (const b of active.blockers) console.log(` · ${b}`)
|
|
548
|
+
console.log('Next: /duaer-do (resume) or /duaer-converge')
|
|
549
|
+
}
|
|
550
|
+
if (policy.mode === 'strict' && active.verdict !== 'accepted') {
|
|
551
|
+
console.log('(policy=strict — do not claim done yet)')
|
|
583
552
|
}
|
|
584
553
|
}
|
|
585
554
|
|
|
@@ -628,6 +597,7 @@ function main() {
|
|
|
628
597
|
cmdCheck(opts)
|
|
629
598
|
break
|
|
630
599
|
case 'job':
|
|
600
|
+
case 'status':
|
|
631
601
|
cmdJob(opts)
|
|
632
602
|
break
|
|
633
603
|
case 'policy':
|
|
@@ -25,13 +25,14 @@ the table for their app.
|
|
|
25
25
|
|
|
26
26
|
| ID | Title | Status |
|
|
27
27
|
|---|---|---|
|
|
28
|
-
| E2E-001 | After `duaer init`, CLI prints
|
|
29
|
-
| E2E-002 | README
|
|
30
|
-
| E2E-003 | `duaer
|
|
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
31
|
| E2E-004 | Default `coach` policy: unfinished job warns but check exits 0 | manual |
|
|
32
|
-
| E2E-005 | After converge stamps `accepted`, `duaer
|
|
32
|
+
| E2E-005 | After converge stamps `accepted`, `duaer status` shows accepted | manual |
|
|
33
33
|
| E2E-006 | `duaer policy . strict` then unfinished job makes check exit 1 | manual |
|
|
34
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 |
|
|
35
36
|
|
|
36
37
|
## Traceability
|
|
37
38
|
|
|
@@ -39,10 +40,11 @@ Keep this matrix current when scenarios or specs change.
|
|
|
39
40
|
|
|
40
41
|
| Scenario | Spec / feature | Notes |
|
|
41
42
|
|---|---|---|
|
|
42
|
-
| E2E-001 | `bin/duaer.mjs` init banner |
|
|
43
|
-
| E2E-002 | `README.md`
|
|
44
|
-
| E2E-003 |
|
|
43
|
+
| E2E-001 | `bin/duaer.mjs` init banner | Simple onboarding |
|
|
44
|
+
| E2E-002 | `README.md` | Everyday path |
|
|
45
|
+
| E2E-003 | `duaer status` | Plain language |
|
|
45
46
|
| E2E-004 | `delivery-policy.json` coach | Not a repo lock |
|
|
46
|
-
| E2E-005 |
|
|
47
|
-
| E2E-006 | policy strict | Optional
|
|
47
|
+
| E2E-005 | converge → `delivery.json` | Accept stamp |
|
|
48
|
+
| E2E-006 | policy strict | Optional |
|
|
48
49
|
| E2E-007 | `--all-jobs` vs active | Scope |
|
|
50
|
+
| E2E-008 | `.cursor/skills/duaer-do` | One-shot skill |
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "duaer-spec",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.4.0",
|
|
4
|
+
"description": "Simple digital-employee delivery: /duaer-do + duaer status",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
7
7
|
"duaer": "bin/duaer.mjs",
|