Repository navigation
feat(agent-config): plugin tabs and add-plugin dialog [18/21] - #339
Conversation
|
Warning Review limit reachedYou've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository. Next included review available in 59 minutes. View limit detailsLimit details: You’ve used the included review currently available. Review configuration: ⚙️ Run configuration
📒 Files selected for processing (7)
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.
Copilot review overview
🟡 Changes recommended
Plugin-name collisions and inherited-property lookups can produce incorrect configuration behavior, and the add-plugin flow lacks coverage.
Review effort: Balanced
Findings: 3
Open (4)
What changed in this PR
Adds the Effective configuration view’s plugin tabs, plugin metadata, and gated add-plugin workflow.
Changes:
- Adds tabbed plugin summaries and pending-state indicators.
- Adds access-aware plugin creation and validation.
- Adds Effective view and plugin library badge tests.
| File | Description |
|---|---|
PluginTabs.vue |
Implements plugin tabs and add-plugin flow. |
AddPluginDialog.vue |
Adds plugin input and access validation. |
AddPluginAction.vue |
Adds access-gated action button. |
AgentConfigEffectiveView.vue |
Composes Effective configuration summaries. |
PluginLibVersion.spec.ts |
Tests plugin library badges. |
AgentConfigEffectiveView.spec.ts |
Tests Effective view rendering and sanitization. |
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
| const basePlugin = props.base?.plugins?.[name]; | ||
| if (v === null && basePlugin && !(name in eff)) { |
| const effDraft = ws?.draft.effectiveDraft.value.plugins ?? {}; | ||
| if (card.pendingNew) { | ||
| hints.push({ key: 'new', label: 'new', severity: 'info' }); | ||
| } else if (pending && !card.removed && !effDraft[card.name]) { |
| const existingPluginNames = computed(() => { | ||
| const names = new Set(props.cards.map((c) => c.name)); | ||
| for (const b of ws?.bases.value ?? []) | ||
| Object.keys(b.plugins ?? {}).forEach((n) => names.add(n)); | ||
| return Array.from(names); | ||
| }); |
| <AddPluginDialog | ||
| v-if="canAddPlugin" | ||
| v-model:visible="addPluginOpen" | ||
| :existing="existingPluginNames" | ||
| @add="addPlugin" |
cae8b8b to
dede9da
Compare
| > | ||
| {{ scheduleError }} | ||
| </p> | ||
| <p v-else-if="schedule" class="mt-1 text-xs text-gray-500"> |
There was a problem hiding this comment.
[Should-fix] UI-COMP-001 · Component convention not followed
Introduced in #339. text-gray-400/text-gray-500 with no dark: variant; 745 of 823 such class attributes in the repo pair them with dark:text-slate-*.
Why: Mixed patterns make components harder to maintain; there are no auto-imports.
Fix: Add the matching dark:text-slate-400/dark:text-slate-500 variant, as the neighbouring components do.
ccf-review · edbd0ded8977 · rules@6be9e11b8bc6
dede9da to
94d25b0
Compare
94d25b0 to
735e6b9
Compare
735e6b9 to
19a6e4a
Compare
19a6e4a to
9557aa9
Compare
9557aa9 to
922bc91
Compare
922bc91 to
5637b3c
Compare
Layer 18 of 21 in the stacked split of #318. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… a defined plugin - the tab's removal hint and the "Removed by overlay" card read plugins as own properties (getOwn), so a plugin named "constructor" is matched like any other - Add plugin refuses every name the saved overlay or the draft defines (non-null), not only the shown cards and loaded files: adding writes the whole plugin and replaced a saved definition this instance does not run yet - Add plugin waits, with the reason, until every reporting instance's file is loaded; the Effective view says files are loading, or names the ones that failed with a Retry Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
5637b3c to
c5da8fa
Compare


Part 18 of 21 of the stacked split of #318 (agent remote configuration). Every layer adds the final version of its files from #318, and only imports from layers below it, so each layer passes
make reviewableon its own. Nothing is reachable in the app until layer 20 wires the Configuration tab in.What
Plugin tabs in the Effective view, the add-plugin action/dialog (gated on what reporting instances support) and
AgentConfigEffectiveView.Tests
Specs for the Effective view and plugin library version.
Size exception
This PR is over the 1k-line limit (about 1,100 lines, package-lock excluded) and carries the
size-exceptionlabel. Fixes from the stack's review (plugin lookups by own name, Add plugin refusing names the saved overlay defines, Add plugin and the Effective view waiting for every instance file with a Retry) change components this layer introduces, and their regression spec (PluginTabsWorkspace.spec.ts) needs those components, so neither can move to another layer.🤖 Generated with Claude Code