Skip to content

fix: session native tools and extensions details - #330

Merged
pedronauck merged 4 commits into
mainfrom
fix-details
Aug 8, 2026
Merged

pedronauck merged 4 commits into
mainfrom
fix-details

Conversation

@pedronauck

@pedronauck pedronauck commented Aug 8, 2026 •

Copy link
Copy Markdown
Member

Summary by CodeRabbit

  • New Features
    • Redesigned marketplace detail pages for skills, MCP servers, and extensions, with clearer metadata, trust, provenance, diagnostics, runtime, and management information.
    • Added dedicated MCP authorization and connection controls.
    • Added richer installed-skill and installed-extension views.
    • Replaced loop status selection with searchable filter controls.
  • Bug Fixes
    • Marketplace navigation now uses cleaner URLs while preserving the selected view and scope.
    • Bundled extension provenance and trust information is automatically reconciled and verified.
    • Live session data remains active for visible, non-minimized windows even when unfocused.
    • Extension log streams now confirm readiness before delivering entries.

@pedronauck pedronauck self-assigned this Aug 8, 2026
@greptile-apps

greptile-apps Bot commented Aug 8, 2026 •

Copy link
Copy Markdown

Too many files changed for review (177 files, 100 file limit).

Bypass the limit by tagging @greptile-apps to review.

@vercel

vercel Bot commented Aug 8, 2026 •

Copy link
Copy Markdown

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

Project Deployment Actions Updated (UTC)
compozy-site Ready Ready Preview Aug 8, 2026 2:13am

Request Review

@coderabbitai

coderabbitai Bot commented Aug 8, 2026 •

Copy link
Copy Markdown
Contributor

Review Change Stack

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: c8f56e27-aaaf-4648-980d-c03ba46c5dfc

📥 Commits

Reviewing files that changed from the base of the PR and between efa8f7d and d58f62f.

⛔ Files ignored due to path filters (4)
  • docs/qa/scenarios/ET-web-marketplace-detail-redesign.md is excluded by !**/*.md
  • docs/qa/scenarios/ET-web-marketplace-installed-management.md is excluded by !**/*.md
  • web/src/systems/marketplace/routes/marketplace-detail.stories.tsx is excluded by !**/*.stories.tsx
  • web/src/systems/marketplace/routes/marketplace.stories.tsx is excluded by !**/*.stories.tsx
📒 Files selected for processing (23)
  • extensions/dev-cycle/embed_test.go
  • internal/api/core/extensions_dev.go
  • internal/api/core/marketplace_installed_detail.go
  • internal/api/core/marketplace_list.go
  • internal/api/core/marketplace_paths.go
  • internal/api/httpapi/extension_logs_sse_test.go
  • internal/extension/provenance.go
  • internal/extension/registry_bundled.go
  • web/src/routes/_app/marketplace.$kind.$entryId.tsx
  • web/src/systems/marketplace/components/__tests__/marketplace-components.test.tsx
  • web/src/systems/marketplace/components/marketplace-card.tsx
  • web/src/systems/marketplace/components/marketplace-detail-extension-installed.tsx
  • web/src/systems/marketplace/components/marketplace-detail-extension-rail.tsx
  • web/src/systems/marketplace/components/marketplace-detail-lede.tsx
  • web/src/systems/marketplace/components/marketplace-detail-manage-state.tsx
  • web/src/systems/marketplace/components/marketplace-detail-mcp-topbar.tsx
  • web/src/systems/marketplace/components/marketplace-detail-mcp.tsx
  • web/src/systems/marketplace/components/marketplace-detail-shell.tsx
  • web/src/systems/marketplace/components/marketplace-detail-skill-installed.tsx
  • web/src/systems/marketplace/components/marketplace-detail.tsx
  • web/src/systems/marketplace/components/marketplace-kind-page.tsx
  • web/src/systems/marketplace/components/marketplace-ui.ts
  • web/src/systems/marketplace/hooks/use-marketplace-detail-mcp-server.ts

Disabled knowledge base sources:

  • Linear integration is disabled

You can enable these sources in your CodeRabbit configuration.


Walkthrough

The change reconciles bundled extension provenance, redesigns marketplace detail views and routing, adds Darwin MCP peer inspection, replaces loop status filtering, updates SSE handshakes, and bases live-data ownership on window stack activity.

Changes

Bundled provenance reconciliation

Layer / File(s) Summary
Provenance construction and normalization
internal/extension/provenance.go, internal/extension/registry_install.go, internal/extension/registry_scan.go
Bundled extensions use canonical bundled provenance with an official registry tier and verified checksum status.
Managed-install reconciliation
internal/extension/registry_bundled.go, extensions/dev-cycle/install.go, extensions/dev-cycle/embed_test.go
Matching bundled installs reconcile stale provenance without changing lifecycle state or installation time. Tests verify trust and idempotence.

Darwin MCP peer inspection

Layer / File(s) Summary
Darwin peer credential inspection
internal/mcp/peer_darwin.go, internal/mcp/peer_test.go
Darwin Unix connections expose peer credentials, process IDs, and executable paths with validation and contextual errors.

Marketplace detail redesign

