Commit Graph
145 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
roboomp 3e4b59fa94 test(discovery): cleared inherited CLAUDE_CONFIG_DIR in setup
Legacy-path Claude discovery tests now unset an inherited override in beforeEach so they read the fixtures under their temp homes; relocation cases still set it explicitly.
2026-08-13 15:51:06 +00: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 6b4823181b test: cleaned test suites and documented filtering guidelines
- Remove redundant definedness, null, and type checks across test suites in multiple packages.
- Clean up unused assertions, metadata tests, and obsolete test cases.
- Add good versus bad test filter guidelines and requirements to project documentation.
2026-08-13 08:28:42 +02: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 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 757b332e5c test(discovery): isolated OpenCode config tests
Stubbed os.homedir for every OpenCode discovery test so developer and CI home configs cannot add unexpected MCP servers.
2026-08-09 20:12:18 +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
Slava Zavadsky 8c4fde3564 test(coding-agent): restore profile env after agent dir isolation
setAgentDir() clears OMP_PROFILE/PI_PROFILE and snapshots the agent dir,
so restoring only PI_CODING_AGENT_DIR/HOME leaks the default profile to
later tests when the suite is started under a caller-selected profile.
Capture and restore all three env vars plus HOME, then rebuild the dir
resolver via __resetDirsFromEnvForTests() (disabled-extensions pattern).

Addresses review comment on PR #8018.
2026-08-08 10:18:21 -04:00
Slava Zavadsky a06b12ff41 test(coding-agent): hermeticize agent dir in claude-plugins discovery tests
listClaudePluginRoots tests point HOME at a temp dir but left the agent
dir at the real profile (~/.omp/agent). User-scope discovery (native MCP
config via getAgentDir()/mcp.json) then read the machine's real
mcp.json, leaking its servers into loadCapability results and failing
'deduplicates a plugin alias of a directly configured MCP connection'
whenever the real agent dir contains an mcp.json.

Point the agent dir at a temp dir in beforeEach and restore the
previous value (or unset PI_CODING_AGENT_DIR) in afterEach, matching
the established pattern in mcp-profile/autolearn-discovery tests.
2026-08-08 10:10:29 -04: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 7a77771571 test(coding-agent): require multiline flag for anchored rules 2026-08-05 21:50:23 +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
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
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 73d3076d14 test(mcp): isolated translated importer home configs
Set HOME and os.homedir() to a dedicated temporary directory for each translated-provider fixture, then restore both after every test. This prevents real user MCP configs from shadowing the project fixture through capability deduplication.
2026-08-04 21:03:19 +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
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
can1357 d1de4658aa fix(discovery): warn when a plugin mcpServers pointer names a missing file 2026-07-28 10:59:35 +02:00
roboomp 4f63e4e521 fix(discovery): honored inline plugin MCP manifest maps
Treated an object-valued mcpServers manifest field as the server map, rooting relative stdio paths at the plugin root, so plugins declaring servers inline no longer fell through to .mcp.json.

Fixes #6871
2026-07-28 07:24:49 +00:00
roboomp 8f31a123d6 fix(discovery): honored plugin MCP manifest pointers
Resolved mcpServers file pointers from OMP and Claude plugin manifests before the conventional root config fallback.

Updated marketplace installer documentation for runtime symlink and lockfile registration.

Fixes #6871
2026-07-28 07:12:46 +00:00
can1357 d0d6ab6237 feat(coding-agent/discovery): added ts-no-local-is-record builtin discovery rule
- Add the `ts-no-local-is-record` built-in rule to detect local `isRecord` definitions and direct agents to shared guards.
- Add unit tests validating detection of local function and lambda definitions for the new rule.
2026-07-28 04:06:18 +02:00
roboomp ab8fb13eea fix(mcp): deduplicated aliased server connections
Deduplicated semantically identical MCP endpoints across provider-specific names while preserving provider priority and canonical direct names.

Kept the first registration on sanitized tool-name collisions and logged both origins.

Fixes #6786
2026-07-27 10:22:39 +00:00
can1357 b6e68fd243 fix(coding-agent): updated mentions of explore -> scout 2026-07-23 00:12:07 +02:00
roboomp c74e9d324f fix(extensions): disambiguated .agent dirs provider tab label
The /extensions dashboard built one tab per provider from its displayName.
The .agent/.agents config-standard provider used "Agents (standard)", which
collided with the first-class /agents subagents feature even though the tab
only surfaces skills, rules, prompts, commands, and context/system files.
Renamed DISPLAY_NAME to "Agent Dirs (.agent/.agents)".

Fixes #5821
2026-07-17 09:04:40 +00:00
roboomp 64e6ffc454 fix(discovery): isolated Claude local plugins
Filtered Claude Code local marketplace entries against the canonical active project before exposing plugin roots.

Fixes #5750
2026-07-16 20:29:36 +00:00
can1357 61cb9cb4e3 merged PR #5562: fix(discovery): root Codex config.toml MCP command/cwd at config dir 2026-07-16 03:31:55 +02:00
can1357 5ff277349c refactor(coding-agent): consolidated tool surface onto xd:// devices and hub
- Added the `xd://` virtual device protocol (`internal-urls/xd-protocol.ts`, `tools/xdev.ts`): tools declaring `loadMode: "discoverable"` are unmounted from the request tools array and driven via `read xd://` (list/docs+schema) and `write xd://<tool>` (execute), gated by the `tools.xdev` setting (default on) and inlined into the system prompt.
- Merged the `irc`, `job`, and `launch` tools into a single `hub` tool (`tools/hub/`, `async/job-manager.ts`): messaging keeps `send`/`inbox`/`list`, job control maps to `wait`/`cancel`/`jobs`, process supervision keeps `start`/`logs`/`stop`/`restart`/`describe` with `ps`, and the unified `wait` races background jobs against peer messages; SDK `IrcTool`/`JobTool`/`LaunchTool` are replaced by `HubTool`.
- Removed the hidden `resolve` tool in favor of the `xd://resolve`/`xd://reject`/`xd://propose` resolution devices, auto-including `write` whenever a deferrable tool or plan mode is present.
- Removed the BM25 tool-discovery system: the `search_tool_bm25` tool, the `tool-discovery` module, the `tools.discoveryMode`/`mcp.discoveryMode`/`mcp.discoveryDefaultServers`/`tools.essentialOverride` settings, per-tool MCP selection, and the `mcp_tool_selection` message type.
- Unified tool presentation on `ToolLoadMode` (`essential`|`discoverable`), replacing the custom-tool `xdev?: boolean` opt-out; custom, extension, MCP, RPC host, image-generation, and TTS tools now default to `discoverable`, and added a `satisfies` predicate to `SoftToolRequirement`.
- Removed the standalone `ssh` command tool and `ssh/ssh-executor` (the `ssh://` read/write/search protocol stays), and made `--tools` address hidden built-ins.
- Updated collab-web to render `xd://` dispatches and `hub` op families, dropped the `search_tool_bm25`/`ssh`/`report-finding` renderers, refreshed tool docs and prompts, and migrated the affected tests and changelogs.
2026-07-15 15:16:29 +02:00