oh-my-opencode 5.0.0-beta.18 → 5.0.0-beta.19
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/index.js +289 -160
- package/dist/cli-node/index.js +289 -160
- package/dist/index.js +324 -176
- package/dist/skills/ast-grep/AGENTS.md +51 -0
- package/dist/skills/coding-agent-sessions/AGENTS.md +62 -0
- package/dist/skills/start-work/SKILL.md +2 -1
- package/dist/skills/ultimate-browsing/SKILL.md +2 -0
- package/dist/skills/ultimate-browsing/references/chrome-stealth.md +2 -0
- package/dist/skills/visual-qa/AGENTS.md +58 -0
- package/dist/tui.js +17 -17
- package/package.json +21 -21
- package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
- package/packages/omo-codex/plugin/AGENTS.md +47 -0
- 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/AGENTS.md +9 -0
- package/packages/omo-codex/plugin/components/comment-checker/biome.json +2 -2
- 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/comment-checker/src/apply-patch.ts +2 -8
- package/packages/omo-codex/plugin/components/comment-checker/src/core.ts +1 -2
- package/packages/omo-codex/plugin/components/comment-checker/src/request-extractor.ts +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/biome.json +2 -2
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/dist/cli.js +1 -5
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/dist/codex-hook.js +1 -5
- 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/lazycodex-executor-verify/src/codex-hook.ts +1 -5
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/test/codex-hook.test.ts +1 -4
- package/packages/omo-codex/plugin/components/lsp/AGENTS.md +30 -15
- package/packages/omo-codex/plugin/components/lsp/biome.json +2 -2
- package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +3 -3
- package/packages/omo-codex/plugin/components/lsp/dist/daemon-cli-path.js +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/lsp/src/codex-hook.ts +1 -1
- package/packages/omo-codex/plugin/components/lsp/src/daemon-cli-path.ts +1 -5
- package/packages/omo-codex/plugin/components/lsp/test/codex-hook-unavailable.test.ts +6 -7
- package/packages/omo-codex/plugin/components/lsp/test/codex-hook.test.ts +1 -2
- package/packages/omo-codex/plugin/components/lsp/test/package-smoke.test.ts +11 -1
- package/packages/omo-codex/plugin/components/rules/AGENTS.md +12 -0
- package/packages/omo-codex/plugin/components/rules/biome.json +2 -2
- package/packages/omo-codex/plugin/components/rules/dist/cli.js +43 -30
- package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
- package/packages/omo-codex/plugin/components/rules/package.json +2 -2
- package/packages/omo-codex/plugin/components/rules/src/config.ts +1 -2
- package/packages/omo-codex/plugin/components/rules/src/persistent-cache.ts +1 -2
- package/packages/omo-codex/plugin/components/rules/src/post-compact-budget.ts +6 -2
- package/packages/omo-codex/plugin/components/rules/src/rules-engine-factory.ts +1 -4
- package/packages/omo-codex/plugin/components/rules/src/static-injection.ts +4 -9
- package/packages/omo-codex/plugin/components/rules/test/bundled-rules.test.ts +1 -2
- package/packages/omo-codex/plugin/components/rules/test/dynamic-target-fingerprints.test.ts +1 -2
- package/packages/omo-codex/plugin/components/rules/test/engine.test.ts +7 -4
- package/packages/omo-codex/plugin/components/rules/test/finder.test.ts +2 -3
- package/packages/omo-codex/plugin/components/rules/test/formatter.test.ts +2 -3
- package/packages/omo-codex/plugin/components/rules/test/hephaestus-model-variant.test.ts +1 -2
- package/packages/omo-codex/plugin/components/rules/test/matcher.test.ts +2 -3
- package/packages/omo-codex/plugin/components/rules/test/package-smoke.test.ts +1 -1
- package/packages/omo-codex/plugin/components/rules/test/parser.test.ts +1 -2
- package/packages/omo-codex/plugin/components/rules/test/post-compact-budget.test.ts +1 -2
- package/packages/omo-codex/plugin/components/rules/test/rules-engine-consumption.test.ts +3 -6
- package/packages/omo-codex/plugin/components/rules/test/scanner.test.ts +1 -2
- package/packages/omo-codex/plugin/components/rules/test/sources.test.ts +2 -5
- package/packages/omo-codex/plugin/components/rules/test/windows-git-bash-bundled-rule.test.ts +1 -2
- package/packages/omo-codex/plugin/components/start-work-continuation/biome.json +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/AGENTS.md +8 -0
- package/packages/omo-codex/plugin/components/telemetry/biome.json +2 -2
- package/packages/omo-codex/plugin/components/telemetry/dist/cli.js +237 -99
- package/packages/omo-codex/plugin/components/telemetry/dist/posthog.js +237 -99
- 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/telemetry/src/codex-hook.ts +1 -4
- package/packages/omo-codex/plugin/components/telemetry/src/posthog.ts +4 -14
- package/packages/omo-codex/plugin/components/telemetry/src/product-identity.ts +1 -1
- package/packages/omo-codex/plugin/components/telemetry/test/diagnostics.test.ts +2 -5
- package/packages/omo-codex/plugin/components/ultrawork/AGENTS.md +5 -0
- package/packages/omo-codex/plugin/components/ultrawork/biome.json +2 -2
- package/packages/omo-codex/plugin/components/ultrawork/directive.md +7 -1
- 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 +7 -1
- package/packages/omo-codex/plugin/components/ultrawork/test/codex-hook-trigger-policy.test.ts +9 -1
- package/packages/omo-codex/plugin/components/ulw-loop/AGENTS.md +16 -0
- package/packages/omo-codex/plugin/components/ulw-loop/biome.json +2 -2
- package/packages/omo-codex/plugin/components/ulw-loop/directive.md +7 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/cli.js +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-snapshot.js +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +4 -4
- package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/src/codex-goal-snapshot.ts +3 -1
- package/packages/omo-codex/plugin/components/ulw-loop/src/codex-hook.ts +3 -1
- package/packages/omo-codex/plugin/components/ulw-loop/test/codex-goal-snapshot.test.ts +18 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/package-smoke.test.ts +3 -2
- package/packages/omo-codex/plugin/components/ulw-loop/test/steering.test.ts +8 -5
- 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-guarding-ulw-loop-spawns.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/stop-checking-ulw-loop-resume.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 +19 -19
- package/packages/omo-codex/plugin/package.json +1 -1
- package/packages/omo-codex/plugin/scripts/AGENTS.md +40 -0
- package/packages/omo-codex/plugin/skills/ast-grep/AGENTS.md +51 -0
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/AGENTS.md +62 -0
- package/packages/omo-codex/plugin/skills/start-work/SKILL.md +2 -1
- package/packages/omo-codex/plugin/skills/ultimate-browsing/SKILL.md +2 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/chrome-stealth.md +2 -0
- package/packages/omo-codex/plugin/skills/ultrawork/SKILL.md +7 -1
- package/packages/omo-codex/plugin/skills/visual-qa/AGENTS.md +58 -0
- package/packages/omo-codex/plugin/test/AGENTS.md +47 -0
- package/packages/omo-codex/scripts/AGENTS.md +36 -0
- package/packages/omo-codex/scripts/install-dist/install-local.mjs +249 -120
- package/packages/shared-skills/skills/ast-grep/AGENTS.md +51 -0
- package/packages/shared-skills/skills/coding-agent-sessions/AGENTS.md +62 -0
- package/packages/shared-skills/skills/start-work/SKILL.md +2 -1
- package/packages/shared-skills/skills/ultimate-browsing/SKILL.md +2 -0
- package/packages/shared-skills/skills/ultimate-browsing/references/chrome-stealth.md +2 -0
- package/packages/shared-skills/skills/visual-qa/AGENTS.md +58 -0
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# ast-grep — Vendored Structural-Search Skill
|
|
2
|
+
|
|
3
|
+
**Generated:** 2026-08-24 (f3642fcda)
|
|
4
|
+
|
|
5
|
+
## OVERVIEW
|
|
6
|
+
|
|
7
|
+
Vendored skill teaching agents ast-grep (`sg`) structural search/rewrite, plus a stdlib-Python helper CLI that wraps the `sg` binary. Vendoring pin in `SOURCE`: upstream `code-yeongyu/ast-grep-skill @ 3148c69` (ast-grep 0.45.0), "vendored as a sync; do not fork-drift". Earned this file: own executable surface (749-LOC helper + installers + smoke tests) and a no-fork-drift upstream contract that has no analogue elsewhere in `shared-skills`.
|
|
8
|
+
|
|
9
|
+
## STRUCTURE
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
ast-grep/
|
|
13
|
+
├── SKILL.md / README.md # agent workflow / user overview
|
|
14
|
+
├── SOURCE # upstream pin — the no-fork-drift contract
|
|
15
|
+
├── scripts/ast_grep_helper.py # 749-LOC stdlib CLI (argparse; no deps)
|
|
16
|
+
├── install.sh / install.ps1 # macOS/Linux + Windows installers
|
|
17
|
+
├── references/ # cli, install, patterns, pitfalls, recipes, yaml-rules (510 LOC), sgconfig
|
|
18
|
+
└── tests/smoke.{sh,ps1} # POSIX + PowerShell smoke (also shell syntax + content checks)
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## HELPER CLI (`scripts/ast_grep_helper.py`)
|
|
22
|
+
|
|
23
|
+
Subcommands: `search`, `replace` (dry-run; `--apply` to write), `scan`, `test`, `new`, `langs`, `doctor`, `install`, `validate`. Resolves the `sg`/`ast-grep` binary across PATH, Homebrew, npm, and OMO caches, validates patterns before executing, and shells out — it never links ast-grep as a library. Internal handlers `cmd_*`; utilities `validate_pattern`, `normalize_lang`, `resolve_binary`, `run_sg`. Nothing in-repo imports it; docs and skills invoke it by path. `omo-opencode/src/cli/install-ast-grep-sg.ts` locates this skill dir to install the binary.
|
|
24
|
+
|
|
25
|
+
## CONVENTIONS
|
|
26
|
+
|
|
27
|
+
- AST patterns, never regex, for syntax-shaped queries; `$VAR` singles, `$$$` multis; patterns must parse as complete code in the target language.
|
|
28
|
+
- Two-pass rewrites: preview with `--json=compact`, apply separately with `--update-all` — the flags are mutually exclusive in `sg`.
|
|
29
|
+
- `sgconfig.yml` discovered upward; `ruleDirs`, optional `testConfigs`/`utilDirs`, language globs, custom languages, injections.
|
|
30
|
+
- Upstream syncs land as whole vendored refreshes matching `SOURCE`; local edits ride along until the next sync absorbs or reverts them.
|
|
31
|
+
|
|
32
|
+
## ANTI-PATTERNS
|
|
33
|
+
|
|
34
|
+
- NO regex constructs (`.*`, `.+`, `\w`, `\d`, literal `|`) inside AST patterns — that is the skill's #1 pitfall.
|
|
35
|
+
- No incomplete patterns (e.g. Python `def $F($$$):` without a body).
|
|
36
|
+
- NEVER `--apply` a rewrite without the dry-run preview first.
|
|
37
|
+
- Text/comment/byte queries go to `rg`, not structural matching.
|
|
38
|
+
- Do not fork-drift from the `SOURCE` pin; a sync is a vendored refresh, not a merge.
|
|
39
|
+
|
|
40
|
+
## COMMANDS
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
# from packages/shared-skills/skills/ast-grep/
|
|
44
|
+
python3 scripts/ast_grep_helper.py search '<PATTERN>' --lang ts [path]
|
|
45
|
+
python3 scripts/ast_grep_helper.py replace '<PATTERN>' '<REWRITE>' --lang ts # dry-run; add --apply
|
|
46
|
+
python3 scripts/ast_grep_helper.py doctor
|
|
47
|
+
bash tests/smoke.sh # or: pwsh tests/smoke.ps1
|
|
48
|
+
# direct: sg run -p '<PATTERN>' --lang ts path
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
- Parent: [`packages/shared-skills/AGENTS.md`](../../AGENTS.md).
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# coding-agent-sessions — Cross-Platform Session Finder (Python)
|
|
2
|
+
|
|
3
|
+
**Generated:** 2026-08-24 (f3642fcda)
|
|
4
|
+
|
|
5
|
+
## OVERVIEW
|
|
6
|
+
|
|
7
|
+
The only shared skill besides `ultimate-browsing` carrying a real sub-project: a Python package + CLI that finds, lists, searches, and reads local coding-agent session transcripts across ~25 platforms (Codex, Claude, OpenCode, OMO/Senpi/pi, and a long tail), normalizing them into one `Session` model. Earned this file: 33 files, 23 Python modules, own test suite, own `pyrightconfig.json`, own `.npmignore` (ships in the npm package minus tests/caches).
|
|
8
|
+
|
|
9
|
+
## STRUCTURE
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
coding-agent-sessions/
|
|
13
|
+
├── SKILL.md # router: platform table → references/<platform>.md
|
|
14
|
+
├── references/ # codex, claude, opencode, senpi, all-platforms (store layouts per platform)
|
|
15
|
+
├── agents/openai.yaml # Codex agent role declaration
|
|
16
|
+
├── scripts/
|
|
17
|
+
│ ├── find-agent-sessions.py # thin shebang entry (PEP 723, >=3.11); runpy → agent_sessions.cli
|
|
18
|
+
│ ├── agent_sessions/ # the package (12 modules)
|
|
19
|
+
│ └── tests/ # 6 pytest modules
|
|
20
|
+
└── pyrightconfig.json # extraPaths scripts/, excludes scripts/tests
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## PUBLIC API (`scripts/agent_sessions/`)
|
|
24
|
+
|
|
25
|
+
| Module | Key exports |
|
|
26
|
+
|--------|-------------|
|
|
27
|
+
| `scanners.py` | `scan`, `DEFAULT_PLATFORMS`, `PLATFORM_SCANNERS`, per-platform `scan_*` (codex, claude, opencode, senpi, oh_my_pi, gajae_code, …) |
|
|
28
|
+
| `types.py` | `Session`, `Options`, `Json`, `JsonMap` — imported by nearly every module and test |
|
|
29
|
+
| `transcript.py` | parallel file reads, normalization, timestamps, session ids; `recent`, `MAX_PLATFORM_FILES` |
|
|
30
|
+
| `cli.py` | command parsing, filtering, payload construction, JSON emission (283 LOC — behavioral hotspot) |
|
|
31
|
+
| platform adapters | `file_scanners.py` (file-backed providers), `opencode.py` (CLI/SQLite/storage fallbacks), `sqlite_scanners.py`, `sqlite_optional_scanners.py`, `pi_family.py`, `aside_scanner.py`, `kiro_scanner.py` |
|
|
32
|
+
|
|
33
|
+
## CLI CONTRACT
|
|
34
|
+
|
|
35
|
+
`python3 scripts/find-agent-sessions.py <command>`; aliases `find`=`search`, `read`=`get`. Commands: `list`, `find`/`search` (repeated `--query` lanes, `--from 7d`, repeated `--platform`, `--workers`, `--cwd/--model`, `--include-subagents`, `--limit`), `get`/`read <session-id>`. Output is JSON with `match_reasons` and reconstructed first/last user prompts — that JSON shape is the stable contract.
|
|
36
|
+
|
|
37
|
+
## CONVENTIONS
|
|
38
|
+
|
|
39
|
+
- Stdlib-only Python (`>=3.11`), `from __future__ import annotations`, pathlib everywhere; no third-party deps at runtime.
|
|
40
|
+
- Probe-first, bounded discovery: platform-specific roots checked before broad globbing; optional platforms excluded from default search when they cannot reconstruct user prompts.
|
|
41
|
+
- Main sessions hide subagent children by default but report child counts; `--include-subagents` flips it. Parent/child linkage preserved and records deduplicated.
|
|
42
|
+
- Tests are pytest with `tmp_path` + `MonkeyPatch` isolation; in-file `# pyright: ignore[reportMissingImports]`-style relaxations for import diagnostics only.
|
|
43
|
+
- `.npmignore` strips `scripts/tests/`, `pyrightconfig.json`, and caches from the shipped skill.
|
|
44
|
+
|
|
45
|
+
## ANTI-PATTERNS
|
|
46
|
+
|
|
47
|
+
- NEVER answer from normalized previews alone — pull the raw transcript (`read`/`get`) for exact evidence.
|
|
48
|
+
- Usage-only stores are NOT transcript sources.
|
|
49
|
+
- A Claude subagent's embedded `sessionId` is NOT its identity — use its `agentId` + parent-directory linkage.
|
|
50
|
+
- Don't add a platform by globbing blindly; register it in `PLATFORM_SCANNERS`/`DEFAULT_PLATFORMS` with a bounded root probe.
|
|
51
|
+
|
|
52
|
+
## COMMANDS
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
# from packages/shared-skills/skills/coding-agent-sessions/
|
|
56
|
+
python3 scripts/find-agent-sessions.py list --limit 20
|
|
57
|
+
python3 scripts/find-agent-sessions.py find "commit" --from 7d --platform senpi --platform opencode
|
|
58
|
+
python3 scripts/find-agent-sessions.py read <session-id>
|
|
59
|
+
pytest scripts/tests
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
- Parent: [`packages/shared-skills/AGENTS.md`](../../AGENTS.md).
|
|
@@ -102,6 +102,7 @@ For PR/branch work, a task-owned worktree is mandatory before implementation sta
|
|
|
102
102
|
Solo orchestration with parallel background workers is the default topology. Decide once, when the wave's lanes are known, and record the verdict in the ledger:
|
|
103
103
|
|
|
104
104
|
- **Independent lanes -> parallel workers.** Separate files, no shared contract: one parallel spawn burst; no team.
|
|
105
|
+
- **Dependency-ordered lanes -> a dag run.** Sub-tasks with real ordering between them (C needs A and B finished first) and a harness with a native `dag` tool: dispatch the wave as ONE dag run — one producer node per lane plus a verification node — instead of a spawn burst, and watch the run's lifecycle instead of arming per-lane watchers. Read the `mass-ulw` skill's `SKILL.md` and `references/planning.md` IN FULL before defining any graph.
|
|
105
106
|
- **Overlapping lanes -> a team.** The lanes touch the same module or contract AND running them concurrently actually finishes sooner: stand up a team (where the harness has one) so one lane's discoveries relay through you mid-flight.
|
|
106
107
|
- **PR-mode independent lanes -> a worktree per lane.** Under `--make-pr`/`--ship`, when a wave holds independent checkboxes, give each lane its own branch and task-owned worktree, delivered as its own PR.
|
|
107
108
|
|
|
@@ -118,7 +119,7 @@ Landing rules, regardless of topology:
|
|
|
118
119
|
3. Ignore nested checkboxes under acceptance criteria, evidence, and definition-of-done sections.
|
|
119
120
|
4. Classify the checkbox tier and record it in its ledger entry. Default is LIGHT — a narrow change inside existing layers. Take HEAVY only on a fact you can point to: a new module / abstraction / domain model; auth, security, or session; an external integration; a DB schema or migration; concurrency or transaction boundaries; a cross-domain refactor; or the plan or user signals care. When unsure, take HEAVY; upgrade and redo skipped gates the moment a HEAVY fact surfaces; never downgrade.
|
|
120
121
|
5. Decompose that checkbox into atomic sub-tasks sized for ONE worker in ONE run — a sub-task that would need mid-flight steering is two sub-tasks. Collect every other unchecked checkbox in the same plan wave whose dependencies are met — their lanes execute concurrently. A wave that could split further but holds fewer than 3 independent sub-tasks is under-split.
|
|
121
|
-
6. **DELEGATE EVERYTHING. YOU NEVER IMPLEMENT.** Route every sub-task through the delegation router below, then dispatch ALL independent sub-tasks across those checkboxes in one parallel worker-spawn burst (a single batched spawn call where the harness supports it);
|
|
122
|
+
6. **DELEGATE EVERYTHING. YOU NEVER IMPLEMENT.** Route every sub-task through the delegation router below, then dispatch ALL independent sub-tasks across those checkboxes in one parallel worker-spawn burst (a single batched spawn call where the harness supports it); route named dependencies per the lane-topology decision above. Verification and checkbox marking stay per-checkbox.
|
|
122
123
|
7. Give every dispatched sub-task its completion condition and watch for it per the section below. A dispatch whose completion nobody watches is an unfinished dispatch.
|
|
123
124
|
|
|
124
125
|
### Monitor every dispatched subagent to its completion condition
|
|
@@ -86,6 +86,8 @@ Routing table, per-platform auth (set `TWITTER_*` env vars, `gh auth login`, a t
|
|
|
86
86
|
|
|
87
87
|
CloakBrowser is a stealth Chromium with source-level fingerprint patches that passes Cloudflare Turnstile, FingerprintJS, BrowserScan, and 30+ detectors; agent-browser is the CDP automation CLI that drives it. Both are runtime-installed tools (not vendored here). Full setup, version pins, launch flow, cookie login, and cross-platform notes are in [references/chrome-stealth.md](references/chrome-stealth.md).
|
|
88
88
|
|
|
89
|
+
NEVER clear cookies, cache, or site data (`Network.clearBrowserCookies`, `Storage.clearCookies`, `chrome.browsingData.remove`, "clear browsing data") on the user's real/main browser profile — it wipes their logged-in state everywhere. If the task needs that profile's login state, clone the profile directory first (`rsync -a <profile>/ <tmp-clone>/`) and launch CloakBrowser / agent-browser with the clone as the user-data-dir; run any clearing on the clone only.
|
|
90
|
+
|
|
89
91
|
```bash
|
|
90
92
|
# 1. Launch CloakBrowser with CDP on :9242 (see chrome-stealth.md for install + venv).
|
|
91
93
|
# 2. CloakBrowser launches tabless — open the first tab via CDP before any agent-browser command:
|
|
@@ -38,6 +38,8 @@ python -c "import cloakbrowser; print(cloakbrowser.__version__, cloakbrowser.CHR
|
|
|
38
38
|
|
|
39
39
|
## Launch + drive
|
|
40
40
|
|
|
41
|
+
NEVER clear cookies, cache, or site data (`Network.clearBrowserCookies`, `Storage.clearCookies`, `chrome.browsingData.remove`, "clear browsing data") on the user's real/main browser profile — it wipes their logged-in state everywhere. If you need that profile's login state, clone it first (`rsync -a <profile>/ <tmp-clone>/`) and launch with the clone as the user-data-dir; run any clearing on the clone only.
|
|
42
|
+
|
|
41
43
|
```bash
|
|
42
44
|
# 1. Launch CloakBrowser with CDP on :9242 (background). With the venv active:
|
|
43
45
|
python -c "import asyncio,cloakbrowser; asyncio.run(cloakbrowser.launch_async(headless=False, stealth_args=True, args=['--remote-debugging-port=9242']))" &
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# visual-qa — Bundled Visual-Evidence CLI
|
|
2
|
+
|
|
3
|
+
**Generated:** 2026-08-24 (f3642fcda)
|
|
4
|
+
|
|
5
|
+
## OVERVIEW
|
|
6
|
+
|
|
7
|
+
The visual-QA skill's executable core: a zero-dependency Node CLI that produces machine evidence (`image-diff`, `tui-check`) plus the TypeScript sources it is bundled from. Earned this file: the only shared skill shipping a built bundle whose runtime and development sources must be kept in lockstep.
|
|
8
|
+
|
|
9
|
+
## STRUCTURE
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
visual-qa/
|
|
13
|
+
├── SKILL.md # reviewer workflow (dual oracle, evidence gates) — the prose contract
|
|
14
|
+
├── references/agent-browser-setup.md
|
|
15
|
+
└── scripts/
|
|
16
|
+
├── visual-qa.mjs # SHIPPED RUNTIME: bun-build bundle of cli.ts (+ embedded modules)
|
|
17
|
+
├── cli.ts # development source; dispatches image-diff / tui-check
|
|
18
|
+
├── image-diff.ts # diffImages — 8x8 grid cells, hotspots, rounded metrics
|
|
19
|
+
├── tui-grid.ts # checkTui — column overflow + border alignment verdicts
|
|
20
|
+
├── east-asian-width.ts # charWidth / stringWidth — CJK-aware width math
|
|
21
|
+
├── ansi.ts # ANSI escape stripping (width must be escape-aware)
|
|
22
|
+
├── png-decode.ts / png-crc.ts / png-synth.ts # stdlib PNG codec (no deps)
|
|
23
|
+
├── types.ts
|
|
24
|
+
└── *.test.ts # co-located bun tests for every module above
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## BUNDLE/SOURCE DUALITY
|
|
28
|
+
|
|
29
|
+
`visual-qa.mjs` is the artifact the skill's commands invoke (`node "$SKILL_DIR/scripts/visual-qa.mjs" …`); the `.ts` files exist for development and tests only. A behavior fix lands in the TS source AND the bundle is regenerated from `cli.ts` — editing one without the other makes tests and runtime disagree. Never hand-edit the `.mjs`.
|
|
30
|
+
|
|
31
|
+
## SURFACE
|
|
32
|
+
|
|
33
|
+
- Commands: `image-diff <reference.png> <actual.png>` and `tui-check <capture.txt> --cols <N>`; JSON verdict output (hotspot cells, overflow lines, wide-char columns, border alignment).
|
|
34
|
+
- Module exports: `diffImages`, `checkTui`, `charWidth`/`stringWidth`, ANSI + PNG helpers. `cli.ts` owns `CliError`, `parseColumns`, `run`, `main`.
|
|
35
|
+
|
|
36
|
+
## CONVENTIONS
|
|
37
|
+
|
|
38
|
+
- Zero runtime dependencies — PNG decode/synthesis and ANSI handling are hand-rolled in `scripts/`; keep it that way (the bundle must stay require-free apart from `node:` builtins).
|
|
39
|
+
- Width is never `String.length`: CJK wide characters and ANSI escapes are accounted for before any column math.
|
|
40
|
+
- Tests are co-located `bun test scripts/*.test.ts`, given/when/then style per repo convention.
|
|
41
|
+
|
|
42
|
+
## ANTI-PATTERNS
|
|
43
|
+
|
|
44
|
+
- NEVER hand-edit `visual-qa.mjs`; regenerate from source.
|
|
45
|
+
- Don't add an npm dependency to make PNG/diff easier — the no-dep bundle is the point.
|
|
46
|
+
- Column math that ignores CJK width or ANSI escapes is wrong by construction; `tui-check` exists because text-diff tools get terminal grids wrong.
|
|
47
|
+
- Skill-level rule worth repeating for code changes: `tmux capture-pane` is forbidden as a capture mechanism.
|
|
48
|
+
|
|
49
|
+
## COMMANDS
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
# from packages/shared-skills/skills/visual-qa/
|
|
53
|
+
node scripts/visual-qa.mjs image-diff <reference.png> <actual.png>
|
|
54
|
+
node scripts/visual-qa.mjs tui-check <capture.txt> --cols 80
|
|
55
|
+
bun test scripts/*.test.ts
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
- Parent: [`packages/shared-skills/AGENTS.md`](../../AGENTS.md).
|
package/dist/tui.js
CHANGED
|
@@ -75871,10 +75871,10 @@ var init_tmux = __esm(() => {
|
|
|
75871
75871
|
init_runner2();
|
|
75872
75872
|
init_tmux_utils2();
|
|
75873
75873
|
});
|
|
75874
|
-
// node_modules/.bun/@opencode-ai+sdk@1.18.
|
|
75874
|
+
// node_modules/.bun/@opencode-ai+sdk@1.18.22/node_modules/@opencode-ai/sdk/dist/gen/types.gen.js
|
|
75875
75875
|
var init_types_gen = () => {};
|
|
75876
75876
|
|
|
75877
|
-
// node_modules/.bun/@opencode-ai+sdk@1.18.
|
|
75877
|
+
// node_modules/.bun/@opencode-ai+sdk@1.18.22/node_modules/@opencode-ai/sdk/dist/gen/core/serverSentEvents.gen.js
|
|
75878
75878
|
var createSseClient = ({ onSseError, onSseEvent, responseTransformer, responseValidator, sseDefaultRetryDelay, sseMaxRetryAttempts, sseMaxRetryDelay, sseSleepFn, url: url2, ...options }) => {
|
|
75879
75879
|
let lastEventId;
|
|
75880
75880
|
const sleep = sseSleepFn ?? ((ms) => new Promise((resolve3) => setTimeout(resolve3, ms)));
|
|
@@ -75983,7 +75983,7 @@ var createSseClient = ({ onSseError, onSseEvent, responseTransformer, responseVa
|
|
|
75983
75983
|
return { stream };
|
|
75984
75984
|
};
|
|
75985
75985
|
|
|
75986
|
-
// node_modules/.bun/@opencode-ai+sdk@1.18.
|
|
75986
|
+
// node_modules/.bun/@opencode-ai+sdk@1.18.22/node_modules/@opencode-ai/sdk/dist/gen/core/auth.gen.js
|
|
75987
75987
|
var getAuthToken = async (auth, callback) => {
|
|
75988
75988
|
const token = typeof callback === "function" ? await callback(auth) : callback;
|
|
75989
75989
|
if (!token) {
|
|
@@ -75998,7 +75998,7 @@ var getAuthToken = async (auth, callback) => {
|
|
|
75998
75998
|
return token;
|
|
75999
75999
|
};
|
|
76000
76000
|
|
|
76001
|
-
// node_modules/.bun/@opencode-ai+sdk@1.18.
|
|
76001
|
+
// node_modules/.bun/@opencode-ai+sdk@1.18.22/node_modules/@opencode-ai/sdk/dist/gen/core/bodySerializer.gen.js
|
|
76002
76002
|
var jsonBodySerializer;
|
|
76003
76003
|
var init_bodySerializer_gen = __esm(() => {
|
|
76004
76004
|
jsonBodySerializer = {
|
|
@@ -76006,7 +76006,7 @@ var init_bodySerializer_gen = __esm(() => {
|
|
|
76006
76006
|
};
|
|
76007
76007
|
});
|
|
76008
76008
|
|
|
76009
|
-
// node_modules/.bun/@opencode-ai+sdk@1.18.
|
|
76009
|
+
// node_modules/.bun/@opencode-ai+sdk@1.18.22/node_modules/@opencode-ai/sdk/dist/gen/core/pathSerializer.gen.js
|
|
76010
76010
|
var separatorArrayExplode = (style) => {
|
|
76011
76011
|
switch (style) {
|
|
76012
76012
|
case "label":
|
|
@@ -76104,7 +76104,7 @@ var separatorArrayExplode = (style) => {
|
|
|
76104
76104
|
return style === "label" || style === "matrix" ? separator + joinedValues : joinedValues;
|
|
76105
76105
|
};
|
|
76106
76106
|
|
|
76107
|
-
// node_modules/.bun/@opencode-ai+sdk@1.18.
|
|
76107
|
+
// node_modules/.bun/@opencode-ai+sdk@1.18.22/node_modules/@opencode-ai/sdk/dist/gen/core/utils.gen.js
|
|
76108
76108
|
var PATH_PARAM_RE, defaultPathSerializer = ({ path: path4, url: _url2 }) => {
|
|
76109
76109
|
let url2 = _url2;
|
|
76110
76110
|
const matches = _url2.match(PATH_PARAM_RE);
|
|
@@ -76173,7 +76173,7 @@ var init_utils_gen = __esm(() => {
|
|
|
76173
76173
|
PATH_PARAM_RE = /\{[^{}]+\}/g;
|
|
76174
76174
|
});
|
|
76175
76175
|
|
|
76176
|
-
// node_modules/.bun/@opencode-ai+sdk@1.18.
|
|
76176
|
+
// node_modules/.bun/@opencode-ai+sdk@1.18.22/node_modules/@opencode-ai/sdk/dist/gen/client/utils.gen.js
|
|
76177
76177
|
class Interceptors {
|
|
76178
76178
|
_fns;
|
|
76179
76179
|
constructor() {
|
|
@@ -76376,7 +76376,7 @@ var init_utils_gen2 = __esm(() => {
|
|
|
76376
76376
|
};
|
|
76377
76377
|
});
|
|
76378
76378
|
|
|
76379
|
-
// node_modules/.bun/@opencode-ai+sdk@1.18.
|
|
76379
|
+
// node_modules/.bun/@opencode-ai+sdk@1.18.22/node_modules/@opencode-ai/sdk/dist/gen/client/client.gen.js
|
|
76380
76380
|
var createClient = (config3 = {}) => {
|
|
76381
76381
|
let _config = mergeConfigs(createConfig(), config3);
|
|
76382
76382
|
const getConfig = () => ({ ..._config });
|
|
@@ -76527,7 +76527,7 @@ var init_client_gen = __esm(() => {
|
|
|
76527
76527
|
init_utils_gen2();
|
|
76528
76528
|
});
|
|
76529
76529
|
|
|
76530
|
-
// node_modules/.bun/@opencode-ai+sdk@1.18.
|
|
76530
|
+
// node_modules/.bun/@opencode-ai+sdk@1.18.22/node_modules/@opencode-ai/sdk/dist/gen/core/params.gen.js
|
|
76531
76531
|
var extraPrefixesMap, extraPrefixes;
|
|
76532
76532
|
var init_params_gen = __esm(() => {
|
|
76533
76533
|
extraPrefixesMap = {
|
|
@@ -76539,7 +76539,7 @@ var init_params_gen = __esm(() => {
|
|
|
76539
76539
|
extraPrefixes = Object.entries(extraPrefixesMap);
|
|
76540
76540
|
});
|
|
76541
76541
|
|
|
76542
|
-
// node_modules/.bun/@opencode-ai+sdk@1.18.
|
|
76542
|
+
// node_modules/.bun/@opencode-ai+sdk@1.18.22/node_modules/@opencode-ai/sdk/dist/gen/client/index.js
|
|
76543
76543
|
var init_client = __esm(() => {
|
|
76544
76544
|
init_bodySerializer_gen();
|
|
76545
76545
|
init_params_gen();
|
|
@@ -76547,7 +76547,7 @@ var init_client = __esm(() => {
|
|
|
76547
76547
|
init_utils_gen2();
|
|
76548
76548
|
});
|
|
76549
76549
|
|
|
76550
|
-
// node_modules/.bun/@opencode-ai+sdk@1.18.
|
|
76550
|
+
// node_modules/.bun/@opencode-ai+sdk@1.18.22/node_modules/@opencode-ai/sdk/dist/gen/client.gen.js
|
|
76551
76551
|
var client;
|
|
76552
76552
|
var init_client_gen2 = __esm(() => {
|
|
76553
76553
|
init_client();
|
|
@@ -76556,7 +76556,7 @@ var init_client_gen2 = __esm(() => {
|
|
|
76556
76556
|
}));
|
|
76557
76557
|
});
|
|
76558
76558
|
|
|
76559
|
-
// node_modules/.bun/@opencode-ai+sdk@1.18.
|
|
76559
|
+
// node_modules/.bun/@opencode-ai+sdk@1.18.22/node_modules/@opencode-ai/sdk/dist/gen/sdk.gen.js
|
|
76560
76560
|
class _HeyApiClient {
|
|
76561
76561
|
_client = client;
|
|
76562
76562
|
constructor(args) {
|
|
@@ -77207,7 +77207,7 @@ var init_sdk_gen = __esm(() => {
|
|
|
77207
77207
|
};
|
|
77208
77208
|
});
|
|
77209
77209
|
|
|
77210
|
-
// node_modules/.bun/@opencode-ai+sdk@1.18.
|
|
77210
|
+
// node_modules/.bun/@opencode-ai+sdk@1.18.22/node_modules/@opencode-ai/sdk/dist/error-interceptor.js
|
|
77211
77211
|
function wrapClientError(error51, response, request, opts) {
|
|
77212
77212
|
if (!opts?.throwOnError)
|
|
77213
77213
|
return error51;
|
|
@@ -77234,7 +77234,7 @@ function describe3(request, response) {
|
|
|
77234
77234
|
return `${method} ${url2}${status ? " \u2192 " + status : ""}${statusText ? " " + statusText : ""}`;
|
|
77235
77235
|
}
|
|
77236
77236
|
|
|
77237
|
-
// node_modules/.bun/@opencode-ai+sdk@1.18.
|
|
77237
|
+
// node_modules/.bun/@opencode-ai+sdk@1.18.22/node_modules/@opencode-ai/sdk/dist/client.js
|
|
77238
77238
|
function pick2(value, fallback) {
|
|
77239
77239
|
if (!value)
|
|
77240
77240
|
return;
|
|
@@ -77744,17 +77744,17 @@ var require_cross_spawn = __commonJS(function(exports, module) {
|
|
|
77744
77744
|
module.exports._enoent = enoent;
|
|
77745
77745
|
});
|
|
77746
77746
|
|
|
77747
|
-
// node_modules/.bun/@opencode-ai+sdk@1.18.
|
|
77747
|
+
// node_modules/.bun/@opencode-ai+sdk@1.18.22/node_modules/@opencode-ai/sdk/dist/process.js
|
|
77748
77748
|
var init_process = () => {};
|
|
77749
77749
|
|
|
77750
|
-
// node_modules/.bun/@opencode-ai+sdk@1.18.
|
|
77750
|
+
// node_modules/.bun/@opencode-ai+sdk@1.18.22/node_modules/@opencode-ai/sdk/dist/server.js
|
|
77751
77751
|
var import_cross_spawn;
|
|
77752
77752
|
var init_server = __esm(() => {
|
|
77753
77753
|
init_process();
|
|
77754
77754
|
import_cross_spawn = __toESM(require_cross_spawn(), 1);
|
|
77755
77755
|
});
|
|
77756
77756
|
|
|
77757
|
-
// node_modules/.bun/@opencode-ai+sdk@1.18.
|
|
77757
|
+
// node_modules/.bun/@opencode-ai+sdk@1.18.22/node_modules/@opencode-ai/sdk/dist/index.js
|
|
77758
77758
|
var init_dist = __esm(() => {
|
|
77759
77759
|
init_client2();
|
|
77760
77760
|
init_server();
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "oh-my-opencode",
|
|
3
|
-
"version": "5.0.0-beta.
|
|
3
|
+
"version": "5.0.0-beta.19",
|
|
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",
|
|
@@ -165,23 +165,23 @@
|
|
|
165
165
|
"@clack/prompts": "^1.7.0",
|
|
166
166
|
"@code-yeongyu/comment-checker": "^0.8.0",
|
|
167
167
|
"@modelcontextprotocol/sdk": "^1.30.0",
|
|
168
|
-
"@opencode-ai/plugin": "1.18.
|
|
169
|
-
"@opencode-ai/sdk": "1.18.
|
|
170
|
-
"@opentui/core": "^0.5.
|
|
171
|
-
"@opentui/keymap": "^0.5.
|
|
172
|
-
"@opentui/solid": "^0.5.
|
|
168
|
+
"@opencode-ai/plugin": "1.18.22",
|
|
169
|
+
"@opencode-ai/sdk": "1.18.22",
|
|
170
|
+
"@opentui/core": "^0.5.8",
|
|
171
|
+
"@opentui/keymap": "^0.5.8",
|
|
172
|
+
"@opentui/solid": "^0.5.8",
|
|
173
173
|
"commander": "^15.0.0",
|
|
174
174
|
"detect-libc": "^2.1.2",
|
|
175
175
|
"diff": "^9.0.0",
|
|
176
176
|
"js-yaml": "^5.0.0",
|
|
177
177
|
"jsonc-parser": "^3.3.1",
|
|
178
178
|
"picocolors": "^1.1.1",
|
|
179
|
-
"picomatch": "^4.0.
|
|
180
|
-
"posthog-node": "^5.
|
|
179
|
+
"picomatch": "^4.0.7",
|
|
180
|
+
"posthog-node": "^5.51.1",
|
|
181
181
|
"zod": "^4.4.3"
|
|
182
182
|
},
|
|
183
183
|
"devDependencies": {
|
|
184
|
-
"@code-yeongyu/senpi": "2026.8.
|
|
184
|
+
"@code-yeongyu/senpi": "2026.8.24",
|
|
185
185
|
"@oh-my-opencode/agents-md-core": "workspace:*",
|
|
186
186
|
"@oh-my-opencode/ast-grep-mcp": "workspace:*",
|
|
187
187
|
"@oh-my-opencode/boulder-state": "workspace:*",
|
|
@@ -222,18 +222,18 @@
|
|
|
222
222
|
"typescript": "^7.0.2"
|
|
223
223
|
},
|
|
224
224
|
"optionalDependencies": {
|
|
225
|
-
"oh-my-opencode-darwin-arm64": "5.0.0-beta.
|
|
226
|
-
"oh-my-opencode-darwin-x64": "5.0.0-beta.
|
|
227
|
-
"oh-my-opencode-darwin-x64-baseline": "5.0.0-beta.
|
|
228
|
-
"oh-my-opencode-linux-arm64": "5.0.0-beta.
|
|
229
|
-
"oh-my-opencode-linux-arm64-musl": "5.0.0-beta.
|
|
230
|
-
"oh-my-opencode-linux-x64": "5.0.0-beta.
|
|
231
|
-
"oh-my-opencode-linux-x64-baseline": "5.0.0-beta.
|
|
232
|
-
"oh-my-opencode-linux-x64-musl": "5.0.0-beta.
|
|
233
|
-
"oh-my-opencode-linux-x64-musl-baseline": "5.0.0-beta.
|
|
234
|
-
"oh-my-opencode-windows-arm64": "5.0.0-beta.
|
|
235
|
-
"oh-my-opencode-windows-x64": "5.0.0-beta.
|
|
236
|
-
"oh-my-opencode-windows-x64-baseline": "5.0.0-beta.
|
|
225
|
+
"oh-my-opencode-darwin-arm64": "5.0.0-beta.19",
|
|
226
|
+
"oh-my-opencode-darwin-x64": "5.0.0-beta.19",
|
|
227
|
+
"oh-my-opencode-darwin-x64-baseline": "5.0.0-beta.19",
|
|
228
|
+
"oh-my-opencode-linux-arm64": "5.0.0-beta.19",
|
|
229
|
+
"oh-my-opencode-linux-arm64-musl": "5.0.0-beta.19",
|
|
230
|
+
"oh-my-opencode-linux-x64": "5.0.0-beta.19",
|
|
231
|
+
"oh-my-opencode-linux-x64-baseline": "5.0.0-beta.19",
|
|
232
|
+
"oh-my-opencode-linux-x64-musl": "5.0.0-beta.19",
|
|
233
|
+
"oh-my-opencode-linux-x64-musl-baseline": "5.0.0-beta.19",
|
|
234
|
+
"oh-my-opencode-windows-arm64": "5.0.0-beta.19",
|
|
235
|
+
"oh-my-opencode-windows-x64": "5.0.0-beta.19",
|
|
236
|
+
"oh-my-opencode-windows-x64-baseline": "5.0.0-beta.19"
|
|
237
237
|
},
|
|
238
238
|
"overrides": {
|
|
239
239
|
"@earendil-works/pi-agent-core": "0.84.2",
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# plugin — vendored Codex plugin bundle (`@sisyphuslabs/omo-codex-plugin`)
|
|
2
|
+
|
|
3
|
+
**Score 13** (608 files; distinct package boundary between the adapter and 15 component dirs, each with its own AGENTS.md).
|
|
4
|
+
|
|
5
|
+
## OVERVIEW
|
|
6
|
+
|
|
7
|
+
The shipped Codex plugin namespace `omo` (marketplace `sisyphuslabs`), v5.0.0-beta.18. npm workspaces root for the 11 component packages; owns aggregate hook wiring, MCP declarations, and the build/sync pipeline. Component roster, sync-skills pipeline, and install targets are owned by the package AGENTS.md — not repeated here.
|
|
8
|
+
|
|
9
|
+
## STRUCTURE
|
|
10
|
+
|
|
11
|
+
| Path | Role |
|
|
12
|
+
|------|------|
|
|
13
|
+
| `components/` | 11 workspace components + `bootstrap` (standalone, deliberately outside workspaces), `test-support`, `lcx`. Each owns its `AGENTS.md` |
|
|
14
|
+
| `hooks/` | 23 aggregate hook JSON files, assembled from each component's `hooks/hooks.json` by the build |
|
|
15
|
+
| `scripts/` | Build/sync/migration orchestration (own AGENTS.md) |
|
|
16
|
+
| `test/` | node:test black-box contract suite (own AGENTS.md) |
|
|
17
|
+
| `shared/` | `getCodexOmoConfig()` unified-config loader + startup config migration (`src/config-loader.ts`, `src/config-migration.ts`) |
|
|
18
|
+
| `skills/` | GENERATED by `sync-skills.mjs`; gitignored except the two tracked shared copies (`init-deep`, `ulw-plan`) |
|
|
19
|
+
| `.codex-plugin/plugin.json` | Aggregate manifest Codex consumes |
|
|
20
|
+
| `.mcp.json` | 5 servers: `codegraph`, `git_bash`, `lsp` (local stdio) + `grep_app`, `context7` (remote) |
|
|
21
|
+
|
|
22
|
+
## WHERE TO LOOK
|
|
23
|
+
|
|
24
|
+
| Task | Location |
|
|
25
|
+
|------|----------|
|
|
26
|
+
| Add/modify a component hook | Component's `hooks/hooks.json`; the build re-assembles `hooks/*.json` |
|
|
27
|
+
| Aggregate hook side | `hooks/<event>-checking-<component>.json`; only the aggregate copies carry `commandWindows` dispatch |
|
|
28
|
+
| MCP server enable/paths | `.mcp.json`; install-time rewriting in `../src/install/codex-cache-bundled-mcps.ts` |
|
|
29
|
+
| Unified `[codex]` config resolution | `shared/src/config-loader.ts` |
|
|
30
|
+
| Build pipeline internals | `scripts/AGENTS.md` |
|
|
31
|
+
|
|
32
|
+
## CONVENTIONS
|
|
33
|
+
|
|
34
|
+
- Build order is fixed: `sync-version` → `sync-hook-status-messages` → `build-bundled-mcp-runtimes` → `materialize-shared-upstreams` → `sync-skills` → `build-components` (all via `npm run build`).
|
|
35
|
+
- `(OmO <version>)` `statusMessage` stamps are generated by sync scripts; never hand-edit.
|
|
36
|
+
- `skills/` is build output: edit component skill sources, then rebuild. The two tracked shared copies are the exception — they are committed.
|
|
37
|
+
- Tests run with `node --test`, NOT bun/vitest: root `bunfig.toml` excludes `plugin/**` from the root bun suite.
|
|
38
|
+
|
|
39
|
+
## COMMANDS
|
|
40
|
+
|
|
41
|
+
From `packages/omo-codex/plugin/`:
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
npm run build # full sync + components pipeline
|
|
45
|
+
npm test # node --test test/*.test.mjs
|
|
46
|
+
npm run check # build && test
|
|
47
|
+
```
|
|
@@ -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 5.0.0-beta.
|
|
11
|
+
"statusMessage": "(OmO 5.0.0-beta.19) Checking Bootstrap Provisioning"
|
|
12
12
|
}
|
|
13
13
|
]
|
|
14
14
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sisyphuslabs/codex-bootstrap",
|
|
3
|
-
"version": "5.0.0-beta.
|
|
3
|
+
"version": "5.0.0-beta.19",
|
|
4
4
|
"description": "Codex SessionStart bootstrap component that provisions LazyCodex runtime dependencies from a detached worker.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"private": true,
|
|
@@ -10,6 +10,15 @@ Conventions for human contributors and AI agents working on this repository.
|
|
|
10
10
|
- Tabs for indentation. Double quotes for strings.
|
|
11
11
|
- Tests use vitest with `#given .. #when .. #then` descriptions or plain `// given / // when / // then` body comments.
|
|
12
12
|
|
|
13
|
+
## Layout
|
|
14
|
+
|
|
15
|
+
- `src/core.ts`: parse API — `parseApplyPatchRequests`, `extractCommentCheckRequests`, `toHookInput`, `isToolFailureOutput`, `isRecord`.
|
|
16
|
+
- `src/apply-patch.ts`: `apply_patch` extraction supporting Codex `tool_input.command`, raw patch text, and OMO-compatible metadata.
|
|
17
|
+
- `src/request-extractor.ts` / `src/hook-input.ts` / `src/core-values.ts`: request/input shaping and constants.
|
|
18
|
+
- `src/runner.ts`: spawns the checker binary — `runCommentChecker`, `resolveCommentCheckerBinary`, `spawnProcess`.
|
|
19
|
+
- `src/codex-hook.ts`: `PostToolUse` hook + CLI (`extractCodexCommentCheckRequests`, `runCommentCheckerPostToolUse`, `runCodexHookCli`).
|
|
20
|
+
- `hooks/hooks.json`: registration. Heaviest suite: `test/codex-hook.test.ts` (513 LOC).
|
|
21
|
+
|
|
13
22
|
## Commands
|
|
14
23
|
|
|
15
24
|
- `npm install` - install dependencies.
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
|
-
"$schema": "https://biomejs.dev/schemas/2.
|
|
2
|
+
"$schema": "https://biomejs.dev/schemas/2.5.9/schema.json",
|
|
3
3
|
"linter": {
|
|
4
4
|
"enabled": true,
|
|
5
5
|
"rules": {
|
|
6
|
-
"
|
|
6
|
+
"preset": "recommended",
|
|
7
7
|
"style": {
|
|
8
8
|
"noDefaultExport": "error",
|
|
9
9
|
"noEnum": "error",
|
|
@@ -1,8 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
extractApplyPatchEdits,
|
|
3
|
-
getApplyPatchMetadataFiles,
|
|
4
|
-
} from "@oh-my-opencode/comment-checker-core";
|
|
5
1
|
import type { CheckerEdit as CoreApplyPatchEdit } from "@oh-my-opencode/comment-checker-core";
|
|
2
|
+
import { extractApplyPatchEdits, getApplyPatchMetadataFiles } from "@oh-my-opencode/comment-checker-core";
|
|
6
3
|
import type { CommentCheckRequest } from "./types.js";
|
|
7
4
|
|
|
8
5
|
export function extractApplyPatchRequests(event: {
|
|
@@ -27,10 +24,7 @@ function extractApplyPatchMetadataRequests(details: unknown, sourceToolName: str
|
|
|
27
24
|
return toCommentCheckRequests(edits, sourceToolName);
|
|
28
25
|
}
|
|
29
26
|
|
|
30
|
-
function toCommentCheckRequests(
|
|
31
|
-
edits: readonly CoreApplyPatchEdit[],
|
|
32
|
-
sourceToolName: string,
|
|
33
|
-
): CommentCheckRequest[] {
|
|
27
|
+
function toCommentCheckRequests(edits: readonly CoreApplyPatchEdit[], sourceToolName: string): CommentCheckRequest[] {
|
|
34
28
|
const requests: CommentCheckRequest[] = [];
|
|
35
29
|
for (const edit of edits) {
|
|
36
30
|
if (edit.before.length === 0) {
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
export { parseApplyPatchRequests } from "@oh-my-opencode/comment-checker-core";
|
|
1
|
+
export { isRecord, parseApplyPatchRequests } from "@oh-my-opencode/comment-checker-core";
|
|
2
2
|
export { toHookInput } from "./hook-input.js";
|
|
3
|
-
export { isRecord } from "@oh-my-opencode/comment-checker-core";
|
|
4
3
|
export { extractCommentCheckRequests, isToolFailureOutput } from "./request-extractor.js";
|
|
5
4
|
export type {
|
|
6
5
|
CheckerEdit,
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { extractApplyPatchRequests } from "./apply-patch.js";
|
|
2
1
|
import { getString, isRecord } from "@oh-my-opencode/comment-checker-core";
|
|
2
|
+
import { extractApplyPatchRequests } from "./apply-patch.js";
|
|
3
3
|
import type { CheckerEdit, CommentCheckRequest, TextContent, ToolResultContent, ToolResultLike } from "./types.js";
|
|
4
4
|
|
|
5
5
|
export function extractCommentCheckRequests(event: ToolResultLike): CommentCheckRequest[] {
|
|
@@ -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 5.0.0-beta.
|
|
11
|
+
"statusMessage": "(OmO 5.0.0-beta.19) 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 5.0.0-beta.
|
|
23
|
+
"statusMessage": "(OmO 5.0.0-beta.19) Resetting Git Bash MCP Reminder"
|
|
24
24
|
}
|
|
25
25
|
]
|
|
26
26
|
}
|