@open-agent-toolkit/cli 0.3.37 → 0.3.39

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.
Files changed (84) hide show
  1. package/README.md +2 -2
  2. package/assets/bundle-metadata.json +1 -1
  3. package/assets/docs/getting-started/bootstrap.md +15 -16
  4. package/assets/docs/getting-started/tool-packs.md +15 -14
  5. package/assets/docs/provider-sync/commands.md +6 -5
  6. package/assets/docs/provider-sync/manifest-and-drift.md +26 -19
  7. package/assets/docs/provider-sync/pilot-with-a-team.md +17 -17
  8. package/assets/docs/provider-sync/providers.md +4 -4
  9. package/assets/docs/provider-sync/scope-and-surface.md +5 -5
  10. package/assets/docs/reference/cli-reference.md +8 -5
  11. package/assets/docs/reference/oat-directory-structure.md +1 -1
  12. package/assets/docs/reference/project-artifacts.md +12 -3
  13. package/assets/docs/reference/troubleshooting.md +4 -5
  14. package/assets/docs/reference/what-oat-writes.md +54 -59
  15. package/assets/docs/skills/repo-improve.md +23 -19
  16. package/assets/docs/workflows/advanced/workflow-gates.md +7 -1
  17. package/assets/docs/workflows/projects/closeout/closeout-skills.md +9 -6
  18. package/assets/docs/workflows/projects/execution/execution-skills.md +1 -2
  19. package/assets/docs/workflows/projects/execution/implementation-execution.md +3 -2
  20. package/assets/docs/workflows/projects/lifecycle.md +3 -1
  21. package/assets/public-package-versions.json +4 -4
  22. package/assets/skills/oat-project-brief/SKILL.md +1 -1
  23. package/assets/skills/oat-project-brief/references/brief-contract.md +32 -9
  24. package/assets/skills/oat-project-complete/SKILL.md +17 -7
  25. package/assets/skills/oat-project-implement/SKILL.md +2 -2
  26. package/assets/skills/oat-project-implement/references/completion-and-closeout.md +14 -4
  27. package/assets/skills/oat-project-pr-final/SKILL.md +2 -2
  28. package/assets/skills/oat-project-pr-progress/SKILL.md +23 -12
  29. package/assets/skills/oat-repo-knowledge-index/SKILL.md +226 -131
  30. package/dist/commands/doctor/index.d.ts.map +1 -1
  31. package/dist/commands/doctor/index.js +5 -2
  32. package/dist/commands/init/index.d.ts.map +1 -1
  33. package/dist/commands/init/index.js +10 -5
  34. package/dist/commands/init/tools/index.d.ts.map +1 -1
  35. package/dist/commands/init/tools/index.js +106 -28
  36. package/dist/commands/init/tools/project-guidance.js +1 -1
  37. package/dist/commands/project/closeout-check/index.d.ts.map +1 -1
  38. package/dist/commands/project/closeout-check/index.js +4 -8
  39. package/dist/commands/project/delivery/check.d.ts.map +1 -1
  40. package/dist/commands/project/delivery/check.js +32 -14
  41. package/dist/commands/project/delivery/evidence.d.ts +39 -0
  42. package/dist/commands/project/delivery/evidence.d.ts.map +1 -1
  43. package/dist/commands/project/delivery/evidence.js +163 -17
  44. package/dist/commands/project/delivery/refresh.d.ts.map +1 -1
  45. package/dist/commands/project/delivery/refresh.js +13 -16
  46. package/dist/commands/project/journal-check/index.d.ts +2 -0
  47. package/dist/commands/project/journal-check/index.d.ts.map +1 -1
  48. package/dist/commands/project/journal-check/index.js +78 -1
  49. package/dist/commands/project/journal-check/types.d.ts +1 -1
  50. package/dist/commands/project/journal-check/types.d.ts.map +1 -1
  51. package/dist/commands/project/new/index.d.ts.map +1 -1
  52. package/dist/commands/project/new/index.js +1 -0
  53. package/dist/commands/project/new/scaffold.d.ts +1 -1
  54. package/dist/commands/project/new/scaffold.d.ts.map +1 -1
  55. package/dist/commands/project/new/scaffold.js +1 -1
  56. package/dist/commands/providers/codex/materialize.d.ts +5 -1
  57. package/dist/commands/providers/codex/materialize.d.ts.map +1 -1
  58. package/dist/commands/providers/codex/materialize.js +6 -1
  59. package/dist/commands/shared/exact-path-commit.d.ts.map +1 -1
  60. package/dist/commands/shared/exact-path-commit.js +11 -1
  61. package/dist/commands/shared/scope-option.d.ts +3 -1
  62. package/dist/commands/shared/scope-option.d.ts.map +1 -1
  63. package/dist/commands/shared/scope-option.js +4 -2
  64. package/dist/commands/status/index.d.ts.map +1 -1
  65. package/dist/commands/status/index.js +4 -1
  66. package/dist/commands/tools/install/index.d.ts.map +1 -1
  67. package/dist/commands/tools/install/index.js +1 -1
  68. package/dist/commands/tools/shared/pack-lifecycle-outcome.d.ts +11 -0
  69. package/dist/commands/tools/shared/pack-lifecycle-outcome.d.ts.map +1 -1
  70. package/dist/commands/tools/shared/pack-lifecycle-outcome.js +16 -0
  71. package/dist/config/oat-config.d.ts +6 -1
  72. package/dist/config/oat-config.d.ts.map +1 -1
  73. package/dist/config/oat-config.js +14 -22
  74. package/dist/index.d.ts +6 -0
  75. package/dist/index.d.ts.map +1 -1
  76. package/dist/index.js +16 -0
  77. package/dist/providers/codex/codec/config-merge.d.ts +19 -0
  78. package/dist/providers/codex/codec/config-merge.d.ts.map +1 -1
  79. package/dist/providers/codex/codec/config-merge.js +75 -8
  80. package/dist/providers/codex/codec/sync-extension.d.ts.map +1 -1
  81. package/dist/providers/codex/codec/sync-extension.js +84 -38
  82. package/dist/providers/cursor/codec/materialize.d.ts.map +1 -1
  83. package/dist/providers/cursor/codec/materialize.js +17 -1
  84. package/package.json +3 -3
