feat: improve module installation flow#2342
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (7)
🚧 Files skipped from review as they are similar to previous changes (6)
📝 WalkthroughWalkthroughThe changes add shared module installation and agent-prompt builders, modifier-key bulk selection, responsive install controls, and Cursor, Claude Code, and VS Code deeplink actions. Prompt-card and agent-tool contracts remove repository metadata in favor of optional icons. Deeplink utilities and composables now handle prompt-based browser navigation and clipboard preparation. Module detail and index pages expose the new installation, selection, and prompt controls. The root tooltip delay is reduced from 500 to 300 milliseconds. Estimated code review effort: 4 (Complex) | ~60 minutes 🚥 Pre-merge checks | ✅ 3 | ❌ 2❌ Failed checks (2 warnings)
✅ Passed checks (3 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Warning There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure. 🔧 ESLint
ESLint install timed out. The project may have too many dependencies for the sandbox. 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. Comment |
There was a problem hiding this comment.
Actionable comments posted: 3
🧹 Nitpick comments (3)
app/components/module/ModuleInstallGroup.vue (1)
17-46: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winDuplicated install/prompt copy logic across three components.
ModuleInstallGroup.vue,ModuleItem.vue, andModuleCard.vueeach re-implement the samebuildModuleInstallCommand/buildModuleAgentPrompt+useClipboard()/useAnalytics()copy pattern (and, in two cases, the sameuseIdeDeeplink()open logic), differing only by the analyticssourcetag.
app/components/module/ModuleInstallGroup.vue#L17-L46: extractcopyInstall/copyPrompt/openCursor/openClaudeinto a shared composable parameterized bymoduleand asourcestring.app/components/module/ModuleItem.vue#L41-L45: replacecopyInstallCommandwith the same shared composable'scopyInstall.app/components/tools/ModuleCard.vue#L18-L45: replacecopyInstall/copyPromptwith the shared composable, passingsource: 'nuxt-agent'.🤖 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 `@app/components/module/ModuleInstallGroup.vue` around lines 17 - 46, Extract the duplicated module install, prompt-copy, and IDE-open logic into a shared composable parameterized by module and analytics source. Update app/components/module/ModuleInstallGroup.vue lines 17-46 to use it for copyInstall, copyPrompt, openCursor, and openClaude; update app/components/module/ModuleItem.vue lines 41-45 to use its copyInstall; and update app/components/tools/ModuleCard.vue lines 18-45 to use copyInstall and copyPrompt with source 'nuxt-agent', preserving existing analytics behavior.app/components/module/ModuleItem.vue (1)
28-29: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winReuse
selectedSortfromuseModules().ModuleItem.vueis deriving the same value fromroute.query.sortBythatuseModules()already exposes, so pulling it from the composable keeps the date/tooltip logic aligned with the rest of the modules page and avoids future drift.🤖 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 `@app/components/module/ModuleItem.vue` around lines 28 - 29, Update ModuleItem.vue to stop deriving selectedSort from route.query.sortBy and instead reuse the selectedSort value returned by useModules(). Remove the now-unneeded route/computed logic while preserving the existing date and tooltip behavior.app/components/tools/PromptCard.vue (1)
2-14: 🎯 Functional Correctness | 🔵 Trivial | 💤 Low valueRemove the unused
deeplinksprop
PromptCardnow builds both IDE links fromprompt, sodeeplinksis never read and only makes the component contract misleading.🤖 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 `@app/components/tools/PromptCard.vue` around lines 2 - 14, Remove the unused deeplinks property from the props type in PromptCard, leaving prompt and the other actively used props unchanged. Ensure callers are no longer required to provide deeplinks and rely on the existing useIdeDeeplink flow for both IDE links.
🤖 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 `@app/composables/useIdeDeeplink.ts`:
- Around line 40-49: Update openInCursor and openInClaudeCode to retain each
builder’s needsClipboardFallback result and show the fallback toast when it is
true, explicitly stating that the opened prompt was shortened and the complete
prompt is available in the clipboard; preserve the existing deeplink opening and
clipboard-copy behavior.
In `@app/composables/useModules.ts`:
- Around line 57-63: Update buildBulkModuleAgentPrompt to use the module’s name
when m.npm is absent, matching the existing single-module fallback and the
install command’s m.name behavior. Ensure the generated module list never
renders “undefined” for the identifier while preserving npm as the preferred
value.
In `@app/pages/modules/index.vue`:
- Around line 69-81: Update selectModuleRange so that when
lastSelectedIndex.value is null after a filter, sort, or search change, the
clicked module becomes the new anchor without replacing the existing
modulesToAdd selection; preserve prior selections while adding the clicked
module if needed, and keep normal range selection behavior unchanged when an
anchor exists.
---
Nitpick comments:
In `@app/components/module/ModuleInstallGroup.vue`:
- Around line 17-46: Extract the duplicated module install, prompt-copy, and
IDE-open logic into a shared composable parameterized by module and analytics
source. Update app/components/module/ModuleInstallGroup.vue lines 17-46 to use
it for copyInstall, copyPrompt, openCursor, and openClaude; update
app/components/module/ModuleItem.vue lines 41-45 to use its copyInstall; and
update app/components/tools/ModuleCard.vue lines 18-45 to use copyInstall and
copyPrompt with source 'nuxt-agent', preserving existing analytics behavior.
In `@app/components/module/ModuleItem.vue`:
- Around line 28-29: Update ModuleItem.vue to stop deriving selectedSort from
route.query.sortBy and instead reuse the selectedSort value returned by
useModules(). Remove the now-unneeded route/computed logic while preserving the
existing date and tooltip behavior.
In `@app/components/tools/PromptCard.vue`:
- Around line 2-14: Remove the unused deeplinks property from the props type in
PromptCard, leaving prompt and the other actively used props unchanged. Ensure
callers are no longer required to provide deeplinks and rely on the existing
useIdeDeeplink flow for both IDE links.
🪄 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: Organization UI
Review profile: CHILL
Plan: Pro
Run ID: 5a3f8058-ccbe-481d-826f-d54e6658cafd
📒 Files selected for processing (13)
app/app.vueapp/components/module/ModuleInstallGroup.vueapp/components/module/ModuleItem.vueapp/components/tools/ModuleCard.vueapp/components/tools/PromptCard.vueapp/composables/useIdeDeeplink.tsapp/composables/useModules.tsapp/pages/modules/[slug].vueapp/pages/modules/index.vuelayers/nuxi/agent/lib/base-instructions.tslayers/nuxi/agent/tools/show_prompt.tslayers/nuxi/shared/types/tools.tslayers/nuxi/shared/utils/ide-deeplinks.ts
💤 Files with no reviewable changes (2)
- layers/nuxi/shared/types/tools.ts
- layers/nuxi/agent/lib/base-instructions.ts
| { | ||
| label: 'Open in Cursor', | ||
| icon: 'i-simple-icons-cursor', | ||
| onSelect: openCursor | ||
| }, | ||
| { | ||
| label: 'Open in Claude Code', | ||
| icon: 'i-simple-icons-anthropic', | ||
| onSelect: openClaude | ||
| } |
There was a problem hiding this comment.
I think we could easily get into a state where we have so many IDEs listed here.... why these two, for example?
maybe skip it and just have install + prompt options?
There was a problem hiding this comment.
I listed these two because I think they're the most widely used, but also because they're the only ones I know of at the moment that have this deeplink system, which is very convenient
There was a problem hiding this comment.
vscode://GitHub.Copilot-Chat/chat?agent=agent&prompt=<URL-encoded-prompt>
vscode-insiders://GitHub.Copilot-Chat/chat?agent=agent&prompt=<URL-encoded-prompt>
There was a problem hiding this comment.
I added VS Code, but I don't know if having Insider as well is redundant, which confirms your point that it's complicated to list some and not others, and at the same time it's a feature I find really cool
There was a problem hiding this comment.
Same with the GitHub Copilot app, you can do something like ghapp://model/gpt-5.5 if you want to open the app with that model, or something like these:
ghapp://session/new?repo=github/github-app
ghapp://session/new/github/github-app
ghapp://session/new?repo=github/github-app&pr=123
ghapp://session/new?repo=github/github-app&branch=main
ghapp://session/new?repo=github/github-app&prompt=fix+bug
ghapp://session/new?repo=github/github-app&mode=plan
ghapp://session/new?repo=github/github-app&mode=interactive
ghapp://session/new?repo=github/github-app&mode=autopilot
ghapp://session/new?repo=github/github-app&pr=123&prompt=review+this+PR&mode=autopilot
ghapp://session/new?repo=github/github-app&branch=feature/name&prompt=continue+work&mode=plan
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 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 `@app/composables/useIdeDeeplink.ts`:
- Around line 33-42: Update openInCursor to sanitize the prompt by removing
Cursor-blocked text before passing it to buildCursorBrowserUrl, while continuing
to pass the original prompt to copyPromptToClipboard. Leave openInClaudeCode
unchanged.
🪄 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: Organization UI
Review profile: CHILL
Plan: Pro
Run ID: 6d5a5e37-7ca3-4b85-8a5c-b6491d6e1dba
📒 Files selected for processing (8)
app/components/module/ModuleInstallGroup.vueapp/components/module/ModuleItem.vueapp/components/tools/ModuleCard.vueapp/components/tools/PromptCard.vueapp/composables/useIdeDeeplink.tsapp/composables/useModules.tsapp/pages/modules/index.vuelayers/nuxi/app/components/chat/ChatContent.vue
🚧 Files skipped from review as they are similar to previous changes (2)
- app/components/tools/ModuleCard.vue
- app/components/module/ModuleInstallGroup.vue
Resolves #2326
CleanShot.2026-07-22.at.14.48.34.mp4