@open-agent-toolkit/cli 0.0.43 → 0.0.50
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/agents/oat-phase-implementer.md +230 -0
- package/assets/agents/oat-reviewer.md +3 -3
- package/assets/docs/cli-utilities/configuration.md +15 -3
- package/assets/docs/reference/cli-reference.md +17 -14
- package/assets/docs/reference/oat-directory-structure.md +17 -17
- package/assets/docs/workflows/projects/artifacts.md +34 -0
- package/assets/docs/workflows/projects/implementation-execution.md +161 -0
- package/assets/docs/workflows/projects/lifecycle.md +22 -29
- package/assets/docs/workflows/projects/reviews.md +4 -2
- package/assets/docs/workflows/skills/index.md +0 -1
- package/assets/public-package-versions.json +4 -4
- package/assets/skills/oat-doctor/SKILL.md +3 -3
- package/assets/skills/oat-project-implement/SKILL.md +363 -126
- package/assets/skills/oat-project-import-plan/SKILL.md +2 -3
- package/assets/skills/oat-project-next/SKILL.md +11 -12
- package/assets/skills/oat-project-plan/SKILL.md +23 -5
- package/assets/skills/oat-project-plan-writing/SKILL.md +2 -2
- package/assets/skills/oat-project-progress/SKILL.md +29 -35
- package/assets/skills/oat-project-quick-start/SKILL.md +13 -3
- package/assets/skills/oat-worktree-bootstrap-auto/SKILL.md +2 -2
- package/assets/templates/implementation.md +8 -3
- package/assets/templates/plan.md +24 -3
- package/assets/templates/state.md +1 -1
- package/dist/commands/config/index.d.ts.map +1 -1
- package/dist/commands/config/index.js +17 -4
- package/dist/commands/init/tools/index.js +1 -1
- package/dist/commands/init/tools/shared/skill-manifest.d.ts +2 -2
- package/dist/commands/init/tools/shared/skill-manifest.d.ts.map +1 -1
- package/dist/commands/init/tools/shared/skill-manifest.js +1 -1
- package/dist/commands/project/index.d.ts.map +1 -1
- package/dist/commands/project/index.js +3 -1
- package/dist/commands/project/set-mode/index.d.ts +0 -6
- package/dist/commands/project/set-mode/index.d.ts.map +1 -1
- package/dist/commands/project/set-mode/index.js +16 -96
- package/dist/commands/project/validate-plan/index.d.ts +3 -0
- package/dist/commands/project/validate-plan/index.d.ts.map +1 -0
- package/dist/commands/project/validate-plan/index.js +44 -0
- package/dist/commands/project/validate-plan/validate-plan.d.ts +20 -0
- package/dist/commands/project/validate-plan/validate-plan.d.ts.map +1 -0
- package/dist/commands/project/validate-plan/validate-plan.js +77 -0
- package/dist/commands/tools/update/index.d.ts +4 -0
- package/dist/commands/tools/update/index.d.ts.map +1 -1
- package/dist/commands/tools/update/index.js +17 -1
- package/dist/commands/tools/update/update-tools.d.ts +1 -0
- package/dist/commands/tools/update/update-tools.d.ts.map +1 -1
- package/dist/commands/tools/update/update-tools.js +80 -1
- package/dist/config/oat-config.d.ts +1 -0
- package/dist/config/oat-config.d.ts.map +1 -1
- package/dist/config/oat-config.js +3 -0
- package/dist/config/resolve.d.ts.map +1 -1
- package/dist/config/resolve.js +9 -0
- package/package.json +2 -2
- package/assets/skills/oat-project-subagent-implement/SKILL.md +0 -549
- package/assets/skills/oat-project-subagent-implement/examples/pattern-hill-checkpoint.md +0 -110
- package/assets/skills/oat-project-subagent-implement/examples/pattern-parallel-phases.md +0 -118
- package/assets/skills/oat-project-subagent-implement/scripts/dispatch.sh +0 -133
- package/assets/skills/oat-project-subagent-implement/scripts/reconcile.sh +0 -182
- package/assets/skills/oat-project-subagent-implement/scripts/review-gate.sh +0 -187
- package/assets/skills/oat-project-subagent-implement/tests/fixtures/sample-plan.md +0 -234
- package/assets/skills/oat-project-subagent-implement/tests/test-dry-run.sh +0 -126
- package/assets/skills/oat-project-subagent-implement/tests/test-hill-checkpoint.sh +0 -127
- package/assets/skills/oat-project-subagent-implement/tests/test-reconcile.sh +0 -254
- package/assets/skills/oat-project-subagent-implement/tests/test-review-gate.sh +0 -220
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: oat-project-import-plan
|
|
3
|
-
version: 1.2.
|
|
3
|
+
version: 1.2.1
|
|
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
|
disable-model-invocation: true
|
|
@@ -212,8 +212,7 @@ Report:
|
|
|
212
212
|
- active project pointer path
|
|
213
213
|
- dashboard refresh status
|
|
214
214
|
- next options:
|
|
215
|
-
- `oat-project-implement` (sequential
|
|
216
|
-
- `oat-project-subagent-implement` (parallel with autonomous review gates)
|
|
215
|
+
- `oat-project-implement` (sequential by default; parallel when `oat_plan_parallel_groups` is declared)
|
|
217
216
|
|
|
218
217
|
## Success Criteria
|
|
219
218
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: oat-project-next
|
|
3
|
-
version: 1.0.
|
|
3
|
+
version: 1.0.3
|
|
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
|
|
@@ -101,15 +101,14 @@ ls -d "$PROJECTS_ROOT"/*/ 2>/dev/null
|
|
|
101
101
|
|
|
102
102
|
Read `"$PROJECT_PATH/state.md"` frontmatter and extract:
|
|
103
103
|
|
|
104
|
-
| Field | Used For
|
|
105
|
-
| ---------------------- |
|
|
106
|
-
| `oat_phase` | Current lifecycle position (discovery, spec, design, plan, implement)
|
|
107
|
-
| `oat_phase_status` | Phase completion state (in_progress, complete, pr_open)
|
|
108
|
-
| `oat_workflow_mode` | Routing table selection (spec-driven, quick, import). Default: `spec-driven`
|
|
109
|
-
| `
|
|
110
|
-
| `
|
|
111
|
-
| `
|
|
112
|
-
| `oat_blockers` | Informational warnings (not routing gates) |
|
|
104
|
+
| Field | Used For |
|
|
105
|
+
| ---------------------- | ---------------------------------------------------------------------------- |
|
|
106
|
+
| `oat_phase` | Current lifecycle position (discovery, spec, design, plan, implement) |
|
|
107
|
+
| `oat_phase_status` | Phase completion state (in_progress, complete, pr_open) |
|
|
108
|
+
| `oat_workflow_mode` | Routing table selection (spec-driven, quick, import). Default: `spec-driven` |
|
|
109
|
+
| `oat_hill_checkpoints` | Which phases require HiLL approval |
|
|
110
|
+
| `oat_hill_completed` | Which HiLL gates have been passed |
|
|
111
|
+
| `oat_blockers` | Informational warnings (not routing gates) |
|
|
113
112
|
|
|
114
113
|
**If state.md is missing or unreadable:** Report error and suggest running the relevant phase skill directly. STOP.
|
|
115
114
|
|
|
@@ -231,7 +230,7 @@ Otherwise, look up the target skill from the routing table for the current `oat_
|
|
|
231
230
|
| plan | complete | tier 1 | `oat-project-implement` \* |
|
|
232
231
|
| implement | in_progress | — | `oat-project-implement` \* |
|
|
233
232
|
|
|
234
|
-
\*
|
|
233
|
+
\* `oat-project-implement` handles both sequential and parallel execution.
|
|
235
234
|
|
|
236
235
|
### Step 4: Check for Unprocessed Reviews (Review Safety Check)
|
|
237
236
|
|
|
@@ -261,7 +260,7 @@ Apply the following checks in priority order. Stop at the first match:
|
|
|
261
260
|
**5.1: Incomplete revision tasks**
|
|
262
261
|
|
|
263
262
|
Grep plan.md for `p-revN` phases. If any `p-revN` tasks exist with status != completed in implementation.md:
|
|
264
|
-
→ Route to `oat-project-implement`
|
|
263
|
+
→ Route to `oat-project-implement`
|
|
265
264
|
→ Announce: "Revision tasks pending — continuing implementation"
|
|
266
265
|
|
|
267
266
|
**5.2: Unprocessed reviews**
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: oat-project-plan
|
|
3
|
-
version: 1.
|
|
3
|
+
version: 1.3.1
|
|
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
|
disable-model-invocation: true
|
|
6
6
|
user-invocable: true
|
|
@@ -271,12 +271,13 @@ For each task, include:
|
|
|
271
271
|
- **Files:** Exact paths for create/modify/delete
|
|
272
272
|
- **Signatures:** Interface definitions, function signatures, type declarations
|
|
273
273
|
- **Test cases:** Test file paths and test descriptions (pseudocode OK for test bodies)
|
|
274
|
-
- **Commands:** Exact verification commands
|
|
274
|
+
- **Commands:** Exact verification commands that match the claimed scope. If the task says "run this file" or "run this test target," use the real runner invocation that actually scopes to that target rather than a shortcut that may execute the full package suite.
|
|
275
275
|
- **Commit:** Conventional commit message with task ID (e.g., `feat(p01-t03): ...`)
|
|
276
276
|
|
|
277
277
|
**Avoid:**
|
|
278
278
|
- Vague instructions ("update the file")
|
|
279
279
|
- Missing verification steps
|
|
280
|
+
- Verification shortcuts that claim file-scoped coverage but actually run a broader suite
|
|
280
281
|
- Bundled unrelated changes
|
|
281
282
|
- Full implementation code (leave that for oat-project-implement)
|
|
282
283
|
|
|
@@ -342,6 +343,25 @@ oat_last_updated: {today}
|
|
|
342
343
|
---
|
|
343
344
|
````
|
|
344
345
|
|
|
346
|
+
### Step 14.5: Propose Parallel Groups (Optional)
|
|
347
|
+
|
|
348
|
+
After all phases are drafted, evaluate whether any phases have non-overlapping file boundaries:
|
|
349
|
+
|
|
350
|
+
1. For each pair of adjacent phases in the plan, check the `Files:` section of all tasks in each phase.
|
|
351
|
+
2. If no file appears in both phases' task files sections, they are candidates for a parallel group.
|
|
352
|
+
3. Propose to the user:
|
|
353
|
+
|
|
354
|
+
```
|
|
355
|
+
I noticed phases p02 and p03 have disjoint file boundaries (no overlap).
|
|
356
|
+
Declare them as a parallel group? This lets oat-project-implement run them
|
|
357
|
+
concurrently in worktrees, cutting wall-clock time.
|
|
358
|
+
```
|
|
359
|
+
|
|
360
|
+
4. If the user confirms, update `oat_plan_parallel_groups` in the plan frontmatter.
|
|
361
|
+
5. If no phases are obviously independent, skip this step silently — do not invent parallelism.
|
|
362
|
+
|
|
363
|
+
Never silently infer parallelism without explicit user confirmation.
|
|
364
|
+
|
|
345
365
|
### Step 14: Update Project State
|
|
346
366
|
|
|
347
367
|
Update `"$PROJECT_PATH/state.md"`:
|
|
@@ -400,9 +420,7 @@ Phases:
|
|
|
400
420
|
|
|
401
421
|
Total: {N} tasks
|
|
402
422
|
|
|
403
|
-
Next:
|
|
404
|
-
- oat-project-implement — Sequential task execution (default)
|
|
405
|
-
- oat-project-subagent-implement — Parallel worktree execution with autonomous review gates
|
|
423
|
+
Next: Run oat-project-implement to begin execution.
|
|
406
424
|
```
|
|
407
425
|
|
|
408
426
|
## Success Criteria
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: oat-project-plan-writing
|
|
3
|
-
version: 1.2.
|
|
3
|
+
version: 1.2.1
|
|
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
|
|
@@ -47,7 +47,7 @@ Planning-time default:
|
|
|
47
47
|
Runtime routing note:
|
|
48
48
|
|
|
49
49
|
- Keep `oat_ready_for` canonical as `oat-project-implement`.
|
|
50
|
-
-
|
|
50
|
+
- Declare parallelism via `oat_plan_parallel_groups` in plan.md frontmatter (empty = sequential; nested arrays of phase IDs = parallel groups). `oat-project-implement` reads this field to choose sequential vs worktree-isolated parallel execution.
|
|
51
51
|
|
|
52
52
|
Additional frontmatter keys (`oat_phase`, `oat_phase_status`, `oat_blockers`, `oat_last_updated`, `oat_generated`, `oat_template`, `oat_import_reference`, `oat_import_source_path`, `oat_import_provider`) are set by calling skills as needed.
|
|
53
53
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: oat-project-progress
|
|
3
|
-
version: 1.2.
|
|
3
|
+
version: 1.2.2
|
|
4
4
|
description: Use when resuming work, checking status, or unsure which OAT skill to run next. Evaluates project progress and routes to the appropriate next step.
|
|
5
5
|
disable-model-invocation: true
|
|
6
6
|
user-invocable: true
|
|
@@ -180,11 +180,6 @@ Read `oat_workflow_mode` from `state.md` frontmatter:
|
|
|
180
180
|
- `quick`
|
|
181
181
|
- `import`
|
|
182
182
|
|
|
183
|
-
Read `oat_execution_mode` from `state.md` frontmatter:
|
|
184
|
-
|
|
185
|
-
- `single-thread` (default if missing)
|
|
186
|
-
- `subagent-driven`
|
|
187
|
-
|
|
188
183
|
**HiLL override (apply before phase routing):**
|
|
189
184
|
|
|
190
185
|
- If current `oat_phase` is listed in `oat_hill_checkpoints` **and** not listed in `oat_hill_completed`, the phase's HiLL gate is still pending.
|
|
@@ -228,38 +223,38 @@ Routing matrix by mode:
|
|
|
228
223
|
|
|
229
224
|
**Spec-Driven mode (`oat_workflow_mode: spec-driven`):**
|
|
230
225
|
|
|
231
|
-
| oat_phase | oat_phase_status | Next Skill
|
|
232
|
-
| --------- | ---------------- |
|
|
233
|
-
| discovery | in_progress | Continue `oat-project-discover`
|
|
234
|
-
| discovery | complete | `oat-project-spec`
|
|
235
|
-
| spec | in_progress | Continue `oat-project-spec`
|
|
236
|
-
| spec | complete | `oat-project-design`
|
|
237
|
-
| design | in_progress | Continue `oat-project-design`
|
|
238
|
-
| design | complete | `oat-project-plan`
|
|
239
|
-
| plan | in_progress | Continue `oat-project-plan`
|
|
240
|
-
| plan | complete | `oat-project-
|
|
241
|
-
| implement | in_progress | Continue `oat-project-
|
|
242
|
-
| implement | complete | Ready for final review / PR
|
|
226
|
+
| oat_phase | oat_phase_status | Next Skill |
|
|
227
|
+
| --------- | ---------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
228
|
+
| discovery | in_progress | Continue `oat-project-discover` |
|
|
229
|
+
| discovery | complete | `oat-project-spec` |
|
|
230
|
+
| spec | in_progress | Continue `oat-project-spec` |
|
|
231
|
+
| spec | complete | `oat-project-design` |
|
|
232
|
+
| design | in_progress | Continue `oat-project-design` |
|
|
233
|
+
| design | complete | `oat-project-plan` |
|
|
234
|
+
| plan | in_progress | Continue `oat-project-plan` |
|
|
235
|
+
| plan | complete | `oat-project-implement` |
|
|
236
|
+
| implement | in_progress | Continue `oat-project-implement`. If artifacts appear out of sync with recent commits (e.g., `implementation.md` has fewer completed tasks than commits suggest), also mention `oat-project-reconcile` as an option. |
|
|
237
|
+
| implement | complete | Ready for final review / PR |
|
|
243
238
|
|
|
244
239
|
**Quick mode (`oat_workflow_mode: quick`):**
|
|
245
240
|
|
|
246
|
-
| oat_phase | oat_phase_status | Next Skill
|
|
247
|
-
| --------- | ---------------- |
|
|
248
|
-
| discovery | in_progress | Continue `oat-project-discover`
|
|
249
|
-
| discovery | complete | `oat-project-plan`
|
|
250
|
-
| plan | in_progress | Continue `oat-project-plan`
|
|
251
|
-
| plan | complete | `oat-project-
|
|
252
|
-
| implement | in_progress | Continue `oat-project-
|
|
253
|
-
| implement | complete | Ready for final review / PR
|
|
241
|
+
| oat_phase | oat_phase_status | Next Skill |
|
|
242
|
+
| --------- | ---------------- | ----------------------------------------------------------------------------------------------------------------------------------- |
|
|
243
|
+
| discovery | in_progress | Continue `oat-project-discover` |
|
|
244
|
+
| discovery | complete | `oat-project-plan` |
|
|
245
|
+
| plan | in_progress | Continue `oat-project-plan` |
|
|
246
|
+
| plan | complete | `oat-project-implement` |
|
|
247
|
+
| implement | in_progress | Continue `oat-project-implement`. If drift detected (see drift detection above), also mention `oat-project-reconcile` as an option. |
|
|
248
|
+
| implement | complete | Ready for final review / PR |
|
|
254
249
|
|
|
255
250
|
**Import mode (`oat_workflow_mode: import`):**
|
|
256
251
|
|
|
257
|
-
| oat_phase | oat_phase_status | Next Skill
|
|
258
|
-
| --------- | ---------------- |
|
|
259
|
-
| plan | in_progress | Continue `oat-project-import-plan`
|
|
260
|
-
| plan | complete | `oat-project-
|
|
261
|
-
| implement | in_progress | Continue `oat-project-
|
|
262
|
-
| implement | complete | Ready for final review / PR
|
|
252
|
+
| oat_phase | oat_phase_status | Next Skill |
|
|
253
|
+
| --------- | ---------------- | ----------------------------------------------------------------------------------------------------------------------------------- |
|
|
254
|
+
| plan | in_progress | Continue `oat-project-import-plan` |
|
|
255
|
+
| plan | complete | `oat-project-implement` |
|
|
256
|
+
| implement | in_progress | Continue `oat-project-implement`. If drift detected (see drift detection above), also mention `oat-project-reconcile` as an option. |
|
|
257
|
+
| implement | complete | Ready for final review / PR |
|
|
263
258
|
|
|
264
259
|
**If blockers exist:**
|
|
265
260
|
|
|
@@ -272,7 +267,7 @@ Address blocker before continuing.
|
|
|
272
267
|
Execution-mode note:
|
|
273
268
|
|
|
274
269
|
- Keep `oat_ready_for` in `plan.md` canonical (`oat-project-implement`).
|
|
275
|
-
- Runtime
|
|
270
|
+
- Runtime execution is handled by `oat-project-implement`; parallelism is declared in plan.md via `oat_plan_parallel_groups`.
|
|
276
271
|
|
|
277
272
|
### Step 6: Show Available Skills
|
|
278
273
|
|
|
@@ -290,8 +285,7 @@ Workflow:
|
|
|
290
285
|
oat-project-spec - Create specification from discovery
|
|
291
286
|
oat-project-design - Create technical design from spec
|
|
292
287
|
oat-project-plan - Create implementation plan from design (spec-driven mode)
|
|
293
|
-
oat-project-implement - Execute implementation plan
|
|
294
|
-
oat-project-subagent-implement - Execute implementation plan with subagent orchestration
|
|
288
|
+
oat-project-implement - Execute implementation plan (sequential or parallel)
|
|
295
289
|
oat-project-reconcile - Reconcile manual/human commits with plan tasks
|
|
296
290
|
|
|
297
291
|
Status:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: oat-project-quick-start
|
|
3
|
-
version: 1.3.
|
|
3
|
+
version: 1.3.6
|
|
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
|
disable-model-invocation: true
|
|
@@ -301,6 +301,16 @@ Plan requirements — apply `oat-project-plan-writing` canonical format invarian
|
|
|
301
301
|
- Required sections: `## Reviews`, `## Implementation Complete`, `## References`
|
|
302
302
|
- Review table preservation rules (never delete existing rows)
|
|
303
303
|
|
|
304
|
+
Required parallelism pass before finalizing the plan:
|
|
305
|
+
|
|
306
|
+
- Evaluate adjacent phases for phase-level parallelism before treating the plan as complete.
|
|
307
|
+
- Set `oat_plan_parallel_groups` whenever phases can run independently in isolated worktrees with disjoint write boundaries and independent verification.
|
|
308
|
+
- Keep dependent tasks in the same phase when they must run sequentially.
|
|
309
|
+
- Do not declare parallel groups when phases share a fragile migration, require the same generated artifact, or one phase's tests depend on another phase's behavior.
|
|
310
|
+
- Add a short `## Parallelism` section to `plan.md` explaining the dependency and write-set reasoning, including why groups were declared or why the plan remains sequential.
|
|
311
|
+
- Quick mode is not "sequential by default." A quick-start plan is sequential only when the dependency and write-set analysis says it should be.
|
|
312
|
+
- When a task claims scoped verification, prefer the exact runner invocation that truly scopes to the intended file, test, or target instead of package-level shortcuts that may execute the full suite.
|
|
313
|
+
|
|
304
314
|
### Step 4: Sync Project State
|
|
305
315
|
|
|
306
316
|
Update `"$PROJECT_PATH/state.md"`:
|
|
@@ -355,9 +365,9 @@ Report:
|
|
|
355
365
|
- workflow mode (`quick`)
|
|
356
366
|
- total phases/tasks generated
|
|
357
367
|
- first task ID
|
|
368
|
+
- execution shape summary (sequential or declared parallel groups)
|
|
358
369
|
- next options:
|
|
359
|
-
- `oat-project-implement`
|
|
360
|
-
- `oat-project-subagent-implement` (parallel with autonomous review gates)
|
|
370
|
+
- `oat-project-implement`
|
|
361
371
|
- dashboard location: `.oat/state.md` (confirm it was regenerated)
|
|
362
372
|
|
|
363
373
|
## Success Criteria
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: oat-worktree-bootstrap-auto
|
|
3
|
-
version: 1.2.
|
|
3
|
+
version: 1.2.1
|
|
4
4
|
description: Use when an orchestrator/subagent needs autonomous worktree bootstrap. Non-interactive companion to oat-worktree-bootstrap.
|
|
5
5
|
argument-hint: '<branch-name> [--base <ref>] [--path <root>] [--baseline-policy <strict|allow-failing>]'
|
|
6
6
|
disable-model-invocation: true
|
|
@@ -226,7 +226,7 @@ Append to `implementation.md` under `## Implementation Log`:
|
|
|
226
226
|
|
|
227
227
|
**Orchestrator integration:**
|
|
228
228
|
|
|
229
|
-
- When invoked by `oat-project-
|
|
229
|
+
- When invoked by `oat-project-implement` in parallel mode, the baseline policy is passed through from the orchestration run policy.
|
|
230
230
|
- The orchestrator may set `--baseline-policy allow-failing` for exploratory runs and `strict` for production-quality execution.
|
|
231
231
|
- The bootstrap skill does not interpret HiLL checkpoints — that responsibility belongs to the orchestrator.
|
|
232
232
|
|
|
@@ -112,11 +112,16 @@ oat_template_name: implementation
|
|
|
112
112
|
|
|
113
113
|
## Orchestration Runs
|
|
114
114
|
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
115
|
+
_Each run from `oat-project-implement` appends an entry below with:_
|
|
116
|
+
_- Run header (number, timestamp, branch, tier, policy, phase counts)_
|
|
117
|
+
_- Phase Outcomes table_
|
|
118
|
+
_- Parallel Groups list_
|
|
119
|
+
_- Outstanding Items_
|
|
118
120
|
|
|
119
121
|
<!-- orchestration-runs-start -->
|
|
122
|
+
|
|
123
|
+
_Orchestration runs from `oat-project-implement` are appended here, most-recent-first within the file but append-only at the bottom of the log._
|
|
124
|
+
|
|
120
125
|
<!-- orchestration-runs-end -->
|
|
121
126
|
|
|
122
127
|
---
|
package/assets/templates/plan.md
CHANGED
|
@@ -6,6 +6,7 @@ oat_last_updated: YYYY-MM-DD
|
|
|
6
6
|
oat_phase: plan
|
|
7
7
|
oat_phase_status: in_progress
|
|
8
8
|
oat_plan_hill_phases: [] # phases to pause AFTER completing (empty = every phase)
|
|
9
|
+
oat_plan_parallel_groups: [] # groups of phases that run concurrently in worktrees; [] = fully sequential
|
|
9
10
|
oat_plan_source: spec-driven # spec-driven | quick | imported
|
|
10
11
|
oat_import_reference: null # e.g., references/imported-plan.md
|
|
11
12
|
oat_import_source_path: null # original source path provided by user
|
|
@@ -17,7 +18,7 @@ oat_template_name: plan
|
|
|
17
18
|
|
|
18
19
|
# Implementation Plan: {Project Name}
|
|
19
20
|
|
|
20
|
-
> Execute this plan using `oat-project-implement`
|
|
21
|
+
> Execute this plan using `oat-project-implement` — sequential by default, parallel when `oat_plan_parallel_groups` is declared.
|
|
21
22
|
|
|
22
23
|
**Goal:** {Brief goal statement from spec}
|
|
23
24
|
|
|
@@ -31,6 +32,22 @@ oat_template_name: plan
|
|
|
31
32
|
|
|
32
33
|
- [ ] Confirmed HiLL checkpoints with user
|
|
33
34
|
- [ ] Set `oat_plan_hill_phases` in frontmatter
|
|
35
|
+
- [ ] Evaluated phases for parallelism opportunities
|
|
36
|
+
- [ ] Set `oat_plan_parallel_groups` in frontmatter
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## Parallelism
|
|
41
|
+
|
|
42
|
+
Phases that have no overlapping file modifications may run concurrently. To declare parallelism:
|
|
43
|
+
|
|
44
|
+
```yaml
|
|
45
|
+
oat_plan_parallel_groups: [['p02', 'p03']]
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
Each inner array is a group of phases that execute in parallel (each in its own worktree) and merge back in plan order after all pass. Groups themselves run sequentially.
|
|
49
|
+
|
|
50
|
+
Default is `[]` (fully sequential, no worktrees). Only declare parallelism when phases are genuinely file-disjoint — overlap will produce merge conflicts that stop the run.
|
|
34
51
|
|
|
35
52
|
---
|
|
36
53
|
|
|
@@ -54,7 +71,7 @@ describe('{feature}', () => {
|
|
|
54
71
|
});
|
|
55
72
|
```
|
|
56
73
|
|
|
57
|
-
Run: `pnpm
|
|
74
|
+
Run: `pnpm --filter {package-name} exec vitest run {path/to/file.test.ts}`
|
|
58
75
|
Expected: Test fails (RED)
|
|
59
76
|
|
|
60
77
|
**Step 2: Implement (GREEN)**
|
|
@@ -64,9 +81,11 @@ Expected: Test fails (RED)
|
|
|
64
81
|
// Implementation code or interface signatures
|
|
65
82
|
```
|
|
66
83
|
|
|
67
|
-
Run: `pnpm
|
|
84
|
+
Run: `pnpm --filter {package-name} exec vitest run {path/to/file.test.ts}`
|
|
68
85
|
Expected: Test passes (GREEN)
|
|
69
86
|
|
|
87
|
+
Use the actual runner command that scopes to the intended file or test target. Do not write a package-level shortcut unless it truly executes only the scope the task claims.
|
|
88
|
+
|
|
70
89
|
**Step 3: Refactor**
|
|
71
90
|
|
|
72
91
|
{Any cleanup or improvements while tests stay green}
|
|
@@ -108,6 +127,8 @@ git commit -m "feat(p01-t01): {description}"
|
|
|
108
127
|
Run: `{verification command}`
|
|
109
128
|
Expected: {output}
|
|
110
129
|
|
|
130
|
+
Verification commands should be behaviorally accurate. If the task claims a file-scoped or test-scoped check, use the concrete runner invocation that really scopes to that target.
|
|
131
|
+
|
|
111
132
|
**Step 5: Commit**
|
|
112
133
|
|
|
113
134
|
```bash
|
|
@@ -8,7 +8,7 @@ oat_hill_completed: [] # Progress: which HiLL checkpoints have been completed
|
|
|
8
8
|
oat_parallel_execution: false
|
|
9
9
|
oat_phase: { OAT_PHASE } # Current phase: discovery | spec | design | plan | implement
|
|
10
10
|
oat_phase_status: in_progress # Status: in_progress | complete | pr_open
|
|
11
|
-
|
|
11
|
+
# oat_orchestration_retry_limit: 2 # optional; override fix-loop retry limit (range 0-5)
|
|
12
12
|
oat_workflow_mode: { OAT_WORKFLOW_MODE } # spec-driven | quick | import
|
|
13
13
|
oat_workflow_origin: native # native | imported
|
|
14
14
|
oat_docs_updated: null # null | skipped | complete — documentation sync status
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/config/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAGhF,OAAO,EACL,KAAK,SAAS,EACd,KAAK,cAAc,EAGnB,KAAK,UAAU,EAOhB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAEL,KAAK,cAAc,EAEpB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/config/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAGhF,OAAO,EACL,KAAK,SAAS,EACd,KAAK,cAAc,EAGnB,KAAK,UAAU,EAOhB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAEL,KAAK,cAAc,EAEpB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAqDpC,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,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC;CAC/B;AAwjCD,wBAAgB,mBAAmB,CACjC,SAAS,GAAE,OAAO,CAAC,yBAAyB,CAAM,GACjD,OAAO,CA0GT"}
|
|
@@ -34,6 +34,7 @@ const KEY_ORDER = [
|
|
|
34
34
|
'workflow.createPrOnComplete',
|
|
35
35
|
'workflow.postImplementSequence',
|
|
36
36
|
'workflow.reviewExecutionModel',
|
|
37
|
+
'workflow.autoReviewAtHillCheckpoints',
|
|
37
38
|
'workflow.autoNarrowReReviewScope',
|
|
38
39
|
'worktrees.root',
|
|
39
40
|
];
|
|
@@ -80,7 +81,7 @@ const CONFIG_CATALOG = [
|
|
|
80
81
|
defaultValue: 'false',
|
|
81
82
|
mutability: 'read/write',
|
|
82
83
|
owningCommand: 'oat config set autoReviewAtCheckpoints <true|false>',
|
|
83
|
-
description: '
|
|
84
|
+
description: 'Deprecated compatibility alias for workflow.autoReviewAtHillCheckpoints. Prefer `oat config set workflow.autoReviewAtHillCheckpoints <true|false>`.',
|
|
84
85
|
},
|
|
85
86
|
{
|
|
86
87
|
key: 'documentation.root',
|
|
@@ -346,6 +347,17 @@ const CONFIG_CATALOG = [
|
|
|
346
347
|
owningCommand: 'oat config set workflow.reviewExecutionModel <value>',
|
|
347
348
|
description: 'Default execution model for the final review step in oat-project-implement: "subagent" dispatches a review subagent, "inline" runs the review in-context, "fresh-session" prints guidance for running the review in a separate session (with an escape hatch to subagent/inline). When unset, the skill prompts. Resolution: env > local > shared > user > default.',
|
|
348
349
|
},
|
|
350
|
+
{
|
|
351
|
+
key: 'workflow.autoReviewAtHillCheckpoints',
|
|
352
|
+
group: 'Workflow Preferences (3-layer: local > shared > user)',
|
|
353
|
+
file: '.oat/config.local.json | .oat/config.json | ~/.oat/config.json',
|
|
354
|
+
scope: 'workflow',
|
|
355
|
+
type: 'boolean',
|
|
356
|
+
defaultValue: 'unset',
|
|
357
|
+
mutability: 'read/write',
|
|
358
|
+
owningCommand: 'oat config set workflow.autoReviewAtHillCheckpoints <true|false>',
|
|
359
|
+
description: 'Automatically run the extra lifecycle review when a HiLL checkpoint is reached. This does not control Tier 1 per-phase oat-reviewer gates. When unset, the skill prompts. Resolution: env > local > shared > user > legacy autoReviewAtCheckpoints > default.',
|
|
360
|
+
},
|
|
349
361
|
{
|
|
350
362
|
key: 'workflow.autoNarrowReReviewScope',
|
|
351
363
|
group: 'Workflow Preferences (3-layer: local > shared > user)',
|
|
@@ -422,6 +434,7 @@ const WORKFLOW_ENUM_VALUES = {
|
|
|
422
434
|
const WORKFLOW_BOOLEAN_KEYS = new Set([
|
|
423
435
|
'workflow.archiveOnComplete',
|
|
424
436
|
'workflow.createPrOnComplete',
|
|
437
|
+
'workflow.autoReviewAtHillCheckpoints',
|
|
425
438
|
'workflow.autoNarrowReReviewScope',
|
|
426
439
|
]);
|
|
427
440
|
function isWorkflowKey(key) {
|
|
@@ -467,10 +480,10 @@ function validateSurfaceForKey(key, surface) {
|
|
|
467
480
|
}
|
|
468
481
|
return;
|
|
469
482
|
}
|
|
470
|
-
//
|
|
471
|
-
//
|
|
483
|
+
// Legacy alias remains shared-only. The preferred multi-surface key is
|
|
484
|
+
// workflow.autoReviewAtHillCheckpoints.
|
|
472
485
|
if (key === 'autoReviewAtCheckpoints' && surface !== 'shared') {
|
|
473
|
-
throw new Error(`Cannot set 'autoReviewAtCheckpoints' at '${surface}' scope. This key is
|
|
486
|
+
throw new Error(`Cannot set 'autoReviewAtCheckpoints' at '${surface}' scope. This legacy key is shared-only; use workflow.autoReviewAtHillCheckpoints for local/user overrides.`);
|
|
474
487
|
}
|
|
475
488
|
// Workflow keys accept any non-auto surface.
|
|
476
489
|
}
|
|
@@ -349,7 +349,7 @@ export function buildToolPacksSectionBody(packs) {
|
|
|
349
349
|
lines.push(`- **${pack}** — ${PACK_DESCRIPTIONS[pack]}${suffix}`);
|
|
350
350
|
}
|
|
351
351
|
if (hasWorkflows) {
|
|
352
|
-
lines.push('', '### Workflow Execution Continuation', '', '- This guidance applies only to OAT project lifecycle execution, such as `oat-project-implement`,
|
|
352
|
+
lines.push('', '### Workflow Execution Continuation', '', '- This guidance applies only to OAT project lifecycle execution, such as `oat-project-implement`, and OAT project review/receive flows. It does not apply to non-OAT tasks or ad-hoc work outside the OAT project workflow.', '- When executing an OAT project implementation or OAT project review workflow, do not stop at task boundaries, phase boundaries, or other clean checkpoints unless the configured HiLL checkpoint has been reached, a real blocker exists, or explicit user input is required.', '- Status summaries, completed bookkeeping, and "clean boundary" pauses are not valid stop reasons. After updating tracking artifacts, continue execution until an allowed stop condition applies.');
|
|
353
353
|
}
|
|
354
354
|
return lines.join('\n');
|
|
355
355
|
}
|
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
* `bundle-assets.sh` maintains its own bash array — `bundle-consistency.test.ts`
|
|
6
6
|
* validates that it stays in sync with these lists.
|
|
7
7
|
*/
|
|
8
|
-
export declare const WORKFLOW_SKILLS: readonly ["oat-project-capture", "oat-project-clear-active", "oat-project-complete", "oat-project-design", "oat-project-discover", "oat-project-document", "oat-project-implement", "oat-project-import-plan", "oat-project-new", "oat-project-next", "oat-project-open", "oat-project-plan", "oat-project-plan-writing", "oat-project-pr-final", "oat-project-pr-progress", "oat-project-progress", "oat-project-promote-spec-driven", "oat-project-quick-start", "oat-project-reconcile", "oat-project-revise", "oat-project-review-provide", "oat-project-review-receive", "oat-project-review-receive-remote", "oat-project-spec", "oat-project-
|
|
9
|
-
export declare const WORKFLOW_AGENTS: readonly ["oat-codebase-mapper.md", "oat-reviewer.md"];
|
|
8
|
+
export declare const WORKFLOW_SKILLS: readonly ["oat-project-capture", "oat-project-clear-active", "oat-project-complete", "oat-project-design", "oat-project-discover", "oat-project-document", "oat-project-implement", "oat-project-import-plan", "oat-project-new", "oat-project-next", "oat-project-open", "oat-project-plan", "oat-project-plan-writing", "oat-project-pr-final", "oat-project-pr-progress", "oat-project-progress", "oat-project-promote-spec-driven", "oat-project-quick-start", "oat-project-reconcile", "oat-project-revise", "oat-project-review-provide", "oat-project-review-receive", "oat-project-review-receive-remote", "oat-project-spec", "oat-project-summary", "oat-repo-knowledge-index", "oat-worktree-bootstrap", "oat-worktree-bootstrap-auto", "oat-wrap-up"];
|
|
9
|
+
export declare const WORKFLOW_AGENTS: readonly ["oat-codebase-mapper.md", "oat-phase-implementer.md", "oat-reviewer.md"];
|
|
10
10
|
export declare const WORKFLOW_TEMPLATES: readonly ["state.md", "discovery.md", "spec.md", "design.md", "plan.md", "implementation.md", "summary.md"];
|
|
11
11
|
export declare const WORKFLOW_SCRIPTS: readonly ["generate-oat-state.sh", "generate-thin-index.sh", "resolve-tracking.sh"];
|
|
12
12
|
export declare const IDEA_SKILLS: readonly ["oat-idea-new", "oat-idea-ideate", "oat-idea-summarize", "oat-idea-scratchpad"];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill-manifest.d.ts","sourceRoot":"","sources":["../../../../../src/commands/init/tools/shared/skill-manifest.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,eAAO,MAAM,eAAe,
|
|
1
|
+
{"version":3,"file":"skill-manifest.d.ts","sourceRoot":"","sources":["../../../../../src/commands/init/tools/shared/skill-manifest.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,eAAO,MAAM,eAAe,muBA8BlB,CAAC;AAEX,eAAO,MAAM,eAAe,oFAIlB,CAAC;AAEX,eAAO,MAAM,kBAAkB,6GAQrB,CAAC;AAEX,eAAO,MAAM,gBAAgB,qFAInB,CAAC;AAIX,eAAO,MAAM,WAAW,2FAKd,CAAC;AAIX,eAAO,MAAM,WAAW,qCAAsC,CAAC;AAI/D,eAAO,MAAM,WAAW,yIAMd,CAAC;AAEX,eAAO,MAAM,YAAY,kCAAmC,CAAC;AAI7D,eAAO,MAAM,cAAc,gJAMjB,CAAC;AAIX,eAAO,MAAM,yBAAyB,kGAI5B,CAAC;AAEX,eAAO,MAAM,4BAA4B,4CAG/B,CAAC;AAEX,eAAO,MAAM,0BAA0B,aAAc,CAAC;AAItD,eAAO,MAAM,eAAe,2EAMlB,CAAC;AAEX,eAAO,MAAM,eAAe,qCAAsC,CAAC"}
|
|
@@ -31,7 +31,6 @@ export const WORKFLOW_SKILLS = [
|
|
|
31
31
|
'oat-project-review-receive',
|
|
32
32
|
'oat-project-review-receive-remote',
|
|
33
33
|
'oat-project-spec',
|
|
34
|
-
'oat-project-subagent-implement',
|
|
35
34
|
'oat-project-summary',
|
|
36
35
|
'oat-repo-knowledge-index',
|
|
37
36
|
'oat-worktree-bootstrap',
|
|
@@ -40,6 +39,7 @@ export const WORKFLOW_SKILLS = [
|
|
|
40
39
|
];
|
|
41
40
|
export const WORKFLOW_AGENTS = [
|
|
42
41
|
'oat-codebase-mapper.md',
|
|
42
|
+
'oat-phase-implementer.md',
|
|
43
43
|
'oat-reviewer.md',
|
|
44
44
|
];
|
|
45
45
|
export const WORKFLOW_TEMPLATES = [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/project/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/project/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC,wBAAgB,oBAAoB,IAAI,OAAO,CAY9C"}
|
|
@@ -7,6 +7,7 @@ import { createProjectOpenCommand } from './open/index.js';
|
|
|
7
7
|
import { createProjectPauseCommand } from './pause/index.js';
|
|
8
8
|
import { createProjectSetModeCommand } from './set-mode/index.js';
|
|
9
9
|
import { createProjectStatusCommand } from './status.js';
|
|
10
|
+
import { createProjectValidatePlanCommand } from './validate-plan/index.js';
|
|
10
11
|
export function createProjectCommand() {
|
|
11
12
|
return new Command('project')
|
|
12
13
|
.description('Manage OAT project workflows')
|
|
@@ -17,5 +18,6 @@ export function createProjectCommand() {
|
|
|
17
18
|
.addCommand(createProjectOpenCommand())
|
|
18
19
|
.addCommand(createProjectPauseCommand())
|
|
19
20
|
.addCommand(createProjectSetModeCommand())
|
|
20
|
-
.addCommand(createProjectStatusCommand())
|
|
21
|
+
.addCommand(createProjectStatusCommand())
|
|
22
|
+
.addCommand(createProjectValidatePlanCommand());
|
|
21
23
|
}
|
|
@@ -1,13 +1,7 @@
|
|
|
1
|
-
import { readFile as defaultReadFile, writeFile as defaultWriteFile } from 'node:fs/promises';
|
|
2
1
|
import { buildCommandContext, type CommandContext } from '../../../app/command-context.js';
|
|
3
2
|
import { Command } from 'commander';
|
|
4
|
-
export type ExecutionMode = 'single-thread' | 'subagent-driven';
|
|
5
3
|
interface SetModeDependencies {
|
|
6
4
|
buildCommandContext: (options: Parameters<typeof buildCommandContext>[0]) => CommandContext;
|
|
7
|
-
resolveProjectRoot: (cwd: string) => Promise<string>;
|
|
8
|
-
readFile: typeof defaultReadFile;
|
|
9
|
-
writeFile: typeof defaultWriteFile;
|
|
10
|
-
now: () => Date;
|
|
11
5
|
}
|
|
12
6
|
export declare function createProjectSetModeCommand(overrides?: Partial<SetModeDependencies>): Command;
|
|
13
7
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/commands/project/set-mode/index.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/commands/project/set-mode/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEhF,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,UAAU,mBAAmB;IAC3B,mBAAmB,EAAE,CACnB,OAAO,EAAE,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAC,CAAC,CAAC,KAC/C,cAAc,CAAC;CACrB;AA+BD,wBAAgB,2BAA2B,CACzC,SAAS,GAAE,OAAO,CAAC,mBAAmB,CAAM,GAC3C,OAAO,CAeT"}
|