This repository was archived by the owner on Jul 27, 2026. It is now read-only.
Repository navigation
feat: merge ExpressoTS Studio v4.0.0 to main - #1
Merged
Merged
Conversation
…, align brand Consolidate @expressots/studio-ui into @expressots/studio so the dev tool ships as a single package. Bump @expressots/studio to 4.0.0-preview.2. Studio (UI + orchestrator): - Move studio-ui/src into studio/ui; UI now bundles via vite into dist/ui - React, tailwind, recharts, @xyflow moved to devDependencies (bundled) - Studio.findUIDistPath() now resolves to <package>/dist/ui - New ApiClient view: method/URL/headers/body/query editor with route picker - Replay view consumes real replay_result and shows diff (status/duration/body) - Architecture Map syncs nodes/edges via useEffect when structure arrives async - Sidebar: replace Lucide Zap with the official ExpressoTS circular logo - Tailwind primary palette swapped to the brand green scale (#3DE678 base-6) - Selection/focus ring/recharts fills use the brand green - Orchestrator: probe socket disconnects after first connect/timeout so the agent no longer reports 2 active connections - Quieter logs (start/stop/scan/connect) and consolidated CLI start output Studio Agent: - Inject CORS headers when origin is localhost(:port) so the API Client and any cross-origin tooling can read responses; short-circuit OPTIONS with 204 - replayRequest: reconstruct absolute URL from recorded `host` header (fixes "Failed to parse URL from /") and strip hop-by-hop/origin headers - Replay now reports replay duration alongside status Cleanup: - Delete stale studio-ui/src/hooks/use-socket.ts - Drop noisy console.logs from socket-context - Remove studio-ui package, update workspace scripts, gitignore, README
Adds three high-value views built on the existing agent / UI plumbing: DI Container Inspector - Agent: ContainerIntrospector reads bindings from the ExpressoTS AppContainer (introspect()) and builds a dependency graph from Inversify's `inversify:tagged` / `inversify:tagged_props` metadata. - Agent: AsyncLocalStorage + container middleware track which bindings get resolved during each request; broadcast as `container_resolutions` events tagged with the exchange id. - UI: new Container view with summary stats, scope-filtered bindings table, and an interactive React Flow dependency graph. Resolved bindings for the selected exchange are highlighted in both views. Open in editor - Architecture nodes (controllers / services / providers) gain a small "Open in editor" link that triggers a `vscode://file/...:line` URL — works with both Cursor and VS Code on every supported OS. - TraceDetail now matches the recorded request against a known route (exact + parameterised segment match) and surfaces the controller source with a one-click "Open in editor" button. Export menu - New ExportMenu component on each request row and inside TraceDetail. - Three formats: cURL (terminal-ready), JS fetch() (paste into the console), OpenAPI 3.1 path fragment (paste into a spec). - Hop-by-hop headers (host, content-length, sec-*, origin, referer) are stripped from exports so the snippets are reproducible. Plumbing - agent: new `appContainer` option threaded through studio-integration → StudioAgent → ContainerIntrospector. - agent: emit `container` on connect and on `get_container`. - UI: `container` + `container_resolutions` types, store actions, and socket-context wiring. - .gitignore: allow `packages/studio/ui/lib/**` (was being swept up by the global `lib/` exclusion).
The built UI already used `/expressots-icon.svg` as its favicon, but the fallback HTML served when `dist/ui/` is missing still rendered a `⚡` emoji as the logo and had no favicon link at all. Worse, that branch is served as a catch-all so `/expressots-icon.svg` would itself return the HTML — meaning even adding the same link wouldn't have worked. This change inlines the brand icon as a base64 data URI for both the `<link rel="icon">` and the page logo, so the fallback page renders the correct identity regardless of whether the UI assets are reachable. Also fixes a leftover `rgba(14, 165, 233, 0.1)` (sky-blue) tint on the status box — replaced with the brand green at the same opacity.
Adds the controls that turn the Requests view from a passive log into a
live debugging surface.
Agent (`@expressots/studio-agent`)
- New `set_recording {enabled}` socket event toggles the recording flag
at runtime. The middleware short-circuits when paused so no exchanges
are persisted while debugging a specific moment.
- Broadcast `recording_state` on every new connection and after every
toggle so multiple Studio tabs stay in sync.
- `clear_recordings` now also wipes in-memory aggregates (endpoint
stats, response times, request/error counts) and re-broadcasts
metrics + endpoint_stats — previously the Metrics tab kept pre-clear
totals.
UI (`@expressots/studio`)
- New header toolbar with:
* Pause / Resume button (sends `set_recording`).
* Clear button + confirmation dialog ("Clear N requests · cannot be
undone").
* Live badge that flashes green on every new request and dims to
"Paused" when recording is off, plus the running request count.
* Refresh button kept as a manual fallback.
- Request list:
* Auto-scroll toggle in a per-list toolbar. When on, the list keeps
the newest entry in view; when off the user can read older entries
without losing position.
* "X of Y · filtered" count when filters are active.
* Empty state rewritten with concrete onboarding ("Send a request to
localhost:3000…" + tip pointing at the API Client tab).
- Header view titles now cover the Container and API Client views
(previously fell back to "Dashboard").
Store / socket-context plumbing
- `recordingEnabled`, `autoScroll`, and `lastEventAt` join the store.
- `clearExchanges` action resets exchanges, traces, replay result, and
the per-exchange container-resolutions map.
- `markLiveEvent()` is called whenever a `request` event arrives so
the toolbar badge can pulse.
- socket-context handles the new `recording_state` and `cleared`
events.
Adds three high-signal panels for v4.0 Studio: * Per-route performance table (Metrics tab) — sortable p50/p95/p99, error-rate %, latency color coding, route filter. Computes from the same EndpointStats the agent already aggregates. * Error Inspector (TraceDetail) — surfaces RFC-7807 fields (type, title, detail, errorCode), validation errors, and the response body stack trace. Frames are parsed, node_modules / framework frames are collapsed by default, and the first user-code frame gets a one-click "Open throw site in editor" jump via vscode://file URLs. * Live logs streaming — new LogCapture module in the agent intercepts every console.* call, tags each entry with the active traceId via AsyncLocalStorage, broadcasts on the WebSocket, and buffers the last 1000 lines for reconnecting clients. Studio gains a Logs tab with level filters / text search / auto-scroll, and TraceDetail shows a per-request "Logs during this request" panel. The LogCapture installs as an Object.defineProperty accessor so that later reassignments to console.log/etc (e.g. adapter-express's startup buffer/restore cycle) flow through our setter instead of replacing the wrapper. Each level keeps a delegate cell that gets updated on assign, so the framework's restored formatter still drives terminal output. Performance impact: gated to development by default; production auto-init returns false when NODE_ENV=production. When enabled, the per-request cost is dominated by SQLite recording (~1-3ms) and the WebSocket broadcast (~50-100us on localhost).
…ot, active path
Six high-leverage upgrades that move Studio from "viewer" to a serious
debugging surface for v4.0:
* Settings drawer — persisted to localStorage under
`expressots.studio.settings.v1`. Surfaces agent URL, editor scheme
(Cursor/VSCode/WebStorm/IDEA/Sublime/custom), recording defaults
(auto-record, max exchanges, max log buffer), and display defaults
(default view, sidebar open, autoscroll, log levels). The Settings
button in the sidebar is now wired up. Defaults seed the runtime
store at boot so preferences feel sticky across reloads.
* Editor scheme picker — `openInEditor` now reads the active scheme
from the settings store and rewrites the prefix accordingly. Adds
JetBrains URL shape (`?file=...&line=...`) as a first-class case.
* Keyboard shortcuts — global handler with `?` overlay, Esc to close
open panels, `/` and Cmd/Ctrl+K to focus the filter, J/K to navigate
the request list, and `G` leader sequences (`G R / G L / G A / G M /
G C / G X / G P`) for direct view switching. The overlay reads from
the canonical shortcut list so docs cannot drift.
* Replay diff view — replaces the ad-hoc "two cards + raw body" panel
with structured comparisons:
- top-line status + duration with delta badge,
- response headers diff (added / removed / changed, ignoring
noisy headers like `date` and `etag`),
- JSON body diff that produces dotted-path change records
(`user.address[2].city`) with add / remove / modify rows.
Verdict pills summarise the entire comparison at a glance.
* Connection health footer — agent now responds to `ping_studio`
events; the UI sends one every 5s and renders round-trip latency,
total events received, and live heap usage in a thin bar below the
main content. Lets the user spot stale data without opening
devtools.
* Snapshot export — "Export snapshot" in TraceDetail bundles the
request + response + matched route + resolved DI bindings + logs
for the trace + a cURL repro into either JSON (machine-readable) or
Markdown (drop-in bug-report draft). Triggers a browser download
with a stable, path-derived filename.
* Architecture-map active path — when an exchange is selected, the
matched controller plus every resolved DI binding gets a green
highlight ring and the edges between them animate. Everything else
dims to 25% opacity for context. A small banner in the top-right
explains the highlight so it doesn't look like a rendering glitch.
Bundle impact: studio UI grew ~80kB minified (~20kB gzipped) for all
six features combined; agent grew ~0.2kB for the ping handler. No new
runtime dependencies.
The old dialog was a flat single-paragraph confirm that didn't make the scope of destruction obvious. The redesign: * Adds a destructive-accent header strip with an AlertTriangle icon in an error-tinted badge, so the dialog reads as "danger" at a glance. * Replaces the generic prose with three concrete impact rows — captured requests, endpoint-stat rows, and buffered log lines — each rendered as its own card with a per-row icon, a tabular-nums count, and a one-line explanation of what resetting that bucket actually costs. Zero-count rows render dimmed so the user can see the scope without doom-coloring empty buckets. * Makes the primary action a filled red button (not a transparent red ghost) and gives it focus on open, so pressing Enter completes the destructive action and pressing Esc cancels. Adds a Trash2 icon to reinforce the action. * Promotes the dialog to a proper alertdialog with aria-modal and aria-labelledby for accessibility. To honor the new "this wipes everything" copy, handleClear now fires both `clear_recordings` (exchanges + endpoint stats + metrics counters) and `clear_logs` (agent log buffer) instead of just the former.
The Header element renders with `backdrop-blur-sm`, which translates to `backdrop-filter: blur(4px)`. Per the CSS spec, that property creates a containing block for any `position: fixed` descendants — so the clear confirmation modal was being pinned to the 64px-tall header strip instead of the viewport. Visually the dialog appeared at the top edge of the screen, partially clipped above the toolbar. Wrapping the modal in createPortal(..., document.body) lets it escape the header subtree entirely and renders against the real viewport, so `fixed inset-0` and `items-center justify-center` once again do what they advertise.
…tor parens The constructor scanner used `constructor\s*\(([^)]*)\)` which truncates at the first `)` — so any parameter carrying `@inject(MyService)` was silently dropped, leaving the architecture map without dependency edges. Replaced the regex with a balanced-paren scanner and a stricter parameter parser that handles every shape ExpressoTS users hit (`@inject(...) private readonly foo: Foo`, parameter properties, multiple modifiers, namespaced types). Co-authored-by: Cursor <cursoragent@cursor.com>
Each controller / service / provider node now carries a small badge (Singleton / Request / Transient / custom) read from the live container snapshot. Reuses the same colour palette as the Container Inspector so the two views stay visually consistent. Falls back to no badge when the snapshot isn't available yet (e.g. UI-only mode). Co-authored-by: Cursor <cursoragent@cursor.com>
Adds a browser-side equivalent of the CLI startup banner — surfaces server/config/health/metrics/security/startup info live and refreshable instead of frozen at boot. Reachable from the sidebar (Status), the settings default-view picker, and the `G then S` shortcut. Agent side - New `runtime` WS message + `RuntimeInfo` / `RuntimeItems` types - `getRuntimeInfo()` composes pid, env, ports, versions, counts - `updateRuntimeInfo()` lets the host adapter push live values after `app.listen()` resolves (real port, boot duration, runtime provider / interceptor counts + names) and re-broadcasts to connected clients - Version probe reads `package.json` from disk so packages without a `./package.json` exports entry no longer report "vunknown" - Defaults `appPort` to `process.env.PORT || 3000` so the URL appears even with zero host-side setup UI side - New `StatusDashboard` with six cards, clickable counts, and an inline drill-down panel listing routes / controllers / services / providers / middleware / interceptors / DI bindings - Drill-down merges runtime-discovered class names (framework providers, registered interceptors) with the static-scan list, enriching each entry with file paths, scope pills, and an "Open in editor" link - Store + socket-context wiring for the new `runtime` event Co-authored-by: Cursor <cursoragent@cursor.com>
The agent's WebSocket server was started with a naked `httpServer.listen()` and no `'error'` handler, so an unhandled `'error'` event during a hot-reload race (typical with `tsx --watch` / `nodemon` when the previous process hasn't yet released the agent port) would emit an unhandled error and terminate the host application. Three mitigations: - Attach an `'error'` handler to `httpServer` so EADDRINUSE never reaches Node's unhandled-error path. - New `listenWithRetry` / `listenOnce` helpers retry a few times with exponential backoff on EADDRINUSE before giving up — covers the common case where the port is freed within a few hundred milliseconds. - `stop()` now actually awaits `io.close()` and `httpServer.close()`, and force-closes lingering keep-alive / WebSocket sockets via `closeAllConnections()` so the port is released promptly during the host's graceful shutdown. Net effect: hot-reload no longer crashes the host app; if Studio still can't bind after retries, the integration layer logs a friendly warning and the host keeps running (Studio is opt-in dev tooling). Co-authored-by: Cursor <cursoragent@cursor.com>
Follow-up to 014f80d. Awaiting `httpServer.close()` and `io.close()` serially could hang on slow socket.io drains (especially with the Studio UI still connected over WebSocket from the previous run). When that happens during `tsx --watch` / `nodemon` hot-reload, the watcher SIGKILLs the host process and the user sees `Failed running ./src/main.ts`. Refactor `stop()` so the WebSocket teardown is racing a 500ms hard timeout. We still call `closeAllConnections()` first (forces lingering keep-alive / WebSocket sockets to die immediately) and `io.close()` itself closes the underlying http server, so the happy path almost always wins. If something is truly stuck, we move on — the OS reclaims the port the moment the host process exits, and `listenWithRetry` on the next start handles the brief overlap. Also flip `isRunning = false` up-front so a concurrent `stop()` call from a duplicate signal handler bails immediately instead of doing the teardown twice. Co-authored-by: Cursor <cursoragent@cursor.com>
…ability, and one-click fixes studio-agent: - SecurityEngine orchestrates `npm audit` + OSV.dev with an on-disk cache, posture analysis over recorded traffic/routes/logs/DI graph, and emits a single SecurityReport envelope debounced to client activity. - lockfile-graph parses package-lock.json v2/v3 and BFS-resolves the transitive root cause for every finding so the UI can recommend "upgrade <root> to fix <pkg>". - reachability analyzer cross-references vulnerable packages with src/ imports, the DI graph, and recorded exchanges to label each finding as confirmed / likely / unreachable / unknown. - fix-resolver picks the right remediation per finding (npm install / npm audit fix [--force] / override / none) and groups findings that share an upgrade into FixGroup rows. - fix-runner spawns the chosen command in the host's cwd via an allow-listed argv, streams stdout/stderr line-by-line, and the engine automatically re-runs npm audit + OSV after every fix attempt. - apply_security_fix WS handler wires it all together; report frames include scanState.fix so the UI can render a live banner. studio (UI): - Sidebar entry, App routing, and SecurityView component with a Recommended Fixes section, severity-grouped advisories, copy-command boxes, Apply Fix buttons with breaking-change warnings, and a terminal-style FixRunBanner that streams fix progress. - StatusDashboard "Security & Scope" card surfaces the aggregate letter grade with a click-through to the Security view. - app-store + socket-context mirror the new types and forward fix_progress / fix_result frames into a FixRunState transcript. Co-authored-by: Cursor <cursoragent@cursor.com>
…, logs, errors) Co-authored-by: Cursor <cursoragent@cursor.com>
First public GA release of ExpressoTS Studio as part of the ExpressoTS v4.0.0 release bundle. All three packages graduate from 4.0.0-preview.x to 4.0.0: - @expressots/studio (CLI + bundled UI) - @expressots/studio-agent (in-process instrumentation, recorder, security engine) - @expressots/mcp-server (stdio MCP server for AI editors) Drops the 'preview' npm tag from all three packages' publishConfig. Tightens peer-dependency ranges to require @expressots/core ^4.0.0 and @expressots/adapter-express ^4.0.0. See CHANGELOG.md for the feature summary. Co-authored-by: Cursor <cursoragent@cursor.com>
Revamped the README to improve clarity and presentation, including: - Added a centered header with logo and description. - Updated package installation instructions and feature descriptions. - Enhanced the layout with badges for npm version, license, and Discord community. - Improved the organization of features and documentation links for better accessibility. This update reflects the latest features and provides a clearer overview of the ExpressoTS Studio capabilities.
…ies, fix peerDep semver for prereleases Co-authored-by: Cursor <cursoragent@cursor.com>
…API client) Studio Agent - route-scanner: balanced-paren method-signature parsing, case-insensitive @Body decorator detection, @Inject(TOKEN) handling, field-injection scanner, hardened parseService (require explicit @provide(<ClassName>)), CreateModule() detection + ModuleInfo, body DTO sampling that also walks `interface` and `type` aliases. - agent: merge runtime-discovered routes (with global prefix) into the static scan results and broadcast modules alongside structure. - types: add ModuleInfo and broaden AppStructure surface. Studio UI — API Client - Collapsible per-controller route groups with search and a BodyDto chip. - JSON / form body editor toggle that auto-fills from discovered DTO samples; pendingApiClientRequest hand-off from other views. Studio UI — Architecture Map - Full rewrite: search + 1-hop focus mode, filter chips (entities / orphans / leaves), LR/TB layout toggle, cycle / orphan / high-fan-in badges, per-node runtime stats, live request-flow pulse animation, edge DTO labels, draggable module bounding boxes, exports (Mermaid / SVG / JSON), node detail drawer with "Try in API Client" + "Open in editor", collapsible compact minimap, React Flow attribution hidden. Studio UI — Security - Score explainer + grading rubric disclosure. - Top fixes panel ranked by severity × reachability × fix-ease. - OWASP API Top 10 (2023) coverage tile with click-to-filter. - Auth coverage tile (X/N routes, with offending list). - "What Studio checks for" coverage panel mirroring the posture rules. - "NEW since last scan" badges (localStorage diff). - Reachability sort + "Hide unreachable" filter. - Trend sparkline of CRITICAL+HIGH counts across recent scans. - Suppress / acknowledge findings with reason (local-only triage). - Export current report as Markdown / JSON. - Opt-in Auto-rescan on file change (debounced). Studio UI — Misc - settings-store: launch on Status by default with a one-shot migration for existing browsers that still have 'requests' cached. - app-store: pendingApiClientRequest action for cross-view request hand-off. - types: ModuleInfo + auxiliary security types.
- Introduced a new card displaying active middleware preset information, including parsing, security, and compression settings. - Updated RuntimeInfo and AgentConfig types to include middlewarePreset. - Enhanced StatusDashboard with detailed metrics for startup events and middleware configuration, improving visibility into the application's runtime state.
- Added a new "Middleware" row to the StatusDashboard, displaying active middleware counts and allowing drill-down functionality. - Implemented a mergeMiddleware function to combine runtime and static middleware data, improving the accuracy of displayed middleware information. - Updated RuntimeItems and MiddlewarePipelineItem types to support the new middleware structure, enhancing type safety and clarity in the codebase.
- Added tooltips to the Memory, Heap, RSS, and Connections rows in the StatusDashboard to provide detailed explanations of each metric. - Included a live refresh indicator to inform users about the update frequency of the displayed metrics.
- Added middleware visibility to the ArchitectureMap, allowing users to hide/show middleware nodes. - Introduced new middleware scope badges for better differentiation in the UI. - Updated the data structure to support middleware as first-class nodes, including their scope and relationships. - Enhanced the SocketProvider to normalize middleware data from older agents, ensuring consistent type handling. - Improved the StatusDashboard to reflect middleware integration, including active middleware counts and detailed metrics.
Co-authored-by: Cursor <cursoragent@cursor.com>
- Upgraded several @babel packages to version 7.29.7, enhancing compatibility and performance. - Added integrity and resolved URLs for new package versions to ensure security and reliability. - Included @alloc/quick-lru package version 5.2.0 with integrity details for improved caching functionality.
…down, Studio SPA path - Bump studio and studio-agent to 4.0.0-preview.3, mark mcp-server private - Add prepare-publish.mjs / restore-package-json.mjs release scripts - Fix studio.ts: change SPA catch-all from '*' to '/*splat' for Express 5 / path-to-regexp v8 - Fix studio/ui/ApiClient.tsx: dynamically read appUrl and globalPrefix from runtime state - Fix agent.ts: improve route scan error logging; apply globalPrefix correctly and idempotently - Fix route-scanner.ts: guard against missing layer.regexp in Express 5 router layers - Fix tracer.ts: cap OTel SDK shutdown at 500ms to prevent 30s graceful-shutdown hang - Add agent.spec.ts: Vitest regression tests for global-prefix discovery - Add CI build workflow for expressots-studio monorepo - Add publish-preview.yml manual-dispatch workflow for studio packages Co-authored-by: Cursor <cursoragent@cursor.com>
…packages (esbuild moderate CVE) Co-authored-by: Cursor <cursoragent@cursor.com>
…guration management - Introduced `installId` for stable anonymous identification and telemetry correlation. - Added `mode` to specify agent operation as either `development` or `production`, enhancing flexibility in deployment scenarios. - Updated default configuration to include new fields, ensuring backward compatibility.
- Implemented an error guard to suppress IPC channel errors emitted by OpenTelemetry's HTTP exporter when using `tsx --watch`. - Ensured that unexpected errors are re-emitted to maintain default Node behavior while preventing unhandled errors during shutdown. - The guard is temporarily installed to handle potential errors from lazy-loaded imports, enhancing the stability of the shutdown process.
…idation - Added @commitlint/cli and @commitlint/config-conventional to enforce conventional commit messages. - Integrated husky to manage Git hooks, ensuring commit messages adhere to the defined format. - Updated lint and format scripts to utilize caching for improved performance.
…utput - Implemented a `stripAnsi` function to remove ANSI escape sequences from log messages, ensuring they render cleanly in non-terminal consumers. - Updated the `LogCapture` class to utilize the new function, enhancing the readability of logs in the Studio web UI and downstream log aggregators.
- Introduced a new `DatabaseView` component for inspecting the in-memory database, including table lists, schema details, and paginated row browsing. - Updated the `App` component to include the `DatabaseView` in the routing options. - Enhanced the `SocketProvider` to handle database schema and table data requests, ensuring real-time updates for the UI. - Added necessary types for database introspection and integrated the `DatabaseIntrospector` in the agent for capturing database state. - Updated the sidebar to include a navigation item for the new database view.
- Added `eslint-plugin-react-hooks` version 5.2.0 to enhance linting for React hooks. - Updated test commands in `mcp-server` and `studio` packages to allow passing with no tests, improving flexibility during development. - Made minor adjustments to the `SecurityView` component to ensure hooks run unconditionally, enhancing reliability.
- Removed dependency on `better-sqlite3` and integrated Node's built-in `node:sqlite` for request recording, improving compatibility with Node versions >=22.5. - Updated `RequestRecorder` to handle SQLite initialization gracefully, ensuring recording can be disabled without affecting other Studio features. - Added error handling and availability checks for the SQLite backend, providing clear warnings when recording is disabled due to environment constraints. - Refactored related code to maintain functionality while transitioning to the new SQLite implementation.
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
…Studio UI panel
Implement zero-annotation OpenAPI 3.1 document generation powered by the
existing route scanner and recorded traffic. Dev/CI-time only, zero
production runtime cost.
- New `openapi/` module in studio-agent: `buildOpenApiDocument()` assembles
paths from routes + bodyDto/bodySample/parameters, enriches with response
schemas/examples from recorded exchanges (union-merged per status code),
and prefers precise `extractSchema()` overrides when available.
- `inferSchema` / `unionSchema` lifted into shared `schema-infer.ts`.
- `spec-diff.ts`: drift detection comparing a committed spec against live
routes and traffic (missing routes, undocumented statuses, required-field
frequency drift).
- `detectGlobalPrefix()`: recovers `setGlobalRoutePrefix("...")` from source
so CLI-generated paths match what Studio/runtime shows.
- `get_openapi` / `get_openapi_drift` socket handlers in agent.
- New `OpenApiPanel` component in Studio UI (download, copy, regenerate,
drift check with severity-coded findings).
- `openApiDoc` / `specDrift` state + actions in app-store and socket-context.
- `emit-openapi` subcommand in the Studio bin (headless, reads app version
from package.json, auto-detects global prefix, supports --fail-on-drift).
- Unit tests: spec-builder, spec-diff, prefix detection, emit smoke test.
Co-authored-by: Cursor <cursoragent@cursor.com>
…mponent updates - Implemented lazy loading for major views in the App component to optimize initial load time. - Updated Tailwind CSS configuration to introduce a layered surface system for improved dark mode support. - Refactored various components to utilize new styles, including `studio-card`, `studio-input`, and `studio-btn`, enhancing UI consistency. - Adjusted animations and transitions for smoother user interactions. - Improved scrollbar styles and added custom styles for selection and focus states. - Enhanced the Vite configuration to optimize chunking of third-party libraries for better performance.
- Added `CoverageView` component to the Studio UI for displaying coverage reports. - Updated `App` component to include coverage in routing options. - Enhanced `Sidebar` with a new navigation item for coverage. - Implemented coverage-related socket context methods for fetching and managing coverage data. - Introduced coverage types and interfaces in the application state and types. - Integrated coverage engine in the agent for real-time coverage report handling and updates.
- Updated package versions for `@expressots/mcp-server`, `@expressots/studio`, and `@expressots/studio-agent` to 4.0.0-preview.3.3. - Enhanced documentation in `studio.ts`, `agent.ts`, and `route-scanner.ts` with detailed comments and examples for better clarity and usability. - Improved logging and error handling in various components to ensure robustness and maintainability.
Ensure published npm pages show version, license, Discord, and build badges for studio and studio-agent.
…t tests - Extracted layered-layout depth assignment logic into a new `architecture-layout.ts` module for better testability and separation of concerns. - Introduced `assignNodeDepths` and `buildAdjacency` functions to handle node depth assignment and adjacency list creation, respectively. - Added a new `architecture-layout.spec.ts` file with comprehensive unit tests to ensure correct behavior, including handling of cyclic dependencies and edge cases. - Updated `ArchitectureMap` component to utilize the new layout functions, improving performance and maintainability.
…vigation - Added a new `CommandPalette` component for quick access to routes via fuzzy search, triggered by Cmd/Ctrl+K. - Implemented `RouteSidebar` to display discovered routes grouped by resource, controller, or method, with support for favorites and recent routes. - Integrated keyboard shortcuts to toggle the Command Palette and manage overlays effectively. - Updated `ApiClient` to utilize the new Command Palette for route selection, improving user experience in the API Client. - Enhanced state management with a new `api-client-store` for persisting user preferences related to route grouping and sidebar width. - Refactored existing components to accommodate the new features and improve overall UI consistency.
…refresh functionality - Updated the Container Inspector to provide a focused view on dependency injection (DI) health, including health signals for scope mismatches and dead bindings. - Introduced a refreshContainer method in the socket context to re-capture the DI container snapshot, ensuring up-to-date information is displayed. - Enhanced the component's state management with additional filters and sorting options for better user experience. - Added new types and interfaces to support detailed binding information and health warnings. - Improved overall structure and readability of the Container Inspector component.
… for enhanced architecture exploration - Added `ArchitectureView` component to provide a comprehensive overview of the application's architecture. - Implemented `ArchitectureHealthStrip` and `ArchitectureLegend` for visual representation of architectural warnings and component types. - Introduced `ExploreLens` for detailed exploration of dependencies and relationships between components. - Enhanced state management and user interactions for navigating architecture views, including the ability to filter and focus on specific nodes. - Improved overall structure and readability of architecture-related components, ensuring better maintainability and user experience.
Co-authored-by: Cursor <cursoragent@cursor.com>
Bring in issue templates and Expressots Project sync workflow before v4 merge.
…arity - Updated `formatGeneratedCode` and `formatAnalysisResult` functions to use specific types (`GeneratedCode` and `CodeAnalysisResult`) instead of generic `any`. - Introduced `DrillListItem` interface in `StatusDashboard` for better structure and type safety of drill items. - Refined type annotations in various components, including `mergeProviders`, `mergeInterceptors`, and `mergeMiddleware`, to ensure consistent and clear type usage. - Enhanced type definitions in `SocketProvider` for request handling and improved type safety in `RequestRecorder` with detailed SQLite row interfaces. - Improved overall type safety across the codebase, facilitating better development experience and reducing potential runtime errors.
- Added coverage artifact detection with support for both Istanbul JSON and LCOV formats. - Introduced `CoverageEngine` to orchestrate coverage data processing and reporting. - Implemented parsers for Istanbul and LCOV formats to normalize coverage data. - Added functionality for computing diff coverage against the working tree. - Enhanced configuration management for coverage settings and thresholds. - Introduced a history tracking mechanism for coverage trends. - Added unit tests to ensure coverage functionality and correctness.
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
Sign up for free
to subscribe to this conversation on GitHub.
Already have an account?
Sign in.
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.
Summary
@expressots/studiopackage (UI + server),@expressots/studio-agentinstrumentation, OpenAPI generation/drift, architecture map, command palette, container inspector, coverage reporting, and API client.mainintofeature/v4.0first (issue templates + Expressots Project sync workflow); no merge conflicts.4.0.0-preview.3.4across publishable workspaces.Merge sync
feature/v4.0was 46 commits ahead and 6 commits behindmain. The 6 commits onmainwere repo housekeeping only (issue templates, project sync workflow). They are now included via merge commit4b7a7bb.Test plan
npm cinpm run lint(warnings only, 0 errors)npm run build --workspacesnpm test --workspaces(agent: 69 tests; studio vitest included in workspace run)npx expressots-studio startagainst a v4 app with agent enabled