Layer / File(s) Summary
Marketplace routing and management paths
internal/api/core/*, internal/settings/*, web/src/routes/..., web/src/systems/marketplace/..., web/src/storybook/*
Installed management paths omit tab=installed. The explicit market tab preserves market navigation and route context.
Marketplace detail shell and browse views
web/src/systems/marketplace/components/marketplace-detail-*.tsx
Shared detail components support separate skill, MCP, and extension browse views.
Installed detail and MCP actions
web/src/systems/marketplace/components/marketplace-detail-*.tsx, web/src/systems/marketplace/hooks/*, web/src/systems/os/apps/marketplace/*, web/src/systems/extensions/components/*
Installed skill and extension views expose management and runtime data. MCP top-bar actions resolve installed servers and handle authorization.
Marketplace behavior validation
web/src/systems/marketplace/components/__tests__/*, internal/api/core/marketplace_test.go
Tests cover routing, detail rendering, management actions, provenance, authorization, and clean paths.

Loop catalog filters

Layer / File(s) Summary
Status filter chips
web/src/systems/loops/components/catalog/loop-catalog-filters.tsx, web/src/systems/loops/lib/loop-list-filters.ts, web/src/systems/loops/lib/__tests__/loop-list-filters.test.ts
The native status selector is replaced with shared filter fields and validated status chips.

Window live-data eligibility

Layer / File(s) Summary
Stack-active live data ownership
web/src/systems/os/hooks/use-window-live-data-enabled.ts, web/src/systems/os/apps/dashboard/__tests__/dashboard-window.test.tsx, web/src/systems/os/apps/session/__tests__/session-window.test.tsx
Visible, non-minimized windows remain live when their stack position is active, regardless of focus.

Extension log stream handshake

Layer / File(s) Summary
SSE readiness handshake
internal/api/core/extensions_dev.go, internal/api/httpapi/extension_logs_sse_test.go
Extension log streams emit a readiness comment before log frames. Tests validate the handshake and log-frame parsing.

Settings import paths

Layer / File(s) Summary
Direct settings imports
web/src/systems/settings/hooks/use-settings-network-page.ts, web/src/systems/settings/hooks/use-settings-providers-page.ts, web/src/systems/settings/hooks/use-settings-skills-page.ts
Settings hooks use direct local imports for APIs, types, and hooks.

Estimated code review effort: 5 (Critical) | ~120 minutes

Sequence Diagram(s)

sequenceDiagram
  participant User
  participant MarketplaceRoute
  participant MarketplaceDetail
  participant InstalledState
  participant MCPServer
  User->>MarketplaceRoute: open marketplace entry
  MarketplaceRoute->>MarketplaceDetail: pass kind, entry ID, and market tab
  MarketplaceDetail->>InstalledState: load installed detail state
  InstalledState->>MCPServer: resolve installed server and authorization state
  MCPServer-->>InstalledState: return runtime and authorization data
  InstalledState-->>MarketplaceDetail: render management detail
  MarketplaceDetail-->>User: display detail sections and actions
Loading
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 23.76% 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 references session and extension detail changes, which are present, but it does not clearly summarize the broader marketplace, provenance, routing, and UI changes.
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.
✨ 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 fix-details

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.

@github-actions

github-actions Bot commented Aug 8, 2026 •

Copy link
Copy Markdown
Contributor

React Doctor found 1 new issue in 1 file · 1 error · score 84 / 100 (Needs work) · 0 fixed · vs main

Errors

Reviewed by React Doctor for commit d58f62f. See inline comments for fixes.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 10

🧹 Nitpick comments (14)
internal/extension/provenance.go (1)

126-135: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Make the ChecksumVerified rule explicit per source.

ChecksumVerified: source != SourceMarketplace marks every non-marketplace source as checksum-verified, including SourceUser and SourceWorkspace. The sibling helper LocalPathProvenance (lines 100-109) sets ChecksumVerified: false for local paths and attaches an unverified diagnostic. The two paths now disagree for the same kind of local install. A reader cannot tell which rule is authoritative.

Consider a switch on source so each source states its own verification and tier, instead of one negated comparison plus a follow-up if.

♻️ Suggested clarification
-	provenance := ExtensionProvenance{
-		InstalledFrom:    installedFromForSource(source),
-		SourceURL:        strings.TrimSpace(sourceURL),
-		ChecksumSHA256:   strings.TrimSpace(checksum),
-		ChecksumVerified: source != SourceMarketplace,
-		RegistryTier:     ExtensionRegistryTierUnverified,
-		Permissions:      append([]string(nil), permissions...),
-		InstalledAt:      installedAt.UTC(),
-		InstalledBy:      extensionTrustInstalledByOperator,
-	}
-	if source == SourceBundled {
-		provenance.RegistryTier = ExtensionRegistryTierOfficial
-	}
-	return provenance
+	provenance := ExtensionProvenance{
+		InstalledFrom:  installedFromForSource(source),
+		SourceURL:      strings.TrimSpace(sourceURL),
+		ChecksumSHA256: strings.TrimSpace(checksum),
+		RegistryTier:   ExtensionRegistryTierUnverified,
+		Permissions:    append([]string(nil), permissions...),
+		InstalledAt:    installedAt.UTC(),
+		InstalledBy:    extensionTrustInstalledByOperator,
+	}
+	switch source {
+	case SourceBundled:
+		// First-party artifact: checksum is computed from the embedded payload.
+		provenance.ChecksumVerified = true
+		provenance.RegistryTier = ExtensionRegistryTierOfficial
+	case SourceMarketplace:
+		// Remote archive: verification happens in the marketplace install path.
+		provenance.ChecksumVerified = false
+	default:
+		// Local path installs: checksum is recomputed at install time.
+		provenance.ChecksumVerified = true
+	}
+	return provenance
🤖 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 `@internal/extension/provenance.go` around lines 126 - 135, Update the
provenance construction around ExtensionProvenance to use an explicit
source-based switch for ChecksumVerified and RegistryTier, rather than source !=
SourceMarketplace. Ensure SourceMarketplace, SourceUser, and SourceWorkspace
each state their intended verification and tier consistently with
LocalPathProvenance, while preserving the existing permissions, timestamps,
installer, and checksum fields.
internal/extension/registry_bundled.go (1)

30-47: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Log the provenance rewrite.

This function rewrites persisted trust evidence for an installed extension and produces no log record and no event. An operator cannot tell later that the stored provenance changed, or why the trust decision moved from blocked to verified. Add an slog record with the extension name, the previous installed_from, and the previous registry_tier before the update.

The coding guidelines require slog in internal production code and a canonical event for every domain operation.

♻️ Suggested addition
 	if bytes.Equal(currentJSON, provenanceJSON) {
 		return nil
 	}
+	slog.Info(
+		"reconciling bundled extension provenance",
+		"extension", info.Name,
+		"previous_installed_from", info.Provenance.InstalledFrom,
+		"previous_registry_tier", info.Provenance.RegistryTier,
+		"registry_tier", provenance.RegistryTier,
+	)
 	result, err := r.db.ExecContext(
🤖 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 `@internal/extension/registry_bundled.go` around lines 30 - 47, Before
rewriting persisted provenance in the function containing the
`extensionInstallProvenance` comparison, emit the canonical provenance-update
event and an `slog` record. Include the extension name plus the previous
provenance’s `installed_from` and `registry_tier`, and ensure the event/log
occurs only when `bytes.Equal(currentJSON, provenanceJSON)` is false and before
persistence.

Source: Coding guidelines

extensions/dev-cycle/embed_test.go (1)

172-172: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Assert against the exported constant instead of the literal.

Both assertions compare InstalledFrom with the literal "bundled". The PR adds extensionpkg.ExtensionInstalledFromBundled for this value, and the adjacent assertions already use exported constants. Use the constant so the test tracks the contract rather than a copied string.

💚 Proposed fix
-		if installed.Provenance.InstalledFrom != "bundled" ||
+		if installed.Provenance.InstalledFrom != extensionpkg.ExtensionInstalledFromBundled ||
 			installed.Provenance.RegistryTier != extensionpkg.ExtensionRegistryTierOfficial ||
-		if after.Provenance.InstalledFrom != "bundled" ||
+		if after.Provenance.InstalledFrom != extensionpkg.ExtensionInstalledFromBundled ||
 			after.Provenance.RegistryTier != extensionpkg.ExtensionRegistryTierOfficial ||

Also applies to: 334-334

🤖 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 `@extensions/dev-cycle/embed_test.go` at line 172, Update both assertions on
installed.Provenance.InstalledFrom in the relevant test to compare against the
exported extensionpkg.ExtensionInstalledFromBundled constant instead of the
duplicated "bundled" literal, matching the adjacent assertions.
internal/api/core/marketplace_installed_detail.go (1)

128-128: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Centralize the installed marketplace manage paths. internal/api/core/marketplace_paths.go already holds marketplaceExtensionsInstalledPath, but the MCP and skill paths remain inline literals at four sites. Declare matching constants and reference them everywhere.

  • internal/api/core/marketplace_installed_detail.go#L128-L128: replace the /marketplace/mcps literal, and the /marketplace/skills literal at line 191, with the new constants.
  • internal/api/core/marketplace_list.go#L257-L320: replace the /marketplace/mcps literal at line 257 and the /marketplace/skills literal at line 320 with the same constants.
🤖 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 `@internal/api/core/marketplace_installed_detail.go` at line 128, Centralize
the installed marketplace manage paths by declaring constants alongside
marketplaceExtensionsInstalledPath in marketplace_paths.go, then update
internal/api/core/marketplace_installed_detail.go lines 128-191 and
internal/api/core/marketplace_list.go lines 257-320 to use those constants
instead of inline MCP and skill path literals.
internal/api/core/marketplace_list.go (1)

257-257: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Reuse shared path constants here too.

These two literals duplicate the values used in internal/api/core/marketplace_installed_detail.go. Replace them with the shared constants declared in internal/api/core/marketplace_paths.go.

Also applies to: 320-320

🤖 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 `@internal/api/core/marketplace_list.go` at line 257, Replace the duplicated
managePath literals in the marketplace list entries with the shared path
constants from marketplace_paths.go, including the occurrence near line 320.
Reuse the existing constants without changing the surrounding marketplace
behavior.
web/src/systems/marketplace/components/marketplace-detail.tsx (1)

27-41: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Consider a kind-to-view map.

Three independent ternaries render the kind views. An unrecognized kind renders the lede with no body and no diagnostic. A small record keyed by kind makes the dispatch exhaustive and keeps the JSX flat.

🤖 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 `@web/src/systems/marketplace/components/marketplace-detail.tsx` around lines
27 - 41, Replace the independent kind checks in the marketplace detail component
with a kind-to-view record keyed by the supported marketplace kinds, then render
the selected view through that map while preserving the existing props for each
view. Make the dispatch exhaustive so an unrecognized kind produces an explicit
diagnostic instead of rendering only the lede.
web/src/systems/marketplace/components/marketplace-kind-page.tsx (1)

113-122: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Consider limiting config_scope to MCP routes.

page.mcpConfigScope always resolves to a value, because the hook derives a default when search.config_scope is absent. Every kind link therefore emits config_scope in the URL, including the skills and extensions routes where the value has no effect. Pass the parameter only when the destination is the MCP route, or only when the current search already carries it.

♻️ Proposed change
               render={
                 <Link
                   search={{
-                    config_scope: page.mcpConfigScope,
+                    config_scope: item.kind === "mcp" ? page.mcpConfigScope : undefined,
                     q: page.query || undefined,
                     tab: page.scope === "market" ? "market" : undefined,
                   }}
                   to={item.to}
                 />
               }
🤖 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 `@web/src/systems/marketplace/components/marketplace-kind-page.tsx` around
lines 113 - 122, Update the kind-link `Link` search configuration so
`config_scope` is included only for MCP destinations, or when the current search
explicitly contains it, instead of always using the defaulted
`page.mcpConfigScope`. Preserve the existing query and tab behavior for skills,
extensions, and MCP routes.
web/src/systems/marketplace/components/marketplace-detail-shell.tsx (2)

17-24: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Confirm the fixed rail width matches the documented 320px contract.

The doc comment at Lines 6-10 states a 320px rail. The grid template uses 20rem. Those match only while the root font size is 16px. If the design system defines a rail width token, use it instead of the literal 20rem.

As per coding guidelines: "Use tokens from packages/ui/src/tokens.css and DESIGN.md for all color, type, radius, spacing, and motion values; do not invent design values."

🤖 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 `@web/src/systems/marketplace/components/marketplace-detail-shell.tsx` around
lines 17 - 24, Update the rail column definition in MarketplaceDetailColumns to
use the existing design-system token for the documented 320px rail width, rather
than the literal 20rem value. Reuse the token defined in
packages/ui/src/tokens.css or DESIGN.md and preserve the current responsive grid
behavior.

Source: Coding guidelines


44-44: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Remove manual useId wiring on Collapsible components. @compozy/ui’s Collapsible delegates to @base-ui/react/collapsible, which automatically associates trigger and content. The useId().replace(/:/g, "") value is not needed, at both marketplace-detail-shell.tsx:44 and marketplace-detail-shell.tsx:145.

🤖 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 `@web/src/systems/marketplace/components/marketplace-detail-shell.tsx` at line
44, Remove the manual useId-based panelId wiring from both Collapsible usages in
marketplace-detail-shell.tsx at lines 44-44 and 145-145; remove the associated
panelId references and rely on Collapsible’s automatic trigger/content
association.
web/src/systems/marketplace/components/marketplace-detail-mcp.tsx (1)

322-327: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Use cn for the status cell classes.

The rest of this file and marketplace-detail-shell.tsx compose classes with cn. This helper concatenates strings manually and encodes the grid position rules in index arithmetic, which breaks silently if the cell count changes.

♻️ Proposed refactor
-function cnStatusCell(index: number): string {
-  const base = "flex flex-col items-start gap-1.5 px-3.5 py-2.5";
-  const divider = index % 2 === 0 ? " border-r border-line-soft" : "";
-  const top = index >= 2 ? " border-t border-line-soft" : "";
-  return `${base}${divider}${top}`;
-}
+const STATUS_CELL_CLASS = cn(
+  "flex flex-col items-start gap-1.5 px-3.5 py-2.5",
+  "border-line-soft not-nth-[2n]:border-r [&:nth-child(n+3)]:border-t"
+);

An equivalent option is to keep the function and wrap the parts in cn.

🤖 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 `@web/src/systems/marketplace/components/marketplace-detail-mcp.tsx` around
lines 322 - 327, Update cnStatusCell to compose its conditional status-cell
classes with the existing cn utility instead of manual string interpolation.
Preserve the current base, divider, and top-border class rules while passing
them as separate conditional arguments, avoiding index-derived concatenation
that can silently break when the grid changes.
web/src/systems/marketplace/hooks/use-marketplace-detail-mcp-server.ts (1)

22-24: 🎯 Functional Correctness | 🔵 Trivial | 💤 Low value

The entry.name fallback can bind the wrong server.

entry.name is the catalog display name. server.name is the installed identity. If a catalog entry's display name equals an unrelated installed server name, this fallback resolves the wrong row, and the detail view then shows that server's status, tools, and registration. Consider restricting the fallback to catalog_entry, or comparing a normalized slug rather than the display name.

🤖 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 `@web/src/systems/marketplace/hooks/use-marketplace-detail-mcp-server.ts`
around lines 22 - 24, Update the server lookup around the find callback to avoid
matching server.name against entry.name, since display names can identify
unrelated installed servers. Restrict matching to the catalog_entry identity, or
use an established normalized-slug comparison if one already exists, while
preserving the existing catalog entry match behavior.
web/src/systems/marketplace/components/marketplace-detail-mcp-topbar.tsx (1)

64-99: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Extract the duplicated fallback branch.

The branch at Lines 64-76 and the branch at Lines 82-99 render the same MarketplaceEntryStatus and MarketplaceEntryAction pair. Only the MCPAuthorizeDialog differs. Extract the shared pair into a local component and render the dialog conditionally.

♻️ Proposed refactor
+  const standardHead = (
+    <>
+      <MarketplaceEntryStatus entry={entry} />
+      <MarketplaceEntryAction
+        emphasis="primary"
+        entry={entry}
+        onAction={onAction}
+        pending={pending}
+      />
+    </>
+  );
+
+  if (!polledServer) return standardHead;
+
+  const status = composeMCPRowStatus(polledServer);
+  const label = status.authorizeLabel;
+  const authFilter = deriveMCPAuthFilter(polledServer);
+
+  if (!label) {
+    return (
+      <>
+        {standardHead}
+        <MCPAuthorizeDialog
+          authorize={authorize}
+          scope={authFilter?.scope ?? "global"}
+          server={polledServer}
+        />
+      </>
+    );
+  }
🤖 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 `@web/src/systems/marketplace/components/marketplace-detail-mcp-topbar.tsx`
around lines 64 - 99, In the component containing the polledServer status flow,
extract the shared MarketplaceEntryStatus and MarketplaceEntryAction pair into a
local component or reusable render path. Use it in both the !polledServer branch
and the !label branch, while rendering MCPAuthorizeDialog only conditionally for
the latter with its existing authorize, scope, and server props.
web/src/systems/marketplace/components/marketplace-detail-extension-installed.tsx (1)

363-364: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Pass facts into the runtime card instead of recomputing it.

The parent computes facts at Line 96 and passes it to MarketplaceExtensionManageCard and MarketplaceExtensionProvenanceCard. MarketplaceExtensionRuntimeCard calls extensionTrustFacts(extension) again. Reuse the single computed value so all cards read identical facts and the derivation runs once per render.

♻️ Proposed refactor
-function MarketplaceExtensionRuntimeCard({ extension }: { extension: ExtensionEntry }) {
-  const facts = extensionTrustFacts(extension);
+function MarketplaceExtensionRuntimeCard({
+  extension,
+  facts,
+}: {
+  extension: ExtensionEntry;
+  facts: ReturnType<typeof extensionTrustFacts>;
+}) {

Update the call site at Line 121:

-            <MarketplaceExtensionRuntimeCard extension={extension} />
+            <MarketplaceExtensionRuntimeCard extension={extension} facts={facts} />
🤖 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
`@web/src/systems/marketplace/components/marketplace-detail-extension-installed.tsx`
around lines 363 - 364, Update MarketplaceExtensionRuntimeCard to accept the
already-derived facts value as a prop, remove its direct
extensionTrustFacts(extension) call, and pass facts from the parent call site
alongside the other cards so trust facts are computed once and shared
consistently.
web/src/systems/marketplace/components/marketplace-detail-skill-installed.tsx (1)

153-192: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Reuse the shared manage-fallback instead of duplicating it.

MarketplaceSkillManageFallback repeats the layout, spinner and alert icons, testId scheme, error paragraph, and retry button of MarketplaceDetailManageFallbackCard in web/src/systems/marketplace/components/marketplace-detail-manage-state.tsx, which the installed-extension detail already uses. Two copies of the same failure-state contract will diverge. Extract the inner body of the shared component (for example MarketplaceDetailManageFallbackBody) and consume it from both files, keeping the card wrapper optional.

🤖 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
`@web/src/systems/marketplace/components/marketplace-detail-skill-installed.tsx`
around lines 153 - 192, Extract the duplicated loading/error content from
MarketplaceSkillManageFallback into a shared component such as
MarketplaceDetailManageFallbackBody in marketplace-detail-manage-state.tsx.
Reuse that body from both MarketplaceDetailManageFallbackCard and
MarketplaceSkillManageFallback, keeping the card wrapper optional while
preserving the existing loading/error states, test IDs, message, error details,
icons, and retry behavior.
🤖 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 `@extensions/dev-cycle/embed_test.go`:
- Around line 303-307: Update the stale fixture in the provenance test by
inverting stale.ChecksumVerified and stale.AllowUnverified from their asserted
expected values, while preserving the existing assertions around
extensionInstallProvenance so the test independently verifies repair of all four
provenance fields.

In `@internal/extension/provenance.go`:
- Around line 119-140: Update extensionInstallProvenance so SourceUser and
SourceWorkspace remain checksum-unverified; do not derive ChecksumVerified
solely from source != SourceMarketplace. Preserve the existing unverified
RegistryTier and ensure exposed provenance and event payloads never claim local
extensions are checksum verified.

In `@internal/extension/registry_bundled.go`:
- Around line 48-64: Update the affected-row validation in the bundled
provenance reconciliation flow after RowsAffected to treat affected == 0 as a
successful no-op, while still returning an error when affected > 1. Preserve the
existing ExecContext, RowsAffected error handling, and single-row success
behavior.

In `@web/src/routes/_app/marketplace`.$kind.$entryId.tsx:
- Around line 14-20: Update the marketplace detail navigation search in
web/src/routes/_app/marketplace.$kind.$entryId.tsx lines 14-20 and the
corresponding MarketplaceCard navigation in
web/src/systems/marketplace/components/marketplace-card.tsx lines 40-50 to use a
shallow search update that preserves existing scope and workspace_id parameters
while setting tab to "market"; do not replace the full search object with only
the tab value.

In
`@web/src/systems/marketplace/components/__tests__/marketplace-components.test.tsx`:
- Around line 1532-1533: Update the marketplace card link and its test
expectation to use the declared detail-route shape
`/_app/marketplace/$kind/$entryId`, such as
`/marketplace/skill/git-flow?tab=market`, instead of the nonexistent
`/marketplace/skill/docs-sync?tab=market` path; keep the `/marketplace/skills`
route check unchanged.

In `@web/src/systems/marketplace/components/marketplace-detail-lede.tsx`:
- Around line 63-65: Update the marketplace detail rendering around
entry.description to trim and validate the value before rendering the paragraph.
Render the existing description <p> only when the trimmed description is
non-empty, and use the trimmed value for its content while preserving the
current styling.

In `@web/src/systems/marketplace/components/marketplace-detail-mcp-topbar.tsx`:
- Around line 49-62: Update the MCP authorization polling flow around
authPollQuery and the useEffect to handle authPollQuery.error instead of
silently falling back to stale server data. Store or propagate the polling error
through the existing authorization state, then render it in the authorize
dialog/topbar flow so failures are surfaced and awaiting authorization can exit
or display the error.

In `@web/src/systems/marketplace/components/marketplace-detail-mcp.tsx`:
- Around line 46-69: Update the installedUnresolved fallback in the marketplace
MCP detail component to distinguish a disabled workspace-scoped query from an
actual loading or error state. When queryEnabled is false because no workspace
is selected, avoid rendering the retry-based MarketplaceDetailManageFallbackCard
and show the appropriate workspace-selection message instead; preserve the
existing fallback behavior for enabled queries.
- Around line 107-122: Align the banner condition in
MarketplaceMCPAuthorizationSection with the topbar button’s
composeMCPRowStatus(server).authorizeLabel logic so it only promises an
Authorize button when that button is rendered. Preserve the existing OAuth
banner behavior, and handle non-OAuth states such as stdio needs_login by
suppressing the banner or using copy and an action target that actually exists.

In
`@web/src/systems/marketplace/components/marketplace-detail-skill-installed.tsx`:
- Around line 331-335: Update both error-rendering sections in
web/src/systems/marketplace/components/marketplace-detail-skill-installed.tsx at
lines 331-335 and 403-406 to use a trimmed non-empty error message, falling back
to the existing section-specific text when empty or whitespace-only. Apply this
to the content-load error and skill-resolution error handling.

---

Nitpick comments:
In `@extensions/dev-cycle/embed_test.go`:
- Line 172: Update both assertions on installed.Provenance.InstalledFrom in the
relevant test to compare against the exported
extensionpkg.ExtensionInstalledFromBundled constant instead of the duplicated
"bundled" literal, matching the adjacent assertions.

In `@internal/api/core/marketplace_installed_detail.go`:
- Line 128: Centralize the installed marketplace manage paths by declaring
constants alongside marketplaceExtensionsInstalledPath in marketplace_paths.go,
then update internal/api/core/marketplace_installed_detail.go lines 128-191 and
internal/api/core/marketplace_list.go lines 257-320 to use those constants
instead of inline MCP and skill path literals.

In `@internal/api/core/marketplace_list.go`:
- Line 257: Replace the duplicated managePath literals in the marketplace list
entries with the shared path constants from marketplace_paths.go, including the
occurrence near line 320. Reuse the existing constants without changing the
surrounding marketplace behavior.

In `@internal/extension/provenance.go`:
- Around line 126-135: Update the provenance construction around
ExtensionProvenance to use an explicit source-based switch for ChecksumVerified
and RegistryTier, rather than source != SourceMarketplace. Ensure
SourceMarketplace, SourceUser, and SourceWorkspace each state their intended
verification and tier consistently with LocalPathProvenance, while preserving
the existing permissions, timestamps, installer, and checksum fields.

In `@internal/extension/registry_bundled.go`:
- Around line 30-47: Before rewriting persisted provenance in the function
containing the `extensionInstallProvenance` comparison, emit the canonical
provenance-update event and an `slog` record. Include the extension name plus
the previous provenance’s `installed_from` and `registry_tier`, and ensure the
event/log occurs only when `bytes.Equal(currentJSON, provenanceJSON)` is false
and before persistence.

In
`@web/src/systems/marketplace/components/marketplace-detail-extension-installed.tsx`:
- Around line 363-364: Update MarketplaceExtensionRuntimeCard to accept the
already-derived facts value as a prop, remove its direct
extensionTrustFacts(extension) call, and pass facts from the parent call site
alongside the other cards so trust facts are computed once and shared
consistently.

In `@web/src/systems/marketplace/components/marketplace-detail-mcp-topbar.tsx`:
- Around line 64-99: In the component containing the polledServer status flow,
extract the shared MarketplaceEntryStatus and MarketplaceEntryAction pair into a
local component or reusable render path. Use it in both the !polledServer branch
and the !label branch, while rendering MCPAuthorizeDialog only conditionally for
the latter with its existing authorize, scope, and server props.

In `@web/src/systems/marketplace/components/marketplace-detail-mcp.tsx`:
- Around line 322-327: Update cnStatusCell to compose its conditional
status-cell classes with the existing cn utility instead of manual string
interpolation. Preserve the current base, divider, and top-border class rules
while passing them as separate conditional arguments, avoiding index-derived
concatenation that can silently break when the grid changes.

In `@web/src/systems/marketplace/components/marketplace-detail-shell.tsx`:
- Around line 17-24: Update the rail column definition in
MarketplaceDetailColumns to use the existing design-system token for the
documented 320px rail width, rather than the literal 20rem value. Reuse the
token defined in packages/ui/src/tokens.css or DESIGN.md and preserve the
current responsive grid behavior.
- Line 44: Remove the manual useId-based panelId wiring from both Collapsible
usages in marketplace-detail-shell.tsx at lines 44-44 and 145-145; remove the
associated panelId references and rely on Collapsible’s automatic
trigger/content association.

In
`@web/src/systems/marketplace/components/marketplace-detail-skill-installed.tsx`:
- Around line 153-192: Extract the duplicated loading/error content from
MarketplaceSkillManageFallback into a shared component such as
MarketplaceDetailManageFallbackBody in marketplace-detail-manage-state.tsx.
Reuse that body from both MarketplaceDetailManageFallbackCard and
MarketplaceSkillManageFallback, keeping the card wrapper optional while
preserving the existing loading/error states, test IDs, message, error details,
icons, and retry behavior.

In `@web/src/systems/marketplace/components/marketplace-detail.tsx`:
- Around line 27-41: Replace the independent kind checks in the marketplace
detail component with a kind-to-view record keyed by the supported marketplace
kinds, then render the selected view through that map while preserving the
existing props for each view. Make the dispatch exhaustive so an unrecognized
kind produces an explicit diagnostic instead of rendering only the lede.

In `@web/src/systems/marketplace/components/marketplace-kind-page.tsx`:
- Around line 113-122: Update the kind-link `Link` search configuration so
`config_scope` is included only for MCP destinations, or when the current search
explicitly contains it, instead of always using the defaulted
`page.mcpConfigScope`. Preserve the existing query and tab behavior for skills,
extensions, and MCP routes.

In `@web/src/systems/marketplace/hooks/use-marketplace-detail-mcp-server.ts`:
- Around line 22-24: Update the server lookup around the find callback to avoid
matching server.name against entry.name, since display names can identify
unrelated installed servers. Restrict matching to the catalog_entry identity, or
use an established normalized-slug comparison if one already exists, while
preserving the existing catalog entry match behavior.
🪄 Autofix

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 Plus

Run ID: 47627486-a83a-4286-939b-16e5cfbcde87

📥 Commits

Reviewing files that changed from the base of the PR and between a46b424 and efa8f7d.

⛔ Files ignored due to path filters (106)
  • .github/workflows/ci.yml is excluded by !**/*.yml
  • docs/design/opendesign/.od-skills/web-prototype-04e8971585/SKILL.md is excluded by !docs/design/**/*, !**/*.md
  • docs/design/opendesign/.od-skills/web-prototype-04e8971585/assets/template.html is excluded by !docs/design/**/*
  • docs/design/opendesign/.od-skills/web-prototype-04e8971585/example.html is excluded by !docs/design/**/*
  • docs/design/opendesign/.od-skills/web-prototype-04e8971585/open-design.json is excluded by !docs/design/**/*, !**/*.json
  • docs/design/opendesign/.od-skills/web-prototype-04e8971585/references/checklist.md is excluded by !docs/design/**/*, !**/*.md
  • docs/design/opendesign/.od-skills/web-prototype-04e8971585/references/layouts.md is excluded by !docs/design/**/*, !**/*.md
  • docs/design/opendesign/CleanShot-2026-08-02-at-00.46.42_2x.png is excluded by !**/*.png, !docs/design/**/*
  • docs/design/opendesign/_captures/loops-index.png is excluded by !**/*.png, !docs/design/**/*
  • docs/design/opendesign/_captures/loops-loop-detail.png is excluded by !**/*.png, !docs/design/**/*
  • docs/design/opendesign/_captures/loops-loop-editor-states.png is excluded by !**/*.png, !docs/design/**/*
  • docs/design/opendesign/_captures/loops-loop-editor.png is excluded by !**/*.png, !docs/design/**/*
  • docs/design/opendesign/_captures/loops-loop-inventories.png is excluded by !**/*.png, !docs/design/**/*
  • docs/design/opendesign/_captures/loops-loop-node-controls.png is excluded by !**/*.png, !docs/design/**/*
  • docs/design/opendesign/_captures/loops-loop-quarantine-sheet.png is excluded by !**/*.png, !docs/design/**/*
  • docs/design/opendesign/_captures/loops-loop-run-detail-states.png is excluded by !**/*.png, !docs/design/**/*
  • docs/design/opendesign/_captures/loops-loop-run-detail.png is excluded by !**/*.png, !docs/design/**/*
  • docs/design/opendesign/_captures/loops-loop-run-form.png is excluded by !**/*.png, !docs/design/**/*
  • docs/design/opendesign/_captures/loops-loops-catalog.png is excluded by !**/*.png, !docs/design/**/*
  • docs/design/opendesign/_captures/site-docs-landing.png is excluded by !**/*.png, !docs/design/**/*
  • docs/design/opendesign/_captures/site-docs-sidebar.png is excluded by !**/*.png, !docs/design/**/*
  • docs/design/opendesign/_captures/site-example-page.png is excluded by !**/*.png, !docs/design/**/*
  • docs/design/opendesign/_captures/site-marketplace-detail.png is excluded by !**/*.png, !docs/design/**/*
  • docs/design/opendesign/_captures/site-marketplace-hero-v2.png is excluded by !**/*.png, !docs/design/**/*
  • docs/design/opendesign/_captures/site-marketplace-list.png is excluded by !**/*.png, !docs/design/**/*
  • docs/design/opendesign/_captures/site-marketplace.png is excluded by !**/*.png, !docs/design/**/*
  • docs/design/opendesign/_done/marketplace/UNIFIED-CATALOG-SPEC.md is excluded by !docs/design/**/*, !**/*.md
  • docs/design/opendesign/_done/session/SESSION-REDESIGN-SPEC.md is excluded by !docs/design/**/*, !**/*.md
  • docs/design/opendesign/_done/session/_vc-capture-fast.html is excluded by !docs/design/**/*
  • docs/design/opendesign/_done/session/_vc-capture-fast.html.artifact.json is excluded by !docs/design/**/*, !**/*.json
  • docs/design/opendesign/_done/session/_vc-capture-normal.html is excluded by !docs/design/**/*
  • docs/design/opendesign/_done/session/_vc-capture-normal.html.artifact.json is excluded by !docs/design/**/*, !**/*.json
  • docs/design/opendesign/_done/session/index.html is excluded by !docs/design/**/*
  • docs/design/opendesign/_done/session/index.html.artifact.json is excluded by !docs/design/**/*, !**/*.json
  • docs/design/opendesign/_done/session/runtime-selector-variations.html is excluded by !docs/design/**/*
  • docs/design/opendesign/_done/session/runtime-selector-variations.html.artifact.json is excluded by !docs/design/**/*, !**/*.json
  • docs/design/opendesign/_done/session/session-chat.html is excluded by !docs/design/**/*
  • docs/design/opendesign/_done/session/session-chat.html.artifact.json is excluded by !docs/design/**/*, !**/*.json
  • docs/design/opendesign/_done/session/session-design-system.html is excluded by !docs/design/**/*
  • docs/design/opendesign/_done/session/session-design-system.html.artifact.json is excluded by !docs/design/**/*, !**/*.json
  • docs/design/opendesign/_done/session/session-sidebar.html is excluded by !docs/design/**/*
  • docs/design/opendesign/_done/session/session-sidebar.html.artifact.json is excluded by !docs/design/**/*, !**/*.json
  • docs/design/opendesign/_done/session/session.css is excluded by !docs/design/**/*
  • docs/design/opendesign/_done/site/site-docs-landing.html is excluded by !docs/design/**/*
  • docs/design/opendesign/_done/site/site-docs-landing.html.artifact.json is excluded by !docs/design/**/*, !**/*.json
  • docs/design/opendesign/_done/site/site-docs-sidebar.html is excluded by !docs/design/**/*
  • docs/design/opendesign/_done/site/site-docs-sidebar.html.artifact.json is excluded by !docs/design/**/*, !**/*.json
  • docs/design/opendesign/_done/site/site-example-page.html is excluded by !docs/design/**/*
  • docs/design/opendesign/_done/site/site-example-page.html.artifact.json is excluded by !docs/design/**/*, !**/*.json
  • docs/design/opendesign/_done/site/site-marketplace-detail.html is excluded by !docs/design/**/*
  • docs/design/opendesign/_done/site/site-marketplace-detail.html.artifact.json is excluded by !docs/design/**/*, !**/*.json
  • docs/design/opendesign/_done/site/site-marketplace-list.html is excluded by !docs/design/**/*
  • docs/design/opendesign/_done/site/site-marketplace-list.html.artifact.json is excluded by !docs/design/**/*, !**/*.json
  • docs/design/opendesign/_done/site/site-marketplace.html is excluded by !docs/design/**/*
  • docs/design/opendesign/_done/site/site-marketplace.html.artifact.json is excluded by !docs/design/**/*, !**/*.json
  • docs/design/opendesign/_done/site/site.css is excluded by !docs/design/**/*
  • docs/design/opendesign/_done/site/site.js is excluded by !docs/design/**/*
  • docs/design/opendesign/empty-states/jobs-empty-suggestions.html is excluded by !docs/design/**/*
  • docs/design/opendesign/empty-states/jobs-empty-suggestions.html.artifact.json is excluded by !docs/design/**/*, !**/*.json
  • docs/design/opendesign/empty-states/tasks-empty-templates.html is excluded by !docs/design/**/*
  • docs/design/opendesign/empty-states/tasks-empty-templates.html.artifact.json is excluded by !docs/design/**/*, !**/*.json
  • docs/design/opendesign/empty-states/triggers-empty-suggestions.html is excluded by !docs/design/**/*
  • docs/design/opendesign/empty-states/triggers-empty-suggestions.html.artifact.json is excluded by !docs/design/**/*, !**/*.json
  • docs/design/opendesign/marketplace/extension-detail.html is excluded by !docs/design/**/*
  • docs/design/opendesign/marketplace/extension-detail.html.artifact.json is excluded by !docs/design/**/*, !**/*.json
  • docs/design/opendesign/marketplace/index.html is excluded by !docs/design/**/*
  • docs/design/opendesign/marketplace/index.html.artifact.json is excluded by !docs/design/**/*, !**/*.json
  • docs/design/opendesign/marketplace/marketplace.css is excluded by !docs/design/**/*
  • docs/design/opendesign/marketplace/mcp-detail.html is excluded by !docs/design/**/*
  • docs/design/opendesign/marketplace/mcp-detail.html.artifact.json is excluded by !docs/design/**/*, !**/*.json
  • docs/design/opendesign/marketplace/skill-detail.html is excluded by !docs/design/**/*
  • docs/design/opendesign/marketplace/skill-detail.html.artifact.json is excluded by !docs/design/**/*, !**/*.json
  • docs/qa/charters/CH-bundled-extension-trust.md is excluded by !**/*.md
  • docs/qa/charters/CH-codex-native-tools-cgo0.md is excluded by !**/*.md
  • docs/qa/charters/CH-marketplace-installed-default.md is excluded by !**/*.md
  • docs/qa/charters/CH-visible-session-window-streams.md is excluded by !**/*.md
  • docs/qa/journeys/J-13-follow-a-live-run.md is excluded by !**/*.md
  • docs/qa/journeys/J-extension-kit-lifecycle.md is excluded by !**/*.md
  • docs/qa/journeys/J-extension-policy-admin.md is excluded by !**/*.md
  • docs/qa/journeys/J-marketplace-acquisition.md is excluded by !**/*.md
  • docs/qa/reports/2026-08-07-critical-runtime-ui-fixes.md is excluded by !**/*.md
  • docs/qa/scenarios/ET-001.md is excluded by !**/*.md
  • docs/qa/scenarios/ET-048.md is excluded by !**/*.md
  • docs/qa/scenarios/ET-bundled-extension-trust.md is excluded by !**/*.md
  • docs/qa/scenarios/ET-compozy-native-tool-invocation.md is excluded by !**/*.md
  • docs/qa/scenarios/ET-web-extension-detail.md is excluded by !**/*.md
  • docs/qa/scenarios/ET-web-extension-kit-inventory.md is excluded by !**/*.md
  • docs/qa/scenarios/ET-web-extensions-manage.md is excluded by !**/*.md
  • docs/qa/scenarios/ET-web-marketplace-installed-management.md is excluded by !**/*.md
  • docs/qa/scenarios/ET-web-marketplace-kind-navigation.md is excluded by !**/*.md
  • docs/qa/scenarios/ET-web-marketplace-landing-browse.md is excluded by !**/*.md
  • docs/qa/scenarios/ET-web-marketplace-mcp-authorize-installed.md is excluded by !**/*.md
  • docs/qa/scenarios/ET-web-mcp-remote-editor.md is excluded by !**/*.md
  • docs/qa/scenarios/ET-web-mcp-status-matrix.md is excluded by !**/*.md
  • docs/qa/scenarios/RT-visible-session-streaming.md is excluded by !**/*.md
  • internal/testutil/acpmock/testdata/os_shell_multi_session_fixture.json is excluded by !**/*.json
  • packages/site/content/docs/configuration/mcp-json.mdx is excluded by !**/*.mdx
  • packages/site/content/docs/marketplace/index.mdx is excluded by !**/*.mdx
  • skills/compozy/references/extensions.md is excluded by !**/*.md
  • web/e2e/__tests__/marketplace.spec.ts is excluded by !web/e2e/**
  • web/e2e/__tests__/os-shell.spec.ts is excluded by !web/e2e/**
  • web/e2e/__tests__/settings.spec.ts is excluded by !web/e2e/**
  • web/e2e/fixtures/__tests__/browser-artifact-session.test.ts is excluded by !**/fixtures/**, !web/e2e/**
  • web/src/systems/marketplace/components/stories/marketplace-overlays.stories.tsx is excluded by !**/*.stories.tsx
  • web/src/systems/marketplace/routes/marketplace.stories.tsx is excluded by !**/*.stories.tsx
  • web/src/systems/settings/routes/mcp-servers.stories.tsx is excluded by !**/*.stories.tsx
