diff --git a/common/changes/@excom/fetchable-element/chrome-extension_2026-09-23-08-49.json b/common/changes/@excom/fetchable-element/chrome-extension_2026-09-23-08-49.json new file mode 100644 index 0000000..8f56e39 --- /dev/null +++ b/common/changes/@excom/fetchable-element/chrome-extension_2026-09-23-08-49.json @@ -0,0 +1,10 @@ +{ + "changes": [ + { + "packageName": "@excom/fetchable-element", + "comment": "Fix typo in error message.", + "type": "patch" + } + ], + "packageName": "@excom/fetchable-element" +} \ No newline at end of file diff --git a/packages/fetchable-element/index.ts b/packages/fetchable-element/index.ts index f161e51..eb8542b 100644 --- a/packages/fetchable-element/index.ts +++ b/packages/fetchable-element/index.ts @@ -380,7 +380,7 @@ async function callFetch( : await response.text(), }; if (responseData.status >= 400) { - throw new Error("Reponse error code: " + responseData.status); + throw new Error("Response error code: " + responseData.status); } return responseData; } catch (error) { diff --git a/packages/nucleus-devtools/public/icon/128.png b/packages/nucleus-devtools/public/icon/128.png new file mode 100644 index 0000000..7ff74c5 Binary files /dev/null and b/packages/nucleus-devtools/public/icon/128.png differ diff --git a/packages/nucleus-devtools/public/icon/16.png b/packages/nucleus-devtools/public/icon/16.png new file mode 100644 index 0000000..40fc6f4 Binary files /dev/null and b/packages/nucleus-devtools/public/icon/16.png differ diff --git a/packages/nucleus-devtools/public/icon/32.png b/packages/nucleus-devtools/public/icon/32.png new file mode 100644 index 0000000..22057ac Binary files /dev/null and b/packages/nucleus-devtools/public/icon/32.png differ diff --git a/packages/nucleus-devtools/public/icon/48.png b/packages/nucleus-devtools/public/icon/48.png new file mode 100644 index 0000000..0667e55 Binary files /dev/null and b/packages/nucleus-devtools/public/icon/48.png differ diff --git a/packages/nucleus-devtools/public/icon/96.png b/packages/nucleus-devtools/public/icon/96.png new file mode 100644 index 0000000..2f1a1ca Binary files /dev/null and b/packages/nucleus-devtools/public/icon/96.png differ diff --git a/packages/nucleus-devtools/support/docs/PRIVACY.md b/packages/nucleus-devtools/support/docs/PRIVACY.md new file mode 100644 index 0000000..926c8e1 --- /dev/null +++ b/packages/nucleus-devtools/support/docs/PRIVACY.md @@ -0,0 +1,26 @@ +# Privacy policy + +Nucleus DevTools collects no data. Everything it records stays inside your browser and is discarded when the page or tab closes. + +## What the extension does + +The extension installs a small probe on every page you open. The probe is dormant unless the page uses `@excom/neutron` or `@excom/quark`; on those pages it records element lifecycles and Quark rule runs so the **Element** pane in Chrome DevTools can show them. The optional paint heatmap draws an overlay inside the page; it writes nothing to the page's elements and disappears when switched off. + +## What is collected, stored or transmitted + +- **Collected:** nothing. The extension has no analytics, no telemetry, no crash reporting and no account. +- **Stored:** one boolean, the heatmap toggle, in `chrome.storage.session`. It is cleared when the browser closes. +- **Transmitted:** nothing. The extension makes no network requests and contains no remote code. + +Recorded lifecycle and rule data lives in the memory of the page it came from and is never persisted, copied to other tabs or sent anywhere. **Copy for AI** places a JSON report on your clipboard only when you click it; where you paste it is up to you. + +## Permissions + +- **Access to all sites** (`` content scripts): the probe must be present from the first byte of any page that might use the Nucleus Stack, and the extension cannot know which pages those are in advance. On every other page the probe does nothing. +- **storage:** the heatmap toggle above. + +## Contact + +Questions about this policy: open an issue at [github.com/excom-dev/nucleus](https://github.com/excom-dev/nucleus/issues). + +Last updated 2026-09-23. diff --git a/packages/nucleus-devtools/support/docs/README.md b/packages/nucleus-devtools/support/docs/README.md index dc27af5..aa04725 100644 --- a/packages/nucleus-devtools/support/docs/README.md +++ b/packages/nucleus-devtools/support/docs/README.md @@ -32,6 +32,15 @@ pane shows *who* changed it and *how*. ## Installation +> **Pending review.** The extension has been submitted to the Chrome Web Store and is awaiting Google's approval. Until it is listed, install it from the release zip: +> +> 1. Download `nucleus-devtools--chrome.zip` from the [latest GitHub release](https://github.com/excom-dev/nucleus/releases) and unzip it. +> 2. Open `chrome://extensions` and switch on **Developer mode** (top right). +> 3. Click **Load unpacked** and pick the unzipped folder. +> 4. Reload any Nucleus Stack page that was already open, then open DevTools → Elements → **Element** pane. +> +> A build installed this way does not update itself; grab the next release zip to update. This note goes away once the store listing is live. + Install from the [Chrome Web Store](https://chromewebstore.google.com/detail/nucleus-devtools) (also loads in Edge, Brave and other Chromium browsers). @@ -40,6 +49,9 @@ from the [GitHub releases](https://github.com/excom-dev/nucleus/releases), unzip it, open `chrome://extensions`, enable *Developer mode* and choose *Load unpacked*. +The extension collects no data and makes no network requests — see the +[privacy policy](./PRIVACY.md). + ## Usage 1. Open DevTools on a page built with the Nucleus Stack. diff --git a/packages/nucleus-devtools/support/icon/icon.svg b/packages/nucleus-devtools/support/icon/icon.svg new file mode 100644 index 0000000..1ef2966 --- /dev/null +++ b/packages/nucleus-devtools/support/icon/icon.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/packages/nucleus-devtools/support/store/LISTING.md b/packages/nucleus-devtools/support/store/LISTING.md new file mode 100644 index 0000000..a14cf98 --- /dev/null +++ b/packages/nucleus-devtools/support/store/LISTING.md @@ -0,0 +1,78 @@ +# Chrome Web Store listing + +Copy for the Developer Dashboard. Fields are named as the dashboard names +them (2026). The zip to upload is `.output/nucleus-devtools--chrome.zip` +from `pnpm run zip`. + +## Store listing + +**Title** (from manifest): Nucleus DevTools + +**Summary** (from manifest, 132 chars max): +Element sidebar — Neutron lifecycle and Quark orchestration publications for the selected element + +**Description**: + +See exactly what every element did and why — Neutron lifecycles and Quark rule applications, live, inside Chrome DevTools. + +Nucleus DevTools adds an "Element" pane to the Elements panel for pages built with the Nucleus Stack (@excom/neutron, @excom/quark). Select any node and read its history and current state: + +• Neutron — every lifecycle effect the element applied, with the exact props, events and calls it produced, plus its current props. +• Quark — every rule that matched the element, grouped per run: selector, declarations, resolved values, no-op / wipe / error status; plus its current $variables, Quark-written attributes and custom properties, listeners and iterate() row context. +• Hover any key to see the declaration that produced it. +• Live — new publications append as they happen. +• Paint heatmap — a toolbar toggle overlays every Quark-painted element with its paint count. +• Definition audits — Neutron element definitions are checked for attribute-naming mistakes; warnings go to the page console. +• Agent tools — eleven JSON tools (diagnostics, state_snapshot, explain_attribute, …) for coding agents, discoverable by chrome-devtools-mcp, and a "Copy for AI" button that produces a one-file bug report. + +Zero setup: no app changes, no debug flags. Works on any page using the Nucleus Stack; does nothing on other pages. Collects no data and makes no network requests. + +Documentation: https://excom.dev/nucleus/packages/nucleus-devtools + +**Category**: Developer Tools + +**Language**: English + +**Store icon**: `public/icon/128.png` (the dashboard reads it from the manifest; upload the same file if asked) + +**Screenshots** (1280×800 or 640×400, PNG, 1–5): take on https://excom.dev/nucleus/examples/todos with DevTools docked right, Elements panel, Element pane open: +1. Quark tab — a `
  • ` inside the todo list selected, rule rows expanded. +2. Neutron tab — a `provider-fetch` or `content-drawer` selected, lifecycle rows expanded. +3. Hover state — the declaration tooltip over a key. +4. Heatmap — toolbar popup with the toggle on and the overlay visible on the page. + +**Official URL**: https://excom.dev +**Homepage URL**: https://excom.dev/nucleus/packages/nucleus-devtools +**Support URL**: https://github.com/excom-dev/nucleus/issues + +## Privacy practices + +**Single purpose description**: +Adds a Chrome DevTools sidebar pane that shows, for the selected element, the Neutron lifecycle effects and Quark rule runs recorded on pages built with the Nucleus Stack, plus related debugging aids (paint heatmap, definition audits, JSON tools for coding agents). + +**Permission justification — storage**: +Holds a single session-scoped boolean: whether the paint-heatmap overlay is switched on. Cleared when the browser closes. + +**Host permission justification — `` (content scripts)**: +The probe must be installed at document_start on any page that might use the Nucleus Stack; the extension cannot know which pages those are in advance, and a page opened before the probe exists loses its lifecycle history. On pages without @excom/neutron or @excom/quark the probe stays dormant. No data leaves the page. + +**Are you using remote code?** No. + +**Data usage** — tick nothing under "What user data do you plan to collect?". Certify: +- I do not sell or transfer user data to third parties, outside of the approved use cases +- I do not use or transfer user data for purposes that are unrelated to my item's single purpose +- I do not use or transfer user data to determine creditworthiness or for lending purposes + +**Privacy policy URL**: https://excom.dev/nucleus/packages/nucleus-devtools/privacy + +## Distribution + +**Visibility**: Public +**Regions**: all +**Trader / non-trader** (EU DSA): non-trader (no goods or services sold through the item; keeps the developer address off the listing) +**Payments**: free + +## Account + +**Developer name** (public): excom +**Contact email** (public, must be verified): the excom alias mailbox, never a personal address diff --git a/packages/nucleus-devtools/wxt.config.ts b/packages/nucleus-devtools/wxt.config.ts index 96818a3..1b84270 100644 --- a/packages/nucleus-devtools/wxt.config.ts +++ b/packages/nucleus-devtools/wxt.config.ts @@ -12,6 +12,9 @@ export default defineConfig({ // `browser.storage.session` holds the global heatmap toggle. permissions: ["storage"], }, + // The npm name is scoped; WXT would otherwise emit + // `excomnucleus-devtools--chrome.zip`. + zip: { name: "nucleus-devtools" }, webExt: { startUrls: ["http://localhost:3001/"], },