diff --git a/LICENSE b/LICENSE index a181be9..ecadcf2 100644 --- a/LICENSE +++ b/LICENSE @@ -1,21 +1,21 @@ -MIT License +Elastic License v2.0 Copyright (c) 2025 SigTrace Contributors -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +Acceptance +By using, modifying, or distributing the software, you agree to the terms of this license. -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +Copyright Grant +Subject to the terms of this license, Licensor grants you a non-exclusive, worldwide, royalty-free copyright license to use, copy, modify, and distribute the software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +Limitations +You may not: +1. Provide the software to third parties as a hosted or managed service, where the service provides the user with access to any substantial portion of the functionality of the software; +2. Circumvent the license key functionality or remove/alter any licensing, copyright, or other notices; or +3. Move, change, remove, or obscure any copyright, trademark, or other notices in the software. + +Patents +Subject to the terms of this license, Licensor grants you a non-exclusive, worldwide, royalty-free patent license under any patent claims Licensor owns or has the right to license that are necessarily infringed by the software. + +Disclaimer +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/README.md b/README.md index d3d9a22..1faf1aa 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@

npm version VS Code installs - License MIT + License ELv2 CI status Sponsor on GitHub

@@ -48,12 +48,12 @@ Full workspace layout demonstrating editor sync with the running application. | Feature | Description | |---------|-------------| -| ๐Ÿ“Š **Activity Table** | Live, filterable event log for every signal read, write, and effect. Search by name, file, or value. | -| โฑ๏ธ **Timeline (Causal Chains)** | Swimlane visualization showing which writes triggered which reads. Critical paths highlighted. | -| ๐Ÿงฉ **Component Cards** | Per-component signal snapshot โ€” current values, last-updated timestamps, click to filter. | -| ๐ŸŽฏ **Click-to-Navigate** | Click any signal event or graph node to jump to the exact source line in your editor. | -| ๐ŸชŸ **Multi-window Sync** | Multiple VS Code windows can connect to the same SigTrace server simultaneously. | -| โšก **Zero-refactoring Setup** | Build-time AST instrumentation โ€” no `import { trace }` required. Your code stays clean. | +| ๐Ÿ“Š **Activity Table** | Live, filterable event log for every signal read, write, and effect. Features Pinned/Others categorizations, hover copy icons, and a line-wise collapsible JSON tree inspector. | +| โฑ๏ธ **Timeline (Causal Chains)** | Chronological swimlane list showing sequential tick-by-tick update paths, event counts, and chain collapse/hide filters. | +| ๐Ÿงฉ **Component Audits & Loops** | Group updates by component. Flags circular invalidation loops, computation hotspots (>2.0ms), and unused dead signals. | +| ๐ŸŽฏ **Click-to-Navigate** | Click any signal event, timeline card, or warning log to jump to the exact source declaration line in your editor. | +| ๐ŸชŸ **Universal IDE Support** | Native extensions for both **VS Code** and **JetBrains (WebStorm, IntelliJ)** with full Webview synchronisation. | +| โšก **Zero-refactoring Setup** | Built-in CLI wrapper (`npx sigtrace run`) injects transformation compile hooks dynamically without editing your source code. | --- @@ -62,8 +62,10 @@ Full workspace layout demonstrating editor sync with the running application. | Framework | Version | Status | |-----------|---------|--------| | **Angular** | 17+ (Signals API) | โœ… Fully supported | -| **Vue** | 3+ (Composition API) | ๐Ÿ”œ Coming in v1.2 | -| **SolidJS** | 1.8+ | ๐Ÿ”œ Coming in v1.2 | +| **Vue** | 3+ (Composition API) | โœ… Fully supported | +| **SolidJS** | 1.8+ | โœ… Fully supported | +| **React** | 18+ (Signals API) | ๐Ÿ”œ Coming soon | +| **Svelte** | 5 (Runes) | ๐Ÿ”œ Coming soon | --- @@ -230,7 +232,10 @@ See [**CHANGELOG.md**](./CHANGELOG.md) for a detailed history of changes across ## ๐Ÿ“„ License -SigTrace is open-source software released under the [**MIT License**](./LICENSE). +SigTrace is released under the [**Elastic License 2.0 (ELv2)**](./LICENSE). + +- **Allowed**: Free for everyone (individuals, startups, and commercial enterprises) to use, modify, and run in development and production workflows. +- **Prohibited**: You may not provide SigTrace to third parties as a hosted or managed commercial service, or sell competing developer tools derived directly from this repository. Copyright ยฉ 2025 SigTrace Contributors. diff --git a/docs/blog/index.html b/docs/blog/index.html index 3816c3f..4e4014d 100644 --- a/docs/blog/index.html +++ b/docs/blog/index.html @@ -220,7 +220,7 @@

