duaer-spec 0.7.0 → 0.8.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/ADOPT.md +2 -1
- package/AGENTS.md +15 -0
- package/CHANGELOG.md +8 -0
- package/CLAUDE.md +4 -3
- package/DUADER.md +2 -1
- package/README.md +2 -2
- package/README.zh-CN.md +2 -2
- package/bin/duaer.mjs +28 -12
- package/docs/agent/e2e-test-plan.md +2 -0
- package/package.json +5 -3
package/ADOPT.md
CHANGED
|
@@ -32,13 +32,14 @@ npx duaer-spec init --here --ops
|
|
|
32
32
|
npx duaer-spec update --method # rare; usually omit
|
|
33
33
|
```
|
|
34
34
|
|
|
35
|
-
Works with **Cursor
|
|
35
|
+
Works with **Cursor**, **Claude Code**, and **Codex** (all hosts installed by default).
|
|
36
36
|
|
|
37
37
|
## What you get
|
|
38
38
|
|
|
39
39
|
- Autonomous job loop (ask → Brief → work → accept)
|
|
40
40
|
- Cursor: `.cursor/rules` + `.cursor/skills`
|
|
41
41
|
- Claude Code: `CLAUDE.md` + `.claude/rules` + `.claude/skills`
|
|
42
|
+
- Codex: `AGENTS.md` + `.agents/skills`
|
|
42
43
|
- `.duaer/handoff.json` + `duaer handoff` after worktree remove
|
|
43
44
|
- Agent ops: `main` / `develop` / `feat` / `fix` + `.worktree/`
|
|
44
45
|
|
package/AGENTS.md
CHANGED
|
@@ -19,6 +19,21 @@ documentation unless the adopting project explicitly overrides.
|
|
|
19
19
|
|
|
20
20
|
Follow the project's [baseline](docs/baseline.md) (or its local equivalent).
|
|
21
21
|
|
|
22
|
+
## Autonomous job loop (all hosts)
|
|
23
|
+
|
|
24
|
+
For product work (new behavior, fixes, refactors), **you** run Brief → work →
|
|
25
|
+
accept. Do **not** ask the human to type slash commands, phase names, or CLI
|
|
26
|
+
flags.
|
|
27
|
+
|
|
28
|
+
1. Isolate: `feat|fix/<name>` + `.worktree/feat-<name>/` (or `fix-…`); never
|
|
29
|
+
reuse the Brief folder name as the worktree id.
|
|
30
|
+
2. Follow the `duaer-do` skill under the host skill root:
|
|
31
|
+
- Codex: `.agents/skills/duaer-do/SKILL.md`
|
|
32
|
+
- Cursor: `.cursor/skills/duaer-do/SKILL.md`
|
|
33
|
+
- Claude Code: `.claude/skills/duaer-do/SKILL.md`
|
|
34
|
+
3. Briefs live in `.duaer/specs/<nnn-slug>/`. Method notes: [`DUADER.md`](DUADER.md).
|
|
35
|
+
4. One handoff line; never claim done unless `delivery.json` is `accepted`.
|
|
36
|
+
|
|
22
37
|
## GitHub Issue Handling
|
|
23
38
|
|
|
24
39
|
When the user provides a GitHub issue URL (or an unambiguous issue number for
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.8.0 — 2026-09-15
|
|
4
|
+
|
|
5
|
+
### Codex host
|
|
6
|
+
|
|
7
|
+
- Mirror `duaer-*` skills to `.agents/skills/` (Codex discovery path)
|
|
8
|
+
- `AGENTS.md` always-on section names the Codex / Cursor / Claude skill roots
|
|
9
|
+
- Cursor and Claude Code installs unchanged
|
|
10
|
+
|
|
3
11
|
## 0.7.0 — 2026-09-15
|
|
4
12
|
|
|
5
13
|
### Claude Code host
|
package/CLAUDE.md
CHANGED
|
@@ -13,12 +13,13 @@ This repository uses **duaer-spec**: coding agents are digital employees.
|
|
|
13
13
|
|
|
14
14
|
## Layout
|
|
15
15
|
|
|
16
|
-
| Host |
|
|
16
|
+
| Host | Always-on | Skills |
|
|
17
17
|
|---|---|---|
|
|
18
|
-
| Claude Code | `.claude/rules/` | `.claude/skills/` |
|
|
19
18
|
| Cursor | `.cursor/rules/` | `.cursor/skills/` |
|
|
19
|
+
| Claude Code | `CLAUDE.md` + `.claude/rules/` | `.claude/skills/` |
|
|
20
|
+
| Codex | `AGENTS.md` | `.agents/skills/` |
|
|
20
21
|
|
|
21
|
-
|
|
22
|
+
Installed by `npx duaer-spec init --here` / `update`.
|
|
22
23
|
|
|
23
24
|
## Branches
|
|
24
25
|
|
package/DUADER.md
CHANGED
|
@@ -14,7 +14,7 @@ runs Brief → work → accept. Humans are not the operators of the phase machin
|
|
|
14
14
|
|
|
15
15
|
## Agent procedure (autonomous)
|
|
16
16
|
|
|
17
|
-
Follow the `duaer-do` skill (`.cursor/skills
|
|
17
|
+
Follow the `duaer-do` skill (`.cursor/skills/`, `.claude/skills/`, or `.agents/skills/`) on every product ask — **without**
|
|
18
18
|
waiting for a slash invocation:
|
|
19
19
|
|
|
20
20
|
1. Assign Brief + `active-job.json`
|
|
@@ -40,6 +40,7 @@ Humans need not configure it for everyday use.
|
|
|
40
40
|
spec.md | tasks.md | delivery.json
|
|
41
41
|
.cursor/rules|skills/ # Cursor host
|
|
42
42
|
.claude/rules|skills/ + CLAUDE.md # Claude Code host
|
|
43
|
+
.agents/skills/ + AGENTS.md # Codex host
|
|
43
44
|
```
|
|
44
45
|
|
|
45
46
|
Worktree and Brief are different layers. Prefer
|
package/README.md
CHANGED
|
@@ -19,9 +19,9 @@ npx duaer-spec init --here
|
|
|
19
19
|
npx duaer-spec update
|
|
20
20
|
```
|
|
21
21
|
|
|
22
|
-
Then use **Cursor
|
|
22
|
+
Then use **Cursor**, **Claude Code**, or **Codex** — describe what you want.
|
|
23
23
|
|
|
24
|
-
Install writes
|
|
24
|
+
Install writes `.cursor/`, `.claude/` (+ `CLAUDE.md`), and `.agents/skills/` (Codex).
|
|
25
25
|
|
|
26
26
|
中文说明:[`README.zh-CN.md`](README.zh-CN.md)
|
|
27
27
|
|
package/README.zh-CN.md
CHANGED
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
**Duaer** 把 AI 编程助手变成**数字员工**:你用自然语言提需求,它自己跑 Spec → 实现 → 验收;只有交接干净才算完成。
|
|
4
4
|
|
|
5
|
-
你**不用**操作流程。装一次之后,在 **Cursor** 或 **
|
|
5
|
+
你**不用**操作流程。装一次之后,在 **Cursor**、**Claude Code** 或 **Codex** 里说话即可。
|
|
6
6
|
|
|
7
|
-
`init` / `update`
|
|
7
|
+
`init` / `update` 会写入 `.cursor/`、`.claude/`(+ `CLAUDE.md`)、以及 Codex 的 `.agents/skills/`。
|
|
8
8
|
|
|
9
9
|
## 安装
|
|
10
10
|
|
package/bin/duaer.mjs
CHANGED
|
@@ -211,20 +211,25 @@ function installMethod(target, opts) {
|
|
|
211
211
|
|
|
212
212
|
installCursorMethod(target, opts)
|
|
213
213
|
installClaudeMethod(target, opts)
|
|
214
|
+
installCodexMethod(target, opts)
|
|
214
215
|
|
|
215
216
|
copyPath(join(PKG_ROOT, 'DUADER.md'), join(target, 'DUADER.md'), opts)
|
|
216
217
|
console.log(' DUADER.md')
|
|
217
218
|
ensureWorktreeGitignore(target)
|
|
218
219
|
}
|
|
219
220
|
|
|
220
|
-
function
|
|
221
|
-
ensureDir(
|
|
221
|
+
function mirrorDuaerSkills(target, skillsDir, opts, label) {
|
|
222
|
+
ensureDir(skillsDir)
|
|
222
223
|
const skillsRoot = join(PKG_ROOT, '.cursor', 'skills')
|
|
223
224
|
for (const name of readdirSync(skillsRoot)) {
|
|
224
225
|
if (!name.startsWith('duaer-')) continue
|
|
225
|
-
copyPath(join(skillsRoot, name), join(
|
|
226
|
+
copyPath(join(skillsRoot, name), join(skillsDir, name), opts)
|
|
226
227
|
}
|
|
227
|
-
console.log(
|
|
228
|
+
console.log(` ${label}`)
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
function installCursorMethod(target, opts) {
|
|
232
|
+
mirrorDuaerSkills(target, join(target, '.cursor', 'skills'), opts, '.cursor/skills/duaer-*')
|
|
228
233
|
|
|
229
234
|
ensureDir(join(target, '.cursor', 'rules'))
|
|
230
235
|
copyPath(
|
|
@@ -236,13 +241,12 @@ function installCursorMethod(target, opts) {
|
|
|
236
241
|
}
|
|
237
242
|
|
|
238
243
|
function installClaudeMethod(target, opts) {
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
console.log(' .claude/skills/duaer-* (mirrored from .cursor/skills)')
|
|
244
|
+
mirrorDuaerSkills(
|
|
245
|
+
target,
|
|
246
|
+
join(target, '.claude', 'skills'),
|
|
247
|
+
opts,
|
|
248
|
+
'.claude/skills/duaer-* (mirrored from .cursor/skills)',
|
|
249
|
+
)
|
|
246
250
|
|
|
247
251
|
ensureDir(join(target, '.claude', 'rules'))
|
|
248
252
|
const claudeRule = join(PKG_ROOT, '.claude', 'rules', 'duaer-spec.md')
|
|
@@ -269,6 +273,17 @@ function installClaudeMethod(target, opts) {
|
|
|
269
273
|
console.log(' CLAUDE.md')
|
|
270
274
|
}
|
|
271
275
|
|
|
276
|
+
function installCodexMethod(target, opts) {
|
|
277
|
+
// Codex discovers repo skills under .agents/skills (not .codex/skills).
|
|
278
|
+
// Always-on guidance is AGENTS.md (installed with ops).
|
|
279
|
+
mirrorDuaerSkills(
|
|
280
|
+
target,
|
|
281
|
+
join(target, '.agents', 'skills'),
|
|
282
|
+
opts,
|
|
283
|
+
'.agents/skills/duaer-* (Codex; mirrored from .cursor/skills)',
|
|
284
|
+
)
|
|
285
|
+
}
|
|
286
|
+
|
|
272
287
|
function cursorRuleToClaude(mdc, skillHost) {
|
|
273
288
|
let body = mdc.replace(/^---\n[\s\S]*?\n---\n+/, (fm) => {
|
|
274
289
|
const desc = (fm.match(/^description:\s*(.+)$/m) || [])[1]
|
|
@@ -413,7 +428,7 @@ function cmdInit(opts) {
|
|
|
413
428
|
console.log(`
|
|
414
429
|
Hired.
|
|
415
430
|
|
|
416
|
-
Talk to the agent in plain language.
|
|
431
|
+
Talk to the agent in plain language (Cursor, Claude Code, or Codex).
|
|
417
432
|
Later update: npx duaer-spec update
|
|
418
433
|
`)
|
|
419
434
|
}
|
|
@@ -551,6 +566,7 @@ function checkWorkplace(target) {
|
|
|
551
566
|
['.cursor/skills/duaer-specify/SKILL.md', 'method'],
|
|
552
567
|
['.claude/rules/duaer-spec.md', 'method'],
|
|
553
568
|
['.claude/skills/duaer-do/SKILL.md', 'method'],
|
|
569
|
+
['.agents/skills/duaer-do/SKILL.md', 'method'],
|
|
554
570
|
['CLAUDE.md', 'method'],
|
|
555
571
|
['AGENTS.md', 'ops'],
|
|
556
572
|
['.cursor/rules/agents-workflow.mdc', 'ops'],
|
|
@@ -39,6 +39,7 @@ the table for their app.
|
|
|
39
39
|
| E2E-012 | `README.zh-CN.md` covers install, update, branch model | manual |
|
|
40
40
|
| E2E-013 | Worktree id ≠ Brief `<nnn-slug>`; path is `.worktree/feat-…/.duaer/specs/…` | manual |
|
|
41
41
|
| E2E-014 | Init installs Cursor + Claude hosts (`CLAUDE.md`, `.claude/skills`) | manual |
|
|
42
|
+
| E2E-015 | Init installs Codex skills under `.agents/skills/` | manual |
|
|
42
43
|
|
|
43
44
|
## Traceability
|
|
44
45
|
|
|
@@ -58,3 +59,4 @@ the table for their app.
|
|
|
58
59
|
| E2E-012 | `README.zh-CN.md` | Chinese 说明文档 |
|
|
59
60
|
| E2E-013 | AGENTS / branching naming | Avoid double `<nnn-slug>` |
|
|
60
61
|
| E2E-014 | Claude + Cursor install | Dual host |
|
|
62
|
+
| E2E-015 | Codex `.agents/skills` | Triple host |
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "duaer-spec",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "Digital employees for Cursor
|
|
3
|
+
"version": "0.8.0",
|
|
4
|
+
"description": "Digital employees for Cursor, Claude Code, and Codex; main/develop/feat/fix",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
7
7
|
"duaer": "bin/duaer.mjs",
|
|
@@ -47,7 +47,9 @@
|
|
|
47
47
|
"ai-engineering",
|
|
48
48
|
"controllable-delivery",
|
|
49
49
|
"claude",
|
|
50
|
-
"claude-code"
|
|
50
|
+
"claude-code",
|
|
51
|
+
"codex",
|
|
52
|
+
"openai-codex"
|
|
51
53
|
],
|
|
52
54
|
"license": "MIT",
|
|
53
55
|
"scripts": {
|