jeo
Original:🇺🇸 English
Translated
14 scriptsChecked / no sensitive code detected
Integrated AI agent orchestration skill that combines plannotator, ralphmode, team or bmad execution, agent-browser verification, and agentation feedback loops, while maintaining a project-local `.jeo` ledger for planning, development, and QA. Use when the user wants an end-to-end multi-agent workflow with plan approval, implementation, UI review, cleanup, and durable task history. Triggers on: jeo, annotate, ui-review, multi-agent orchestration.
11installs
Sourceakillness/oh-my-skills
Added on
NPX Install
npx skill4agent add akillness/oh-my-skills jeoTags
Translated version includes tags in frontmatterSKILL.md Content
View Translation Comparison →JEO — Integrated Agent Orchestration
Keyword:·jeo·annotate·UI-review| Platforms: Claude Code · Codex CLI · Gemini CLI · OpenCodeagentui (deprecated)Planning (plannotator) → Development (team/bmad) → QA (agent-browser + agentation) → Cleanup (worktree) with a persistentproject ledger.jeo
When to use this skill
- Run an end-to-end multi-agent workflow with an explicit planning gate
- Add a browser-backed UI feedback loop with or
annotateui-review - Coordinate plan approval, execution, verification, and cleanup in one skill
- Keep long-term rules, short-term system/test plans, active work items, and history in
.jeo/
Rules (always enforced)
- Do not reopen the PLAN gate when the current plan hash already has a terminal result
- Only a revised plan resets to
plan_gate_statuspending - Do not process agentation annotations before explicit submit/onSubmit opens the submit gate
- NEVER enter EXECUTE without
plan_approved: true - NEVER run plannotator or agentation with (background)
& - NEVER reopen an unchanged plan after ,
approved,manual_approved, orfeedback_requiredinfrastructure_blocked
Authoritative state:
.omc/state/jeo-state.jsonState Management
All state operations use one script:
scripts/jeo-state-update.pybash
# Initialize (or resume if state exists)
python3 scripts/jeo-state-update.py init "<task>"
# Record checkpoint at each step
python3 scripts/jeo-state-update.py checkpoint <plan|execute|verify|verify_ui|cleanup>
# Record error (auto-increments retry_count; warns at >= 3)
python3 scripts/jeo-state-update.py error "<message>"
# Check resume point
python3 scripts/jeo-state-update.py resume
# Set any field (supports dot notation for nested keys)
python3 scripts/jeo-state-update.py set phase execute
python3 scripts/jeo-state-update.py set agentation.active true.jeo Project Ledger
JEO keeps a human-readable project ledger in and a machine-readable state file in .
.jeo/.omc/state/jeo-state.json| Path | Purpose |
|---|---|
| Durable product intent, standing rules, validation contract |
| Current system slice, unit-test plan, flow-test plan, exit criteria |
| Planned queue and parking-lot items |
| Current delivery stage and timestamped updates |
| Append-only completion summaries |
| Queued work-item files |
| Single active work-item file (removed on completion after history is written) |
Use to keep the ledger in sync:
scripts/jeo-project-sync.pybash
python3 scripts/jeo-project-sync.py init "<task>"
python3 scripts/jeo-project-sync.py queue api-contract "Harden API contract validation"
python3 scripts/jeo-project-sync.py start-next
python3 scripts/jeo-project-sync.py stage <planning|development|qa|done>
python3 scripts/jeo-project-sync.py progress "<message>"
python3 scripts/jeo-project-sync.py complete <slug> "<summary>"
python3 scripts/jeo-project-sync.py statusPhase mapping
| JEO phase | Delivery stage | |
|---|---|---|
| | Review |
| | Update the active task checklist and append implementation notes to |
| | Record unit/flow/browser verification evidence in |
| | Append to |
Detailed ledger rules: references/DOT_JEO_LEDGER.md
Instructions
Execute steps in order. Each step only proceeds after the previous one completes.
STEP 0: Bootstrap
bash
mkdir -p .omc/state .omc/plans .omc/logs
python3 scripts/jeo-state-update.py init "<detected task>"
python3 scripts/jeo-project-sync.py init "<detected task>"
python3 scripts/jeo-project-sync.py start-nextClaude Code only — hook self-check (run inline):
Verify the hook is using , not raw . If misconfigured, auto-repair:
ExitPlanModeclaude-plan-gate.pyplannotatorpython
import json, os, subprocess, sys
p = os.path.expanduser("~/.claude/settings.json")
if os.path.exists(p):
s = json.load(open(p))
for entry in s.get("hooks", {}).get("PermissionRequest", []):
if entry.get("matcher") == "ExitPlanMode":
for h in entry.get("hooks", []):
cmd = h.get("command", "")
if (cmd.strip() == "plannotator" or cmd.startswith("plannotator ")) and "claude-plan-gate" not in cmd:
print("[JEO][WARN] Hook uses raw plannotator — state tracking disabled. Auto-repairing...", file=sys.stderr)
for candidate in [
os.path.join(os.getcwd(), ".agent-skills/jeo/scripts/setup-claude.sh"),
os.path.expanduser("~/.claude/skills/jeo/scripts/setup-claude.sh"),
os.path.expanduser("~/.agent-skills/jeo/scripts/setup-claude.sh"),
]:
if os.path.exists(candidate):
subprocess.run(["bash", candidate], check=False)
print("[JEO] Hook repaired. Restart Claude Code to apply.", file=sys.stderr)
breakNotify the user:
"JEO activated. Delivery stage: planning.ledger initialized. Add the.jeokeyword if a UI feedback loop is needed."annotate
STEP 1: PLAN / Planning (never skip)
bash
python3 scripts/jeo-state-update.py checkpoint plan
python3 scripts/jeo-project-sync.py stage planning
python3 scripts/jeo-project-sync.py progress "Entered planning gate."-
Review,
.jeo/long-term.md,.jeo/short-term.md,.jeo/planned.md, and.jeo/progress.mdbefore changing scope..jeo/history.md -
Write(include goal, steps, risks, completion criteria, and the current planning/development/QA expectations from
plan.md)..jeo/short-term.md -
Updatewith:
.jeo/short-term.md- the system slice for this run
- the unit-test plan
- the flow/browser verification plan
-
Invoke plannotator (per platform):Claude Code (hook mode — only supported method):
- Call → write plan content → call
EnterPlanModeExitPlanMode - The PermissionRequest hook fires plannotator automatically
ExitPlanMode - Wait for the hook result before proceeding
- NEVER call plannotator via MCP tool or CLI directly in Claude Code
Codex / Gemini / OpenCode (blocking CLI):bash# Skip if same plan hash already has terminal gate status # (check plan_gate_status and last_reviewed_plan_hash in jeo-state.json) # Resolve JEO scripts directory _JEO_SCRIPTS="" for _candidate in \ "${JEO_SKILL_DIR:-}/scripts" \ "$HOME/.agent-skills/jeo/scripts" \ "$HOME/.codex/skills/jeo/scripts" \ "$(pwd)/.agent-skills/jeo/scripts" \ "scripts"; do [ -f "${_candidate}/plannotator-plan-loop.sh" ] && _JEO_SCRIPTS="$_candidate" && break done # Auto-install plannotator if missing bash "${_JEO_SCRIPTS}/ensure-plannotator.sh" || exit 1 # Run blocking plan gate (no &) FEEDBACK_DIR=$(python3 -c "import hashlib,os; h=hashlib.md5(os.getcwd().encode()).hexdigest()[:8]; d=f'/tmp/jeo-{h}'; os.makedirs(d,exist_ok=True); print(d)") bash "${_JEO_SCRIPTS}/plannotator-plan-loop.sh" plan.md "${FEEDBACK_DIR}/plannotator_feedback.txt" 3 - Call
-
Check result:
- (exit 0) → set
approved,phase=execute→ STEP 2plan_approved=true - Feedback (exit 10) → read feedback, revise , repeat step 2
plan.md - Infrastructure blocked (exit 32) → Conversation Approval Mode: output plan.md to user, ask "approve" or provide feedback. WAIT for user response
- Session exited 3 times (exit 30/31) → ask user whether to abort
-
When the plan is approved, append a note todescribing what is ready to build and what QA must prove.
.jeo/progress.md
NEVER: enter EXECUTE without . NEVER: run with background.
approved: true&STEP 2: EXECUTE / Development
bash
python3 scripts/jeo-state-update.py checkpoint execute
python3 scripts/jeo-state-update.py set phase execute
python3 scripts/jeo-project-sync.py stage development
python3 scripts/jeo-project-sync.py progress "Development started from the approved plan."Auto-detect team availability:
bash
TEAM_AVAILABLE=false
if [[ "${CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS:-}" =~ ^(1|true|yes)$ ]]; then
TEAM_AVAILABLE=true
fi
python3 scripts/jeo-state-update.py set team_available $TEAM_AVAILABLECheck in state (set by on approval):
next_modeclaude-plan-gate.py| Condition | Action |
|---|---|
| |
| Claude Code + omc + team | |
| Claude Code without team | Error — run |
| Codex / Gemini / OpenCode | BMAD fallback: |
While executing, keep the active file current using:
.jeo/tasks/active/*.mdbash
# When plan and risks are locked
python3 scripts/jeo-project-sync.py update-checklist planning "Scope captured in plan.md" --done
python3 scripts/jeo-project-sync.py update-checklist planning "Risks and completion criteria written" --done
# As code, docs, and tests are completed
python3 scripts/jeo-project-sync.py update-checklist development "System changes implemented" --done
python3 scripts/jeo-project-sync.py update-checklist development "Unit tests added or updated" --doneNEVER fall back to single-agent execution in Claude Code.
STEP 3: VERIFY / QA
bash
python3 scripts/jeo-state-update.py checkpoint verify
python3 scripts/jeo-state-update.py set phase verify
python3 scripts/jeo-project-sync.py stage qa
python3 scripts/jeo-project-sync.py progress "Entered QA verification."-
Browser verification with agent-browser (when browser UI is present):bash
agent-browser snapshot http://localhost:3000 -
keyword detected → enter STEP 3.1
annotate -
Otherwise → enter STEP 4
-
Record QA evidence inusing:
.jeo/short-term.mdbashpython3 scripts/jeo-project-sync.py record-evidence "unit tests: X passing, Y added" python3 scripts/jeo-project-sync.py record-evidence "flow check: <description>" python3 scripts/jeo-project-sync.py record-evidence "browser verification: <outcome>" # Then mark QA checklist items complete python3 scripts/jeo-project-sync.py update-checklist qa "Flow or integration checks recorded" --done python3 scripts/jeo-project-sync.py update-checklist qa "Browser / annotation verification recorded when applicable" --done
STEP 3.1: VERIFY_UI (only when annotate
keyword is detected)
annotatePre-flight check (all platforms):
bash
if ! curl -sf --connect-timeout 2 http://localhost:4747/health >/dev/null 2>&1; then
echo "agentation-mcp not running — skipping VERIFY_UI, proceeding to CLEANUP"
python3 scripts/jeo-state-update.py error "agentation-mcp not running; VERIFY_UI skipped"
# Proceed to STEP 4 (graceful skip, no exit 1)
fiIf server is running:
-
Set state:,
phase=verify_ui,agentation.active=trueagentation.submit_gate_status=waiting_for_submit -
Wait for explicit human submit — do NOT readbefore submit
/pending- Claude Code: wait for hook
UserPromptSubmit - Others: wait until (or
ANNOTATE_READYalias)AGENTUI_READY
- Claude Code: wait for
-
After submit → set
agentation.submit_gate_status=submitted -
Process annotations:
- Claude Code (MCP): (blocking,
agentation_watch_annotations,batchWindowSeconds:10)timeoutSeconds:120 - Others (HTTP): poll with timeout
GET http://localhost:4747/pending
- Claude Code (MCP):
-
Per-annotation loop:
- → navigate code via
acknowledge(CSS selector) → apply fix →elementPathresolve - Dismissed annotations: skip code changes, increment
annotations.dismissed
-
or timeout → proceed to STEP 4
count=0 -
If QA discovers follow-up work, add it immediately:bash
python3 scripts/jeo-project-sync.py queue follow-up "<new work item>"
NEVER: process draft annotations before submit/onSubmit.
STEP 4: CLEANUP
bash
python3 scripts/jeo-state-update.py checkpoint cleanup
python3 scripts/jeo-state-update.py set phase cleanup
python3 scripts/jeo-project-sync.py stage done- Check for uncommitted changes (warn if present)
- Complete the active task and write the permanent summary:
.jeobashpython3 scripts/jeo-project-sync.py complete <slug> "<what shipped, what QA proved, what follow-up remains>" - If more work is needed, queue it before leaving cleanup:
bash
python3 scripts/jeo-project-sync.py queue next-step "<follow-up work>" - Run worktree cleanup:
bash
bash scripts/worktree-cleanup.sh || git worktree prune - Set
phase=done
Quick Start
bash
# Install JEO
npx skills add https://github.com/akillness/oh-my-skills --skill jeo
# Full install (all tools + components)
bash scripts/install.sh --all
# Check status
bash scripts/check-status.sh
# Per-platform setup
bash scripts/setup-claude.sh # Claude Code hooks
bash scripts/setup-codex.sh # Codex CLI config
bash scripts/setup-gemini.sh # Gemini CLI hooks
bash scripts/setup-opencode.sh # OpenCode pluginPlatform Configuration
Claude Code
Hook config ():
~/.claude/settings.jsonjson
{
"hooks": {
"PermissionRequest": [{
"matcher": "ExitPlanMode",
"hooks": [{"type": "command", "command": "python3 ~/.claude/skills/jeo/scripts/claude-plan-gate.py", "timeout": 1800}]
}],
"UserPromptSubmit": [{
"matcher": "*",
"hooks": [{"type": "command", "command": "python3 ~/.claude/skills/jeo/scripts/claude-agentation-submit-hook.py", "timeout": 300}]
}]
},
"mcpServers": {
"agentation": {"command": "npx", "args": ["-y", "agentation-mcp", "server"]}
}
}Codex CLI
Config ():
~/.codex/config.tomltoml
notify = ["python3", "~/.codex/hooks/jeo-notify.py"]
[tui]
notifications = ["agent-turn-complete"]must be a top-level string (not adeveloper_instructions), or Codex fails with[table].invalid type: map, expected a string
Gemini CLI
Instructions in . AfterAgent hook as safety net in .
Agent must call plannotator directly in blocking mode to receive feedback in the same turn.
~/.gemini/GEMINI.md~/.gemini/settings.jsonOpenCode
Plugins in . Slash commands: , , , .
opencode.json/jeo-plan/jeo-exec/jeo-annotate/jeo-cleanupState File Reference
Path:
{worktree}/.omc/state/jeo-state.json| Field | Values | Description |
|---|---|---|
| | Current workflow phase |
| | Human-readable stage mirrored into |
| bool | Whether plan was approved |
| | Plan gate result |
| sha256 or null | Current plan.md hash |
| sha256 or null | Hash of last reviewed plan |
| | How plan was approved |
| bool | Whether team mode is available |
| int | Error retry count (ask user at >= 3) |
| string or null | Most recent error |
| string or null | Last entered phase (for resume) |
| path | Project-local planning ledger root |
| string or null | Active |
| ISO 8601 or null | Last |
| bool | Whether VERIFY_UI watch loop is running |
| | Submit gate state |
| | How watch loop ended |
Examples
Example 1: New feature with .jeo
ledger
.jeobash
python3 scripts/jeo-project-sync.py init "Build exportable analytics dashboard"
python3 scripts/jeo-project-sync.py start-next
python3 scripts/jeo-project-sync.py stage planningThen run the normal JEO flow: plan approval → development → QA → cleanup. When done:
bash
python3 scripts/jeo-project-sync.py complete 000-primary "Dashboard shipped with unit tests, flow checks, and browser verification."Example 2: Add follow-up work discovered during QA
bash
python3 scripts/jeo-project-sync.py queue qa-follow-up "Fix chart legend overlap on small screens"
python3 scripts/jeo-project-sync.py progress "Queued QA follow-up from annotate review."Best practices
- Plan first: always review the plan with ralph+plannotator before executing (catches wrong approaches early)
- Team first: omc team mode is most efficient in Claude Code
- bmad fallback: use BMAD in environments without team (Codex, Gemini)
- Keep honest: long-term is durable, short-term is current, history is append-only
.jeo - One active task file: keep only one file under at a time
.jeo/tasks/active/ - Complete means summarize + delete task file: write history first, then remove the task file
- Worktree cleanup: run immediately after work completes (prevents branch pollution)
worktree-cleanup.sh - State persistence: use and
.omc/state/jeo-state.jsontogether across sessions.jeo/ - annotate: use the keyword to run the agentation watch loop for complex UI changes (precise code changes via CSS selector).
annotateis a backward-compatible alias.agentui
Troubleshooting
| Issue | Solution |
|---|---|
| plannotator not running | JEO auto-runs |
| plannotator not opening (Claude Code) | It's hook-only. Use |
| Same plan re-reviewed (Codex) | Compare |
| Codex startup failure | Re-run |
| team mode not working | Run |
| agentation not opening | Check |
| annotation not in code | Include |
| Run |
| worktree conflict | |
References
- oh-my-claudecode — Claude Code multi-agent
- plannotator — visual plan/diff review
- BMAD Method — structured AI development workflow
- Agent Skills Spec — skill format specification
- agentation — UI annotation → agent code fix (;
annotatebackward compatible)agentui - ledger reference — project-local planning, development, and QA ledger
.jeo