Skip to content

feat: agents dashboard support + Semble code search + LSP marketplace#143

Merged
maxritter merged 2 commits into
mainfrom
dev
May 12, 2026
Merged

feat: agents dashboard support + Semble code search + LSP marketplace#143
maxritter merged 2 commits into
mainfrom
dev

Conversation

@maxritter

@maxritter maxritter commented May 12, 2026

Copy link
Copy Markdown
Owner

Summary

User-facing changes shipped in this PR:

  • Claude Code's interactive claude agents dashboard now works when launched through pilot. Previously it fell back to the static list because pilot wrapped claude with --plugin-dir, which Claude Code disables the dashboard for.
  • Code search switches from Probe to Semble. Hybrid BM25 + Model2Vec semantic embeddings, code-aware chunking, ~1.5ms queries. Available as both CLI (semble search) and MCP tool.
  • LSP support migrates to Anthropic's marketplace. vtsls, basedpyright, gopls install through Piebald-AI/claude-code-lsps — the same claude plugins install path pilot already uses for context-mode, codex, and chrome-devtools.
  • Native install layout. Pilot's hooks, MCP servers, and agents live in their documented ~/.claude/ locations:
    • hook config merged into ~/.claude/settings.json hooks
    • MCP servers merged into ~/.claude.json mcpServers
    • agents copied to ~/.claude/agents/
  • Non-destructive uninstall. Value-aware MCP cleanup leaves user-modified Pilot servers fully intact (no partial gutting); signature-aware hooks reversal removes only Pilot's entries while preserving user-added hooks. LSP plugin uninstall removes only IDs Pilot installed (tracked in ~/.pilot/.pilot-lsp-plugins.json).
  • Console UI: removed the Semble subsection from the Tool Token Savings card so the row's height matches the Yield panel beside it.
  • Security: bumped fast-uri to 3.1.2 (CVE-2026-6321 / CVE-2026-6322) and @babel/plugin-transform-modules-systemjs to 7.29.4 (CVE-2026-44728) via npm/bun overrides.
  • Docs: README + Docusaurus customization docs refreshed for the new layout. Various rule and skill content polish from prior sessions.

Verification

  • 1505 unit tests pass (installer/tests/unit/ launcher/tests/unit/)
  • 1485 console tests pass (cd console && bun test)
  • TypeScript clean (tsc --noEmit)
  • basedpyright clean on all changed Python files
  • Cython binary regenerated via uv run python -m launcher.build
  • Both Claude pilot:spec-review and Codex changes-review ran during planning + verification phases; all must_fix and should_fix findings addressed inline

Implementation plan

docs/plans/2026-05-12-drop-plugin-system-native-install.md (Status: VERIFIED)

Summary by CodeRabbit

  • New Features

    • Added pilot agents CLI to manage background agent sessions
    • Seven preconfigured MCP servers included by default
  • Documentation

    • Switched guidance to use Semble hybrid semantic+lexical search
    • Updated customization and installer docs: agents live in ~/.claude/agents, .mcp.json now deep-merges into user Claude config, removed legacy LSP override guidance
  • Chores

    • Installer/uninstall flows updated for Semble, LSP plugin handling, and safer config merging/cleanup

Review Change Stack

User-facing changes:
- Claude Code's interactive 'claude agents' dashboard now works correctly
  when launched through pilot (previously fell back to static list)
- Code search switches from Probe to Semble: hybrid BM25 + Model2Vec
  semantic embeddings, code-aware chunking, ~1.5ms queries, available
  as both CLI ('semble search') and MCP tool
- LSP support (vtsls, basedpyright, gopls) now installs through Anthropic's
  Piebald-AI/claude-code-lsps plugin marketplace - same path pilot already
  uses for context-mode, codex, and chrome-devtools
- Pilot's hooks, MCP servers, and agents now live in their native
  ~/.claude/ locations (settings.json hooks, ~/.claude.json mcpServers,
  ~/.claude/agents/) - no plugin-dir wrapping needed
- Non-destructive uninstall: user-modified Pilot MCP servers and
  user-added hook entries are preserved; only Pilot-installed LSP plugins
  are removed (user-managed ones untouched)
- Pilot Console: removed Semble subsection from the Tool Token Savings
  card so the row's height matches Yield panel
- Bump fast-uri to 3.1.2 (CVE-2026-6321/6322) and
  @babel/plugin-transform-modules-systemjs to 7.29.4 (CVE-2026-44728)
  via npm/bun overrides
