feat(penpal): add in-app CLI and Claude Code plugin installation#317
feat(penpal): add in-app CLI and Claude Code plugin installation#317
Conversation
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: b7369c0e52
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
b7369c0 to
e1c6053
Compare
e1c6053 to
1c1145b
Compare
Add a "Manage Command Line Tools..." menu item and startup modal that handles installing/updating the penpal CLI symlink and Claude Code plugin from within the app, removing the need to clone the repo and run `just install` for these tasks. - Go endpoint (GET/POST /api/install-tools) creates CLI symlink and runs claude plugin marketplace add/install - Tauri menu item dispatches event to frontend - Modal shows on each new build: "Install" for fresh, "Update" for existing tools, with per-build localStorage dismissal - Bundle .claude-plugin/marketplace.json and plugin/ in app resources - Simplify justfile install/uninstall (app handles tools now) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1c1145b to
ef24549
Compare
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: ef245498b3
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| rm -f "$(brew --prefix)/bin/penpal" 2>/dev/null || true | ||
| rm -rf /Applications/Penpal.app 2>/dev/null || true | ||
| echo "Penpal.app removed from /Applications." | ||
| rm -f "$(brew --prefix 2>/dev/null)/bin/penpal" 2>/dev/null || rm -f /usr/local/bin/penpal 2>/dev/null || true |
There was a problem hiding this comment.
Avoid short-circuiting fallback path in uninstall recipe
When brew is not installed, "$(brew --prefix 2>/dev/null)/bin/penpal" expands to /bin/penpal, and rm -f /bin/penpal succeeds even if the file is missing; because of the || chain, the /usr/local/bin/penpal fallback is never attempted. In that environment, just uninstall leaves the actual symlink behind, so the new fallback logic does not work as intended.
Useful? React with 👍 / 👎.
Summary
penpalCLI symlink and Claude Code plugin from within the appGET/POST /api/install-tools) handles symlink creation andclaude plugin marketplace add/claude plugin install.claude-plugin/marketplace.jsonandplugin/directory in the app's Resources so the plugin can be installed without the source repojustfileinstall/uninstall recipes since the app now handles CLI + plugin setupTest plan
cd apps/penpal && go test ./internal/server/ -run TestInstall(5 tests)cd apps/penpal/frontend && pnpm exec vitest run src/components/InstallToolsModal.test.tsx src/components/InstallStartup.test.tsx src/api.test.ts(23 tests)just lintpassesjust typecheckpassesjust install, trigger menu item, verify CLI + plugin installedls /Applications/Penpal.app/Contents/Resources/plugin/🤖 Generated with Claude Code