@@ -8,7 +8,8 @@ description: 'Every file, link and Git ref that OAT commands create in your repo
8
8
  This page lists what each OAT command writes in your repository, under your
9
9
  home directory and on your shared `origin` remote, which of those files belong
10
10
  in Git, and how to back out of OAT completely. Everything here was observed by
11
- running OAT CLI version 0.3.14 on macOS. The removal procedure in
11
+ running OAT CLI version 0.3.14 on macOS, except statements marked with a later
12
+ version, which describe what changed in that version. The removal procedure in
12
13
  [Remove everything](#remove-everything) was run end to end twice, once
13
14
  originally and once in an independent re-run, and both times it returned the
14
15
  repository and the home directory to their pre-OAT state.
@@ -23,11 +24,11 @@ agents, templates and scripts that `oat tools install` adds.
23
24
 
24
25
  ## The short version
25
26
 
26
- - With `--scope project`, `oat init`, `oat sync` and `oat tools install <pack>`
27
- write only inside the repository. Two forms are exceptions:
28
- `oat tools install --scope project` without a pack name also installs the
29
- `core` pack under your home directory, and `oat init --scope project --setup`
30
- installs every pack there.
27
+ - With `--scope project`, `oat init`, `oat sync` and `oat tools install`
28
+ write only inside the repository. `oat tools install --scope project`
29
+ without a pack name and `oat init --scope project --setup` skip the
30
+ user-only `core` pack and say so, and `oat tools install core --scope project`
31
+ exits 1 (0.3.39 and later).
31
32
  - Without `--scope`, `oat init` and `oat sync` use scope `all`, so they can
32
33
  also write under your home directory, and `oat tools install <pack>` installs
33
34
  a pack that is not yet installed under your home directory (user scope).
@@ -47,11 +48,12 @@ agents, templates and scripts that `oat tools install` adds.
47
48
  Where a file already existed, OAT appended its own marked block instead of
48
49
  replacing it. This held for `.gitignore`, `.gitattributes` and an existing
49
50
  `pre-commit` hook. From version 0.3.37, an existing `.codex/config.toml` is
50
- edited in place: OAT changes only `multi_agent`, `max_depth` and its own
51
- `[agents.<name>]` tables, and comments, blank lines, table order and your other
52
- settings stay as they were (see the
51
+ edited in place: OAT changes only its own `[agents.<name>]` tables and adds
52
+ `multi_agent` and `max_depth` when they are missing, and comments, blank lines,
53
+ table order and your other settings stay as they were (see the
53
54
  [provider table](#syncing-provider-views)). Earlier versions rewrote the whole
54
- file and dropped its comments. A pre-existing
55
+ file and dropped its comments, and versions before 0.3.39 also changed a
56
+ `multi_agent` or `max_depth` value you had set. A pre-existing
55
57
  `~/.claude/settings.json` was left untouched.
56
58
 
57
59
  ### Setting up
@@ -85,13 +87,13 @@ views OAT manages. A provider does not have to be enabled: an existing
85
87
  `.claude/` directory in the repository, or `~/.claude/` in your home directory,
86
88
  is enough for `oat sync` to create Claude views.
87
89
 
88
- | Provider | Repository views created by `oat sync --scope project` |
89
- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
90
- | Claude | `.claude/skills/<name>` and `.claude/agents/<name>.md`, relative symlinks into `.agents/` |
91
- | Cursor | `.cursor/agents/`: relative symlinks for agents, plus generated model-variant files marked `# oat-managed: true` |
92
- | Copilot | `.github/agents/`, relative symlinks |
93
- | Codex | `.codex/agents/*.toml` and `.codex/config.toml`, generated files. In an existing `config.toml`, OAT adds its `[agents.<name>]` tables and sets `[features] multi_agent = true` and `[agents] max_depth` to at least 2, changing those two values if you had set them lower; your other settings and comments stay byte for byte (0.3.37 and later). |
94
- | Gemini | Nothing |
90
+ | Provider | Repository views created by `oat sync --scope project` |
91
+ | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
92
+ | Claude | `.claude/skills/<name>` and `.claude/agents/<name>.md`, relative symlinks into `.agents/` |
93
+ | Cursor | `.cursor/agents/`: relative symlinks for agents, plus generated model-variant files marked `# oat-managed: true` |
94
+ | Copilot | `.github/agents/`, relative symlinks |
95
+ | Codex | `.codex/agents/*.toml` and `.codex/config.toml`, generated files. In an existing `config.toml`, OAT adds its `[agents.<name>]` tables; your other settings and comments stay byte for byte (0.3.37 and later). It adds `[features] multi_agent = true` and `[agents] max_depth` only when they are missing and names each key it added; a value you set is kept, and sync reports a conflict when OAT needs a different one (0.3.39 and later). |
96
+ | Gemini | Nothing |
95
97
 
96
98
  OAT creates skill views only for Claude. It reports the other providers' skill
97
99
  support as `native-read` and creates no skill views for them. No generated
@@ -107,7 +109,7 @@ file contained an absolute path.
107
109
  | Command | In the repository | Under your home directory |
108
110
  | ------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
109
111
  | `oat tools install <pack> --scope project` | The pack's skills in `.agents/skills/`, plus any agents in `.agents/agents/`, templates in `.oat/templates/` and scripts in `.oat/scripts/` it ships; `tools.<pack>: true` in `.oat/config.json`. Views for enabled providers, unless you pass `--no-sync`. | Nothing |
110
- | `oat tools install --scope user` | Nothing, unless the workflows pack is already installed at project scope (see [surprises](#known-surprises-in-0314)) | `~/.agents/skills/`, `~/.agents/agents/`, `~/.oat/config.json`, `~/.oat/docs/`, `~/.oat/ideas/`, `~/.oat/scripts/`, `~/.oat/templates/`. Provider links only if a provider is detected. |
112
+ | `oat tools install --scope user` | Nothing, even when a pack is already installed at project scope (0.3.39 and later) | `~/.agents/skills/`, `~/.agents/agents/`, `~/.oat/config.json`, `~/.oat/docs/`, `~/.oat/ideas/`, `~/.oat/scripts/`, `~/.oat/templates/`. Provider links only if a provider is detected. |
111
113
  | `oat tools install core` | Nothing | `~/.oat/config.json`, `~/.agents/skills/oat-docs`, `~/.agents/skills/oat-doctor`, and `~/.oat/docs/` (a bundled copy of these docs) |
112
114
 
113
115
  Some packs write more at project scope. The ideas pack adds
@@ -116,9 +118,10 @@ Some packs write more at project scope. The ideas pack adds
116
118
  `.oat/projects/archived/.gitkeep` and a `projects.root` setting. Passing
117
119
  `--project-guidance` adds a marked `<!-- OAT tools -->` block to `AGENTS.md`,
118
120
  creating the file if needed. Installing every pack at once with
119
- `oat tools install --scope project` puts core in your home directory and the
120
- other seven packs in the repository, and also adds a `localPaths` setting and a
121
- `# OAT local paths` block to `.gitignore`.
121
+ `oat tools install --scope project` puts the other seven packs in the
122
+ repository, skips core with a message that it is user-scope only (0.3.39 and
123
+ later; earlier versions installed core in your home directory), and also adds a
124
+ `localPaths` setting and a `# OAT local paths` block to `.gitignore`.
122
125
 
123
126
  No tool pack command wrote to `origin`.
124
127
 
@@ -198,14 +201,16 @@ is anything that differs between machines.
198
201
  - **Generated provider files** (Cursor model variants, Codex agents and
199
202
  `config.toml` tables). Committed, they arrive with every clone. Not
200
203
  committed, each teammate runs `oat sync --scope project` to generate them.
201
- Either way, `oat tools remove` does not delete them; see
202
- [Backing out](#backing-out).
204
+ Either way, `oat tools remove` deletes the removed agents' Codex roles and
205
+ tables (0.3.39 and later) but leaves Cursor model variants until the next
206
+ `oat sync --scope project`; see [Backing out](#backing-out).
203
207
  - **Pack files in `.oat/`** (templates, scripts, ideas, `projects-root`).
204
208
  Committed, every clone has them. Not committed, each teammate needs the same
205
209
  `oat tools install` to get them.
206
- - **`AGENTS.md` guidance block.** It tells agents how to refresh views, but the
207
- command it recommends, `oat sync --scope all`, also writes under each
208
- reader's home directory.
210
+ - **`AGENTS.md` guidance block.** It tells agents how to refresh views with
211
+ `oat sync --scope project`, which writes only inside the repository (0.3.39
212
+ and later; earlier blocks recommend `oat sync --scope all`, which also writes
213
+ under each reader's home directory).
209
214
  - **A hook inside the working tree.** Committed, everyone using that hooks path
210
215
  gets the drift warning. A hook in `.git/hooks` is never committed.
211
216
  - **`pr/` and `reviews/archived/` folders.** Whether PR material and archived
@@ -231,9 +236,8 @@ is anything that differs between machines.
231
236
  4. **Install personal packs separately.** User-scope packs live under each
232
237
  person's `~/.agents` and `~/.oat`, so nobody receives them from the
233
238
  repository. A teammate who wants them runs `oat tools install --scope user`,
234
- which installs all eight packs. Run inside a repository where the workflows
235
- pack is installed at project scope, it also edits that repository; see
236
- [surprises](#known-surprises-in-0314).
239
+ which installs all eight packs and writes nothing into the repository
240
+ (0.3.39 and later).
237
241
  5. **Fetch synced projects explicitly.** A fresh clone does not receive
238
242
  `refs/oat/*`, so synced projects are not in it. See
239
243
  [Picking Up Projects](../workflows/projects/execution/picking-up-projects.md)
@@ -256,14 +260,14 @@ The hook does nothing when no `oat` binary is on `PATH`, and
256
260
 
257
261
  ### Supported removal commands
258
262
 
259
- | Command | Removes | Leaves behind |
260
- | --------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
261
- | `oat tools remove --pack <pack> --scope project` (one pack at a time) | The pack's skills and agents in `.agents/`, their symlink views (Claude, Copilot, Cursor symlinks), and its `.oat/scripts/*.sh` | `.oat/templates/`, `.oat/ideas/`, `.oat/projects-root`, `.oat/config.json` (with a stale `tools.requiredBy` entry), `.oat/sync/`, both `.gitignore` blocks, `.gitattributes`, projects, empty folders, and all generated Cursor and Codex files |
262
- | `oat tools remove --all` | Nothing: exits 2 with `Pack core does not allow project scope`, with or without `--scope project` | Everything |
263
- | `oat tools remove --all --scope user` | With only core installed at user scope: `~/.agents/skills/oat-docs`, `~/.agents/skills/oat-doctor`, `~/.oat/docs/` and their `~/.claude/skills/` links | `~/.oat/config.json` (now `{"version": 1}`), `~/.oat/sync/manifest.json`, an empty `~/.agents/skills/` and an empty `~/.claude/skills/` |
264
- | `oat remove skill <name> --scope project` | The canonical skill, its Claude view and its manifest entry | Nothing for that skill |
265
- | `oat project prune <name>` (synced projects only) | The worktree, the pointer file, the local ref and the ref on `origin`; commits `chore(oat): prune synced project <name>` on the current branch | An empty `.oat/projects/synced/` |
266
- | `oat init --scope project --no-hook` | OAT's hook block. If the file holds only OAT's block, the whole `pre-commit` file is deleted. | Your own hook lines, byte for byte |
263
+ | Command | Removes | Leaves behind |
264
+ | --------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
265
+ | `oat tools remove --pack <pack> --scope project` (one pack at a time) | The pack's skills and agents in `.agents/`, their symlink views (Claude, Copilot, Cursor symlinks), its `.oat/scripts/*.sh`, and from 0.3.39 its agents' generated Codex roles and `[agents.*]` tables | `.oat/templates/`, `.oat/ideas/`, `.oat/projects-root`, `.oat/config.json` (with a stale `tools.requiredBy` entry), `.oat/sync/`, both `.gitignore` blocks, `.gitattributes`, projects, empty folders, and generated Cursor model variants until the next `oat sync --scope project` |
266
+ | `oat tools remove --all` | Nothing: exits 2 with `Pack core does not allow project scope`, with or without `--scope project` | Everything |
267
+ | `oat tools remove --all --scope user` | With only core installed at user scope: `~/.agents/skills/oat-docs`, `~/.agents/skills/oat-doctor`, `~/.oat/docs/` and their `~/.claude/skills/` links | `~/.oat/config.json` (now `{"version": 1}`), `~/.oat/sync/manifest.json`, an empty `~/.agents/skills/` and an empty `~/.claude/skills/` |
268
+ | `oat remove skill <name> --scope project` | The canonical skill, its Claude view and its manifest entry | Nothing for that skill |
269
+ | `oat project prune <name>` (synced projects only) | The worktree, the pointer file, the local ref and the ref on `origin`; commits `chore(oat): prune synced project <name>` on the current branch | An empty `.oat/projects/synced/` |
270
+ | `oat init --scope project --no-hook` | OAT's hook block. If the file holds only OAT's block, the whole `pre-commit` file is deleted. | Your own hook lines, byte for byte |
267
271
 
268
272
  No command deletes a shared or local project. `oat project prune` refuses a
269
273
  shared project, and `oat project archive` moves a project to
@@ -340,36 +344,28 @@ prune to erase sensitive content. Rewriting history is not covered here.
340
344
 
341
345
  ## Known surprises in 0.3.14
342
346
 
343
- These are current behaviors as of version 0.3.14.
344
-
345
- - `oat tools install core --scope project` prints `Installed core tool pack.`
346
- but writes nothing.
347
- - `oat init --scope project --setup` installs all eight packs under your home
348
- directory, and runs `gh repo view`, which makes the `gh` CLI write
349
- `~/.local/state/gh/device-id`.
350
- - `oat tools install --scope user` writes into the current repository when the
351
- workflows pack is already installed there at project scope: it adds
352
- `localPaths` to `.oat/config.json` and a `# OAT local paths` block to
353
- `.gitignore`.
354
- - `oat tools install workflows --scope project` does not add that block, but
347
+ These behaviors were observed in version 0.3.14. Entries that later versions
348
+ fixed have been removed: from 0.3.39, `core` under `--scope project` is refused
349
+ or skipped, an explicit `--scope` writes only that scope, `init --setup` honors
350
+ `--scope` and does not run `gh`, the guidance block recommends
351
+ `oat sync --scope project`, local-scope `oat project new` reports why it made no
352
+ commit, and piping output into `head` exits quietly.
353
+
354
+ - `oat tools install workflows --scope project` does not add the
355
+ `# OAT local paths` block to `.gitignore`, but
355
356
  `oat tools install --scope project` does, so `pr/` and `reviews/archived/`
356
357
  folders are committable in one setup and ignored in the other.
357
358
  - `oat tools remove --all` fails unless you add `--scope user`.
358
359
  - After removing packs, a stale `tools.requiredBy` entry stays in
359
360
  `.oat/config.json`, and `oat status` reports the utility pack as missing and
360
361
  suggests `oat tools update`.
361
- - Removing a pack leaves its generated Cursor and Codex files, and a later
362
- `oat sync` reports no changes.
362
+ - Removing a pack leaves its generated Cursor model variants until the next
363
+ `oat sync --scope project` removes them. Its agents' generated Codex roles
364
+ and `config.toml` tables are removed with the pack (0.3.39 and later).
363
365
  - An existing `.claude/` folder, in the repository or your home directory, is
364
366
  enough for `oat sync` to create Claude views without enabling Claude.
365
367
  - After `oat tools install <pack> --no-sync`, running the same install again
366
368
  reports `unchanged` and creates no views; run `oat sync --scope project`.
367
- - The `AGENTS.md` block from `--project-guidance` recommends
368
- `oat sync --scope all`, which also writes under your home directory.
369
- - `oat project new --scope local` prints `Scaffold commit: skipped (--no-commit)`
370
- even when you did not pass that flag.
371
- - Piping `oat tools list` or `oat status` into `head` crashes with an
372
- `Error: write EPIPE` stack trace.
373
369
 
374
370
  ## Not covered here
375
371
 
@@ -399,8 +395,7 @@ These are current behaviors as of version 0.3.14.
399
395
  [Config and Local State](config-and-local-state.md).
400
396
  - **Files you place at a view path yourself.** See
401
397
  [Manifest and Drift](../provider-sync/manifest-and-drift.md).
402
- - **`gh repo view` against a real GitHub remote**, and Git versions older than
403
- 2.31.
398
+ - **Git versions older than 2.31.**
404
399
 
405
400
  ## Related
406
401
 
@@ -209,15 +209,22 @@ explicitly save a report before asking another workflow to consume its path.
209
209
  so use the slash or `$` form rather than relying on the agent to pick it. It
210
210
  does not require a project name or an active-project pointer.
211
211
 
212
- **Prerequisites:** A Git repository, the OAT CLI, and the ability to dispatch
213
- the `oat-codebase-mapper` subagent. A preflight checks whether background
214
- agents can write files and switches to a read-only fallback if they cannot.
215
- Needs an active OAT project: no. If a knowledge directory already exists,
216
- choose whether to refresh it or skip the run. Refresh removes only regular
217
- Markdown files marked `oat_generated: true` and regenerates the eight named
218
- outputs. Hand-written notes survive; an unmarked expected-output collision
219
- stops the run before deletion so you can decide how to preserve it. Symlinked
220
- knowledge directories and output collisions are refused.
212
+ **Prerequisites:** A Git repository, the OAT CLI, the utility-pack dispatch
213
+ skills, and an installed `oat-codebase-mapper` provider projection. Before
214
+ changing knowledge on either a first generation or a refresh, the skill
215
+ resolves `oat-dispatch-subagents` and `subagent-orchestration`, then checks that
216
+ the active Claude, Codex, or Cursor provider can launch its mapper projection.
217
+ A missing dispatch skill reports the utility-pack install/update commands; a
218
+ missing mapper projection reports the workflows-pack commands or `oat sync`.
219
+ An unsupported host or declined authorization reports that limitation without
220
+ irrelevant install advice. Every failure stops before cleanup, thin-index
221
+ creation, or a write probe. Needs an active OAT project: no. If a knowledge
222
+ directory already exists, choose whether to refresh it or skip the run.
223
+ Refresh removes only regular Markdown files marked `oat_generated: true` and
224
+ regenerates the eight named outputs. Hand-written notes survive; an unmarked
225
+ expected-output collision stops the run before deletion so you can decide how
226
+ to preserve it. Symlinked knowledge directories and output collisions are
227
+ refused.
221
228
 
222
229
  **Example scenario:** A new teammate needs to understand which packages own
223
230
  the CLI, how shared configuration reaches applications, and which test
@@ -232,16 +239,13 @@ index is an onboarding and retrieval aid, not a declaration that all
232
239
  architecture concerns have been fixed or that every future question is
233
240
  answered.
234
241
 
235
- **What it does without asking:** The only question is refresh-or-skip when
236
- knowledge files already exist. Otherwise it creates `.oat/repo/knowledge/`,
237
- starts a test subagent and then four `oat-codebase-mapper` subagents in the
238
- background, and writes the knowledge files. It then runs
239
- `oat internal commit-paths` on your current branch with the exact generated
240
- output/deletion paths and enabled hooks. Unrelated staged and unstaged work
241
- remains intact.
242
- Afterwards it records the run in `.oat/tracking.json` and regenerates the
243
- `.oat/state.md` dashboard with `oat state refresh`; those two files are not
244
- part of the commit. It does not push.
242
+ **What it does without asking:** The run resolves a usable mapper route before
243
+ changing knowledge and may ask once for authorization covering the write probe
244
+ and four mapper lanes. It offers read-only fallback only after a launched probe
245
+ verifies that writes are blocked. It preserves manual notes while preparing and
246
+ generating the eight owned outputs. It commits only the exact owned paths with
247
+ hooks enabled, leaving unrelated staged and unstaged work intact, then updates
248
+ the tracking dashboard without pushing.
245
249
 
246
250
  **Expected output:** Eight files under `.oat/repo/knowledge/`:
247
251
  `project-index.md`, `stack.md`, `architecture.md`, `structure.md`,
@@ -299,7 +299,13 @@ milestone's `plan` carrier, `oat_milestone_gates[mNN].plan`, written with
299
299
  for a re-alignment amendment it is the only approval evidence. The implement
300
300
  exit gate at milestone closeout writes `oat_milestone_gates[mNN].exit` (never
301
301
  `oat_implement_exit_gate`, which goal uses only at terminal closeout). It runs
302
- before the milestone's integrated review and runs again after queued fixes.
302
+ the configured command verbatim with `--review-scope final`, before the
303
+ milestone's integrated review, and runs again after queued fixes. Its own
304
+ Type `code`, Invocation `gate` Reviews row and artifact count as bookkeeping
305
+ only when the row's non-placeholder Reviewed Head equals the carrier's
306
+ `reviewed_head` and the artifact's project-relative path is under `reviews/`
307
+ (including `reviews/archived/`). That row never serves as the integrated review
308
+ or unlocks delivery fields, and no placeholder row is required before the gate runs.
303
309
  `oat project delivery check` reports the exit carrier's freshness, and
304
310
  `oat project delivery refresh` marks it stale when delivery evidence no longer
305
311
  holds.
@@ -143,7 +143,9 @@ deliveries exist and registers only when
143
143
  `oat project delivery check --subject <mNN|dNN>` reports `status: ok`. It
144
144
  commits a `registering` registry entry before creating anything, then creates
145
145
  the PR, or on resume attaches the single PR that `gh pr list` finds for the
146
- head branch (more than one match stops at `oat-project-reconcile`). It then
146
+ head branch (more than one match stops at `oat-project-reconcile`). For a
147
+ stacked milestone, registration instead records `kind: stack` and attaches its
148
+ existing layer pull requests base to tip; it never creates a stack. It then
147
149
  records the member, `status: open`, and `oat_milestone_status: delivered`, and
148
150
  appends one structural project-log entry. Stale review or exit-gate evidence
149
151
  stops before registration: for the active milestone the skill writes
@@ -190,10 +192,10 @@ generates or refreshes a missing or stale `summary.md` through
190
192
  decision-record promotion also happen. It then writes the PR description,
191
193
  pushes the current branch with `git push -u origin`, and runs
192
194
  `gh pr create`. For a synced project, it also publishes the project artifacts
193
- with `oat project push` before and after creating the PR. Besides the PR title
194
- and base branch when you did not pass them, the only question it asks is
195
- whether to continue when the latest final review has not passed. It never
196
- merges the PR.
195
+ with `oat project push` before and after creating the PR. When you do not pass
196
+ a PR title or base branch, it fills them from the defaults without asking. The
197
+ only question it asks is whether to continue when the latest final review has
198
+ not passed. It never merges the PR.
197
199
 
198
200
  **Goal projects:** in a goal project this skill is the terminal delivery
199
201
  registration owner, not a second project PR. It runs its own registration step
@@ -582,7 +584,8 @@ writes a PR description file, clears the active
582
584
  project (or keeps it until an archive succeeds), commits the completion
583
585
  bookkeeping, and pushes it. A yes to the PR question, or
584
586
  `workflow.createPrOnComplete: true` when no PR is tracked, creates a new PR
585
- against `main`. If a PR is already open, the skill updates its description
587
+ against the base branch resolved from `git.defaultBranch` (default `main`), the
588
+ same way `oat-project-pr-final` resolves it. If a PR is already open, the skill updates its description
586
589
  with `gh pr edit` when archiving or for a synced project. Archives keep no
587
590
  `pr/` directory, so when archiving the skill carries the regenerated PR body in
588
591
  a temporary file until the PR is created or updated; a run that resumes an
@@ -76,8 +76,7 @@ is ready.
76
76
 
77
77
  The number of fix attempts after a failed review comes from
78
78
  `oat_orchestration_retry_limit` in the project's `state.md` (default 2, range
79
- 0–5). The skill's argument hint also lists `--retry-limit`, but no step reads
80
- that flag, so passing it changes nothing.
79
+ 0–5).
81
80
 
82
81
  **Prerequisites:** Select an existing project with an approved, complete
83
82
  `plan.md` whose readiness points to `oat-project-implement`. The lifecycle
@@ -569,8 +569,9 @@ worktree registrations before materializing or updating the current checkout.
569
569
 
570
570
  Default execution needs the root-to-phase-agent depth. `agents.max_depth >= 2`
571
571
  is useful capability for optional phase-agent nesting, but it is not a default
572
- topology preflight requirement. OAT may still materialize a higher depth floor
573
- so recon or specialist fanout is available when justified.
572
+ topology preflight requirement. When `agents.max_depth` is absent, sync adds
573
+ `2` so recon or specialist fanout is available when justified; an explicit
574
+ value is kept.
574
575
 
575
576
  ## Accepted Launches
576
577
 
@@ -612,7 +612,9 @@ from a first–last range. `oat-project-pr-progress` registers a delivery only
612
612
  when `oat project delivery check --subject <mNN|dNN>` reports `status: ok`,
613
613
  writing the `oat_deliveries` entry (`registering`) before it creates the pull
614
614
  request so an interrupted run resumes by `gh pr list` instead of opening a
615
- duplicate.
615
+ duplicate. For a stacked milestone, registration instead records `kind: stack`
616
+ and attaches its existing layer pull requests base to tip; it never creates a
617
+ stack.
616
618
 
617
619
  **Freshness.** Evidence keeps the revision actually reviewed. Commits after it
618
620
  count as bookkeeping only when they touch the project's tracking files in
@@ -1,6 +1,6 @@
1
1
  {
2
- "cli": "0.3.37",
3
- "docs-config": "0.3.37",
4
- "docs-theme": "0.3.37",
5
- "docs-transforms": "0.3.37"
2
+ "cli": "0.3.39",
3
+ "docs-config": "0.3.39",
4
+ "docs-theme": "0.3.39",
5
+ "docs-transforms": "0.3.39"
6
6
  }
@@ -7,7 +7,7 @@ disable-model-invocation: true
7
7
  user-invocable: true
8
8
  allowed-tools: Read, Write, Bash, Glob, Grep, AskUserQuestion, Task
9
9
  metadata:
10
- version: 1.0.3
10
+ version: 1.0.4
11
11
  ---
12
12
 
13
13
  # Brief Project
@@ -531,7 +531,8 @@ root commits shared routing, registry, gate and acceptance records.
531
531
 
532
532
  `oat_deliveries` entries carry `delivery_id` (`dNN`, unique), `milestone`, a
533
533
  `scope` frozen on registration, the agreed `endpoint` (`open | merged`),
534
- `kind: pr`, `status` (`registering | open | at_endpoint | superseded`), the
534
+ `kind: pr | stack`, `status`
535
+ (`registering | open | at_endpoint | superseded`), the
535
536
  supersession links `superseded_by` and `covers_scope_of`, an additive
536
537
  `corrects_delivery_id`, persisted `lookup` keys (`repository`, `head_branch`,
537
538
  `head_sha_at_registration`), `members` (`url`, `base`, `reviewed_head`,
@@ -540,12 +541,26 @@ supersession links `superseded_by` and `covers_scope_of`, an additive
540
541
  binding `exit_gate`, and the first observed `endpoint_attainment`.
541
542
 
542
543
  - **Idempotent registration.** The registration owner writes the entry with
543
- `status: registering` and its `lookup` keys and commits before creating the
544
- pull request, then records the URL and `status: open`. A `registering` entry
545
- on resume runs `gh pr list --repo <repository> --head <head_branch> --state
546
- all --json url,headRefOid`: exactly one match is attached without creating a
547
- duplicate; zero matches create once; more than one stops and routes to
548
- `oat-project-reconcile`.
544
+ `status: registering` and its `lookup` keys. For `kind: pr`, it commits
545
+ before creating the pull request, then records the URL and `status: open`; on
546
+ resume, `gh pr list --repo <repository> --head <head_branch> --state all
547
+ --json url,headRefOid` attaches exactly one match, creates once for zero
548
+ matches, and stops for more than one. For `kind: stack`, registration is
549
+ attach-only: the `registering` write records every existing member URL in
550
+ base-to-tip order, and resume re-checks each URL rather than creating a
551
+ stack. For a PR lookup, more than one stops and routes to
552
+ `oat-project-reconcile`; a missing, closed-unmerged or re-targeted stack
553
+ layer follows the same stop-and-route.
554
+ - **Stacked deliveries.** A stack records members base to tip. For a configured
555
+ code carrier bound to a reviewed head, the exit carrier is judged against
556
+ the tip member's observed head, and every lower member's observed head must
557
+ be an ancestor of the tip (`stack-order` otherwise). Null carriers and
558
+ unreviewed-resolution carriers (`no_gate`, `project_disabled`) are evaluated
559
+ exactly as for `kind: pr`; the integrated review remains per member.
560
+ Post-review bookkeeping lands on the tip member's branch, because a commit
561
+ on a lower layer changes upper members' bases and stales their review. A stack
562
+ that fails the configured-carrier order check is never repaired in place:
563
+ replace it through supersession with `covers_scope_of`.
549
564
  - **Prerequisites.** Before registration the owner runs
550
565
  `oat project delivery refresh --project <path>` and
551
566
  `oat project delivery check --project <path> --subject <mNN|dNN> --json`; it
@@ -562,7 +577,8 @@ all --json url,headRefOid`: exactly one match is attached without creating a
562
577
  share their member pull request (`gh` allows one open pull request per head
563
578
  and base), so one member URL may appear in several deliveries. Coverage
564
579
  judges each delivery's own frozen scope and bound evidence, never the shared
565
- member alone; `oat_pr_url` and `oat_pr_status` project the latest member.
580
+ member alone; `oat_pr_url` and `oat_pr_status` project the latest member,
581
+ which is the tip member for a stack.
566
582
  - **Evidence capture.** The exit-gate result accepted for the delivery is
567
583
  persisted as its `exit_gate` with the delivery evidence; overwriting the
568
584
  milestone's working carrier for a correction never relabels another
@@ -600,7 +616,14 @@ changes only permitted bookkeeping:
600
616
  the evidence being recorded or archived, and, for a delivery whose member
601
617
  pull request is shared (12.7, Shared members), the review artifacts recorded
602
618
  for the deliveries that share it; each delivery is still judged on its own
603
- frozen scope, reviewed revisions and `exit_gate`. `summary.md` is derived
619
+ frozen scope, reviewed revisions and `exit_gate`. The artifact of a Reviews
620
+ row with Type `code`, Invocation `gate`, and a non-placeholder Reviewed Head
621
+ equal to the judged carrier's `reviewed_head` is also admitted in evidence
622
+ scopes built for that carrier (its review and exit evaluations), provided
623
+ its project-relative artifact path is under `reviews/` (including
624
+ `reviews/archived/`). The gate row is never integrated-review evidence and
625
+ its artifact never joins a delivery's own review-artifact set, so it cannot
626
+ unlock set-once fields. `summary.md` is derived
604
627
  institutional memory, never the authority for outcomes, approach,
605
628
  constraints, decisions or endpoint, which live in the brief; any change to
606
629
  it is bookkeeping. Path membership alone is insufficient for the other
@@ -5,7 +5,7 @@ disable-model-invocation: true
5
5
  user-invocable: true
6
6
  allowed-tools: Read, Write, Bash, AskUserQuestion
7
7
  metadata:
8
- version: 1.7.18
8
+ version: 1.7.19
9
9
  ---
10
10
 
11
11
  # Complete Project
@@ -1139,11 +1139,17 @@ carries the same Steps 0.5 through 4 contract:
1139
1139
  1. **Archive residual review artifacts** — already handled in Step 4.
1140
1140
  2. **Validate required artifacts** — read available project artifacts (`plan.md`, `implementation.md`, `spec.md`, `design.md`, `discovery.md`) based on workflow mode from `state.md`.
1141
1141
  3. **Check final review status** — already checked in Step 3.1. Use the result, don't re-check.
1142
- 4. **Collect project summary** — if `summary.md` exists (from Step 3.5), use it as the primary source for the PR description's Summary section (per `oat-project-pr-final` Step 3.0). Read remaining artifacts and collect git context:
1142
+ 4. **Collect project summary** — if `summary.md` exists (from Step 3.5), use it as the primary source for the PR description's Summary section (per `oat-project-pr-final` Step 3.0). Read remaining artifacts and collect git context. Resolve `BASE_BRANCH` here with the same chain the final PR skill uses (this skill takes no base argument); Step 11 reuses it:
1143
1143
 
1144
1144
  ```bash
1145
1145
  BRANCH=$(git rev-parse --abbrev-ref HEAD)
1146
- MERGE_BASE=$(git merge-base origin/main HEAD 2>/dev/null || git merge-base main HEAD 2>/dev/null || echo "")
1146
+ # Resolution chain: OAT config > git remote > fallback
1147
+ BASE_BRANCH=$(oat config get git.defaultBranch 2>/dev/null || true)
1148
+ if [ -z "$BASE_BRANCH" ]; then
1149
+ BASE_BRANCH=$(git rev-parse --abbrev-ref origin/HEAD 2>/dev/null | sed 's|origin/||' || true)
1150
+ fi
1151
+ BASE_BRANCH="${BASE_BRANCH:-main}"
1152
+ MERGE_BASE=$(git merge-base "origin/$BASE_BRANCH" HEAD 2>/dev/null || git merge-base "$BASE_BRANCH" HEAD 2>/dev/null || echo "")
1147
1153
 
1148
1154
  if [[ -n "$MERGE_BASE" ]]; then
1149
1155
  git log --oneline "${MERGE_BASE}..HEAD"
@@ -1628,17 +1634,21 @@ Steps:
1628
1634
  description artifact at `PR_DESCRIPTION_PATH`.
1629
1635
  2. For the non-archive artifact, write the stripped body to a temporary file (remove all lines from the opening `---` through the closing `---`, inclusive).
1630
1636
  3. Verify the temp file does not start with YAML frontmatter keys.
1631
- 4. Create the PR from the branch already pushed in Step 10:
1637
+ 4. Reuse the `BASE_BRANCH` resolved in Step 7 item 4. A Step 3.65 resume
1638
+ route that skipped Step 7 has not set it: run that step's resolution block
1639
+ first. Never create the PR with an empty base.
1640
+ 5. Create the PR from the branch already pushed in Step 10:
1632
1641
 
1633
1642
  ```bash
1634
- gh pr create --base main --title "{title}" --body-file "$TMP_BODY"
1643
+ : "${BASE_BRANCH:?BASE_BRANCH is unset; run the Step 7 base-branch resolution first}"
1644
+ gh pr create --base "$BASE_BRANCH" --title "{title}" --body-file "$TMP_BODY"
1635
1645
  ```
1636
1646
 
1637
- 5. Clean up the temp file, including `PR_BODY_FILE`, once the PR is created.
1647
+ 6. Clean up the temp file, including `PR_BODY_FILE`, once the PR is created.
1638
1648
  When `gh` is missing or `gh pr create` fails, keep it and report its path
1639
1649
  in Step 12.
1640
1650
 
1641
- Do not assume `gh` is installed; if missing, instruct manual PR creation using the file contents.
1651
+ Do not assume `gh` is installed; if missing, instruct manual PR creation using the file contents and note the resolved base branch (`BASE_BRANCH`).
1642
1652
 
1643
1653
  ### Step 11.5: Sync Open-PR Description on GitHub (Conditional)
1644
1654
 
@@ -2,12 +2,12 @@
2
2
  name: oat-project-implement
3
3
  description: Use when the user explicitly asks to implement an approved OAT plan — e.g. "implement the plan", "start implementation", or accepts a previously offered implementation step. Do NOT auto-invoke just because plan.md is ready. Dispatches one phase implementer per phase, owns independent phase review and bounded fix routing, and supports plan-declared worktree-isolated parallel phases.
4
4
  oat_gateable: true
5
- argument-hint: '[--retry-limit <N>] [--dry-run]'
5
+ argument-hint: '[--dry-run]'
6
6
  disable-model-invocation: false
7
7
  user-invocable: true
8
8
  allowed-tools: Read, Write, Bash(git:*), Bash(oat:*), Bash(oat project log:*), Glob, Grep, AskUserQuestion, Task
9
9
  metadata:
10
- version: 2.3.22
10
+ version: 2.3.24
11
11
  ---
12
12
 
13
13
  # Implementation Phase
@@ -59,10 +59,20 @@ recovery owner for that carrier:
59
59
  1. **Exit gate before the integrated review.** Resolve and run the configured
60
60
  implement exit gate exactly as Step 14 does (`oat gate resolve
61
61
  oat-project-implement --project "$PROJECT_PATH" --json`, canonical
62
- `oat --json gate review`, receive eligibility, `onFailure`, `maxAttempts`),
63
- scoped to the milestone's ordered phase set. The goal ladder exception
64
- applies: this gate precedes the integrated delivery review, and queued
65
- fixes require it to run again.
62
+ `oat --json gate review`, receive eligibility, `onFailure`, `maxAttempts`).
63
+ Run the configured command verbatim, including its
64
+ `--review-scope final`; do not rewrite that argument to the milestone's
65
+ phase IDs. The carrier subject still records the milestone's ordered phase
66
+ set. The goal ladder exception applies: this gate precedes the integrated
67
+ delivery review, and queued fixes require it to run again. The gate's own
68
+ Reviews row is admitted as carrier bookkeeping only when it has Type
69
+ `code`, Invocation `gate`, and a non-placeholder Reviewed Head equal to the
70
+ carrier's `reviewed_head`; its non-placeholder artifact is admitted with
71
+ that row only when its project-relative path is under `reviews/` (including
72
+ `reviews/archived/`). This row never serves as the milestone or delivery
73
+ integrated review and never joins a delivery's own evidence artifacts, so
74
+ it cannot unlock set-once delivery fields. Do not create a placeholder
75
+ Reviews row before the gate runs.
66
76
  2. **Write the milestone carrier.** Record `oat_milestone_gates[mNN].exit`
67
77
  with the gate approval record core, `resolution` (`configured`, `no_gate`,
68
78
  or `project_disabled`), `subject: { kind: code, scope: [ordered phase
@@ -5,7 +5,7 @@ disable-model-invocation: false
5
5
  user-invocable: true
6
6
  allowed-tools: Read, Write, Bash(awk:*), Bash(gh:*), Bash(git:*), Bash(mktemp:*), Bash(oat:*), Bash(rm:*), Glob, Grep, AskUserQuestion
7
7
  metadata:
8
- version: 1.6.12
8
+ version: 1.6.13
9
9
  ---
10
10
 
11
11
  # Project PR (Final)
@@ -90,7 +90,7 @@ oat-project-pr-final title="feat: add review loop"
90
90
 
91
91
  ### Without arguments
92
92
 
93
- Run the `oat-project-pr-final` skill and it will ask for:
93
+ Run the `oat-project-pr-final` skill and it fills these from the defaults below without asking, then pushes the branch and creates the PR:
94
94
 
95
95
  - PR title
96
96
  - default when a known ticket is associated: `[{TICKET-NUM}] {Descriptive Project Title}`