feat(omo-codex): rework skill set around ulw-loop and planner agents
Rename ultragoal skill to ulw-loop with a CLI bootstrap fallback and openai.yaml hint metadata, while keeping ultragoal as a discoverable alias. Drop the metis and momus skills in favor of bundled ultrawork planner agents and rewrite the planing-prometheustic skill. Update aggregate and sync-skills tests to match.
This commit is contained in:
@@ -1,6 +1,8 @@
|
||||
---
|
||||
name: ultragoal
|
||||
description: Durable repo-native multi-goal plans with embedded success criteria and evidence audit.
|
||||
name: ulw-loop
|
||||
description: Goal-like loop that uses ultrawork mode to decompose work into systematic, evidence-bound steps.
|
||||
metadata:
|
||||
short-description: Goal-like ultrawork loop for systematic decomposition
|
||||
---
|
||||
|
||||
## Role
|
||||
@@ -34,6 +36,45 @@ Auxiliary surfaces (pure CLI stdout / DB state diff / parsed config dump) satisf
|
||||
Do all three steps before execution. No edits, goal tools, or checkpointing before bootstrap completes.
|
||||
|
||||
### 1. Create goals from the brief
|
||||
Resolve the CLI before the first command. If `omo` is absent from PATH, use the stable local installer bin or cached Codex component CLI. This is the same ultragoal CLI, so PATH absence is not a blocker. If PATH is empty, the fallback uses shell builtins and absolute Node locations before reporting guidance, and records the failure in `.omo/ultragoal/bootstrap-notepad.md`.
|
||||
```sh
|
||||
if command -v omo >/dev/null 2>&1; then
|
||||
ULTRAGOAL_CLI=omo
|
||||
else
|
||||
CODEX_HOME="${CODEX_HOME:-$HOME/.codex}"
|
||||
ULTRAGOAL_CLI=
|
||||
if [ -f "$CODEX_HOME/bin/omo" ] || [ -x "$CODEX_HOME/bin/omo" ]; then
|
||||
ULTRAGOAL_CLI="$CODEX_HOME/bin/omo"
|
||||
else
|
||||
for candidate in "$CODEX_HOME"/plugins/cache/sisyphuslabs/omo/*/components/ultragoal/dist/cli.js; do
|
||||
[ -f "$candidate" ] || continue
|
||||
ULTRAGOAL_CLI="$candidate"
|
||||
done
|
||||
fi
|
||||
|
||||
ULTRAGOAL_NODE="$(command -v node 2>/dev/null || true)"
|
||||
if [ -z "$ULTRAGOAL_NODE" ]; then
|
||||
for candidate in /opt/homebrew/bin/node /usr/local/bin/node /usr/bin/node; do
|
||||
[ -x "$candidate" ] || continue
|
||||
ULTRAGOAL_NODE="$candidate"
|
||||
break
|
||||
done
|
||||
fi
|
||||
|
||||
if [ -n "$ULTRAGOAL_CLI" ] && [ -n "$ULTRAGOAL_NODE" ]; then
|
||||
omo() { "$ULTRAGOAL_NODE" "$ULTRAGOAL_CLI" "$@"; }
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ -z "${ULTRAGOAL_CLI:-}" ]; then
|
||||
/bin/mkdir -p .omo/ultragoal 2>/dev/null || mkdir -p .omo/ultragoal 2>/dev/null || true
|
||||
NOTE="${NOTE:-.omo/ultragoal/bootstrap-notepad.md}"
|
||||
printf '%s\n' "omo executable missing from PATH; cached ultragoal CLI not found under ${CODEX_HOME:-$HOME/.codex}." >> "$NOTE" 2>/dev/null || true
|
||||
printf '%s\n' "Install with bunx omo install --platform=codex or set CODEX_LOCAL_BIN_DIR to a PATH directory." >&2
|
||||
fi
|
||||
```
|
||||
If `ULTRAGOAL_CLI` is empty, open the durable notepad first, record the missing CLI evidence, then surface the installer issue.
|
||||
|
||||
Run one form:
|
||||
```sh
|
||||
omo ultragoal create-goals --brief "<brief>" --json
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
interface:
|
||||
display_name: "ulw loop"
|
||||
short_description: "Goal-like ultrawork loop for systematic decomposition"
|
||||
search_terms:
|
||||
- "ultragoal"
|
||||
default_prompt: "Use $ulw-loop to break this work into a systematic ultrawork loop with evidence-backed checkpoints."
|
||||
@@ -77,6 +77,30 @@ describe("skills/ultragoal/SKILL.md", () => {
|
||||
expect(info.isFile()).toBe(true);
|
||||
});
|
||||
|
||||
it("#given Codex skill hinting #when ultragoal skill metadata is inspected #then ulw-loop is the primary mention name", async () => {
|
||||
const text = await readText("skills/ultragoal/SKILL.md");
|
||||
|
||||
expect(text).toMatch(/^---\nname: ulw-loop\n/m);
|
||||
expect(text).toContain("Goal-like loop that uses ultrawork mode to decompose work into systematic, evidence-bound steps.");
|
||||
expect(text).toContain("short-description: Goal-like ultrawork loop for systematic decomposition");
|
||||
});
|
||||
|
||||
it("#given Codex dollar hinting #when querying ulw-loop #then ulw-loop surfaces the ultragoal alias", async () => {
|
||||
const text = await readText("skills/ultragoal/agents/openai.yaml");
|
||||
|
||||
expect(text).toContain('display_name: "ulw loop"');
|
||||
expect(text).not.toContain("ulw-loop / ultragoal");
|
||||
expect(text).toContain('short_description: "Goal-like ultrawork loop for systematic decomposition"');
|
||||
expect(text).toContain("Use $ulw-loop");
|
||||
});
|
||||
|
||||
it("#given Codex dollar hinting #when querying ultragoal #then ultragoal remains discoverable as an alias", async () => {
|
||||
const text = await readText("skills/ultragoal/agents/openai.yaml");
|
||||
|
||||
expect(text).toContain("search_terms:");
|
||||
expect(text).toContain('- "ultragoal"');
|
||||
});
|
||||
|
||||
it("contains no omx references", async () => {
|
||||
const text = await readText("skills/ultragoal/SKILL.md");
|
||||
expect(text.toLowerCase()).not.toContain("omx");
|
||||
@@ -88,6 +112,23 @@ describe("skills/ultragoal/SKILL.md", () => {
|
||||
expect(text.toLowerCase()).toContain("record-evidence");
|
||||
});
|
||||
|
||||
it("#given omo is absent from PATH #when bootstrap instructions are read #then local cached CLI fallback is documented", async () => {
|
||||
const text = await readText("skills/ultragoal/SKILL.md");
|
||||
|
||||
expect(text).toContain("If `omo` is absent from PATH");
|
||||
expect(text).toContain("ULTRAGOAL_CLI");
|
||||
expect(text).toContain("components/ultragoal/dist/cli.js");
|
||||
});
|
||||
|
||||
it("#given empty PATH #when bootstrap instructions are read #then handles empty PATH without losing notepad bootstrap", async () => {
|
||||
const text = await readText("skills/ultragoal/SKILL.md");
|
||||
|
||||
expect(text).toContain("If PATH is empty");
|
||||
expect(text).toContain("ULTRAGOAL_NODE");
|
||||
expect(text).toContain(".omo/ultragoal/bootstrap-notepad.md");
|
||||
expect(text).not.toContain("ls -1");
|
||||
});
|
||||
|
||||
it("uses the .omo workspace path", async () => {
|
||||
const text = await readText("skills/ultragoal/SKILL.md");
|
||||
expect(text).toContain(".omo/ultragoal");
|
||||
|
||||
Reference in New Issue
Block a user