Introducing SigTrace: The Missing Debugger for Reactive S diff --git a/docs/blog/introducing-sigtrace.html b/docs/blog/introducing-sigtrace.html index 73bce8e..a848bfb 100644 --- a/docs/blog/introducing-sigtrace.html +++ b/docs/blog/introducing-sigtrace.html @@ -220,8 +220,8 @@

Quick Start

# or npx sigtrace run npm run dev # Vue / SolidJS -

Open Source and Community-Driven

-

SigTrace is licensed under the MIT License and is free to use, modify, and distribute. We believe that developer experience should not be locked behind proprietary paywalls. The core adapters for Angular, Vue, and SolidJS are all open-source, and we are planning Svelte and React support next.

+

Free for Developers & Enterprise

+

SigTrace is licensed under the Elastic License 2.0 (ELv2) and is completely free for all developers, teams, and organizations to use and modify in development and production workflows. The only restriction is that third parties cannot provide SigTrace as a managed commercial service or sell competing derivative tools built directly from this repository. The core adapters for Angular, Vue, and SolidJS are all available, and we are planning Svelte and React support next.

Check out the GitHub Repository, star the project, and join the community!

@@ -230,7 +230,7 @@

Open Source and Community-Driven

diff --git a/docs/blog/react-svelte-signals-debugging.html b/docs/blog/react-svelte-signals-debugging.html index 93f6728..c5f0138 100644 --- a/docs/blog/react-svelte-signals-debugging.html +++ b/docs/blog/react-svelte-signals-debugging.html @@ -245,7 +245,7 @@

Getting Started in 2 Minutes

diff --git a/docs/docs/index.html b/docs/docs/index.html index be2bd41..43ff068 100644 --- a/docs/docs/index.html +++ b/docs/docs/index.html @@ -139,7 +139,7 @@

Documentation Coming Soon

diff --git a/docs/index.html b/docs/index.html index f49e8b6..08b449a 100644 --- a/docs/index.html +++ b/docs/index.html @@ -72,7 +72,7 @@ "softwareVersion": "1.1.6", "datePublished": "2025-01-01", "dateModified": "2026-07-16", - "license": "https://opensource.org/licenses/MIT", + "license": "https://www.elastic.co/licensing/elastic-license", "author": { "@type": "Organization", "name": "SigTrace Contributors", @@ -175,10 +175,10 @@ }, { "@type": "Question", - "name": "Is SigTrace free and open source?", + "name": "Is SigTrace free to use?", "acceptedAnswer": { "@type": "Answer", - "text": "Yes. SigTrace is completely free and open source under the MIT license. Its editor extensions, npm packages, and CLI are all free to use, modify, and distribute." + "text": "Yes. SigTrace is free for all developers and organizations under the Elastic License 2.0 (ELv2). You can freely use, modify, and run it in development and production workflows." } } ] @@ -1792,7 +1792,7 @@
- Open Source ยท v1.1.6 ยท MIT License + ELv2 License ยท v1.1.6 ยท Free to Use
@@ -1958,8 +1958,8 @@