📒 Files selected for processing (65)
  • extensions/dev-cycle/embed_test.go
  • extensions/dev-cycle/install.go
  • internal/api/core/marketplace_installed_detail.go
  • internal/api/core/marketplace_list.go
  • internal/api/core/marketplace_paths.go
  • internal/api/core/marketplace_test.go
  • internal/api/core/settings_test.go
  • internal/extension/provenance.go
  • internal/extension/registry_bundled.go
  • internal/extension/registry_install.go
  • internal/extension/registry_scan.go
  • internal/mcp/peer_darwin.go
  • internal/mcp/peer_darwin_cgo.go
  • internal/mcp/peer_darwin_nocgo.go
  • internal/mcp/peer_test.go
  • internal/settings/section_skills_target.go
  • internal/settings/service_test.go
  • web/src/routes/_app/marketplace.$kind.$entryId.tsx
  • web/src/routes/_app/settings/-skills-settings-page.tsx
  • web/src/storybook/route-story-registry.ts
  • web/src/systems/extensions/components/extension-kit-inventory-panel.tsx
  • web/src/systems/extensions/components/extension-log-panel.tsx
  • web/src/systems/loops/components/__tests__/loop-catalog.test.tsx
  • web/src/systems/loops/components/catalog/loop-catalog-filters.tsx
  • web/src/systems/loops/lib/__tests__/loop-list-filters.test.ts
  • web/src/systems/loops/lib/loop-list-filters.ts
  • web/src/systems/marketplace/components/__tests__/marketplace-action-controller.test.tsx
  • web/src/systems/marketplace/components/__tests__/marketplace-components.test.tsx
  • web/src/systems/marketplace/components/__tests__/marketplace-detail-manage.test.tsx
  • web/src/systems/marketplace/components/index.ts
  • web/src/systems/marketplace/components/marketplace-card.tsx
  • web/src/systems/marketplace/components/marketplace-detail-extension-actions.tsx
  • web/src/systems/marketplace/components/marketplace-detail-extension-installed.tsx
  • web/src/systems/marketplace/components/marketplace-detail-extension-manage.tsx
  • web/src/systems/marketplace/components/marketplace-detail-extension-sections.tsx
  • web/src/systems/marketplace/components/marketplace-detail-extension.tsx
  • web/src/systems/marketplace/components/marketplace-detail-lede.tsx
  • web/src/systems/marketplace/components/marketplace-detail-manage-state.tsx
  • web/src/systems/marketplace/components/marketplace-detail-mcp-manage.tsx
  • web/src/systems/marketplace/components/marketplace-detail-mcp-topbar.tsx
  • web/src/systems/marketplace/components/marketplace-detail-mcp.tsx
  • web/src/systems/marketplace/components/marketplace-detail-meta.tsx
  • web/src/systems/marketplace/components/marketplace-detail-shell.tsx
  • web/src/systems/marketplace/components/marketplace-detail-skill-installed.tsx
  • web/src/systems/marketplace/components/marketplace-detail-skill-manage.tsx
  • web/src/systems/marketplace/components/marketplace-detail-skill.tsx
  • web/src/systems/marketplace/components/marketplace-detail-warnings.tsx
  • web/src/systems/marketplace/components/marketplace-detail.tsx
  • web/src/systems/marketplace/components/marketplace-kind-page.tsx
  • web/src/systems/marketplace/components/use-marketplace-action-controller.tsx
  • web/src/systems/marketplace/hooks/use-marketplace-detail-mcp-server.ts
  • web/src/systems/marketplace/hooks/use-marketplace-kind-page.ts
  • web/src/systems/marketplace/lib/marketplace-kind-search.ts
  • web/src/systems/marketplace/mocks/fixtures.ts
  • web/src/systems/os/apps/dashboard/__tests__/dashboard-window.test.tsx
  • web/src/systems/os/apps/marketplace/marketplace-detail-location.tsx
  • web/src/systems/os/apps/marketplace/marketplace-detail-search.ts
  • web/src/systems/os/apps/session/__tests__/session-window.test.tsx
  • web/src/systems/os/hooks/use-window-live-data-enabled.ts
  • web/src/systems/settings/adapters/__tests__/settings-api.test.ts
  • web/src/systems/settings/hooks/__tests__/use-settings-skills-page.test.tsx
  • web/src/systems/settings/hooks/use-settings-network-page.ts
  • web/src/systems/settings/hooks/use-settings-providers-page.ts
  • web/src/systems/settings/hooks/use-settings-skills-page.ts
  • web/src/systems/settings/mocks/fixtures.ts
