@open-agent-toolkit/cli 0.3.18 → 0.3.20
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/README.md +2 -1
- package/assets/agents/oat-phase-implementer.md +104 -3
- package/assets/agents/oat-reviewer.md +20 -5
- package/assets/bundle-metadata.json +1 -1
- package/assets/docs/reference/cli-reference.md +15 -7
- package/assets/docs/reference/oat-directory-structure.md +2 -0
- package/assets/docs/reference/project-artifacts.md +72 -1
- package/assets/docs/reference/project-state-machine.md +55 -6
- package/assets/docs/skills/brainstorm.md +3 -1
- package/assets/docs/skills/index.md +13 -9
- package/assets/docs/workflows/advanced/autonomy.md +12 -2
- package/assets/docs/workflows/advanced/dispatch-ceiling.md +2 -2
- package/assets/docs/workflows/advanced/workflow-gates.md +25 -7
- package/assets/docs/workflows/approvals-and-automation.md +25 -9
- package/assets/docs/workflows/choose-workflow.md +24 -8
- package/assets/docs/workflows/ideas/index.md +1 -1
- package/assets/docs/workflows/ideas/lifecycle.md +3 -2
- package/assets/docs/workflows/projects/closeout/closeout-skills.md +83 -5
- package/assets/docs/workflows/projects/closeout/pr-flow.md +9 -1
- package/assets/docs/workflows/projects/execution/execution-skills.md +27 -2
- package/assets/docs/workflows/projects/execution/implementation-execution.md +15 -0
- package/assets/docs/workflows/projects/execution/picking-up-projects.md +20 -1
- package/assets/docs/workflows/projects/lifecycle.md +172 -9
- package/assets/docs/workflows/projects/planning/hill-checkpoints.md +18 -1
- package/assets/docs/workflows/projects/planning/planning-skills.md +13 -10
- package/assets/docs/workflows/projects/planning/starting-projects.md +138 -20
- package/assets/docs/workflows/projects/reviews/index.md +36 -2
- package/assets/docs/workflows/projects/reviews/review-flavors.md +7 -3
- package/assets/public-package-versions.json +4 -4
- package/assets/skills/oat-brainstorm/SKILL.md +58 -9
- package/assets/skills/oat-brainstorm/references/destinations.md +12 -4
- package/assets/skills/oat-docs/SKILL.md +13 -4
- package/assets/skills/oat-pjm-review-backlog/SKILL.md +2 -2
- package/assets/skills/oat-project-autonomous/SKILL.md +20 -8
- package/assets/skills/oat-project-autonomous/references/gate-inventory.md +156 -122
- package/assets/skills/oat-project-brief/SKILL.md +592 -0
- package/assets/skills/oat-project-brief/references/brief-contract.md +743 -0
- package/assets/skills/oat-project-brief/references/docs/autonomy-contract.md +412 -0
- package/assets/skills/oat-project-brief/references/docs/gate-approval-record.md +93 -0
- package/assets/skills/oat-project-capture/SKILL.md +2 -2
- package/assets/skills/oat-project-complete/SKILL.md +16 -2
- package/assets/skills/oat-project-discover/SKILL.md +4 -2
- package/assets/skills/oat-project-dispatch-subagents/SKILL.md +9 -1
- package/assets/skills/oat-project-document/SKILL.md +17 -1
- package/assets/skills/oat-project-document/references/docs/autonomy-contract.md +156 -122
- package/assets/skills/oat-project-goal/SKILL.md +697 -0
- package/assets/skills/oat-project-goal/references/docs/autonomy-contract.md +412 -0
- package/assets/skills/oat-project-goal/references/docs/gate-approval-record.md +93 -0
- package/assets/skills/oat-project-implement/SKILL.md +1 -1
- package/assets/skills/oat-project-implement/references/completion-and-closeout.md +107 -0
- package/assets/skills/oat-project-implement/references/docs/autonomy-contract.md +156 -122
- package/assets/skills/oat-project-implement/references/docs/gate-approval-record.md +13 -0
- package/assets/skills/oat-project-implement/references/phase-execution.md +173 -1
- package/assets/skills/oat-project-implement/references/plan-and-resume.md +124 -3
- package/assets/skills/oat-project-import-plan/SKILL.md +5 -1
- package/assets/skills/oat-project-lite/SKILL.md +4 -1
- package/assets/skills/oat-project-lite/references/docs/autonomy-contract.md +156 -122
- package/assets/skills/oat-project-new/SKILL.md +5 -1
- package/assets/skills/oat-project-next/SKILL.md +71 -14
- package/assets/skills/oat-project-next/references/docs/gate-approval-record.md +13 -0
- package/assets/skills/oat-project-plan/SKILL.md +24 -3
- package/assets/skills/oat-project-plan-writing/SKILL.md +8 -4
- package/assets/skills/oat-project-pr-final/SKILL.md +65 -3
- package/assets/skills/oat-project-pr-final/references/docs/autonomy-contract.md +156 -122
- package/assets/skills/oat-project-pr-progress/SKILL.md +125 -4
- package/assets/skills/oat-project-progress/SKILL.md +63 -8
- package/assets/skills/oat-project-progress/references/docs/gate-approval-record.md +13 -0
- package/assets/skills/oat-project-promote-spec-driven/SKILL.md +2 -2
- package/assets/skills/oat-project-quick-start/SKILL.md +65 -1
- package/assets/skills/oat-project-quick-start/references/docs/autonomy-contract.md +156 -122
- package/assets/skills/oat-project-quick-start/references/docs/gate-approval-record.md +13 -0
- package/assets/skills/oat-project-reconcile/SKILL.md +94 -3
- package/assets/skills/oat-project-review-provide/SKILL.md +397 -12
- package/assets/skills/oat-project-review-receive/SKILL.md +155 -1
- package/assets/skills/oat-project-revise/SKILL.md +51 -4
- package/assets/skills/oat-project-summary/SKILL.md +150 -2
- package/assets/skills/oat-wave-execute/SKILL.md +3 -2
- package/assets/templates/implementation-brief.md +165 -0
- package/assets/templates/plan-brief.md +140 -0
- package/assets/templates/plan.md +1 -1
- package/assets/templates/state.md +8 -2
- package/dist/commands/project/closeout-check/closeout-invariant.d.ts +119 -3
- package/dist/commands/project/closeout-check/closeout-invariant.d.ts.map +1 -1
- package/dist/commands/project/closeout-check/closeout-invariant.js +454 -2
- package/dist/commands/project/closeout-check/index.d.ts +21 -3
- package/dist/commands/project/closeout-check/index.d.ts.map +1 -1
- package/dist/commands/project/closeout-check/index.js +190 -4
- package/dist/commands/project/complete-state/index.d.ts +2 -1
- package/dist/commands/project/complete-state/index.d.ts.map +1 -1
- package/dist/commands/project/complete-state/index.js +7 -1
- package/dist/commands/project/delivery/check.d.ts +66 -0
- package/dist/commands/project/delivery/check.d.ts.map +1 -0
- package/dist/commands/project/delivery/check.js +232 -0
- package/dist/commands/project/delivery/evidence.d.ts +171 -0
- package/dist/commands/project/delivery/evidence.d.ts.map +1 -0
- package/dist/commands/project/delivery/evidence.js +902 -0
- package/dist/commands/project/delivery/index.d.ts +7 -0
- package/dist/commands/project/delivery/index.d.ts.map +1 -0
- package/dist/commands/project/delivery/index.js +13 -0
- package/dist/commands/project/delivery/refresh.d.ts +110 -0
- package/dist/commands/project/delivery/refresh.d.ts.map +1 -0
- package/dist/commands/project/delivery/refresh.js +441 -0
- package/dist/commands/project/index.d.ts.map +1 -1
- package/dist/commands/project/index.js +2 -0
- package/dist/commands/project/log/append.d.ts +6 -0
- package/dist/commands/project/log/append.d.ts.map +1 -1
- package/dist/commands/project/log/append.js +6 -1
- package/dist/commands/project/new/scaffold.d.ts +1 -1
- package/dist/commands/project/new/scaffold.d.ts.map +1 -1
- package/dist/commands/project/new/scaffold.js +81 -7
- package/dist/commands/project/promote/promote.d.ts +46 -1
- package/dist/commands/project/promote/promote.d.ts.map +1 -1
- package/dist/commands/project/promote/promote.js +646 -5
- package/dist/commands/project/validate-plan/frontmatter.d.ts +12 -0
- package/dist/commands/project/validate-plan/frontmatter.d.ts.map +1 -0
- package/dist/commands/project/validate-plan/frontmatter.js +27 -0
- package/dist/commands/project/validate-plan/index.d.ts.map +1 -1
- package/dist/commands/project/validate-plan/index.js +62 -18
- package/dist/commands/project/validate-plan/profiles.d.ts +69 -0
- package/dist/commands/project/validate-plan/profiles.d.ts.map +1 -0
- package/dist/commands/project/validate-plan/profiles.js +420 -0
- package/dist/commands/project/validate-plan/validate-plan.d.ts +3 -19
- package/dist/commands/project/validate-plan/validate-plan.d.ts.map +1 -1
- package/dist/commands/project/validate-plan/validate-plan.js +5 -82
- package/dist/commands/shared/frontmatter.d.ts +1 -1
- package/dist/commands/shared/frontmatter.d.ts.map +1 -1
- package/dist/commands/shared/frontmatter.js +2 -0
- package/dist/commands/state/generate.d.ts.map +1 -1
- package/dist/commands/state/generate.js +82 -2
- package/dist/commands/tools/shared/pack-manifest.d.ts.map +1 -1
- package/dist/commands/tools/shared/pack-manifest.js +4 -0
- package/package.json +2 -2
|
@@ -5,7 +5,7 @@ disable-model-invocation: true
|
|
|
5
5
|
user-invocable: true
|
|
6
6
|
allowed-tools: Read, Write, Bash(awk:*), Bash(gh:*), Bash(git:*), Bash(mktemp:*), Bash(oat:*), Bash(rm:*), Glob, Grep, AskUserQuestion
|
|
7
7
|
metadata:
|
|
8
|
-
version: 1.3.
|
|
8
|
+
version: 1.3.4
|
|
9
9
|
---
|
|
10
10
|
|
|
11
11
|
# Progress PR
|
|
@@ -16,7 +16,7 @@ Create a progress PR description (typically at a plan phase boundary) and write
|
|
|
16
16
|
|
|
17
17
|
Generate a PR-ready summary that is:
|
|
18
18
|
|
|
19
|
-
- grounded in OAT artifacts (mode-aware: spec-driven uses spec/design; quick/import may use discovery/import reference; lite uses the five plan.md contract sections)
|
|
19
|
+
- grounded in OAT artifacts (mode-aware: spec-driven uses spec/design; quick/import may use discovery/import reference; lite uses the five plan.md contract sections; brief and goal use the Project Brief's Outcomes and each phase's Intent and Exit evidence)
|
|
20
20
|
- scoped to a specific phase (pNN) or an explicit git range
|
|
21
21
|
- easy to paste into GitHub (or used with `gh pr create` if desired)
|
|
22
22
|
|
|
@@ -141,7 +141,7 @@ If scope is `pNN`, gather commits via commit convention grep:
|
|
|
141
141
|
|
|
142
142
|
```bash
|
|
143
143
|
PHASE="p02" # example
|
|
144
|
-
git log --oneline --grep="
|
|
144
|
+
git log --oneline --fixed-strings --grep="(${PHASE}-" --max-count=500
|
|
145
145
|
```
|
|
146
146
|
|
|
147
147
|
If the grep returns no commits:
|
|
@@ -155,6 +155,36 @@ If scope is `range`/`base_sha`, set:
|
|
|
155
155
|
|
|
156
156
|
- `SCOPE_RANGE` to the range string (e.g., `abc..HEAD`)
|
|
157
157
|
|
|
158
|
+
**Brief modes (`oat_workflow_mode: brief`).** A `pNN` or `p-revN` scope (or a
|
|
159
|
+
contiguous `pNN-pMM` run) resolves from the journal anchors, never from the
|
|
160
|
+
commit grep above (`oat-project-brief/references/brief-contract.md` section
|
|
161
|
+
10):
|
|
162
|
+
|
|
163
|
+
- Read the exact `**Base:**` and `**Head:**` lines directly under the phase's
|
|
164
|
+
`## Phase` heading in `implementation.md`.
|
|
165
|
+
- When both exist, verify each names a commit (`git cat-file -e "$SHA^{commit}"`)
|
|
166
|
+
and that the base is an ancestor of the head
|
|
167
|
+
(`git merge-base --is-ancestor "$PHASE_BASE" "$PHASE_HEAD"`), then set
|
|
168
|
+
`SCOPE_RANGE="$PHASE_BASE..$PHASE_HEAD"`. For a run, the range is the first
|
|
169
|
+
base through the last head, under the same containment and continuity
|
|
170
|
+
checks as `oat-project-review-provide` Step 3.0.
|
|
171
|
+
- A missing anchor widens the range to `merge-base..HEAD`; `(pNN-` commit
|
|
172
|
+
matches only label which commits belong to the phase, and the PR body says
|
|
173
|
+
the range was widened because the anchors are missing.
|
|
174
|
+
- An anchor that is not a commit, a base that is not an ancestor of its head,
|
|
175
|
+
or a contradictory ordering stops the PR: route to `oat-project-reconcile`
|
|
176
|
+
and never narrow the range silently.
|
|
177
|
+
|
|
178
|
+
**Goal mode (`oat_workflow_mode: goal`).** A goal progress PR is a milestone
|
|
179
|
+
delivery, and this skill is its registration owner. The scope is the router's
|
|
180
|
+
`deliver mNN` or `deliver mNN/dNN` context, or a pending `oat_goal_recovery`
|
|
181
|
+
record at stage `delivering`: the milestone's ordered phase set from the shared
|
|
182
|
+
Milestones reader, or a registered delivery's frozen scope. Never derive it from
|
|
183
|
+
a `pNN-pMM` range or commit labels. The Git range for the PR description is the
|
|
184
|
+
set's first anchored base through its last anchored head; disclose phases of
|
|
185
|
+
other milestones that fall inside it. Step 5.5 runs before Step 6 and replaces
|
|
186
|
+
its optional PR creation.
|
|
187
|
+
|
|
158
188
|
### Step 2: Load Artifacts (Mode-Aware)
|
|
159
189
|
|
|
160
190
|
Resolve workflow mode from `state.md` (default `spec-driven`):
|
|
@@ -172,6 +202,13 @@ Read (as available):
|
|
|
172
202
|
- `{PROJECT_PATH}/discovery.md` (recommended for quick mode)
|
|
173
203
|
- `{PROJECT_PATH}/references/imported-plan.md` (recommended for import mode)
|
|
174
204
|
|
|
205
|
+
For `WORKFLOW_MODE=brief`, read `plan.md` (the Project Brief: Goal, Outcomes,
|
|
206
|
+
Decisions, and the in-scope phases' Intent and Exit evidence are the
|
|
207
|
+
requirements source) and `implementation.md` (the phase journal: anchors,
|
|
208
|
+
execution records, verification evidence). `discovery.md`, `spec.md`, and
|
|
209
|
+
`design.md` are absent by design; say in the PR summary that the requirements
|
|
210
|
+
come from the brief rather than noting missing spec-driven artifacts.
|
|
211
|
+
|
|
175
212
|
If `WORKFLOW_MODE != spec-driven` and spec/design are missing:
|
|
176
213
|
|
|
177
214
|
- continue (do not block)
|
|
@@ -286,7 +323,7 @@ oat_project: { PROJECT_PATH }
|
|
|
286
323
|
|
|
287
324
|
## Goals / Non-Goals
|
|
288
325
|
|
|
289
|
-
{goals addressed by this phase, from available requirement artifacts: spec in spec-driven mode; discovery/import reference in quick/import mode; Summary, Decisions, Assumptions, Out of Scope, and Validation Criteria in plan.md for lite}
|
|
326
|
+
{goals addressed by this phase, from available requirement artifacts: spec in spec-driven mode; discovery/import reference in quick/import mode; Summary, Decisions, Assumptions, Out of Scope, and Validation Criteria in plan.md for lite; the phase's Intent and Exit evidence plus the brief's Outcomes for brief and goal}
|
|
290
327
|
|
|
291
328
|
## Changes
|
|
292
329
|
|
|
@@ -317,6 +354,89 @@ Only include links to artifacts that actually exist in the project. Omit any tha
|
|
|
317
354
|
- Reviews: `[reviews/]({REPO_WEB}/tree/{BRANCH}/{PROJECT_REL}/reviews)` (fallback: `{PROJECT_PATH}/reviews/`) — include when active `reviews/` is tracked; omit archived review paths and any target that still matches a `localPaths` pattern
|
|
318
355
|
```
|
|
319
356
|
|
|
357
|
+
### Step 5.5: Goal Delivery Registration (`goal` only)
|
|
358
|
+
|
|
359
|
+
`oat-project-brief/references/brief-contract.md` sections 12.5–12.8 govern;
|
|
360
|
+
this step states only the order. It never writes review dispositions, exit
|
|
361
|
+
gate outcomes, or `oat_milestone` itself, and it never registers a delivery
|
|
362
|
+
without passing evidence.
|
|
363
|
+
|
|
364
|
+
1. **Refresh.** When `oat_deliveries` has entries, run
|
|
365
|
+
`oat project delivery refresh --project "$PROJECT_PATH" --json` and commit
|
|
366
|
+
the persisted observations as bookkeeping.
|
|
367
|
+
2. **Check.** Run
|
|
368
|
+
`oat project delivery check --project "$PROJECT_PATH" --subject <mNN|dNN> --json`.
|
|
369
|
+
Register only on `status: ok` (exit 0): a passed, fresh integrated review
|
|
370
|
+
and an allowed, fresh exit carrier (`exit.source: milestone-carrier`).
|
|
371
|
+
3. **Stale evidence stops before registration.** When refresh or check
|
|
372
|
+
reports the integrated review or the `exit` carrier not fresh, choose the
|
|
373
|
+
recovery stage by the section 12.5 missing-evidence order (a missing,
|
|
374
|
+
blocked or stale exit carrier → `exit_gate`; otherwise a missing or stale
|
|
375
|
+
integrated review → `reviewing`) and:
|
|
376
|
+
- **active milestone's delivery:** write `oat_milestone_status: reviewing`
|
|
377
|
+
and `oat_goal_recovery: { milestone, delivery_id, phase_ids, stage,
|
|
378
|
+
review_artifact: null }`;
|
|
379
|
+
- **older milestone's delivery:** write only that targeted
|
|
380
|
+
`oat_goal_recovery` record; the active milestone's `oat_milestone`,
|
|
381
|
+
`oat_milestone_status`, `oat_current_task_id`, and `oat_current_task`
|
|
382
|
+
stay unchanged.
|
|
383
|
+
|
|
384
|
+
Commit and stop, reporting the stage owner. Never register stale evidence.
|
|
385
|
+
|
|
386
|
+
**3a. Already-registered active delivery.** When the active milestone
|
|
387
|
+
(`oat_milestone`) already has a non-superseded registered delivery (a `dNN`
|
|
388
|
+
entry with `status: open` or `at_endpoint`), after its recovery completes at
|
|
389
|
+
`delivering` or when `oat-project-goal` hands back a stale `delivered`
|
|
390
|
+
milestone, run items 1–2 for that `dNN` instead of registering. On
|
|
391
|
+
`status: ok`, in one bookkeeping write, clear any `oat_goal_recovery` that
|
|
392
|
+
targets it, write `oat_milestone_status: delivered`, and project
|
|
393
|
+
`oat_pr_status` and `oat_pr_url` from its latest member's observed status.
|
|
394
|
+
Register nothing, create no pull request, and append no log entry. On a
|
|
395
|
+
not-fresh report, apply item 3 (active milestone's delivery). A `registering`
|
|
396
|
+
entry is not registered yet and resumes at item 5.
|
|
397
|
+
|
|
398
|
+
4. **Idempotent registration.** When the active milestone has no
|
|
399
|
+
non-superseded registered delivery (item 3a), allocate the next unused
|
|
400
|
+
`dNN` and write its entry with `status: registering`: `milestone`, the
|
|
401
|
+
frozen `scope` (the ordered set), the agreed `endpoint` from the brief's
|
|
402
|
+
Delivery endpoint and authority, `kind: pr`, the persisted `lookup` keys
|
|
403
|
+
(`repository` from `gh repo view --json nameWithOwner`, `head_branch`,
|
|
404
|
+
`head_sha_at_registration` from `git rev-parse HEAD`), the
|
|
405
|
+
`integrated_review` (`artifact`, `scope`, `bound_revisions`,
|
|
406
|
+
`disposition: passed`) and the accepted `exit_gate` copied from the
|
|
407
|
+
milestone's current exit carrier, so the gate result is captured with the
|
|
408
|
+
delivery evidence. A replacement writes `covers_scope_of: <predecessor>`
|
|
409
|
+
and the predecessor's `superseded_by: <dNN>` in the same write; an additive
|
|
410
|
+
correction writes `corrects_delivery_id` instead. Commit this registration
|
|
411
|
+
record before creating anything.
|
|
412
|
+
5. **Create or attach.** Generate the PR description (Steps 2–5), push the
|
|
413
|
+
branch, and create the pull request with the Step 6 commands. On resume
|
|
414
|
+
with a `registering` entry, first run
|
|
415
|
+
`gh pr list --repo <repository> --head <head_branch> --state all --json url,headRefOid`:
|
|
416
|
+
exactly one match is attached without creating a duplicate; zero matches
|
|
417
|
+
create once; more than one stops and routes to `oat-project-reconcile`.
|
|
418
|
+
6. **Record.** Write the member (`url`, `base`, `reviewed_head`),
|
|
419
|
+
`status: open`, `oat_milestone_status: delivered` for the active milestone,
|
|
420
|
+
`oat_pr_status: open`, `oat_pr_url`, and `oat_phase_status: pr_open`;
|
|
421
|
+
commit this registration bookkeeping.
|
|
422
|
+
7. **Log.** After that registration commit, append exactly one structural
|
|
423
|
+
entry and commit it in this same step:
|
|
424
|
+
`oat project log append --project "$PROJECT_PATH" --structural --producer oat-project-pr-progress --ref <dNN> --idempotency-key "<goal-slug>-register-<dNN>" --body "Registered <dNN> for <mNN> (<ordered phase ids>) at <url>; <goal-slug>-register-<dNN>"`.
|
|
425
|
+
Never pre-check log configuration: the helper no-ops when logging is
|
|
426
|
+
disabled.
|
|
427
|
+
8. **Recovery targets.** For a pending `oat_goal_recovery` at stage
|
|
428
|
+
`delivering`, push the targeted delivery's fixes to its existing member,
|
|
429
|
+
run steps 1–2 for that `dNN`, and on `status: ok` clear the record
|
|
430
|
+
(`oat_goal_recovery: null`). When the record's milestone is not
|
|
431
|
+
`oat_milestone` (an older delivery), that is the whole write: the active
|
|
432
|
+
milestone stays untouched. When it targets the active milestone's own
|
|
433
|
+
delivery, fall through to item 3a, which clears the record and writes
|
|
434
|
+
`delivered` in one step.
|
|
435
|
+
|
|
436
|
+
`delivered` means registered, open and review-ready. Activation of the next
|
|
437
|
+
milestone belongs to `oat-project-goal` once the delivery reaches its agreed
|
|
438
|
+
endpoint.
|
|
439
|
+
|
|
320
440
|
### Step 6: Optional - Open PR
|
|
321
441
|
|
|
322
442
|
For a synced project whose user chooses to open the PR, use this ordered flow:
|
|
@@ -387,4 +507,5 @@ Do not assume `gh` is installed; if missing, instruct manual PR creation using t
|
|
|
387
507
|
- Residual active review artifacts are archived before PR generation continues
|
|
388
508
|
- Scope determined (phase or explicit range)
|
|
389
509
|
- PR description artifact written to `{PROJECT_PATH}/pr/`
|
|
510
|
+
- Goal mode: the delivery was registered only on a deliverable `delivery check`, idempotently, with its exit-gate result captured and one structural log entry per registration
|
|
390
511
|
- User has clear next step to open PR (manual or gh)
|
|
@@ -5,7 +5,7 @@ disable-model-invocation: false
|
|
|
5
5
|
user-invocable: true
|
|
6
6
|
allowed-tools: Read, Glob, Grep, Bash(git:*), Bash(oat:*), AskUserQuestion
|
|
7
7
|
metadata:
|
|
8
|
-
version: 1.4.
|
|
8
|
+
version: 1.4.7
|
|
9
9
|
---
|
|
10
10
|
|
|
11
11
|
# Progress Router
|
|
@@ -162,6 +162,8 @@ Start a new project:
|
|
|
162
162
|
oat-project-new - Create a spec-driven project scaffold
|
|
163
163
|
oat-project-quick-start - Start a quick workflow project
|
|
164
164
|
oat-project-lite - Start a lite workflow (interview -> plan -> implement)
|
|
165
|
+
oat-project-brief - Start a brief workflow (interview -> brief -> implement)
|
|
166
|
+
oat-project-goal - Start a goal workflow (interview -> brief and milestones -> deliver each milestone)
|
|
165
167
|
oat-project-import-plan - Import an external markdown plan into OAT
|
|
166
168
|
```
|
|
167
169
|
|
|
@@ -173,7 +175,7 @@ Read `{project}/state.md` frontmatter:
|
|
|
173
175
|
|
|
174
176
|
- `oat_phase` - Current phase
|
|
175
177
|
- `oat_phase_status` - in_progress or complete
|
|
176
|
-
- `oat_workflow_mode` - spec-driven | quick | import | lite
|
|
178
|
+
- `oat_workflow_mode` - spec-driven | quick | import | lite | brief | goal
|
|
177
179
|
- `oat_blockers` - Any blockers
|
|
178
180
|
- `oat_hill_checkpoints` - Configured gates (e.g., `["discovery", "spec", "design"]`)
|
|
179
181
|
- `oat_hill_completed` - Completed HiLL checkpoints
|
|
@@ -181,6 +183,11 @@ Read `{project}/state.md` frontmatter:
|
|
|
181
183
|
deliberately disabled, keyed by gate-aware skill name
|
|
182
184
|
- `oat_implement_exit_gate` - The implementation exit gate record
|
|
183
185
|
- `oat_quick_start_gate` - The quick-start plan gate record
|
|
186
|
+
- `oat_brief_gate` - The brief artifact gate record (brief mode)
|
|
187
|
+
- `oat_milestone`, `oat_milestone_status`, `oat_goal_status`, `oat_goal_recovery`,
|
|
188
|
+
`oat_milestone_gates`, and `oat_deliveries` - The active milestone, its
|
|
189
|
+
status, the declaration, any pending recovery, the per-milestone `plan` and
|
|
190
|
+
`exit` gate carriers, and the delivery registry (goal mode)
|
|
184
191
|
|
|
185
192
|
Blockers may be legacy reason strings or structured `{task_id, reason, since}`
|
|
186
193
|
records. Display strings as their reason; display records as
|
|
@@ -206,6 +213,10 @@ state or routing merely to render blockers.
|
|
|
206
213
|
HiLL Pending: {yes/no for current phase}
|
|
207
214
|
Gate Overrides: {gate-aware skill keys from oat_skill_gate_overrides, or "None"}
|
|
208
215
|
Quick-Start Gate: {status}/{disposition}, decided {decided_at}, fingerprint {config_fingerprint} (as recorded), or "None"
|
|
216
|
+
Brief Gate: {status}/{disposition}, decided {decided_at}, fingerprint {config_fingerprint} (as recorded), or "None" (brief mode only)
|
|
217
|
+
Milestone: {oat_milestone} ({oat_milestone_status}), {accepted}/{total} phases accepted in its scope (goal mode only)
|
|
218
|
+
Milestone Gates: {mNN} plan {status}/{disposition}, exit {status}/{disposition} {freshness} per milestone, as recorded (goal mode only)
|
|
219
|
+
Deliveries: {dNN} {status} ({endpoint} endpoint) per registry entry, or "None" (goal mode only)
|
|
209
220
|
Exit Gate: {status}/{disposition} as recorded, or "None"
|
|
210
221
|
Blockers: {oat_blockers or "None"}
|
|
211
222
|
Next: {recommended_skill}
|
|
@@ -219,15 +230,22 @@ even when no gate is currently configured for that skill, and never infer a
|
|
|
219
230
|
configured gate from an override alone. This is read-only reporting: never add,
|
|
220
231
|
remove, or repair the map here.
|
|
221
232
|
|
|
222
|
-
|
|
223
|
-
`references/docs/gate-approval-record.md`. Report a quick-start
|
|
224
|
-
doc describes: its stored fields as recorded, with `config_fingerprint` shown as
|
|
233
|
+
All three gate records share the core defined in
|
|
234
|
+
`references/docs/gate-approval-record.md`. Report a quick-start or brief record
|
|
235
|
+
as that doc describes: its stored fields as recorded, with `config_fingerprint` shown as
|
|
225
236
|
provenance and never recomputed, or `malformed` when its fields do not form a
|
|
226
237
|
valid record. Report the exit-gate
|
|
227
238
|
record's `status` and `disposition` as recorded; its freshness belongs to the
|
|
228
|
-
implementation workflow and is not re-derived here.
|
|
239
|
+
implementation workflow and is not re-derived here. Each record adds no route
|
|
229
240
|
and no warning: quick plan readiness stays the single routing rule for quick
|
|
230
|
-
plans. Show "None" for an absent record, and never write or repair one here.
|
|
241
|
+
plans, and the brief record is provenance only, read back by no route. Show "None" for an absent record, and never write or repair one here.
|
|
242
|
+
|
|
243
|
+
Goal milestone carriers (`oat_milestone_gates[mNN].plan` and `.exit`) share
|
|
244
|
+
the same core plus `resolution`, `subject` and `freshness`
|
|
245
|
+
(`oat-project-brief/references/brief-contract.md` section 12.4). Report them as
|
|
246
|
+
recorded, including `freshness` and `freshness_reason`; unlike the brief
|
|
247
|
+
record, the router reads these carriers, so never recompute or repair them
|
|
248
|
+
here.
|
|
231
249
|
|
|
232
250
|
### Step 5: Determine Next Skill
|
|
233
251
|
|
|
@@ -239,6 +257,8 @@ Read `oat_workflow_mode` from `state.md` frontmatter:
|
|
|
239
257
|
- `quick`
|
|
240
258
|
- `import`
|
|
241
259
|
- `lite`
|
|
260
|
+
- `brief`
|
|
261
|
+
- `goal`
|
|
242
262
|
|
|
243
263
|
**HiLL override (apply before phase routing):**
|
|
244
264
|
|
|
@@ -279,6 +299,10 @@ fi
|
|
|
279
299
|
|
|
280
300
|
If drift is detected, recommend `oat-project-reconcile` alongside the normal implementation skill.
|
|
281
301
|
|
|
302
|
+
In brief and goal modes `plan.md` carries no tasks, so skip the `PLAN_TASKS`
|
|
303
|
+
comparison; compare `(pNN-tNN)` commits against the journal's execution
|
|
304
|
+
records instead.
|
|
305
|
+
|
|
282
306
|
Routing matrix by mode:
|
|
283
307
|
|
|
284
308
|
**Spec-Driven mode (`oat_workflow_mode: spec-driven`):**
|
|
@@ -338,6 +362,35 @@ branch, which finishes the plan in place without re-scaffolding the project.
|
|
|
338
362
|
| implement | complete | Ready for final review / PR |
|
|
339
363
|
| implement | pr_open | `oat-project-complete` |
|
|
340
364
|
|
|
365
|
+
**Brief mode (`oat_workflow_mode: brief`):**
|
|
366
|
+
|
|
367
|
+
| oat_phase | oat_phase_status | Next Skill |
|
|
368
|
+
| --------- | ---------------- | ----------------------------------------------------------------------------------------------------------------------------------- |
|
|
369
|
+
| plan | in_progress | Continue `oat-project-brief` (it owns review, gate, and approval of the brief) |
|
|
370
|
+
| plan | complete | `oat-project-implement` |
|
|
371
|
+
| implement | in_progress | Continue `oat-project-implement`. If drift detected (see drift detection above), also mention `oat-project-reconcile` as an option. |
|
|
372
|
+
| implement | complete | `oat-project-implement` while any phase-unit is unaccepted; otherwise ready for final review / PR |
|
|
373
|
+
| implement | pr_open | `oat-project-implement` while any phase-unit is unaccepted; otherwise `oat-project-complete` |
|
|
374
|
+
|
|
375
|
+
Brief progress counts phase-units: report `{accepted}/{total} phases accepted`
|
|
376
|
+
from `oat project status`, never task counts. A provisional phase is never
|
|
377
|
+
accepted, and execution records never change the totals.
|
|
378
|
+
|
|
379
|
+
**Goal mode (`oat_workflow_mode: goal`):** before milestone state exists, the
|
|
380
|
+
`plan` / `in_progress` row continues `oat-project-goal`. After it exists, the
|
|
381
|
+
next skill is the control plane's recommendation (`oat project status --json`,
|
|
382
|
+
`recommendation.skill` with its `context`), which follows the goal priority
|
|
383
|
+
that `oat-project-next` tabulates: terminal recovery after a declaration,
|
|
384
|
+
review feedback, a pending `oat_goal_recovery`, invalid membership, then the
|
|
385
|
+
milestone status (`aligning` → `oat-project-goal`; `implementing` →
|
|
386
|
+
`oat-project-implement`; `reviewing` → scoped closeout or the review owners by
|
|
387
|
+
missing evidence; `delivering` → `oat-project-pr-progress`; `delivered` →
|
|
388
|
+
`oat-project-goal` to re-align). Count phase-units per active milestone: report
|
|
389
|
+
`{accepted}/{total} phases accepted in {mNN}` over the milestone's ordered
|
|
390
|
+
phase set from `oat project status --json` (`milestoneMembership`), plus the
|
|
391
|
+
whole-brief total. A pending recovery reports its own scope beside the active
|
|
392
|
+
milestone; it never replaces it.
|
|
393
|
+
|
|
341
394
|
**If blockers exist:**
|
|
342
395
|
|
|
343
396
|
```
|
|
@@ -361,9 +414,11 @@ Knowledge:
|
|
|
361
414
|
|
|
362
415
|
Workflow:
|
|
363
416
|
oat-project-lite - Start a lite workflow (interview -> plan -> implement)
|
|
417
|
+
oat-project-brief - Start a brief workflow (interview -> brief -> implement)
|
|
418
|
+
oat-project-goal - Start a goal workflow (interview -> brief and milestones -> deliver each milestone)
|
|
364
419
|
oat-project-quick-start - Start a quick workflow (discover -> plan -> implement)
|
|
365
420
|
oat-project-import-plan - Import an external markdown plan and normalize plan.md
|
|
366
|
-
oat-project-promote-spec-driven - Promote quick/import/lite project to spec-driven lifecycle (lite
|
|
421
|
+
oat-project-promote-spec-driven - Promote quick/import/lite project to spec-driven lifecycle (lite, brief, and goal promote via quick)
|
|
367
422
|
oat-project-discover - Start discovery phase (requirements gathering)
|
|
368
423
|
oat-project-design - Confirm requirements + create technical design (folds spec authoring inline)
|
|
369
424
|
oat-project-spec - Optional standalone specification (most projects skip this — design handles it)
|
|
@@ -58,6 +58,19 @@ replaces the record.
|
|
|
58
58
|
record is current.
|
|
59
59
|
- **`oat_quick_start_gate`** (`oat-project-quick-start`, Gate Execution) carries
|
|
60
60
|
exactly the core.
|
|
61
|
+
- **`oat_brief_gate`** (`oat-project-brief`, Gate Execution) carries exactly the
|
|
62
|
+
core, written and read under the same rules as `oat_quick_start_gate`. It is
|
|
63
|
+
absent when no gate is configured, and nothing routes on it: it is provenance
|
|
64
|
+
only.
|
|
65
|
+
- **`oat_milestone_gates[mNN].plan` and `.exit`** (goal mode;
|
|
66
|
+
`oat-project-goal` writes `plan` after each milestone's approval, and
|
|
67
|
+
`oat-project-implement`'s milestone closeout writes `exit`) carry the core
|
|
68
|
+
plus `resolution` (`configured`, `no_gate`, or `project_disabled`), a
|
|
69
|
+
`subject` binding (`plan` or `code` and the milestone's ordered phase set),
|
|
70
|
+
and derived `freshness` with `freshness_reason`. `reviewed_head` is `null`
|
|
71
|
+
for `no_gate` and `project_disabled`, and `no_gate` is written rather than
|
|
72
|
+
omitted because routing reads these carriers. `oat-project-brief`'s
|
|
73
|
+
`references/brief-contract.md` section 12.4 is their contract.
|
|
61
74
|
|
|
62
75
|
## Reading a quick-start record
|
|
63
76
|
|
|
@@ -6,14 +6,14 @@ disable-model-invocation: true
|
|
|
6
6
|
user-invocable: true
|
|
7
7
|
allowed-tools: Read, Write, Bash, Glob, Grep, AskUserQuestion
|
|
8
8
|
metadata:
|
|
9
|
-
version: 1.2.
|
|
9
|
+
version: 1.2.6
|
|
10
10
|
---
|
|
11
11
|
|
|
12
12
|
# Promote Project To Spec-Driven Lifecycle
|
|
13
13
|
|
|
14
14
|
Convert a quick/import workflow project into a Spec-Driven OAT lifecycle project without creating a new project directory.
|
|
15
15
|
|
|
16
|
-
Lite projects promote through quick first: run `oat project promote <path> --to quick`, then use this skill. This skill's direct eligibility remains quick/import only.
|
|
16
|
+
Lite and brief projects promote through quick first: run `oat project promote <path> --to quick`, then use this skill (a promoted brief first finishes its pending phase tasks through `oat-project-quick-start`). This skill's direct eligibility remains quick/import only.
|
|
17
17
|
|
|
18
18
|
## Hook-safe exact-path commits
|
|
19
19
|
|
|
@@ -7,7 +7,7 @@ disable-model-invocation: true
|
|
|
7
7
|
user-invocable: true
|
|
8
8
|
allowed-tools: Read, Write, Bash, Glob, Grep, AskUserQuestion, Task
|
|
9
9
|
metadata:
|
|
10
|
-
version: 2.3.
|
|
10
|
+
version: 2.3.21
|
|
11
11
|
---
|
|
12
12
|
|
|
13
13
|
# Quick Start Project
|
|
@@ -151,6 +151,38 @@ Step 3.7 — against `"$PROJECT_PATH/plan.md"`:
|
|
|
151
151
|
- Ready → there is nothing left to author here; load
|
|
152
152
|
`oat-project-implement/SKILL.md` and follow it to begin execution.
|
|
153
153
|
|
|
154
|
+
**Promoted-brief resume.** When the resumed `plan.md` frontmatter records
|
|
155
|
+
`oat_promoted_from: brief` or `oat_promoted_from: goal`, the project came from
|
|
156
|
+
`oat project promote --to quick` (brief contract section 11; a goal promotes
|
|
157
|
+
only at a settled delivery boundary), and quick plan readiness stays false
|
|
158
|
+
while `oat_promotion_pending_phases` lists any phase (condition 6). The same
|
|
159
|
+
resume serves both origins; there is no second readiness predicate.
|
|
160
|
+
`discovery.md` was rendered from the brief and counts as existing output, so
|
|
161
|
+
re-enter at Step 2.9 and then:
|
|
162
|
+
|
|
163
|
+
1. Author executable `### Task pNN-tNN:` tasks, under Step 3's plan
|
|
164
|
+
requirements, for every phase in `oat_promotion_pending_phases`, in document
|
|
165
|
+
order. A phase that carries an `**Unfinished records:**` line keeps those
|
|
166
|
+
record IDs as its first authored tasks; every new task takes the next free
|
|
167
|
+
ordinal after all existing plan tasks and journal records in its phase, so no
|
|
168
|
+
ID is reused.
|
|
169
|
+
2. In the same plan write that adds a phase's tasks, remove that phase from
|
|
170
|
+
`oat_promotion_pending_phases`; when the last one is authored, write
|
|
171
|
+
`oat_promotion_pending_phases: []`. Keep `oat_promoted_from` unchanged
|
|
172
|
+
(`brief` or `goal`).
|
|
173
|
+
3. Present historical tasks (those copied from completed execution records and
|
|
174
|
+
any synthesized `Accepted via phase evidence` task) as already accepted:
|
|
175
|
+
their journal markers already satisfy quick progress, and they and the
|
|
176
|
+
`**Historical records:**` lines are never re-authored, renumbered, or
|
|
177
|
+
reordered.
|
|
178
|
+
4. Run Steps 3.5 through 3.7 on the whole plan. The plan artifact review and the
|
|
179
|
+
configured gate see every task, with the historical ones labeled as accepted
|
|
180
|
+
context, and the disposition Step 3.7 records is the sign-off for the newly
|
|
181
|
+
authored tasks only. Existing `## Reviews` rows and the promotion provenance
|
|
182
|
+
line stay untouched. A promoted goal also keeps its `oat_deliveries`,
|
|
183
|
+
`oat_milestone_gates` and `oat_goal_outcome_audit` in `state.md` as
|
|
184
|
+
history; quick never edits them.
|
|
185
|
+
|
|
154
186
|
If no valid active project exists:
|
|
155
187
|
|
|
156
188
|
- Resolve startup input from `$ARGUMENTS` before doing any discovery work:
|
|
@@ -629,6 +661,12 @@ Required frontmatter updates:
|
|
|
629
661
|
- `oat_import_provider: null`
|
|
630
662
|
- `oat_template: true`
|
|
631
663
|
|
|
664
|
+
**Promoted-brief provenance.** Promotion already wrote `oat_plan_source: quick`,
|
|
665
|
+
and this step leaves it unchanged; the origin lives in `oat_promoted_from:
|
|
666
|
+
brief` or `oat_promoted_from: goal`. Re-asserting the values above never removes `oat_promoted_from` or
|
|
667
|
+
`oat_promotion_pending_phases`; only the Step 0.5 promoted-brief resume shrinks
|
|
668
|
+
that list as it authors each phase.
|
|
669
|
+
|
|
632
670
|
These values are the interruption-safe pre-review state. Here,
|
|
633
671
|
`oat_template: true` marks the generated plan as still owned by the current
|
|
634
672
|
planning workflow even after its substantive content has been written. If the
|
|
@@ -996,6 +1034,12 @@ A quick `plan.md` is implementation-ready only when all of the following hold:
|
|
|
996
1034
|
5. At least one phase carries a substantive task — a `### Task pNN-tNN:`
|
|
997
1035
|
heading under a `## Phase` heading, outside any fenced example, whose title
|
|
998
1036
|
still reads as text once every `{placeholder}` is removed.
|
|
1037
|
+
6. Frontmatter `oat_promotion_pending_phases` is absent or empty, so a brief
|
|
1038
|
+
promoted to quick stays not ready while any of its phases still lacks
|
|
1039
|
+
executable tasks. Empty means declared exactly once as `[]`, `null`, `~`, or
|
|
1040
|
+
a bare key whose next frontmatter line, after any blank or `#` comment lines,
|
|
1041
|
+
is not a block-list item; a duplicated key is contradictory. The control
|
|
1042
|
+
plane's `quick-plan-readiness.ts` mirrors this condition.
|
|
999
1043
|
|
|
1000
1044
|
Substantive tasks alone never make a plan ready. The plan that Step 3 writes
|
|
1001
1045
|
already has concrete tasks, yet it carries the Step 3 pre-review frontmatter, so
|
|
@@ -1140,6 +1184,26 @@ quick_plan_ready() {
|
|
|
1140
1184
|
}
|
|
1141
1185
|
' "$PLAN_FILE" | sed -E 's/\{[^}]*\}//g' | grep -qE '[[:alnum:]]' || return 1
|
|
1142
1186
|
|
|
1187
|
+
# Condition 6: a brief promoted to quick lists the phases that still need
|
|
1188
|
+
# executable tasks in `oat_promotion_pending_phases`. Absent is ready; a
|
|
1189
|
+
# duplicated key is contradictory; `[]` is empty; `null`, `~`, or a bare key
|
|
1190
|
+
# is empty only when no block-list item follows it, skipping blank and `#`
|
|
1191
|
+
# comment lines, which do not end a block list. Anything else is not ready.
|
|
1192
|
+
PENDING_KEY=$(quick_plan_key oat_promotion_pending_phases)
|
|
1193
|
+
PENDING_COUNT=$(printf '%s\n' "$FRONTMATTER" | grep -cE "^$PENDING_KEY")
|
|
1194
|
+
[ "$PENDING_COUNT" -le 1 ] || return 1
|
|
1195
|
+
if [ "$PENDING_COUNT" = "1" ] &&
|
|
1196
|
+
! printf '%s\n' "$FRONTMATTER" |
|
|
1197
|
+
grep -qE "^$PENDING_KEY[[:space:]]*\[[[:space:]]*\][[:space:]]*(#.*)?$"; then
|
|
1198
|
+
printf '%s\n' "$FRONTMATTER" |
|
|
1199
|
+
grep -qE "^$PENDING_KEY[[:space:]]*(null|~)?[[:space:]]*(#.*)?$" || return 1
|
|
1200
|
+
printf '%s\n' "$FRONTMATTER" | awk -v key="^$PENDING_KEY" '
|
|
1201
|
+
found && /^[[:space:]]*(#.*)?$/ { next }
|
|
1202
|
+
found { exit ($0 ~ /^[[:space:]]*-([[:space:]]|$)/) ? 1 : 0 }
|
|
1203
|
+
$0 ~ key { found = 1 }
|
|
1204
|
+
' || return 1
|
|
1205
|
+
fi
|
|
1206
|
+
|
|
1143
1207
|
return 0
|
|
1144
1208
|
}
|
|
1145
1209
|
```
|