@open-agent-toolkit/cli 0.2.74 → 0.2.76

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.
@@ -1,4 +1,4 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "oatVersion": "0.2.74"
3
+ "oatVersion": "0.2.76"
4
4
  }
@@ -124,7 +124,7 @@ Use `oat config` for repo runtime config inspection and supported key mutation.
124
124
  - `oat config list` - show the resolved command-surface values with source information
125
125
  - `oat config dump --json` - emit the full merged config payload with per-key source attribution, suitable for automation and debugging
126
126
  - `oat config describe` - list supported config surfaces and keys across shared repo, repo-local, user, and sync/provider config
127
- - `oat config describe <key>` - show file location, scope, default, mutability, and owning command for one key
127
+ - `oat config describe <key>` - show file location, scope, default, mutability, and owning command for one key; a deprecated key also prints a `Deprecated: prefer …` line, and `--json` carries it as a `deprecated` object with `supersededBy` (plus `legacyValues` when only a legacy value form is deprecated), which `oat-doctor` reads
128
128
 
129
129
  Use `oat config dump --json` when you need the whole resolved config in one machine-readable response rather than a single key or a human-oriented list view.
130
130
 
@@ -281,6 +281,6 @@ For the full state model, repair semantics, and examples, see [Instruction Sync]
281
281
  - `oat internal validate-oat-skills` - validate `oat-*` skill contracts and metadata
282
282
  - `oat doctor` - run environment and setup diagnostics, including installed-vs-bundled skill version checks
283
283
 
284
- `oat doctor` is the quickest way to confirm that your runtime, directory structure, and installed OAT assets are healthy before deeper debugging. At project scope it also scans bounded repository script and documentation surfaces for known-stale CLI grammar, such as `oat --scope all sync`, and reports file/line evidence plus the current `oat sync --scope all` form. Generated provider views, OAT lifecycle artifacts, archived content, dependencies, build output, and nested worktrees are excluded.
284
+ `oat doctor` is the quickest way to confirm that your runtime, directory structure, and installed OAT assets are healthy before deeper debugging. At project scope it also scans bounded repository script and documentation surfaces for known-stale CLI grammar, such as `oat --scope all sync` <!-- oat-doctor: allow-stale-invocation -->, and reports file/line evidence plus the current `oat sync --scope all` form. Generated provider views, OAT lifecycle artifacts, archived content, dependencies, build output, and nested worktrees are excluded.
285
285
 
286
- The `/oat-doctor` skill (installed via the core pack) provides richer diagnostics with check and summary modes, including config explanations sourced from bundled documentation.
286
+ The `/oat-doctor` skill (installed via the core pack) goes further: it sweeps config, project management (PJM), agent instructions, docs, and installed tools read-only, prints one report grouped by area and severity, and then dives into any area you pick, teaching from the bundled documentation and the `oat config describe` entries and offering the exact fix command or the owning skill. It applies nothing except a single fix command you approve. Unattended (`OAT_NON_INTERACTIVE=1`), the report is the whole output; `--summary` keeps the installed-tools dashboard.
@@ -54,7 +54,9 @@ What each command is for:
54
54
  - `oat config set <key> <value>` updates supported shared or repo-local keys.
