@open-agent-toolkit/cli 0.2.65 → 0.2.67
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/configuration.md +33 -2
- package/assets/docs/cli-utilities/index.md +3 -0
- package/assets/docs/cli-utilities/project-log.md +63 -4
- package/assets/docs/cli-utilities/remote-project-management.md +191 -0
- package/assets/docs/contributing/code.md +8 -4
- package/assets/docs/contributing/skills.md +29 -17
- package/assets/docs/docs-tooling/commands.md +3 -1
- package/assets/docs/provider-sync/manifest-and-drift.md +2 -18
- package/assets/docs/reference/cli-reference.md +12 -1
- package/assets/docs/reference/file-locations.md +22 -0
- package/assets/docs/reference/oat-directory-structure.md +30 -17
- package/assets/docs/reference/troubleshooting.md +44 -0
- package/assets/docs/workflows/projects/lifecycle.md +17 -0
- package/assets/docs/workflows/projects/picking-up-projects.md +18 -0
- package/assets/docs/workflows/skills/index.md +33 -0
- package/assets/docs/workflows/skills/repo-improve.md +7 -3
- package/assets/public-package-versions.json +4 -4
- package/assets/skills/create-agnostic-skill/SKILL.md +19 -37
- package/assets/skills/create-agnostic-skill/references/docs/skills-guide.md +58 -15
- package/assets/skills/create-agnostic-skill/references/skill-template.md +17 -15
- package/assets/skills/oat-agent-instructions-apply/SKILL.md +1 -1
- package/assets/skills/oat-agent-instructions-apply/references/instruction-file-templates/glob-scoped-rule.md +1 -4
- package/assets/skills/oat-doctor/SKILL.md +3 -6
- package/assets/skills/oat-pjm-remote/SKILL.md +101 -0
- package/assets/skills/oat-pjm-remote/references/external-action-protocol.md +43 -0
- package/assets/skills/oat-project-autonomous/references/gate-inventory.md +1 -1
- package/assets/skills/oat-project-complete/SKILL.md +158 -30
- package/assets/skills/oat-project-complete/scripts/finalize-synced-archive.mjs +26 -7
- package/assets/skills/oat-project-complete/scripts/validate-durable-archive-receipt.mjs +183 -0
- 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/references/docs/autonomy-contract.md +1 -1
- package/assets/skills/oat-project-retro/SKILL.md +1 -1
- package/assets/skills/oat-project-retro/references/apply-procedure.md +11 -0
- package/assets/skills/oat-project-review-provide/SKILL.md +4 -4
- package/assets/skills/oat-project-summary/SKILL.md +24 -2
- package/assets/skills/oat-repo-improve/SKILL.md +9 -2
- package/assets/skills/oat-repo-improve/references/plan-template.md +4 -6
- package/assets/skills/oat-repo-knowledge-index/SKILL.md +11 -9
- package/assets/skills/oat-wave-execute/SKILL.md +20 -6
- package/assets/skills/oat-wave-program/SKILL.md +9 -4
- package/dist/commands/backlog/new.d.ts +1 -0
- package/dist/commands/backlog/new.d.ts.map +1 -1
- package/dist/commands/backlog/new.js +3 -1
- package/dist/commands/config/index.d.ts +3 -1
- package/dist/commands/config/index.d.ts.map +1 -1
- package/dist/commands/config/index.js +362 -36
- package/dist/commands/docs/index-generate/index.d.ts.map +1 -1
- package/dist/commands/docs/index-generate/index.js +68 -12
- package/dist/commands/docs/init/index.d.ts +11 -0
- package/dist/commands/docs/init/index.d.ts.map +1 -1
- package/dist/commands/docs/init/index.js +19 -1
- package/dist/commands/gate/index.d.ts.map +1 -1
- package/dist/commands/gate/index.js +10 -2
- package/dist/commands/instructions/instructions.utils.d.ts.map +1 -1
- package/dist/commands/instructions/instructions.utils.js +42 -9
- package/dist/commands/internal/validate-skill-version-bumps.d.ts.map +1 -1
- package/dist/commands/internal/validate-skill-version-bumps.js +5 -5
- package/dist/commands/pjm/doctor.d.ts +2 -0
- package/dist/commands/pjm/doctor.d.ts.map +1 -1
- package/dist/commands/pjm/doctor.js +71 -1
- package/dist/commands/pjm/index.d.ts +2 -0
- package/dist/commands/pjm/index.d.ts.map +1 -1
- package/dist/commands/pjm/index.js +3 -0
- package/dist/commands/pjm/remote/__integration__/lifecycle-harness.d.ts +60 -0
- package/dist/commands/pjm/remote/__integration__/lifecycle-harness.d.ts.map +1 -0
- package/dist/commands/pjm/remote/__integration__/lifecycle-harness.js +151 -0
- package/dist/commands/pjm/remote/association.d.ts +27 -0
- package/dist/commands/pjm/remote/association.d.ts.map +1 -0
- package/dist/commands/pjm/remote/association.js +68 -0
- package/dist/commands/pjm/remote/authority.d.ts +210 -0
- package/dist/commands/pjm/remote/authority.d.ts.map +1 -0
- package/dist/commands/pjm/remote/authority.js +341 -0
- package/dist/commands/pjm/remote/batch.d.ts +15 -0
- package/dist/commands/pjm/remote/batch.d.ts.map +1 -0
- package/dist/commands/pjm/remote/batch.js +126 -0
- package/dist/commands/pjm/remote/closeout.d.ts +69 -0
- package/dist/commands/pjm/remote/closeout.d.ts.map +1 -0
- package/dist/commands/pjm/remote/closeout.js +208 -0
- package/dist/commands/pjm/remote/create-binding.d.ts +62 -0
- package/dist/commands/pjm/remote/create-binding.d.ts.map +1 -0
- package/dist/commands/pjm/remote/create-binding.js +126 -0
- package/dist/commands/pjm/remote/credential-safety.d.ts +7 -0
- package/dist/commands/pjm/remote/credential-safety.d.ts.map +1 -0
- package/dist/commands/pjm/remote/credential-safety.js +21 -0
- package/dist/commands/pjm/remote/discussion.d.ts +49 -0
- package/dist/commands/pjm/remote/discussion.d.ts.map +1 -0
- package/dist/commands/pjm/remote/discussion.js +124 -0
- package/dist/commands/pjm/remote/doctor.d.ts +22 -0
- package/dist/commands/pjm/remote/doctor.d.ts.map +1 -0
- package/dist/commands/pjm/remote/doctor.js +380 -0
- package/dist/commands/pjm/remote/external-action.d.ts +208 -0
- package/dist/commands/pjm/remote/external-action.d.ts.map +1 -0
- package/dist/commands/pjm/remote/external-action.js +367 -0
- package/dist/commands/pjm/remote/host-execution.d.ts +28 -0
- package/dist/commands/pjm/remote/host-execution.d.ts.map +1 -0
- package/dist/commands/pjm/remote/host-execution.js +63 -0
- package/dist/commands/pjm/remote/index.d.ts +41 -0
- package/dist/commands/pjm/remote/index.d.ts.map +1 -0
- package/dist/commands/pjm/remote/index.js +280 -0
- package/dist/commands/pjm/remote/jira-adf.d.ts +35 -0
- package/dist/commands/pjm/remote/jira-adf.d.ts.map +1 -0
- package/dist/commands/pjm/remote/jira-adf.js +169 -0
- package/dist/commands/pjm/remote/lifecycle.d.ts +163 -0
- package/dist/commands/pjm/remote/lifecycle.d.ts.map +1 -0
- package/dist/commands/pjm/remote/lifecycle.js +224 -0
- package/dist/commands/pjm/remote/local-projection.d.ts +30 -0
- package/dist/commands/pjm/remote/local-projection.d.ts.map +1 -0
- package/dist/commands/pjm/remote/local-projection.js +95 -0
- package/dist/commands/pjm/remote/managed-markdown.d.ts +30 -0
- package/dist/commands/pjm/remote/managed-markdown.d.ts.map +1 -0
- package/dist/commands/pjm/remote/managed-markdown.js +128 -0
- package/dist/commands/pjm/remote/migrate.d.ts +14 -0
- package/dist/commands/pjm/remote/migrate.d.ts.map +1 -0
- package/dist/commands/pjm/remote/migrate.js +32 -0
- package/dist/commands/pjm/remote/operation-state.d.ts +15 -0
- package/dist/commands/pjm/remote/operation-state.d.ts.map +1 -0
- package/dist/commands/pjm/remote/operation-state.js +143 -0
- package/dist/commands/pjm/remote/outbound-projection-safety.d.ts +25 -0
- package/dist/commands/pjm/remote/outbound-projection-safety.d.ts.map +1 -0
- package/dist/commands/pjm/remote/outbound-projection-safety.js +99 -0
- package/dist/commands/pjm/remote/output.d.ts +60 -0
- package/dist/commands/pjm/remote/output.d.ts.map +1 -0
- package/dist/commands/pjm/remote/output.js +48 -0
- package/dist/commands/pjm/remote/preview.d.ts +88 -0
- package/dist/commands/pjm/remote/preview.d.ts.map +1 -0
- package/dist/commands/pjm/remote/preview.js +154 -0
- package/dist/commands/pjm/remote/provider-conformance.d.ts +13 -0
- package/dist/commands/pjm/remote/provider-conformance.d.ts.map +1 -0
- package/dist/commands/pjm/remote/provider-conformance.js +37 -0
- package/dist/commands/pjm/remote/provider.d.ts +57 -0
- package/dist/commands/pjm/remote/provider.d.ts.map +1 -0
- package/dist/commands/pjm/remote/provider.js +28 -0
- package/dist/commands/pjm/remote/providers/github-publication-safety.d.ts +46 -0
- package/dist/commands/pjm/remote/providers/github-publication-safety.d.ts.map +1 -0
- package/dist/commands/pjm/remote/providers/github-publication-safety.js +126 -0
- package/dist/commands/pjm/remote/providers/github.d.ts +207 -0
- package/dist/commands/pjm/remote/providers/github.d.ts.map +1 -0
- package/dist/commands/pjm/remote/providers/github.js +1456 -0
- package/dist/commands/pjm/remote/providers/jira.d.ts +245 -0
- package/dist/commands/pjm/remote/providers/jira.d.ts.map +1 -0
- package/dist/commands/pjm/remote/providers/jira.js +1650 -0
- package/dist/commands/pjm/remote/providers/linear.d.ts +182 -0
- package/dist/commands/pjm/remote/providers/linear.d.ts.map +1 -0
- package/dist/commands/pjm/remote/providers/linear.js +1289 -0
- package/dist/commands/pjm/remote/purpose-policy.d.ts +29 -0
- package/dist/commands/pjm/remote/purpose-policy.d.ts.map +1 -0
- package/dist/commands/pjm/remote/purpose-policy.js +118 -0
- package/dist/commands/pjm/remote/reconcile.d.ts +42 -0
- package/dist/commands/pjm/remote/reconcile.d.ts.map +1 -0
- package/dist/commands/pjm/remote/reconcile.js +101 -0
- package/dist/commands/pjm/remote/resolution.d.ts +122 -0
- package/dist/commands/pjm/remote/resolution.d.ts.map +1 -0
- package/dist/commands/pjm/remote/resolution.js +243 -0
- package/dist/commands/pjm/remote/schema.d.ts +9309 -0
- package/dist/commands/pjm/remote/schema.d.ts.map +1 -0
- package/dist/commands/pjm/remote/schema.js +1503 -0
- package/dist/commands/pjm/remote/service.d.ts +20 -0
- package/dist/commands/pjm/remote/service.d.ts.map +1 -0
- package/dist/commands/pjm/remote/service.js +5121 -0
- package/dist/commands/pjm/remote/shared-storage.d.ts +36 -0
- package/dist/commands/pjm/remote/shared-storage.d.ts.map +1 -0
- package/dist/commands/pjm/remote/shared-storage.js +110 -0
- package/dist/commands/pjm/remote/snapshot.d.ts +32 -0
- package/dist/commands/pjm/remote/snapshot.d.ts.map +1 -0
- package/dist/commands/pjm/remote/snapshot.js +140 -0
- package/dist/commands/pjm/remote/storage-locator.d.ts +29 -0
- package/dist/commands/pjm/remote/storage-locator.d.ts.map +1 -0
- package/dist/commands/pjm/remote/storage-locator.js +62 -0
- package/dist/commands/pjm/remote/store.d.ts +85 -0
- package/dist/commands/pjm/remote/store.d.ts.map +1 -0
- package/dist/commands/pjm/remote/store.js +553 -0
- package/dist/commands/pjm/remote/verification.d.ts +40 -0
- package/dist/commands/pjm/remote/verification.d.ts.map +1 -0
- package/dist/commands/pjm/remote/verification.js +100 -0
- package/dist/commands/project/dispatch-ceiling/index.d.ts.map +1 -1
- package/dist/commands/project/dispatch-ceiling/index.js +32 -18
- package/dist/commands/project/log/append.d.ts +48 -0
- package/dist/commands/project/log/append.d.ts.map +1 -1
- package/dist/commands/project/log/append.js +207 -30
- package/dist/commands/project/log/check.d.ts +87 -1
- package/dist/commands/project/log/check.d.ts.map +1 -1
- package/dist/commands/project/log/check.js +139 -5
- package/dist/commands/project/log/grammar.d.ts +165 -0
- package/dist/commands/project/log/grammar.d.ts.map +1 -1
- package/dist/commands/project/log/grammar.js +219 -1
- package/dist/commands/project/log/rollup.d.ts +16 -1
- package/dist/commands/project/log/rollup.d.ts.map +1 -1
- package/dist/commands/project/log/rollup.js +22 -2
- package/dist/commands/project/log/synthesize.d.ts +16 -0
- package/dist/commands/project/log/synthesize.d.ts.map +1 -1
- package/dist/commands/project/log/synthesize.js +85 -9
- package/dist/commands/status/index.d.ts.map +1 -1
- package/dist/commands/status/index.js +24 -2
- package/dist/commands/sync/apply.d.ts.map +1 -1
- package/dist/commands/sync/apply.js +6 -4
- package/dist/commands/tools/shared/pack-manifest.d.ts.map +1 -1
- package/dist/commands/tools/shared/pack-manifest.js +1 -0
- package/dist/config/dispatch-matrix.d.ts.map +1 -1
- package/dist/config/dispatch-matrix.js +13 -5
- package/dist/config/oat-config.d.ts +41 -0
- package/dist/config/oat-config.d.ts.map +1 -1
- package/dist/config/oat-config.js +247 -9
- package/dist/config/own-keys.d.ts +22 -0
- package/dist/config/own-keys.d.ts.map +1 -0
- package/dist/config/own-keys.js +32 -0
- package/dist/config/resolve.d.ts +11 -0
- package/dist/config/resolve.d.ts.map +1 -1
- package/dist/config/resolve.js +35 -11
- package/dist/config/sync-config.d.ts.map +1 -1
- package/dist/config/sync-config.js +16 -0
- package/dist/drift/detector.d.ts.map +1 -1
- package/dist/drift/detector.js +52 -1
- package/dist/drift/skill-view-diagnostic.d.ts.map +1 -1
- package/dist/drift/skill-view-diagnostic.js +2 -23
- package/dist/engine/compute-plan.d.ts.map +1 -1
- package/dist/engine/compute-plan.js +22 -72
- package/dist/engine/managed-copy-hash.d.ts +69 -0
- package/dist/engine/managed-copy-hash.d.ts.map +1 -0
- package/dist/engine/managed-copy-hash.js +175 -0
- package/dist/fs/assets.d.ts +11 -0
- package/dist/fs/assets.d.ts.map +1 -1
- package/dist/fs/assets.js +1 -1
- package/dist/manifest/hash.d.ts +110 -0
- package/dist/manifest/hash.d.ts.map +1 -1
- package/dist/manifest/hash.js +111 -13
- package/dist/providers/ceiling/registry.d.ts.map +1 -1
- package/dist/providers/ceiling/registry.js +6 -1
- package/dist/providers/identity/dispatch-report.d.ts.map +1 -1
- package/dist/providers/identity/dispatch-report.js +4 -1
- package/dist/release/public-package-contract.d.ts.map +1 -1
- package/dist/release/public-package-contract.js +21 -0
- package/dist/validation/skills.d.ts.map +1 -1
- package/dist/validation/skills.js +305 -40
- package/package.json +2 -2
|
@@ -15,6 +15,7 @@ For the deep file-by-file reference, see:
|
|
|
15
15
|
- [File Locations](../reference/file-locations.md)
|
|
16
16
|
- [`.oat` Directory Structure](../reference/oat-directory-structure.md)
|
|
17
17
|
- [Sync Config (`.oat/sync/config.json`)](../provider-sync/config.md)
|
|
18
|
+
- [Remote Project Management](remote-project-management.md)
|
|
18
19
|
|
|
19
20
|
## The five config surfaces
|
|
20
21
|
|
|
@@ -51,7 +52,7 @@ What each command is for:
|
|
|
51
52
|
- `oat config list` shows the currently resolved command-surface values for shared and repo-local keys.
|
|
52
53
|
- `oat config get <key>` reads one supported key value.
|
|
53
54
|
- `oat config set <key> <value>` updates supported shared or repo-local keys.
|
|
54
|
-
- `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,
|
|
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).
|
|
55
56
|
- `oat config describe` shows the supported config catalog across shared repo, repo-local, user, and sync/provider surfaces.
|
|
56
57
|
- `oat config describe <key>` shows file, scope, default, mutability, owning command, and description for one key.
|
|
57
58
|
|
|
@@ -92,7 +93,7 @@ Common keys in `.oat/config.json`:
|
|
|
92
93
|
- `git.defaultBranch` — base branch fallback for PR workflows
|
|
93
94
|
- `documentation.root`, `documentation.tooling`, `documentation.config` — docs-surface ownership
|
|
94
95
|
- `documentation.excludes` — a JSON array of globs, relative to the docs directory, that `oat docs generate-index` leaves out of the generated index. `oat config set` takes the list as one comma-separated value (`"a/**,b.md"`) and stores it as an array; repeated `--exclude` flags extend it, and an empty value clears the key
|
|
95
|
-
- `documentation.instructionPointerExcludes` — a JSON array of repository-relative directories that `oat instructions sync` and `oat instructions validate` must not treat as pointer sites, additive to the documentation content root they already skip by default (see [Instruction Sync](../provider-sync/instruction-sync.md#documentation-trees)). `oat config set` takes the list as one comma-separated value (`"vendor/generated,apps/oat-docs/docs"`) and stores it as an array of repository-relative POSIX paths, trimmed and de-duplicated; an empty value clears the key, and `oat config unset documentation.instructionPointerExcludes` removes it. An entry that could never exclude anything — an absolute path, or one escaping the repository with `..` — is rejected with exit code `1` rather than stored. A structurally malformed value already on disk (a non-array, or an empty or non-string entry) is rejected with exit code `2` and a repair message, and `oat config set` can still replace it. Entries that are well formed but cannot exclude anything — among them absolute paths, paths escaping the repository, paths that match no directory (matching is case-sensitive), and the unexcludable `.oat/repo` carve-in root — never abort the command; they are reported as warnings and are not counted as protection. Warnings go to stderr in human mode and to the `exclusionWarnings` field under `--json`
|
|
96
|
+
- `documentation.instructionPointerExcludes` — a JSON array of repository-relative directories that `oat instructions sync` and `oat instructions validate` must not treat as pointer sites, additive to the documentation content root they already skip by default (see [Instruction Sync](../provider-sync/instruction-sync.md#documentation-trees)). `oat config set` takes the list as one comma-separated value (`"vendor/generated,apps/oat-docs/docs"`) and stores it as an array of repository-relative POSIX paths, trimmed and de-duplicated; an empty value clears the key, and `oat config unset documentation.instructionPointerExcludes` removes it. An entry that could never exclude anything — an absolute path, or one escaping the repository with `..` — is rejected with exit code `1` rather than stored. A structurally malformed value already on disk (a non-array, or an empty or non-string entry) is rejected with exit code `2` and a repair message, and `oat config set` can still replace it. Entries that are well formed but cannot exclude anything — among them absolute paths, paths escaping the repository, paths that match no directory (matching is case-sensitive, and the warning names the on-disk spelling when the path differs only in case), paths that resolve elsewhere through a symlink (the warning names the resolved target instead of blaming case-sensitivity), and the unexcludable `.oat/repo` carve-in root — never abort the command; they are reported as warnings and are not counted as protection. Warnings go to stderr in human mode and to the `exclusionWarnings` field under `--json`
|
|
96
97
|
- `documentation.requireForProjectCompletion` — whether docs sync is a completion gate
|
|
97
98
|
- `archive.s3Uri` — base S3 archive prefix
|
|
98
99
|
- `archive.s3SyncOnComplete` — upload archived projects to S3 during completion
|
|
@@ -101,10 +102,27 @@ Common keys in `.oat/config.json`:
|
|
|
101
102
|
- `archive.awsProfile` — optional AWS named profile forwarded as `AWS_PROFILE` to every `aws` invocation in archive flows
|
|
102
103
|
- `archive.awsRegion` — optional AWS region forwarded as `AWS_REGION` to every `aws` invocation in archive flows
|
|
103
104
|
- `tools.<pack>` — project-scope intent for a bundled tool pack (`true` or absent)
|
|
105
|
+
- `pjm.remote.storage.state` — `local` by default; `shared` requires an
|
|
106
|
+
explicit preview and fresh approval and is unavailable to local projects
|
|
107
|
+
- `pjm.remote.policy.description` — `none`, `managed-section`, or `replace`;
|
|
108
|
+
the default is `none`
|
|
109
|
+
- `pjm.remote.policy.authority.*` — repository defaults and operation-specific
|
|
110
|
+
authority for remote creates, field updates, transitions, annotations,
|
|
111
|
+
deletion, relink, detach, and recreate; the default is `read-only`
|
|
112
|
+
- `pjm.remote.policy.providers.<provider>.*` — optional GitHub, Linear, or Jira
|
|
113
|
+
replacement policy; its operation override or default may broaden the
|
|
114
|
+
repository result before later restrictions apply
|
|
104
115
|
- `pjm.initialized` / `pjm.schemaVersion` — explicit repository PJM adoption written by `oat pjm init`
|
|
105
116
|
- `workflow.gates.skills` / `workflow.gates.execTargets` — per-skill gates and cross-runtime exec targets; manage with `oat gate`
|
|
106
117
|
- `workflow.gateTimeouts.code` / `workflow.gateTimeouts.artifact` — default review budgets in milliseconds
|
|
107
118
|
|
|
119
|
+
Remote authority resolves the repository operation override, repository
|
|
120
|
+
default, or built-in read-only fallback first. Matching provider policy replaces
|
|
121
|
+
that result. Binding defaults and operation restrictions then clamp authority,
|
|
122
|
+
and purpose field grants intersect to narrow outbound fields. No configured
|
|
123
|
+
layer bypasses hard approval floors or current caller-owned authority evidence;
|
|
124
|
+
missing, stale, or mismatched evidence fails closed.
|
|
125
|
+
|
|
108
126
|
Tool-pack intent example:
|
|
109
127
|
|
|
110
128
|
```bash
|
|
@@ -256,6 +274,19 @@ packaged `assets/` directory next to the installed CLI. Setting a non-empty
|
|
|
256
274
|
unset the override, never to rebuild or reinstall the CLI; a packaged-bundle
|
|
257
275
|
failure keeps the rebuild/reinstall guidance. A directory that exists but
|
|
258
276
|
cannot be read reports the underlying error code.
|
|
277
|
+
- The published npm tarball is held to the same seven-directory shape. The
|
|
278
|
+
CLI's public-package contract names a concrete file under each of the seven
|
|
279
|
+
directories, and release validation requires each one in the build workspace
|
|
280
|
+
and again in the packed tarball. The tarball check is the stronger of the two,
|
|
281
|
+
because a path can exist in the workspace and still never reach the tarball —
|
|
282
|
+
an empty directory that `npm pack` drops, or a `files`/symlink exclusion. So a
|
|
283
|
+
published package cannot ship a bundle whose top-level shape would fail
|
|
284
|
+
`validateBundleStructure`. That is a narrower promise than the exit-2 list
|
|
285
|
+
above: release validation does not check bundle metadata beyond its presence,
|
|
286
|
+
so a malformed or version-mismatched `bundle-metadata.json` is not covered.
|
|
287
|
+
The regression evidence is the negative pack control in
|
|
288
|
+
`packages/cli/src/release/public-package-contract.test.ts`:
|
|
289
|
+
`fails release validation when a required bundle directory is empty in the tarball`.
|
|
259
290
|
- Produce a matching bundle with `bash packages/cli/scripts/bundle-assets.sh`
|
|
260
291
|
while `OAT_ASSETS_DIR` points at the target directory (the script already
|
|
261
292
|
honors the variable as its destination).
|
|
@@ -14,6 +14,7 @@ Use this section when you want bootstrap guidance, tool-pack lifecycle details,
|
|
|
14
14
|
- [CLI Bootstrap](bootstrap.md) - Foundational `oat init` guidance outside provider-sync-specific onboarding.
|
|
15
15
|
- [Tool Packs and Installed Assets](tool-packs.md) - Bundled packs and `oat tools` lifecycle commands.
|
|
16
16
|
- [Configuration](configuration.md) - OAT configuration guidance across shared, local, user, and provider-sync surfaces.
|
|
17
|
+
- [Remote Project Management](remote-project-management.md) - Provider-neutral remote bindings, policy, previews, approvals, storage, and recovery.
|
|
17
18
|
- [Config and Local State](config-and-local-state.md) - Utility command groups for config, local state, diagnostics, and related inspection flows.
|
|
18
19
|
- [Project Log](project-log.md) - Append-only project observations, synthesis, inspection, and durable roll-up.
|
|
19
20
|
- [Backlog Lifecycle](backlog-lifecycle.md) - Backlog item states, atomic close-out with `oat backlog archive`, and lifecycle drift detection in `oat pjm doctor`.
|
|
@@ -51,6 +52,7 @@ Use CLI Utilities when:
|
|
|
51
52
|
- Use [CLI Bootstrap](bootstrap.md) when you are starting with `oat init`.
|
|
52
53
|
- Go to [Tool Packs](tool-packs.md) when you are managing bundled OAT packs and installed assets.
|
|
53
54
|
- Read [Configuration](configuration.md) for config semantics, or [Config and Local State](config-and-local-state.md) for inspection and diagnostic command groups.
|
|
55
|
+
- Read [Remote Project Management](remote-project-management.md) before binding local planning records to GitHub, Linear, or Jira.
|
|
54
56
|
- Use [Workflow Gates](workflow-gates.md) when you want a skill to run a configured final command before it is considered done.
|
|
55
57
|
|
|
56
58
|
## Common Tasks
|
|
@@ -66,5 +68,6 @@ Use CLI Utilities when:
|
|
|
66
68
|
- [CLI Bootstrap](bootstrap.md) - Foundational `oat init` guidance outside provider-sync-specific onboarding.
|
|
67
69
|
- [Tool Packs](tool-packs.md) - Bundled packs and `oat tools` lifecycle commands.
|
|
68
70
|
- [Configuration](configuration.md) - OAT configuration guidance.
|
|
71
|
+
- [Remote Project Management](remote-project-management.md) - Safely operate explicit remote planning-record bindings.
|
|
69
72
|
- [Config and Local State](config-and-local-state.md) - Utility command groups for config, local state, diagnostics, and related inspection flows.
|
|
70
73
|
- [Workflow Gates](workflow-gates.md) - Per-skill final commands and cross-runtime review dispatch.
|
|
@@ -77,8 +77,10 @@ Two optional flags let an interrupted append be replayed safely:
|
|
|
77
77
|
|
|
78
78
|
- `--idempotency-key <key>` — skip the append when an existing entry body
|
|
79
79
|
already carries `key`, reporting `already-appended` instead of writing a
|
|
80
|
-
duplicate. The key must appear in `--body
|
|
81
|
-
recognizes the entry it already wrote
|
|
80
|
+
duplicate. The key must appear in `--body` as its own whitespace-delimited
|
|
81
|
+
word, since that is how a replay recognizes the entry it already wrote; a key
|
|
82
|
+
glued to varying text such as a timestamp never matches its earlier self.
|
|
83
|
+
Deduplication does not require `--commit`.
|
|
82
84
|
- `--commit` — stage and commit the log after appending, retrying a bounded
|
|
83
85
|
three attempts when the failure is a transient `.git/index.lock`.
|
|
84
86
|
|
|
@@ -101,6 +103,14 @@ instead.
|
|
|
101
103
|
|
|
102
104
|
Run `oat project log append --help` for the complete entry contract.
|
|
103
105
|
|
|
106
|
+
Bodies may use line feeds or CRLF line endings. A CRLF body is accepted and
|
|
107
|
+
stored normalized to line feeds, and the result then carries
|
|
108
|
+
`normalizedLineEndings: true`, so the bytes on disk are known to differ from the
|
|
109
|
+
bytes passed. A lone carriage return, U+2028, or U+2029 anywhere in a body — including
|
|
110
|
+
at its very start or end — is refused, because those are the terminators the
|
|
111
|
+
log's readers do not all agree about. Structural entries take one line and
|
|
112
|
+
accept no line terminator at all.
|
|
113
|
+
|
|
104
114
|
## Automatic workflow integration
|
|
105
115
|
|
|
106
116
|
When project logging is enabled, OAT lifecycle surfaces append structural
|
|
@@ -149,6 +159,25 @@ oat project log check --project .oat/projects/shared/example --json
|
|
|
149
159
|
entry counts by class, type, and scope; the last entry date; and invalid
|
|
150
160
|
hand-written headings. It reads only `project-log.md`.
|
|
151
161
|
|
|
162
|
+
It also reports whether the log carries a completion seal:
|
|
163
|
+
|
|
164
|
+
- `sealed`: `true` once the log holds a structural entry whose producer is
|
|
165
|
+
`oat-project-complete` and whose ref is `seal`. Both halves are required — a
|
|
166
|
+
`seal` ref from another producer is an ordinary entry.
|
|
167
|
+
- `seal`: `null` when unsealed, otherwise the first seal's `heading` and
|
|
168
|
+
`date`, whether it is `keyed`, and the `count` of seal entries. A `count`
|
|
169
|
+
above one is a log sealed twice before the seal append became idempotent.
|
|
170
|
+
|
|
171
|
+
`status` keeps its `ok` / `absent` / `synthesis_pending` values on a sealed log;
|
|
172
|
+
sealing is reported alongside the status, not as a status value. The one
|
|
173
|
+
additional status is `ambiguous`: a `##` heading, or a dated `###` entry
|
|
174
|
+
heading, starts a line after a lone carriage return, U+2028, or U+2029 rather
|
|
175
|
+
than a line feed, so the log's structure can be read two ways; or a seal is
|
|
176
|
+
physically present outside the parseable `## Entries` region. `check` then
|
|
177
|
+
exits 1 and reports an `ambiguity` reason instead of a clean verdict, every
|
|
178
|
+
writing command (`append`, `synthesize`, `rollup`) refuses the same file, and
|
|
179
|
+
the lifecycle skills stop rather than treat the log as empty.
|
|
180
|
+
|
|
152
181
|
Use `--require-synthesis` to exit with status 1 while synthesis is pending:
|
|
153
182
|
|
|
154
183
|
```bash
|
|
@@ -156,7 +185,8 @@ oat project log check --require-synthesis
|
|
|
156
185
|
```
|
|
157
186
|
|
|
158
187
|
Without that flag, normal `absent`, `ok`, and `synthesis_pending` results exit
|
|
159
|
-
successfully so lifecycle skills can decide whether to warn or enforce
|
|
188
|
+
successfully so lifecycle skills can decide whether to warn or enforce;
|
|
189
|
+
`ambiguous` always exits 1.
|
|
160
190
|
|
|
161
191
|
## Complete the synthesis
|
|
162
192
|
|
|
@@ -201,15 +231,44 @@ deduplicate by date and area. The command is idempotent.
|
|
|
201
231
|
|
|
202
232
|
The structured result contains:
|
|
203
233
|
|
|
204
|
-
- `status`: `ok` or `
|
|
234
|
+
- `status`: `ok`, `failed`, or `ambiguous`
|
|
205
235
|
- `summarySection`: `written` or `updated`
|
|
206
236
|
- `ledgerOutcome`: `appended`, `deduplicated`, `skipped_permitted`, or `failed`
|
|
207
237
|
- `entriesRolledUp`: number of log entries written to the summary section
|
|
208
238
|
|
|
239
|
+
An `ambiguous` result carries only `status` and an `ambiguity` reason, and exits
|
|
240
|
+
1: the log's structure has two readings, so no count would mean anything and
|
|
241
|
+
neither `summary.md` nor the ledger is written. The other fields are absent
|
|
242
|
+
rather than zeroed, because `entriesRolledUp: 0` for an unreadable log is
|
|
243
|
+
indistinguishable from the same result for an empty one.
|
|
244
|
+
|
|
209
245
|
`skipped_permitted` means the default repository reference layer is absent and
|
|
210
246
|
no ledger path was explicitly configured; `status` remains `ok`. An explicitly
|
|
211
247
|
configured ledger write failure returns `status: "failed"`. Completion must not
|
|
212
248
|
seal or archive a project with entries until roll-up reports `status: "ok"`.
|
|
213
249
|
|
|
250
|
+
## The completion seal
|
|
251
|
+
|
|
252
|
+
The seal is the last entry a project log may ever receive, and `append`
|
|
253
|
+
enforces that rather than leaving it to convention:
|
|
254
|
+
|
|
255
|
+
- Replaying the seal reports `already-appended` and leaves exactly one seal
|
|
256
|
+
entry. This holds for a seal carrying the completion skill's
|
|
257
|
+
`oat-seal:<project>` key and for an unkeyed seal written before that
|
|
258
|
+
convention, which is recognized by its heading instead.
|
|
259
|
+
- Every append carrying **new** content is refused with `status: "sealed"` and a
|
|
260
|
+
non-zero exit, naming the seal that closed the log.
|
|
261
|
+
- A replay that `--idempotency-key` recognizes as its own earlier entry is the
|
|
262
|
+
one exception: it reports `already-appended` and exits 0 even on a sealed log.
|
|
263
|
+
Nothing is appended — the entry it finds necessarily predates the seal — so
|
|
264
|
+
the seal stays the final entry. This is what keeps a gate
|
|
265
|
+
partial-finalization receipt replayable after the project is completed. The
|
|
266
|
+
key matches a whole word in an existing entry body, so an unrelated append
|
|
267
|
+
whose key happens to occur in some earlier entry is reported the same way
|
|
268
|
+
and likewise writes nothing.
|
|
269
|
+
|
|
270
|
+
A resumed completion therefore reads `sealed` from `check` and skips the
|
|
271
|
+
roll-up and the seal instead of duplicating them.
|
|
272
|
+
|
|
214
273
|
`rollup` requires an existing `summary.md`; summary authoring remains the
|
|
215
274
|
responsibility of the project summary workflow.
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Remote Project Management
|
|
3
|
+
description: Safely bind OAT planning records to GitHub, Linear, or Jira through provider-neutral host capabilities.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Remote Project Management
|
|
7
|
+
|
|
8
|
+
Remote project management connects an OAT backlog item or project to a remote
|
|
9
|
+
GitHub, Linear, or Jira record. OAT owns policy, previews, approvals, durable
|
|
10
|
+
operation state, and authoritative read-back verification. The host agent owns
|
|
11
|
+
live execution capability discovery.
|
|
12
|
+
|
|
13
|
+
Remote management is deliberately explicit. It does not turn every plan task
|
|
14
|
+
into a remote issue, run background synchronization, or treat a provider result
|
|
15
|
+
as proof of success.
|
|
16
|
+
|
|
17
|
+
## Prerequisite
|
|
18
|
+
|
|
19
|
+
Confirm that file-backed project management is adopted before using a remote
|
|
20
|
+
command:
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
oat pjm doctor --json
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
Continue only when `adoption.state` is `declared` or `inferred-legacy`. Run
|
|
27
|
+
`oat pjm init` first when adoption is absent or only partially initialized.
|
|
28
|
+
|
|
29
|
+
## Lifecycle operations
|
|
30
|
+
|
|
31
|
+
The command family is `oat pjm remote`:
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
oat pjm remote intake github:example/repository#123 --to-backlog BL-123 --capability-evidence-stdin --json
|
|
35
|
+
oat pjm remote publish --binding rb_example --capability-evidence-stdin --json
|
|
36
|
+
oat pjm remote refresh --binding rb_example --capability-evidence-stdin --json
|
|
37
|
+
oat pjm remote reconcile --binding rb_example --capability-evidence-stdin --json
|
|
38
|
+
oat pjm remote closeout --project .oat/projects/shared/example --capability-evidence-stdin --json
|
|
39
|
+
oat pjm remote discussion --binding rb_example --limit 20 --capability-evidence-stdin --json
|
|
40
|
+
oat pjm remote resolve relink --binding rb_example github:example/repository#456 --capability-evidence-stdin --json
|
|
41
|
+
oat pjm remote resolve detach --binding rb_example --json
|
|
42
|
+
oat pjm remote resolve recreate --binding rb_example --capability-evidence-stdin --json
|
|
43
|
+
oat pjm remote doctor --json
|
|
44
|
+
oat pjm remote migrate --check --json
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
Before each provider-contacting example, the host discovers live capability and
|
|
48
|
+
supplies only its bounded provider-neutral evidence on standard input. Mutation
|
|
49
|
+
commands also require the current caller-owned authority evidence requested by
|
|
50
|
+
their live help.
|
|
51
|
+
|
|
52
|
+
- `intake` reads one remote record into a selected local backlog target and
|
|
53
|
+
creates the binding.
|
|
54
|
+
- `publish` creates or updates one explicitly selected binding.
|
|
55
|
+
- `refresh` updates retained snapshots without writing remotely.
|
|
56
|
+
- `reconcile` classifies local, remote, and baseline changes before proposing
|
|
57
|
+
any write.
|
|
58
|
+
- `closeout` prepares a reviewed batch while preserving independent per-binding
|
|
59
|
+
outcomes.
|
|
60
|
+
- `discussion` returns one bounded, sanitized page as non-persisted evidence.
|
|
61
|
+
- `resolve relink`, `detach`, and `recreate` handle anomalous bindings without
|
|
62
|
+
discarding identity history or retrying an uncertain create blindly.
|
|
63
|
+
- `doctor` and `migrate` diagnose or repair local records without contacting a
|
|
64
|
+
provider.
|
|
65
|
+
|
|
66
|
+
Use `--help` on the live command for current options. JSON output uses one
|
|
67
|
+
versioned envelope and may return a nonzero shell exit for a safely persisted
|
|
68
|
+
`pending`, `needs-review`, `partial`, `uncertain`, or `blocked` outcome.
|
|
69
|
+
|
|
70
|
+
## Repository-owned policy
|
|
71
|
+
|
|
72
|
+
Remote policy lives only in the shared repository config at `.oat/config.json`.
|
|
73
|
+
The safe defaults are local operational state, no description publication, and
|
|
74
|
+
read-only authority:
|
|
75
|
+
|
|
76
|
+
```json
|
|
77
|
+
{
|
|
78
|
+
"pjm": {
|
|
79
|
+
"remote": {
|
|
80
|
+
"schemaVersion": 1,
|
|
81
|
+
"storage": { "state": "local" },
|
|
82
|
+
"policy": {
|
|
83
|
+
"description": "none",
|
|
84
|
+
"authority": { "default": "read-only" }
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
Use the config command instead of editing nested values by hand:
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
oat config set pjm.remote.policy.description managed-section --shared
|
|
95
|
+
oat config set pjm.remote.policy.authority.operations.update-fields user-approved --shared
|
|
96
|
+
oat config set pjm.remote.policy.providers.github.authority.operations.create user-approved --shared
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
Description modes are `none`, `managed-section`, and `replace`. Authority modes
|
|
100
|
+
are `read-only`, `user-approved`, `user-authorized`, and `autonomous`.
|
|
101
|
+
For each operation, OAT resolves the repository operation override, then its
|
|
102
|
+
repository default, then the built-in read-only fallback. A matching provider
|
|
103
|
+
operation override or provider default replaces that repository result and may
|
|
104
|
+
broaden it. Binding defaults and operation restrictions then clamp authority,
|
|
105
|
+
while purpose field grants intersect to narrow the outbound fields. Provider
|
|
106
|
+
configuration never bypasses hard approval floors or the requirement for
|
|
107
|
+
current caller-owned authority evidence; missing, stale, or mismatched evidence
|
|
108
|
+
fails closed. Autonomous configuration is not a background grant.
|
|
109
|
+
|
|
110
|
+
## Live host capability boundary
|
|
111
|
+
|
|
112
|
+
At operation time, the host agent inspects currently granted MCP or connector
|
|
113
|
+
descriptions for the requested semantic operation and exact account, workspace,
|
|
114
|
+
site, or repository context. If no capable connector is available, it may
|
|
115
|
+
inspect the live help of an already configured provider CLI before the first
|
|
116
|
+
provider-contacting command.
|
|
117
|
+
|
|
118
|
+
OAT does not store provider tool names, native schemas, captured catalogs,
|
|
119
|
+
executable names, flags, or CLI dialects. The host returns only bounded,
|
|
120
|
+
sanitized capability evidence through `--capability-evidence-stdin`. It must not
|
|
121
|
+
install tools, request credential values, or switch execution surfaces after an
|
|
122
|
+
attempt begins. The CLI may then emit one provider-neutral `externalAction`.
|
|
123
|
+
The host executes that exact action at most once and returns one bounded
|
|
124
|
+
observation with `oat pjm remote operation continue`.
|
|
125
|
+
|
|
126
|
+
## Content and outbound safety
|
|
127
|
+
|
|
128
|
+
Inbound provider text is retained only through an allowlist of core fields and
|
|
129
|
+
adapter-approved extensions. If a retained text field triggers a conservative
|
|
130
|
+
sensitive-content signal, OAT suppresses that whole field and marks the
|
|
131
|
+
snapshot incomplete. This is a bounded field-safety rule, not general DLP or
|
|
132
|
+
credential-value parsing.
|
|
133
|
+
|
|
134
|
+
Every remote create or update consumes only an explicit normalized projection.
|
|
135
|
+
The universal provider-neutral pre-write gate evaluates that projection before
|
|
136
|
+
preview, approval, action, and authoritative read-back. It never scans the
|
|
137
|
+
repository, worktree, Git history, or arbitrary files for secrets. Missing,
|
|
138
|
+
stale, failed, or blocked safety evidence prevents execution.
|
|
139
|
+
|
|
140
|
+
## Previews, approval floors, and uncertainty
|
|
141
|
+
|
|
142
|
+
Mutation-capable commands persist and return a preview before execution. The
|
|
143
|
+
preview digest binds the target, normalized fields, remote revision,
|
|
144
|
+
capability, safety result, and effective policy. If any load-bearing input
|
|
145
|
+
changes, the approval is stale.
|
|
146
|
+
|
|
147
|
+
Fresh approval is always required for complete description replacement,
|
|
148
|
+
relink, detach, recreate, destructive operations, and promotion to shared
|
|
149
|
+
operational storage. `user-approved` authority also requires applying the exact
|
|
150
|
+
persisted preview. Higher configured authority cannot bypass those floors.
|
|
151
|
+
|
|
152
|
+
The host submits a bounded observation with `oat pjm remote operation continue`.
|
|
153
|
+
Only an OAT `ok` envelope after authoritative read-back means success. A
|
|
154
|
+
connector response, process exit, or visible remote change is evidence rather
|
|
155
|
+
than a verdict. If a create or update is uncertain, do not retry it blindly;
|
|
156
|
+
use the recovery guidance in the envelope so OAT can search, relink, recreate,
|
|
157
|
+
or reconcile without producing duplicates.
|
|
158
|
+
|
|
159
|
+
## Storage and worktrees
|
|
160
|
+
|
|
161
|
+
Portable binding metadata follows its backlog or project owner. Shared backlog
|
|
162
|
+
metadata lives under `.oat/repo/pjm/remote/bindings`; project metadata lives
|
|
163
|
+
under that project's `remote/bindings` directory. Local projects keep their
|
|
164
|
+
portable metadata in the local operational store.
|
|
165
|
+
|
|
166
|
+
Operational snapshots, journals, batches, and receipts default to a
|
|
167
|
+
repository-fingerprinted directory under the Git common directory:
|
|
168
|
+
`.git/oat/pjm-remote/<repository-fingerprint>/`. All linked worktrees for one
|
|
169
|
+
repository therefore share the same local operational state, while another
|
|
170
|
+
clone gets its own store.
|
|
171
|
+
|
|
172
|
+
Shared operational storage is opt-in and may expose remote planning content to
|
|
173
|
+
everyone with repository access. It requires a persisted preview and fresh
|
|
174
|
+
approval, and it is rejected for local projects. Preview the exact proposed
|
|
175
|
+
paths through `oat pjm remote storage shared --help` before applying them.
|
|
176
|
+
|
|
177
|
+
## Offline behavior
|
|
178
|
+
|
|
179
|
+
OAT can inspect portable bindings, the bounded local snapshot, journals,
|
|
180
|
+
receipts, and pending recovery instructions while offline. `remote doctor` and
|
|
181
|
+
`migrate` are local-only. Provider refresh, publication, reconciliation writes,
|
|
182
|
+
and authoritative verification remain pending or blocked until matching live
|
|
183
|
+
capability evidence is available; offline state never fabricates remote
|
|
184
|
+
freshness or success.
|
|
185
|
+
|
|
186
|
+
## Related references
|
|
187
|
+
|
|
188
|
+
- [Configuration](configuration.md)
|
|
189
|
+
- [CLI Reference](../reference/cli-reference.md)
|
|
190
|
+
- [File Locations](../reference/file-locations.md)
|
|
191
|
+
- [Troubleshooting](../reference/troubleshooting.md)
|
|
@@ -56,8 +56,8 @@ pnpm build:docs # builds docs site and its dependencies
|
|
|
56
56
|
```
|
|
57
57
|
|
|
58
58
|
`pnpm test` is composite: it runs the workspace vitest suites, then
|
|
59
|
-
`test:smoke` (`tools/smoke`), `test:skills` (`.agents/skills/*/tests`),
|
|
60
|
-
|
|
59
|
+
`test:smoke` (`tools/smoke`), `test:skills` (`.agents/skills/*/tests`), the
|
|
60
|
+
named-file `test:release` set, and last `test:scripts` (`scripts/worktree`). Steps 5 and 6 are the version-lockstep
|
|
61
61
|
gates; they are in the local list because they previously ran only in CI and
|
|
62
62
|
version-bump drift twice reached review with no local gate to surface it.
|
|
63
63
|
|
|
@@ -73,8 +73,12 @@ checkout with neither `origin/main` nor `main` skips the whole gate (CI uses
|
|
|
73
73
|
`fetch-depth: 0`). Test files under `packages/cli/src/` count as publishable
|
|
74
74
|
changes for this gate.
|
|
75
75
|
|
|
76
|
-
CI runs neither `pnpm lint` nor `pnpm format`
|
|
77
|
-
|
|
76
|
+
CI runs neither `pnpm lint` nor `pnpm format`. `pnpm check` now covers the
|
|
77
|
+
formatting of `.agents/skills/**`, `apps/oat-docs/docs`, and `tools/smoke`
|
|
78
|
+
through `format:root`, but `pnpm lint`'s root `oxlint` pass over `tools/smoke`
|
|
79
|
+
and `.agents/skills`, and `packages/control-plane`'s `format` (it defines no
|
|
80
|
+
`check` script), still run in no CI gate — run both whenever a change touches
|
|
81
|
+
those paths.
|
|
78
82
|
For narrower changes, use package-specific checks when possible, but do not
|
|
79
83
|
merge without passing the relevant workspace gates.
|
|
80
84
|
|
|
@@ -203,15 +203,19 @@ resolution. `resolveSkillVersion` in
|
|
|
203
203
|
`packages/cli/src/commands/shared/frontmatter.ts` owns that order, so the
|
|
204
204
|
runtime helper and the validators cannot disagree.
|
|
205
205
|
|
|
206
|
-
The top-level `version` field remains supported as a deprecated alias
|
|
207
|
-
|
|
208
|
-
`version
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
206
|
+
The top-level `version` field remains supported as a deprecated alias, and a
|
|
207
|
+
skill that declares it is now reported as an **error**. Every bundled skill
|
|
208
|
+
declares `metadata.version` and carries no top-level `version`, so
|
|
209
|
+
`pnpm oat:validate-skills` reports no alias findings on the bundled tree. The
|
|
210
|
+
alias is still read for third-party skills installed from packs, which may
|
|
211
|
+
carry it; it retires on the schedule recorded in
|
|
212
|
+
`DR-260908-bundled-skills-declare`. Step 1 of that schedule — promoting the
|
|
213
|
+
alias finding from a warning to an error — ships in the first release after
|
|
214
|
+
0.2.65 that changes the validator. Step 2 removes the resolver's top-level read
|
|
215
|
+
one release after that error has produced no findings on the bundled tree; it
|
|
216
|
+
is tracked by `BL-260908-remove-the-top-level-skill` and must account for the
|
|
217
|
+
canonical agent roles, which the bump gate now enforces while they still
|
|
218
|
+
declare the top-level field.
|
|
215
219
|
|
|
216
220
|
A skill that carries both fields with different values is a conflict. The
|
|
217
221
|
resolver reports the `metadata.version` value together with the conflict, and
|
|
@@ -220,7 +224,7 @@ than silently picking one, and canonical role resolution treats the identity as
|
|
|
220
224
|
invalid. The runtime version readers still return the `metadata.version` value,
|
|
221
225
|
so an installed-versus-bundled comparison keeps working while the conflict is
|
|
222
226
|
being fixed. Carrying both with the _same_ value resolves without a conflict and
|
|
223
|
-
without an alias
|
|
227
|
+
without an alias finding, because `metadata.version` wins. A bundled skill must
|
|
224
228
|
still carry `metadata.version` alone: the corpus sweep in
|
|
225
229
|
`packages/cli/src/validation/skills.test.ts` fails on any column-0 `version:`
|
|
226
230
|
line under `.agents/skills`, which is the only check that catches the
|
|
@@ -228,16 +232,24 @@ same-value case.
|
|
|
228
232
|
|
|
229
233
|
### The version is gated
|
|
230
234
|
|
|
231
|
-
Changing any canonical skill
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
+
Changing any bundled file of a canonical skill — anything under
|
|
236
|
+
`.agents/skills/<name>/` except `tests/`, because `tests/` is the one subtree
|
|
237
|
+
the bundle strips — requires bumping that skill's `metadata.version` in the
|
|
238
|
+
same PR, one bump per changed skill in the final PR diff, even if the skill was
|
|
239
|
+
edited multiple times on the branch. A change to a skill's `scripts/` or
|
|
240
|
+
`references/` therefore needs the bump just as an edit to `SKILL.md` does: both
|
|
241
|
+
ship to every `oat tools install` consumer. Changing a canonical agent role
|
|
242
|
+
under `.agents/agents/*.md` requires bumping that file's top-level `version:`;
|
|
243
|
+
agent roles deliberately keep the top-level field, so the gate accepts either
|
|
244
|
+
declaration shape and never demands `metadata.version` of them. The gate reads
|
|
245
|
+
the resolved version, so it enforces the bump whether the file declares
|
|
235
246
|
`metadata.version` or the top-level alias. The rule is enforced by
|
|
236
247
|
`pnpm run check:skill-bumps`, which runs locally (root `AGENTS.md` Definition
|
|
237
248
|
of Done) and in CI; a changed skill whose version matches `origin/main` fails
|
|
238
|
-
the gate. The
|
|
239
|
-
`check:skill-bumps` fails on any finding it receives
|
|
240
|
-
routed through it would fail every changed skill that still
|
|
249
|
+
the gate. The alias finding above is deliberately not part of that gate:
|
|
250
|
+
`check:skill-bumps` fails on any finding it receives regardless of severity, so
|
|
251
|
+
an alias finding routed through it would fail every changed skill that still
|
|
252
|
+
carried one.
|
|
241
253
|
|
|
242
254
|
## Practical Authoring Flow
|
|
243
255
|
|
|
@@ -132,11 +132,13 @@ Key behavior:
|
|
|
132
132
|
- treats explicitly supplied `--docs-dir` / `--output` paths as overrides resolved from the current directory
|
|
133
133
|
- fails with exit code `2` before generating or writing anything when an omitted path has no non-empty `documentation.root` to resolve against, or when the configured root is not a directory
|
|
134
134
|
- refuses unsafe output targets with exit code `1` before generation, for derived and explicit paths alike, comparing symlink-resolved paths: inside the docs directory it indexes, equal to `documentation.config`, or ending in `.yml` / `.yaml` in any case. A derived output whose existing file lacks the `AUTOGENERATED` header is refused too; naming that path with `--output` overwrites it explicitly. A refused target is an actionable flag error (`1`); unusable path configuration is a separate condition and exits `2`, so scripts can branch on the two
|
|
135
|
+
- refuses a symlink chain that exceeds its own 32-hop cap, naming the path you supplied or the CLI derived rather than an intermediate link, and addressing the flag that owns it: an unusable **output** chain names `--output` and exits `1`; an unusable **docs directory** chain names `--docs-dir` and, when the directory was derived from `documentation.root` rather than passed explicitly, also names the `oat config set documentation.root <path>` repair and exits `2` as unusable path configuration. That cap governs the dangling links the command walks itself; a chain the operating system refuses first surfaces as its own `ELOOP` error with exit `1`, which is what a too-deep chain reports on a platform whose own limit is 32 or lower
|
|
135
136
|
- writes configuration only for the Fumadocs manifest transition — recording the manifest it just wrote inside `documentation.root` in `documentation.index`, when `documentation.tooling` is `fumadocs` or the config declares neither `tooling` nor `config`. MkDocs configurations are never written, and `documentation.root` and `documentation.config` are never modified
|
|
136
137
|
- prepends an `AUTOGENERATED` warning comment to the output and rewrites the file on every run; do not hand-edit the generated `index.md`
|
|
137
138
|
- should be freshness-checked against authored `docs/**/index.md` `## Contents` maps before treating it as navigation evidence
|
|
138
139
|
- sorting: `index.md` first, then directories before files, then lexical
|
|
139
|
-
- reports the derived docs directory in human output and as `docsDir` / `docsDirSource` under `--json`
|
|
140
|
+
- reports the derived docs directory in human output and as `docsDir` / `docsDirSource` under `--json`, alongside `excludes` — the effective exclusion list, `documentation.excludes` merged with the `--exclude` flags exactly as it was handed to the generator
|
|
141
|
+
- says where to look when a manifest is empty rather than reporting a bare `0 entries`: which exclusion patterns were active, or that the docs directory held no indexable pages. The wording is observational — the command reports indexed entries, not pattern matches, so it names the exclusions without asserting they are the cause. An empty manifest is a report, not a failure — the file is still written, so a stale index is never left behind, and the command still exits `0`
|
|
140
142
|
- omits pages matching the exclusion list. Nothing is excluded by default; once listed, non-page Markdown such as `CLAUDE.md` or `AGENTS.md` stops reaching the manifest. Patterns come from `documentation.excludes` in `.oat/config.json` and from repeated `--exclude` flags, and the flags **extend** the configured list rather than replacing it. A directory left empty by exclusion emits no heading, and an empty list produces byte-identical output to no exclusions at all
|
|
141
143
|
|
|
142
144
|
Supported flags:
|
|
@@ -95,8 +95,8 @@ the manifest.
|
|
|
95
95
|
|
|
96
96
|
- `missing-additive` — active, supported, no manifest entry, nothing at the expected path: the only true projection gap
|
|
97
97
|
- `removed` — a manifest entry exists but the provider file is gone
|
|
98
|
-
- `modified` — a manifest entry exists and the view no longer agrees with what the last sync recorded, or its version has fallen behind canonical
|
|
99
|
-
- `in-sync` — a symlinked, collection-aliased, or natively read view _is_ the canonical file; a `copy` view matches the content recorded at its last sync
|
|
98
|
+
- `modified` — a manifest entry exists and the view no longer agrees with what the last sync recorded, or its version has fallen behind canonical
|
|
99
|
+
- `in-sync` — a symlinked, collection-aliased, or natively read view _is_ the canonical file; a `copy` view matches the content recorded at its last sync. A managed directory copy is compared with its OAT-managed banner and its `.oat-generated` sentinel excluded, so a freshly synced copy reads `in_sync` rather than drifted (owned by `skill-view-convergence.integration.test.ts`, "converges a copy-strategy skill directory")
|
|
100
100
|
- `untracked` — something exists at the expected path that no manifest entry tracks; stray detection skips provider entries whose name matches a canonical entry, so `oat status` does not report it as a stray and reports the untracked projection as `missing` instead
|
|
101
101
|
- `unverified` — the view's state is unknown: either a manifest entry arrived with no drift observation, or reading that one view failed and the row carries the redacted reason
|
|
102
102
|
- `inactive`, `unsupported`, `excluded` — no projection is expected in this scope, so none of them is reported as missing
|
|
@@ -173,22 +173,6 @@ declared values and says the comparison was skipped, so the ambiguity is
|
|
|
173
173
|
visible rather than silently resolved. When the resolver's answer happens to
|
|
174
174
|
agree with canonical, nothing is withheld and the detail says so instead.
|
|
175
175
|
|
|
176
|
-
### Known limitation: copy-strategy skill views
|
|
177
|
-
|
|
178
|
-
A `copy` skill view is reported `modified` immediately after a successful sync,
|
|
179
|
-
and stays that way. The engine writes an OAT-managed banner into the copied
|
|
180
|
-
`SKILL.md` and an `.oat-generated` sentinel beside it, and neither is accounted
|
|
181
|
-
for in the manifest hash, so `oat status` reports `drifted:modified` and every
|
|
182
|
-
later `oat sync --dry-run` plans another `update_copy`. Because no sync clears
|
|
183
|
-
that state, `oat tools info` prints no repair line when a `modified` copy's
|
|
184
|
-
version still matches canonical.
|
|
185
|
-
|
|
186
|
-
That suppression is a conservative heuristic rather than a proof: equal versions
|
|
187
|
-
do not establish equal bodies, so an edit to the canonical source or to the copy
|
|
188
|
-
that kept the version reaches the same branch, and a sync _would_ repair that
|
|
189
|
-
one. The class detail says so and names the concrete scope command to run if you
|
|
190
|
-
know either side was edited. Tracked as `BL-260908-make-copy-strategy-skill`.
|
|
191
|
-
|
|
192
176
|
## Stray adoption
|
|
193
177
|
|
|
194
178
|
`oat init` and `oat status` can offer adoption of unmanaged provider entries into canonical `.agents`.
|
|
@@ -14,6 +14,7 @@ The CLI is also a standalone value path. You can use `oat init`, `oat sync`, `oa
|
|
|
14
14
|
- [CLI Bootstrap](../cli-utilities/bootstrap.md) - Bootstrap a repo with `oat init`, guided setup, and initial provider adoption.
|
|
15
15
|
- [Tool Packs](../cli-utilities/tool-packs.md) - Install, update, inspect, migrate, and remove bundled OAT skills and agents at project or user scope.
|
|
16
16
|
- [Config and Local State](../cli-utilities/config-and-local-state.md) - Config, backlog, local paths, diagnostics, and related utility commands.
|
|
17
|
+
- [Remote Project Management](../cli-utilities/remote-project-management.md) - Explicit remote bindings, policy, host handoffs, and recovery.
|
|
17
18
|
- [Workflow Gates](../cli-utilities/workflow-gates.md) - Per-skill final commands, review gates, and cross-runtime prompt dispatch.
|
|
18
19
|
- [Docs Tooling Commands](../docs-tooling/commands.md) - Docs app scaffolding, migration, index generation, and nav sync.
|
|
19
20
|
- [Provider Sync](../provider-sync/index.md) - Sync behavior, provider capabilities, config, and drift management.
|
|
@@ -43,6 +44,7 @@ The first practical expansion path is to keep improving the existing owners: [Do
|
|
|
43
44
|
| `oat init` | Bootstrap canonical OAT directories, sync config, optional hooks, and guided setup. | [CLI Bootstrap](../cli-utilities/bootstrap.md) |
|
|
44
45
|
| `oat tools ...` | Install, inspect, update, remove, and migrate bundled OAT tool packs and assets across project and user scope. | [Tool Packs](../cli-utilities/tool-packs.md) |
|
|
45
46
|
| `oat pjm ...` | Adopt PJM for a repository and record it (`init`), run read-only adoption and reference diagnostics (`doctor`), and migrate legacy layouts to `pjm/` + `reference/` (`migrate`). Adoption is separate from pack placement. | [Install vs. initialize](../cli-utilities/tool-packs.md#install-vs-initialize) |
|
|
47
|
+
| `oat pjm remote ...` | Intake, publish, refresh, reconcile, close out, inspect discussion, resolve anomalies, diagnose, migrate, and continue durable host actions for explicit remote bindings. | [Remote Project Management](../cli-utilities/remote-project-management.md) |
|
|
46
48
|
| `oat decision ...` | Create, index, and migrate file-per-record repo decisions under `reference/decisions/` (`init`, `new`, `regenerate-index`, `migrate`). | [Config and Local State](../cli-utilities/config-and-local-state.md#oat-decision-) |
|
|
47
49
|
| `oat backlog ...` / `oat local ...` | File-backed backlog helpers, local path sync, and local-only operational support. | [Config and Local State](../cli-utilities/config-and-local-state.md) |
|
|
48
50
|
| `oat config ...` / `oat instructions ...` | Config discovery, source-aware config dumps, supported mutations, and instruction-integrity helpers. | [Config and Local State](../cli-utilities/config-and-local-state.md) |
|
|
@@ -134,6 +136,12 @@ Notable commands introduced in the current CLI surface:
|
|
|
134
136
|
never converted into a `recorded-absent` row or pull guidance.
|
|
135
137
|
- `oat tools migrate --pack <pack> --from <scope> --to <scope>` - move one installed pack between project and user scope. Always previews first, installs and re-inventories the destination before touching the source, and offers source removal only after the destination is verified complete. Declining or running non-interactively leaves the pack installed at both scopes rather than failing. `--dry-run` stops after the preview; there is no force flag. See [Tool Packs](../cli-utilities/tool-packs.md#oat-tools-migrate).
|
|
136
138
|
- `oat pjm doctor --json` - read-only repository PJM diagnostics whose result carries an additive `adoption` object (`state` of `declared` | `inferred-legacy` | `partial-initialization` | `none`, `repoRoot`, and `recovery`). This, not `oat tools has project-management`, is the check that answers whether _this repository_ adopted PJM.
|
|
139
|
+
- `oat pjm remote ... --json` - operate one explicit provider-neutral binding.
|
|
140
|
+
The family includes `intake`, `publish`, `refresh`, `reconcile`, `closeout`,
|
|
141
|
+
`discussion`, `resolve`, `doctor`, `migrate`, `storage`, and
|
|
142
|
+
`operation continue`. An `ok` envelope exits 0, a system `failed` envelope exits 2, and
|
|
143
|
+
every safely persisted nonterminal or blocked status exits 1. A `pending`
|
|
144
|
+
envelope with `externalAction` is a durable host handoff, not remote success.
|
|
137
145
|
- `oat config dump --json` - merged config with source attribution
|
|
138
146
|
- `oat project status --json` - full parsed state for the active tracked project. **Stable contract for skills:** the JSON output is a typed read interface for OAT skills; the field set consumed by migrated skills is locked by `MIGRATED_FIELDS` in `packages/cli/src/commands/project/status.test.ts`. Removing or renaming any of `project.{name, path, phase, phaseStatus, workflowMode, docsUpdated, lastCommit, prStatus, prUrl}` is a breaking change and will fail the contract test.
|
|
139
147
|
- `oat project status --field <path>` - print one arbitrary dot-path field from the same status payload, e.g. `project.workflowMode` or `project.timestamps.stateUpdated`. Missing/null fields print `null`; object and array fields print compact JSON.
|
|
@@ -171,12 +179,15 @@ Per-key restrictions apply identically to `set` and `unset`: structural keys can
|
|
|
171
179
|
|
|
172
180
|
`oat config unset <key>` removes the key from the selected surface and prunes any parent object it empties, so the resolved value falls back through the remaining surfaces to the built-in default. Removing a key the surface does not hold is not an error: it reports an already-unset outcome and exits 0. With `--json` the envelope adds a `removed` boolean, which is the machine-readable way to tell a real removal from an already-unset no-op, since both exit 0. A stored value that fails validation is still removed, matching `oat config set`, which repairs the same file.
|
|
173
181
|
|
|
174
|
-
`
|
|
182
|
+
Remote settings under `pjm.remote.*` remain shared-only. Removing a mutable leaf preserves sibling settings and the required empty `policy` object, if necessary, so the remaining remote configuration stays readable. Explicit defaults are removed from disk rather than silently written back by normalization; effective values still use fail-closed defaults. Remote policy must pass strict validation before removal.
|
|
183
|
+
|
|
184
|
+
`unset` refuses six classes of key, each with exit code 1:
|
|
175
185
|
|
|
176
186
|
- **Unknown keys**, including keys OAT reads but does not expose in the `oat config` catalog (`documentation.index`). These are not removable by any `oat config` command.
|
|
177
187
|
- **Lifecycle state** (`activeProject`, `lastPausedProject`) — cleared with `oat config set <key> ''` instead.
|
|
178
188
|
- **Pack intent** (`tools.*`) — removed with `oat tools remove --pack <pack> --scope project`, which also removes the installed pack files. Clearing the intent alone would leave them behind.
|
|
179
189
|
- **Aggregate read views** (`workflow.dispatchCeiling`, `workflow.dispatchCeiling.providers`) — these are assembled for `get` from the leaf keys and are not stored as such. Unset `workflow.dispatchCeiling.preset` or `workflow.dispatchCeiling.providers.<provider>` instead.
|
|
190
|
+
- **Read-only remote-policy structure** (`pjm.remote`, `pjm.remote.policy`, `pjm.remote.schemaVersion`) — unset a documented mutable child key instead; removing the complete policy or its schema discriminator is not supported.
|
|
180
191
|
- **Environment-shadowed keys with nothing stored on the target surface** — when `OAT_PROJECTS_ROOT`, `OAT_PROJECTS_DEFAULT_SCOPE`, or `OAT_WORKTREES_ROOT` supplies the effective value and the surface holds nothing to remove, clear the environment variable in your shell. When the surface _does_ hold a stored value, `unset` removes it (as `set` would rewrite it) and warns that the override still supplies the effective value.
|
|
181
192
|
|
|
182
193
|
## `workflow.*` preference keys
|