You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Three pieces of unfinished wiring (not missing features) meant members could not tell which organization capabilities were ready versus needed setup. This was the single most confusing thing in an enterprise walkthrough: the app already knows the answer and could not say it.
Fix 1 — organization readiness rows could never render
connect-view.tsx declares marketplaceItems?: ExtensionItem[], defaults it to [], and uses it to build the Needs your sign-in / Needs admin setup / Ready to use groups for marketplace plugins. settings-route.tsx never passed it. Those rows were unreachable in every build.
Now passes the already-derived extensionItems.cloudPluginItems — no new fetch, no duplicated derivation. This is the direct answer to "does a teammate installing this skill have to connect the MCP themselves?"
Fix 2 — ExtensionsView ignored its own section routing
It accepted initialSection and setSectionRoute and used neither, so /settings/extensions, /extensions/mcp, /extensions/skills and /extensions/plugins all rendered an identical page — including the composer's own Configure deep link. The inventory now opens pre-filtered and keeps the URL in sync; /plugins opens the plugins block expanded.
Fix 3 — "View in Marketplace" led nowhere
The notification label promised a Marketplace screen that does not exist while navigating to Extensions. Label now matches the real destination, via i18n rather than a hardcoded string.
Verification
pnpm typecheck clean
77 focused tests across 24 connect/extensions/mcp suites all pass
New regression test proves Fix 1: routed cloud-marketplace items produce plugin readiness rows. New route test covers the extensions deep links.
Note for the reviewer
Trivially conflicts with #3113 in mcp-view.tsx — two adjacent additions, both wanted. Verified resolved and green in an integration branch merging all of this work together.
Validation: real app, isolated Linux sandbox, matched A/B
All nine branches of this series were merged into one integration branch (f91884c3) and driven as a real user through CDP in a fresh Daytona sandbox. Baseline dev was run in a separate, identically-provisioned fresh sandbox with the same model (GPT-4o mini) so the comparison is apples-to-apples.
core-flow step
clean dev (2fda6070)
this series (f91884c3)
App boots to a usable session surface
✅ 105ms
✅ 94ms
User creates a fresh task in the workspace
✅ 674ms
✅ 662ms
User writes a message and runs it (real inference)
✅ 2768ms
✅ 111405ms
User closes and reopens; the session survives
❌ not persisted
❌ not persisted
Step 4 fails identically on clean dev (Session ses_… was not listed after reopen (not persisted)), so it is pre-existing on dev and not introduced here. Against the canonical core flow this series is inert, which is exactly the claim for a cleanup/wiring series.
Validated frames: core-flow-01-booted.png, core-flow-02-session-created.png, core-flow-03-task-response.png — including the assertion "Visible text does not include 'Something went wrong'".
A real regression this caught, in this series
Booting the real app initially failed with:
TypeError: Unknown file extension ".ts" for packages/types/src/skill-markdown.ts
→ "OpenWork server did not finish starting. Please restart OpenWork."
@openwork/types is a source-only package — every exports entry resolves to raw ./src/*.ts. apps/server is built with plain tsc (no bundling), so a runtime import there survives into emitted JS and Node cannot load it. Only the bun build-bundled files under src/opencode-plugins/ may import it.
pnpm typecheck and both bun suites passed straight through this, because bun loads .ts natively and Vite bundles for the renderer. Only booting the real product surfaced it. It is fixed in #3112, and that PR adds an automated guard that fails if any non-bundled apps/server file imports @openwork/types, plus a plain-node import proof of the built output.
No per-PR fraimz flow was authored; this is the canonical core-flow inertness proof plus the matched baseline, which is the right standard for a series that is mostly wiring, deletion, and policy gating.
Local macOS pnpm dev could not be used: every worktree shares one userData dir, so app.requestSingleInstanceLock() makes any second instance quit before creating a window (CDP stays up, so it looks like a hang). Worth a separate DX fix.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problem
Three pieces of unfinished wiring (not missing features) meant members could not tell which organization capabilities were ready versus needed setup. This was the single most confusing thing in an enterprise walkthrough: the app already knows the answer and could not say it.
Fix 1 — organization readiness rows could never render
connect-view.tsxdeclaresmarketplaceItems?: ExtensionItem[], defaults it to[], and uses it to build theNeeds your sign-in/Needs admin setup/Ready to usegroups for marketplace plugins.settings-route.tsxnever passed it. Those rows were unreachable in every build.Now passes the already-derived
extensionItems.cloudPluginItems— no new fetch, no duplicated derivation. This is the direct answer to "does a teammate installing this skill have to connect the MCP themselves?"Fix 2 —
ExtensionsViewignored its own section routingIt accepted
initialSectionandsetSectionRouteand used neither, so/settings/extensions,/extensions/mcp,/extensions/skillsand/extensions/pluginsall rendered an identical page — including the composer's ownConfiguredeep link. The inventory now opens pre-filtered and keeps the URL in sync;/pluginsopens the plugins block expanded.Fix 3 — "View in Marketplace" led nowhere
The notification label promised a Marketplace screen that does not exist while navigating to Extensions. Label now matches the real destination, via i18n rather than a hardcoded string.
Verification
New regression test proves Fix 1: routed cloud-marketplace items produce plugin readiness rows. New route test covers the extensions deep links.
Note for the reviewer
Trivially conflicts with #3113 in
mcp-view.tsx— two adjacent additions, both wanted. Verified resolved and green in an integration branch merging all of this work together.