- README + Docusaurus customization docs refreshed for the new layout
- Various rule and skill content polish from prior sessions
@vercel

vercel Bot commented May 12, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
pilot-shell Ignored Ignored Preview May 12, 2026 10:13am

Request Review

@coderabbitai

coderabbitai Bot commented May 12, 2026

Copy link
Copy Markdown

Caution

Review failed

Pull request was closed or merged during review

Walkthrough

The PR replaces Probe with Semble across docs and installer, adds Semble installation and Claude LSP plugin installs, introduces agents support, implements baseline-aware merging of Pilot hooks and MCP servers into native Claude config, updates uninstall to remove only baseline-matching items, and adds/updates tests and manifest entries.

Changes

Probe to Semble Migration & Config Consolidation

Layer / File(s) Summary
Documentation and site updates
README.md, docs/docusaurus/blog/*, docs/docusaurus/docs/features/*, docs/docusaurus/docs/workflows/*, docs/site/src/components/*, docs/docusaurus/package.json
Replace Probe with Semble in documentation and site components, update MCP server count to seven, remove .lsp.json override wording, document .mcp.json deep-merge into ~/.claude.json:mcpServers, and document ~/.claude/agents/ as agents destination.
Dependencies: Install Semble and LSP plugins
installer/steps/dependencies.py, installer/tests/unit/steps/test_dependencies.py
Add install_semble() using uv tool install --upgrade semble, add install_lsp_plugins() to install/update vtsls/basedpyright/gopls via Claude marketplace with Pilot-owned manifest persistence, and wire both into Phase 2 parallel installs with tests.
Installer: Claude files, agents, hooks & MCP merging
installer/steps/claude_files.py, installer/steps/settings_merge.py
Add agents category installing pilot/agents/~/.claude/agents/, implement patch_plugin_root() to substitute ${CLAUDE_PLUGIN_ROOT}, skip legacy plugin.json and .lsp.json, remove legacy marker before merges, merge Pilot hooks into ~/.claude/settings.json and MCP servers into ~/.claude.json using baseline files and preserve user modifications with warnings.
Settings merge utilities
installer/steps/settings_merge.py
New functions: _hook_entry_signature(), merge_pilot_hooks(), and merge_pilot_mcp_servers() implement signature-aware hook merges and value-aware MCP server merges returning merged results and human-readable warnings.
Uninstall: baseline-aware cleanup & LSP removal
uninstall.sh
Add hooks/MCP baseline and LSP manifest constants, refactor surgical cleanup to use env-driven Python, implement signature-aware removal of Pilot hooks (preserving user-added hooks), perform exact-value MCP server cleanup preserving modified entries, add uninstall_lsp_plugins(), and update uninstall messaging.
Tests and manifest updates
installer/tests/unit/steps/test_claude_files.py, installer/tests/unit/steps/test_dependencies.py, installer/tests/unit/test_manifest.py, installer/upstreams.yaml
Add comprehensive tests for plugin-root patching, hook and MCP merge semantics, agents categorization, Semble and LSP plugin installs; update manifest fixtures; remove @probelabs/probe upstream entry.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

Suggested labels

released

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 65.26% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately summarizes the three main features delivered: agents dashboard support, Semble code search integration, and LSP marketplace.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch dev

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@claude

claude Bot commented May 12, 2026

Copy link
Copy Markdown

Claude finished @maxritter's task in 3m 43s —— View job


Code Review — PR #143

  • Gather context (CLAUDE.md, PR diff)
  • Review installer changes (installer/steps/)
  • Review uninstall script (uninstall.sh)
  • Review docs changes
  • Review pilot config/rules changes
  • Compile and post findings

This is a large, well-scoped PR. The overall design is sound — migrating to native ~/.claude/ locations, dropping the plugin system, and switching to Semble are all coherent decisions with good test coverage. Below are the findings, grouped by severity.


Medium

1. ValueError from merge_pilot_hooks is uncaught in _merge_hooks_into_settings
installer/steps/claude_files.py_merge_hooks_into_settings calls merge_pilot_hooks(...) which raises ValueError when incoming hooks contain duplicate signatures (see the docstring: "Raises: ValueError"). If pilot/hooks/hooks.json ever arrives on disk with a malformed duplicate (e.g. corrupted download, hand-edit), the entire install crashes with an uncaught exception rather than skipping the merge gracefully.

# current (no guard)
merged = merge_pilot_hooks(current_hooks, incoming_hooks, baseline_hooks)

The fix is to wrap in try/except ValueError and log a warning:
Fix this →

2. install_lsp_plugins calls claude plugins list --json redundantly (×4 for 3 plugins)
installer/steps/dependencies.py_list_installed_plugin_ids() is called once at the top of install_lsp_plugins to build pre_installed, then _install_or_update_plugin (which is a general-purpose helper) calls claude plugins list --json internally once per plugin, giving 1 + 3 = 4 subprocess invocations total. Each is a 30-second-timeout claude subprocess. Not a correctness issue but doubles the subprocess traffic for a hot path; worth noting if install-time latency becomes a concern.


Low

3. Same marketplace added up to 3 times during LSP install
installer/steps/dependencies.py — All three LSP plugins share Piebald-AI/claude-code-lsps. When none are pre-installed, _install_or_update_plugin calls claude plugins marketplace add Piebald-AI/claude-code-lsps once per plugin (idempotent but wasteful). Could be hoisted before the loop:

if not _run_bash_with_retry(f"claude plugins marketplace add {_LSP_MARKETPLACE}", timeout=60):
    _write_pilot_lsp_manifest(sorted(pilot_owned))
    return False

Then _install_or_update_plugin can be called with a flag or refactored to skip the marketplace step.
Fix this →

4. uninstall.sh LSP regex silently skips future plugin IDs with uppercase or digits
uninstall.sh L109: the pattern '"[a-z][a-z0-9-]*@claude-code-lsps"' works for the current set (vtsls, basedpyright, gopls) but would silently skip a plugin ID starting with a digit or containing uppercase (e.g. TypeScript-ls@claude-code-lsps). The JSON manifest file is structured — parsing it with Python (as done elsewhere in the script) would be more robust. Low risk today, but worth hardening given this drives uninstall correctness.

5. User-deleted Pilot MCP servers are silently reinstalled on upgrade
installer/steps/settings_merge.pymerge_pilot_mcp_servers step 3 preserves user-modified Pilot servers, but if a user deletes a Pilot server key from ~/.claude.json, step 4 reinstalls it because the key is not in result. This is arguably intentional, but the behavior isn't documented in the function docstring ("preserves user-added AND user-modified entries" doesn't mention deleted entries). Adding a note would prevent future confusion:

# Note: user-deleted Pilot servers ARE reinstalled — deletion is not treated as
# a user customisation; the server is simply absent from `current`, so step 4
# adds it back from incoming.

Info / Nits

6. Docstring says "Asserts signature uniqueness" but uses raise ValueError
installer/steps/settings_merge.py — The merge_pilot_hooks docstring says "Asserts signature uniqueness … to lock in the invariant" but the implementation uses raise ValueError. In CPython with -O, assert is stripped but raise ValueError is not — so the implementation is actually correct. The docstring wording ("Asserts") implies assert, which could mislead. Rephrasing to "Validates" or "Raises ValueError if ..." would be clearer.

7. pilot/.mcp.json Semble entry uses uvx --from semble[mcp]
pilot/.mcp.json — the new "semble" MCP server entry:

"semble": {
  "command": "uvx",
  "args": ["--from", "semble[mcp]", "semble"]
}

This depends on uvx being in PATH at Claude Code session startup, which is guaranteed by the install_semble step (uv is a prerequisite). Looks correct.

8. README step 2 still says "plugin"
README.md L122: "2. Claude files — Sets up ~/.claude/ plugin — rules, commands, hooks, MCP servers"plugin is stale; Pilot is no longer a Claude Code plugin. Should read something like "native install" or just remove the word "plugin".


What's Well Done

  • Security fix in uninstall.sh: passing paths via env vars to the inline Python (PILOT_TARGET=... python3 -c '...') instead of shell-interpolating them into the Python source string is the right pattern and avoids a genuine injection risk in home directories with unusual characters.
  • Ownership-across-reinstalls logic in install_lsp_plugins: the union of previously_owned and freshly-installed IDs is correct and the regression test for it (test_reinstall_preserves_pilot_ownership) covers the exact scenario that broke in the Codex review.
  • merge_pilot_hooks three-way merge: the signature-based identity (matcher + sorted commands) is a clean abstraction that decouples the merge from JSON equality while preserving user additions.
  • _remove_legacy_plugin_marker called first in _post_install_processing: the ordering comment and the test test_post_install_processing_removes_marker_first properly lock in the invariant.
  • Double-fire idempotency test (test_upgrade_idempotency_two_runs_no_double_fire): this directly exercises the plan's risk table item and is a high-value test.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
installer/tests/unit/steps/test_dependencies.py (1)

41-74: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Assert Semble installer invocation in the core dependency flow test.

Line 41 patches install_semble, but the test never verifies it was called. Add an assertion so Semble regressions are caught.

Suggested patch
             mock_python_tools.assert_called_once()
             mock_plugin_deps.assert_called_once()
+            _mock_semble.assert_called_once()

As per coding guidelines, **/tests/** and **/test_*.py reviews should focus on test coverage for the feature being tested.

