@open-agent-toolkit/cli 0.1.51 → 0.1.52

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.
@@ -453,7 +453,7 @@ Workflow preference keys live under the `workflow.*` namespace:
453
453
  - `workflow.hillCheckpointDefault` — `every` or `final`. Default HiLL checkpoint behavior in `oat-project-implement`: pause after every phase or only after the last phase. When unset, the skill prompts.
454
454
  - `workflow.archiveOnComplete` — boolean. Skip the "Archive after completion?" prompt in `oat-project-complete`. When unset, the skill prompts.
455
455
  - `workflow.createPrOnComplete` — boolean. Skip the "Open a PR?" prompt in `oat-project-complete`; when true, completion auto-triggers PR creation. When unset, the skill prompts.
456
- - `workflow.postImplementSequence` — `wait`, `summary`, `pr`, or `docs-pr`. Controls what `oat-project-implement` chains after final review passes. `wait` stops without auto-chaining, `summary` runs only `oat-project-summary`, `pr` runs `oat-project-pr-final` (which auto-generates summary), `docs-pr` runs `oat-project-document` then `oat-project-pr-final`. When unset, the skill prompts.
456
+ - `workflow.postImplementSequence` — legacy `wait`, `summary`, `pr`, or `docs-pr`, or `{ "preApproval": [...], "postApproval": [...] }`. Legacy values remain strings; structured arrays contain ordered, globally unique `summary`, `document`, and `pr` steps. Pre-approval steps run after final review and before final HiLL approval; post-approval steps run only after that approval. Plain retrieval keeps legacy strings and prints structured values as compact JSON; `--json` returns the raw value.
457
457
  - `workflow.reviewExecutionModel` — `subagent`, `inline`, or `fresh-session`. Default final-review execution model in `oat-project-implement`. `subagent` and `inline` run automatically. `fresh-session` is a soft preference: the skill prints guidance to run the review in another session but still offers escape hatches to `subagent` or `inline` if you change your mind. When unset, the skill prompts.
458
458
  - `workflow.autoReviewAtHillCheckpoints` — boolean. Automatically run the extra lifecycle review when a HiLL checkpoint is reached. This does not control Tier 1 per-phase `oat-reviewer` gates, which run after each phase in Tier 1 regardless of this setting. When unset, the skill prompts.
459
459
  - `workflow.autoNarrowReReviewScope` — boolean. Auto-narrow re-review scope to fix-task commits only in `oat-project-review-provide`. When unset, the skill prompts.
@@ -66,7 +66,7 @@ Notable commands introduced in the current CLI surface:
66
66
  - `oat project complete-state <project-path>` - apply the canonical completed-state mutation to a project's `state.md`; used by `oat-project-complete` during lifecycle closeout
67
67
  - `oat project archive [project-path]` - archive a tracked project through the same local move, summary export, and optional S3 upload path used by completion. When omitted, the project path falls back to the active project.
68
68
  - `oat repo archive sync [project-name]` - hydrate archived project snapshots from the configured repo-scoped S3 archive into `.oat/projects/archived/`. The old `oat project archive sync` path remains as a deprecated shim.
