lazycodex-ai 4.16.0 → 4.16.1
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/dist/cli/codex-ulw-loop.d.ts +8 -0
- package/dist/cli/get-local-version/types.d.ts +1 -1
- package/dist/cli/index.js +260 -207
- package/dist/cli-node/index.js +260 -207
- package/docs/reference/web-terminal-visual-qa.md +39 -45
- package/package.json +3 -2
- package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
- package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
- package/packages/omo-codex/plugin/components/codegraph/package.json +1 -1
- package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
- package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
- package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
- package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
- package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
- package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
- package/packages/omo-codex/plugin/components/rules/package.json +1 -1
- package/packages/omo-codex/plugin/components/start-work-continuation/directive.md +2 -2
- package/packages/omo-codex/plugin/components/start-work-continuation/hooks/hooks.json +2 -2
- package/packages/omo-codex/plugin/components/start-work-continuation/package.json +1 -1
- package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
- package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/directive.md +18 -10
- package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/skills/ultrawork/SKILL.md +18 -10
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/SKILL.md +11 -0
- package/packages/omo-codex/plugin/components/ultrawork/test/codex-hook.test.ts +22 -1
- package/packages/omo-codex/plugin/components/ulw-loop/CHANGELOG.md +4 -0
- package/packages/omo-codex/plugin/components/ulw-loop/directive.md +18 -10
- package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-commands.js +15 -2
- package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-steering.js +2 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/cli.js +89 -27
- package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-io.d.ts +6 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-io.js +55 -9
- package/packages/omo-codex/plugin/components/ulw-loop/dist/steering-snapshot.d.ts +15 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/steering-snapshot.js +33 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/steering-types.d.ts +10 -3
- package/packages/omo-codex/plugin/components/ulw-loop/dist/steering.js +15 -11
- package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +2 -2
- package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/SKILL.md +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/full-workflow.md +7 -7
- package/packages/omo-codex/plugin/components/ulw-loop/src/cli-commands.ts +17 -2
- package/packages/omo-codex/plugin/components/ulw-loop/src/cli-steering.ts +2 -1
- package/packages/omo-codex/plugin/components/ulw-loop/src/plan-io.ts +59 -11
- package/packages/omo-codex/plugin/components/ulw-loop/src/steering-snapshot.ts +38 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/steering-types.ts +11 -3
- package/packages/omo-codex/plugin/components/ulw-loop/src/steering.ts +15 -7
- package/packages/omo-codex/plugin/components/ulw-loop/test/cli-create-goals.test.ts +16 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/plan-io.test.ts +260 -2
- package/packages/omo-codex/plugin/components/ulw-loop/test/steering-snapshot.test.ts +124 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/steering.test.ts +101 -2
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-codegraph-init-guidance.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
- package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
- package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-checking-codegraph-bootstrap.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
- package/packages/omo-codex/plugin/hooks/stop-checking-start-work-continuation.json +1 -1
- package/packages/omo-codex/plugin/hooks/subagent-stop-checking-start-work-continuation.json +1 -1
- package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
- package/packages/omo-codex/plugin/package-lock.json +13 -13
- package/packages/omo-codex/plugin/package.json +1 -1
- package/packages/omo-codex/plugin/scripts/hook-status-message.mjs +10 -6
- package/packages/omo-codex/plugin/skills/frontend/SKILL.md +9 -9
- package/packages/omo-codex/plugin/skills/frontend/references/design/README.md +7 -3
- package/packages/omo-codex/plugin/skills/frontend/references/design/_INDEX.md +1 -1
- package/packages/omo-codex/plugin/skills/frontend/references/design/design-system-architecture.md +24 -2
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/README.md +2 -2
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/lane-b-execution.md +1 -1
- package/packages/omo-codex/plugin/skills/start-work/SKILL.md +2 -2
- package/packages/omo-codex/plugin/skills/ultrawork/SKILL.md +18 -10
- package/packages/omo-codex/plugin/skills/ulw-loop/SKILL.md +1 -1
- package/packages/omo-codex/plugin/skills/ulw-loop/references/full-workflow.md +7 -7
- package/packages/omo-codex/plugin/skills/ulw-plan/SKILL.md +11 -0
- package/packages/omo-codex/plugin/skills/visual-qa/SKILL.md +13 -17
- package/packages/omo-codex/plugin/test/aggregate-hooks.test.mjs +4 -4
- package/packages/omo-codex/plugin/test/bootstrap-hooks.test.mjs +1 -1
- package/packages/omo-codex/plugin/test/hook-status-message.test.mjs +22 -9
- package/packages/omo-codex/plugin/test/sync-hook-status-messages.test.mjs +6 -6
- package/packages/omo-codex/plugin/test/ulw-plan-skill-contract.test.mjs +52 -0
- package/packages/omo-codex/scripts/install-dist/install-local.mjs +65 -39
- package/packages/shared-skills/skills/frontend/SKILL.md +9 -9
- package/packages/shared-skills/skills/frontend/references/design/README.md +7 -3
- package/packages/shared-skills/skills/frontend/references/design/_INDEX.md +1 -1
- package/packages/shared-skills/skills/frontend/references/design/design-system-architecture.md +24 -2
- package/packages/shared-skills/skills/frontend/references/designpowers/README.md +2 -2
- package/packages/shared-skills/skills/frontend/references/designpowers/lane-b-execution.md +1 -1
- package/packages/shared-skills/skills/start-work/SKILL.md +2 -2
- package/packages/shared-skills/skills/visual-qa/SKILL.md +13 -17
- package/script/qa/strip-ansi.mjs +10 -0
- package/script/qa/web-terminal-visual-qa.mjs +112 -195
- package/script/qa/xterm-live-terminal.mjs +180 -0
- package/script/qa/web-terminal-renderer.mjs +0 -218
|
@@ -1,81 +1,75 @@
|
|
|
1
1
|
# Web Terminal Visual QA
|
|
2
2
|
|
|
3
|
-
Use `script/qa/web-terminal-visual-qa.mjs` whenever QA needs TUI visual evidence. It
|
|
3
|
+
Use `script/qa/web-terminal-visual-qa.mjs` whenever QA needs TUI visual evidence. It runs the command in a real pty (node-pty), renders it through a **real xterm.js terminal in headless Chrome**, drives scripted interaction through that browser terminal, and screenshots it. The color path is xterm.js, so truecolor, 256-color, box-drawing, and CJK width are faithful. **NEVER use `tmux capture-pane` for color/visual/layout/CJK TUI evidence** - it degrades truecolor and misaligns wide glyphs. tmux stays useful only for boot smoke ("did it render, did it accept a key"), never for the pixel evidence a reviewer trusts.
|
|
4
4
|
|
|
5
5
|
## Evidence Contract
|
|
6
6
|
|
|
7
7
|
Each run writes these files under the chosen evidence directory:
|
|
8
8
|
|
|
9
|
-
- `terminal.
|
|
10
|
-
- `terminal
|
|
11
|
-
- `terminal.
|
|
12
|
-
- `
|
|
13
|
-
- `metadata.json`: connector, source, output paths, and cleanup receipt.
|
|
9
|
+
- `terminal.png`: the xterm.js screenshot (true color). The primary artifact - cite and attach this.
|
|
10
|
+
- `terminal.txt`: redacted rendered screen text (from the xterm.js buffer) for review and assertions.
|
|
11
|
+
- `terminal-ansi.txt`: the redacted raw pty byte stream, for debugging.
|
|
12
|
+
- `metadata.json`: connector, color path, source, interaction, output paths, and cleanup receipt.
|
|
14
13
|
|
|
15
|
-
The PR should cite `metadata.json` and attach
|
|
14
|
+
The PR should cite `metadata.json` and attach `terminal.png` for OpenCode/Codex TUI proof. For PR-body image hosting, use GitHub user attachments as documented in [docs/reference/github-attachment-upload.md](github-attachment-upload.md); do not commit temporary PNGs, use releases, or use external image hosts.
|
|
16
15
|
|
|
17
|
-
##
|
|
18
|
-
|
|
19
|
-
The helper redacts terminal content before writing `terminal.txt`, `terminal-ansi.txt`, `terminal.html`, or `terminal.png`. Built-in rules cover common authorization headers, token/password/key assignments, GitHub tokens, and OpenAI-style `sk-...` tokens.
|
|
20
|
-
|
|
21
|
-
Add exact local values with `--redact <literal>` and project-specific patterns with `--redact-regex <expr>`:
|
|
16
|
+
## Live Capture (default)
|
|
22
17
|
|
|
23
18
|
```bash
|
|
24
19
|
node script/qa/web-terminal-visual-qa.mjs \
|
|
25
20
|
--title "Codex TUI QA" \
|
|
26
|
-
--
|
|
27
|
-
--
|
|
28
|
-
--
|
|
29
|
-
--
|
|
21
|
+
--command "codex --help" \
|
|
22
|
+
--source-label "codex help smoke" \
|
|
23
|
+
--cwd "$PWD" \
|
|
24
|
+
--evidence-dir .omo/evidence/run/codex-web-terminal
|
|
30
25
|
```
|
|
31
26
|
|
|
32
|
-
|
|
27
|
+
Drive an interactive TUI by scripting keystrokes with repeatable `--input`, applied in order through the browser terminal. Literal text is typed; `{Enter}`, `{Tab}`, `{Escape}`, `{ArrowDown}`, `{Ctrl+C}` and similar tokens are pressed as keys:
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
node script/qa/web-terminal-visual-qa.mjs --title "menu nav" --command "my-tui" \
|
|
31
|
+
--input "{ArrowDown}" --input "{ArrowDown}" --input "{Enter}" \
|
|
32
|
+
--dwell-ms 2000 --evidence-dir .omo/evidence/run/menu
|
|
33
|
+
```
|
|
33
34
|
|
|
34
|
-
|
|
35
|
+
## Redaction Contract
|
|
35
36
|
|
|
36
|
-
|
|
37
|
+
The helper redacts terminal content before writing `terminal.txt`, `terminal-ansi.txt`, and - when a rule matches - re-renders the masked stream so `terminal.png` never shows the secret. Built-in rules cover common authorization headers, token/password/key assignments, GitHub tokens, and OpenAI-style `sk-...` tokens.
|
|
37
38
|
|
|
38
|
-
|
|
39
|
+
Add exact local values with `--redact <literal>` and project-specific patterns with `--redact-regex <expr>`:
|
|
39
40
|
|
|
40
41
|
```bash
|
|
41
42
|
node script/qa/web-terminal-visual-qa.mjs \
|
|
42
|
-
--title "Codex TUI QA" \
|
|
43
|
-
--
|
|
44
|
-
--
|
|
43
|
+
--title "Codex TUI QA" --command "codex --help" \
|
|
44
|
+
--evidence-dir .omo/evidence/run/codex-web-terminal \
|
|
45
|
+
--redact "$LOCAL_TOKEN" \
|
|
46
|
+
--redact-regex 'session_[A-Za-z0-9]+'
|
|
45
47
|
```
|
|
46
48
|
|
|
47
|
-
|
|
49
|
+
The raw --command string is process data and may contain inline secrets, so it is never persisted to metadata; use `--source-label` for a reviewer-safe description. Do not rely on screenshots to hide secrets: if a capture might include cookies, auth headers, raw env dumps, or provider keys, redact first or summarize the run instead of storing the transcript.
|
|
48
50
|
|
|
49
|
-
##
|
|
51
|
+
## Replay And Chrome-less Fallback
|
|
50
52
|
|
|
51
|
-
|
|
53
|
+
Render an existing raw terminal byte stream through xterm.js:
|
|
52
54
|
|
|
53
55
|
```bash
|
|
54
|
-
node script/qa/web-terminal-visual-qa.mjs \
|
|
55
|
-
--
|
|
56
|
-
--command "opencode --help" \
|
|
57
|
-
--source-label "opencode help smoke" \
|
|
58
|
-
--cwd "$PWD" \
|
|
59
|
-
--evidence-dir .omo/evidence/run/opencode-web-terminal
|
|
56
|
+
node script/qa/web-terminal-visual-qa.mjs --title "Replay" \
|
|
57
|
+
--from-file .omo/evidence/run/capture.ansi --evidence-dir .omo/evidence/run/replay
|
|
60
58
|
```
|
|
61
59
|
|
|
62
|
-
`--
|
|
60
|
+
`--no-browser` skips xterm.js/Chrome and writes only the text and raw-stream artifacts (no PNG). Use it on hosts without Chrome; it is text-only evidence, not color/visual proof.
|
|
63
61
|
|
|
64
62
|
## OS Notes
|
|
65
63
|
|
|
66
|
-
-
|
|
67
|
-
- Windows:
|
|
68
|
-
- Windows-native ConPTY live capture should plug into this same artifact and metadata contract before becoming required.
|
|
64
|
+
- The harness needs `node-pty` (real pty) plus a system Chrome/Chromium (`--chrome-bin` or `CHROME_BIN` to override). `node-pty` ships prebuilds for macOS and Windows; Linux builds from source on install.
|
|
65
|
+
- Windows: node-pty uses ConPTY, so live capture works natively - no tmux, no Git Bash PTY shim required.
|
|
69
66
|
|
|
70
67
|
## QA Guidance
|
|
71
68
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
4. Review `terminal.txt`, `terminal-ansi.txt`, and `metadata.json` for accidental secrets before citing them.
|
|
78
|
-
5. Include `terminal.png`, `terminal.txt`, and `metadata.json` in the evidence summary.
|
|
79
|
-
6. Verify cleanup receipts: no leftover tmux sessions, PIDs, ports, or temp state.
|
|
69
|
+
1. Drive the TUI with `--command` (plus `--input` for interactive flows), or replay a saved stream with `--from-file`.
|
|
70
|
+
2. Store the output under `.omo/evidence/<YYYYMMDD>-<slug>/`.
|
|
71
|
+
3. Review `terminal.txt` and `terminal-ansi.txt` for accidental secrets before citing them.
|
|
72
|
+
4. Include `terminal.png`, `terminal.txt`, and `metadata.json` in the evidence summary.
|
|
73
|
+
5. Verify the cleanup receipt in `metadata.json`: no leftover pty, Chrome, PIDs, ports, or temp state.
|
|
80
74
|
|
|
81
|
-
Tests alone are not TUI visual QA. The passing artifact is the rendered terminal
|
|
75
|
+
Tests alone are not TUI visual QA. The passing artifact is the xterm.js-rendered `terminal.png` plus a binary observation - expected text present, colors correct, no overflow, no border or CJK-width misalignment.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lazycodex-ai",
|
|
3
|
-
"version": "4.16.
|
|
3
|
+
"version": "4.16.1",
|
|
4
4
|
"description": "The Best AI Agent Harness - Batteries-Included OpenCode Plugin with Multi-Model Orchestration, Parallel Background Agents, and Crafted LSP/AST Tools",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -41,10 +41,11 @@
|
|
|
41
41
|
"files": [
|
|
42
42
|
"dist/cli",
|
|
43
43
|
"dist/cli-node",
|
|
44
|
+
"script/qa/strip-ansi.mjs",
|
|
44
45
|
"script/qa/web-terminal-redaction.d.mts",
|
|
45
46
|
"script/qa/web-terminal-redaction.mjs",
|
|
46
|
-
"script/qa/web-terminal-renderer.mjs",
|
|
47
47
|
"script/qa/web-terminal-visual-qa.mjs",
|
|
48
|
+
"script/qa/xterm-live-terminal.mjs",
|
|
48
49
|
"docs/reference/github-attachment-upload.md",
|
|
49
50
|
"docs/reference/web-terminal-visual-qa.md",
|
|
50
51
|
"packages/omo-codex/scripts/install-local.mjs",
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
"command": "node \"${PLUGIN_ROOT}/components/bootstrap/dist/cli.js\" hook session-start",
|
|
9
9
|
"commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\bootstrap.ps1\"",
|
|
10
10
|
"timeout": 30,
|
|
11
|
-
"statusMessage": "(OmO) Checking Bootstrap Provisioning"
|
|
11
|
+
"statusMessage": "(OmO 4.16.1) Checking Bootstrap Provisioning"
|
|
12
12
|
}
|
|
13
13
|
]
|
|
14
14
|
}
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
"type": "command",
|
|
9
9
|
"command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook pre-tool-use",
|
|
10
10
|
"timeout": 5,
|
|
11
|
-
"statusMessage": "(OmO) Recommending Git Bash MCP"
|
|
11
|
+
"statusMessage": "(OmO 4.16.1) Recommending Git Bash MCP"
|
|
12
12
|
}
|
|
13
13
|
]
|
|
14
14
|
}
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
"type": "command",
|
|
21
21
|
"command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook post-compact",
|
|
22
22
|
"timeout": 5,
|
|
23
|
-
"statusMessage": "(OmO) Resetting Git Bash MCP Reminder"
|
|
23
|
+
"statusMessage": "(OmO 4.16.1) Resetting Git Bash MCP Reminder"
|
|
24
24
|
}
|
|
25
25
|
]
|
|
26
26
|
}
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
"type": "command",
|
|
9
9
|
"command": "node \"${PLUGIN_ROOT}/components/lazycodex-executor-verify/dist/cli.js\" hook subagent-stop",
|
|
10
10
|
"timeout": 10,
|
|
11
|
-
"statusMessage": "(OmO) Verifying LazyCodex Executor Evidence"
|
|
11
|
+
"statusMessage": "(OmO 4.16.1) Verifying LazyCodex Executor Evidence"
|
|
12
12
|
}
|
|
13
13
|
]
|
|
14
14
|
}
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
"type": "command",
|
|
9
9
|
"command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook post-tool-use",
|
|
10
10
|
"timeout": 60,
|
|
11
|
-
"statusMessage": "(OmO) Checking LSP Diagnostics"
|
|
11
|
+
"statusMessage": "(OmO 4.16.1) Checking LSP Diagnostics"
|
|
12
12
|
}
|
|
13
13
|
]
|
|
14
14
|
}
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
"type": "command",
|
|
22
22
|
"command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook post-compact",
|
|
23
23
|
"timeout": 5,
|
|
24
|
-
"statusMessage": "(OmO) Resetting LSP Diagnostics Cache"
|
|
24
|
+
"statusMessage": "(OmO 4.16.1) Resetting LSP Diagnostics Cache"
|
|
25
25
|
}
|
|
26
26
|
]
|
|
27
27
|
}
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
"type": "command",
|
|
8
8
|
"command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook session-start",
|
|
9
9
|
"timeout": 10,
|
|
10
|
-
"statusMessage": "(OmO) Loading Project Rules"
|
|
10
|
+
"statusMessage": "(OmO 4.16.1) Loading Project Rules"
|
|
11
11
|
}
|
|
12
12
|
]
|
|
13
13
|
}
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
"type": "command",
|
|
20
20
|
"command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook user-prompt-submit",
|
|
21
21
|
"timeout": 10,
|
|
22
|
-
"statusMessage": "(OmO) Loading Project Rules"
|
|
22
|
+
"statusMessage": "(OmO 4.16.1) Loading Project Rules"
|
|
23
23
|
}
|
|
24
24
|
]
|
|
25
25
|
}
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
"type": "command",
|
|
33
33
|
"command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook post-tool-use",
|
|
34
34
|
"timeout": 10,
|
|
35
|
-
"statusMessage": "(OmO) Matching Project Rules"
|
|
35
|
+
"statusMessage": "(OmO 4.16.1) Matching Project Rules"
|
|
36
36
|
}
|
|
37
37
|
]
|
|
38
38
|
}
|
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
"type": "command",
|
|
46
46
|
"command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook post-compact",
|
|
47
47
|
"timeout": 10,
|
|
48
|
-
"statusMessage": "(OmO) Resetting Project Rule Cache"
|
|
48
|
+
"statusMessage": "(OmO 4.16.1) Resetting Project Rule Cache"
|
|
49
49
|
}
|
|
50
50
|
]
|
|
51
51
|
}
|
|
@@ -20,7 +20,7 @@ You are mid-flight on a Prometheus work plan; this turn is an automatic continua
|
|
|
20
20
|
3. Follow the `start-work` skill in full. The skill is already loaded from your earlier turn — re-read its file at `packages/omo-codex/plugin/skills/start-work/SKILL.md` if you have lost context.
|
|
21
21
|
4. Apply the checkbox's tier from its ledger entry, or classify it now per the start-work skill: LIGHT (default — a narrow change inside existing layers) needs one real-surface proof of the deliverable, with auxiliary surfaces first-class for CLI- or data-shaped work, and only trigger-mapped adversarial classes; HEAVY (new module/abstraction, auth/security, external integration, schema/migration, concurrency, cross-domain refactor, care signals) takes the full per-criterion regime. When unsure, take HEAVY; never downgrade.
|
|
22
22
|
5. Decompose the checkbox into atomic sub-tasks. Dispatch them in PARALLEL via `multi_agent_v1.spawn_agent` calls in this same response unless a sub-task has a NAMED blocking dependency (input from another sub-task or shared file). Use `fork_context: false` unless full history is truly required. Put role and specialty instructions inside `message`.
|
|
23
|
-
6. Every sub-task message MUST be self-contained, executable, not a context handoff: start with `TASK: <imperative assignment>`, then name `DELIVERABLE`, `SCOPE`, and `VERIFY`. It must include all 7 sections and a Manual-QA channel with exact invocation (`curl`, `send-keys`, `browser:control-in-app-browser` action, `page.click`) and PASS/FAIL observable, plus ultraqa classes, artifact, and cleanup receipt. Channels: HTTP (`curl -i`);
|
|
23
|
+
6. Every sub-task message MUST be self-contained, executable, not a context handoff: start with `TASK: <imperative assignment>`, then name `DELIVERABLE`, `SCOPE`, and `VERIFY`. It must include all 7 sections and a Manual-QA channel with exact invocation (`curl`, `send-keys`, `browser:control-in-app-browser` action, `page.click`) and PASS/FAIL observable, plus ultraqa classes, artifact, and cleanup receipt. Channels: HTTP (`curl -i`); terminal/TUI (`send-keys` for boot smoke; xterm.js web terminal for color/visual evidence, never `tmux capture-pane`); browser (Codex: `browser:control-in-app-browser` first unless auth/persistent profile needed; else Chrome/agent-browser); computer use.
|
|
24
24
|
7. Treat every worker DoneClaim as untrusted input. Run independent AdversarialVerify before any checkbox can become FullyDone; `confirmed` is the only pass verdict, while `false-positive`, `needs-fix`, and `needs-human-review` loop back to the executor with exact feedback.
|
|
25
25
|
8. Use `multi_agent_v1.wait_agent` for mailbox signals, not proof of completion — a timeout only means no new mailbox update arrived; a running child is alive. For sub-tasks likely to exceed one wait cycle, require `WORKING: <task> - <current phase>` before long passes and `BLOCKED: <reason>` only when progress stops. Send `TASK STILL ACTIVE: return <deliverable> or BLOCKED: <reason>` only when the child is completed without the deliverable, ack-only, or no longer running. If that followup is still silent or ack-only, record inconclusive, do not count it as pass/review approval, close if safe, and respawn a smaller `fork_context: false` task with the missing deliverable.
|
|
26
26
|
9. After verification of ALL sub-tasks under this checkbox: `apply_patch` the plan to change `- [ ]` → `- [x]`, re-read the plan to confirm the count decreased, append a `task-completed` line to the ledger, then continue.
|
|
@@ -30,7 +30,7 @@ You are mid-flight on a Prometheus work plan; this turn is an automatic continua
|
|
|
30
30
|
|
|
31
31
|
- No production code before a failing-first proof exists: a unit test at a seam, otherwise the sub-task's Manual-QA scenario captured failing. A test that mirrors its implementation (mock-call assertions, pinned constants) is not evidence. When the change touches existing behavior, PIN it first: a baseline characterization test that passes on the unchanged code, with exact inputs, exact observable, and exact assertion. PIN → RED → GREEN → SURFACE.
|
|
32
32
|
- No `--dry-run` as evidence. No "should work". No "tests pass" as completion proof.
|
|
33
|
-
- TUI visual evidence MUST
|
|
33
|
+
- TUI visual evidence MUST render through the real xterm.js web terminal, never `tmux capture-pane`: run `node script/qa/web-terminal-visual-qa.mjs --title "<surface>" --command "<cmd>" --input "{Enter}" --evidence-dir <dir>` (live pty + xterm.js in Chrome; `--from-file <capture>` replays a raw stream), then cite `terminal.png`, `terminal.txt`, and `metadata.json`.
|
|
34
34
|
- No `as any` / `@ts-ignore` / `@ts-expect-error`. No deleting failing tests.
|
|
35
35
|
- Probe every ultraqa adversarial class whose trigger fact holds (malformed input, prompt injection, cancel/resume, stale state, dirty worktree, hung or long commands, flaky tests, misleading success output, repeated interruptions — trigger map in the start-work skill) and capture the observable for each. A clean happy-path artifact alone is NOT a PASS when an applicable class went unprobed; record skipped classes with a one-line not-applicable reason.
|
|
36
36
|
- Cleanup receipt is mandatory. Register each QA teardown (scripts, tmux, browser contexts, PIDs, ports, containers, temp dirs) as a todo when it spawns, then execute it. Leftover QA state = BLOCKED, not PASS.
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
"type": "command",
|
|
8
8
|
"command": "node \"${PLUGIN_ROOT}/components/start-work-continuation/dist/cli.js\" hook stop",
|
|
9
9
|
"timeout": 10,
|
|
10
|
-
"statusMessage": "(OmO) Checking Start-Work Continuation"
|
|
10
|
+
"statusMessage": "(OmO 4.16.1) Checking Start-Work Continuation"
|
|
11
11
|
}
|
|
12
12
|
]
|
|
13
13
|
}
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
"type": "command",
|
|
20
20
|
"command": "node \"${PLUGIN_ROOT}/components/start-work-continuation/dist/cli.js\" hook subagent-stop",
|
|
21
21
|
"timeout": 10,
|
|
22
|
-
"statusMessage": "(OmO) Checking Start-Work Continuation"
|
|
22
|
+
"statusMessage": "(OmO 4.16.1) Checking Start-Work Continuation"
|
|
23
23
|
}
|
|
24
24
|
]
|
|
25
25
|
}
|
|
@@ -49,9 +49,10 @@ exercises the surface; capture the artifact.
|
|
|
49
49
|
1. HTTP call — hit the live endpoint with `curl -i` (or a
|
|
50
50
|
Playwright APIRequestContext); capture status line + headers +
|
|
51
51
|
body.
|
|
52
|
-
2.
|
|
53
|
-
|
|
54
|
-
is
|
|
52
|
+
2. Terminal / TUI - drive a real pty and prove it through the
|
|
53
|
+
xterm.js web terminal (see the TUI visual QA note below). tmux
|
|
54
|
+
`send-keys` is fine for a boot smoke; NEVER `tmux capture-pane`
|
|
55
|
+
for color / layout / CJK evidence, which degrades truecolor.
|
|
55
56
|
3. Browser use — in Codex, use `browser:control-in-app-browser`
|
|
56
57
|
first when available and no authenticated/persistent user browser
|
|
57
58
|
profile is required. Otherwise use Chrome to drive the REAL page;
|
|
@@ -79,13 +80,13 @@ channel scenario when the behavior is user-facing. `--dry-run`,
|
|
|
79
80
|
printing the command, "should respond", and "looks correct" never
|
|
80
81
|
count.
|
|
81
82
|
|
|
82
|
-
For TUI visual QA,
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
83
|
+
For TUI visual QA, render the terminal through the real xterm.js web
|
|
84
|
+
terminal and screenshot it - never a `tmux capture-pane` dump, which
|
|
85
|
+
degrades color and wide-glyph width. In this repo:
|
|
86
|
+
`node script/qa/web-terminal-visual-qa.mjs --title "<surface>" --command "<cmd>" --input "{Enter}" --evidence-dir <dir>`
|
|
87
|
+
(live pty + xterm.js in Chrome; `--from-file <capture>` replays a raw
|
|
88
|
+
stream). Outside this repo, capture equivalent browser-rendered terminal
|
|
89
|
+
evidence: screenshot + plain transcript + cleanup receipt.
|
|
89
90
|
|
|
90
91
|
# Bootstrap (DO ALL FOUR BEFORE ANY OTHER WORK — NO SKIPPING)
|
|
91
92
|
|
|
@@ -287,6 +288,13 @@ evidence for that step. Do not start dependent implementation until the
|
|
|
287
288
|
audit, research, or review result is integrated or explicitly recorded
|
|
288
289
|
as inconclusive. Do not generate a plan before spawned research lanes
|
|
289
290
|
that feed the plan have returned or been closed as inconclusive.
|
|
291
|
+
Spawn every independent child for the current wave first. After the wave
|
|
292
|
+
is launched, run `multi_agent_v1.wait_agent` for each spawned child until
|
|
293
|
+
each reaches terminal status (`completed`, `failed`, `blocked`, or
|
|
294
|
+
explicitly recorded inconclusive) before any dependent `update_plan`
|
|
295
|
+
transition, `create_goal` continuation, implementation tool call, plan
|
|
296
|
+
drafting, approval-gate work, PR handoff, or final response. A timeout is
|
|
297
|
+
not terminal status.
|
|
290
298
|
Do not write the final answer, PR handoff, or completion summary while
|
|
291
299
|
active child agents remain open. Use short `multi_agent_v1.wait_agent` cycles.
|
|
292
300
|
After two silent waits send `TASK STILL ACTIVE: return <deliverable> or
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@code-yeongyu/codex-ultrawork",
|
|
3
|
-
"version": "4.16.
|
|
3
|
+
"version": "4.16.1",
|
|
4
4
|
"description": "Codex plugin that injects the ultrawork orchestration directive and ships LazyCodex planning, review, QA, and gate agent roles.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"packageManager": "npm@11.12.1",
|
|
@@ -56,9 +56,10 @@ exercises the surface; capture the artifact.
|
|
|
56
56
|
1. HTTP call — hit the live endpoint with `curl -i` (or a
|
|
57
57
|
Playwright APIRequestContext); capture status line + headers +
|
|
58
58
|
body.
|
|
59
|
-
2.
|
|
60
|
-
|
|
61
|
-
is
|
|
59
|
+
2. Terminal / TUI - drive a real pty and prove it through the
|
|
60
|
+
xterm.js web terminal (see the TUI visual QA note below). tmux
|
|
61
|
+
`send-keys` is fine for a boot smoke; NEVER `tmux capture-pane`
|
|
62
|
+
for color / layout / CJK evidence, which degrades truecolor.
|
|
62
63
|
3. Browser use — in Codex, use `browser:control-in-app-browser`
|
|
63
64
|
first when available and no authenticated/persistent user browser
|
|
64
65
|
profile is required. Otherwise use Chrome to drive the REAL page;
|
|
@@ -86,13 +87,13 @@ channel scenario when the behavior is user-facing. `--dry-run`,
|
|
|
86
87
|
printing the command, "should respond", and "looks correct" never
|
|
87
88
|
count.
|
|
88
89
|
|
|
89
|
-
For TUI visual QA,
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
90
|
+
For TUI visual QA, render the terminal through the real xterm.js web
|
|
91
|
+
terminal and screenshot it - never a `tmux capture-pane` dump, which
|
|
92
|
+
degrades color and wide-glyph width. In this repo:
|
|
93
|
+
`node script/qa/web-terminal-visual-qa.mjs --title "<surface>" --command "<cmd>" --input "{Enter}" --evidence-dir <dir>`
|
|
94
|
+
(live pty + xterm.js in Chrome; `--from-file <capture>` replays a raw
|
|
95
|
+
stream). Outside this repo, capture equivalent browser-rendered terminal
|
|
96
|
+
evidence: screenshot + plain transcript + cleanup receipt.
|
|
96
97
|
|
|
97
98
|
# Bootstrap (DO ALL FOUR BEFORE ANY OTHER WORK — NO SKIPPING)
|
|
98
99
|
|
|
@@ -294,6 +295,13 @@ evidence for that step. Do not start dependent implementation until the
|
|
|
294
295
|
audit, research, or review result is integrated or explicitly recorded
|
|
295
296
|
as inconclusive. Do not generate a plan before spawned research lanes
|
|
296
297
|
that feed the plan have returned or been closed as inconclusive.
|
|
298
|
+
Spawn every independent child for the current wave first. After the wave
|
|
299
|
+
is launched, run `multi_agent_v1.wait_agent` for each spawned child until
|
|
300
|
+
each reaches terminal status (`completed`, `failed`, `blocked`, or
|
|
301
|
+
explicitly recorded inconclusive) before any dependent `update_plan`
|
|
302
|
+
transition, `create_goal` continuation, implementation tool call, plan
|
|
303
|
+
drafting, approval-gate work, PR handoff, or final response. A timeout is
|
|
304
|
+
not terminal status.
|
|
297
305
|
Do not write the final answer, PR handoff, or completion summary while
|
|
298
306
|
active child agents remain open. Use short `multi_agent_v1.wait_agent` cycles.
|
|
299
307
|
After two silent waits send `TASK STILL ACTIVE: return <deliverable> or
|
|
@@ -67,6 +67,17 @@ Fan out read-only research before deciding. Every spawn names DELIVERABLE / SCOP
|
|
|
67
67
|
multi_agent_v1.spawn_agent({"message":"TASK: act as an explorer. DELIVERABLE: ... SCOPE: ... VERIFY: ...","agent_type":"explorer","fork_context":false})
|
|
68
68
|
```
|
|
69
69
|
|
|
70
|
+
Spawn every independent child for the current wave first. After the wave
|
|
71
|
+
is launched, use `multi_agent_v1.wait_agent` for each child until each
|
|
72
|
+
reaches terminal status. A timeout is not terminal status. Do not start dependent planning, drafting, approval-gate work, or final handoff until each child result is integrated or recorded as inconclusive.
|
|
73
|
+
|
|
74
|
+
For work likely to exceed one wait cycle, require the child to send
|
|
75
|
+
`WORKING: <task> - <current phase>` before long passes and
|
|
76
|
+
`BLOCKED: <reason>` only when progress stops. A `multi_agent_v1.wait_agent`
|
|
77
|
+
timeout only means no new mailbox update arrived. Treat a running child as
|
|
78
|
+
alive. Fallback only when the child is completed without the deliverable,
|
|
79
|
+
ack-only after followup, explicitly `BLOCKED:`, or no longer running.
|
|
80
|
+
|
|
70
81
|
Roles: `explorer` (internal patterns/conventions/tests), `librarian` (external docs/contracts), `metis` (gap analysis), `momus` (high-accuracy plan review). Full spawn/wait/fallback discipline is in `references/full-workflow.md`.
|
|
71
82
|
|
|
72
83
|
## Stop rules
|
|
@@ -190,7 +190,7 @@ describe("codex ultrawork hook", () => {
|
|
|
190
190
|
expect(parsed.hookSpecificOutput.additionalContext).toMatch(/# Manual-QA channels/);
|
|
191
191
|
expect(parsed.hookSpecificOutput.additionalContext).toMatch(/TESTS ALONE NEVER PROVE DONE/);
|
|
192
192
|
expect(parsed.hookSpecificOutput.additionalContext).toMatch(/1\. HTTP call/);
|
|
193
|
-
expect(parsed.hookSpecificOutput.additionalContext).toMatch(/2\.
|
|
193
|
+
expect(parsed.hookSpecificOutput.additionalContext).toMatch(/2\. Terminal \/ TUI/);
|
|
194
194
|
expect(parsed.hookSpecificOutput.additionalContext).toMatch(/3\. Browser use/);
|
|
195
195
|
expect(parsed.hookSpecificOutput.additionalContext).toMatch(/4\. Computer use/);
|
|
196
196
|
expect(parsed.hookSpecificOutput.additionalContext).toMatch(/CLEANUP \(PAIRED/);
|
|
@@ -244,6 +244,27 @@ describe("codex ultrawork hook", () => {
|
|
|
244
244
|
expect(directive).toMatch(/WORKING:/);
|
|
245
245
|
});
|
|
246
246
|
|
|
247
|
+
it("#given directive #when inspected #then blocks dependent work until spawned planners finish", () => {
|
|
248
|
+
// given
|
|
249
|
+
const payload = {
|
|
250
|
+
hook_event_name: "UserPromptSubmit",
|
|
251
|
+
prompt: "ulw",
|
|
252
|
+
};
|
|
253
|
+
|
|
254
|
+
// when
|
|
255
|
+
const output = runUserPromptSubmitHook(payload, { skillFilePath: null });
|
|
256
|
+
const parsed = parseHookOutput(output);
|
|
257
|
+
|
|
258
|
+
// then
|
|
259
|
+
const directive = parsed.hookSpecificOutput.additionalContext;
|
|
260
|
+
expect(directive).toMatch(/Subagent-dependent transition barrier/);
|
|
261
|
+
expect(directive).toMatch(/Spawn every independent child for the current wave first/);
|
|
262
|
+
expect(directive).toMatch(/After the wave\s+is launched[\s\S]{0,240}wait_agent[\s\S]{0,240}terminal status/);
|
|
263
|
+
expect(directive).not.toMatch(/Immediately after any `multi_agent_v1\.spawn_agent`/);
|
|
264
|
+
expect(directive).toMatch(/Do not start dependent implementation/);
|
|
265
|
+
expect(directive).toMatch(/Do not mark an `update_plan` step `completed`/);
|
|
266
|
+
});
|
|
267
|
+
|
|
247
268
|
it("#given directive #when inspected #then keeps impact-proportional sizing invariants", () => {
|
|
248
269
|
// given
|
|
249
270
|
const payload = {
|