55
55
  - `oat config unset <key>` removes a supported key from one surface, using the same `--shared`/`--local`/`--user` flags and per-key restrictions as `set`. The resolved value then falls back to the next surface down, or to the built-in default. A key the surface does not hold exits 0 as already-unset (`--json` adds a `removed` boolean to tell the two apart). Unknown keys, lifecycle state, `tools.*` pack intent, aggregate read views, read-only remote-policy structure, and environment-shadowed keys with nothing stored are refused with exit 1 — see [CLI Reference](../reference/cli-reference.md#oat-config-surface-flags).
56
56
  - `oat config describe` shows the supported config catalog across shared repo, repo-local, user, and sync/provider surfaces.
57
- - `oat config describe <key>` shows file, scope, default, mutability, owning command, and description for one key.
57
+ - `oat config describe <key>` shows file, scope, default, mutability, owning command, and description for one key. A deprecated key also prints `Deprecated: prefer <successor>`, and `--json` carries the same fact as a `deprecated` object (`supersededBy`, plus `note` and `legacyValues` where they apply).
58
+
59
+ For a guided pass instead of individual commands, run the `/oat-doctor` skill (core pack). It sweeps every config surface read-only, flags stale `activeProject` / `lastPausedProject` pointers, keys set on the wrong surface, and deprecated values, then walks each key group you have not set: what it does, when you would want it, and which surface owns it. It offers the exact `oat config` command for each fix and runs one only after you approve it. See [Config and Local State](config-and-local-state.md#internal-helpers-and-diagnostics) for the other areas it covers.
58
60
 
59
61
  ### Source labels
60
62
 
@@ -31,6 +31,7 @@ Examples include:
31
31
  - general configuration guidance
32
32
  - workflow gate commands for per-skill final checks and cross-runtime review dispatch
33
33
  - utility command groups for config, local state, diagnostics, and related inspection flows
34
+ - a guided health check, the `/oat-doctor` skill, that sweeps config, project management, agent instructions, docs, and installed tools, then explains and offers fixes for what it finds (described in [Config and Local State](config-and-local-state.md))
34
35
 
35
36
  ## Who It's For
36
37
 
@@ -850,7 +850,7 @@ packs and is retained while either pack still owns it in that scope.
850
850
 
851
851
  The `core` pack contains foundational diagnostic and documentation skills:
852
852
 
853
- - **oat-doctor** — Setup diagnostics with two modes: check mode (terse `brew doctor`-style warnings with fix commands) and summary mode (full dashboard of installed packs, config values, and sync status).
853
+ - **oat-doctor** — One read-only sweep over config, PJM, agent instructions, docs, and tools; a report grouped by area and severity; then a dive into any area on request that explains findings and unset settings from the bundled docs and offers the exact fix command or the owning skill (nothing is applied without approval). `--summary` keeps the installed-tools dashboard.
854
854
  - **oat-docs** — Interactive Q&A skill backed by locally-bundled OAT documentation at `~/.oat/docs/`.
855
855
 
856
856
  Key behavior:
@@ -62,7 +62,7 @@ Pack intent is stored per scope:
62
62
  Config discovery via CLI:
63
63
 
64
64
  - `oat config describe` lists the supported config surfaces and keys across `.oat/config.json`, `.oat/config.local.json`, `~/.oat/config.json`, `.oat/sync/config.json`, and `~/.oat/sync/config.json`.
65
- - `oat config describe <key>` shows file location, scope, default, mutability, and the owning command for one key.
65
+ - `oat config describe <key>` shows file location, scope, default, mutability, and the owning command for one key, and for a deprecated key its successor.
66
66
  - `oat config list` shows the currently resolved values for the repo-local/shared command surface.
67
67
 
68
68
  Config ownership note:
@@ -104,7 +104,7 @@ Current config ownership:
104
104
  CLI discovery surfaces:
105
105
 
106
106
  - `oat config describe` lists the supported config surfaces and keys across shared repo, repo-local, user, and sync/provider config.
107
- - `oat config describe <key>` prints scope, file, default, mutability, owning command, and description for one config key.
107
+ - `oat config describe <key>` prints scope, file, default, mutability, owning command, and description for one config key, plus a `Deprecated: prefer …` line when the key is deprecated.
108
108
  - `oat config list` prints the resolved values for the repo-scoped/local command surface.
109
109
 
110
110
  Legacy `.oat/active-project` / `.oat/projects-root` / `.oat/active-idea` files may still be present in some environments but are no longer the canonical source in migrated command paths.
@@ -1,6 +1,6 @@
1
1
  {
2
- "cli": "0.2.74",
3
- "docs-config": "0.2.74",
4
- "docs-theme": "0.2.74",
5
- "docs-transforms": "0.2.74"
2
+ "cli": "0.2.76",
3
+ "docs-config": "0.2.76",
4
+ "docs-theme": "0.2.76",
5
+ "docs-transforms": "0.2.76"
6
6
  }
@@ -1,47 +1,49 @@
1
1
  ---
2
2
  name: oat-doctor
3
- description: Use when you need to diagnose your OAT setup, check for outdated skills, identify misconfigurations, or get a summary of installed tools and config. Runs health checks and recommends corrective actions.
3
+ description: Use when you want to check the health of your OAT setup in one place — config, project management (PJM), agent instructions, docs, and installed tools — and then work through what it finds. Sweeps read-only, reports by area, and dives into an area on request, teaching from the bundled docs and offering exact fix commands.
4
4
  argument-hint: '[--summary]'
5
5
  disable-model-invocation: true
6
6
  user-invocable: true
7
7
  allowed-tools: Read, Bash, Glob, Grep, AskUserQuestion
8
8
  metadata:
9
- version: 1.2.4
9
+ version: 2.0.0
10
10
  ---
11
11
 
12
12
  # OAT Doctor
13
13
 
14
- Diagnose your OAT setup at both project and user levels. Checks for skill updates, identifies misconfigurations, summarizes what's installed, and recommends corrective actions.
14
+ One place to look at everything OAT knows about this checkout and this user. A run has three stages: a read-only **sweep** over five areas, a grouped **report**, and a **dive** into any area the person picks. Dives teach from the bundled docs and offer fixes; they do not apply them.
15
15
 
16
16
  ## Prerequisites
17
17
 
18
18
  - OAT CLI installed and available as `oat` in PATH.
19
- - At least one `oat init` has been run (project or user level).
19
+ - At least one `oat init` has been run (project or user level). When nothing is initialized, the sweep still runs: every area then offers its bootstrap.
20
20
 
21
21
  ## Mode Assertion
22
22
 
23
23
  **OAT MODE: Doctor (Diagnostic)**
24
24
 
25
- **Purpose:** Inspect OAT setup and report findings with actionable fix commands. Never modify files or configuration.
25
+ **Purpose:** Inspect OAT setup, explain what it finds, and offer the exact fix. The sweep and the dives never write.
26
26
 
27
27
  **BLOCKED Activities:**
28
28
 
29
- - No editing configuration files, skills, or templates.
30
- - No running `oat init`, `oat sync`, `oat tools update`, or any mutating commands.
31
- - No creating, modifying, or deleting any files.
29
+ - No editing configuration files, skills, templates, instruction files, PJM files, or docs.
30
+ - No creating, modifying, or deleting any file.
31
+ - No running any mutating command, with exactly one carve-out below.
32
+
33
+ **The one carve-out:** after a dive has named a fix as one of `oat config set`, `oat config unset`, `oat config adopt`, `oat pjm init`, `oat instructions sync`, `oat tools update`, or `oat tools install`, and the person has approved that exact command, run it once and report the result. Nothing else is ever run; a hand-off to another skill (`oat-docs-bootstrap`, `oat-agent-instructions-analyze`, `oat-agent-instructions-apply`, `oat-pjm-*`) is an invocation the person starts.
32
34
 
33
35
  **ALLOWED Activities:**
34
36
 
35
- - Running `oat` CLI commands with `--json` flag for read-only data gathering.
36
- - Reading files to inspect configuration state.
37
- - Reading `~/.oat/docs/` for config key explanations.
38
- - Presenting diagnostic findings and recommendations to the user.
37
+ - Running `oat` CLI commands with `--json` for read-only data gathering, projected to the fields named below.
38
+ - Reading files to inspect state, and reading `~/.oat/docs/` to explain it.
39
+ - Presenting findings, explanations, and recommendations.
39
40
 
40
41
  **Self-Correction Protocol:**
41
42
  If you catch yourself:
42
43
 
43
- - About to run a mutating command → STOP and present it as a recommendation instead.
44
- - Editing a file to fix a problem → STOP and tell the user the fix command.
44
+ - About to run a mutating command that is not the one approved carve-out → STOP and present it as a recommendation instead.
45
+ - Editing a file to fix a problem → STOP and tell the person the fix command or the owning skill.
46
+ - Explaining a config key from memory → STOP and read the `describe` entry and the docs section named for its group.
45
47
 
46
48
  **Recovery:**
47
49
 
@@ -56,21 +58,11 @@ Print a phase banner once at start:
56
58
  OAT ▸ DOCTOR
57
59
  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
58
60
 
59
- ### Check Mode (default)
60
-
61
- - `[1/4] Gathering installed tools…`
62
- - `[2/4] Checking for outdated skills…`
63
- - `[3/4] Inspecting configuration…`
64
- - `[4/4] Reporting findings…`
61
+ - `[1/3] Sweeping config, PJM, agent instructions, docs, and tools…`
62
+ - `[2/3] Reporting findings…`
63
+ - `[3/3] Diving into {area}…` (once per dive)
65
64
 
66
- ### Summary Mode (`--summary`)
67
-
68
- - `[1/6] Gathering installed tools…`
69
- - `[2/6] Checking for outdated skills…`
70
- - `[3/6] Inspecting configuration…`
71
- - `[4/6] Discovering available packs…`
72
- - `[5/6] Checking sync status…`
73
- - `[6/6] Building dashboard…`
65
+ Summary mode (`--summary`) prints `[1/2] Gathering installed tools…` and `[2/2] Building dashboard…` instead.
74
66
 
75
67
  ## Process
76
68
 
@@ -78,157 +70,172 @@ OAT ▸ DOCTOR
78
70
 
79
71
  Read `$ARGUMENTS`:
80
72
 
81
- - If `$ARGUMENTS` contains `--summary` → **summary mode**
82
- - Otherwise → **check mode** (default)
73
+ - `--summary` → **summary mode** (Step 4 only).
74
+ - Otherwise → **sweep mode** (Steps 1–3).
83
75
 
84
- ### Step 1: Gather Installed Tools
76
+ Report-only rule: when `OAT_NON_INTERACTIVE=1` is set, or no user-response channel exists, the run ends after Step 2's report. Never prompt in that case, and never run a fix.
85
77
 
86
- ```bash
87
- TOOLS_JSON=$(oat tools list --json --scope all 2>/dev/null || echo '{"tools":[]}')
88
- ```
78
+ ### Step 1: Sweep
89
79
 
90
- Parse the JSON output. Each tool has: `name`, `type` (skill/agent), `scope` (project/user), `version`, `bundledVersion`, `pack` (core/docs/ideas/workflows/utility/project-management/research/custom), `status` (current/outdated/newer/not-bundled).
80
+ Run the seven commands below and the four file checks. Every command call is projected to the fields named here with `node -e` (or `jq` when present); never print or read a raw payload — `oat doctor --json` is about 410 KB and `oat tools list --json` about 626 KB on a mid-sized repository, and neither fits a working context.
91
81
 
92
- ### Step 2: Check for Outdated Skills
82
+ A command has **failed** only when its stdout does not parse as JSON, or the process is killed or times out. A non-zero exit with parseable JSON is a findings result: `oat doctor` and `oat pjm doctor` both exit 1 whenever any check warns, which is the normal state of a healthy repository. A failed command becomes one `warning` finding for its area whose summary names the command and quotes the first line of stderr; the sweep continues.
93
83
 
94
- ```bash
95
- OUTDATED_JSON=$(oat tools outdated --json --scope all 2>/dev/null || echo '{"tools":[]}')
96
- ```
84
+ | # | Command | Projection | Feeds |
85
+ | --- | --------------------------------------- | ---------------------------------------------------------------------------------------- | -------------------------------------------- |
86
+ | 1 | `oat doctor --json --scope all` | `.checks[] \| {name, status, message}` — drop `packEvidence` and `providerRefreshAdvice` | config, tools, docs (by the check map below) |
87
+ | 2 | `oat pjm doctor --json` | `.adoption` and `.checks[] \| {name, status, message}` | PJM |
88
+ | 3 | `oat config dump --json` | `.shared`, `.local`, `.user` (the three surface objects) | config, docs |
89
+ | 4 | `oat config describe --json` | `.entries[] \| {key, group, file, scope, defaultValue, owningCommand, deprecated}` | config |
90
+ | 5 | `oat instructions validate --json` | `.summary` and `.entries[] \| select(.status != "ok") \| {agentsPath, status, detail}` | agent instructions |
91
+ | 6 | `oat tools list --json --scope all` | `.tools[] \| {name, pack, scope, status}` | tools |
92
+ | 7 | `oat tools outdated --json --scope all` | `.tools[] \| {name, version, bundledVersion, scope}` | tools |
97
93
 
98
- Parse the JSON output. Each entry has `name`, `version` (installed), `bundledVersion` (available), `pack`, `scope`.
94
+ File checks (read-only):
99
95
 
100
- ### Step 3: Inspect Configuration
96
+ - **Root instructions headings.** Read `AGENTS.md` at the repository root (and `CLAUDE.md` when it is a file rather than a pointer). Note which of these headings are present: `## Tool Packs` (written by `oat tools install --project-guidance`), `### Project Management` and `### Decision Records` (written by `oat pjm init`), `## Documentation` (written by `oat docs init` / `oat-docs-bootstrap`).
97
+ - **Sync config surfaces.** Read `.oat/sync/config.json` and `~/.oat/sync/config.json` when present, keys only. `oat config dump` does not carry the `Sync/Provider` and `User Sync` groups, so this is their only set-state source.
98
+ - **Docs surface.** Detect an existing docs surface the way `oat-docs-bootstrap`'s preflight does: `documentation.root` in the dump; a docs app under `apps/docs` or `apps/*-docs`, or any `apps/*` with a `source.config.*`, a `next.config.*` beside a `docs/` directory, or `mkdocs.yml`; a root `mkdocs.yml`; a root `docs/` or `documentation/` directory.
99
+ - **`documentation.root` on disk.** When the dump sets it, check that the directory exists.
101
100
 
102
- ```bash
103
- CONFIG_JSON=$(oat config list --json 2>/dev/null || echo '{"configs":[]}')
104
- ```
101
+ #### Finding rules
105
102
 
106
- Check for issues:
103
+ Each finding is one line with an **area**, a **severity**, a one-line **summary**, its **evidence** (a check name, a key and its surface, or a file path), and a **fix path** (an exact command, an owning skill, or none). Severities:
107
104
 
108
- - **Stale `activeProject` pointer:** If `activeProject` is set, verify the directory exists. If not, warn.
109
- - **Stale `activeIdea` pointer:** If `activeIdea` is set, verify the directory exists. If not, warn.
110
- - **Missing `projects.root`:** If not configured and no default exists, warn.
111
- - **Synced project health:** Report `project:synced_tracked_artifacts`,
112
- `project:synced_gitignore`, `project:synced_projects`,
113
- `project:synced_editor_hint`, and per-project
114
- `project:synced_<slug>_<kind>` checks without treating an absent checkout as
115
- proof that no synced project exists.
105
+ - `error` — a lifecycle skill would fail or write to the wrong place.
106
+ - `warning` — drift the person should fix soon.
107
+ - `info` — a teaching opportunity or a fact with no fix path.
116
108
 
117
- For config key explanations, read from the bundled docs at `~/.oat/docs/`. Check `reference/file-locations.md` and `guide/cli-reference.md` for authoritative descriptions.
109
+ **Config**
118
110
 
119
- ### Step 4: Check Mode — Report Findings
111
+ - `activeProject` or `lastPausedProject` set to a path that does not exist → `error`; fix `oat config set activeProject ''` / `oat config set lastPausedProject ''` (the CLI refuses `unset` for these two lifecycle keys). `activeIdea` set to a missing path → `error`; fix `oat config unset activeIdea --local` (or `--user` for a user-level value).
112
+ - A set key whose `describe` entry carries `deprecated` → `warning`; summary names the key and its `deprecated.supersededBy`; when `deprecated.legacyValues` is present the finding fires only when the set value is one of those values; fix = the entry's `owningCommand` for the successor.
113
+ - A key set on a surface that is not one of the surfaces its `describe` entry's `file` names → `warning`; fix `oat config unset <key> --<surface>` then `oat config set <key> <value> --<right surface>`.
114
+ - The `dispatch-matrix` recommendation is reported only through the `project:dispatch_matrix` check (command 1, config area); there is no separate rule for it, so one gap is one finding. Its fix is `oat config adopt dispatch-matrix --shared`, and the config dive explains it from `workflow.dispatchCeiling.recommendationVersion` in the dump.
115
+ - A documented key group with nothing set on any surface → one `info` per group, expanded only in the dive.
116
+ - Synced project health: `project:synced_tracked_artifacts`, `project:synced_gitignore`, `project:synced_projects`, `project:synced_editor_hint`, and per-project `project:synced_<slug>_<kind>` checks from command 1 → severity from status, summary from the message; report them without treating an absent checkout as proof that no synced project exists (an absent checkout is materialized by `oat project pull`, which the check's message names).
120
117
 
121
- If in **check mode**, output a terse, `brew doctor`-style checklist.
118
+ **PJM**
122
119
 
123
- **Format:**
120
+ - `adoption.state` `none` → `error` (PJM not adopted; fix `oat pjm init`); `partial-initialization` → `error` (declared but canonical files missing; fix `oat pjm init`, which completes the layout); `inferred-legacy` → `warning` (a pre-adoption layout the CLI recognizes; fix `oat pjm init` to declare it); `declared` is healthy.
121
+ - Any other `pjm:*` check with status `fail` → `error`; `warn` → `warning`; the fix path is the one the check's message implies (see the PJM dive for the map). `pjm:adoption` is excluded here: the `adoption.state` rule above owns adoption, so it is one finding with one severity.
122
+ - A `pjm:*` check name the PJM dive does not know → `info` with its message.
124
123
 
125
- ```
126
- Your OAT setup has {N} warning(s).
124
+ **Agent instructions**
127
125
 
128
- ⚠ {N} outdated skill(s)
129
- Run: oat tools update --scope {scope}
126
+ - An entry with status `missing` or `content_mismatch` (the entry literal; the summary counter is spelled `contentMismatch`) → `error`; fix `oat instructions sync` (`--force` for a content mismatch the person confirms is stale).
127
+ - An entry with status `stray` → `warning`; fix `oat instructions sync` after the person decides whether the stray file should exist.
128
+ - A CLI-written heading absent while its capability is present → `warning`: no `## Tool Packs` while any pack is installed at project scope (fix `oat tools install <pack> --project-guidance`); no `### Project Management` or `### Decision Records` while PJM adoption is `declared` (fix `oat pjm init`, which rewrites the guidance); no `## Documentation` while a docs surface exists (fix: `oat-docs-bootstrap`).
129
+ - Content quality beyond presence is not judged here; route to `oat-agent-instructions-analyze`.
130
130
 
131
- ⚠ Stale activeProject pointer: {path} does not exist
132
- Run: oat config set activeProject ""
131
+ **Docs**
133
132
 
134
- ⚠ Stale activeIdea pointer: {path} does not exist
135
- Run: oat config set activeIdea ""
133
+ - A docs surface detected with no `documentation` config → `warning`; fix: run `oat-docs-bootstrap`, which detects the existing surface and offers the audit.
134
+ - `documentation.root` set but absent on disk → `error`; fix `oat config unset documentation.root --shared` or `oat-docs-bootstrap`.
135
+ - No docs surface and no `documentation` config (an uninitialized or docs-less repository) → `info`; fix: run `oat-docs-bootstrap` to set one up. This is what makes an empty repository offer its docs bootstrap alongside the other areas.
136
136
 
137
- ⚠ {pack} pack not installed at {scope} scope
138
- Run: oat init tools
139
- ```
137
+ **Tools**
140
138
 
141
- If no warnings:
139
+ - An outdated tool → `warning`; fix `oat tools update <name> --scope <scope>` (or `oat tools update --scope <scope>` for all).
140
+ - The same pack installed at both scopes → `warning`; fix `oat tools migrate --pack <pack> --from project --to user` (or the reverse).
141
+ - A pack enabled under `tools.*` in the dump but with no installed skill → `warning`; fix `oat tools install <pack>`.
142
142
 
143
- ```
144
- Your OAT setup looks good. No issues found.
145
- ```
146
-
147
- Stop here for check mode.
148
-
149
- ### Step 5: Summary Mode — Discover Available Packs
143
+ **`oat doctor` checks** (command 1). Any check with status `fail` or `warn` becomes a finding, severity from status, evidence = the check name, summary = its message, by this map (a semantic map, not a prefix rule):
150
144
 
151
- For summary mode, compare installed skills against the full manifest to identify available-but-uninstalled packs and skills.
145
+ | Check names | Area |
146
+ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- |
147
+ | `project:dispatch_matrix`, `project:synced_*` | config |
148
+ | `project:manifest`, `project:providers`, `project:symlink_support`, `project:canonical_directories`, `project:codex_*`, `project:skill_versions`, `project:cursor_materialized_models`, and their `user:` twins; `project:pack_state`, `user:pack_state`, `packs:*` | tools |
149
+ | `project:stale_invocations` | docs (it cites doc and script file:line) |
150
+ | `pjm:*` | suppressed — `oat pjm doctor` reports the same checks and the PJM area owns them |
151
+ | any other name | `info` in tools, with the message |
152
152
 
153
- **Bundled skill manifest (source of truth):**
153
+ ### Step 2: Report
154
154
 
155
- Each heading below names a pack exactly as `oat tools install <pack>` expects
156
- it, and lists every skill that pack ships.
155
+ Print the findings grouped by area in this order: config, PJM, agent instructions, docs, tools. Within an area, errors first, then warnings. Print `info` findings as one count per area; they expand only in a dive. An area with no findings prints `(ok)`.
157
156
 
158
- `core` pack skills:
159
-
160
- - oat-docs, oat-doctor
161
-
162
- `ideas` pack skills:
157
+ ```text
158
+ OAT ▸ DOCTOR
159
+ Config (1 error, 1 warning, 4 info)
160
+ ✖ activeProject points at .oat/projects/shared/x, which does not exist [config.local]
161
+ → oat config set activeProject ''
162
+ ⚠ workflow.postImplementSequence uses the legacy value "docs-pr" [shared]
163
+ → prefer the structured form: oat config describe workflow.postImplementSequence
164
+ PJM (ok)
165
+ Agent instructions (1 warning)
166
+ ⚠ AGENTS.md has no "### Project Management" section although PJM is adopted [AGENTS.md]
167
+ → oat pjm init (or: run oat-agent-instructions-analyze)
168
+ Docs (1 warning)
169
+ ⚠ docs/ exists but .oat/config.json has no documentation section [docs/]
170
+ → run oat-docs-bootstrap; it detects the surface and offers the audit
171
+ Tools (ok)
172
+ ```
163
173
 
164
- - oat-idea-new, oat-idea-ideate, oat-idea-summarize, oat-idea-scratchpad
174
+ When every area is `(ok)` and no `info` exists, print `Your OAT setup looks good. No issues found.` and stop.
165
175
 
166
- `docs` pack skills:
176
+ Under the report-only rule, stop here. Otherwise ask, with `AskUserQuestion`, which area to dive into: offer each area that has findings (errors, warnings, or info), plus `all` and `done`. Repeat after each dive until the person picks `done`.
167
177
 
168
- - authoring-docs, oat-agent-instructions-analyze
169
- - oat-agent-instructions-apply, oat-docs-analyze
170
- - oat-docs-apply, oat-docs-authoring, oat-docs-bootstrap
178
+ ### Step 3: Dives
171
179
 
172
- `workflows` pack skills:
180
+ Every dive has the same shape:
173
181
 
174
- - oat-cursor-cloud-projects, oat-explainer-kit, oat-project-autonomous
175
- - oat-project-capture, oat-project-clear-active, oat-project-complete
176
- - oat-project-design, oat-project-dispatch-subagents, oat-project-discover
177
- - oat-project-document, oat-project-implement, oat-project-import-plan
178
- - oat-project-lite, oat-project-new, oat-project-next, oat-project-open
179
- - oat-project-plan, oat-project-plan-writing, oat-project-pr-final
180
- - oat-project-pr-progress, oat-project-progress, oat-project-promote-spec-driven
181
- - oat-project-quick-start, oat-project-reconcile, oat-project-retro
182
- - oat-project-retro-file, oat-project-revise, oat-project-review-provide
183
- - oat-project-review-provide-remote, oat-project-review-receive
184
- - oat-project-review-receive-remote, oat-project-spec, oat-project-split
185
- - oat-project-summary, oat-repo-knowledge-index, oat-worktree-bootstrap
186
- - oat-worktree-bootstrap-auto, oat-wave-execute, oat-wave-program
187
- - oat-wrap-up
182
+ 1. **Restate** the area's findings with their evidence, expanding the `info` lines.
183
+ 2. **Teach** from the bundled docs and, for config, from the `describe` entries: name the page and section, read it at run time, and explain in two or three sentences what the thing does, when the person would want it, and which surface owns it. Quote nothing from memory. When `~/.oat/docs/` is absent, say so and offer `oat tools install core`; do not invent an explanation.
184
+ 3. **Answer** the person's questions from the same sources.
185
+ 4. **Offer** each fix as the exact command (the `describe` entry's `owningCommand` for config keys) or the owning skill, then stop. If the person approves a listed carve-out command, run that one command and report the result; otherwise the person runs it.
188
186
 
189
- `utility` pack skills:
187
+ Docs citations below name a page under `~/.oat/docs/` (the same tree as `apps/oat-docs/docs/`) and a `##` heading; a citation must be a prefix of the real heading.
190
188
 
191
- - create-agnostic-skill, explainer-kit, oat-dispatch-subagents
192
- - subagent-orchestration, oat-repo-improve, oat-repo-maintainability-review
193
- - oat-review-provide, oat-review-provide-remote, oat-review-receive
194
- - oat-review-receive-remote
189
+ #### Config dive
195
190
 
196
- `project-management` pack skills:
191
+ Walk every distinct `group` value in the `describe` output — nine today, including `PJM Remote Shared Policy`, `Explainer Defaults (local > shared)`, and `User Sync (~/.oat/sync/config.json)`; never a hard-coded list. For each group, say what is set (from the dump or the sync files), what is deprecated, and what is unset; for an unset group, teach it from the entry descriptions and its docs section:
197
192
 
198
- - oat-pjm-add-backlog-item, oat-pjm-decision, oat-pjm-remote
199
- - oat-pjm-update-repo-reference, oat-pjm-review-backlog
193
+ | Group | Docs section |
194
+ | ------------------------------------------------------------------ | ------------------------------------------------------------------------------- |
195
+ | The five surfaces themselves (which file owns what) | `cli-utilities/configuration.md` § The five config surfaces |
196
+ | `Shared Repo (.oat/config.json)` | `cli-utilities/configuration.md` § Shared repo config you will touch most often |
197
+ | `Repo Local (.oat/config.local.json)`, `User (~/.oat/config.json)` | `cli-utilities/configuration.md` § Repo-local and user state |
198
+ | `Workflow Preferences` (dispatch policy keys) | `cli-utilities/configuration.md` § Dispatch policy resolution |
199
+ | `Workflow Preferences` (everything else) | `cli-utilities/configuration.md` § Workflow preferences |
200
+ | `Workflow Preferences` (gate keys) | `cli-utilities/workflow-gates.md` § Gate config |
201
+ | `Sync/Provider`, `User Sync` | `cli-utilities/configuration.md` § Provider sync config is different |
202
+ | `PJM Remote Shared Policy` | `cli-utilities/remote-project-management.md` |
203
+ | the `pjm.*` keys under Shared Repo | `cli-utilities/backlog-lifecycle.md` § Adoption comes first |
204
+ | `Explainer Defaults` | the entry descriptions (`oat config describe explainers.defaults.style`) |
200
205
 
201
- `research` pack skills:
206
+ A deprecated key is explained through its `deprecated.supersededBy` and the successor's `owningCommand`.
202
207
 
203
- - analyze, compare, deep-research
204
- - recon, skeptic, synthesize
208
+ #### PJM dive
205
209
 
206
- `brainstorm` pack skills:
210
+ State the adoption state (`declared`, `inferred-legacy`, `partial-initialization`, or `none`) and what it means (`cli-utilities/backlog-lifecycle.md` § Adoption comes first). Then each non-passing check and its fix:
207
211
 
208
- - oat-brainstorm
212
+ | Check | Fix path |
213
+ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
214
+ | `pjm:adoption` | not reported separately: the `adoption.state` rule owns it; fix `oat pjm init` |
215
+ | `pjm:canonical_files`, `pjm:template_frontmatter`, `pjm:top_level_layout` | `oat pjm init` re-creates canonical files; unknown top-level folders are the person's to move (`cli-utilities/backlog-lifecycle.md` § Catching lifecycle drift) |
216
+ | `pjm:legacy_monoliths`, `pjm:loose_reference_files`, `pjm:second_roadmap` | structural drift: `cli-utilities/backlog-lifecycle.md` § Catching lifecycle drift and the migration guidance it links; `oat-pjm-update-repo-reference` for the reference records |
217
+ | `pjm:backlog_terminal_in_items`, `pjm:backlog_completed_unarchived` | `oat backlog archive <id>` for each named item, then `oat backlog regenerate-index` |
218
+ | `pjm:backlog_invalid_status`, `pjm:backlog_archived_open`, `pjm:backlog_duplicate_id` | edit the named item's frontmatter (the person), then `oat backlog regenerate-index` |
219
+ | `pjm:remote_schema`, `pjm:remote_binding_ids`, `pjm:remote_metadata_state`, `pjm:remote_storage_content`, `pjm:remote_policy`, `pjm:remote_concurrent_intents`, `pjm:remote_operations`, `pjm:remote_retention`, `pjm:remote_host_capability` | emitted only when a remote binding is adopted: `oat-pjm-remote` (reconcile or refresh) and `cli-utilities/remote-project-management.md` |
220
+ | any other `pjm:*` name | `info` with the check's message; no fix path is invented |
209
221
 
210
- For each pack, determine:
222
+ #### Agent instructions dive
211
223
 
212
- - **Installed:** all pack skills found in installed tools list
213
- - **Partially installed:** some but not all pack skills found
214
- - **Not installed:** no pack skills found
215
- - **Missing skills:** specific skills in the manifest but not in installed list (highlights newly-added skills after CLI upgrades)
224
+ Explain the sync strategy in use (`oat instructions validate --json` `.summary`) and each non-`ok` entry with its path. Explain each missing heading: what the CLI writes there and why an agent needs it (`cli-utilities/bootstrap.md` for `## Tool Packs`; `cli-utilities/backlog-lifecycle.md` § Adoption comes first for the PJM sections). Offer `oat instructions sync`, `oat tools install <pack> --project-guidance`, or `oat pjm init` as the finding names; for wording and coverage beyond presence, hand off to `oat-agent-instructions-analyze` then `oat-agent-instructions-apply`.
216
225
 
217
- ### Step 6: Summary Mode — Check Sync Status
226
+ #### Docs dive
218
227
 
219
- If in a project directory (`.oat/` exists):
228
+ Say what surface was detected and what `documentation.*` says. This dive owns no docs logic: hand off to `oat-docs-bootstrap`, which detects the existing surface and offers the audit (`oat-docs-analyze` then `oat-docs-apply`), or `oat config unset documentation.root --shared` when the root is gone.
220
229
 
221
- ```bash
222
- SYNC_STATUS=$(oat sync --dry-run --json --scope project 2>/dev/null || echo '{}')
223
- ```
230
+ #### Tools dive
224
231
 
225
- Report whether provider views are in sync or have pending changes.
232
+ List outdated tools with installed and bundled versions and scope, packs at both scopes, and packs enabled but not installed, each with its command. Explain scopes from `cli-utilities/tool-packs.md`.
226
233
 
227
- ### Step 7: Summary Mode — Build Dashboard
234
+ ### Step 4: Summary Mode (`--summary`)
228
235
 
229
- Output a full dashboard:
236
+ Keep the dashboard. Gather `oat tools list --json --scope all` (projected to `{name, pack, scope, status}`) and `oat tools outdated --json --scope all`, group the tools by `pack`, and print:
230
237
 
231
- ```
238
+ ```text
232
239
  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
233
240
  OAT ▸ DOCTOR SUMMARY
234
241
  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
@@ -237,75 +244,28 @@ OAT ▸ DOCTOR SUMMARY
237
244
 
238
245
  | Pack | Scope | Skills | Status |
239
246
  | --------- | ------- | ------ | -------- |
240
- | core | user | 2/2 | current |
241
- | workflows | project | 40/40 | current |
242
- | ideas | user | 4/4 | current |
243
- | utility | project | 10/10 | outdated |
247
+ | core | user | 2 | current |
248
+ | workflows | project | 40 | outdated |
244
249
 
245
250
  ## Outdated Skills
246
251
 
247
- | Skill | Installed | Available | Scope |
248
- | ----------------------- | --------- | --------- | ------- |
249
- | oat-project-implement | 1.1.0 | 1.2.0 | project |
250
-
251
- ## Available But Not Installed
252
-
253
- - **docs** pack: authoring-docs, oat-agent-instructions-analyze, oat-agent-instructions-apply, oat-docs-analyze, oat-docs-apply, oat-docs-authoring, oat-docs-bootstrap (7 skills available)
254
- → Run: oat tools install docs --scope {scope}
255
- - **project-management** pack: oat-pjm-add-backlog-item, oat-pjm-decision, oat-pjm-remote, oat-pjm-update-repo-reference, oat-pjm-review-backlog (5 skills available)
256
- → Run: oat tools install project-management --scope {scope}
257
- - **research** pack: analyze, compare, deep-research, recon, skeptic, synthesize (6 skills available)
258
- → Run: oat tools install research --scope {scope}
259
-
260
- ## Configuration
261
-
262
- | Key | Value | Source |
263
- | -------------------- | ------------------------- | ------- |
264
- | activeProject | .oat/projects/shared/foo | local |
265
- | activeIdea | (not set) | - |
266
- | projects.root | .oat/projects/shared | default |
267
- | projects.defaultScope | synced | default |
268
- | documentation.root | (not set) | - |
269
- | worktrees.root | (not set) | - |
270
-
271
- ### Config Key Explanations
272
-
273
- Read config key descriptions from `~/.oat/docs/reference/file-locations.md` and `~/.oat/docs/guide/cli-reference.md`. If docs are not available, use these fallback descriptions:
274
-
275
- - **activeProject:** Path to the currently active OAT project. Set automatically by project skills.
276
- - **activeIdea:** Path to the currently active idea. Set by oat-idea-new.
277
- - **lastPausedProject:** Path to the last paused project for quick resume.
278
- - **projects.root:** Base directory for all OAT projects. Default: `.oat/projects/shared`.
279
- - **projects.defaultScope:** Scope used by project creation when `--scope` is omitted. Default: `synced`; supported values are `shared`, `local`, and `synced`.
280
- - **documentation.root:** Root directory for documentation. Used by docs skills.
281
- - **documentation.config:** Path to docs config file (e.g., mkdocs.yml).
282
- - **documentation.tooling:** Docs tooling in use (e.g., mkdocs, fumadocs).
283
- - **documentation.requireForProjectCompletion:** Whether docs update is required before project completion.
284
- - **workflow.autoReviewAtHillCheckpoints:** When true, completing a HiLL checkpoint auto-triggers the lifecycle review. Default unset. This does not control Tier 1 per-phase `oat-reviewer` gates. Can be overridden per-project via `oat_auto_review_at_hill_checkpoints` in plan.md frontmatter. Legacy `autoReviewAtCheckpoints` and `oat_auto_review_at_checkpoints` are still read as fallbacks.
285
- - **worktrees.root:** Base directory for git worktrees. Used by worktree-bootstrap skills.
286
-
287
- ## Sync Status
288
-
289
- {In sync / N pending changes across M providers}
290
-
291
- ## Warnings
292
-
293
- {Same warnings as check mode, if any}
252
+ | Skill | Installed | Available | Scope |
253
+ | --------------------- | --------- | --------- | ------- |
254
+ | oat-project-implement | 1.1.0 | 1.2.0 | project |
294
255
 
295
256
  ## Recommendations
296
257
 
297
- - Run `oat tools update` to update outdated skills.
298
- - Run `oat init tools` to install newly available packs.
299
- - Run `oat sync --scope project` to sync provider views.
258
+ - Run `oat tools update --scope {scope}` to update outdated skills.
259
+ - Run `oat-doctor` (no arguments) for the config, PJM, instructions, and docs sweep.
300
260
  ```
301
261
 
302
- Adapt the dashboard to show only sections with relevant data. Omit empty sections.
262
+ The pack list comes from the `pack` field of `oat tools list`; the skill carries no pack manifest. Omit empty sections.
303
263
 
304
264
  ## Success Criteria
305
265
 
306
- - ✅ Check mode reports all warnings with actionable fix commands.
307
- - ✅ Summary mode shows a complete dashboard of installed packs, config, and available skills.
308
- - ✅ Outdated skills are detected and update commands are provided.
309
- - ✅ Stale config pointers are identified.
310
- - ✅ Available-but-uninstalled packs/skills are surfaced (discovery gap closed).
311
- - ✅ No files are modified — purely diagnostic output.
266
+ - ✅ The sweep runs all seven commands and four file checks, projected, and never aborts on a non-zero exit with parseable JSON.
267
+ - ✅ The report groups findings by area and severity, folds `info` into counts, and ends with the area prompt (or ends at the report under the report-only rule).
268
+ - ✅ Every dive explains from the bundled docs and `describe` entries, names a fix path per finding, and applies nothing except one approved carve-out command.
269
+ - ✅ Every `pjm:*` check the CLI defines has a fix path or the generic `info` rule.
270
+ - ✅ Summary mode still prints the dashboard from live `oat tools list` output.
271
+ - ✅ No file is modified by the sweep, the report, or a dive.