69
- - `oat project validate-plan --project-path <path>` - validates `oat_plan_parallel_groups` metadata in `plan.md`; exits non-zero on invalid. See [Implementation Execution](../workflows/projects/implementation-execution.md#validating-plan-metadata).
69
+ - `oat project validate-plan --project-path <path>` - validates `oat_plan_parallel_groups` metadata in `plan.md`; exits non-zero on invalid. See [Implementation Execution](../workflows/projects/implementation-execution.md#plan-declared-parallelism).
70
70
  - `oat project set-mode` — deprecated no-op. Execution mode is no longer user-selectable; emits a deprecation warning and preserves the `--json` contract.
71
71
  - `oat gate review <prompt...>` - run a stateful OAT review through the target registry, parse the produced review artifact, and exit nonzero for configured blocking findings. With `--json`, the result envelope on exit is the canonical completion signal: `status` is `ok` | `blocked` | `review_failed` | `artifact_validation_failed` | `targeting_correlation_failed`, alongside `runId`, `generatedAt`, and `artifactPath` when available. Invoke `oat-project-review-receive` only when all three conditions hold: `status` is `ok` or `blocked`, `receiveEligible` is `true`, and `handoff` is non-null. For `artifact_validation_failed`, correct the artifact and rerun the gate for successful revalidation before receive. `targeting_correlation_failed` sets `receiveEligible: false`; do not run review-receive even if it reports an artifact path. Orchestrators should read the structured result rather than poll the filesystem. The command runs standalone (for example, `--review-scope final`), not only inside `oat-project-implement`. See [Workflow Gates → Gate completion signal](../cli-utilities/workflow-gates.md#gate-completion-signal).
72
72
  - `oat gate target set <id> --invocation-model <model|provider-default> --invocation-reasoning-effort <effort|provider-default>` - persist optional configured invocation metadata alongside an exec target without inferring it from the target command.
@@ -92,7 +92,7 @@ The `workflow.*` namespace holds user-facing workflow preferences that let you a
92
92
  - `workflow.hillCheckpointDefault` (`every` | `final`) — default HiLL checkpoint behavior in `oat-project-implement`
93
93
  - `workflow.archiveOnComplete` (`boolean`) — skip the archive prompt in `oat-project-complete`
94
94
  - `workflow.createPrOnComplete` (`boolean`) — skip the "Open a PR?" prompt in `oat-project-complete`
95
- - `workflow.postImplementSequence` (`wait` | `summary` | `pr` | `docs-pr`) — post-implementation chaining behavior
95
+ - `workflow.postImplementSequence` (legacy `wait` | `summary` | `pr` | `docs-pr`, or structured `{preApproval, postApproval}` arrays) — approval-aware post-implementation chaining
96
96
  - `workflow.reviewExecutionModel` (`subagent` | `inline` | `fresh-session`) — default final-review execution model
97
97
  - `workflow.autoReviewAtHillCheckpoints` (`boolean`) — auto-run the extra lifecycle review at HiLL checkpoints
98
98
  - `workflow.autoNarrowReReviewScope` (`boolean`) — auto-narrow re-review scope to fix-task commits
@@ -10,7 +10,7 @@ OAT supports two checkpoint classes:
10
10
  - Workflow phase checkpoints
11
11
  - Plan phase checkpoints
12
12
 
13
- The [phase review gate](reviews.md#phase-review-gate) (`oat_phase_review_gate`) is a separate, non-pausing mechanism — it does not pause on a passing gate and never modifies the HiLL keys below (`oat_hill_completed`, `oat_plan_hill_phases`).
13
+ The [Phase gate review](reviews.md#phase-review-gate) (`oat_phase_review_gate`) is a separate, non-pausing mechanism — it does not pause on a passing gate and never modifies the HiLL keys below (`oat_hill_completed`, `oat_plan_hill_phases`).
14
14
 
15
15
  ## Workflow checkpoints (`state.md`)
16
16
 
@@ -374,6 +374,11 @@ context. An unresolved or verification-failing conflict stops fan-in.
374
374
 
375
375
  ## Phase Review Gate and HiLL
376
376
 
377
+ Phase gate review is independent from HiLL: a configured passing gate continues
378
+ automatically, while a HiLL checkpoint pauses for human approval. For the final
379
+ phase, approval-aware post-implementation sequences run pre-approval work only
380
+ after final review and post-approval work only after the recorded approval.
381
+
377
382
  After standard review passes and bookkeeping is committed, an enabled
378
383
  `oat_phase_review_gate` may run a target-neutral external review for the phase.
379
384
  Passing artifacts are still received for durable disposition; blocking
@@ -84,6 +84,15 @@ This distinction matters during completion: `oat-project-complete` can skip the
84
84
 
85
85
  ### Auto-review at HiLL checkpoints
86
86
 
87
+ ### Approval-aware post-implementation sequencing
88
+
89
+ `workflow.postImplementSequence` can use the legacy string values or a structured
90
+ `{ preApproval, postApproval }` value. After the final review passes, OAT
91
+ snapshots the effective sequence, runs ordered pre-approval steps, records final
92
+ HiLL approval, and only then runs post-approval steps. The snapshot is
93
+ restart-safe: an incomplete sequence routes back to implementation and resumes
94
+ from its first incomplete step.
95
+
87
96
  When `workflow.autoReviewAtHillCheckpoints` is enabled or `plan.md` frontmatter sets `oat_auto_review_at_hill_checkpoints`, completing a HiLL checkpoint automatically runs the extra lifecycle review scoped to every implementation phase not already covered by a passed whole-phase code review, through the just-completed checkpoint. Mid-implementation multi-phase reviews use inclusive phase-range scopes such as `p02-p03`; the final implementation checkpoint uses `code final`. The review uses auto-disposition mode (minors auto-converted to fix tasks, no user prompts). Disabled by default. Legacy `autoReviewAtCheckpoints` and `oat_auto_review_at_checkpoints` are still read as fallbacks. This does not control Tier 1 per-phase `oat-reviewer` gates.
88
97
 
89
98
  ### Phase-review setup during planning
@@ -1,6 +1,6 @@
1
1
  {
2
- "cli": "0.1.51",
3
- "docs-config": "0.1.51",
4
- "docs-theme": "0.1.51",
5
- "docs-transforms": "0.1.51"
2
+ "cli": "0.1.52",
3
+ "docs-config": "0.1.52",
4
+ "docs-theme": "0.1.52",
5
+ "docs-transforms": "0.1.52"
6
6
  }
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: oat-project-implement
3
- version: 2.0.35
3
+ version: 2.0.36
4
4
  description: Use when plan.md is ready for execution. Dispatches phase coordinators that select one exact target-pinned worker per task; supports bounded fix loops and plan-declared worktree-isolated parallel phases.
5
5
  oat_gateable: true
6
6
  argument-hint: '[--retry-limit <N>] [--dry-run]'
@@ -1451,7 +1451,7 @@ git add {PROJECT_PATH}/implementation.md {PROJECT_PATH}/state.md {PROJECT_PATH}/
1451
1451
  git commit -m "chore(oat): bookkeeping after {pNN} {pass|fail}"
1452
1452
  ```
1453
1453
 
1454
- Then run the optional external phase review gate for the completed phase when `oat_phase_review_gate` selects it. After the gate passes or is skipped, check HiLL checkpoint if the phase ID is in `oat_plan_hill_phases`, pause for user approval before continuing.
1454
+ Then run the optional external phase review gate for the completed phase when `oat_phase_review_gate` selects it. After the gate passes or is skipped, check the HiLL checkpoint. A non-final checkpoint pauses at this boundary; defer a final-phase checkpoint to **Final HiLL Closeout Sequence** after final verification, final review, and any configured pre-approval steps succeed.
1455
1455
 
1456
1456
  ### Step 8: Check Plan Phase Completion
1457
1457
 
@@ -1495,12 +1495,20 @@ Before pausing at a checkpoint, check if auto-review is enabled:
1495
1495
 
1496
1496
  3. If disabled: skip directly to the checkpoint pause.
1497
1497
 
1498
- When pausing:
1498
+ When pausing at a non-final checkpoint:
1499
1499
 
1500
1500
  - Output phase summary (tasks completed, commits made)
1501
1501
  - Ask user: "Phase {N} ({phase_name}) complete. Continue to next phase?"
1502
1502
  - Wait for user approval before proceeding to next plan phase
1503
1503
 
1504
+ **Final checkpoint deferral:** If the current phase is the final implementation
1505
+ phase and it is configured as a HiLL checkpoint, do not ask the generic
1506
+ "Continue to next phase?" question. Final checkpoint auto-review above still
1507
+ runs exactly as written, including `oat-project-review-provide code final` and
1508
+ its no-duplicate-final-review rule. Then continue through Steps 9–14. Final
1509
+ approval occurs only in **Final HiLL Closeout Sequence**, after final review and
1510
+ the stored pre-approval sequence complete.
1511
+
1504
1512
  **Restart safety (required):**
1505
1513
 
1506
1514
  - At the end of each task and at each phase boundary, ensure `implementation.md` is persisted and internally consistent:
@@ -1541,7 +1549,7 @@ Do not use `git add -A` or glob patterns. Only commit the three project artifact
1541
1549
  **Note on HiLL types:**
1542
1550
 
1543
1551
  - **Workflow HiLL** (`oat_hill_checkpoints` in state.md): Gates between workflow phases (discovery → spec → design → plan → implement). Checked by oat-project-progress router.
1544
- - **Plan phase checkpoints** (`oat_plan_hill_phases` in plan.md): Gates at plan phase boundaries during implementation. `[]` means pause after every phase; a populated array pauses only after listed phases. The field may be absent only before the first implementation-run confirmation. Listed phases are where you stop AFTER completing them.
1552
+ - **Plan phase checkpoints** (`oat_plan_hill_phases` in plan.md): Gates at plan phase boundaries during implementation. `[]` means pause after every phase; a populated array pauses only after listed phases. The field may be absent only before the first implementation-run confirmation. Listed phases are where you stop AFTER completing them. A checkpoint on the final implementation phase is deferred to final closeout so final verification, final review, and configured pre-approval work finish before explicit approval.
1545
1553
  - **Phase review gate** (`oat_phase_review_gate` in plan.md): Optional non-pausing external review gate after a completed phase passes the standard reviewer. Missing/disabled means skip; `phases: []` means gate every implementation phase. Passing gates continue automatically; blocking gates are received/fixed before execution proceeds.
1546
1554
 
1547
1555
  **Revision phase completion handling:**
@@ -1715,10 +1723,12 @@ echo "$FINAL_ROW"
1715
1723
  - Example row:
1716
1724
  - `| final | code | passed | 2026-01-28 | reviews/final-review-2026-01-28T140322Z.md |`
1717
1725
  - Check:
1726
+
1718
1727
  ```bash
1719
1728
  echo "$FINAL_ROW" | grep -qE "^\\|\\s*final\\s*\\|.*\\|\\s*passed\\s*\\|" && echo "passed"
1720
1729
  ```
1721
- - Skip to Step 15 (PR prompt)
1730
+
1731
+ - Continue to Step 15 (final closeout)
1722
1732
 
1723
1733
  **If final review is not marked `passed`:**
1724
1734
 
@@ -1807,36 +1817,100 @@ To run in a separate session use: oat-project-review-provide code final
1807
1817
 
1808
1818
  **After final review is marked `passed`:**
1809
1819
 
1810
- - Update `"$PROJECT_PATH/state.md"` frontmatter:
1811
- - `oat_phase: implement`
1812
- - `oat_phase_status: complete`
1813
- - `oat_project_state_updated: "{ISO 8601 UTC timestamp}"`
1814
- - Append `"implement"` to `oat_hill_completed` (only if configured as a HiLL gate)
1815
- - Update state content to "Implementation complete".
1816
- - Update `"$PROJECT_PATH/plan.md"`:
1817
- - Set the `final` review row status to `passed` (if not already)
1818
- - Ensure `## Implementation Complete` totals reflect any review fix tasks that were added
1819
- - Update `"$PROJECT_PATH/implementation.md"`:
1820
- - Ensure `oat_current_task_id: null`
1821
- - Ensure the "Review Received" section reflects completed fixes and points to the next action (PR) rather than "execute fix tasks"
1820
+ - Record the passed final review and keep the project in implementation closeout.
1821
+ - Do not append `"implement"` to `oat_hill_completed`, set
1822
+ `oat_phase_status: complete`, or offer the normal next-step prompt yet.
1823
+ - Continue to **Final HiLL Closeout Sequence**.
1822
1824
 
1823
- ### Step 15: Prompt for Next Steps
1825
+ ### Step 15: Final HiLL Closeout Sequence
1824
1826
 
1825
- After final review passes (no Critical/Important findings):
1827
+ The final-closeout orchestrator owns this sequence after the rebased phase
1828
+ coordinator has finished. Do not move lifecycle sequencing into task workers or
1829
+ weaken exact target selection for child dispatches.
1826
1830
 
1827
- **Workflow preference check (before prompting):**
1831
+ Identify the final implementation phase from the plan. A final HiLL checkpoint
1832
+ exists when `oat_plan_hill_phases` is `[]` (every phase) or when it explicitly
1833
+ contains that final phase ID. Defer only a checkpoint on the final implementation
1834
+ phase; non-final checkpoint behavior remains unchanged.
1828
1835
 
1829
- ```bash
1830
- POST_IMPL=$(oat config get workflow.postImplementSequence 2>/dev/null || true)
1831
- ```
1836
+ Run final verification (Step 13). Final review must be `passed` before any
1837
+ pre-approval dispatch. If final checkpoint auto-review is enabled, Step 8 has
1838
+ already run `oat-project-review-provide code final`; do not run a duplicate
1839
+ final review here.
1840
+
1841
+ Read the effective `workflow.postImplementSequence` once. For a configured
1842
+ legacy or structured preference, normalize legacy values before snapshotting:
1843
+ `wait` → `{ preApproval: [], postApproval: [] }`, `summary` →
1844
+ `{ preApproval: ["summary"], postApproval: [] }`, `pr` → `{ preApproval:
1845
+ ["summary", "pr"], postApproval: [] }`, and `docs-pr` → `{ preApproval:
1846
+ ["summary", "document", "pr"], postApproval: [] }`.
1832
1847
 
1833
- - **If `POST_IMPL` is `wait`:** Print `Post-implementation: wait (from workflow.postImplementSequence). Run follow-up skills manually when ready.` Exit without auto-chaining.
1834
- - **If `POST_IMPL` is `summary`:** Print `Post-implementation: summary (from workflow.postImplementSequence).` Invoke `oat-project-summary`. Stop after summary completes.
1835
- - **If `POST_IMPL` is `pr`:** Print `Post-implementation: pr (from workflow.postImplementSequence).` Invoke `oat-project-pr-final` (which auto-generates `summary.md` as part of its flow).
1836
- - **If `POST_IMPL` is `docs-pr`:** Print `Post-implementation: docs-pr (from workflow.postImplementSequence).` Invoke `oat-project-document` then `oat-project-pr-final` (summary included via pr-final).
1837
- - **If unset or invalid:** Fall through to the standard prompt below.
1848
+ Persist this immutable state before dispatching a child:
1849
+
1850
+ ```yaml
1851
+ oat_post_implement_sequence:
1852
+ status: pre_approval # pre_approval | awaiting_approval | post_approval | failed | complete
1853
+ final_phase: pNN
1854
+ pre_approval: [summary, document, pr]
1855
+ pre_approval_completed: []
1856
+ approval: pending # pending | approved | not_required
1857
+ post_approval: []
1858
+ post_approval_completed: []
1859
+ failure: null
1860
+ ```
1838
1861
 
1839
- **Rationale:** `oat-project-pr-final` already auto-generates/refreshes `summary.md` as part of its flow, so `pr` and `docs-pr` do not need a separate summary step. The `summary` value exists as a standalone option for the rare case where you want just the summary without PR.
1862
+ The snapshot is immutable for this closeout: never re-resolve
1863
+ `workflow.postImplementSequence` while it is incomplete. Iterate
1864
+ `pre_approval` and `post_approval` in their stored array order; do not sort or
1865
+ substitute a vocabulary order. Resume from the first incomplete stored step,
1866
+ including a partially completed noncanonical order.
1867
+
1868
+ For every pending `summary`, `document`, or `pr`, dispatch respectively
1869
+ `oat-project-summary`, `oat-project-document`, or `oat-project-pr-final`.
1870
+ Every `summary`, `document`, and `pr` child receives the authoritative snapshot
1871
+ and must merge state updates without replacing `oat_post_implement_sequence`.
1872
+ Re-read and verify the snapshot after every child returns before recording step
1873
+ success. If a child removed or altered it, restore the authoritative snapshot,
1874
+ record that step as failed, and stop with the boundary, failed step, and exact
1875
+ resume command: `oat-project-implement`.
1876
+
1877
+ Commit each completed step before dispatching the next step. On failure, persist
1878
+ `status: failed`, the boundary, the failed step, and concise recovery context.
1879
+ A pre-approval failure leaves `approval: pending`; a post-approval failure
1880
+ retains `approval: approved`. Fail fast with the boundary, failed step, and
1881
+ exact resume command: `oat-project-implement`.
1882
+
1883
+ 1. Dispatch incomplete `pre_approval` steps in stored order.
1884
+ 2. When they succeed and a final checkpoint exists, commit `status:
1885
+ awaiting_approval` with `approval: pending` before asking for final HiLL
1886
+ approval.
1887
+ 3. Record explicit approval as `approval: approved` and `status: post_approval`
1888
+ before any post-approval dispatch. Then dispatch incomplete `post_approval`
1889
+ steps in stored order.
1890
+ 4. A decline or defer keeps `status: awaiting_approval` and `approval: pending`;
1891
+ record neither approval nor failure and run no post-approval step. State the
1892
+ boundary and exact resume command: `oat-project-implement`.
1893
+ 5. If no final checkpoint exists, commit `approval: not_required` before
1894
+ post-approval dispatch. `approval: not_required` is valid only when no final
1895
+ checkpoint exists.
1896
+ 6. After all stored steps finish, commit `status: complete`. Only then complete
1897
+ implementation state, append the configured final HiLL completion, and
1898
+ continue to the existing next-step behavior.
1899
+
1900
+ If the preference is unset, do not create a sequence snapshot. When the
1901
+ preference is unset, retain the existing next-step prompt only after final
1902
+ approval when a final checkpoint is configured.
1903
+
1904
+ ### Step 16: Prompt for Next Steps
1905
+
1906
+ Run the standard next-step prompt only when
1907
+ `workflow.postImplementSequence` was unset and no sequence snapshot was
1908
+ created. It occurs after final approval when a final checkpoint is configured.
1909
+ A configured legacy or structured preference has already completed through
1910
+ **Final HiLL Closeout Sequence**; do not re-dispatch its steps here. When the
1911
+ completed snapshot came from configured `wait`, print
1912
+ `Post-implementation: wait (from workflow.postImplementSequence). Run
1913
+ follow-up skills manually when ready.` and exit without auto-chaining.
1840
1914
 
1841
1915
  **Standard prompt (when preference is unset):**
1842
1916
 
@@ -1869,7 +1943,7 @@ Do not route directly to `oat-project-complete`. The `pr_open` status set by pr-
1869
1943
 
1870
1944
  Tell user: "Run the skills individually when ready: oat-project-summary → oat-project-document → oat-project-pr-final"
1871
1945
 
1872
- ### Step 16: Output Summary
1946
+ ### Step 17: Output Summary
1873
1947
 
1874
1948
  ```
1875
1949
  Implementation complete for {project-name}.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: oat-project-import-plan
3
- version: 1.4.4
3
+ version: 1.4.5
4
4
  description: Use when you have an external markdown plan to execute with OAT. Preserves the source plan and normalizes it into canonical plan.md format.
5
5
  argument-hint: '<path-to-plan.md> [--provider codex|cursor|claude] [--project <name>]'
6
6
  oat_gateable: true
@@ -16,7 +16,7 @@ Import a markdown plan from an external coding provider and normalize it into OA
16
16
  Provider native plan mode uses this same path: provider-plan-via-import
17
17
  preserves the provider plan first, and provider plan dispatch readiness
18
18
  inherits the same import workflow contract below, including complete ladder
19
- adoption, the project named ceiling, the `Shared Phase-Review Setup Contract`,
19
+ adoption, the project named ceiling, the `Shared Phase Gate Review Setup Contract`,
20
20
  and the rule that readiness and completion follow only after a durable review
21
21
  disposition. It does not add a separate provider-plan prompt.
22
22
 
@@ -277,10 +277,10 @@ maximum. Use the canonical
277
277
  project ceiling resolves. `Uncapped` and `Inherit Host Defaults` remain
278
278
  explicit modes; `Leave Unresolved` is not implementation-ready.
279
279
 
280
- ### Step 4.25: Configure Optional Phase Review
280
+ ### Step 4.25: Configure Optional Phase Gate Review
281
281
 
282
282
  After normalization has produced stable phase IDs and before Step 4.5 starts
283
- the import-aware plan artifact review, invoke the `Shared Phase-Review Setup
283
+ the import-aware plan artifact review, invoke the `Shared Phase Gate Review Setup
284
284
  Contract` from `oat-project-plan-writing`. Provider native plan mode uses this
285
285
  same import step and inherits its result.
286
286
 
@@ -289,10 +289,10 @@ through the shared contract without probing, prompting, or mutation. Resumed or
289
289
  imported explicit values remain authoritative without re-prompting. Otherwise
290
290
  let the contract probe qualifying targets and offer all phases, selected
291
291
  phases, or disabled. If the probe fails, no target qualifies, or the user
292
- declines, leave phase review disabled and continue with the contract's concise
292
+ declines, leave Phase gate review disabled and continue with the contract's concise
293
293
  status output.
294
294
 
295
- This phase-review setup is independent from HiLL checkpoints. Do not read or
295
+ This Phase gate review setup is independent from HiLL checkpoints. Do not read or
296
296
  change HiLL fields here, and do not add a provider/model `--target` to any
297
297
  lifecycle command.
298
298
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: oat-project-next
3
- version: 1.0.6
3
+ version: 1.0.7
4
4
  description: Use when continuing work on the active OAT project. Reads project state, determines the next lifecycle action, and invokes the appropriate skill automatically.
5
5
  disable-model-invocation: true
6
6
  user-invocable: true
@@ -259,6 +259,13 @@ Entry condition: `oat_phase == "implement"` AND (`oat_phase_status == "complete"
259
259
 
260
260
  Apply the following checks in priority order. Stop at the first match:
261
261
 
262
+ **5.0: Incomplete approval-aware post-implementation sequence**
263
+
264
+ Before every other post-implementation route, inspect `oat_post_implement_sequence`
265
+ in project state. When the snapshot exists and is incomplete, route to
266
+ `oat-project-implement`. This applies even when `oat_phase_status` is `pr_open`
267
+ or a summary exists. A completed snapshot falls through to the normal router.
268
+
262
269
  **5.1: Incomplete revision tasks**
263
270
 
264
271
  Grep plan.md for `p-revN` phases. If any `p-revN` tasks exist with status != completed in implementation.md:
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: oat-project-plan
3
- version: 1.3.12
3
+ version: 1.3.13
4
4
  description: Use when design.md is complete and executable implementation tasks are needed. Breaks design into bite-sized TDD tasks in canonical plan.md format.
5
5
  oat_gateable: true
6
6
  disable-model-invocation: true
@@ -203,7 +203,7 @@ oat_template: false
203
203
 
204
204
  When Overwrite restored an explicit phase-review snapshot, keep that exact
205
205
  entry in this first rewritten frontmatter. Do not let the generic frontmatter
206
- update remove or replace it. The shared phase-review setup in Step 12.25 must
206
+ update remove or replace it. The shared Phase gate review setup in Step 12.25 must
207
207
  observe the restored key and preserve it without probing, prompting, or
208
208
  mutation. When the key was absent from the overwritten plan, do not invent it
209
209
  before the shared setup contract runs.
@@ -417,20 +417,20 @@ Ask: "Does this breakdown make sense? Any tasks missing?"
417
417
 
418
418
  Iterate until user confirms.
419
419
 
420
- ### Step 12.25: Configure Optional Phase Review
420
+ ### Step 12.25: Configure Optional Phase Gate Review
421
421
 
422
422
  After the confirmed plan has stable phase IDs and before Step 12.5 starts the
423
- plan artifact review, invoke the `Shared Phase-Review Setup Contract` from
423
+ plan artifact review, invoke the `Shared Phase Gate Review Setup Contract` from
424
424
  `oat-project-plan-writing`.
425
425
 
426
426
  If `plan.md` already contains an explicit `oat_phase_review_gate`, preserve it
427
427
  through the shared contract without probing, prompting, or mutation. Otherwise
428
428
  let the contract probe qualifying targets and offer all phases, selected
429
429
  phases, or disabled. If the probe fails, no target qualifies, or the user
430
- declines, leave phase review disabled and continue with the contract's concise
430
+ declines, leave Phase gate review disabled and continue with the contract's concise
431
431
  status output.
432
432
 
433
- This phase-review setup is independent from HiLL checkpoints. Do not read or
433
+ This Phase gate review setup is independent from HiLL checkpoints. Do not read or
434
434
  change HiLL fields here, and do not add a provider/model `--target` to any
435
435
  lifecycle command.
436
436
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: oat-project-plan-writing
3
- version: 1.2.8
3
+ version: 1.2.9
4
4
  description: Use when authoring or mutating plan.md in any OAT workflow. Defines canonical format invariants — stable task IDs, required sections, review table rules, and resume guardrails.
5
5
  disable-model-invocation: true
6
6
  user-invocable: false
@@ -134,7 +134,7 @@ The Auto Artifact-Review Loop below consumes this reviewer dispatch contract.
134
134
  Tier selection happens only after the target-preserving route is known and
135
135
  changes execution mechanics, not the resolved model/effort contract.
136
136
 
137
- ## Shared Phase-Review Setup Contract
137
+ ## Shared Phase Gate Review Setup Contract
138
138
 
139
139
  Every plan-producing workflow invokes this procedure after the complete plan
140
140
  has stable phase IDs and before the plan artifact review begins. The calling
@@ -149,7 +149,7 @@ unchanged. Do not probe targets, prompt, or mutate the setting. This applies to
149
149
  enabled, disabled, resumed, and imported explicit values. Report:
150
150
 
151
151
  ```text
152
- Phase review: preserved existing oat_phase_review_gate setting.
152
+ Phase gate review: preserved existing oat_phase_review_gate setting.
153
153
  ```
154
154
 
155
155
  Implementation preflight remains responsible for rejecting a malformed
@@ -182,13 +182,13 @@ If the probe fails, emit exactly this concise warning and continue planning
182
182
  without adding the setting:
183
183
 
184
184
  ```text
185
- Warning: phase review target probe failed; phase review remains disabled.
185
+ Warning: Phase gate review target probe failed; Phase gate review remains disabled.
186
186
  ```
187
187
 
188
188
  If no qualifying target exists, emit:
189
189
 
190
190
  ```text
191
- Phase review: disabled (no qualifying target); phase review remains disabled.
191
+ Phase gate review: disabled (no qualifying target); Phase gate review remains disabled.
192
192
  ```
193
193
 
194
194
  Do not invent enablement in either branch.
@@ -198,9 +198,12 @@ Do not invent enablement in either branch.
198
198
  When at least one target qualifies and an interactive user-response channel is
199
199
  available, offer exactly these outcomes:
200
200
 
201
- 1. **All phases** - enable review for every implementation phase.
202
- 2. **Selected phases** - enable review only for chosen stable phase IDs.
203
- 3. **Disabled** - leave phase review disabled.
201
+ 1. **All phases** - enable the independent Phase gate review after every implementation phase.
202
+ 2. **Selected phases** - enable the independent Phase gate review only after chosen stable phase IDs.
203
+ 3. **Disabled** - leave Phase gate review disabled.
204
+
205
+ Phase gate review is non-pausing when it passes and is distinct from both HiLL
206
+ approval and final artifact review.
204
207
 
205
208
  For all phases, write the existing plan frontmatter shape:
206
209
 
@@ -222,7 +225,7 @@ If the user declines or chooses Disabled, do not add
222
225
  `oat_phase_review_gate`; emit:
223
226
 
224
227
  ```text
225
- Phase review: disabled (user declined); phase review remains disabled.
228
+ Phase gate review: disabled (user declined); Phase gate review remains disabled.
226
229
  ```
227
230
 
228
231
  ### 4. Handle non-interactive planning
@@ -233,7 +236,7 @@ a qualifying target, do not guess all phases or selected phases and do not
233
236
  invent enablement. Leave the setting absent and emit:
234
237
 
235
238
  ```text
236
- Phase review: disabled (non-interactive; no selection recorded); phase review remains disabled.
239
+ Phase gate review: disabled (non-interactive; no selection recorded); Phase gate review remains disabled.
237
240
  ```
238
241
 
239
242
  ### 5. Keep review gates independent from HiLL
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: oat-project-pr-final
3
- version: 1.4.1
3
+ version: 1.4.2
4
4
  description: Use when the user requests or confirms opening the final PR for an active OAT project — e.g. "open the final PR", "ship it", "run oat-project-pr-final", or confirms a previously offered final-PR step. Do NOT auto-invoke when phases are marked complete. Generates the final lifecycle PR description from artifacts and creates the PR.
5
5
  disable-model-invocation: false
6
6
  user-invocable: true
@@ -168,6 +168,13 @@ If `FINAL_ROW` is missing or does not contain `passed`:
168
168
 
169
169
  ### Step 3: Collect Project Summary
170
170
 
171
+ Before generating a summary, inspect `oat_post_implement_sequence`. Reuse a
172
+ completed `summary` step instead of regenerating it; when no completed sequence
173
+ summary exists, retain normal summary generation. Every state update in this
174
+ skill must merge with, never replace, `oat_post_implement_sequence`. If a PR
175
+ was partially created, reconcile the durable PR state before retrying its `pr`
176
+ sequence step.
177
+
171
178
  **Step 3.0: Check for summary.md**
172
179
 
173
180
  Check if `{PROJECT_PATH}/summary.md` exists:
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: oat-project-quick-start
3
- version: 2.1.13
3
+ version: 2.1.14
4
4
  description: Use when a task is small enough for quick mode or rapid iteration is preferred. Scaffolds a lightweight OAT project from discovery directly to a runnable plan, with optional brainstorming and lightweight design.
5
5
  argument-hint: '<project-name> ["project description"]'
6
6
  oat_gateable: true
@@ -563,20 +563,20 @@ copy compiled provider targets into this shape or user config. `Uncapped` and
563
563
  `Inherit Host Defaults` remain explicit modes; `Leave Unresolved` and
564
564
  non-interactive unresolved state are not implementation-ready.
565
565
 
566
- ### Step 3.55: Configure Optional Phase Review
566
+ ### Step 3.55: Configure Optional Phase Gate Review
567
567
 
568
568
  After the generated quick plan has stable phase IDs and before Step 3.6 starts
569
- the plan artifact review, invoke the `Shared Phase-Review Setup Contract` from
569
+ the plan artifact review, invoke the `Shared Phase Gate Review Setup Contract` from
570
570
  `oat-project-plan-writing`.
571
571
 
572
572
  If `plan.md` already contains an explicit `oat_phase_review_gate`, preserve it
573
573
  through the shared contract without probing, prompting, or mutation. Otherwise
574
574
  let the contract probe qualifying targets and offer all phases, selected
575
575
  phases, or disabled. If the probe fails, no target qualifies, or the user
576
- declines, leave phase review disabled and continue with the contract's concise
576
+ declines, leave Phase gate review disabled and continue with the contract's concise
577
577
  status output.
578
578
 
579
- This phase-review setup is independent from HiLL checkpoints. Do not read or
579
+ This Phase gate review setup is independent from HiLL checkpoints. Do not read or
580
580
  change HiLL fields here, and do not add a provider/model `--target` to any
581
581
  lifecycle command.
582
582
 
@@ -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,EAGL,KAAK,SAAS,EACd,KAAK,cAAc,EAGnB,KAAK,UAAU,EAahB,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;AAkFpC,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;AAo0DD,wBAAgB,mBAAmB,CACjC,SAAS,GAAE,OAAO,CAAC,yBAAyB,CAAM,GACjD,OAAO,CAsKT"}
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,EAGL,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;AAkFpC,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;AAq2DD,wBAAgB,mBAAmB,CACjC,SAAS,GAAE,OAAO,CAAC,yBAAyB,CAAM,GACjD,OAAO,CAsKT"}
@@ -7,7 +7,7 @@ import { readGlobalOptions } from '../shared/shared.utils.js';
7
7
  import { compileDispatchCeilingPreset } from '../../config/dispatch-ceiling-preset.js';
8
8
  import { normalizeDispatchMatrix, validateDispatchRouteTarget, walkDispatchMatrix, } from '../../config/dispatch-matrix.js';
9
9
  import { dispatchPolicyModeDescription, dispatchPolicyPolicyDescription, managedDispatchPolicyValueList, } from '../../config/dispatch-policy-options.js';
10
- import { VALID_DISPATCH_POLICY_MODES, VALID_MANAGED_DISPATCH_POLICIES, readOatConfig, readOatLocalConfig, readUserConfig, writeOatConfig, writeOatLocalConfig, writeUserConfig, } from '../../config/oat-config.js';
10
+ import { VALID_DISPATCH_POLICY_MODES, VALID_MANAGED_DISPATCH_POLICIES, normalizeWorkflowPostImplementSequence, readOatConfig, readOatLocalConfig, readUserConfig, writeOatConfig, writeOatLocalConfig, writeUserConfig, } from '../../config/oat-config.js';
11
11
  import { resolveEffectiveConfig, } from '../../config/resolve.js';
12
12
  import { resolveAssetsRoot } from '../../fs/assets.js';
13
13
  import { resolveProjectRoot } from '../../fs/paths.js';
@@ -389,11 +389,11 @@ const CONFIG_CATALOG = [
389
389
  group: 'Workflow Preferences (3-layer: local > shared > user)',
390
390
  file: '.oat/config.local.json | .oat/config.json | ~/.oat/config.json',
391
391
  scope: 'workflow',
392
- type: 'wait | summary | pr | docs-pr',
392
+ type: 'legacy string (wait | summary | pr | docs-pr) | structured JSON object',
393
393
  defaultValue: 'unset',
394
394
  mutability: 'read/write',
395
- owningCommand: 'oat config set workflow.postImplementSequence <value>',
396
- description: 'Default post-implementation chaining: "wait" stops without auto-chaining, "summary" generates summary only, "pr" runs pr-final (which auto-generates summary), "docs-pr" runs docs sync then pr-final. When unset, the skill prompts. Resolution: env > local > shared > user > default.',
395
+ owningCommand: "oat config set workflow.postImplementSequence '<legacy-or-json>'",
396
+ description: 'Default post-implementation chaining. Legacy strings remain supported unchanged. Structured JSON uses {"preApproval":[...],"postApproval":[...]} with the canonical sequence steps. Plain get/list/dump output serializes structured values as compact JSON; get --json preserves the object value. When unset, the skill prompts. Resolution: env > local > shared > user > default.',
397
397
  },
398
398
  {
399
399
  key: 'workflow.reviewExecutionModel',
@@ -717,6 +717,23 @@ function parseWorkflowValue(key, rawValue) {
717
717
  }
718
718
  return normalized === 'true';
719
719
  }
720
+ if (key === 'workflow.postImplementSequence') {
721
+ const normalized = rawValue.trim();
722
+ if (normalized.startsWith('{') || normalized.startsWith('[')) {
723
+ let parsed;
724
+ try {
725
+ parsed = JSON.parse(normalized);
726
+ }
727
+ catch {
728
+ throw new Error(`Invalid value for ${key}: expected valid structured JSON`);
729
+ }
730
+ const sequence = normalizeWorkflowPostImplementSequence(parsed);
731
+ if (!sequence || Array.isArray(parsed)) {
732
+ throw new Error(`Invalid value for ${key}: structured JSON must match {"preApproval":[...],"postApproval":[...]}`);
733
+ }
734
+ return sequence;
735
+ }
736
+ }
720
737
  const allowed = WORKFLOW_ENUM_VALUES[key];
721
738
  if (allowed) {
722
739
  const normalized = rawValue.trim();
@@ -828,6 +845,12 @@ function toAvailabilityRef(ref) {
828
845
  }
829
846
  function applyWorkflowValue(workflow, key, value) {
830
847
  const subKey = key.slice('workflow.'.length);
848
+ if (subKey === 'postImplementSequence') {
849
+ return {
850
+ ...workflow,
851
+ postImplementSequence: value,
852
+ };
853
+ }
831
854
  if (subKey === 'dispatchPolicy.mode') {
832
855
  const mode = value;
833
856
  if (mode === 'inherit') {
@@ -940,7 +963,7 @@ function formatResolvedValue(value) {
940
963
  }
941
964
  return String(value);
942
965
  }
943
- async function getConfigValue(repoRoot, userConfigDir, key, dependencies) {
966
+ async function getConfigValue(repoRoot, userConfigDir, key, dependencies, preserveRawObject = false) {
944
967
  const resolved = await dependencies.resolveEffectiveConfig(repoRoot, userConfigDir, dependencies.processEnv);
945
968
  const entry = resolved.resolved[key];
946
969
  if (!entry) {
@@ -948,7 +971,9 @@ async function getConfigValue(repoRoot, userConfigDir, key, dependencies) {
948
971
  }
949
972
  return {
950
973
  key,
951
- value: formatResolvedValue(entry.value),
974
+ value: preserveRawObject && typeof entry.value === 'object'
975
+ ? entry.value
976
+ : formatResolvedValue(entry.value),
952
977
  source: entry.source,
953
978
  };
954
979
  }
@@ -966,7 +991,7 @@ async function setConfigValue(repoRoot, userConfigDir, key, rawValue, surface, d
966
991
  const effectiveSurface = surface === 'auto' ? defaultSurfaceForKey(key) : surface;
967
992
  if (isWorkflowKey(key)) {
968
993
  const parsedValue = parseWorkflowValue(key, rawValue);
969
- const displayValue = typeof parsedValue === 'boolean' ? String(parsedValue) : parsedValue;
994
+ const displayValue = formatResolvedValue(parsedValue);
970
995
  if (typeof parsedValue === 'string' && isDispatchCeilingProviderKey(key)) {
971
996
  const availability = await dependencies.validateMatrixCell(providerNameFromConfigKey(key), parsedValue, {
972
997
  cwd: repoRoot,
@@ -1322,7 +1347,7 @@ async function runGet(keyArg, context, dependencies) {
1322
1347
  }
1323
1348
  const repoRoot = await dependencies.resolveProjectRoot(context.cwd);
1324
1349
  const userConfigDir = join(context.home, '.oat');
1325
- const value = await getConfigValue(repoRoot, userConfigDir, keyArg, dependencies);
1350
+ const value = await getConfigValue(repoRoot, userConfigDir, keyArg, dependencies, context.json);
1326
1351
  if (context.json) {
1327
1352
  context.logger.json({
1328
1353
  status: 'ok',
@@ -1330,7 +1355,7 @@ async function runGet(keyArg, context, dependencies) {
1330
1355
  });
1331
1356
  }
1332
1357
  else {
1333
- context.logger.info(value.value ?? '');
1358
+ context.logger.info(formatResolvedValue(value.value) ?? '');
1334
1359
  }
1335
1360
  process.exitCode = 0;
1336
1361
  }
@@ -19,7 +19,13 @@ export interface OatArchiveConfig {
19
19
  awsRegion?: string;
20
20
  }
21
21
  export type WorkflowHillCheckpointDefault = 'every' | 'final';
22
- export type WorkflowPostImplementSequence = 'wait' | 'summary' | 'pr' | 'docs-pr';
22
+ export type WorkflowPostImplementStep = 'summary' | 'document' | 'pr';
23
+ export type WorkflowPostImplementLegacySequence = 'wait' | 'summary' | 'pr' | 'docs-pr';
24
+ export interface WorkflowPostImplementStructuredSequence {
25
+ preApproval: WorkflowPostImplementStep[];
26
+ postApproval: WorkflowPostImplementStep[];
27
+ }
28
+ export type WorkflowPostImplementSequence = WorkflowPostImplementLegacySequence | WorkflowPostImplementStructuredSequence;
23
29
  export type WorkflowReviewExecutionModel = 'subagent' | 'inline' | 'fresh-session';
24
30
  export type WorkflowDesignMode = 'collaborative' | 'selective' | 'draft';
25
31
  export type WorkflowCodexDispatchCeiling = 'low' | 'medium' | 'high' | 'xhigh' | 'max';
@@ -86,6 +92,8 @@ export declare const VALID_DISPATCH_CEILING_PRESETS: readonly WorkflowDispatchCe
86
92
  export declare const VALID_DISPATCH_POLICY_MODES: readonly WorkflowDispatchPolicyMode[];
87
93
  export declare const VALID_MANAGED_DISPATCH_POLICIES: readonly WorkflowManagedDispatchPolicy[];
88
94
  export declare const BUILTIN_EXEC_TARGETS: Readonly<Record<string, ExecTarget>>;
95
+ export declare function normalizeWorkflowPostImplementSequence(value: unknown): WorkflowPostImplementStructuredSequence | undefined;
96
+ export declare function isWorkflowPostImplementStructuredSequence(value: unknown): value is WorkflowPostImplementStructuredSequence;
89
97
  export type OatToolsConfig = Partial<Record<'core' | 'ideas' | 'docs' | 'workflows' | 'utility' | 'project-management' | 'research' | 'brainstorm', boolean>>;
90
98
  export interface OatConfig {
91
99
  version: number;
@@ -1 +1 @@
1
- {"version":3,"file":"oat-config.d.ts","sourceRoot":"","sources":["../../src/config/oat-config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"oat-config.d.ts","sourceRoot":"","sources":["../../src/config/oat-config.ts"],"names":[],"mappings":"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"}
@@ -7,7 +7,21 @@ import { normalizeDispatchMatrix, } from './dispatch-matrix.js';
7
7
  import { parseJsonConfig } from './json.js';
8
8
  export { VALID_DISPATCH_MATRIX_TIERS, isCodexMaterializedRouteTarget, isWorkflowDispatchCandidateLadder, isWorkflowDispatchFallbackRoute, toWorkflowDispatchCandidateLadder, validateDispatchRouteTarget, } from './dispatch-matrix.js';
9
9
  const VALID_HILL_CHECKPOINT_DEFAULTS = ['every', 'final'];
10
- const VALID_POST_IMPLEMENT_SEQUENCES = ['wait', 'summary', 'pr', 'docs-pr'];
10
+ const VALID_POST_IMPLEMENT_LEGACY_SEQUENCES = ['wait', 'summary', 'pr', 'docs-pr'];
11
+ const VALID_POST_IMPLEMENT_STEPS = [
12
+ 'summary',
13
+ 'document',
14
+ 'pr',
15
+ ];
16
+ const LEGACY_POST_IMPLEMENT_SEQUENCES = {
17
+ wait: { preApproval: [], postApproval: [] },
18
+ summary: { preApproval: ['summary'], postApproval: [] },
19
+ pr: { preApproval: ['summary', 'pr'], postApproval: [] },
20
+ 'docs-pr': {
21
+ preApproval: ['summary', 'document', 'pr'],
22
+ postApproval: [],
23
+ },
24
+ };
11
25
  const VALID_REVIEW_EXECUTION_MODELS = [
12
26
  'subagent',
13
27
  'inline',
@@ -71,6 +85,41 @@ export const BUILTIN_EXEC_TARGETS = {
71
85
  priority: 70,
72
86
  },
73
87
  };
88
+ export function normalizeWorkflowPostImplementSequence(value) {
89
+ if (typeof value === 'string' &&
90
+ VALID_POST_IMPLEMENT_LEGACY_SEQUENCES.includes(value)) {
91
+ const legacy = LEGACY_POST_IMPLEMENT_SEQUENCES[value];
92
+ return {
93
+ preApproval: [...legacy.preApproval],
94
+ postApproval: [...legacy.postApproval],
95
+ };
96
+ }
97
+ if (!isRecord(value)) {
98
+ return undefined;
99
+ }
100
+ const keys = Object.keys(value);
101
+ if (keys.length !== 2 ||
102
+ !keys.includes('preApproval') ||
103
+ !keys.includes('postApproval') ||
104
+ !Array.isArray(value.preApproval) ||
105
+ !Array.isArray(value.postApproval)) {
106
+ return undefined;
107
+ }
108
+ const steps = [...value.preApproval, ...value.postApproval];
109
+ if (!steps.every((step) => typeof step === 'string' &&
110
+ VALID_POST_IMPLEMENT_STEPS.includes(step)) ||
111
+ new Set(steps).size !== steps.length) {
112
+ return undefined;
113
+ }
114
+ return {
115
+ preApproval: [...value.preApproval],
116
+ postApproval: [...value.postApproval],
117
+ };
118
+ }
119
+ export function isWorkflowPostImplementStructuredSequence(value) {
120
+ return (isRecord(value) &&
121
+ normalizeWorkflowPostImplementSequence(value) !== undefined);
122
+ }
74
123
  function normalizeMaxAttempts(value) {
75
124
  if (typeof value !== 'number' || !Number.isFinite(value)) {
76
125
  return 2;
@@ -199,10 +248,12 @@ function normalizeWorkflowConfig(parsed) {
199
248
  if (typeof parsed.createPrOnComplete === 'boolean') {
200
249
  next.createPrOnComplete = parsed.createPrOnComplete;
201
250
  }
202
- if (typeof parsed.postImplementSequence === 'string' &&
203
- VALID_POST_IMPLEMENT_SEQUENCES.includes(parsed.postImplementSequence)) {
251
+ const postImplementSequence = normalizeWorkflowPostImplementSequence(parsed.postImplementSequence);
252
+ if (postImplementSequence !== undefined) {
204
253
  next.postImplementSequence =
205
- parsed.postImplementSequence;
254
+ typeof parsed.postImplementSequence === 'string'
255
+ ? parsed.postImplementSequence
256
+ : postImplementSequence;
206
257
  }
207
258
  if (typeof parsed.reviewExecutionModel === 'string' &&
208
259
  VALID_REVIEW_EXECUTION_MODELS.includes(parsed.reviewExecutionModel)) {
@@ -1 +1 @@
1
- {"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../src/config/resolve.ts"],"names":[],"mappings":"AACA,OAAO,EAKL,KAAK,UAAU,EACf,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,cAAc,EACnB,KAAK,UAAU,EAChB,MAAM,cAAc,CAAC;AAEtB,MAAM,MAAM,oBAAoB,GAC5B,QAAQ,GACR,OAAO,GACP,MAAM,GACN,KAAK,GACL,SAAS,CAAC;AAEd,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,oBAAoB,CAAC;CAC9B;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,SAAS,CAAC;IAClB,KAAK,EAAE,cAAc,CAAC;IACtB,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;CAC5C;AAED,MAAM,WAAW,kCAAkC;IACjD,aAAa,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;IACxD,kBAAkB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;IAClE,cAAc,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;CAChE;AAmFD,wBAAsB,sBAAsB,CAC1C,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,EACrB,GAAG,GAAE,MAAM,CAAC,UAAwB,EACpC,SAAS,GAAE,OAAO,CAAC,kCAAkC,CAAM,GAC1D,OAAO,CAAC,cAAc,CAAC,CAgFzB;AAED,wBAAgB,WAAW,CACzB,SAAS,EAAE,cAAc,EACzB,SAAS,EAAE,MAAM,GAChB,UAAU,GAAG,IAAI,CAcnB;AAED,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,cAAc,GACxB,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAY5B;AAED,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEvE,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,UAAU,CAAC;IACnB,MAAM,EAAE,gBAAgB,CAAC;IACzB,oBAAoB,EAAE,OAAO,CAAC;IAC9B,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,cAAc,GACxB,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAoDxC"}
1
+ {"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../src/config/resolve.ts"],"names":[],"mappings":"AACA,OAAO,EAML,KAAK,UAAU,EACf,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,cAAc,EACnB,KAAK,UAAU,EAChB,MAAM,cAAc,CAAC;AAEtB,MAAM,MAAM,oBAAoB,GAC5B,QAAQ,GACR,OAAO,GACP,MAAM,GACN,KAAK,GACL,SAAS,CAAC;AAEd,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,oBAAoB,CAAC;CAC9B;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,SAAS,CAAC;IAClB,KAAK,EAAE,cAAc,CAAC;IACtB,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;CAC5C;AAED,MAAM,WAAW,kCAAkC;IACjD,aAAa,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;IACxD,kBAAkB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;IAClE,cAAc,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;CAChE;AAmFD,wBAAsB,sBAAsB,CAC1C,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,EACrB,GAAG,GAAE,MAAM,CAAC,UAAwB,EACpC,SAAS,GAAE,OAAO,CAAC,kCAAkC,CAAM,GAC1D,OAAO,CAAC,cAAc,CAAC,CAgFzB;AAED,wBAAgB,WAAW,CACzB,SAAS,EAAE,cAAc,EACzB,SAAS,EAAE,MAAM,GAChB,UAAU,GAAG,IAAI,CAcnB;AAED,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,cAAc,GACxB,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAY5B;AAED,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEvE,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,UAAU,CAAC;IACnB,MAAM,EAAE,gBAAgB,CAAC;IACzB,oBAAoB,EAAE,OAAO,CAAC;IAC9B,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,cAAc,GACxB,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAoDxC"}
@@ -1,5 +1,5 @@
1
1
  import { isWorkflowDispatchCandidateLadder } from './dispatch-matrix.js';
2
- import { BUILTIN_EXEC_TARGETS, readOatConfig, readOatLocalConfig, readUserConfig, } from './oat-config.js';
2
+ import { BUILTIN_EXEC_TARGETS, isWorkflowPostImplementStructuredSequence, readOatConfig, readOatLocalConfig, readUserConfig, } from './oat-config.js';
3
3
  const DEFAULT_DEPENDENCIES = {
4
4
  readOatConfig,
5
5
  readOatLocalConfig,
@@ -328,8 +328,7 @@ function flattenConfig(value, prefix = '') {
328
328
  continue;
329
329
  }
330
330
  const nextKey = prefix ? `${prefix}.${key}` : key;
331
- if (isRecord(nestedValue) &&
332
- !isWorkflowDispatchCandidateLadder(nestedValue)) {
331
+ if (isRecord(nestedValue) && !isAtomicConfigLeaf(nextKey, nestedValue)) {
333
332
  Object.assign(flattened, flattenConfig(nestedValue, nextKey));
334
333
  continue;
335
334
  }
@@ -337,6 +336,11 @@ function flattenConfig(value, prefix = '') {
337
336
  }
338
337
  return flattened;
339
338
  }
339
+ function isAtomicConfigLeaf(key, value) {
340
+ return (isWorkflowDispatchCandidateLadder(value) ||
341
+ (key === 'workflow.postImplementSequence' &&
342
+ isWorkflowPostImplementStructuredSequence(value)));
343
+ }
340
344
  function resolveEnvOverride(key, env) {
341
345
  const envKey = ENV_OVERRIDE_MAP[key];
342
346
  if (!envKey) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@open-agent-toolkit/cli",
3
- "version": "0.1.51",
3
+ "version": "0.1.52",
4
4
  "private": false,
5
5
  "description": "Open Agent Toolkit CLI",
6
6
  "homepage": "https://github.com/voxmedia/open-agent-toolkit/tree/main/packages/cli",
@@ -34,7 +34,7 @@
34
34
  "ora": "^9.0.0",
35
35
  "yaml": "2.8.2",
36
36
  "zod": "^3.25.76",
37
- "@open-agent-toolkit/control-plane": "0.1.51"
37
+ "@open-agent-toolkit/control-plane": "0.1.52"
38
38
  },
39
39
  "devDependencies": {
40
40
  "@types/node": "^22.10.0",