.agents/skills/oat-project-pr-progress/SKILL.md
Use when an active OAT project needs a mid-project PR for a completed phase (pNN). Generates a phase-scoped progress PR description from OAT artifacts and commit history, with optional PR creation.
npx skillsauth add tkstang/open-agent-toolkit oat-project-pr-progressInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Create a progress PR description (typically at a plan phase boundary) and write it to disk.
Generate a PR-ready summary that is:
gh pr create if desired)Required:
activeProject in .oat/config.local.json points at an active project directory (or you can provide project name when prompted){PROJECT_PATH}/plan.md existsRecommended:
passed in plan.md ## Reviews before opening a progress PR.OAT MODE: PR (Progress)
Purpose: Create PR description and (optionally) open a PR.
When executing this skill, provide lightweight progress feedback so the user can tell what’s happening after they confirm.
Print a phase banner once at start using horizontal separators, e.g.:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ OAT ▸ PR PROGRESS ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Before multi-step work (scoping, reading artifacts, writing output), print 2–5 short step indicators, e.g.:
[1/5] Preflighting review artifacts…[2/5] Resolving scope…[3/5] Reading OAT artifacts…[4/5] Collecting git context…[5/5] Writing PR description…For long-running operations (git logs/diffs on large ranges), print a start line and a completion line (duration optional).
Keep it concise; don’t print a line for every shell command.
BLOCKED Activities:
ALLOWED Activities:
gh pr create (optional, user-confirmed)oat-project-pr-progress p02 # progress PR for phase p02
oat-project-pr-progress range=abc..def # progress PR for explicit range
oat-project-pr-progress base_sha=abc123 # progress PR for abc123..HEAD
Run the oat-project-pr-progress skill and it will ask:
base= arg → git.defaultBranch in .oat/config.json → git rev-parse --abbrev-ref origin/HEAD → fallback main)OAT stores active project context in .oat/config.local.json (activeProject, local-only).
PROJECT_PATH=$(oat config get activeProject 2>/dev/null || true)
PROJECTS_ROOT="${OAT_PROJECTS_ROOT:-$(oat config get projects.root 2>/dev/null || echo ".oat/projects/shared")}"
PROJECTS_ROOT="${PROJECTS_ROOT%/}"
If missing/invalid:
{project-name}PROJECT_PATH to ${PROJECTS_ROOT}/{project-name}mkdir -p .oat
oat config set activeProject "$PROJECT_PATH"
Before generating the PR, detect any leftover active review artifacts in the top level of "$PROJECT_PATH/reviews/":
find "$PROJECT_PATH/reviews" -maxdepth 1 -type f -name "*.md" 2>/dev/null
If any active review artifacts exist:
"$PROJECT_PATH/reviews/archived" if needed.reviews/archived/{filename}.md instead of reviews/{filename}.md. At minimum, check:
"$PROJECT_PATH/plan.md""$PROJECT_PATH/implementation.md""$PROJECT_PATH/state.md"reviews/archived/, adding a timestamp suffix if the archive target already exists.Rules:
reviews/archived/ untouched.Parse args if provided (otherwise prompt):
pNN (preferred for progress PRs)range=<sha1>..<sha2>base_sha=<sha> (meaning <sha>..HEAD)If scope is pNN, gather commits via commit convention grep:
PHASE="p02" # example
git log --oneline --grep="\\(${PHASE}-" HEAD~500..HEAD
If the grep returns no commits:
base_sha=<sha> or range=<sha1>..<sha2>If scope is range/base_sha, set:
SCOPE_RANGE to the range string (e.g., abc..HEAD)Resolve workflow mode from state.md (default spec-driven):
WORKFLOW_MODE=$(grep "^oat_workflow_mode:" "$PROJECT_PATH/state.md" 2>/dev/null | head -1 | awk '{print $2}')
WORKFLOW_MODE=${WORKFLOW_MODE:-spec-driven}
Read (as available):
{PROJECT_PATH}/spec.md{PROJECT_PATH}/design.md{PROJECT_PATH}/plan.md{PROJECT_PATH}/implementation.md (if exists){PROJECT_PATH}/discovery.md (recommended for quick mode){PROJECT_PATH}/references/imported-plan.md (recommended for import mode)If WORKFLOW_MODE != spec-driven and spec/design are missing:
If scope is pNN, check plan.md ## Reviews table row:
| pNN | code | passed | ... exists: goodpassed for this phase (e.g., it may be received, fixes_added, or fixes_completed pending re-review)Do not block PR generation; this is a progress PR.
Produce:
pNN grep or SCOPE_RANGE)For SCOPE_RANGE:
git log --oneline "$SCOPE_RANGE"
git diff --name-only "$SCOPE_RANGE"
git diff --shortstat "$SCOPE_RANGE"
For pNN (no reliable contiguous range):
Write to:
{PROJECT_PATH}/pr/progress-{scope}-YYYY-MM-DD.mdmkdir -p "$PROJECT_PATH/pr"
Frontmatter policy:
Reference links policy:
origin + current branch when possible.Local path exclusion:
.oat/config.json and extract localPaths (glob patterns for gitignored directories).localPaths pattern — those paths are gitignored and will not exist on the remote..oat/projects/**/reviews/archived, .oat/projects/**/pr. Active reviews/ paths remain eligible for References when they are tracked; only archived review paths should be treated as local-only by default.Example link context:
ORIGIN_URL=$(git remote get-url origin 2>/dev/null || echo "")
BRANCH=$(git rev-parse --abbrev-ref HEAD)
PROJECT_REL="${PROJECT_PATH#./}"
REPO_WEB=""
case "$ORIGIN_URL" in
[email protected]:*) REPO_WEB="https://github.com/${ORIGIN_URL#[email protected]:}" ;;
https://github.com/*) REPO_WEB="$ORIGIN_URL" ;;
esac
REPO_WEB="${REPO_WEB%.git}"
Recommended template:
---
oat_generated: true
oat_generated_at: YYYY-MM-DD
oat_pr_type: progress
oat_pr_scope: { pNN|range }
oat_project: { PROJECT_PATH }
---
# {project-name} ({scope})
## Summary
{1-3 sentence summary of what this phase delivered}
## Goals / Non-Goals
{goals addressed by this phase, from available requirement artifacts: spec in spec-driven mode, discovery/import reference in quick/import mode}
## Changes
- Project: `{PROJECT_PATH}`
- Scope: `{scope}`
- Commits:
{bulleted list}
## Verification
- Tests: {what was run / expected}
- Lint/Types/Build: {what was run / expected}
## Reviews
{phase review row from plan.md Reviews table, if available}
## References
Only include links to artifacts that actually exist in the project. Omit any that are absent.
- Spec: `[spec.md]({REPO_WEB}/blob/{BRANCH}/{PROJECT_REL}/spec.md)`
- Design: `[design.md]({REPO_WEB}/blob/{BRANCH}/{PROJECT_REL}/design.md)`
- Plan: `[plan.md]({REPO_WEB}/blob/{BRANCH}/{PROJECT_REL}/plan.md)` (fallback: `{PROJECT_PATH}/plan.md`)
- Implementation: `[implementation.md]({REPO_WEB}/blob/{BRANCH}/{PROJECT_REL}/implementation.md)` (fallback: `{PROJECT_PATH}/implementation.md`)
- Discovery: `[discovery.md]({REPO_WEB}/blob/{BRANCH}/{PROJECT_REL}/discovery.md)`
- Imported Source: `[references/imported-plan.md]({REPO_WEB}/blob/{BRANCH}/{PROJECT_REL}/references/imported-plan.md)`
- 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
Ask the user:
PR description written to {path}.
Do you want to open a PR now?
1) Yes (use gh CLI if available)
2) No (I will open manually)
If user chooses (1), provide best-effort guidance:
Strip YAML frontmatter from the local artifact into a temporary body file:
BODY_FILE="{path}"
TMP_BODY="$(mktemp -t oat-pr-body.XXXXXX.md)"
awk 'NR==1 && $0=="---" {infm=1; next} infm && $0=="---" {infm=0; next} !infm {print}' "$BODY_FILE" > "$TMP_BODY"
Resolve the base branch:
# Resolution chain: explicit arg > OAT config > git remote > fallback
BASE_BRANCH="{base_arg if provided}"
if [ -z "$BASE_BRANCH" ]; then
BASE_BRANCH=$(oat config get git.defaultBranch 2>/dev/null || true)
fi
if [ -z "$BASE_BRANCH" ]; then
BASE_BRANCH=$(git rev-parse --abbrev-ref origin/HEAD 2>/dev/null | sed 's|origin/||' || true)
fi
BASE_BRANCH="${BASE_BRANCH:-main}"
Use the stripped body file with gh:
git push -u origin "$(git rev-parse --abbrev-ref HEAD)"
gh pr create --base "$BASE_BRANCH" --title "{title}" --body-file "$TMP_BODY"
Optionally clean up temp file:
rm -f "$TMP_BODY"
Do not assume gh is installed; if missing, instruct manual PR creation using the file contents and note the resolved base branch.
{PROJECT_PATH}/pr/documentation
Use when OAT implementation changes and repository reference docs must be synchronized. Updates .oat/repo/reference to match current behavior.
business
Merge multiple analysis artifacts into a single coherent report with provenance tracking. Reads existing artifacts from /deep-research, /analyze, and /compare.
testing
Use when the user questions or suspects an agent claim is wrong. Adversarially gathers evidence to verify or refute the claim using the best sources available in the current environment.
tools
Use when prioritizing backlog work or evaluating a roadmap. Produces value-effort ratings, dependency mapping, and execution recommendations.