💤 Files with no reviewable changes (7)
  • internal/mcp/peer_darwin_nocgo.go
  • internal/mcp/peer_darwin_cgo.go
  • web/src/systems/marketplace/components/marketplace-detail-mcp-manage.tsx
  • web/src/systems/marketplace/components/marketplace-detail-extension-manage.tsx
  • web/src/systems/marketplace/components/marketplace-detail-meta.tsx
  • web/src/systems/marketplace/components/marketplace-detail-skill-manage.tsx
  • web/src/systems/loops/components/tests/loop-catalog.test.tsx

Comment thread extensions/dev-cycle/embed_test.go Outdated
Comment thread internal/extension/provenance.go
Comment thread internal/extension/registry_bundled.go
Comment thread web/src/routes/_app/marketplace.$kind.$entryId.tsx
Comment on lines +1532 to 1533
"/marketplace/skills"
);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🗄️ Data Integrity & Integration | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Locate the marketplace route files and their search schemas.
fd -t f 'marketplace' web/src/routes

# Inspect the detail route search validation and the kind route.
fd -t f 'marketplace' web/src/routes --exec rg -n -C6 'validateSearch|tab|kind'

# Inspect the path helpers that build these links.
fd -t f 'marketplace-detail-search|marketplace-kind-search|marketplace-paths' web/src internal --exec rg -n -C6 'tab|market|installed'

