Commit Graph

6673 Commits

Author SHA1 Message Date
YeonGyu-Kim e4a60b8cd2 Merge pull request #4048 from PeterPonyu/feat/doctor-check-tui-plugin
feat(doctor): warn when oh-my-openagent/tui is missing from tui.json
2026-05-21 12:58:39 +09:00
YeonGyu-Kim 735b4d2997 Merge pull request #4070 from PeterPonyu/fix/4036-prompt-shield-system-directive-marker
fix(prometheus-md-only): replace SYSTEM DIRECTIVE marker with XML tag in external prompts (#4036)
2026-05-21 12:58:36 +09:00
YeonGyu-Kim 45e5d5ddfc Merge pull request #4071 from PeterPonyu/fix/4027-role-coordinator-subagent-selection
fix(team-mode): reject coordinator agents as subagent targets (#4027)
2026-05-21 12:58:33 +09:00
YeonGyu-Kim d7d023bf27 Merge pull request #4072 from PeterPonyu/fix/3645-runtime-fallback-git-silent-fail
fix(runtime-fallback): fall back to synthetic continuation when session messages are empty (#3645)
2026-05-21 12:58:30 +09:00
YeonGyu-Kim 689ad9970b Merge pull request #4079 from PeterPonyu/refactor/3694-extract-analyze-constants
refactor(keyword-detector): consolidate analyze pattern/message into analyze/default and document delegate_task params (#3694)
2026-05-21 12:58:27 +09:00
YeonGyu-Kim c5b1bff33f Merge pull request #4080 from PeterPonyu/docs/3469-mcp-list-plugin-vs-native
docs(mcp): clarify plugin-injected MCPs do not appear in opencode mcp list (#3469)
2026-05-21 12:58:24 +09:00
YeonGyu-Kim 9cca6848c9 Merge pull request #4081 from PeterPonyu/feat/4004-agent-display-name-i18n
feat(agents): support per-agent displayName for i18n (#4004)
2026-05-21 12:58:21 +09:00
YeonGyu-Kim acedacc5e7 Merge pull request #4084 from pizzav-xyz/feature/keyword-detector-enabled-expansions
feat(keyword-detector): add enabled_expansions config for allowlist control
2026-05-21 12:58:18 +09:00
YeonGyu-Kim ba5bc0ef4f Merge pull request #4092 from code-yeongyu/fix/status-timeout-hang
fix(shared): add timeout to isSessionActive to prevent infinite hang
2026-05-21 12:58:14 +09:00
YeonGyu-Kim a7401a34ac Merge pull request #4157 from ririnto/docs/config-reference-alignment
docs: align config reference with implementation
2026-05-21 12:58:11 +09:00
YeonGyu-Kim 323e53f3a5 Merge pull request #4181 from devswha/docs/add-vibetip-docs-link
docs(readme): add docs site badge linking to omo.vibetip.help/docs
2026-05-21 12:58:07 +09:00
YeonGyu-Kim b40426ca1b Merge pull request #4190 from herjarsa/feat/default-mode
feat(default-mode): auto-activate ultrawork and ralph loop without commands
2026-05-21 12:58:04 +09:00
YeonGyu-Kim d502900201 Merge pull request #4221 from heunghingwan/feat/plan-format-validator
Add plan format validator hook to detect malformed task labels
2026-05-21 12:58:01 +09:00
YeonGyu-Kim e4049b7ab3 Merge pull request #4222 from andomeder/wip/pr1-skip-disconnected-explicit-provider-fallbacks
fix(background-agent): skip disconnected explicit-provider fallbacks
2026-05-21 12:57:58 +09:00
YeonGyu-Kim bd61479315 Merge pull request #4227 from code-yeongyu/fix/post-4106-cleanup-20260521
fix: clean up post-4106 prompt gate artifacts
2026-05-21 12:53:17 +09:00
YeonGyu-Kim 95291fa4ed chore(evidence): refresh package layering refactor notes 2026-05-21 12:50:10 +09:00
YeonGyu-Kim fc0f4cc9ee chore(model-core): remove unused generated snapshot (DI strategy makes it dead) 2026-05-21 12:50:10 +09:00
YeonGyu-Kim f6a2ff3541 test(coupling-audit): allowlist dual-runtime spawn shims 2026-05-21 12:50:10 +09:00
YeonGyu-Kim 2f26f78f0d chore(evidence): backfill PASS sentinels in empty evidence files
Backfilled explicit PASS sentinel content in 14 evidence files:
- .omo/evidence/task-1-baseline.txt
- .omo/evidence/task-2-package-exists.txt
- .omo/evidence/task-2-no-coupling.txt
- .omo/evidence/task-2-reexports.txt
- .omo/evidence/task-2-tests.txt
- .omo/evidence/task-3-no-coupling.txt
- .omo/evidence/task-3-di-interface.txt
- .omo/evidence/task-3-tests.txt
- .omo/evidence/task-5-tests.txt
- .omo/evidence/task-5-no-coupling.txt
- .omo/evidence/task-9-loc-check.txt
- .omo/evidence/task-9-tests.txt
- .omo/evidence/task-9-no-coupling.txt
- .omo/evidence/w2-qa-coupling-sweep.txt
2026-05-21 12:50:10 +09:00
YeonGyu-Kim 017f05dddb refactor(packages/model-core): eliminate src/ back-imports via dependency injection 2026-05-21 12:50:10 +09:00
YeonGyu-Kim e15461febc refactor(model-core): inject bundled capabilities snapshot from harness
- remove bundled snapshot dependency on src/generated in model-core

- make shared harness provide runtime bundled snapshot

- update guardrail and capability tests to pass explicit snapshot

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-05-21 12:50:10 +09:00
YeonGyu-Kim 2462d7af29 refactor(model-core): remove src back-imports via core utilities and adapter
- move fuzzyMatchModel and transformModelForProvider into model-core

- replace connected-providers re-export with adapter contract

- route shared wrappers through model-core exports

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-05-21 12:50:10 +09:00
YeonGyu-Kim 819bf0d11f chore: update meta-audits + add opencode coupling grep gate 2026-05-21 12:50:10 +09:00
YeonGyu-Kim a089d4a584 docs: update AGENTS.md + ROADMAP.md for package layering refactor 2026-05-21 12:50:10 +09:00
YeonGyu-Kim faf4a2d349 chore: post-W2 cleanup (remove orphan rules-core dir + W2-QA evidence) 2026-05-21 12:50:10 +09:00
YeonGyu-Kim 27e434578a docs: update rules-core → rules-engine references
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-05-21 12:50:10 +09:00
YeonGyu-Kim 4bbf1d9388 refactor(packages): rename rules-core to rules-engine
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-05-21 12:50:10 +09:00
YeonGyu-Kim 7c7aa28160 refactor(packages): extract agents-md-core package 2026-05-21 12:50:10 +09:00
YeonGyu-Kim 2748009ff2 refactor(packages): extract model-core package 2026-05-21 12:49:50 +09:00
YeonGyu-Kim f7ceb03efe refactor(packages): extract boulder-state package 2026-05-21 12:49:33 +09:00
YeonGyu-Kim 7028c1f40a refactor(packages): extract comment-checker-core package 2026-05-21 12:49:10 +09:00
YeonGyu-Kim 3b303e79f4 refactor(packages): extract ast-grep-core from ast-grep-mcp 2026-05-21 12:48:43 +09:00
YeonGyu-Kim a5c1d71001 refactor(packages): extract utils package 2026-05-21 12:48:43 +09:00
YeonGyu-Kim c4fe747e15 chore: baseline measurements for package layering refactor 2026-05-21 12:45:21 +09:00
YeonGyu-Kim 8979e198ca Merge pull request #4226 from code-yeongyu/fix/background-notification-active-turn-queue
fix(background-agent): defer parent wakes during active turns
2026-05-21 12:17:33 +09:00
YeonGyu-Kim 0ad4d974f1 fix(background-agent): preserve parent activity across idle events
Cubic caught that clearing recent parent activity on session.idle could reopen the stale-idle race. Keep the fresh activity marker until its normal expiry so background completions still defer while the parent turn is actively reasoning.

Red: parent idle after fresh reasoning delta dispatched an unexpected parent wake. Green: focused parent-wake regression suite passes.
2026-05-21 12:07:40 +09:00
YeonGyu-Kim ced36bffc1 refactor: split prompt async gate modules
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-05-21 12:00:01 +09:00
YeonGyu-Kim 3717b33247 chore: remove leaked debugging artifact
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-05-21 11:59:44 +09:00
YeonGyu-Kim a8201726ef fix(background-agent): defer parent wakes during active turns
Record fresh parent session message activity before parent-wake flushing so stale idle status cannot dispatch a background completion into a live reasoning turn.

Add regression coverage for the Discord 4.2.3/OpenCode 1.15.5 duplicate-branch repro shape where a parent reasoning delta arrives before the background all-complete wake.

Refs #4212

Refs #4019

Refs #3774

Plan: plans/background-notification-active-turn-queue.md
2026-05-21 11:50:30 +09:00
YeonGyu-Kim 8b52612449 Merge pull request #4194 from MoerAI/fix/lsp-windows-cli-path-separator
fix(mcp): normalize path separators in LSP/ast-grep cli candidate detection (fixes #4151)
2026-05-21 11:44:28 +09:00
ZeyuFu 9bd2a9d7a9 fix(runtime-fallback): fall back to synthetic continuation when session messages are empty (#3645)
When the working directory contains a .git folder the OpenCode server
normalises the project root to the git root before persisting messages.
This creates a race: the 429/503/529 error event can fire before the
user's message is committed to storage, so session.messages returns []
and getLastUserRetryParts returns an empty array.  The previous code
treated that as a silent no-op (cleared all retry state, Sisyphus stalled).

Fix: when fetchedParts is empty, emit a structured log explaining the
.git-directory race and fall back to a synthetic { type:"text", text:"continue" }
part — matching the pattern already used by autoContinueAfterFallback in
event.ts.  The fallback dispatch always proceeds regardless of whether
the messages API can return user parts.

Update four tests that fired two consecutive session.error events relying
on the old silent-stop behaviour: add top-level model fields to the second
error so the awaiting-fallback gate recognises it as coming from the
dispatched fallback model and lets it through normally.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-20 22:29:59 -04:00
YeonGyu-Kim 20ba83e19e test(mcp): remove stale lsp exists import 2026-05-21 11:24:18 +09:00
MoerAI ed6e9955da fix(mcp): normalize path separators in LSP/ast-grep cli candidate detection (fixes #4151)
On Windows, path.resolve() returns paths with backslash separators. The previous endsWith("dist/cli.js") check uses forward slashes and always returned false on Windows, causing both LSP and ast-grep MCPs to fall through to the bootstrap path even when the dist cli exists. Result: LSP MCP completely unusable on Windows with MODULE_NOT_FOUND for dist/packages/lsp-tools-mcp/dist/cli.js.

Fix: derive a platform-aware suffix at module load time by replacing forward slashes in DIST_CLI_REL / SOURCE_CLI_REL with path.sep, then use that suffix in the endsWith check.

Verification: all 4 src/mcp/lsp.test.ts cases pass on Windows (previously 2 failed); all 13 src/mcp/ast-grep.test.ts cases pass (previously 2 failed). Total: 17/17 src/mcp tests green. bun run typecheck clean.
2026-05-21 11:20:25 +09:00
ZeyuFu 860c663c80 fix-up(#4027): narrow coordinator guard to registry hard-reject set
Maintainer feedback (#4071 review): the original guard rejected
sisyphus and atlas as subagent targets even from team-mode where
resolveMember() intentionally calls resolveSubagentExecution with
allowPrimaryAgentDelegation: true. Per AGENT_ELIGIBILITY_REGISTRY
(src/features/team-mode/types.ts), only prometheus is hard-reject;
sisyphus and atlas are explicitly verdict: 'eligible' for team
membership.

Shrink COORDINATOR_AGENT_NAMES to ['prometheus'] so the guard
aligns with the registry's authoritative classification, document
the scoping rule in a comment, and add regression tests covering:

- sisyphus is NOT blocked by the coordinator guard (registry eligible)
- atlas is NOT blocked by the coordinator guard (registry eligible)
- prometheus IS blocked even when allowPrimaryAgentDelegation: true
  (registry hard-reject is authoritative)

Fixes the 5 zauc-mocks resolver tests that were locking in the
wrong rejection set (including 'allows delegating to a primary
agent when allowPrimaryAgentDelegation is enabled'). The one test
asserting the literal primary-agent error string for Prometheus
display-name was loosened to a regex that accepts either guard's
message, since prometheus is now caught by the coordinator path
which fires before the primary-agent lookup.
2026-05-20 22:05:47 -04:00
ZeyuFu 7af3007e67 fix(team-mode): reject coordinator agents as subagent targets (#4027)
Agents could select coordinator/meta agents (Prometheus, Atlas,
Sisyphus/Ultraworker) as subagent targets via task() / delegation,
producing duplicate orchestration loops and conflicting team state.
This is the inverse of #3987 / #4065 — symmetric guard on the
delegation TARGET side, using the same AGENT_ELIGIBILITY_REGISTRY
classification.

Add a runtime guard at the delegation entry point that rejects
task() calls whose subagent_type resolves to an agent marked as
hard-reject / coordinator-only in the eligibility registry, with
an actionable error naming the agent. Regression test asserts a
prometheus-targeted delegation is rejected before any subagent
session spawns.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-20 22:05:47 -04:00
ZeyuFu 9791019366 fix(prometheus-md-only): replace SYSTEM DIRECTIVE marker with XML tag in external prompts (#4036)
PLANNING_CONSULT_WARNING was prepended to the prompt forwarded to
subagent LLMs via task(). Its leading bracket-enclosed marker
`[SYSTEM DIRECTIVE: OH-MY-OPENCODE - PROMETHEUS READ-ONLY]` is
exactly the indirect-prompt-injection signature that Azure OpenAI
Prompt Shield flags in user-role content; on GPT-5.4 through
Azure, the model returns "I'm sorry, but I cannot assist with
that request." before any planning work runs, making Prometheus
non-functional on Azure.

The bracket marker was designed for internal hook-to-hook
filtering, but PLANNING_CONSULT_WARNING leaks it to external LLM
payloads. Replace the header with a neutral XML-tag wrapper
(`<planning-context source="prometheus-read-only">`) that Azure's
filter does not match while preserving the human-readable warning
body. Internal isSystemDirective() consumers are unaffected.

Regression test asserts the post-hook task() prompt does not
begin with the flagged bracket sequence.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-20 22:04:10 -04:00
William Obino 5a965fb44f fix(background-agent): skip disconnected explicit-provider fallbacks 2026-05-21 02:55:18 +03:00
heunghingwan cfe29168aa Fix ambiguous FN. notation in Final Wave label instructions
Replace 'FN.' shorthand with explicit examples 'F1.', 'F2.' to prevent
LLMs from generating literal 'FN.' labels that the parser rejects.

Identified by cubic.
2026-05-21 05:26:32 +08:00
github-actions[bot] fcb96841f8 @heunghingwan has signed the CLA in code-yeongyu/oh-my-openagent#4221 2026-05-20 21:22:11 +00:00
heunghingwan 73b5a7eb0e Add plan format validator hook to detect malformed task labels
- Strengthen Prometheus plan template with FORMAT constraint
- Add task label format check to Oracle phase-2 (N/6 → N/7)
- Add format checks to self-review checklist
- New plan-format-validator hook: compares raw checkbox count
  against getPlanProgress() after plan writes, warns agent when
  labels are malformed (0/0 or partial skip scenarios)
2026-05-21 05:17:54 +08:00