Commit Graph
214 Commits
Author SHA1 Message Date
can1357 12cfaceef1 Merge PR #8903: fix(discovery): expand extension-package MCP env placeholders (@drycode) 2026-08-19 01:38:34 +02:00
can1357 e972bdb4d1 Merge PR #8857: fix(discovery): honor Claude Code enabledPlugins for marketplace plugins (@drycode) 2026-08-19 01:37:00 +02:00
Daniel Young fb7c2e1a52 [mcp] Expand extension package environment
Apply the same recursive placeholder expansion used by native MCP configs before extension-package servers are validated and surfaced. This prevents stdio credentials and remote headers from reaching servers as literal placeholders.\n\nSolves: Extension-package MCP environment expansion\nTests: bun test packages/coding-agent/test/discovery/omp-plugins.test.ts
2026-08-18 12:14:25 -04:00
Daniel Young 1496a139ce [mcp] Revert plugin env expansion
Keep host-specific secret injection in the maintained plugin layer instead
of carrying a behavioral divergence in the OMP fork.

Solves: Unwanted fork maintenance for MCP injection
Tests: Reverts only drycode/oh-my-pi PR #1
2026-08-18 08:50:06 -04:00
Daniel YoungandGitHub a52c2fc2fb [mcp] Expand Claude plugin stdio env (#1)
Claude marketplace plugins may reference runtime secrets in stdio
server environment values. Resolve those placeholders after plugin-root
substitution so child processes receive credentials instead of literal
template strings.

Solves: Stdio MCP credentials remain unexpanded
Tests: Claude plugin discovery tests; coding-agent check; live CH auth
2026-08-18 08:49:10 -04:00
Daniel Young 4dbb11b190 fix(discovery): honor Claude Code enabledPlugins for marketplace plugins
The claude-plugins provider read installed_plugins.json but never the
`enabledPlugins` map Claude Code keeps in ~/.claude/settings.json and
<project>/.claude/settings(.local).json. Two consequences: a plugin the
user switched off for a project still loaded there, and a local-scope
install enabled for a project never loaded unless the project directory
matched the install's recorded projectPath exactly.

Merge enabledPlugins across the same layers Claude Code consults (user
settings, then the active project root's and cwd's .claude/settings.json
and settings.local.json; later wins) and apply it in
listClaudePluginRoots: `false` hides the plugin, `true` opts a
local-scope install in regardless of projectPath. Untouched ids keep the
existing behavior. Contributing settings files join the cache key.

Solves: Claude marketplace plugins loading in the wrong projects
Tests: claude-plugins.test.ts — per-project off switch (local wins over
settings.json, other projects unaffected) and enabledPlugins:true
opt-in for a local install recorded under a parent directory
2026-08-17 17:50:10 -04:00
roboomp 1441fdb28b fix(discovery): expanded OpenCode {env:} and {file:} config tokens
OpenCode substitutes {env:VAR} and {file:path} in config text at load
time, but OMP's OpenCode discovery ran the generic ${VAR}-only
expandEnvVarsDeep, leaving those tokens literal. An MCP header like
`Bearer {env:MCP_KEY}` reached the server verbatim and returned 401.

The OpenCode loader now applies OpenCode's own substitution to raw
config text before parsing: {env:VAR} -> env value or empty string,
{file:path} -> trimmed, JSON-escaped file contents resolved relative to
the config dir / ~ / absolute, skipping tokens on // comment lines.

Fixes #8778
2026-08-17 01:31:00 +00:00
can1357 e224493fe2 Merge PR #8553: fix(discovery): honor non-recursive glob in loadFilesFromDir (@roboomp) 2026-08-16 02:43:33 +02:00
can1357 16c1187698 fix(coding-agent): filtered Claude plugin tool modules 2026-08-16 02:13:40 +02:00
roboomp 3775cd099c fix(discovery): honored non-recursive glob in loadFilesFromDir
loadFilesFromDir built a top-level-only pattern (`*.{ts,js}`) for its
documented `recursive: false` default but never forwarded the flag to the
native glob, which defaults recursive=true and rewrites the pattern to
`**/*.{ts,js}`. Every non-recursive discovery scan therefore walked the whole
subtree: `~/.codex/tools` descended into a Python venv's `site-packages` and
imported browser-only frontend assets as custom tools, crashing OMP startup on
an unhandled `window` rejection.

Thread the caller's `recursive` flag through to the native glob call so the
non-recursive default is honored. Providers that need recursion already pass
`recursive: true` explicitly and are unaffected.

Fixes #8552
2026-08-14 12:50:07 +00:00
Kigbnajd 357317595c fix(coding-agent): filter Claude custom tool modules 2026-08-13 21:54:02 +02:00
can1357 b279db1790 test: refactored test suites to eliminate time-based sleeps and polling loops
- Replaced time-based sleeps and polling loops with event-driven promise resolvers and fake timers across agent and tool tests.
- Migrated test suites to share in-memory auth storage and fixtures using lifecycle hooks.
- Updated catalog model definitions, metadata, and configurations.
2026-08-13 19:32:22 +02:00
roboomp 406306f972 fix(discovery): isolated plugin root caches by home
Included the resolved OMP plugin registry path in cache identity and covered shared Claude config directories across isolated SDK homes.
2026-08-13 15:44:02 +00:00
roboomp 3629464cf9 fix(discovery): honored claude config directory
Resolved Claude user configuration, plugin, MCP, and session paths through CLAUDE_CONFIG_DIR while retaining the legacy defaults.

Fixes #8436
2026-08-13 15:33:27 +00:00
can1357 a69d166e00 perf(discovery): memoized WSL host-home probe per environment
- Deduplicated the re-imported changelog bullets from the PR #8403 merge,
  keeping the condensed register with only the new #8402 entry.
- getUserHomeCandidates memoizes the WSL home candidate keyed by
  platform + WSL markers + USERPROFILE, so a wedged interop pipe costs
  one bounded probe per process instead of one 500ms stall per
  discovery loader, while env changes (tests, SDK embeddings) still
  recompute.
2026-08-13 06:51:35 +02:00
roboomp 4561bdc39a fix(discovery): bound WSL host-home probe with a hard timeout
resolveWindowsUserProfile() ran Bun.spawnSync(cmd.exe echo %USERPROFILE%)
with no timeout during startup discovery. When the WSL->Windows interop
pipe is wedged, cmd.exe never returns and the synchronous spawn blocks
the JS thread forever, so the TUI never paints and no log is written.

Route both best-effort probes (cmd.exe and wslpath) through a shared
runHostProbe() helper that spawns under a 500ms hard timeout with SIGKILL
and reports a killed/non-zero exit as "host home unavailable", so
discovery falls back to the Linux $HOME/~/.omp candidates instead of
hanging.

Fixes #8402
2026-08-13 03:52:31 +00:00
can1357 e8eed95130 feat(coding-agent): introduced fine grained per agent advisor configuration
- Replaced blanket subagent advisor global settings with fine-grained per-agent configuration and frontmatter support.
- Added dashboard keybindings and inline override editors for managing agent advisor patterns.
- Implemented settings migration logic to convert legacy global options into per-agent settings.
- Updated session persistence and execution layers to restore and enforce per-agent advisor behaviors.
2026-08-13 04:59:50 +02:00
can1357 bfd9b6efec fix(discovery): load project .opencode config files 2026-08-13 01:14:48 +02:00
can1357 5ef7a2b0ac Merge PR #8106: fix(discovery): support OpenCode JSONC configs (@roboomp) 2026-08-13 01:14:47 +02:00
can1357 c101452bb5 refactor: restructured and condensed agent prompts and system instructions
- Refactored and condensed numerous system prompts, agent instructions, and tool documentation files across packages.
- Streamlined workflow rules, formatting constraints, and execution guidelines for improved clarity and brevity.
- Updated discovery rules, recommendation criteria, and syntax standards in prompt templates.
2026-08-12 01:48:14 +02:00
can1357 f460e6dd71 Merge PR #7703: fix: discover workspace AGENTS files (@listellm) 2026-08-11 15:07:43 +02:00
roboomp c77dcb1dd7 fix(discovery): merged OpenCode MCP layers before extraction
Deep-merged each MCP server across config layers in ascending precedence, matching OpenCode config merge, so a partial higher-precedence override inherits command/url and env from lower layers instead of shadowing and invalidating the complete definition.

Added a regression test asserting a project override of a single field keeps the user command, transport, and merged env.
2026-08-09 20:25:51 +00:00
roboomp 2a65316c5e fix(discovery): ordered OpenCode MCP sources by precedence
Emitted OpenCode MCP servers highest precedence first so the name-keyed first-wins dedupe keeps the project/opencode.jsonc entry OpenCode would use instead of a shadowing user or opencode.json definition.

Added a regression test asserting same-named servers resolve to the highest-precedence source, including a project enabled:false override.
2026-08-09 20:16:33 +00:00
roboomp 73eec8a1e2 fix(discovery): supported OpenCode JSONC configs
Discovered opencode.jsonc at user and project scopes and parsed both supported extensions with Bun JSONC semantics.

Added coverage for JSONC settings, MCP servers, and comments in opencode.json.

Fixes #8104
2026-08-09 20:05:17 +00:00
can1357 7cebe901b7 refactor(coding-agent): narrowed over-exported internal symbols
- 28 symbols across discovery, mcp header policy, agent-hub projection and
  rendering, the agent registry, shell tokenizing and changelog comparison
  were exported but referenced only inside their own module; they are now
  module-private, shrinking the deep-import surface.
- Kept AGENT_PLUGIN_MANIFEST_SCHEMA, AGENT_PLUGIN_MCP_SCHEMA,
  parseAgentPluginManifest, clearAgentPluginRootCache and mergeMCPHeaders
  exported: each is a seam for tests that defend real parsing or header
  precedence behavior.
- Nothing reachable from an explicit exports entry or public barrel changed.
2026-08-08 06:32:01 +02:00
can1357 2ad61c7b92 feat(discovery): added Agent Plugins 1.0.0 standard support
- New agent-plugins provider discovers packages with a root plugin.json
  targeting the canonical schema (agent-plugins.org) from marketplace
  installs, --plugin-dir, and configured extension roots; skills/ and
  mcp.json load per spec with closed-schema validation,
  ${PLUGIN_ROOT}/${PLUGIN_DATA} expansion, reserved subprocess
  environment, instance-keyed data dirs, and per-component isolation.
- Package-boundary containment (spec §4.1) is enforced before every
  read via the new contained-path helpers, including skill:// resource
  access from the read tool and bash; plugin skill files must
  realpath-resolve inside the plugin root (skills carry containRoot).
- Legacy claude-plugins/omp-plugins providers yield skills and MCP
  surfaces of standard-targeting roots to the new provider and skip
  fatally invalid packages.
2026-08-07 05:59:52 +02:00
can1357 8b8452d62a Merge PR #7698: fix(coding-agent): build WSL mount fallback paths with POSIX semantics (@metaphorics) 2026-08-05 21:50:24 +02:00
can1357 b42de04b2a Merge PR #7752: fix(coding-agent): enabled multiline matching in ts-no-tiny-functions condition (@zhang17-24) 2026-08-05 21:50:22 +02:00
zhang17-24 9e62597387 fix(coding-agent): enabled multiline matching in ts-no-tiny-functions condition 2026-08-06 01:59:47 +08:00
metaphorics 7c8f6249ed fix(coding-agent): build WSL mount fallback paths with POSIX semantics 2026-08-05 11:43:02 +00:00
can1357 e9888367d1 refactor: migrated packages to internal utility modules and removed external dependencies
- Implemented in-house, zero-dependency utility modules in `pi-utils` covering DOM manipulation, markdown parsing, templating, browser automation helpers, and terminal buffers.
- Migrated packages across the repository to consume the new internal utilities and `omptype` schema validators instead of external dependencies.
- Removed multiple external runtime and development dependencies including Zod, Marked, LRU cache, Turndown, and Puppeteer browser packages.
2026-08-05 13:39:09 +02:00
Listell McLean be3d3b8e65 fix: retain home AGENTS boundary
- 🛠️ Keep home context when the repository root is above home.\n- 🧪 Assert the preserved boundary behavior.
2026-08-05 11:52:41 +01:00
Listell McLean 3d153ba419 fix: preserve AGENTS boundary behavior
- 🛠️ Keep home-level context when no repository root exists.\n- ✅ Exclude home context only for nested repositories.\n- 🧪 Cover repositories whose root is above home.
2026-08-05 11:51:30 +01:00
Listell McLean 37825fbd6c fix: discover parent AGENTS files
- 🛠️ Continue through workspace parents under home.\n- ✅ Preserve repository boundaries outside home.\n- 🧪 Cover nested, boundary, and hidden paths.
2026-08-05 11:30:03 +01:00
can1357 5ed9ffadce fix(agent): resolve WSL host profile through interop
(cherry picked from commit bd06a333e30510c71ca1bd2a55f79e87227a829b)
2026-08-05 02:32:36 +02:00
roboompandcan1357 fe9bd27fc9 fix(agent): loaded WSL host agents skills
Scanned the Windows host USERPROFILE .agents directory when running under WSL so globally installed Agent Skills are available alongside Linux-home skills.

Fixes #3779

(cherry picked from commit c3468dae4f9b91646bf50f2cf4ded9075572290e)
2026-08-05 02:32:36 +02:00
roboomp 9f92d36425 fix(mcp): ordered project entries before user in translated importers
The Claude/Cursor/Gemini/Windsurf importers appended user entries before
project entries, so a project `enabled: false` could not claim its dedupe key
ahead of a same-named user server and the disable was silently ignored. Load
project entries first, matching the native/Codex loaders, so a project disable
suppresses a same-named user server.

Updated docs/mcp-config.md to reflect the project-first precedence and added
compound regression coverage.

Fixes #7652
2026-08-04 21:14:11 +00:00
roboomp b872e51e6f fix(mcp): propagate enabled flag from translated tool configs
The Claude Code, Cursor, Gemini CLI, Windsurf, and VS Code importers built
their canonical MCPServer object without mapping serverConfig.enabled, so a
server declared with "enabled": false stayed undefined and the central
suppressServer filter never fired. Only disabledServers masked the gap.

Map the field in each importer, mirroring opencode.ts and codex.ts, and add
a table-driven regression test across all five importers.

Fixes #7652
2026-08-04 20:57:47 +00:00
roboomp 6f7600cd89 fix(discovery): prioritized project codex mcp entries
Load project Codex MCP entries before user entries so a disabled project server claims its dedupe key before a same-named user server can survive.

Added regression coverage for project-over-user disable precedence.

Fixes #7538
2026-08-03 16:52:54 +00:00
roboomp 012836d99e fix(discovery): tag disabled codex mcp servers instead of dropping
Carry enabled = false through discovery so loadAllMCPConfigs' suppress
path can claim the dedupe key (keeping a same-named lower-priority
source disabled) and honor the user force-enable allowlist. Dropping the
entry outright defeated both.

Fixes #7538
2026-08-03 16:45:31 +00:00
roboomp 8b854598f1 fix(discovery): honored disabled codex mcp servers
- Skipped Codex config.toml MCP entries explicitly marked enabled = false.
- Added discovery regression coverage for disabled and enabled entries.

Fixes #7538
2026-08-03 16:38:20 +00:00
can1357 13a36f7c83 refactor(coding-agent/mcp): changed default MCP request ID format to sequential integers
- Change the default MCP JSON-RPC request ID format from snowflake strings to sequential integers.
- Update server configuration schema, connection equivalence checks, and tests to reflect the new integer default.
2026-08-01 20:33:11 +02:00
can1357 5e819172a5 Merge PR #7285: fix(coding-agent): preserve explicit extensions in isolation (@alphastorm) 2026-08-01 20:13:38 +02:00
Sunil Srivatsa f22c0edbfa fix(coding-agent): scope SDK extension packages 2026-08-01 13:50:53 -04:00
Sunil Srivatsa df38e5b48e fix(coding-agent): rebind relative extension roots 2026-08-01 13:24:11 -04:00
Sunil Srivatsa 8a7edb3f3d fix(coding-agent): preserve explicit extensions in isolation 2026-08-01 12:32:19 -04:00
Jérémy Marchand c676bbb81b fix(mcp): honor requestIdFormat in OMP plugin MCP configs
OMP plugins ship their own .mcp.json, and that provider whitelists fields into
the canonical MCPServer shape the same way the other loaders do, so a plugin
bundling an integer-only server could set requestIdFormat and still have it
dropped before it reached a transport.

Extract the value parsing into parseRequestIdFormat() next to parseBoolean() in
discovery/helpers.ts and use it from all three OMP-owned loaders (native,
standalone mcp.json, omp-plugins), replacing the two hand-rolled copies.

Vendor providers (claude, claude-plugins, cursor, vscode, gemini, opencode,
windsurf) are deliberately untouched: they translate another tool's own server
list, where an OMP-specific key has no meaning.
2026-07-31 21:03:06 +02:00
Jérémy Marchand 3cb6e5df9c fix(mcp): carry requestIdFormat through MCP config discovery
The option was only present on the transport-facing `MCPServerConfig`, so a
value written in `.omp/mcp.json` or a standalone `.mcp.json` never reached the
transports: discovery normalizes config into the canonical `MCPServer` shape and
`convertToLegacyConfig()` rebuilds the transport config from it, and neither step
knew about the field. Setting `"number"` in the documented config path silently
kept the snowflake-string default, which is the hang the option exists to avoid.

Wire it through the same four places `timeout` already uses: the canonical
`MCPServer` shape, the two OMP-native loaders (with validate-and-warn on an
unrecognized value), and the legacy conversion. Foreign-format providers are
untouched, since the key is OMP-specific.

Also point the `MCPServerConfigBase` doc comment at `RequestIdAllocator` rather
than a helper name that never existed.
2026-07-31 21:03:06 +02:00
can1357 b778617178 chore: reformat + rewrite changelogs 2026-07-28 11:19:34 +02:00
can1357 d1de4658aa fix(discovery): warn when a plugin mcpServers pointer names a missing file 2026-07-28 10:59:35 +02:00