Repository: compozy/compozy

Length of output: 4697


🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Inspect the marketplace test lines around the reviewed links and the utility paths used there.
sed -n '1515,1585p' web/src/systems/marketplace/components/__tests__/marketplace-components.test.tsx

# Find implementations/helpers that build marketplace links and resolve the exact strings.
rg -n -C4 'marketplaceKindPath|marketplaceRouteKindFor|/marketplace/skills|tab=market|Installed|installed' web/src/systems/marketplace web/src/routes/_app --glob '!**/*.test.tsx'

Repository: compozy/compozy

Length of output: 50372


Fix the marketplace card link to use an existing route shape.

/marketplace/skills is a declared route, so this check is valid. The link /marketplace/skill/docs-sync?tab=market targets no declared route; use the detail route /_app/marketplace/$kind/$entryId shape, such as /marketplace/skill/git-flow?tab=market, or add the missing route.

🤖 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
`@web/src/systems/marketplace/components/__tests__/marketplace-components.test.tsx`
around lines 1532 - 1533, Update the marketplace card link and its test
expectation to use the declared detail-route shape
`/_app/marketplace/$kind/$entryId`, such as
`/marketplace/skill/git-flow?tab=market`, instead of the nonexistent
`/marketplace/skill/docs-sync?tab=market` path; keep the `/marketplace/skills`
route check unchanged.

Comment thread web/src/systems/marketplace/components/marketplace-detail-lede.tsx Outdated
Comment thread web/src/systems/marketplace/components/marketplace-detail-mcp.tsx
Comment thread web/src/systems/marketplace/components/marketplace-detail-mcp.tsx Outdated
@pedronauck
pedronauck merged commit e335272 into main Aug 8, 2026
10 of 12 checks passed
@pedronauck
pedronauck deleted the fix-details branch August 8, 2026 02:12
aria-hidden="true"
className="grid size-(--size-provider-logo-well) shrink-0 place-items-center rounded-lg border border-line bg-elevated text-muted"
>
<Icon className="size-5" />

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

React Doctor · react-hooks-js/static-components (error)

This component misses React Compiler's automatic memoization & re-renders more than it should: Cannot create components during render. Rewrite the flagged code so the compiler can optimize it.

Fix → Components created during render will reset their state each time they are created. Declare components outside of render.

Docs

This branch was successfully deployed

1 active deployment
Preview — d58f62fc Deployed Aug 8, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant