Changelog
The complete release history, generated automatically from Changesets every time we publish to npm. Want only the highlights? Subscribe to GitHub Releases for a curated email feed.
vnext
upcomingpending (pending release)
v1.22
includes 1.22.1, 1.22.0- SSR / non-DOM safety: — `Mushi.init()` returns a no-op instance when `document`/`window` are unavailable (Next.js / Remix / Nuxt server components, plain Node SSR) instead of throwing when the widget constructs DOM nodes. A stray server-side init no longer takes down the host page.
- Public-API error isolation: — every public method is wrapped so a throw or rejection is logged + breadcrumbed and swallowed with a type-safe fallback. A malformed build or unexpected SDK state can never crash the host (including `diagnose()`, which still resolves to a valid result on the error path).
- Screenshot provider fallback: — a custom `screenshotProvider` that returns `null` now falls through to the built-in DOM capturer instead of silently producing no screenshot.
- Identify de-duplication: — `identify()` / `identifyWithToken()` skip the widget re-render and rewards/inbox refetch when the same user/token-subject is re-applied — hosts that re-identify on every focus / `visibilitychange` / auth re-check no longer flash the banner or thrash the rewards API.
- Runtime-config banner re-assert: — a console-pushed banner change (re-enabled trigger or new copy) clears a stale session dismissal so it actually reappears.
- Proactive triggers — no longer force-open the reporter while offline.
- Endpoint circuit breaker: — after consecutive unreachable failures the API client fast-fails for a cooldown (then half-opens) instead of hammering a down endpoint; fast-failed reports still reach the offline queue. Opt out via `circuitBreaker.enabled: false`.
- Configurable transport: — `timeout`, `maxRetries`, and `circuitBreaker` are now exposed on `MushiConfig` and threaded into the API client. `DEFAULT_TIMEOUT` / `DEFAULT_MAX_RETRIES` are exported.
- Native-shell detection: — best-effort `capacitor` / `cordova` / `reactNative` flags on `MushiEnvironment.native` (SSR-guarded) so triage can distinguish native-WebView reports from browser ones.
v1.21
includes 1.21.1, 1.21.0- Rewards listeners install once — web rewards now wires its route/click/dwell listeners exactly once per page. Previously every `identify()` / `identifyWithToken()` call re-wrapped `history.pushState` and re-added the `popstate`/`click`/`MutationObserver` handlers, leaking listeners and double-counting activity and reward events. Re-identifying a user no longer re-installs DOM hooks.
v1.20
includes 1.20.2, 1.20.0- `capture.screenshotProvider` — — an optional `() => Promise<string | null>` that lets a host (e.g. a Capacitor/WebView app) supply a real pixel-accurate screen grab from a native plugin instead of the built-in DOM-snapshot capturer. The built-in capturer is used as a fallback when the provider throws.
- "Reporting as <name>" — — when the host calls `Mushi.identify()` / `Mushi.identifyWithToken()`, the report details step now shows who the report will be attributed to. Cleared when `identifyWithToken(null)` is called.
v1.19
includes 1.19.2, 1.19.1, 1.19.0- Favicon trust boundary — (`@mushi-mushi/core`): `readPageFaviconHref` now returns only http(s) URLs, so a host page can't get a `data:` / `blob:` / `javascript:` favicon rendered into the widget's `<img src>`; anything else falls back to the default mark.
- Self-hosted credential message — (`@mushi-mushi/core`, `@mushi-mushi/react-native`): the one-time 401/403 "credentials rejected" warning only links to the hosted console when the client is actually using the Cloud endpoint; self-hosted deployments get a console-agnostic message instead of a wrong domain.
- Offline-queue data loss — (`@mushi-mushi/react-native`): `decryptQueueBlob` now decrypts any blob carrying the encrypted prefix regardless of the current `secureStorage` flag. Previously, toggling `secureStorage` from `true` to `false` returned the still-encrypted string, which failed `JSON.parse` and silently cleared the offline report queue.
- CLI — `mushi login` now implements RFC 8628 browser device-auth (zero copy-paste). Opens the console in the browser, user clicks Approve, CLI receives a session token automatically, then lists/creates a project and saves the API key. `--api-key` flag remains as the CI/non-interactive fallback.
- Core SDK — 401/403 responses now emit a one-time `console.error` with a clear credential-failure message and the console URL, instead of silently entering the offline retry queue.
- React Native — Same 401/403 credential-failure detection in `MushiProvider.submitReport` — skips enqueue and surfaces the error immediately.
- core/types — new `widget.screenshotSensitiveHint?: boolean | string` config. `true` (default) shows the localized caption, a string overrides it verbatim, `false` hides the caption (the preview + remove control always remain). Travels in the `widget` block of `GET /v1/sdk/config`, so it's settable per-host via the SDK and remotely via the Mushi console runtime config.
- web/widget — the details step now renders the attached screenshot as an `<img>` preview (previously only a "Screenshot attached ✓" label) with an optional privacy caption beneath it. The preview stays in sync through the annotate/markup flow and clears when the screenshot is removed. Image `src` and caption are HTML-escaped. New `en`/`es`/`ja`/`th` strings.
- react-native — the bottom sheet's existing screenshot thumbnail gains the same configurable privacy caption, resolved by the provider from `widget.screenshotSensitiveHint`.
- core/queue — A transient submit failure whose bumped attempt-counter could not be persisted (e.g. an IndexedDB write error) previously re-flushed the row forever, bypassing `MAX_DELIVERY_ATTEMPTS` until the 24h age sweep. Row mutation now goes through backend-aware `removeRow`/`persistRow` helpers (no silent cross-backend no-op), and a report whose counter can't be saved is dropped immediately instead of looping (Sentry 14751132/0).
- web/widget — Pressing Back to the category step now collapses an expanded "more issue types" list instead of leaving it open across navigation (Sentry 14751132/1).
- web/widget-render — `aria-label`, `placeholder`, and the header eyebrow now route their interpolated locale strings through `escapeHtml`, closing a latent XSS vector if a translation contains markup.
v1.18
includes 1.18.0- web — Category step now shows only the primary "bug" option by default; a "More issue types →" toggle reveals the remaining categories. Back navigation added for `success`, `account`, and `cross-app-reports` steps. Back button now renders with "← Back" label. Panel width 384px→360px and max-height 640px→480px for better fit on smaller viewports.
- core — Offline queue no longer retries forever on undeliverable reports. `MAX_DELIVERY_ATTEMPTS = 8` drops a row after 8 transient failures; `MAX_QUEUE_AGE_MS = 24h` hard-evicts stale rows on the next flush, including legacy rows that predate the per-row attempt counter.
v1.17
includes 1.17.0- In-SDK assistant ("Ask" tab): — the web widget gains a knowledge-grounded `Ask` tab backed by `apiClient.askAssistant({ message, threadId, context })`. New `MushiAssistantConfig` / `MushiAssistantStep` / `MushiAssistantReply` types in `@mushi-mushi/core`.
- Page context: — `publishPageContext()` lets the host publish the current route/title/summary/filters/selection so the assistant and reports are page-aware. New `MushiPageContext` type.
- Signed identity: — `identifyWithToken({ token })` forwards a host-minted identity JWT on the `X-Mushi-User-Token` header (verified server-side) — the trust anchor for "My Reports", rewards, and the per-user assistant index. Added on web and the Capacitor bridge. `@mushi-mushi/core` exports `buildIdentityClaims`, `parseIdentityToken`, and `MUSHI_IDENTITY_TOKEN_PREFIX`.
- Design tokens: — `@mushi-mushi/core` now exports `mushiTokens` / `mushiPalette` plus `MUSHI_COLORS_LIGHT`, `MUSHI_COLORS_DARK`, `MUSHI_SPACING`, `MUSHI_RADIUS`, `MUSHI_TYPE`, `MUSHI_Z`, `MUSHI_MOTION`, `MUSHI_GEOMETRY`, and `MUSHI_COPY` so every SDK skins the widget from one source.
v1.15
includes 1.15.0v1.14
includes 1.14.1, 1.14.0- Web — Pointer Events drag with tap-vs-drag threshold (6 px), safe-area clamping, optional edge-snap on release, per-project `localStorage` persistence, arrow-key nudge for keyboard accessibility. New `draggable?: boolean | { persist?, snapToEdge?, axis? }` config type in `@mushi-mushi/core`.
- React Native — `PanResponder`-based drag + `AsyncStorage` persistence + safe-area clamping.
- Flutter — Long-press-to-drag via `GestureDetector` + `SharedPreferences` persistence + edge-snap.
- iOS — `UIPanGestureRecognizer` via `MushiFabDragController` + `UserDefaults` persistence + animated edge-snap.
- Android — `OnTouchListener` tap-vs-drag + `SharedPreferences` persistence + optional edge-snap. New `DraggableConfig` data class.
- All platforms — New `theme: 'inherit'` resolves the host app's dark mode at runtime (`prefers-color-scheme` / `color-scheme` on web, `traitCollection.userInterfaceStyle` on iOS, `UiModeManager` on Android, `Brightness` on Flutter). New `accent` + `accentText` config tokens for brand-color override.
- Web — Parameterized `getWidgetStyles(theme, accent)` with `widgetAccent` / `widgetAccentWash` / `widgetAccentInk` tokens; fixed undefined `var(--mushi-text-dim)` references; WCAG AA re-verified in both themes.
- React Native / Android — Explicit disabled-state colors (no more white-on-white disabled buttons).
- Web — `visualViewport` manager on `open()`; lifts panel above mobile keyboard; scrolls focused `textarea` / `input` into view; `100dvh` bottom-sheet layout on narrow viewports; torn down on `close()` / `destroy()`.
- React Native — `KeyboardAvoidingView` `behavior="height"` (Android) + `ScrollView(keyboardShouldPersistTaps)`.
- Flutter — `SingleChildScrollView` + `MediaQuery.viewInsets.bottom` inset.
- iOS — `keyboardWillShow` / `keyboardWillHide` observers + `CGAffineTransform` lift.
v1.13
includes 1.13.0v1.12
includes 1.12.1, 1.12.0- New: — `checkReportPayloadSize`, `estimateJsonBytes`, `formatBytes`, and `MAX_REPORT_PAYLOAD_BYTES` payload-guard helpers. `checkReportPayloadSize` serializes once and reports a distinct `serializeFailed` outcome (e.g. circular references in metadata) instead of a generic "too large".
- Hardening: — the offline retry queue now treats `PAYLOAD_TOO_LARGE` and `SERIALIZE_FAILED` as permanent failures, so a single oversized report can no longer poison-pill the queue and block every later report.
- New — session replay: — opt-in `capture.replay: 'rrweb' | 'lite' | 'sentry' | 'off'` records a rolling buffer that attaches to the report on submit. rrweb recording masks all text and inputs by default (`maskAllText` + `maskAllInputs`), records continuously from init, and trims the buffer while preserving the most recent full snapshot so replays stay playable. `'off'` is the default.
- New — screenshot annotation: — the report panel's "Mark up" button opens an interactive overlay (highlight / blur / arrow) so reporters can circle the problem and redact sensitive regions before submitting. The annotation session stays open until the reporter confirms with "Done"; touch strokes now resolve correctly on lift (`touchend`).
- New — screenshot compression — before upload to keep payloads small.
- Hardening: — oversized reports are progressively degraded — drop the replay buffer, then the screenshot — before being dropped entirely with a `report:failed` event, so the offline queue is never wedged. The replay capture is now torn down on `Mushi.destroy()` (no observer/listener leak) and guarded against an init/`updateConfig` race that could install a stale capture.
v1.11
includes 1.11.0v1.10
includes 1.10.0v1.9
includes 1.9.0v1.8
includes 1.8.0v1.7
includes 1.7.8, 1.7.7, 1.7.6, 1.7.5, 1.7.4, 1.7.2, 1.7.1, 1.7.0- Layout changed from diamond to horizontal row — (Plan → Do → Check → Act) for left-to-right reading flow.
- Act→Plan loop-back arc — hand-crafted cubic-bezier `M act.bottom C act.bottom+120 plan.bottom+120 plan.bottom` so the return path sweeps 120 px below the node row rather than producing a flat line (the previous `getBezierPath` Bottom→Bottom path with equal source/target Y resolved to zero curvature).
- Arrow opacity — all edge main-stroke paths are now `opacity: 1` unconditionally — inactive edges were previously rendered at 88 % which read as transparent at fitView zoom. Track layer raised from 12 % to 22 %, glow layer from 13 % to 22 %.
- Auto-fit on init — added `onInit` callback that defers `rf.fitView()` one animation frame. The `fitView` prop fires before edge paths are measured, so without this the loop arc's bounding box was excluded and the view was clipped on first load.
- Canvas height — raised from 320 → 380 px (live variant) to accommodate the loop arc.
- Minimap removed — — unnecessary for a fixed 4-node diagram; reclaims ~88 px of vertical canvas.
- X-axis — 5 evenly-spaced date tick labels (was only first + last).
- Y-axis — max + midpoint + 0 reference lines (was max + 0 only).
- Value labels — suppressed when bar < 20 % of max to prevent overlap on dense data.
- Ghost bars — zero-report days now show a 4 px dashed placeholder so the grid is visually consistent.
- Chart height — raised from `h-24` (96 px) to `h-[7rem]` (112 px) for better vertical resolution.
- Segment min-height — each severity span gets `minHeight: 2px` so a 1-report slice of 100-report day is always visible.
v1.6
includes 1.6.0- Rewards subsystem — (`src/rewards.ts`): full tester-rewards API — `initRewards`, `updateRewardsUser`, `getTier`, `enqueueActivity`. Connects to `/v1/rewards/*` backend endpoints.
- Proactive triggers — (`src/proactive-triggers.ts`): schedule-based and event-based triggers that surface the widget at the right moment without developer code.
- `pulseTrigger()` — widget-level pulse animation accessible from `Mushi.pulseTrigger()`.
- Screenshot simplification — `screenshot.take()` now returns `Promise<string | null>` — callers no longer need to check an `{ ok, dataUrl }` result object.
- `beforeSendFeedback` + `onCrashedLastRun` — lifecycle hooks wired into the init flow.
- `mushi project create` — command: provisions a new Mushi project, mints an API key with `mcp:read+write` scope, and writes `.env.local` + `.cursor/mcp.json`.
- `mushi doctor` — pre-flight checks — verifies CLI config, endpoint reachability, SDK install, and optional server preflight.
- `mushi nudge` — generates a paste-ready `Mushi.init()` snippet tuned for alpha / beta / ga release phases.
v1.5
includes 1.5.0v1.4
includes 1.4.0- INP (Interaction to Next Paint) capture — a Google Core Web Vital since March 2024, replacing First Input Delay. The SDK now installs a `PerformanceObserver({ type: 'event', durationThreshold: 40 })` and records the worst-observed user-interaction latency on every report, with **attribution** — `eventType`, `targetSelector` (e.g. `button#submit.primary`), and per-phase timings (input delay / processing / presentation) so the triage UI can render "1200 ms click on `<button.checkout>`" instead of a bare number. Falls back to a `first-input` observer for FID on Safari < 16.4. Adds ~700 B gzipped to the bundle (still under the 44 KB budget at 43.07 kB).
- `beforeSendFeedback` hook — (Sentry SDK feedback spec §4): last-chance synchronous or async hook fired AFTER pre-filter / on-device classifier / rate-limit gates pass and BEFORE the report is sent or queued. Returning `null` drops the report silently; throwing or timing out (>2 s) ships the unmodified report so a buggy hook never swallows feedback.
- `onCrashedLastRun` hook — (Sentry SDK feedback spec §6): fires once on `Mushi.init` after detecting that the previous tab session ended without a clean `pagehide`. The SDK never auto-opens the widget — copy and timing are the host's call. Implementation uses a `localStorage` sentinel that's set on init and cleared on `pagehide` (the only reliably-fired end-of-session event in 2026).
v1.3
includes 1.3.0v1.2
includes 1.2.1, 1.2.0- `mushi sync-lessons` — — pulls promoted lessons from `/v1/admin/lessons` and writes `.mushi/lessons.json` into the connected repo (supports `--dry-run` and `--json`). Designed for CI and scheduled refresh PRs.
- MCP — — `lessons.query(diff_text, max_tokens)` tool for token-budget-ranked lesson injection into agent / PR-review flows; expanded catalog surface for Migration Hub and closed-loop resources.
v1.1
includes 1.1.1, 1.1.0- In-SDK assistant ("Ask" tab): — the web widget gains a knowledge-grounded `Ask` tab backed by `apiClient.askAssistant({ message, threadId, context })`. New `MushiAssistantConfig` / `MushiAssistantStep` / `MushiAssistantReply` types in `@mushi-mushi/core`.
- Page context: — `publishPageContext()` lets the host publish the current route/title/summary/filters/selection so the assistant and reports are page-aware. New `MushiPageContext` type.
- Signed identity: — `identifyWithToken({ token })` forwards a host-minted identity JWT on the `X-Mushi-User-Token` header (verified server-side) — the trust anchor for "My Reports", rewards, and the per-user assistant index. Added on web and the Capacitor bridge. `@mushi-mushi/core` exports `buildIdentityClaims`, `parseIdentityToken`, and `MUSHI_IDENTITY_TOKEN_PREFIX`.
- Design tokens: — `@mushi-mushi/core` now exports `mushiTokens` / `mushiPalette` plus `MUSHI_COLORS_LIGHT`, `MUSHI_COLORS_DARK`, `MUSHI_SPACING`, `MUSHI_RADIUS`, `MUSHI_TYPE`, `MUSHI_Z`, `MUSHI_MOTION`, `MUSHI_GEOMETRY`, and `MUSHI_COPY` so every SDK skins the widget from one source.
- `mushi sync-lessons` — — pulls promoted lessons from `/v1/admin/lessons` and writes `.mushi/lessons.json` into the connected repo (supports `--dry-run` and `--json`). Designed for CI and scheduled refresh PRs.
- MCP — — `lessons.query(diff_text, max_tokens)` tool for token-budget-ranked lesson injection into agent / PR-review flows; expanded catalog surface for Migration Hub and closed-loop resources.
v1.0
includes 1.0.2, 1.0.1, 1.0.0- `createBreadcrumbBuffer(options?)` — — 50-entry ring buffer of `{ timestamp, category, level, message, data? }`. Long messages truncate at 500 chars _at insert time_ so a runaway log line can't push useful crumbs out of the buffer. PII scrubbing runs at report-snapshot time (not at insert) so in-app debugging stays unredacted while the wire payload stays clean.
- `normaliseThrown(thrown)` — — turns any thrown value (`Error`, string, plain object, `null`, frozen `DOMException`) into `{ name, message, stack?, cause? }` with an 8 KB stack cap and cyclic-cause guards. Powers `Mushi.captureException()`; exposed so adapters (Vue / Svelte / Angular / RN) can ship their own thin wrappers without re-implementing the normalisation.
- `captureEnvironment()` expansion — — same one-call API, richer payload: viewport + screen + DPR, **User-Agent Client Hints** when supported (`brands`, `mobile`, `platform`, `model`, plus the high-entropy values resolved out-of-band and folded back in on the next capture), accessibility prefs (`prefers-reduced-motion`, `prefers-color-scheme`, `prefers-contrast`), online / displayMode / page title, and a one-shot **page-load timing** read from `PerformanceNavigationTiming` (TTFB, DOMContentLoaded, FCP, LCP). Every individual field stays optional so a Safari / Firefox / iOS WebView still produces a useful payload.
v0.23
includes 0.23.0- Create React App — (`react-scripts`) → `@mushi-mushi/react` with the `REACT_APP_` env prefix (previously mis-detected as plain React and given the wrong `VITE_` prefix).
- Remix — (`@remix-run/*`) → `@mushi-mushi/react` using the runtime `window.ENV` root-loader pattern with bare `MUSHI_*` server env (Remix doesn't inline client env at build time).
- Astro — (`astro`) → `@mushi-mushi/web` with the `PUBLIC_` prefix.
- Solid / SolidStart — (`@solidjs/start`, `solid-js`) → `@mushi-mushi/web` with the `VITE_` prefix.
v0.22
includes 0.22.1, 0.22.0- CLI keeps your `.env.local` — `mushi project create` no longer overwrites an existing `.env.local`. It reads the current file, replaces only prior `MUSHI_*` lines (bare and framework-prefixed), and appends a fresh Mushi block — preserving `DATABASE_URL`, `NEXT_PUBLIC_*`, Stripe keys, and everything else. Re-runs are idempotent.
v0.21
includes 0.21.0v0.20
includes 0.20.1, 0.20.0- `mushi init` wizard — new `acquireCredentials` step. Precedence: explicit `--project-id`/`--api-key` flags (CI) → saved credentials from a prior login (offer to reuse) → **browser sign-in (default)** → manual paste fallback. Any browser-path failure falls back to manual entry; the wizard never hard-fails.
- `mushi project create` — rewritten on the shared device-auth flow. Fixes three bugs: it no longer points at a dead hardcoded endpoint, no longer links to a 404 `/sign-up` console URL, and no longer tells you to copy a BYOK-type key (it mints the correct `report:write` SDK ingest key server-side). `--no-browser` prints the URL for headless/SSH; `--name` skips the prompt.
- `mushi login` — refactored onto the same shared `device-auth` primitives (DRY) while keeping its terminal UX (a dot per pending poll, precise per-state error messages).
- New `device-auth.ts` module — the RFC 8628 client (`startDeviceAuth`, `pollDeviceToken`, `waitForCliToken`, `listProjects`, `createProject`, `mintProjectKey`) is now implemented once and shared across `init`, `login`, and `project create`. Every request carries a 15s timeout so a hung network never wedges setup. Covered by new unit tests.
- Resilient device-auth polling — `waitForCliToken` (and the `mushi login` poll loop) now tolerate up to 5 consecutive transient poll errors (network blips / 5xx), resetting on any successful poll, instead of aborting a sign-in the moment one request drops. Denial and expiry remain terminal.
- `mushi init --yes` keeps browser sign-in — `--yes` no longer forces the legacy manual Project ID + API key paste; it goes straight to the (default) browser sign-in and only falls back to manual entry if that fails.
- `mushi project create` honors a saved endpoint — it now resolves the endpoint as `--endpoint` → `MUSHI_API_ENDPOINT` → saved `mushi config endpoint` → Cloud default, so self-hosted users aren't silently redirected to Mushi Cloud.
- Safer browser open — `openInBrowser` validates the URL is http(s) and launches via `spawn` with an argument array instead of building a shell command string, removing the command-injection surface (CodeQL).
- Linear trailing-slash trim — `normalizeConsoleBase` no longer uses a backtracking `/\/+$/` regex (ReDoS / CodeQL polynomial-regex alert).
- `mushi connect` flag clarity — `--write-env` / `--wire-ide` now actually force their action on (overriding a prior `--no-env` / `--no-ide`) instead of being silent no-ops.
- React Native types resolve after publish — removed the `web-i18n.d.ts` ambient shim that re-exported `MushiLocale` from a monorepo-relative source path (`../../web/src/i18n/types`) that does not exist in a published install. `@mushi-mushi/web` already ships proper `./i18n` types via its `exports` map, which `moduleResolution: "bundler"`/`nodenext` resolves directly.
v0.19
includes 0.19.2, 0.19.1, 0.19.0- CLI — `mushi login` now implements RFC 8628 browser device-auth (zero copy-paste). Opens the console in the browser, user clicks Approve, CLI receives a session token automatically, then lists/creates a project and saves the API key. `--api-key` flag remains as the CI/non-interactive fallback.
- Core SDK — 401/403 responses now emit a one-time `console.error` with a clear credential-failure message and the console URL, instead of silently entering the offline retry queue.
- React Native — Same 401/403 credential-failure detection in `MushiProvider.submitReport` — skips enqueue and surfaces the error immediately.
- Favicon trust boundary — (`@mushi-mushi/core`): `readPageFaviconHref` now returns only http(s) URLs, so a host page can't get a `data:` / `blob:` / `javascript:` favicon rendered into the widget's `<img src>`; anything else falls back to the default mark.
- Self-hosted credential message — (`@mushi-mushi/core`, `@mushi-mushi/react-native`): the one-time 401/403 "credentials rejected" warning only links to the hosted console when the client is actually using the Cloud endpoint; self-hosted deployments get a console-agnostic message instead of a wrong domain.
- Offline-queue data loss — (`@mushi-mushi/react-native`): `decryptQueueBlob` now decrypts any blob carrying the encrypted prefix regardless of the current `secureStorage` flag. Previously, toggling `secureStorage` from `true` to `false` returned the still-encrypted string, which failed `JSON.parse` and silently cleared the offline report queue.
- core/types — new `widget.screenshotSensitiveHint?: boolean | string` config. `true` (default) shows the localized caption, a string overrides it verbatim, `false` hides the caption (the preview + remove control always remain). Travels in the `widget` block of `GET /v1/sdk/config`, so it's settable per-host via the SDK and remotely via the Mushi console runtime config.
- web/widget — the details step now renders the attached screenshot as an `<img>` preview (previously only a "Screenshot attached ✓" label) with an optional privacy caption beneath it. The preview stays in sync through the annotate/markup flow and clears when the screenshot is removed. Image `src` and caption are HTML-escaped. New `en`/`es`/`ja`/`th` strings.
- react-native — the bottom sheet's existing screenshot thumbnail gains the same configurable privacy caption, resolved by the provider from `widget.screenshotSensitiveHint`.
v0.18
includes 0.18.2, 0.18.1, 0.18.0- inventory-schema — migrate to **Zod 4** (`zod@^4.4.3`), aligning with `@mushi-mushi/mcp` and `@mushi-mushi/agents`, which were already on v4. The public API is unchanged; the validation-issue path formatter now handles Zod 4's widened `PropertyKey[]` issue paths.
- cli — bump `commander` to **v15** (ESM-only; the CLI is already pure ESM, so the change is transparent to consumers).
- mcp-ci — bump `@actions/core` to **v3** (ESM-only, Node 24-ready; bundled via tsup).
- react-native — build and test against **react-native 0.86**. `StyleSheet.absoluteFillObject` was dropped from RN 0.86's TypeScript types, so the backdrop style now inlines the equivalent absolute-fill literal — runtime behavior is identical and it compiles against all supported `react-native >= 0.72`.
- cli — bump `commander` to **v15** (now ESM-only; the CLI is already pure ESM, so the change is transparent to consumers).
- Rewrote every tool description — to a consistent template — front-loaded verb + object, explicit return shape, side-effects/idempotency, usage guidance with sibling cross-references, and an example. All four annotation hints (`readOnly`, `destructive`, `idempotent`, `openWorld`) are now explicit per tool.
- Renamed off-pattern tools to `verb_object` — (old names still resolve for one release via the deprecated-alias map): `fix_suggest` → `suggest_fix`, `inventory_get` → `get_inventory`, `inventory_diff` → `diff_inventory`, `inventory_findings` → `list_gate_findings`, `graph_neighborhood` → `get_graph_neighborhood`, `graph_node_status` → `get_graph_node`.
- Removed deprecated tools — superseded by a single entry point: `setup_check`, `ingest_setup_check`, and `diagnose_connection` are replaced by `diagnose_setup` (`mode=full|ingest|dispatch`); `get_activation_status` → the `activation_status` tool/resource; `get_reporter_thread` → `get_report_timeline`.
- Lean default tool surface. — When `MUSHI_FEATURES` is unset, the stdio server now exposes the focused `DEFAULT_FEATURE_GROUPS` (triage + fixes + inventory + setup + docs) instead of the full catalog. Set `MUSHI_FEATURES=all` (or a CSV of groups, e.g. `triage,qa,skills`) to widen the surface. The CODEBASE tools are now grouped under `codebase`.
- Reporter identity (fixes anonymous-token reporter): — `submitReport` now emits nested `metadata.user = { id, email, name, provider }` — the shape the server's `resolveEndUser()` reads — while keeping the flat `userId/userEmail/userName` keys for back-compat. Adds a `setUser()` alias next to `identify()`.
- Sentry-level payload: — every report now carries a per-launch `sessionId`, `sdkPackage`/`sdkVersion`/`appVersion`, a device `fingerprintHash`, and a 50-entry breadcrumb ring buffer that is also sent as a derived repro `timeline` (so the admin "Repro timeline" renders instead of nudging "Upgrade the SDK"). New `addBreadcrumb()` method; `setScreen()` auto-adds a navigation breadcrumb.
- Screenshots: — new `capture.screenshot` config flag (default on) gating the optional `react-native-view-shot` capture; documented masking guidance for sensitive screens.
v0.17
includes 0.17.2, 0.17.1, 0.17.0- New: — `checkReportPayloadSize`, `estimateJsonBytes`, `formatBytes`, and `MAX_REPORT_PAYLOAD_BYTES` payload-guard helpers. `checkReportPayloadSize` serializes once and reports a distinct `serializeFailed` outcome (e.g. circular references in metadata) instead of a generic "too large".
- Hardening: — the offline retry queue now treats `PAYLOAD_TOO_LARGE` and `SERIALIZE_FAILED` as permanent failures, so a single oversized report can no longer poison-pill the queue and block every later report.
- New — session replay: — opt-in `capture.replay: 'rrweb' | 'lite' | 'sentry' | 'off'` records a rolling buffer that attaches to the report on submit. rrweb recording masks all text and inputs by default (`maskAllText` + `maskAllInputs`), records continuously from init, and trims the buffer while preserving the most recent full snapshot so replays stay playable. `'off'` is the default.
- New — screenshot annotation: — the report panel's "Mark up" button opens an interactive overlay (highlight / blur / arrow) so reporters can circle the problem and redact sensitive regions before submitting. The annotation session stays open until the reporter confirms with "Done"; touch strokes now resolve correctly on lift (`touchend`).
- New — screenshot compression — before upload to keep payloads small.
- Hardening: — oversized reports are progressively degraded — drop the replay buffer, then the screenshot — before being dropped entirely with a `report:failed` event, so the offline queue is never wedged. The replay capture is now torn down on `Mushi.destroy()` (no observer/listener leak) and guarded against an init/`updateConfig` race that could install a stale capture.
v0.16
includes 0.16.2, 0.16.1, 0.16.0- Account mode — an org-scoped API key (no `MUSHI_PROJECT_ID` required) now lets the server resolve project IDs per tool call and exposes an enriched `get_account_overview` (accessible projects with report counts + MCP key stats). `list_projects` reflects account-mode capabilities. Project-scoped keys keep their single-project restriction.
- stdio fix — all logger and `console.*` output is routed to stderr so stdout carries only JSON-RPC. This stops the Cursor/Claude stdio transport from being corrupted by non-protocol bytes (the cause of intermittent red-badge "transport error" connections).
- Web — Pointer Events drag with tap-vs-drag threshold (6 px), safe-area clamping, optional edge-snap on release, per-project `localStorage` persistence, arrow-key nudge for keyboard accessibility. New `draggable?: boolean | { persist?, snapToEdge?, axis? }` config type in `@mushi-mushi/core`.
- React Native — `PanResponder`-based drag + `AsyncStorage` persistence + safe-area clamping.
- Flutter — Long-press-to-drag via `GestureDetector` + `SharedPreferences` persistence + edge-snap.
- iOS — `UIPanGestureRecognizer` via `MushiFabDragController` + `UserDefaults` persistence + animated edge-snap.
- Android — `OnTouchListener` tap-vs-drag + `SharedPreferences` persistence + optional edge-snap. New `DraggableConfig` data class.
- All platforms — New `theme: 'inherit'` resolves the host app's dark mode at runtime (`prefers-color-scheme` / `color-scheme` on web, `traitCollection.userInterfaceStyle` on iOS, `UiModeManager` on Android, `Brightness` on Flutter). New `accent` + `accentText` config tokens for brand-color override.
- Web — Parameterized `getWidgetStyles(theme, accent)` with `widgetAccent` / `widgetAccentWash` / `widgetAccentInk` tokens; fixed undefined `var(--mushi-text-dim)` references; WCAG AA re-verified in both themes.
- React Native / Android — Explicit disabled-state colors (no more white-on-white disabled buttons).
- Web — `visualViewport` manager on `open()`; lifts panel above mobile keyboard; scrolls focused `textarea` / `input` into view; `100dvh` bottom-sheet layout on narrow viewports; torn down on `close()` / `destroy()`.
- React Native — `KeyboardAvoidingView` `behavior="height"` (Android) + `ScrollView(keyboardShouldPersistTaps)`.
v0.15
includes 0.15.2, 0.15.1, 0.15.0- CLI — new `mushi skills` (`list`, `show`, `sync`) and `mushi pipeline` (`start`, `watch`, `checkin`) command groups. Browse the synced skill catalog, start a pipeline for a report, print the composed run packet, and check step progress back in from the terminal or CI.
- MCP — five new tools so a Cursor agent can close the loop without leaving the IDE — `list_skills` and `get_skill` (read), plus `start_skill_pipeline`, `get_pipeline_run`, and `checkin_pipeline_step` (write). Each tool now advertises the correct title and `readOnlyHint` from the shared catalog so MCP clients render the right UI.
- plugin-sdk — new `skill_pipeline.step.dispatched` event. Plugins can subscribe to react when a pipeline step is dispatched in cloud mode; the event payload carries `{ runId, stepIndex, skillSlug, contextPacket, projectId }`.
- plugin-cursor-cloud — handles `skill_pipeline.step.dispatched` by running the step's pre-composed context packet as a Cursor Cloud agent, storing the agent run id on the step, and checking the step back in. Emits a clear warning when `MUSHI_API_KEY` or `repoUrl` is unset so dispatches can no longer fail silently.
- New: — `checkReportPayloadSize`, `estimateJsonBytes`, `formatBytes`, and `MAX_REPORT_PAYLOAD_BYTES` payload-guard helpers. `checkReportPayloadSize` serializes once and reports a distinct `serializeFailed` outcome (e.g. circular references in metadata) instead of a generic "too large".
- Hardening: — the offline retry queue now treats `PAYLOAD_TOO_LARGE` and `SERIALIZE_FAILED` as permanent failures, so a single oversized report can no longer poison-pill the queue and block every later report.
- New — session replay: — opt-in `capture.replay: 'rrweb' | 'lite' | 'sentry' | 'off'` records a rolling buffer that attaches to the report on submit. rrweb recording masks all text and inputs by default (`maskAllText` + `maskAllInputs`), records continuously from init, and trims the buffer while preserving the most recent full snapshot so replays stay playable. `'off'` is the default.
- New — screenshot annotation: — the report panel's "Mark up" button opens an interactive overlay (highlight / blur / arrow) so reporters can circle the problem and redact sensitive regions before submitting. The annotation session stays open until the reporter confirms with "Done"; touch strokes now resolve correctly on lift (`touchend`).
- New — screenshot compression — before upload to keep payloads small.
- Hardening: — oversized reports are progressively degraded — drop the replay buffer, then the screenshot — before being dropped entirely with a `report:failed` event, so the offline queue is never wedged. The replay capture is now torn down on `Mushi.destroy()` (no observer/listener leak) and guarded against an init/`updateConfig` race that could install a stale capture.
v0.14
includes 0.14.1, 0.14.0v0.13
includes 0.13.1, 0.13.0- New: — `checkReportPayloadSize`, `estimateJsonBytes`, `formatBytes`, and `MAX_REPORT_PAYLOAD_BYTES` payload-guard helpers. `checkReportPayloadSize` serializes once and reports a distinct `serializeFailed` outcome (e.g. circular references in metadata) instead of a generic "too large".
- Hardening: — the offline retry queue now treats `PAYLOAD_TOO_LARGE` and `SERIALIZE_FAILED` as permanent failures, so a single oversized report can no longer poison-pill the queue and block every later report.
- New — session replay: — opt-in `capture.replay: 'rrweb' | 'lite' | 'sentry' | 'off'` records a rolling buffer that attaches to the report on submit. rrweb recording masks all text and inputs by default (`maskAllText` + `maskAllInputs`), records continuously from init, and trims the buffer while preserving the most recent full snapshot so replays stay playable. `'off'` is the default.
- New — screenshot annotation: — the report panel's "Mark up" button opens an interactive overlay (highlight / blur / arrow) so reporters can circle the problem and redact sensitive regions before submitting. The annotation session stays open until the reporter confirms with "Done"; touch strokes now resolve correctly on lift (`touchend`).
- New — screenshot compression — before upload to keep payloads small.
- Hardening: — oversized reports are progressively degraded — drop the replay buffer, then the screenshot — before being dropped entirely with a `report:failed` event, so the offline queue is never wedged. The replay capture is now torn down on `Mushi.destroy()` (no observer/listener leak) and guarded against an init/`updateConfig` race that could install a stale capture.
- Rewards subsystem — (`src/rewards.ts`): full tester-rewards API — `initRewards`, `updateRewardsUser`, `getTier`, `enqueueActivity`. Connects to `/v1/rewards/*` backend endpoints.
- Proactive triggers — (`src/proactive-triggers.ts`): schedule-based and event-based triggers that surface the widget at the right moment without developer code.
- `pulseTrigger()` — widget-level pulse animation accessible from `Mushi.pulseTrigger()`.
- Screenshot simplification — `screenshot.take()` now returns `Promise<string | null>` — callers no longer need to check an `{ ok, dataUrl }` result object.
- `beforeSendFeedback` + `onCrashedLastRun` — lifecycle hooks wired into the init flow.
- `mushi project create` — command: provisions a new Mushi project, mints an API key with `mcp:read+write` scope, and writes `.env.local` + `.cursor/mcp.json`.
v0.12
includes 0.12.0- CLI — new `mushi skills` (`list`, `show`, `sync`) and `mushi pipeline` (`start`, `watch`, `checkin`) command groups. Browse the synced skill catalog, start a pipeline for a report, print the composed run packet, and check step progress back in from the terminal or CI.
- MCP — five new tools so a Cursor agent can close the loop without leaving the IDE — `list_skills` and `get_skill` (read), plus `start_skill_pipeline`, `get_pipeline_run`, and `checkin_pipeline_step` (write). Each tool now advertises the correct title and `readOnlyHint` from the shared catalog so MCP clients render the right UI.
- plugin-sdk — new `skill_pipeline.step.dispatched` event. Plugins can subscribe to react when a pipeline step is dispatched in cloud mode; the event payload carries `{ runId, stepIndex, skillSlug, contextPacket, projectId }`.
- plugin-cursor-cloud — handles `skill_pipeline.step.dispatched` by running the step's pre-composed context packet as a Cursor Cloud agent, storing the agent run id on the step, and checking the step back in. Emits a clear warning when `MUSHI_API_KEY` or `repoUrl` is unset so dispatches can no longer fail silently.
- `mushi sync-lessons` — — pulls promoted lessons from `/v1/admin/lessons` and writes `.mushi/lessons.json` into the connected repo (supports `--dry-run` and `--json`). Designed for CI and scheduled refresh PRs.
- MCP — — `lessons.query(diff_text, max_tokens)` tool for token-budget-ranked lesson injection into agent / PR-review flows; expanded catalog surface for Migration Hub and closed-loop resources.
v0.11
includes 0.11.2, 0.11.1, 0.11.0- Rewards subsystem — (`src/rewards.ts`): full tester-rewards API — `initRewards`, `updateRewardsUser`, `getTier`, `enqueueActivity`. Connects to `/v1/rewards/*` backend endpoints.
- Proactive triggers — (`src/proactive-triggers.ts`): schedule-based and event-based triggers that surface the widget at the right moment without developer code.
- `pulseTrigger()` — widget-level pulse animation accessible from `Mushi.pulseTrigger()`.
- Screenshot simplification — `screenshot.take()` now returns `Promise<string | null>` — callers no longer need to check an `{ ok, dataUrl }` result object.
- `beforeSendFeedback` + `onCrashedLastRun` — lifecycle hooks wired into the init flow.
- `mushi project create` — command: provisions a new Mushi project, mints an API key with `mcp:read+write` scope, and writes `.env.local` + `.cursor/mcp.json`.
- `mushi doctor` — pre-flight checks — verifies CLI config, endpoint reachability, SDK install, and optional server preflight.
- `mushi nudge` — generates a paste-ready `Mushi.init()` snippet tuned for alpha / beta / ga release phases.
- `mushi sync-lessons` — — pulls promoted lessons from `/v1/admin/lessons` and writes `.mushi/lessons.json` into the connected repo (supports `--dry-run` and `--json`). Designed for CI and scheduled refresh PRs.
- MCP — — `lessons.query(diff_text, max_tokens)` tool for token-budget-ranked lesson injection into agent / PR-review flows; expanded catalog surface for Migration Hub and closed-loop resources.
v0.10
includes 0.10.1, 0.10.0- Fix `fix.status` event name — the `fix poll` loop was emitting `poll.status` instead of the documented `fix.status`. Fixes `--json` consumers and automations that subscribe to fix lifecycle events.
- Fix ESM-safe `unlinkSync` — `migrateLegacyConfig` was using a `require('fs').unlinkSync` inside an ESM module. Switched to a named import.
- Fix scope fallback on typo — if `MUSHI_SCOPES` is set but contains only unrecognised values (e.g. a typo like `mcp:writes`), the MCP server now falls back to `ALL_SCOPES` instead of registering zero tools and silently deregistering the entire tool surface. Only an explicitly empty `MUSHI_SCOPES=""` opts in to zero tools.
v0.9
includes 0.9.1, 0.9.0- XDG Base Directory compliance — config now lives at `$XDG_CONFIG_HOME/mushi/config.json` on Linux/macOS (defaulting to `~/.config/mushi/config.json`) and `%APPDATA%/mushi/config.json` on Windows. A pre-existing `~/.mushirc` is **automatically migrated on first load** — moved (not copied) into the new path so we never have two copies of the API key on disk simultaneously. Malformed legacy files are left in place for manual recovery rather than silently dropped. `loadConfig` now respects `MUSHI_API_KEY` / `MUSHI_PROJECT_ID` / `MUSHI_API_ENDPOINT` env vars even when no file exists, so CI pipelines work zero-config.
- POSIX signal handling — SIGINT (Ctrl-C) and SIGTERM (`docker stop`, `kill <pid>`) are wired into a process-wide `AbortController`. Long-running commands (`mushi index`, `mushi sourcemaps upload`) now abort their in-flight HTTP requests immediately instead of hanging on the 15 s `apiCall` timeout. Exit codes follow POSIX convention: `130` for SIGINT, `143` for SIGTERM. Uses `AbortSignal.any` on Node ≥ 20 to compose with the per-request timeout signal.
- Trackable error codes — every user-visible failure now flows through a structured `MushiCliError` carrying a stable `[E_*]` code (`E_AUTH_MISSING`, `E_NETWORK`, `E_RATE_LIMITED`, `E_INTERRUPTED`, etc.) and an actionable fix hint. Output format is grep-friendly: ``` error [E_AUTH_MISSING]: No API key found → fix: run `mushi init` or set MUSHI_API_KEY in your environment $ echo $? 2 ``` `--json` mode renders the same payload as a JSON object so CI orchestrators can branch on `error.code` without parsing English.
- Rewards subsystem — (`src/rewards.ts`): full tester-rewards API — `initRewards`, `updateRewardsUser`, `getTier`, `enqueueActivity`. Connects to `/v1/rewards/*` backend endpoints.
- Proactive triggers — (`src/proactive-triggers.ts`): schedule-based and event-based triggers that surface the widget at the right moment without developer code.
- `pulseTrigger()` — widget-level pulse animation accessible from `Mushi.pulseTrigger()`.
- Screenshot simplification — `screenshot.take()` now returns `Promise<string | null>` — callers no longer need to check an `{ ok, dataUrl }` result object.
- `beforeSendFeedback` + `onCrashedLastRun` — lifecycle hooks wired into the init flow.
- `mushi project create` — command: provisions a new Mushi project, mints an API key with `mcp:read+write` scope, and writes `.env.local` + `.cursor/mcp.json`.
- `mushi doctor` — pre-flight checks — verifies CLI config, endpoint reachability, SDK install, and optional server preflight.
- `mushi nudge` — generates a paste-ready `Mushi.init()` snippet tuned for alpha / beta / ga release phases.
v0.8
includes 0.8.4, 0.8.3, 0.8.2, 0.8.1, 0.8.0- `mushi sync-lessons` — — pulls promoted lessons from `/v1/admin/lessons` and writes `.mushi/lessons.json` into the connected repo (supports `--dry-run` and `--json`). Designed for CI and scheduled refresh PRs.
- MCP — — `lessons.query(diff_text, max_tokens)` tool for token-budget-ranked lesson injection into agent / PR-review flows; expanded catalog surface for Migration Hub and closed-loop resources.
- Fix `fix.status` event name — the `fix poll` loop was emitting `poll.status` instead of the documented `fix.status`. Fixes `--json` consumers and automations that subscribe to fix lifecycle events.
- Fix ESM-safe `unlinkSync` — `migrateLegacyConfig` was using a `require('fs').unlinkSync` inside an ESM module. Switched to a named import.
- Fix scope fallback on typo — if `MUSHI_SCOPES` is set but contains only unrecognised values (e.g. a typo like `mcp:writes`), the MCP server now falls back to `ALL_SCOPES` instead of registering zero tools and silently deregistering the entire tool surface. Only an explicitly empty `MUSHI_SCOPES=""` opts in to zero tools.
v0.7
includes 0.7.15, 0.7.14, 0.7.13, 0.7.12, 0.7.11, 0.7.10, 0.7.9, 0.7.8, 0.7.7, 0.7.6, 0.7.5, 0.7.4, 0.7.3, 0.7.2, 0.7.1, 0.7.0- `mushi sync-lessons` — — pulls promoted lessons from `/v1/admin/lessons` and writes `.mushi/lessons.json` into the connected repo (supports `--dry-run` and `--json`). Designed for CI and scheduled refresh PRs.
- MCP — — `lessons.query(diff_text, max_tokens)` tool for token-budget-ranked lesson injection into agent / PR-review flows; expanded catalog surface for Migration Hub and closed-loop resources.
- Graph — — interactive ReactFlow canvas with layer-filter pills
- Layer Sankey — — horizontal lane diagram showing files per architectural tier
- Search — — semantic search via the `match_codebase_files` embedding RPC
- Per-scope tool filtering — `createMushiServer({ scopes })` now restricts which tools appear in `tools/list`. A read-only API key (e.g. `MUSHI_SCOPES=mcp:read` env var on the stdio entry) hides every write tool, so the LLM never picks `dispatch_fix` only to receive an `INSUFFICIENT_SCOPE` 403 — round-trips and tokens saved on every interaction. Default behaviour (no `scopes` config) is unchanged: every tool is registered.
- Output schemas + structuredContent (MCP 2025-06-18) — `get_recent_reports`, `search_reports`, `get_similar_bugs`, and `dispatch_fix` now declare an `outputSchema` and emit `structuredContent` alongside the existing text payload. Modern clients (Claude Desktop, Cursor 0.54+) read the typed object directly and pipe it into downstream tools without re-parsing JSON; older clients still see the text content.
- MCP Inspector — `pnpm --filter @mushi-mushi/mcp inspector` now spawns the official `@modelcontextprotocol/inspector` against the local build for interactive tool exploration during development.
- CLI — new `mushi skills` (`list`, `show`, `sync`) and `mushi pipeline` (`start`, `watch`, `checkin`) command groups. Browse the synced skill catalog, start a pipeline for a report, print the composed run packet, and check step progress back in from the terminal or CI.
- MCP — five new tools so a Cursor agent can close the loop without leaving the IDE — `list_skills` and `get_skill` (read), plus `start_skill_pipeline`, `get_pipeline_run`, and `checkin_pipeline_step` (write). Each tool now advertises the correct title and `readOnlyHint` from the shared catalog so MCP clients render the right UI.
- plugin-sdk — new `skill_pipeline.step.dispatched` event. Plugins can subscribe to react when a pipeline step is dispatched in cloud mode; the event payload carries `{ runId, stepIndex, skillSlug, contextPacket, projectId }`.
- plugin-cursor-cloud — handles `skill_pipeline.step.dispatched` by running the step's pre-composed context packet as a Cursor Cloud agent, storing the agent run id on the step, and checking the step back in. Emits a clear warning when `MUSHI_API_KEY` or `repoUrl` is unset so dispatches can no longer fail silently.
v0.6
includes 0.6.5, 0.6.4, 0.6.3, 0.6.2, 0.6.1, 0.6.0- `mushi sync-lessons` — — pulls promoted lessons from `/v1/admin/lessons` and writes `.mushi/lessons.json` into the connected repo (supports `--dry-run` and `--json`). Designed for CI and scheduled refresh PRs.
- MCP — — `lessons.query(diff_text, max_tokens)` tool for token-budget-ranked lesson injection into agent / PR-review flows; expanded catalog surface for Migration Hub and closed-loop resources.
- Launcher README — adds a Socket.dev badge and a new "Supply-chain & verification" section that explains, up front, what each external scanner reports about `mushi-mushi` (npm provenance, Socket.dev alerts, Bundlephobia `EntryPointError`, Snyk Advisor crawler lag) and why none of them are actionable bugs.
- CLI — bumped `@clack/prompts` from `^0.11.0` to `^1.2.0`. v1 widened the `text({ validate })` callback parameter to `string | undefined`; the `requireSecret()` helper was updated to handle the new signature explicitly. No user-visible change; the v1 spinner-API breaking change isn't used here.
- npm keyword arrays expanded across all 14 publishable packages. — Added discoverability terms developers actually type into npm search: `user-report`, `feedback-widget`, `sentry-alternative`, `auto-fix`, `llm-ops`, `ai-agent`, plus framework-appropriate specifics (e.g. `claude-code`, `codex`, `copilot` on `@mushi-mushi/mcp`). Keyword counts after the pass: 14–32 per package.
- README star CTA footer. — Added the bilingual _"もしMushi-chanのお役に立てたら、 ⭐ をひとつ"_ line with links to the stargazers page, issue tracker, and Bluesky handle. Research says a single explicit star ask converts 2–5% of lurkers.
- New `docs/marketing/` folder — with the full growth kit: `VOICE.md`, `STOREFRONTS.md`, `snippets.md` (drafted hooks, Show HN, Reddit, LinkedIn, dev.to, Product Hunt, YouTube Short), `launch-week.md`, `content-plan.md` (8 compounding blog post outlines), `drip-channels.md` (11 awesome-lists, 9 newsletter targets, Discord / Slack etiquette), `social-cadence.md` (Bluesky / X weekly rhythm), and `measurement.md` (the 5 numbers to watch each Friday).
- inventory-schema — migrate to **Zod 4** (`zod@^4.4.3`), aligning with `@mushi-mushi/mcp` and `@mushi-mushi/agents`, which were already on v4. The public API is unchanged; the validation-issue path formatter now handles Zod 4's widened `PropertyKey[]` issue paths.
- cli — bump `commander` to **v15** (ESM-only; the CLI is already pure ESM, so the change is transparent to consumers).
- mcp-ci — bump `@actions/core` to **v3** (ESM-only, Node 24-ready; bundled via tsup).
- react-native — build and test against **react-native 0.86**. `StyleSheet.absoluteFillObject` was dropped from RN 0.86's TypeScript types, so the backdrop style now inlines the equivalent absolute-fill literal — runtime behavior is identical and it compiles against all supported `react-native >= 0.72`.
- cli — bump `commander` to **v15** (now ESM-only; the CLI is already pure ESM, so the change is transparent to consumers).
v0.5
includes 0.5.20, 0.5.19, 0.5.18, 0.5.17, 0.5.16, 0.5.15, 0.5.14, 0.5.13, 0.5.12, 0.5.11, 0.5.10, 0.5.9, 0.5.8, 0.5.7, 0.5.6, 0.5.5, 0.5.4, 0.5.3, 0.5.2, 0.5.1, 0.5.0- Launcher README — adds a Socket.dev badge and a new "Supply-chain & verification" section that explains, up front, what each external scanner reports about `mushi-mushi` (npm provenance, Socket.dev alerts, Bundlephobia `EntryPointError`, Snyk Advisor crawler lag) and why none of them are actionable bugs.
- CLI — bumped `@clack/prompts` from `^0.11.0` to `^1.2.0`. v1 widened the `text({ validate })` callback parameter to `string | undefined`; the `requireSecret()` helper was updated to handle the new signature explicitly. No user-visible change; the v1 spinner-API breaking change isn't used here.
- npm keyword arrays expanded across all 14 publishable packages. — Added discoverability terms developers actually type into npm search: `user-report`, `feedback-widget`, `sentry-alternative`, `auto-fix`, `llm-ops`, `ai-agent`, plus framework-appropriate specifics (e.g. `claude-code`, `codex`, `copilot` on `@mushi-mushi/mcp`). Keyword counts after the pass: 14–32 per package.
- README star CTA footer. — Added the bilingual _"もしMushi-chanのお役に立てたら、 ⭐ をひとつ"_ line with links to the stargazers page, issue tracker, and Bluesky handle. Research says a single explicit star ask converts 2–5% of lurkers.
- New `docs/marketing/` folder — with the full growth kit: `VOICE.md`, `STOREFRONTS.md`, `snippets.md` (drafted hooks, Show HN, Reddit, LinkedIn, dev.to, Product Hunt, YouTube Short), `launch-week.md`, `content-plan.md` (8 compounding blog post outlines), `drip-channels.md` (11 awesome-lists, 9 newsletter targets, Discord / Slack etiquette), `social-cadence.md` (Bluesky / X weekly rhythm), and `measurement.md` (the 5 numbers to watch each Friday).
- Community files in-tarball. — Snyk and Socket only credit community signals when the files are shipped inside the npm tarball, not when they live at the monorepo root. A pre-commit guard (`scripts/sync-community-files.mjs --check`) and the `pnpm release` script now auto-sync from the canonical root copies to prevent drift.
- `publishConfig.provenance: true` everywhere. — The Release workflow already set `NPM_CONFIG_PROVENANCE=true` at the job level, but per-package `publishConfig` is the explicit signal Socket reads for its Supply Chain score. `@mushi-mushi/cli`, `create-mushi-mushi`, and `mushi-mushi` already had it; the remaining 20 publishable packages now match.
- `.github/FUNDING.yml` — points at GitHub Sponsors so the repo exposes a funding signal to scanners and the GitHub UI.
- Hero image up top. — `docs/screenshots/report-detail-dark.png` is now embedded (via absolute `raw.githubusercontent.com` URL so npmjs.com renders it), linking to the live admin demo.
- 15-word tagline. — "Ship a shake-to-report button. Get AI-classified, deduped, ready-to-fix bug reports." Frameworks listed directly under.
- "What you get" — — 6 benefit bullets with emoji, each tied to a capability, not a wizard step.
- "Who it's for" — — 4 personas (solo dev, PM/designer, AI-native team, enterprise) so visitors self-identify in 10 seconds.
v0.4
includes 0.4.6, 0.4.4, 0.4.3, 0.4.2, 0.4.1, 0.4.0- npm keyword arrays expanded across all 14 publishable packages. — Added discoverability terms developers actually type into npm search: `user-report`, `feedback-widget`, `sentry-alternative`, `auto-fix`, `llm-ops`, `ai-agent`, plus framework-appropriate specifics (e.g. `claude-code`, `codex`, `copilot` on `@mushi-mushi/mcp`). Keyword counts after the pass: 14–32 per package.
- README star CTA footer. — Added the bilingual _"もしMushi-chanのお役に立てたら、 ⭐ をひとつ"_ line with links to the stargazers page, issue tracker, and Bluesky handle. Research says a single explicit star ask converts 2–5% of lurkers.
- New `docs/marketing/` folder — with the full growth kit: `VOICE.md`, `STOREFRONTS.md`, `snippets.md` (drafted hooks, Show HN, Reddit, LinkedIn, dev.to, Product Hunt, YouTube Short), `launch-week.md`, `content-plan.md` (8 compounding blog post outlines), `drip-channels.md` (11 awesome-lists, 9 newsletter targets, Discord / Slack etiquette), `social-cadence.md` (Bluesky / X weekly rhythm), and `measurement.md` (the 5 numbers to watch each Friday).
- `@mushi-mushi/cli` `0.3.0` — New `mushi init` command — interactive wizard built on `@clack/prompts` that auto-detects framework (Next, Nuxt, SvelteKit, Angular, Expo, Capacitor, plain React/Vue/Svelte, vanilla), package manager (npm/pnpm/yarn/bun), installs the right SDK, writes env vars with the right prefix (`NEXT_PUBLIC_`, `NUXT_PUBLIC_`, `VITE_`), warns when `.env.local` isn't gitignored, and prints the framework-specific snippet. Idempotent: never overwrites existing `MUSHI_*` env vars. Exposes new `./init` and `./detect` subpath exports for downstream packages.
- `mushi-mushi` `0.3.0` (NEW, unscoped) — One-command launcher — `npx mushi-mushi` runs the wizard. Gives the SDK a single brand entry point on npm so users don't have to know to look under `@mushi-mushi/*` first.
- `create-mushi-mushi` `0.3.0` (NEW) — `npm create mushi-mushi` — same wizard via the standard npm-create convention.
- All 16 published packages — keyword sweep — every package now ships `mushi-mushi` plus its framework-specific terms (`react`, `next.js`, `vue`, `nuxt`, `svelte`, `sveltekit`, `angular`, `react-native`, `expo`, `capacitor`, `ionic`, etc.) plus product terms (`session-replay`, `screenshot`, `shake-to-report`, `sentry-companion`, `error-tracking`, `ai-triage`) for npm search ranking.
- All SDK READMEs — discoverability cross-link header at the top — points users to the wizard and to every other framework SDK so people who land on `@mushi-mushi/react` can find `@mushi-mushi/vue` and vice-versa.
- Root README — quick-start now leads with `npx mushi-mushi`, with the manual install path documented as the fallback. Packages table gains a row for the launcher.
- inventory-schema — migrate to **Zod 4** (`zod@^4.4.3`), aligning with `@mushi-mushi/mcp` and `@mushi-mushi/agents`, which were already on v4. The public API is unchanged; the validation-issue path formatter now handles Zod 4's widened `PropertyKey[]` issue paths.
- cli — bump `commander` to **v15** (ESM-only; the CLI is already pure ESM, so the change is transparent to consumers).
- mcp-ci — bump `@actions/core` to **v3** (ESM-only, Node 24-ready; bundled via tsup).
v0.3
includes 0.3.8, 0.3.7, 0.3.6, 0.3.5, 0.3.4, 0.3.3, 0.3.2, 0.3.1, 0.3.0- npm keyword arrays expanded across all 14 publishable packages. — Added discoverability terms developers actually type into npm search: `user-report`, `feedback-widget`, `sentry-alternative`, `auto-fix`, `llm-ops`, `ai-agent`, plus framework-appropriate specifics (e.g. `claude-code`, `codex`, `copilot` on `@mushi-mushi/mcp`). Keyword counts after the pass: 14–32 per package.
- README star CTA footer. — Added the bilingual _"もしMushi-chanのお役に立てたら、 ⭐ をひとつ"_ line with links to the stargazers page, issue tracker, and Bluesky handle. Research says a single explicit star ask converts 2–5% of lurkers.
- New `docs/marketing/` folder — with the full growth kit: `VOICE.md`, `STOREFRONTS.md`, `snippets.md` (drafted hooks, Show HN, Reddit, LinkedIn, dev.to, Product Hunt, YouTube Short), `launch-week.md`, `content-plan.md` (8 compounding blog post outlines), `drip-channels.md` (11 awesome-lists, 9 newsletter targets, Discord / Slack etiquette), `social-cadence.md` (Bluesky / X weekly rhythm), and `measurement.md` (the 5 numbers to watch each Friday).
- Community files in-tarball. — Snyk and Socket only credit community signals when the files are shipped inside the npm tarball, not when they live at the monorepo root. A pre-commit guard (`scripts/sync-community-files.mjs --check`) and the `pnpm release` script now auto-sync from the canonical root copies to prevent drift.
- `publishConfig.provenance: true` everywhere. — The Release workflow already set `NPM_CONFIG_PROVENANCE=true` at the job level, but per-package `publishConfig` is the explicit signal Socket reads for its Supply Chain score. `@mushi-mushi/cli`, `create-mushi-mushi`, and `mushi-mushi` already had it; the remaining 20 publishable packages now match.
- `.github/FUNDING.yml` — points at GitHub Sponsors so the repo exposes a funding signal to scanners and the GitHub UI.
- `@mushi-mushi/cli` `0.3.0` — New `mushi init` command — interactive wizard built on `@clack/prompts` that auto-detects framework (Next, Nuxt, SvelteKit, Angular, Expo, Capacitor, plain React/Vue/Svelte, vanilla), package manager (npm/pnpm/yarn/bun), installs the right SDK, writes env vars with the right prefix (`NEXT_PUBLIC_`, `NUXT_PUBLIC_`, `VITE_`), warns when `.env.local` isn't gitignored, and prints the framework-specific snippet. Idempotent: never overwrites existing `MUSHI_*` env vars. Exposes new `./init` and `./detect` subpath exports for downstream packages.
- `mushi-mushi` `0.3.0` (NEW, unscoped) — One-command launcher — `npx mushi-mushi` runs the wizard. Gives the SDK a single brand entry point on npm so users don't have to know to look under `@mushi-mushi/*` first.
- `create-mushi-mushi` `0.3.0` (NEW) — `npm create mushi-mushi` — same wizard via the standard npm-create convention.
- All 16 published packages — keyword sweep — every package now ships `mushi-mushi` plus its framework-specific terms (`react`, `next.js`, `vue`, `nuxt`, `svelte`, `sveltekit`, `angular`, `react-native`, `expo`, `capacitor`, `ionic`, etc.) plus product terms (`session-replay`, `screenshot`, `shake-to-report`, `sentry-companion`, `error-tracking`, `ai-triage`) for npm search ranking.
- All SDK READMEs — discoverability cross-link header at the top — points users to the wizard and to every other framework SDK so people who land on `@mushi-mushi/react` can find `@mushi-mushi/vue` and vice-versa.
- Root README — quick-start now leads with `npx mushi-mushi`, with the manual install path documented as the fallback. Packages table gains a row for the launcher.
v0.2
includes 0.2.9, 0.2.8, 0.2.7, 0.2.6, 0.2.5, 0.2.4, 0.2.3, 0.2.2, 0.2.1, 0.2.0- npm keyword arrays expanded across all 14 publishable packages. — Added discoverability terms developers actually type into npm search: `user-report`, `feedback-widget`, `sentry-alternative`, `auto-fix`, `llm-ops`, `ai-agent`, plus framework-appropriate specifics (e.g. `claude-code`, `codex`, `copilot` on `@mushi-mushi/mcp`). Keyword counts after the pass: 14–32 per package.
- README star CTA footer. — Added the bilingual _"もしMushi-chanのお役に立てたら、 ⭐ をひとつ"_ line with links to the stargazers page, issue tracker, and Bluesky handle. Research says a single explicit star ask converts 2–5% of lurkers.
- New `docs/marketing/` folder — with the full growth kit: `VOICE.md`, `STOREFRONTS.md`, `snippets.md` (drafted hooks, Show HN, Reddit, LinkedIn, dev.to, Product Hunt, YouTube Short), `launch-week.md`, `content-plan.md` (8 compounding blog post outlines), `drip-channels.md` (11 awesome-lists, 9 newsletter targets, Discord / Slack etiquette), `social-cadence.md` (Bluesky / X weekly rhythm), and `measurement.md` (the 5 numbers to watch each Friday).
- Community files in-tarball. — Snyk and Socket only credit community signals when the files are shipped inside the npm tarball, not when they live at the monorepo root. A pre-commit guard (`scripts/sync-community-files.mjs --check`) and the `pnpm release` script now auto-sync from the canonical root copies to prevent drift.
- `publishConfig.provenance: true` everywhere. — The Release workflow already set `NPM_CONFIG_PROVENANCE=true` at the job level, but per-package `publishConfig` is the explicit signal Socket reads for its Supply Chain score. `@mushi-mushi/cli`, `create-mushi-mushi`, and `mushi-mushi` already had it; the remaining 20 publishable packages now match.
- `.github/FUNDING.yml` — points at GitHub Sponsors so the repo exposes a funding signal to scanners and the GitHub UI.
- `@mushi-mushi/cli` `0.3.0` — New `mushi init` command — interactive wizard built on `@clack/prompts` that auto-detects framework (Next, Nuxt, SvelteKit, Angular, Expo, Capacitor, plain React/Vue/Svelte, vanilla), package manager (npm/pnpm/yarn/bun), installs the right SDK, writes env vars with the right prefix (`NEXT_PUBLIC_`, `NUXT_PUBLIC_`, `VITE_`), warns when `.env.local` isn't gitignored, and prints the framework-specific snippet. Idempotent: never overwrites existing `MUSHI_*` env vars. Exposes new `./init` and `./detect` subpath exports for downstream packages.
- `mushi-mushi` `0.3.0` (NEW, unscoped) — One-command launcher — `npx mushi-mushi` runs the wizard. Gives the SDK a single brand entry point on npm so users don't have to know to look under `@mushi-mushi/*` first.
- `create-mushi-mushi` `0.3.0` (NEW) — `npm create mushi-mushi` — same wizard via the standard npm-create convention.
- All 16 published packages — keyword sweep — every package now ships `mushi-mushi` plus its framework-specific terms (`react`, `next.js`, `vue`, `nuxt`, `svelte`, `sveltekit`, `angular`, `react-native`, `expo`, `capacitor`, `ionic`, etc.) plus product terms (`session-replay`, `screenshot`, `shake-to-report`, `sentry-companion`, `error-tracking`, `ai-triage`) for npm search ranking.
- All SDK READMEs — discoverability cross-link header at the top — points users to the wizard and to every other framework SDK so people who land on `@mushi-mushi/react` can find `@mushi-mushi/vue` and vice-versa.
- Root README — quick-start now leads with `npx mushi-mushi`, with the manual install path documented as the fallback. Packages table gains a row for the launcher.
v0.1
includes 0.1.4, 0.1.3, 0.1.2, 0.1.1, 0.1.0Last updated on