SigTrace by the numbers

Avg. Instrumentation Overhead
-
MIT
-
Open Source License
+
ELv2
+
Fair Source License
@@ -2427,7 +2427,7 @@

Frequently asked questions

-
SigTrace is 100% free and open source under the MIT license. All packages and editor extensions are free forever. The source code is available on GitHub and contributions are welcome.
+
SigTrace is free for all developers, teams, and organizations under the Elastic License 2.0 (ELv2). You can use and modify SigTrace freely. The only restriction is that third parties cannot provide SigTrace as a managed commercial service or sell competing derivative tools built directly from this code.
@@ -2451,7 +2451,7 @@

Frequently asked questions

- Free & Open Source + Free for Developers & Enterprise

Debug your reactive state
in minutes, not hours

Install SigTrace and get full visibility into your signal graph โ€” for free, forever.

@@ -2498,7 +2498,7 @@

Debug your reactive state
in minutes, not hours

diff --git a/package.json b/package.json index a247981..7e343f0 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,9 @@ { "name": "sigtrace-monorepo", "private": true, - "version": "1.2.0", + "version": "1.2.1", "description": "Universal Reactive Graph & Signal Lifecycle Tracer", + "license": "ELv2", "workspaces": [ "packages/*", "demo" diff --git a/packages/core/package.json b/packages/core/package.json index ac06873..b9d7d1c 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@sigtrace/core", - "version": "1.2.0", + "version": "1.2.1", "type": "module", "description": "Client-side runtime tracer for SigTrace", "main": "dist/index.js", @@ -17,7 +17,7 @@ }, "homepage": "https://sigtrace.dev", "author": "SigTrace Contributors", - "license": "MIT", + "license": "ELv2", "exports": { ".": "./dist/index.js", "./solid": "./dist/adapters/solid.js", diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index e16c0fa..71ec227 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -45,6 +45,7 @@ class SigTraceClient { private port = 8420; private frameFlushScheduled = false; private freqTrackers = new Map(); + private registeredSignals: TraceEvent[] = []; constructor() { // In production: export a no-op instance โ€” connect() is never called. @@ -74,6 +75,12 @@ class SigTraceClient { this.isConnecting = false; console.log(`[SigTrace] Connected to VS Code dev server on ws://localhost:${this.port}`); console.log('[SigTrace] ๐Ÿ”’ All data stays local โ€” no external servers, no telemetry.'); + + // Re-send all registered signals to populate the new host's cache + this.registeredSignals.forEach(reg => { + this.sendImmediate(reg); + }); + this.flushQueue(); }; @@ -147,6 +154,13 @@ class SigTraceClient { public send(event: TraceEvent) { if (IS_PRODUCTION) return; // no-op in production + if (event.type === 'register') { + const reg = event; + if (!this.registeredSignals.some(s => s.type === 'register' && s.id === reg.id)) { + this.registeredSignals.push(event); + } + } + // Check high-frequency throttle if (this.isThrottled(event)) return; diff --git a/packages/extension/.vscodeignore b/packages/extension/.vscodeignore new file mode 100644 index 0000000..c377827 --- /dev/null +++ b/packages/extension/.vscodeignore @@ -0,0 +1,20 @@ +# Ignore parent directories in monorepo +.. +../** +../../** +# Ignore other monorepo directories +packages/core/** +packages/vite-plugin/** +packages/jetbrains-plugin/** +demo/** +docs/** +releases/** +# Ignore local dev files +node_modules/** +src/*.ts +tsconfig.json +tsconfig.tsbuildinfo +*.vsix +.vscode/** +.gitignore +.gitattributes diff --git a/packages/extension/README.md b/packages/extension/README.md index a69a7af..245f053 100644 --- a/packages/extension/README.md +++ b/packages/extension/README.md @@ -7,10 +7,12 @@ SigTrace is a free, open-source VS Code extension for Angular, Vue, and Solid de ## Key Features ### 1. Visualizer Sidebar -- **Component Clustering**: Automatically groups signals, computed memos, and effects inside visual container cards corresponding to their parent components (e.g. `FilterPanel`, `SearchResultsComponent`). -- **Focus Path Isolation**: Click a node to immediately dim the rest of the graph to 10% opacity, highlighting only that node's direct upstream producers and downstream subscribers. -- **Timeline Playback Player**: Step backward and forward through a chronological history of reactivity ticks, watching the graph update and flash step-by-step. -- **Search Filtering**: Filter out nodes and component containers using the text search bar. +- **Component Clustering & Auditing**: Automatically groups signals, computed memos, and effects inside visual container cards corresponding to their parent components (e.g. `FilterPanel`, `SearchResultsComponent`). +- **Pinned vs Others Categories**: Automatically splits signal logs into Pinned and Others sections. Pinned nodes survive logs clearing (tombstoned) to make comparison testing easy. +- **VS Code Style JSON Inspector**: Formats complex object payloads line-by-line with vertical guidelines and collapsible guidelines. Retains expanded/collapsed node states during active updates. +- **Chronological Playback Timeline**: Step backward and forward through a history of ticks, showing sequential event counter cards (e.g., `event 1/7`) with hide/unpin controls. +- **Focus Path Isolation**: Click a node to immediately dim the rest of the graph, highlighting only that node's direct upstream producers and downstream subscribers. +- **Interactive Search & Hover Copy**: Filter nodes and component containers instantly. Click the copy icon (`โง‰`) next to any signal name on hover to copy it to clipboard. ### 2. VS Code CodeLens Telemetry Overlay - Floating inline telemetry is injected directly above signal/computed/effect declarations inside your editor code files: diff --git a/packages/extension/package.json b/packages/extension/package.json index 24f76f0..df25c9d 100644 --- a/packages/extension/package.json +++ b/packages/extension/package.json @@ -2,10 +2,10 @@ "name": "sigtrace-extension", "displayName": "SigTrace", "description": "Angular, Vue, and Solid signals debugger for VS Code", - "version": "1.2.0", + "version": "1.2.1", "publisher": "sigtrace", "author": "SigTrace Contributors", - "license": "MIT", + "license": "ELv2", "homepage": "https://sigtrace.dev", "bugs": { "url": "https://github.com/sigtrace-dev/sigtrace/issues" @@ -18,14 +18,6 @@ "type": "git", "url": "git+https://github.com/sigtrace-dev/sigtrace.git" }, - "files": [ - "dist/**/*.js", - "src/webview/**/*", - "package.json", - "LICENSE", - "icon.png", - "assets/**/*.svg" - ], "categories": [ "Debuggers", "Visualization", diff --git a/packages/extension/src/webview/app.js b/packages/extension/src/webview/app.js index c4cede9..082057b 100644 --- a/packages/extension/src/webview/app.js +++ b/packages/extension/src/webview/app.js @@ -903,37 +903,33 @@ }); btnClear.addEventListener('click', function() { - // Preserve pinned signal nodes โ€” tombstone them (reset data, keep id/name) - var pinnedNodesCopy = new Map(); - pinnedSignalIds.forEach(function(id) { - var node = nodeMap.get(id); - if (node) { - pinnedNodesCopy.set(id, { - id: node.id, - name: node.name, - component: node.component, - kind: node.kind, - value: node.value, - epoch: 0, - duration: 0, - lastUpdated: null, - sparkline: [], - loc: node.loc - }); - } - }); - // Preserve pinned chain log entries var pinnedChains = chainLog.filter(function(c) { return pinnedChainKeys.has(chainGroupKey(c)); }); - // Clear everything - nodeMap.clear(); - nodeAliasMap.clear(); - nodeSignatureMap.clear(); - componentMap.clear(); - chainLog = []; + // Reset statistics of all registered nodes without removing them from registry + nodeMap.forEach(function(node, id) { + node.epoch = 0; + node.duration = 0; + node.lastUpdated = null; + node.sparkline = []; + if (!pinnedSignalIds.has(id)) { + node.value = undefined; // clear value of unpinned nodes + } + }); + + // Reset component statistics + componentMap.forEach(function(comp) { + comp.totalUpdates = 0; + comp.slowestNode = null; + comp.slowestMs = 0; + comp.mostActiveNode = null; + comp.mostActiveCount = 0; + }); + + // Clear history logs and timeline chains + chainLog = pinnedChains; hiddenChainIds.clear(); expandedPinnedKeys.clear(); selectedSignalId = null; @@ -944,25 +940,6 @@ activeChain = null; clearTimeout(chainFlushTimer); - // Restore pinned nodes - pinnedNodesCopy.forEach(function(node, id) { - nodeMap.set(id, node); - ensureComponent(node); - - // Re-populate maps so future events link up to the existing pinned node references - nodeAliasMap.set(id, id); - var signature = [ - node.kind, - node.component, - node.name, - toLocKey(node.loc) - ].join('|'); - nodeSignatureMap.set(signature, id); - }); - - // Restore pinned chains - chainLog = pinnedChains; - // Update checkbox states updateTimelineCheckboxStates(); diff --git a/packages/jetbrains-plugin/build.gradle.kts b/packages/jetbrains-plugin/build.gradle.kts index cbdea4c..a26f815 100644 --- a/packages/jetbrains-plugin/build.gradle.kts +++ b/packages/jetbrains-plugin/build.gradle.kts @@ -5,7 +5,7 @@ plugins { } group = "dev.sigtrace" -version = "1.2.0" +version = "1.2.1" repositories { mavenCentral() diff --git a/packages/jetbrains-plugin/src/main/resources/webview/app.js b/packages/jetbrains-plugin/src/main/resources/webview/app.js index c4cede9..082057b 100644 --- a/packages/jetbrains-plugin/src/main/resources/webview/app.js +++ b/packages/jetbrains-plugin/src/main/resources/webview/app.js @@ -903,37 +903,33 @@ }); btnClear.addEventListener('click', function() { - // Preserve pinned signal nodes โ€” tombstone them (reset data, keep id/name) - var pinnedNodesCopy = new Map(); - pinnedSignalIds.forEach(function(id) { - var node = nodeMap.get(id); - if (node) { - pinnedNodesCopy.set(id, { - id: node.id, - name: node.name, - component: node.component, - kind: node.kind, - value: node.value, - epoch: 0, - duration: 0, - lastUpdated: null, - sparkline: [], - loc: node.loc - }); - } - }); - // Preserve pinned chain log entries var pinnedChains = chainLog.filter(function(c) { return pinnedChainKeys.has(chainGroupKey(c)); }); - // Clear everything - nodeMap.clear(); - nodeAliasMap.clear(); - nodeSignatureMap.clear(); - componentMap.clear(); - chainLog = []; + // Reset statistics of all registered nodes without removing them from registry + nodeMap.forEach(function(node, id) { + node.epoch = 0; + node.duration = 0; + node.lastUpdated = null; + node.sparkline = []; + if (!pinnedSignalIds.has(id)) { + node.value = undefined; // clear value of unpinned nodes + } + }); + + // Reset component statistics + componentMap.forEach(function(comp) { + comp.totalUpdates = 0; + comp.slowestNode = null; + comp.slowestMs = 0; + comp.mostActiveNode = null; + comp.mostActiveCount = 0; + }); + + // Clear history logs and timeline chains + chainLog = pinnedChains; hiddenChainIds.clear(); expandedPinnedKeys.clear(); selectedSignalId = null; @@ -944,25 +940,6 @@ activeChain = null; clearTimeout(chainFlushTimer); - // Restore pinned nodes - pinnedNodesCopy.forEach(function(node, id) { - nodeMap.set(id, node); - ensureComponent(node); - - // Re-populate maps so future events link up to the existing pinned node references - nodeAliasMap.set(id, id); - var signature = [ - node.kind, - node.component, - node.name, - toLocKey(node.loc) - ].join('|'); - nodeSignatureMap.set(signature, id); - }); - - // Restore pinned chains - chainLog = pinnedChains; - // Update checkbox states updateTimelineCheckboxStates(); diff --git a/packages/vite-plugin/package.json b/packages/vite-plugin/package.json index 93cac8a..c45ce30 100644 --- a/packages/vite-plugin/package.json +++ b/packages/vite-plugin/package.json @@ -1,6 +1,6 @@ { "name": "@sigtrace/vite", - "version": "1.2.0", + "version": "1.2.1", "type": "module", "description": "Vite compiler plugin for SigTrace AST instrumentation", "main": "dist/index.js", @@ -17,7 +17,7 @@ }, "homepage": "https://sigtrace.dev", "author": "SigTrace Contributors", - "license": "MIT", + "license": "ELv2", "keywords": [ "reactivity", "signals", diff --git a/releases/v1.2.0/sigtrace-core-1.2.0.tgz b/releases/v1.2.0/sigtrace-core-1.2.0.tgz new file mode 100644 index 0000000..9083ee1 Binary files /dev/null and b/releases/v1.2.0/sigtrace-core-1.2.0.tgz differ diff --git a/releases/v1.2.0/sigtrace-extension-1.2.0.vsix b/releases/v1.2.0/sigtrace-extension-1.2.0.vsix index 032a3ae..d7a8162 100644 Binary files a/releases/v1.2.0/sigtrace-extension-1.2.0.vsix and b/releases/v1.2.0/sigtrace-extension-1.2.0.vsix differ diff --git a/releases/v1.2.0/sigtrace-jetbrains-1.2.0.zip b/releases/v1.2.0/sigtrace-jetbrains-1.2.0.zip index 85866dc..db36a44 100644 Binary files a/releases/v1.2.0/sigtrace-jetbrains-1.2.0.zip and b/releases/v1.2.0/sigtrace-jetbrains-1.2.0.zip differ diff --git a/releases/v1.2.0/sigtrace-vite-1.2.0.tgz b/releases/v1.2.0/sigtrace-vite-1.2.0.tgz new file mode 100644 index 0000000..6f99c1d Binary files /dev/null and b/releases/v1.2.0/sigtrace-vite-1.2.0.tgz differ diff --git a/releases/v1.2.1/sigtrace-core-1.2.1.tgz b/releases/v1.2.1/sigtrace-core-1.2.1.tgz new file mode 100644 index 0000000..bad1c77 Binary files /dev/null and b/releases/v1.2.1/sigtrace-core-1.2.1.tgz differ diff --git a/releases/v1.2.1/sigtrace-extension-1.2.1.vsix b/releases/v1.2.1/sigtrace-extension-1.2.1.vsix new file mode 100644 index 0000000..c125699 Binary files /dev/null and b/releases/v1.2.1/sigtrace-extension-1.2.1.vsix differ diff --git a/releases/v1.2.1/sigtrace-jetbrains-1.2.1.zip b/releases/v1.2.1/sigtrace-jetbrains-1.2.1.zip new file mode 100644 index 0000000..dcd2487 Binary files /dev/null and b/releases/v1.2.1/sigtrace-jetbrains-1.2.1.zip differ diff --git a/releases/v1.2.1/sigtrace-vite-1.2.1.tgz b/releases/v1.2.1/sigtrace-vite-1.2.1.tgz new file mode 100644 index 0000000..cf2f230 Binary files /dev/null and b/releases/v1.2.1/sigtrace-vite-1.2.1.tgz differ