The first Marketplace release of Roseline. Brings together every feature delivered across the 0.x prereleases — Phase 1–3 from the original spec plus substantial polish, monorepo support, and a performance pass — into one production-grade build.
- 🔍 Component Graph QuickPick —
Ctrl+Shift+.opens parents/children of any.tsx/.jsx/.ts/.jsfile; click jumps you there. - 🧭 Tree View in the Activity Bar — auto-syncs as you switch tabs, so the graph of the active file is always one glance away.
- 🌳 Project Tree mode — full hierarchy of every React project in the
workspace, with cycle markers (
↻), orphan fallback for UI-library projects, androseline.projectScope(auto/all/active) to focus on the project that contains your active file. - 📦 Barrel re-export tracing — named, wildcard,
as-rename, and chained barrels all resolve through to the leaf component. - 🛡️ External libraries excluded — react-icons, MUI, framer-motion, etc. never leak into the graph (node_modules guard at the resolver level).
- 🖱️ Right-click everywhere — Explorer, editor, and tree node context menus (Reveal in Explorer · Copy Path · Find All References).
- ⚡ Reverse parent index + background pre-indexing — switching tabs in a monorepo of 30+ React apps is O(1) once a scope is indexed; first scan runs in 40-file batches that yield to the UI between batches, so the editor stays responsive and the CPU stays cool.
- 💾 Smart cache — RAM-only or persisted to disk at a custom path
(defaults to
E:\roseline-cache). LRU + age-based eviction (cacheMaxEntries5000 ·cacheMaxAgeDays7). - 👁️ Live updates — FileSystemWatcher invalidates only the affected scope; next access self-heals through getParents.
- 📋 Output log +
Roseline: Diagnose— dump the detection state, cache stats, and active-file children to an Output channel anytime.
A directory becomes a project boundary if it contains any of:
tsconfig.json, jsconfig.json, package.json declaring react, or a
vite.config.* / next.config.* / remix.config.* / webpack.config.* /
rsbuild.config.* alongside a package.json. Bare React workspace folders
(no config at all) are detected via the workspace folder root as a fallback.
- 59 / 59 manual test cases verified across Phase 1, Phase 2, Phase 3, Polish, and Performance suites.
- Verified on a real-world npm-workspaces monorepo (31 React exercises with
hoisted
reactdependency). - CPU peaks during indexing: ~30% on AC, ~50% on battery, with a 4-core i5-10300H + 16 GB.
- Marketplace icon refreshed to a deep-magenta compass rose (the rose, finally red 🌹). Activity Bar icon kept unchanged — a long-verified design that reads cleanly at 76×76 on dark themes.
Roseline: Diagnosecommand was registered in code but missing frompackage.jsoncontributes.commands, so it didn't appear in the Command Palette. Now visible.
Roseline: Diagnosenow appends a Cache & index section to its output: current cache size + cap, cumulative LRU evictions since process start, reverse-index sizes (children referenced, parents indexed, scopes fully walked). Lets users verify LRU eviction (T53) and overall index health without a profiler.GraphCache.lastEvictionCountexposes a running tally of LRU evictions — surfaced via Diagnose, can also be inspected programmatically.
- Race when clicking the rose icon right after install/reload. Roseline used to defer activation until the user clicked the view, but the bundle (~3.4 MB — bundles the TypeScript compiler) takes a few hundred ms to parse on V8's first load. If the user clicked while that was happening, the view rendered VS Code's default "There is no data provider registered" placeholder.
- Added
"activationEvents": ["onStartupFinished"]so Roseline pre-warms shortly after VS Code finishes its own startup, before the user has a chance to click. The first click is now instant; subsequent reloads are too because V8's compilation cache is already warm.
- Replaced
$(rose)(which doesn't exist in VS Code's codicon set — rendered as a blank/placeholder glyph) with the standard animated$(loading~spin). The status-bar now reads⟳ Roseline: indexing X/Y fileswith a continuously spinning indicator — the conventional "in progress" pattern, instantly recognisable as live work and not a stuck UI.
- Status bar now stays visible long enough to see. Indexing a small project
(8 files) finished in ~30 ms — faster than the eye registers — so the
🌹 Roseline: indexing…indicator flashed and vanished. Status bar now stays shown for at least 600 ms, even when the underlying job completes sooner.
Roseline: Diagnoseis now exposed in the Command Palette (the registration was present in code but missing frompackage.jsoncontributes — added).
- Reverse parent index. Roseline now maintains a
child → parentsmap as a side effect of parsing children. Once a scope is fully indexed,getParentsswitches from a workspace-wide scan to an O(1) lookup — switching tabs in a monorepo of 30+ React apps goes from "scan again" to instant. - Background pre-indexing on activate. When the extension boots with a React file open, it walks that file's project in the background (40-file batches, yielding to the UI between batches so the editor stays responsive and the CPU stays cool). Subsequent operations are instant. Re-runs whenever the active editor moves into a new project boundary.
- Status-bar progress. A
🌹 Roseline: indexing 240/1024 files…indicator shows up while a background scan is running, and disappears the moment it's done. No permanent status-bar real estate. roseline.cacheMaxEntriessetting (default5000,0= unbounded). LRU eviction once the cap is hit, so RAM use is predictable on huge repos. Combined with the existingcacheMaxAgeDays, the cache is bounded on both size and freshness axes.findActiveProjecthelper. Walks up from a file to the nearest project boundary without doing a full workspace scan — used internally for the pre-index trigger.
- Cache file format bumped to v3 (older formats are dropped silently and rebuilt at next use; mtime-stale entries also drop on read).
getParentsnow reuses cached children when scanning, saving a re-read + re-parse for every workspace file even on the cold path.
- Active-file boundary detection.
findNearestTsConfigused to walk up the filesystem looking only fortsconfig.json. Files in projects that ship onlypackage.json+vite.config.js(npm workspaces, plain Vite) walked all the way to the drive root, which madegetParentsscan the whole disk and silently fail — leaving the Component Graph blank for those files. The walk now also recognisesjsconfig.json,package.json,vite/next/remix/rsbuild/webpack.config.*, and stops hard at workspace folder roots.
roseline.projectScopesetting (auto·all·active, defaultauto). In Project Tree mode this narrows the visible list to just the project that contains the active editor's file when the workspace has more than 5 detected projects — perfect for monorepos of 30+ exercise apps.allkeeps the previous full-list behaviour;activealways narrows.- Project Tree now re-renders automatically when the active editor changes (under auto/active scope) so the visible project follows you across files.
- npm/yarn/pnpm workspaces detection. In monorepos that hoist
reactto the root (very common — Vite teaching repos, multi-app projects), each leafpackage.jsondoesn't declarereactitself. v0.3.5 missed these and showed the whole monorepo as one big project with all apps as orphans. - A
package.jsonnext to avite.config.*,next.config.*,remix.config.*,webpack.config.*, orrsbuild.config.*is now treated as a project boundary even when it doesn't listreactin its own dependencies.
Roseline: Diagnosecommand — dumps a full snapshot to the Output channel: workspace folders, everytsconfig.json/jsconfig.json/package.jsonfound, which ones promote to a React project, the final detected project list, and the active file's children. Use this when something looks wrong.
- Workspace scans for configs and package.json files now run in parallel.
- Project nodes no longer auto-expand in multi-project workspaces. Opening a workspace with many React sub-projects (e.g. a teaching repo with 30+ exercise folders) used to render every project's full orphan tree on the first frame — triggering AST parses across the whole workspace. Projects now stay collapsed when there are 2+ of them and only expand on click. Single-project workspaces still auto-expand as before.
package.jsonwithreactdep is now a project boundary signal, alongsidetsconfig.json/jsconfig.json. Each CRA / Vite app inside a monorepo is detected as its own project automatically — no need to add ajsconfig.jsonto every sub-folder. Non-Reactpackage.jsonfiles (Node CLIs etc.) are ignored.
- Nested config no longer hides the parent project. Adding a
jsconfig.jsoninside a sub-folder (e.g.src/components/ui/foo/) used to demote the parenttsconfig.jsonfrom "leaf" status and make the whole workspace vanish from the Project Tree. Detection now keeps a parent project as long as it owns JSX files outside any nested config's subtree.
- node_modules guard — even with unusual
baseUrlconfigs that could otherwise resolve an import intonode_modules, the resolver now refuses to trace dependency files. External libraries (react-icons, framer-motion, MUI, Tailwind plugins, etc.) are silently excluded from parents/children/project tree.
- Find All References is now consistent — the cursor is positioned on the component declaration before the references command runs, so the language server always resolves the right symbol. Previously the result depended on wherever the cursor happened to be in the file.
- Right-click integration — Explorer + editor context menus now offer
"Roseline: Show Component Graph" on
.jsx/.tsx/.ts/.jsfiles. No need to focus the file first. - Tree node context menu — right-click a component in the sidebar to Reveal in Explorer, Copy Path, or Find All References.
- True recursive Expand All — BFS-based expansion now walks past the 3-level reveal cap, opening every expandable node up to a 5,000-node safety limit (warns if it hits the cap).
- Output log — errors are now written to View → Output → Roseline instead of being swallowed silently. New "Roseline: Show Output Log" command surfaces it from the Command Palette.
- Visual polish — tree component nodes now use VS Code's themed file icons (matches your Material Icon Theme etc.) and tooltips show the full absolute path.
- Title bar swap — Expand All now sits adjacent to the built-in
Collapse All for natural
+/−pairing.
- Tree node
parentreferences — required forTreeView.reveal()to traverse nested elements during recursive Expand All.
- Expand All button in the view title bar (alongside the built-in Collapse All). Expands up to 3 levels per click — re-click for deeper trees.
- Project Tree mode — toggle button in the view title bar to switch between "Active File" view (parents/children of current file) and "Project Tree" view (full component hierarchy of every React project in the workspace).
- Multi-project safe: detects each
{ts,js}config.jsonboundary as its own project, only includes those containing.tsx/.jsxfiles. Non-React folders (extension source, scripts, templates) are filtered out automatically. - Bare CRA/Vite projects (no config) are detected via workspace folder fallback.
- Cycle markers (↻) when a component branch loops back to an ancestor — expansion stops, file still openable on click.
- Orphan-as-root fallback for UI library projects (no
main/Appentry). roseline.refreshProjectTreecommand to manually rebuild the project list.- New tsconfig/jsconfig watcher invalidates project boundaries automatically.
FileSystemWatcher— cache invalidates and tree refreshes automatically on file change/create/delete (200ms debounce)- Barrel file / re-export tracing
export { X } from './path'andexport { X as Y } from './path'export * from './path'(wildcards) — verified against own exports of leaf- Chained barrels resolve all the way to the defining file
- Cache bumped to v2 to track each file's own exports
- QuickPick component graph navigation (
Ctrl+Shift+.) - Tree View in Activity Bar with auto re-sync on file switch (300ms debounce)
- Path alias resolution via per-file
tsconfig.jsonwalk-up (monorepo support) - Graph cache with mtime invalidation
roseline.cacheMode(memory|custom)roseline.cachePath(defaultE:\roseline-cache)roseline.cacheMaxAgeDays(auto-delete on activate)
roseline.clearCachecommand- Supports
.tsx .jsx .ts .js