@open-agent-toolkit/cli 0.1.74 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets/docs/cli-utilities/configuration.md +18 -12
- package/assets/docs/cli-utilities/tool-packs.md +1 -1
- package/assets/docs/provider-sync/commands.md +26 -0
- package/assets/docs/provider-sync/config.md +17 -6
- package/assets/docs/provider-sync/index.md +17 -5
- package/assets/docs/provider-sync/manifest-and-drift.md +39 -1
- package/assets/docs/provider-sync/providers.md +8 -2
- package/assets/docs/provider-sync/scope-and-surface.md +5 -1
- package/assets/docs/reference/file-locations.md +9 -3
- package/assets/docs/reference/oat-directory-structure.md +11 -3
- package/assets/docs/reference/troubleshooting.md +11 -0
- package/assets/docs/workflows/index.md +1 -0
- package/assets/docs/workflows/skills/index.md +3 -0
- package/assets/docs/workflows/wave-workflows.md +77 -0
- package/assets/public-package-versions.json +4 -4
- package/assets/skills/create-agnostic-skill/SKILL.md +1 -1
- package/assets/skills/create-agnostic-skill/references/docs/skills-guide.md +24 -15
- package/assets/skills/oat-agent-instructions-analyze/references/docs/provider-reference.md +9 -3
- package/assets/skills/oat-agent-instructions-apply/references/docs/provider-reference.md +9 -3
- package/assets/skills/oat-wave-execute/SKILL.md +317 -0
- package/assets/skills/oat-wave-execute/assets/orchestration-log-template.md +54 -0
- package/assets/skills/oat-wave-execute/assets/wrapper-plan-template.md +157 -0
- package/assets/skills/oat-wave-execute/scripts/bootstrap-group.sh +195 -0
- package/assets/skills/oat-wave-program/SKILL.md +109 -0
- package/assets/skills/oat-wave-program/assets/execution-program-template.md +40 -0
- package/dist/commands/config/index.d.ts.map +1 -1
- package/dist/commands/config/index.js +55 -0
- package/dist/commands/init/index.d.ts +6 -2
- package/dist/commands/init/index.d.ts.map +1 -1
- package/dist/commands/init/index.js +90 -31
- package/dist/commands/init/tools/shared/skill-manifest.d.ts +1 -1
- package/dist/commands/init/tools/shared/skill-manifest.d.ts.map +1 -1
- package/dist/commands/init/tools/shared/skill-manifest.js +2 -0
- package/dist/commands/project/validate-plan/index.d.ts.map +1 -1
- package/dist/commands/project/validate-plan/index.js +2 -1
- package/dist/commands/project/validate-plan/validate-plan.js +1 -1
- package/dist/commands/remove/skill/remove-skill.d.ts +2 -0
- package/dist/commands/remove/skill/remove-skill.d.ts.map +1 -1
- package/dist/commands/remove/skill/remove-skill.js +20 -2
- package/dist/commands/shared/adopt-stray.d.ts.map +1 -1
- package/dist/commands/shared/adopt-stray.js +3 -0
- package/dist/commands/shared/cursor-skill-disposition.d.ts +17 -0
- package/dist/commands/shared/cursor-skill-disposition.d.ts.map +1 -0
- package/dist/commands/shared/cursor-skill-disposition.js +41 -0
- package/dist/commands/status/index.d.ts +10 -4
- package/dist/commands/status/index.d.ts.map +1 -1
- package/dist/commands/status/index.js +99 -31
- package/dist/config/oat-config.d.ts +0 -1
- package/dist/config/oat-config.d.ts.map +1 -1
- package/dist/config/oat-config.js +26 -23
- package/dist/config/sync-config.d.ts +6 -2
- package/dist/config/sync-config.d.ts.map +1 -1
- package/dist/config/sync-config.js +18 -6
- package/dist/config/user-sync-config.d.ts +11 -0
- package/dist/config/user-sync-config.d.ts.map +1 -0
- package/dist/config/user-sync-config.js +61 -0
- package/dist/drift/strays.d.ts +1 -1
- package/dist/drift/strays.d.ts.map +1 -1
- package/dist/drift/strays.js +2 -1
- package/dist/engine/compute-plan.d.ts.map +1 -1
- package/dist/engine/compute-plan.js +154 -4
- package/dist/engine/engine.types.d.ts +2 -2
- package/dist/engine/engine.types.d.ts.map +1 -1
- package/dist/engine/engine.types.js +1 -0
- package/dist/engine/execute-plan.d.ts.map +1 -1
- package/dist/engine/execute-plan.js +4 -0
- package/dist/fs/io.d.ts.map +1 -1
- package/dist/fs/io.js +6 -2
- package/dist/manifest/manifest.types.d.ts +12 -12
- package/dist/providers/cursor/paths.d.ts.map +1 -1
- package/dist/providers/cursor/paths.js +6 -4
- package/dist/providers/shared/adapter.types.d.ts +6 -0
- package/dist/providers/shared/adapter.types.d.ts.map +1 -1
- package/dist/providers/shared/adapter.utils.d.ts +2 -1
- package/dist/providers/shared/adapter.utils.d.ts.map +1 -1
- package/dist/providers/shared/adapter.utils.js +29 -6
- package/package.json +2 -2
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
---
|
|
2
|
+
oat_status: complete
|
|
3
|
+
oat_ready_for: oat-project-implement
|
|
4
|
+
oat_blockers: []
|
|
5
|
+
oat_last_updated: { YYYY-MM-DD }
|
|
6
|
+
oat_phase: plan
|
|
7
|
+
oat_phase_status: complete
|
|
8
|
+
oat_plan_hill_phases: ['{ final-phase-id }']
|
|
9
|
+
oat_auto_review_at_hill_checkpoints: true
|
|
10
|
+
oat_plan_parallel_groups: [{ groups of <= ceiling, write-disjoint, from recon }]
|
|
11
|
+
oat_plan_source: quick
|
|
12
|
+
oat_import_reference: null
|
|
13
|
+
oat_import_source_path: null
|
|
14
|
+
oat_import_provider: null
|
|
15
|
+
oat_generated: false
|
|
16
|
+
oat_template: false
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
# Implementation Plan: wave-N-execution (Wave N external-plan wrapper)
|
|
20
|
+
|
|
21
|
+
> Execute this plan using `oat-project-implement` — groups per
|
|
22
|
+
> `oat_plan_parallel_groups`. Concurrency ceiling: { N } worktrees (operator
|
|
23
|
+
> decision).
|
|
24
|
+
|
|
25
|
+
**Goal:** Execute the { count } Wave N external plans ({ short lane list }) through
|
|
26
|
+
the wave→project wrapper pattern (DR-260713-wave-project-wrapper-over).
|
|
27
|
+
|
|
28
|
+
**Architecture:** Thin wrapper. Each task's **entire and only implementation
|
|
29
|
+
contract** is its external plan under `.oat/repo/reference/external-plans/`. Tasks
|
|
30
|
+
below carry wrapper-owned metadata exclusively: the source-plan path,
|
|
31
|
+
ordering/dependencies, wrapper-level verification gates, the commit convention, and
|
|
32
|
+
review mapping. Nothing in this file restates, narrows, or overrides a source plan.
|
|
33
|
+
|
|
34
|
+
**Commit Convention:** `{type}(p{NN}-t{NN}): {description}` — the external plan
|
|
35
|
+
governs commit content and granularity; the wrapper adds the `pNN-tNN` scope.
|
|
36
|
+
|
|
37
|
+
**Wrapper execution contract (applies to every task):**
|
|
38
|
+
|
|
39
|
+
1. **Drift check first.** Run the source plan's `## Drift check` against current
|
|
40
|
+
HEAD. A material mismatch (per that plan's own definition) is a STOP. The
|
|
41
|
+
wave-boundary drift refresh (see record below) does not replace the in-worktree
|
|
42
|
+
re-check — the integration tip advances as groups merge.
|
|
43
|
+
2. **Execute the source plan's `## Implementation steps`** in order with each
|
|
44
|
+
step's embedded Verify gate; honor its `## STOP conditions` verbatim.
|
|
45
|
+
3. **Confirm the source plan's `## Done criteria`**, then run the full DoD gates:
|
|
46
|
+
{ repo env setup commands, then repo test/lint/format/type gates }
|
|
47
|
+
(source-program example: `nvm use` first; `pnpm rebuild -r better-sqlite3` if
|
|
48
|
+
Node changed; `pnpm test && pnpm lint && pnpm format && pnpm type-check`).
|
|
49
|
+
4. **STOP → BLOCKED at phase level (bundle exception).** A source-plan STOP parks
|
|
50
|
+
the phase (record in `state.md` `oat_blockers` + `implementation.md`); sibling
|
|
51
|
+
phases continue. **Bundle phases:** a STOP parks only the stopped task; the
|
|
52
|
+
implementer records the blocker and continues remaining independent tasks; the
|
|
53
|
+
phase is terminal when every task is completed or parked
|
|
54
|
+
(DR-260713-bundle-stop-semantics-park).
|
|
55
|
+
5. **Group-dependency rule:** a group starts when every phase of the previous
|
|
56
|
+
group is terminal — merged, or parked with completed commits merged. A park
|
|
57
|
+
never blocks the next group.
|
|
58
|
+
6. **Merge serialization:** within a group, merge phase branches one at a time in
|
|
59
|
+
plan order, rebasing each on the updated tip first. Name the deliberately
|
|
60
|
+
sequenced shared files here: { shared-file list from recon }.
|
|
61
|
+
7. **Backlog archival is NOT part of any task** — once, serialized on the
|
|
62
|
+
integration branch after all merges (DR-260713-shared-tracked-surfaces).
|
|
63
|
+
8. **Phase review checklist = the source plan's `## Review focus`.**
|
|
64
|
+
9. **Artifact hygiene:** every agent runs { repo formatter write command }
|
|
65
|
+
(source-program example: `pnpm format:fix`) on markdown it writes and reports
|
|
66
|
+
observations for `orchestration-log.md` (workers report; the root appends).
|
|
67
|
+
10. **Commit verification after ambiguous results:** inspect `git log`/HEAD before
|
|
68
|
+
retrying; record the SHA in `implementation.md`.
|
|
69
|
+
|
|
70
|
+
## Parallelism
|
|
71
|
+
|
|
72
|
+
{ Group composition + rationale. Prefix the recon observations with: }
|
|
73
|
+
|
|
74
|
+
> The recon observations below are **non-authoritative grouping evidence only** —
|
|
75
|
+
> they justify group composition but never constrain a source plan: each source
|
|
76
|
+
> plan's own live location/condition checks govern at execution time.
|
|
77
|
+
|
|
78
|
+
## Dispatch Profile
|
|
79
|
+
|
|
80
|
+
_No per-phase overrides. Runtime selection applies, capped by the project's named
|
|
81
|
+
dispatch policy in `state.md`; provider-specific model/effort selection is owned by
|
|
82
|
+
runtime resolution, not this plan. Cross-model review requirements are embedded in
|
|
83
|
+
{ lanes touching locking/security/containment/dependency surfaces }._
|
|
84
|
+
|
|
85
|
+
## Drift Refresh Record ({ date }, vs `{ BASE_SHA }`)
|
|
86
|
+
|
|
87
|
+
{ Recon results: N PASS / N MINOR-DRIFT / N STOP + one line each. State explicitly
|
|
88
|
+
that this record is non-authoritative recon evidence. }
|
|
89
|
+
|
|
90
|
+
---
|
|
91
|
+
|
|
92
|
+
## Phase { NN }: { lane-name } (group { G })
|
|
93
|
+
|
|
94
|
+
**Milestone:** the source plan's `## Done criteria` fully satisfied.
|
|
95
|
+
|
|
96
|
+
### Task p{NN}-t01: Execute external plan — { lane title }
|
|
97
|
+
|
|
98
|
+
**Source plan (the contract):**
|
|
99
|
+
`.oat/repo/reference/external-plans/{ plan-file }.md`
|
|
100
|
+
|
|
101
|
+
**Ordering:** group { G }; own worktree, parallel with { siblings }. { Grouping
|
|
102
|
+
notes, marked non-authoritative where recon-derived. }
|
|
103
|
+
|
|
104
|
+
**Step 1: Drift check** — per the source plan's `## Drift check`.
|
|
105
|
+
|
|
106
|
+
**Step 2: Execute** the source plan in full.
|
|
107
|
+
|
|
108
|
+
**Step 3: Verify (wrapper gate)**
|
|
109
|
+
|
|
110
|
+
Run: the source plan's `## Done criteria` checks, then the full DoD gates from
|
|
111
|
+
the wrapper execution contract
|
|
112
|
+
Expected: all green.
|
|
113
|
+
|
|
114
|
+
{ **Step 4: Cross-model review** — include for locking/security/containment/
|
|
115
|
+
dependency/lifecycle surfaces: before committing, obtain an independent
|
|
116
|
+
cross-model review of the uncommitted diff via the runtime-configured reviewer
|
|
117
|
+
(provider/model/effort owned by dispatch configuration, not this plan);
|
|
118
|
+
disposition every finding in the phase report. }
|
|
119
|
+
|
|
120
|
+
**Step { N }: Commit**
|
|
121
|
+
|
|
122
|
+
```bash
|
|
123
|
+
git commit -m "{type}(p{NN}-t01): { description }"
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
---
|
|
127
|
+
|
|
128
|
+
## Reviews
|
|
129
|
+
|
|
130
|
+
{Keep both code + artifact rows below. Add additional code rows as needed, but do not delete `spec`/`design`.}
|
|
131
|
+
|
|
132
|
+
| Scope | Type | Status | Date | Artifact |
|
|
133
|
+
| ------ | -------- | ------- | ---- | -------- |
|
|
134
|
+
| p01 | code | pending | - | - |
|
|
135
|
+
| final | code | pending | - | - |
|
|
136
|
+
| plan | artifact | pending | - | - |
|
|
137
|
+
| spec | artifact | pending | - | - |
|
|
138
|
+
| design | artifact | pending | - | - |
|
|
139
|
+
|
|
140
|
+
**Status values:** `pending` → `received` → `fixes_added` → `fixes_completed` → `passed`
|
|
141
|
+
|
|
142
|
+
## Implementation Complete
|
|
143
|
+
|
|
144
|
+
- [ ] { N }/{ N } phases, { M }/{ M } tasks complete
|
|
145
|
+
- [ ] Every source plan's `## Done criteria` confirmed (recorded in `implementation.md`)
|
|
146
|
+
- [ ] **Serialized backlog bookkeeping** (integration branch, after all merges):
|
|
147
|
+
`oat backlog archive` with real outcome summaries for { backlog IDs }, one commit
|
|
148
|
+
- [ ] Orchestration-log end-of-run synthesis written; roll-up into `summary.md`
|
|
149
|
+
before any archive step
|
|
150
|
+
- [ ] Full DoD gates green on the integration branch
|
|
151
|
+
|
|
152
|
+
## References
|
|
153
|
+
|
|
154
|
+
- Source plans: the { N } `.oat/repo/reference/external-plans/*.md` files named above
|
|
155
|
+
- Program indexes: `.oat/repo/reference/external-plans/*-plan-index.md`
|
|
156
|
+
- Pattern: `DR-260713-wave-project-wrapper-over`, prior wave summaries in
|
|
157
|
+
`.oat/repo/reference/project-summaries/`
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# oat-wave-execute: parallel-group worktree bootstrap.
|
|
3
|
+
# Wraps the oat-worktree-bootstrap-auto contract (normal mode, strict policy).
|
|
4
|
+
# Usage: bootstrap-group.sh <wave-prefix> <base-sha> <phase>...
|
|
5
|
+
# e.g. bootstrap-group.sh wave-2 <full-sha> p01 p02 p03
|
|
6
|
+
# Emits one terminal "STATUS <phase>: status=..." line per phase (plus optional
|
|
7
|
+
# "STATUS <phase>: <step>=skipped ..." informational lines); caller parses those.
|
|
8
|
+
# Repo hooks (repo-neutral): OAT_WAVE_BOOTSTRAP_CMD runs repository bootstrap in
|
|
9
|
+
# each worktree; OAT_WAVE_BASELINE_CMD runs the proportionate baseline check.
|
|
10
|
+
# When unset, a pnpm-shaped repo (pnpm-lock.yaml + matching package.json script)
|
|
11
|
+
# defaults to `pnpm run worktree:init` / `pnpm type-check`; otherwise the step
|
|
12
|
+
# is skipped with a STATUS line.
|
|
13
|
+
set -u
|
|
14
|
+
|
|
15
|
+
usage() {
|
|
16
|
+
echo "Usage: bootstrap-group.sh <wave-prefix> <base-sha> <phase>..." >&2
|
|
17
|
+
echo " e.g. bootstrap-group.sh wave-2 <full-40-hex-sha> p01 p02 p03" >&2
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
provider_view_list() {
|
|
21
|
+
local checkout="$1"
|
|
22
|
+
node - "$checkout/.oat/sync/manifest.json" <<'NODE'
|
|
23
|
+
const fs = require("fs");
|
|
24
|
+
const manifestPath = process.argv[2];
|
|
25
|
+
const manifest = JSON.parse(fs.readFileSync(manifestPath, "utf8"));
|
|
26
|
+
const paths = manifest.entries.map((entry) => entry.providerPath).sort();
|
|
27
|
+
process.stdout.write(`${paths.join("\n")}\n`);
|
|
28
|
+
NODE
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
verify_view_parity() {
|
|
32
|
+
local root_checkout="$1"
|
|
33
|
+
local worktree_checkout="$2"
|
|
34
|
+
local root_list
|
|
35
|
+
local worktree_list
|
|
36
|
+
local local_version
|
|
37
|
+
local global_version
|
|
38
|
+
|
|
39
|
+
root_list="$(mktemp "${TMPDIR:-/tmp}/oat-root-views.XXXXXX")" || return 1
|
|
40
|
+
worktree_list="$(mktemp "${TMPDIR:-/tmp}/oat-worktree-views.XXXXXX")" || {
|
|
41
|
+
rm -f "$root_list"
|
|
42
|
+
return 1
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
if ! provider_view_list "$root_checkout" >"$root_list" ||
|
|
46
|
+
! provider_view_list "$worktree_checkout" >"$worktree_list"; then
|
|
47
|
+
echo "STATUS view-parity=MISMATCH"
|
|
48
|
+
echo " diagnostic: unable to read provider-view lists from sync manifests"
|
|
49
|
+
rm -f "$root_list" "$worktree_list"
|
|
50
|
+
return 1
|
|
51
|
+
fi
|
|
52
|
+
|
|
53
|
+
if cmp -s "$root_list" "$worktree_list"; then
|
|
54
|
+
echo "STATUS view-parity=ok"
|
|
55
|
+
rm -f "$root_list" "$worktree_list"
|
|
56
|
+
return 0
|
|
57
|
+
fi
|
|
58
|
+
|
|
59
|
+
echo "STATUS view-parity=MISMATCH"
|
|
60
|
+
echo " root-only provider views:"
|
|
61
|
+
comm -23 "$root_list" "$worktree_list"
|
|
62
|
+
echo " worktree-only provider views:"
|
|
63
|
+
comm -13 "$root_list" "$worktree_list"
|
|
64
|
+
if [[ -x "$worktree_checkout/node_modules/.bin/oat" ]]; then
|
|
65
|
+
local_version="$("$worktree_checkout/node_modules/.bin/oat" --version 2>&1)"
|
|
66
|
+
else
|
|
67
|
+
local_version="missing"
|
|
68
|
+
fi
|
|
69
|
+
global_version="$(cd "$worktree_checkout" && oat --version 2>&1)"
|
|
70
|
+
echo " node_modules/.bin/oat --version: $local_version"
|
|
71
|
+
echo " oat --version: $global_version"
|
|
72
|
+
rm -f "$root_list" "$worktree_list"
|
|
73
|
+
return 1
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
# Guard: require wave-prefix, base-sha, and at least one phase (3+ args)
|
|
77
|
+
if [[ $# -lt 3 ]]; then
|
|
78
|
+
echo "FATAL: expected <wave-prefix> <base-sha> <phase>... (got $# arg(s))" >&2
|
|
79
|
+
usage
|
|
80
|
+
exit 2
|
|
81
|
+
fi
|
|
82
|
+
|
|
83
|
+
WAVE_PREFIX="$1"; shift
|
|
84
|
+
BASE_SHA="$1"; shift
|
|
85
|
+
PHASES=("$@")
|
|
86
|
+
|
|
87
|
+
# Guard: base must be a full 40-hex commit ID (standing rule 5 — no short SHAs)
|
|
88
|
+
if [[ ! "$BASE_SHA" =~ ^[0-9a-f]{40}$ ]]; then
|
|
89
|
+
echo "FATAL: base '$BASE_SHA' is not a full 40-hex commit ID (use git rev-parse HEAD)" >&2
|
|
90
|
+
usage
|
|
91
|
+
exit 1
|
|
92
|
+
fi
|
|
93
|
+
REPO="$(git rev-parse --show-toplevel)"
|
|
94
|
+
ROOT_CFG="$(cd "$REPO" && oat config get worktrees.root 2>/dev/null || true)"
|
|
95
|
+
ROOT="$REPO/${ROOT_CFG:-.worktrees}"
|
|
96
|
+
# Optional node env setup: source nvm only when present; otherwise honor the
|
|
97
|
+
# already-configured node environment (nvm is a repo convention, not required).
|
|
98
|
+
if [[ -s "$HOME/.nvm/nvm.sh" ]]; then
|
|
99
|
+
source "$HOME/.nvm/nvm.sh" >/dev/null 2>&1
|
|
100
|
+
cd "$REPO" && nvm use >/dev/null 2>&1
|
|
101
|
+
fi
|
|
102
|
+
|
|
103
|
+
# Repo-hook resolution: explicit env hooks win; a pnpm-shaped repo (lockfile +
|
|
104
|
+
# matching package.json script) falls back to its conventional commands;
|
|
105
|
+
# anything else skips the step with a STATUS line.
|
|
106
|
+
has_pnpm_script() {
|
|
107
|
+
[[ -f "$REPO/pnpm-lock.yaml" ]] || return 1
|
|
108
|
+
grep -q "\"$1\"" "$REPO/package.json" 2>/dev/null
|
|
109
|
+
}
|
|
110
|
+
BOOTSTRAP_CMD="${OAT_WAVE_BOOTSTRAP_CMD:-}"
|
|
111
|
+
if [[ -z "$BOOTSTRAP_CMD" ]] && has_pnpm_script "worktree:init"; then
|
|
112
|
+
BOOTSTRAP_CMD="pnpm run worktree:init"
|
|
113
|
+
fi
|
|
114
|
+
BASELINE_CMD="${OAT_WAVE_BASELINE_CMD:-}"
|
|
115
|
+
if [[ -z "$BASELINE_CMD" ]] && has_pnpm_script "type-check"; then
|
|
116
|
+
BASELINE_CMD="pnpm type-check"
|
|
117
|
+
fi
|
|
118
|
+
GROUP_STATUS=0
|
|
119
|
+
|
|
120
|
+
# Guard: the full SHA must resolve to an actual commit in this repo
|
|
121
|
+
if ! git -C "$REPO" cat-file -e "${BASE_SHA}^{commit}" 2>/dev/null; then
|
|
122
|
+
echo "FATAL: base '$BASE_SHA' does not resolve to a commit (use git rev-parse HEAD)"; exit 1
|
|
123
|
+
fi
|
|
124
|
+
# Guard: phase branches must not nest under an existing leaf ref (standing rule 1)
|
|
125
|
+
if git -C "$REPO" show-ref --verify --quiet "refs/heads/$WAVE_PREFIX"; then
|
|
126
|
+
echo "FATAL: branch '$WAVE_PREFIX' exists as a leaf ref; phase branches '$WAVE_PREFIX/pNN' cannot be created"; exit 1
|
|
127
|
+
fi
|
|
128
|
+
# Smoke detection (bootstrap-auto step 1.5)
|
|
129
|
+
if [[ -n "$(git -C "$REPO" ls-tree "$BASE_SHA" -- .oat/smoke-bootstrap.json)" ]]; then
|
|
130
|
+
echo "FATAL: smoke marker present at base; refusing normal bootstrap"; exit 1
|
|
131
|
+
fi
|
|
132
|
+
|
|
133
|
+
for P in "${PHASES[@]}"; do
|
|
134
|
+
BR="$WAVE_PREFIX/$P"
|
|
135
|
+
TP="$ROOT/$BR"
|
|
136
|
+
echo "=== [$P] bootstrap → $TP (base $BASE_SHA) ==="
|
|
137
|
+
if ! git -C "$REPO" worktree add "$TP" -b "$BR" "$BASE_SHA" >/dev/null 2>&1; then
|
|
138
|
+
echo "STATUS $P: status=error reason=worktree-create-failed"; continue
|
|
139
|
+
fi
|
|
140
|
+
# Local-only config propagation (bootstrap-auto step 2.5; the bootstrap hook
|
|
141
|
+
# may also cover these, but propagate first so its tooling sees them). Other
|
|
142
|
+
# repo-local files belong in a consuming repo's own wrapper around this script.
|
|
143
|
+
[[ -f "$REPO/.oat/config.local.json" && ! -f "$TP/.oat/config.local.json" ]] && cp "$REPO/.oat/config.local.json" "$TP/.oat/config.local.json"
|
|
144
|
+
(cd "$TP" && oat local sync "$TP" >/dev/null 2>&1) || true
|
|
145
|
+
# Base verification (bootstrap-auto step 2.7)
|
|
146
|
+
OBS=$(git -C "$TP" rev-parse HEAD)
|
|
147
|
+
if ! git -C "$TP" merge-base --is-ancestor "$BASE_SHA" "$OBS"; then
|
|
148
|
+
echo "STATUS $P: status=failed reason=base-mismatch expected=$BASE_SHA observed=$OBS"; continue
|
|
149
|
+
fi
|
|
150
|
+
# Repository bootstrap (hook-resolved) + proportionate baseline
|
|
151
|
+
if [[ -n "$BOOTSTRAP_CMD" ]]; then
|
|
152
|
+
if ! (cd "$TP" && /bin/bash -c "$BOOTSTRAP_CMD" >"$TP/.bootstrap-init.log" 2>&1); then
|
|
153
|
+
echo "STATUS $P: status=error reason=repository-bootstrap-failed (see $TP/.bootstrap-init.log)"; tail -5 "$TP/.bootstrap-init.log"; continue
|
|
154
|
+
fi
|
|
155
|
+
else
|
|
156
|
+
echo "STATUS $P: bootstrap=skipped reason=no-bootstrap-hook (set OAT_WAVE_BOOTSTRAP_CMD)"
|
|
157
|
+
fi
|
|
158
|
+
if ! verify_view_parity "$REPO" "$TP"; then
|
|
159
|
+
echo "STATUS $P: status=error reason=provider-view-parity-mismatch"; continue
|
|
160
|
+
fi
|
|
161
|
+
if [[ -n "$BASELINE_CMD" ]]; then
|
|
162
|
+
if ! (cd "$TP" && /bin/bash -c "$BASELINE_CMD" >"$TP/.bootstrap-baseline.log" 2>&1); then
|
|
163
|
+
echo "STATUS $P: status=error reason=baseline-verification-failed (see $TP/.bootstrap-baseline.log)"; continue
|
|
164
|
+
fi
|
|
165
|
+
else
|
|
166
|
+
echo "STATUS $P: baseline=skipped reason=no-baseline-hook (set OAT_WAVE_BASELINE_CMD)"
|
|
167
|
+
fi
|
|
168
|
+
# Sync-commit if scoped paths dirty (bootstrap-auto step 4)
|
|
169
|
+
if ! (
|
|
170
|
+
cd "$TP" && git add -A -- .oat/sync/manifest.json .claude .cursor .codex 2>/dev/null
|
|
171
|
+
if ! git diff --cached --quiet 2>/dev/null; then
|
|
172
|
+
if git -c core.hooksPath=/dev/null commit -q -m "chore: run sync"; then
|
|
173
|
+
echo " sync_commit: committed"
|
|
174
|
+
else
|
|
175
|
+
echo " sync_commit: FAILED"
|
|
176
|
+
exit 1
|
|
177
|
+
fi
|
|
178
|
+
else
|
|
179
|
+
echo " sync_commit: skip"
|
|
180
|
+
fi
|
|
181
|
+
); then
|
|
182
|
+
echo "STATUS $P: status=failed reason=sync-commit"
|
|
183
|
+
GROUP_STATUS=1
|
|
184
|
+
continue
|
|
185
|
+
fi
|
|
186
|
+
# Relocate bootstrap logs out of the worktree (1.3.0: script-owned; callers
|
|
187
|
+
# previously forgot this step)
|
|
188
|
+
LOGDIR="${TMPDIR:-/tmp}/oat-bootstrap-logs/$WAVE_PREFIX-$P"
|
|
189
|
+
mkdir -p "$LOGDIR" && mv "$TP"/.bootstrap-*.log "$LOGDIR"/ 2>/dev/null
|
|
190
|
+
echo " bootstrap_logs: $LOGDIR"
|
|
191
|
+
DIRTY=$(cd "$TP" && git status --porcelain | wc -l | tr -d ' ')
|
|
192
|
+
echo "STATUS $P: status=success worktree=$TP branch=$BR base=$BASE_SHA observed=$OBS git_clean=$([[ $DIRTY == 0 ]] && echo pass || echo "fail($DIRTY)")"
|
|
193
|
+
done
|
|
194
|
+
echo "=== group bootstrap done ==="
|
|
195
|
+
exit "$GROUP_STATUS"
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: oat-wave-program
|
|
3
|
+
version: 1.1.0
|
|
4
|
+
description: Use when decomposing a corpus of external implementation plans into an ordered wave program — coverage inventory, dependency mapping, wave composition, and the durable execution-program artifact that oat-wave-execute consumes and updates.
|
|
5
|
+
argument-hint: '[new|refresh|wave-close <wave-id>] (default: refresh against the current artifact)'
|
|
6
|
+
disable-model-invocation: false
|
|
7
|
+
user-invocable: true
|
|
8
|
+
allowed-tools: Read, Write, Edit, Bash, Grep, Glob, Task
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Program a Corpus of External Plans into Waves
|
|
12
|
+
|
|
13
|
+
Maintain the **program layer** above `oat-wave-execute`: record how N external
|
|
14
|
+
plans (from one or more plan-generation runs) map into an ordered sequence of
|
|
15
|
+
waves, and keep that mapping durable and current as waves complete.
|
|
16
|
+
`oat-wave-execute` runs ONE wave; this skill records and maintains the
|
|
17
|
+
orchestrator-composed, operator-approved mapping of WHICH plans form each wave.
|
|
18
|
+
|
|
19
|
+
## Ownership Boundary
|
|
20
|
+
|
|
21
|
+
**This skill owns (mechanical):** the execution-program artifact contract and its
|
|
22
|
+
durable home, the plan-coverage inventory (every plan mapped exactly once or
|
|
23
|
+
explicitly deferred), the wave-status ledger and its update procedure at wave
|
|
24
|
+
boundaries, and the refresh procedure when a new plan batch lands.
|
|
25
|
+
|
|
26
|
+
**The orchestrator owns (judgment — never delegate to this skill or to workers):**
|
|
27
|
+
wave composition itself — theme coherence, dependency ordering, risk balancing
|
|
28
|
+
(don't stack all high-churn lanes in one wave), wave sizing against the operator's
|
|
29
|
+
concurrency ceiling, and the call on when a deferred plan re-enters the program.
|
|
30
|
+
|
|
31
|
+
## The Artifact
|
|
32
|
+
|
|
33
|
+
**Home:** `.oat/repo/reference/external-plans/<YYYY-MM-DD>-execution-program.md`
|
|
34
|
+
(created from `assets/execution-program-template.md`). One live program artifact
|
|
35
|
+
at a time; a superseding program links its predecessor. It is index-adjacent
|
|
36
|
+
reference material — NOT an executable plan and NOT an `oat-project-import-plan`
|
|
37
|
+
target (same disclaimer as the plan indexes).
|
|
38
|
+
|
|
39
|
+
**Contract:**
|
|
40
|
+
|
|
41
|
+
- **Wave table:** one row per plan — plan link, source index, wave, ordering
|
|
42
|
+
notes (merge-first/solo, hard/soft dependencies), status
|
|
43
|
+
(`pending | in-wave | done | deferred | dropped`).
|
|
44
|
+
- **Coverage invariant (load-bearing):** every plan listed in every
|
|
45
|
+
`*-plan-index.md` appears in exactly one row. Plans deliberately not scheduled
|
|
46
|
+
get `deferred`/`dropped` WITH the reason and re-entry trigger — silence is a
|
|
47
|
+
bug. Verify mechanically (count plans in indexes vs rows) before committing.
|
|
48
|
+
- **Wave sections:** per wave — theme, lane list, intra-wave dependency notes
|
|
49
|
+
(which lane merges first and why), and cross-wave prerequisites ("W4
|
|
50
|
+
token-cost requires W3 permission-policy").
|
|
51
|
+
- **Status ledger:** per wave — composed → in-progress (project link) → merged
|
|
52
|
+
(PR + merge SHA + completion record link). Updated by this skill's
|
|
53
|
+
`wave-close` mode, invoked from `oat-wave-execute` closeout step 8.
|
|
54
|
+
|
|
55
|
+
## Process
|
|
56
|
+
|
|
57
|
+
### Mode: `new` (first program for a plan corpus)
|
|
58
|
+
|
|
59
|
+
1. **Inventory:** read every `*-plan-index.md` under
|
|
60
|
+
`.oat/repo/reference/external-plans/`; extract each plan, its dependency
|
|
61
|
+
notes, and any wave hints the index already records. Verify each plan file
|
|
62
|
+
exists (a dangling index row is a STOP — report, don't guess).
|
|
63
|
+
2. **Shared-surface scan:** from the indexes' dependency notes (NOT fresh recon —
|
|
64
|
+
the wave-boundary drift refresh in `oat-wave-execute` owns live evidence),
|
|
65
|
+
collect hard orderings (e.g. a tool-family chain), soft orderings (same-file
|
|
66
|
+
churn), and cross-batch seams (shared new modules; first-executed builds).
|
|
67
|
+
3. **[JUDGMENT] Compose waves:** group by theme + dependency layer, sized so a
|
|
68
|
+
wave's write-disjoint groups fit the operator's concurrency ceiling in 2–3
|
|
69
|
+
dispatch groups. Honor index wave hints unless evidence contradicts them —
|
|
70
|
+
and record the contradiction when it does.
|
|
71
|
+
4. **Write the artifact** from the template; run the coverage check; present the
|
|
72
|
+
wave map to the operator for approval BEFORE the first wave kicks off
|
|
73
|
+
(program composition is an operator checkpoint, not a silent default).
|
|
74
|
+
5. Run the repo's formatter over the artifact and commit it (source-program
|
|
75
|
+
examples: `pnpm format:fix`; `docs(pjm): add execution program <date>`).
|
|
76
|
+
|
|
77
|
+
### Mode: `refresh` (new plan batch, or drift in a pending wave)
|
|
78
|
+
|
|
79
|
+
1. Diff current indexes against the artifact's rows; add new plans as rows
|
|
80
|
+
(initially `pending`, wave `TBD` unless an index hints placement).
|
|
81
|
+
2. [JUDGMENT] Re-compose only waves not yet started. Never reshuffle a wave
|
|
82
|
+
that is `in-progress`; a merged wave's row set is frozen history.
|
|
83
|
+
3. Re-run the coverage check; commit.
|
|
84
|
+
|
|
85
|
+
### Mode: `wave-close <wave-id>` (called at wave closeout)
|
|
86
|
+
|
|
87
|
+
1. Flip the wave's plan rows to `done` (or back to `deferred` with reason, for
|
|
88
|
+
lanes parked by a STOP — a parked lane re-enters a later wave explicitly).
|
|
89
|
+
2. Update the status ledger row: PR, merge SHA, completion-record link.
|
|
90
|
+
3. Note next-wave unblocks ("W3 merged → W4 token-cost unblocked").
|
|
91
|
+
4. Commit with the wave's closeout bookkeeping.
|
|
92
|
+
|
|
93
|
+
## Integration with `oat-wave-execute`
|
|
94
|
+
|
|
95
|
+
- `oat-wave-execute` **Inputs** resolves its lane list from this artifact (falling
|
|
96
|
+
back to index wave hints only when no program artifact exists).
|
|
97
|
+
- `oat-wave-execute` closeout step 8 invokes `wave-close` here.
|
|
98
|
+
- A lane parked mid-wave (source-plan STOP) surfaces in BOTH artifacts: the
|
|
99
|
+
wave project's blocker record and this ledger's `deferred` row.
|
|
100
|
+
|
|
101
|
+
## Success Criteria
|
|
102
|
+
|
|
103
|
+
- Coverage invariant holds on every commit of the artifact (no silently
|
|
104
|
+
unmapped plan).
|
|
105
|
+
- The program survives session loss: a fresh session can resume wave kickoff
|
|
106
|
+
from the artifact alone, without reconstructing composition from index notes.
|
|
107
|
+
- Wave status ledger is current within one commit of each wave's closeout.
|
|
108
|
+
- Composition changes are recorded with reasons — the artifact shows why a plan
|
|
109
|
+
moved waves, not just that it did.
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
---
|
|
2
|
+
oat_generated: true
|
|
3
|
+
oat_external_plan_index: false
|
|
4
|
+
oat_execution_program: true
|
|
5
|
+
oat_program_supersedes: { null | path to predecessor program artifact }
|
|
6
|
+
oat_program_indexes:
|
|
7
|
+
- { '.oat/repo/reference/external-plans/<index-file>.md' }
|
|
8
|
+
created: '{ ISO timestamp }'
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Execution Program: { date } ({ corpus description })
|
|
12
|
+
|
|
13
|
+
This artifact is the durable program map for the external-plan corpus listed in
|
|
14
|
+
`oat_program_indexes`. It records wave composition and status. It is not an
|
|
15
|
+
executable plan and is not an `oat-project-import-plan` target — each wave runs
|
|
16
|
+
as a wrapper OAT project via `oat-wave-execute`, and each plan's implementation
|
|
17
|
+
contract remains its immutable plan file.
|
|
18
|
+
|
|
19
|
+
## Status Ledger
|
|
20
|
+
|
|
21
|
+
| Wave | Theme | Lanes | Status | Record |
|
|
22
|
+
| ---- | --------- | ----- | ----------------------------------- | ------------------------------------- |
|
|
23
|
+
| W{N} | { theme } | { n } | { composed / in-progress / merged } | { project / PR + SHA / summary link } |
|
|
24
|
+
|
|
25
|
+
## Wave Table (coverage: { N } plans = { N } index rows; verified { date })
|
|
26
|
+
|
|
27
|
+
| Plan | Index | Wave | Ordering notes | Status |
|
|
28
|
+
| ------------------------- | ---------- | ---- | ----------------------------- | ------------------------------------------------- |
|
|
29
|
+
| [{ plan }](./{ file }.md) | { source } | W{N} | { merge-first / after X / — } | { pending / in-wave / done / deferred / dropped } |
|
|
30
|
+
|
|
31
|
+
{ Deferred/dropped rows MUST carry reason + re-entry trigger in the notes column. }
|
|
32
|
+
|
|
33
|
+
## Wave { N }: { theme }
|
|
34
|
+
|
|
35
|
+
- **Lanes:** { list }
|
|
36
|
+
- **Intra-wave ordering:** { which lane merges first/solo and why }
|
|
37
|
+
- **Cross-wave prerequisites:** { what this wave needed from earlier waves; what
|
|
38
|
+
it unblocks later }
|
|
39
|
+
- **Composition rationale:** { theme/risk/sizing judgment, including any index
|
|
40
|
+
wave-hint overridden and why }
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/config/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,mBAAmB,EAAE,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEhF,OAAO,EAEL,KAAK,aAAa,EACnB,MAAM,iCAAiC,CAAC;AAezC,OAAO,EAML,KAAK,SAAS,EACd,KAAK,cAAc,EAGnB,KAAK,UAAU,EAehB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAEL,KAAK,cAAc,EAEpB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EAGL,KAAK,8BAA8B,EACnC,KAAK,yBAAyB,EAC/B,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EACL,mCAAmC,EACnC,0BAA0B,EAC3B,MAAM,yCAAyC,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAyFpC,UAAU,yBAAyB;IACjC,mBAAmB,EAAE,CACnB,OAAO,EAAE,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAC,CAAC,CAAC,KAC/C,cAAc,CAAC;IACpB,kBAAkB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACrD,aAAa,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;IACxD,cAAc,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACvE,kBAAkB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;IAClE,mBAAmB,EAAE,CACnB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,cAAc,KACnB,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,cAAc,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;IAC/D,eAAe,EAAE,CAAC,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9E,mBAAmB,EAAE,CACnB,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,MAAM,CAAC,UAAU,KACnB,OAAO,CAAC,MAAM,CAAC,CAAC;IACrB,sBAAsB,EAAE,CACtB,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,EACrB,GAAG,EAAE,MAAM,CAAC,UAAU,KACnB,OAAO,CAAC,cAAc,CAAC,CAAC;IAC7B,iBAAiB,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACzC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5C,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,aAAa,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACzE,kBAAkB,EAAE,CAClB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,yBAAyB,KAC/B,OAAO,CAAC,8BAA8B,CAAC,CAAC;IAC7C,mCAAmC,EAAE,OAAO,mCAAmC,CAAC;IAChF,0BAA0B,EAAE,OAAO,0BAA0B,CAAC;IAC9D,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC;CAC/B;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/config/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,mBAAmB,EAAE,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEhF,OAAO,EAEL,KAAK,aAAa,EACnB,MAAM,iCAAiC,CAAC;AAezC,OAAO,EAML,KAAK,SAAS,EACd,KAAK,cAAc,EAGnB,KAAK,UAAU,EAehB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAEL,KAAK,cAAc,EAEpB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EAGL,KAAK,8BAA8B,EACnC,KAAK,yBAAyB,EAC/B,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EACL,mCAAmC,EACnC,0BAA0B,EAC3B,MAAM,yCAAyC,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAyFpC,UAAU,yBAAyB;IACjC,mBAAmB,EAAE,CACnB,OAAO,EAAE,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAC,CAAC,CAAC,KAC/C,cAAc,CAAC;IACpB,kBAAkB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACrD,aAAa,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;IACxD,cAAc,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACvE,kBAAkB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;IAClE,mBAAmB,EAAE,CACnB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,cAAc,KACnB,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,cAAc,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;IAC/D,eAAe,EAAE,CAAC,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9E,mBAAmB,EAAE,CACnB,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,MAAM,CAAC,UAAU,KACnB,OAAO,CAAC,MAAM,CAAC,CAAC;IACrB,sBAAsB,EAAE,CACtB,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,EACrB,GAAG,EAAE,MAAM,CAAC,UAAU,KACnB,OAAO,CAAC,cAAc,CAAC,CAAC;IAC7B,iBAAiB,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACzC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5C,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,aAAa,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACzE,kBAAkB,EAAE,CAClB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,yBAAyB,KAC/B,OAAO,CAAC,8BAA8B,CAAC,CAAC;IAC7C,mCAAmC,EAAE,OAAO,mCAAmC,CAAC;IAChF,0BAA0B,EAAE,OAAO,0BAA0B,CAAC;IAC9D,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC;CAC/B;AA6kED,wBAAgB,mBAAmB,CACjC,SAAS,GAAE,OAAO,CAAC,yBAAyB,CAAM,GACjD,OAAO,CAsKT"}
|
|
@@ -565,6 +565,17 @@ const CONFIG_CATALOG = [
|
|
|
565
565
|
owningCommand: 'oat providers set --scope project',
|
|
566
566
|
description: 'Default sync strategy used when a provider does not override its own strategy.',
|
|
567
567
|
},
|
|
568
|
+
{
|
|
569
|
+
key: 'sync.knownStrays',
|
|
570
|
+
group: 'Sync/Provider (.oat/sync/config.json)',
|
|
571
|
+
file: '.oat/sync/config.json',
|
|
572
|
+
scope: 'project sync',
|
|
573
|
+
type: 'string[]',
|
|
574
|
+
defaultValue: '[]',
|
|
575
|
+
mutability: 'managed',
|
|
576
|
+
owningCommand: 'oat init / oat status',
|
|
577
|
+
description: 'Exact normalized provider-local paths intentionally kept outside the canonical project inventory.',
|
|
578
|
+
},
|
|
568
579
|
{
|
|
569
580
|
key: 'sync.providers.<name>.enabled',
|
|
570
581
|
group: 'Sync/Provider (.oat/sync/config.json)',
|
|
@@ -587,6 +598,50 @@ const CONFIG_CATALOG = [
|
|
|
587
598
|
owningCommand: 'oat providers set --scope project',
|
|
588
599
|
description: 'Provider-specific sync strategy override for a named provider.',
|
|
589
600
|
},
|
|
601
|
+
{
|
|
602
|
+
key: 'sync.defaultStrategy',
|
|
603
|
+
group: 'User Sync (~/.oat/sync/config.json)',
|
|
604
|
+
file: '~/.oat/sync/config.json',
|
|
605
|
+
scope: 'user sync',
|
|
606
|
+
type: 'auto | symlink | copy',
|
|
607
|
+
defaultValue: 'auto',
|
|
608
|
+
mutability: 'read/write',
|
|
609
|
+
owningCommand: 'oat providers set --scope user',
|
|
610
|
+
description: 'Default user-scope sync strategy used when a provider does not override its own strategy.',
|
|
611
|
+
},
|
|
612
|
+
{
|
|
613
|
+
key: 'sync.knownStrays',
|
|
614
|
+
group: 'User Sync (~/.oat/sync/config.json)',
|
|
615
|
+
file: '~/.oat/sync/config.json',
|
|
616
|
+
scope: 'user sync',
|
|
617
|
+
type: 'string[]',
|
|
618
|
+
defaultValue: '[]',
|
|
619
|
+
mutability: 'managed',
|
|
620
|
+
owningCommand: 'oat init / oat status',
|
|
621
|
+
description: 'Exact normalized user provider-local paths intentionally kept outside the canonical user inventory.',
|
|
622
|
+
},
|
|
623
|
+
{
|
|
624
|
+
key: 'sync.providers.<name>.enabled',
|
|
625
|
+
group: 'User Sync (~/.oat/sync/config.json)',
|
|
626
|
+
file: '~/.oat/sync/config.json',
|
|
627
|
+
scope: 'user sync',
|
|
628
|
+
type: 'boolean',
|
|
629
|
+
defaultValue: 'unset',
|
|
630
|
+
mutability: 'read/write',
|
|
631
|
+
owningCommand: 'oat providers set --scope user --enabled/--disabled',
|
|
632
|
+
description: 'Provider-specific enablement for user sync surfaces.',
|
|
633
|
+
},
|
|
634
|
+
{
|
|
635
|
+
key: 'sync.providers.<name>.strategy',
|
|
636
|
+
group: 'User Sync (~/.oat/sync/config.json)',
|
|
637
|
+
file: '~/.oat/sync/config.json',
|
|
638
|
+
scope: 'user sync',
|
|
639
|
+
type: 'auto | symlink | copy',
|
|
640
|
+
defaultValue: 'inherit sync.defaultStrategy',
|
|
641
|
+
mutability: 'read/write',
|
|
642
|
+
owningCommand: 'oat providers set --scope user',
|
|
643
|
+
description: 'Provider-specific user sync strategy override for a named provider.',
|
|
644
|
+
},
|
|
590
645
|
];
|
|
591
646
|
const DEFAULT_DEPENDENCIES = {
|
|
592
647
|
buildCommandContext,
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { type CommandContext, type GlobalOptions } from '../../app/command-context.js';
|
|
2
2
|
import { type ApplyOatCoreResult } from '../init/gitignore.js';
|
|
3
|
+
import { type CursorSkillDisposition } from '../shared/cursor-skill-disposition.js';
|
|
3
4
|
import { type MultiSelectChoice, type PromptContext, type SelectChoice } from '../shared/shared.prompts.js';
|
|
4
5
|
import { type SyncConfig } from '../../config/index.js';
|
|
5
|
-
import { type OatConfig
|
|
6
|
+
import { type OatConfig } from '../../config/oat-config.js';
|
|
6
7
|
import { type DriftReport } from '../../drift/index.js';
|
|
7
8
|
import { type CanonicalEntry, type HookInstallInfo } from '../../engine/index.js';
|
|
8
9
|
import type { Manifest } from '../../manifest/manifest.types.js';
|
|
@@ -42,7 +43,7 @@ interface InitDependencies {
|
|
|
42
43
|
uninstallHook: (projectRoot: string) => Promise<void>;
|
|
43
44
|
getAdapters: () => ProviderAdapter[];
|
|
44
45
|
loadSyncConfig: (configPath: string) => Promise<SyncConfig>;
|
|
45
|
-
|
|
46
|
+
resolveUserSyncConfig: (userConfigDir: string) => Promise<SyncConfig>;
|
|
46
47
|
saveSyncConfig: (configPath: string, config: SyncConfig) => Promise<SyncConfig>;
|
|
47
48
|
getConfigAwareAdapters: (adapters: ProviderAdapter[], scopeRoot: string, config: SyncConfig) => Promise<ConfigAwareAdaptersResult>;
|
|
48
49
|
applyOatCoreGitignore: (repoRoot: string) => Promise<ApplyOatCoreResult>;
|
|
@@ -62,6 +63,9 @@ interface InitDependencies {
|
|
|
62
63
|
fileExists: (path: string) => Promise<boolean>;
|
|
63
64
|
inputWithDefault: (message: string, defaultValue: string, ctx: PromptContext) => Promise<string | null>;
|
|
64
65
|
selectWithAbort: <T extends string>(message: string, choices: SelectChoice<T>[], ctx: PromptContext) => Promise<T | null>;
|
|
66
|
+
applyCursorSkillDisposition: (scopeRoot: string, stray: InitStrayCandidate, manifest: Manifest, disposition: CursorSkillDisposition, syncConfigPath: string, options?: {
|
|
67
|
+
replaceCanonical?: boolean;
|
|
68
|
+
}) => Promise<Manifest>;
|
|
65
69
|
runGuidedSetup: (context: CommandContext, dependencies: InitDependencies) => Promise<void>;
|
|
66
70
|
runToolPacks: (context: CommandContext) => Promise<ToolPack[]>;
|
|
67
71
|
runProviderSync: (projectRoot: string) => Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/init/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,aAAa,EAEnB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,KAAK,kBAAkB,EAExB,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/init/index.ts"],"names":[],"mappings":"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"}
|