Also applies to: 96-101

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@installer/tests/unit/steps/test_dependencies.py` around lines 41 - 74, The
test patches install_semble but never asserts it was invoked; in
test_dependencies_run_installs_core add an assertion that the Semble patch was
called (e.g., call assert_called_once() on the mock for install_semble — the
parameter named _mock_semble in the test) to ensure the installer is invoked;
apply the same fix to the related test covering the core dependency flow around
lines 96-101 by asserting its install_semble mock was called as well.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@docs/docusaurus/docs/features/mcp-servers.md`:
- Around line 171-175: The fenced code block containing the sample calls to
mcp__semble__search and mcp__semble__find_related lacks a language tag (causing
MD040); update that code fence to include a language identifier (e.g., "text")
so the block starts with ```text and ends with ``` to satisfy markdownlint and
keep the examples for mcp__semble__search and mcp__semble__find_related
unchanged.

In `@installer/steps/claude_files.py`:
- Around line 451-452: The baseline file for MCP servers is being overwritten by
_merge_app_config (the baseline_path.write_text(json.dumps(source,...)) call),
which removes the prior mcpServers and prevents
_merge_mcp_servers_into_claude_json from seeing them; fix by preserving the
mcpServers key when writing the baseline or by giving MCP servers their own
dedicated baseline file. Concretely: in _merge_app_config, before writing the
new baseline, load the existing baseline if present and copy any existing
"mcpServers" value into source (or write source to a separate
.pilot-mcp-baseline.json and update _merge_mcp_servers_into_claude_json to read
that file); ensure the change removes the lost-data overwrite that causes
merge_pilot_mcp_servers(current_servers, incoming_servers, None) to misclassify
Pilot-owned servers.

