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 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** and **Claude Code** (both hosts installed by default).
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 | Rules | Skills |
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
- Both are installed by `npx duaer-spec init --here` / `update`.
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/` or `.claude/skills/`) on every product ask — **without**
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** or **Claude Code** as usual — describe what you want.
22
+ Then use **Cursor**, **Claude Code**, or **Codex** — describe what you want.
23
23
 
24
- Install writes both `.cursor/` and `.claude/` (plus `CLAUDE.md`).
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** 或 **Claude Code** 里说话即可。
5
+ 你**不用**操作流程。装一次之后,在 **Cursor**、**Claude Code** 或 **Codex** 里说话即可。
6
6
 
7
- `init` / `update` 会同时写入 `.cursor/` 与 `.claude/`(以及 `CLAUDE.md`)。
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 installCursorMethod(target, opts) {
221
- ensureDir(join(target, '.cursor', 'skills'))
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(target, '.cursor', 'skills', name), opts)
226
+ copyPath(join(skillsRoot, name), join(skillsDir, name), opts)
226
227
  }
227
- console.log(' .cursor/skills/duaer-*')
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
- ensureDir(join(target, '.claude', 'skills'))
240
- const skillsRoot = join(PKG_ROOT, '.cursor', 'skills')
241
- for (const name of readdirSync(skillsRoot)) {
242
- if (!name.startsWith('duaer-')) continue
243
- copyPath(join(skillsRoot, name), join(target, '.claude', 'skills', name), opts)
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.7.0",
4
- "description": "Digital employees for Cursor and Claude Code; main/develop/feat/fix",
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": {