@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.
- package/assets/bundle-metadata.json +1 -1
- package/assets/docs/cli-utilities/config-and-local-state.md +3 -3
- package/assets/docs/cli-utilities/configuration.md +3 -1
- package/assets/docs/cli-utilities/index.md +1 -0
- package/assets/docs/cli-utilities/tool-packs.md +1 -1
- package/assets/docs/reference/file-locations.md +1 -1
- package/assets/docs/reference/oat-directory-structure.md +1 -1
- package/assets/public-package-versions.json +4 -4
- package/assets/skills/oat-doctor/SKILL.md +153 -193
- package/assets/skills/oat-project-autonomous/references/gate-inventory.md +1 -1
- package/assets/skills/oat-project-document/references/docs/autonomy-contract.md +1 -1
- package/assets/skills/oat-project-implement/references/docs/autonomy-contract.md +1 -1
- package/assets/skills/oat-project-lite/references/docs/autonomy-contract.md +1 -1
- package/assets/skills/oat-project-pr-final/references/docs/autonomy-contract.md +1 -1
- package/assets/skills/oat-project-quick-start/SKILL.md +9 -6
- package/assets/skills/oat-project-quick-start/references/docs/autonomy-contract.md +1 -1
- package/assets/templates/implementation.md +1 -1
- package/dist/commands/config/index.d.ts.map +1 -1
- package/dist/commands/config/index.js +18 -1
- package/dist/config/oat-config.d.ts +1 -0
- package/dist/config/oat-config.d.ts.map +1 -1
- package/dist/config/oat-config.js +1 -1
- package/package.json +2 -2
|
@@ -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
|
|
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)
|
|
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** —
|
|
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,47 +1,49 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: oat-doctor
|
|
3
|
-
description: Use when you
|
|
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:
|
|
9
|
+
version: 2.0.0
|
|
10
10
|
---
|
|
11
11
|
|
|
12
12
|
# OAT Doctor
|
|
13
13
|
|
|
14
|
-
|
|
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
|
|
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
|
|
30
|
-
- No
|
|
31
|
-
- No
|
|
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`
|
|
36
|
-
- Reading files to inspect
|
|
37
|
-
-
|
|
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
|
|
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
|
-
|
|
60
|
-
|
|
61
|
-
- `[
|
|
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
|
-
|
|
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
|
-
-
|
|
82
|
-
- Otherwise → **
|
|
73
|
+
- `--summary` → **summary mode** (Step 4 only).
|
|
74
|
+
- Otherwise → **sweep mode** (Steps 1–3).
|
|
83
75
|
|
|
84
|
-
|
|
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
|
-
|
|
87
|
-
TOOLS_JSON=$(oat tools list --json --scope all 2>/dev/null || echo '{"tools":[]}')
|
|
88
|
-
```
|
|
78
|
+
### Step 1: Sweep
|
|
89
79
|
|
|
90
|
-
|
|
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
|
-
|
|
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
|
-
|
|
95
|
-
|
|
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
|
-
|
|
94
|
+
File checks (read-only):
|
|
99
95
|
|
|
100
|
-
|
|
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
|
-
|
|
103
|
-
CONFIG_JSON=$(oat config list --json 2>/dev/null || echo '{"configs":[]}')
|
|
104
|
-
```
|
|
101
|
+
#### Finding rules
|
|
105
102
|
|
|
106
|
-
|
|
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
|
-
-
|
|
109
|
-
-
|
|
110
|
-
-
|
|
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
|
-
|
|
109
|
+
**Config**
|
|
118
110
|
|
|
119
|
-
|
|
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
|
-
|
|
118
|
+
**PJM**
|
|
122
119
|
|
|
123
|
-
|
|
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
|
-
|
|
129
|
-
|
|
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
|
-
|
|
132
|
-
Run: oat config set activeProject ""
|
|
131
|
+
**Docs**
|
|
133
132
|
|
|
134
|
-
|
|
135
|
-
|
|
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
|
-
|
|
138
|
-
Run: oat init tools
|
|
139
|
-
```
|
|
137
|
+
**Tools**
|
|
140
138
|
|
|
141
|
-
|
|
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
|
-
|
|
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
|
-
|
|
153
|
+
### Step 2: Report
|
|
154
154
|
|
|
155
|
-
|
|
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
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
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
|
-
|
|
174
|
+
When every area is `(ok)` and no `info` exists, print `Your OAT setup looks good. No issues found.` and stop.
|
|
165
175
|
|
|
166
|
-
`
|
|
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
|
-
|
|
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
|
-
|
|
180
|
+
Every dive has the same shape:
|
|
173
181
|
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
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
|
-
`
|
|
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
|
-
|
|
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
|
-
`
|
|
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
|
-
|
|
199
|
-
|
|
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
|
-
`
|
|
206
|
+
A deprecated key is explained through its `deprecated.supersededBy` and the successor's `owningCommand`.
|
|
202
207
|
|
|
203
|
-
|
|
204
|
-
- recon, skeptic, synthesize
|
|
208
|
+
#### PJM dive
|
|
205
209
|
|
|
206
|
-
`
|
|
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
|
-
|
|
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
|
-
|
|
222
|
+
#### Agent instructions dive
|
|
211
223
|
|
|
212
|
-
-
|
|
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
|
-
|
|
226
|
+
#### Docs dive
|
|
218
227
|
|
|
219
|
-
|
|
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
|
-
|
|
222
|
-
SYNC_STATUS=$(oat sync --dry-run --json --scope project 2>/dev/null || echo '{}')
|
|
223
|
-
```
|
|
230
|
+
#### Tools dive
|
|
224
231
|
|
|
225
|
-
|
|
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
|
|
234
|
+
### Step 4: Summary Mode (`--summary`)
|
|
228
235
|
|
|
229
|
-
|
|
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
|
|
241
|
-
| workflows | project | 40
|
|
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
|
|
248
|
-
|
|
|
249
|
-
| oat-project-implement
|
|
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
|
|
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
|
-
|
|
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
|
-
- ✅
|
|
307
|
-
- ✅
|
|
308
|
-
- ✅
|
|
309
|
-
- ✅
|
|
310
|
-
- ✅
|
|
311
|
-
- ✅ No
|
|
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.
|