---

Outside diff comments:
In `@installer/tests/unit/steps/test_dependencies.py`:
- Around line 41-74: The test patches install_semble but never asserts it was
invoked; in test_dependencies_run_installs_core add an assertion that the Semble
patch was called (e.g., call assert_called_once() on the mock for install_semble
— the parameter named _mock_semble in the test) to ensure the installer is
invoked; apply the same fix to the related test covering the core dependency
flow around lines 96-101 by asserting its install_semble mock was called as
well.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 4362c48c-77d9-4fbc-8c43-57a56a1d6092

📥 Commits

Reviewing files that changed from the base of the PR and between 0025dc7 and bbae32a.

⛔ Files ignored due to path filters (48)
  • console/package.json is excluded by !console/**
  • console/src/services/worker/http/routes/ToolSavingsRoutes.ts is excluded by !console/**
  • console/src/ui/viewer/views/Usage/ToolSavingsCards.tsx is excluded by !console/**
  • console/src/ui/viewer/views/Usage/index.tsx is excluded by !console/**
  • docs/docusaurus/package-lock.json is excluded by !**/package-lock.json
  • launcher/cli.py is excluded by !launcher/**
  • launcher/config.py is excluded by !launcher/**
  • launcher/customize.py is excluded by !launcher/**
  • launcher/model_config.py is excluded by !launcher/**
  • launcher/settings_injector.py is excluded by !launcher/**
  • launcher/tests/unit/test_cli.py is excluded by !launcher/**
  • launcher/tests/unit/test_customize.py is excluded by !launcher/**
  • launcher/tests/unit/test_model_config.py is excluded by !launcher/**
  • launcher/tests/unit/test_settings_injector.py is excluded by !launcher/**
  • launcher/tests/unit/test_wrapper.py is excluded by !launcher/**
  • launcher/wrapper.py is excluded by !launcher/**
  • pilot/.lsp.json is excluded by !pilot/**
  • pilot/.mcp.json is excluded by !pilot/**
  • pilot/hooks/tests/test__util.py is excluded by !pilot/**
  • pilot/hooks/tests/test_tool_redirect.py is excluded by !pilot/**
  • pilot/hooks/tool_redirect.py is excluded by !pilot/**
  • pilot/package.json is excluded by !pilot/**
  • pilot/plugin.json is excluded by !pilot/**
  • pilot/rules/cli-tools.md is excluded by !pilot/**
  • pilot/rules/code-review-reception.md is excluded by !pilot/**
  • pilot/rules/development-practices.md is excluded by !pilot/**
  • pilot/rules/mcp-servers.md is excluded by !pilot/**
  • pilot/rules/task-and-workflow.md is excluded by !pilot/**
  • pilot/rules/testing.md is excluded by !pilot/**
  • pilot/scripts/mcp-server.cjs is excluded by !pilot/**
  • pilot/scripts/worker-service.cjs is excluded by !pilot/**
  • pilot/settings.json is excluded by !pilot/**
  • pilot/skills/benchmark/tests/test_aggregate_benchmark.py is excluded by !pilot/**
  • pilot/skills/create-skill/steps/02-understand.md is excluded by !pilot/**
  • pilot/skills/create-skill/steps/04-create.md is excluded by !pilot/**
  • pilot/skills/prd/steps/03-clarify.md is excluded by !pilot/**
  • pilot/skills/setup-rules/steps/01-reference.md is excluded by !pilot/**
  • pilot/skills/setup-rules/steps/04-audit.md is excluded by !pilot/**
  • pilot/skills/setup-rules/steps/05-explore.md is excluded by !pilot/**
  • pilot/skills/setup-rules/steps/09-discover.md is excluded by !pilot/**
  • pilot/skills/setup-rules/steps/10-cross-check.md is excluded by !pilot/**
  • pilot/skills/setup-rules/steps/12-summary.md is excluded by !pilot/**
  • pilot/skills/spec-bugfix-plan/steps/03-investigation.md is excluded by !pilot/**
  • pilot/skills/spec-implement/steps/01-read-plan.md is excluded by !pilot/**
  • pilot/skills/spec-implement/steps/04-tdd-loop.md is excluded by !pilot/**
  • pilot/skills/spec-plan/steps/05-task-understanding.md is excluded by !pilot/**
  • pilot/skills/spec-plan/steps/06-exploration.md is excluded by !pilot/**
  • pilot/ui/index4.js is excluded by !pilot/**
📒 Files selected for processing (22)
  • README.md
  • docs/docusaurus/blog/2026-02-18-fast-mode.md
  • docs/docusaurus/docs/features/cli.md
  • docs/docusaurus/docs/features/customization.md
  • docs/docusaurus/docs/features/mcp-servers.md
  • docs/docusaurus/docs/features/open-source-tools.md
  • docs/docusaurus/docs/features/rules.md
  • docs/docusaurus/docs/getting-started/installation.md
  • docs/docusaurus/docs/workflows/setup-rules.md
  • docs/docusaurus/docs/workflows/spec.md
  • docs/docusaurus/package.json
  • docs/site/src/components/DeepDiveSection.tsx
  • docs/site/src/components/TechStack.tsx
  • docs/site/src/components/WhatsInside.tsx
  • installer/steps/claude_files.py
  • installer/steps/dependencies.py
  • installer/steps/settings_merge.py
  • installer/tests/unit/steps/test_claude_files.py
  • installer/tests/unit/steps/test_dependencies.py
  • installer/tests/unit/test_manifest.py
  • installer/upstreams.yaml
  • uninstall.sh
💤 Files with no reviewable changes (1)
  • installer/upstreams.yaml

Comment thread docs/docusaurus/docs/features/mcp-servers.md Outdated
Comment thread installer/steps/claude_files.py
CodeRabbit (must-fix):
- MCP baseline file was being clobbered by _merge_app_config on every
  install, which wiped Pilot's mcpServers tracking and caused incorrect
  ownership classification on second install. Switch to a dedicated
  .pilot-mcp-baseline.json (mirrors the .pilot-hooks-baseline.json
  pattern). Uninstall script updated to read from the new file.
- Add install_semble and install_rtk assertions to
  test_dependencies_run_installs_core so regressions on those installers
  are caught.
- Add 'text' language tag to MCP example fenced code block (markdown lint).

Claude (medium / nits):
- Wrap merge_pilot_hooks call in try/except ValueError so a corrupted
  pilot/hooks/hooks.json logs and skips the merge instead of crashing
  the entire install.
- Update merge_pilot_hooks docstring to say 'Validates ... raises
  ValueError' (was 'Asserts ...', which is misleading vs. plain assert).
- README install-steps wording: 'Sets up ~/.claude/ plugin' →
  'Installs into ~/.claude/ (native layout)' — Pilot is no longer a
  Claude Code plugin.
@claude

claude Bot commented May 12, 2026

Copy link
Copy Markdown

Claude finished @maxritter's task in 1m 51s —— View job


Incremental Code Review — PR #143

  • Gather context
  • Read changed files from new push
  • Check prior findings for resolution
  • Identify new issues
  • Post review

✅ Resolved from prior review

Medium findings — both fixed:

  • ValueError from merge_pilot_hooks uncaught_merge_hooks_into_settings now wraps the call in try/except ValueError with a graceful skip (claude_files.py:325-332).
  • MCP baseline wiped by _merge_app_config (CodeRabbit major) — _merge_mcp_servers_into_claude_json now uses a dedicated MCP_BASELINE_FILE = ".pilot-mcp-baseline.json", explicitly isolated from the _merge_app_config-owned .pilot-claude-baseline.json. The comment in the code correctly explains the isolation rationale.

Low/info findings — fixed:

  • README step 2 "plugin" wording — now reads "Installs into ~/.claude/ (native layout)".
  • Docstring "Asserts signature uniqueness" — now reads "Validates ... Uses raise ValueError (NOT assert) so the check survives python -O".
  • Missing language tag in mcp-servers.md fenced block (CodeRabbit) — now \``text`.
  • Semble mock not asserted in test_dependencies.py (CodeRabbit) — _mock_semble.assert_called_once() and _mock_rtk.assert_called_once() added (lines 1233-1234 of test diff).

New issue — Low

remove_manifest_files in uninstall.sh doesn't clean up empty ~/.claude/agents/ after removing agent files

uninstall.sh:230-235 — the empty-directory cleanup loop after the manifest removal only iterates "commands" "skills" "rules":

for subdir in "commands" "skills" "rules"; do
    local dir="$CLAUDE_DIR/$subdir"
    if [ -d "$dir" ] && [ -z "$(ls -A "$dir" 2>/dev/null)" ]; then
        rmdir "$dir" 2>/dev/null || true
    fi
done

Since agents/ entries are now tracked in the manifest (installer adds them as "agents/" prefixed paths), the manifest-removal loop above will delete all the .md files, but ~/.claude/agents/ will be left as an orphaned empty directory. The same loop should include "agents".

The success message on line 226 is also now stale — it says "Removed $removed_count Pilot-managed skills and rules" but agents are included in that count.

Fix this →


Still open from prior review

  • Low — Same marketplace (Piebald-AI/claude-code-lsps) added once per plugin (×3) in install_lsp_plugins — redundant subprocess calls; marketplace add is idempotent but the test_one_failure_returns_false_but_others_still_attempted test confirms the pattern is still in place.
  • Lowuninstall.sh LSP regex '"[a-z][a-z0-9-]*@claude-code-lsps"' (line 476) silently skips plugin IDs with uppercase letters or leading digits.
  • Low — User-deleted Pilot MCP servers are silently reinstalled on upgrade; behavior is correct by design but remains undocumented in the merge_pilot_mcp_servers docstring.

@maxritter maxritter merged commit ca97cb0 into main May 12, 2026
21 of 22 checks passed
@maxritter maxritter deleted the dev branch May 12, 2026 10:20
maxritter added a commit that referenced this pull request May 12, 2026
The 8.8.0 release pipeline failed because the prepareCmd's sed step
referenced pilot/plugin.json, which was deleted in #143. Remove it from
both the sed list (prepare step) and the @semantic-release/git assets
list so the next release cycle can bump versions cleanly.

Also confirmed no other tracked file (CI workflows, install.sh, etc.)
references the removed pilot/plugin.json — only intentional refs in
_remove_legacy_plugin_marker's docstring + the test asserting we skip
it during install.
github-actions Bot pushed a commit that referenced this pull request May 12, 2026
# [8.8.0](v8.7.1...v8.8.0) (2026-05-12)

### Bug Fixes

* drop pilot/plugin.json from semantic-release prepareCmd ([e5160e4](e5160e4))

### Features

* agents dashboard support + Semble code search + LSP marketplace ([#143](#143)) ([ca97cb0](ca97cb0))
@github-actions

Copy link
Copy Markdown
Contributor

🎉 This PR is included in version 8.8.0 🎉

The release is available on GitHub release

Your semantic-release bot 📦🚀

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant