create-mushi-mushi 0.4.0 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,51 @@
1
+ <!--
2
+ AUTO-SYNCED from repo root by scripts/sync-community-files.mjs.
3
+ Do not edit here — edit the canonical file at the repository root and
4
+ re-run `node scripts/sync-community-files.mjs` (pre-commit hook does this
5
+ automatically).
6
+ -->
7
+
8
+ # Contributor Covenant Code of Conduct
9
+
10
+ ## Our Pledge
11
+
12
+ We as members, contributors, and leaders pledge to make participation in our
13
+ community a harassment-free experience for everyone, regardless of age, body
14
+ size, visible or invisible disability, ethnicity, sex characteristics, gender
15
+ identity and expression, level of experience, education, socio-economic status,
16
+ nationality, personal appearance, race, caste, color, religion, or sexual
17
+ identity and orientation.
18
+
19
+ We pledge to act and interact in ways that contribute to an open, welcoming,
20
+ diverse, inclusive, and healthy community.
21
+
22
+ ## Our Standards
23
+
24
+ Examples of behavior that contributes to a positive environment:
25
+
26
+ - Using welcoming and inclusive language
27
+ - Being respectful of differing viewpoints and experiences
28
+ - Gracefully accepting constructive criticism
29
+ - Focusing on what is best for the community
30
+ - Showing empathy towards other community members
31
+
32
+ Examples of unacceptable behavior:
33
+
34
+ - The use of sexualized language or imagery, and sexual attention or advances of any kind
35
+ - Trolling, insulting or derogatory comments, and personal or political attacks
36
+ - Public or private harassment
37
+ - Publishing others' private information without explicit permission
38
+ - Other conduct which could reasonably be considered inappropriate in a professional setting
39
+
40
+ ## Enforcement
41
+
42
+ Instances of abusive, harassing, or otherwise unacceptable behavior may be
43
+ reported to the project team at **security@mushimushi.dev**.
44
+
45
+ All complaints will be reviewed and investigated promptly and fairly.
46
+
47
+ ## Attribution
48
+
49
+ This Code of Conduct is adapted from the [Contributor Covenant](https://www.contributor-covenant.org/),
50
+ version 2.1, available at
51
+ https://www.contributor-covenant.org/version/2/1/code_of_conduct.html.
@@ -0,0 +1,122 @@
1
+ <!--
2
+ AUTO-SYNCED from repo root by scripts/sync-community-files.mjs.
3
+ Do not edit here — edit the canonical file at the repository root and
4
+ re-run `node scripts/sync-community-files.mjs` (pre-commit hook does this
5
+ automatically).
6
+ -->
7
+
8
+ # Contributing to Mushi Mushi
9
+
10
+ Thanks for wanting to help. Here's everything you need to get started.
11
+
12
+ ## Prerequisites
13
+
14
+ - **Node.js >= 22** (see `.node-version`)
15
+ - **pnpm >= 10** — install with `corepack enable`
16
+
17
+ ## Setup
18
+
19
+ ```bash
20
+ git clone https://github.com/kensaurus/mushi-mushi.git
21
+ cd mushi-mushi
22
+ pnpm install
23
+ pnpm build
24
+ ```
25
+
26
+ ## Development
27
+
28
+ ```bash
29
+ pnpm dev # Start all dev servers (admin on :6464)
30
+ pnpm test # Run Vitest across all packages
31
+ pnpm typecheck # TypeScript checks
32
+ pnpm lint # ESLint
33
+ pnpm format # Prettier
34
+ ```
35
+
36
+ ### Working on a single package
37
+
38
+ ```bash
39
+ cd packages/core
40
+ pnpm dev # Watch mode
41
+ pnpm test # Tests for this package only
42
+ ```
43
+
44
+ ## Project Structure
45
+
46
+ ```
47
+ packages/
48
+ core/ Types, API client, offline queue (MIT)
49
+ web/ Browser SDK — widget, capture (MIT)
50
+ react/ React bindings (MIT)
51
+ vue/ Vue 3 plugin (MIT)
52
+ svelte/ Svelte SDK (MIT)
53
+ angular/ Angular SDK (MIT)
54
+ react-native/ React Native SDK (MIT)
55
+ cli/ CLI tool (MIT)
56
+ mcp/ MCP server for coding agents (MIT)
57
+ server/ Supabase Edge Functions (BSL)
58
+ agents/ Agentic fix pipeline (BSL)
59
+ verify/ Fix verification (BSL)
60
+ apps/
61
+ admin/ Admin dashboard (React + Tailwind)
62
+ docs/ Documentation site (planned)
63
+ tooling/
64
+ eslint-config/ Shared ESLint flat config
65
+ tsconfig/ Shared TypeScript configs
66
+ ```
67
+
68
+ ## Making Changes
69
+
70
+ 1. Create a feature branch from `master`
71
+ 2. Make your changes
72
+ 3. Add tests for new functionality
73
+ 4. Run `pnpm typecheck && pnpm lint && pnpm test` to verify
74
+ 5. Create a changeset if your change affects published packages:
75
+ ```bash
76
+ pnpm changeset
77
+ ```
78
+ 6. Open a pull request
79
+
80
+ ## Changesets
81
+
82
+ We use [Changesets](https://github.com/changesets/changesets) for versioning. If your PR modifies a published package (`core`, `web`, `react`, `vue`, `svelte`, `angular`, `react-native`, `cli`, `mcp`), add a changeset:
83
+
84
+ ```bash
85
+ pnpm changeset
86
+ ```
87
+
88
+ Select the affected packages, the semver bump type, and write a summary. The changeset file gets committed with your PR.
89
+
90
+ ## Code Style
91
+
92
+ - **TypeScript strict mode** — no `any` unless absolutely necessary
93
+ - **Prettier** formats everything — run `pnpm format` before committing
94
+ - **ESLint** catches bugs — `pnpm lint` must pass
95
+ - **No default exports** in library packages — use named exports
96
+ - **Dual ESM/CJS** builds via tsup for all SDK packages
97
+
98
+ ## Commit Messages
99
+
100
+ Use conventional commits:
101
+
102
+ ```
103
+ feat(core): add batch report submission
104
+ fix(web): prevent widget from opening during screenshot
105
+ docs(react): update provider usage example
106
+ chore: bump dependencies
107
+ ```
108
+
109
+ ## Tests
110
+
111
+ - **Framework:** Vitest
112
+ - **Location:** Co-located with source (`src/foo.test.ts`)
113
+ - **Coverage:** Required for `core`, `web`, `react` — encouraged for all packages
114
+
115
+ ## License
116
+
117
+ - SDK packages are MIT — your contributions will be MIT-licensed
118
+ - Server/agents/verify are BSL 1.1 — contributions to those packages fall under BSL
119
+
120
+ ## Questions?
121
+
122
+ Open an issue or start a discussion. We're happy to help.
package/README.md CHANGED
@@ -10,9 +10,17 @@ yarn create mushi-mushi
10
10
  bun create mushi-mushi
11
11
  ```
12
12
 
13
- Auto-detects your framework (Next.js, Nuxt, SvelteKit, Angular, Expo, Capacitor, plain React/Vue/Svelte, vanilla JS), installs the right `@mushi-mushi/*` SDK, writes your env vars, and prints the snippet to drop into your app.
13
+ ## What it does
14
14
 
15
- This is a **scaffold for existing projects** — it does not generate a new app from scratch. To add Mushi to an app you already have, run it from the project root.
15
+ 1. **Detects your framework** — Next.js, Nuxt, SvelteKit, Angular, Expo, Capacitor, plain React/Vue/Svelte, or vanilla JS.
16
+ 2. **Picks the right SDK** — `@mushi-mushi/react`, `@mushi-mushi/vue`, `@mushi-mushi/svelte`, `@mushi-mushi/angular`, `@mushi-mushi/react-native`, `@mushi-mushi/capacitor`, or `@mushi-mushi/web`.
17
+ 3. **Detects your package manager** — uses `npm`, `pnpm`, `yarn`, or `bun` based on your lockfile.
18
+ 4. **Writes env vars** — `MUSHI_PROJECT_ID` and `MUSHI_API_KEY` land in `.env.local` with the right framework prefix (`NEXT_PUBLIC_`, `NUXT_PUBLIC_`, `VITE_`).
19
+ 5. **Warns about `.gitignore`** — won't ship secrets if your env file isn't ignored.
20
+ 6. **Prints the provider snippet** — framework-specific code to paste in.
21
+ 7. **Sends a test report** (opt-in) — closes the loop so you see your first classified bug immediately.
22
+
23
+ This is a **scaffold for existing projects** — it does not generate a new app from scratch. Run it from the project root of an existing app.
16
24
 
17
25
  ## Flags
18
26
 
@@ -20,22 +28,42 @@ This is a **scaffold for existing projects** — it does not generate a new app
20
28
  npm create mushi-mushi -- --framework next
21
29
  npm create mushi-mushi -- --project-id proj_xxx --api-key mushi_xxx
22
30
  npm create mushi-mushi -- --skip-install
31
+ npm create mushi-mushi -- --skip-test-report
32
+ npm create mushi-mushi -- --cwd apps/web
33
+ npm create mushi-mushi -- --endpoint https://mushi.your-company.com
23
34
  npm create mushi-mushi -- -y
24
35
  npm create mushi-mushi -- --help
25
36
  ```
26
37
 
27
- ## Equivalent
38
+ > `npm create` and `pnpm create` need the `--` separator before flags. Yarn 1 and Bun do not.
39
+
40
+ ## Equivalent commands
28
41
 
29
42
  ```bash
30
- npx mushi-mushi # same wizard, shorter to type
31
- npx @mushi-mushi/cli init # same wizard, scoped name
43
+ npx mushi-mushi # shorter
44
+ npx @mushi-mushi/cli init # scoped name
32
45
  ```
33
46
 
47
+ ## Troubleshooting
48
+
49
+ - **Wrong framework detected?** Pass `--framework <id>` explicitly. Valid IDs: `next, react, vue, nuxt, svelte, sveltekit, angular, expo, react-native, capacitor, vanilla`.
50
+ - **Running in a monorepo?** `cd` into the package you want Mushi in first, or pass `--cwd apps/web`.
51
+ - **`npx` cache serving an old version?** Run `npm cache clean --force` or `npx mushi-mushi@latest`.
52
+ - **Non-interactive (CI)?** Pass all of `--yes`, `--project-id`, and `--api-key`. The wizard exits with a clear error otherwise.
53
+ - **Key pasted with quotes/whitespace?** The wizard strips them, but still validates against `mushi_[A-Za-z0-9_-]{10,}` / `proj_[A-Za-z0-9_-]{10,}`.
54
+
55
+ ## Security
56
+
57
+ - Credentials accepted via `--api-key` flag leak into `ps -ef`. Prefer the interactive prompt on dev machines; on CI, pass them via the environment and an explicit `--api-key "$MUSHI_API_KEY"` at the boundary.
58
+ - The `~/.mushirc` credentials cache is written with mode `0o600` (owner read/write only) on Unix.
59
+ - All env-file writes strip CR/LF/NUL from secrets to prevent accidental `.env` injection.
60
+
34
61
  ## Links
35
62
 
36
- - 🌐 [Console](https://kensaur.us/mushi-mushi/)
37
- - 📦 [GitHub](https://github.com/kensaurus/mushi-mushi)
38
- - 📚 [Docs](https://github.com/kensaurus/mushi-mushi#readme)
63
+ - [Console](https://kensaur.us/mushi-mushi/)
64
+ - [GitHub](https://github.com/kensaurus/mushi-mushi)
65
+ - [Docs](https://github.com/kensaurus/mushi-mushi#readme)
66
+ - [Report a bug](https://github.com/kensaurus/mushi-mushi/issues)
39
67
 
40
68
  ## License
41
69
 
package/SECURITY.md ADDED
@@ -0,0 +1,50 @@
1
+ <!--
2
+ AUTO-SYNCED from repo root by scripts/sync-community-files.mjs.
3
+ Do not edit here — edit the canonical file at the repository root and
4
+ re-run `node scripts/sync-community-files.mjs` (pre-commit hook does this
5
+ automatically).
6
+ -->
7
+
8
+ # Security Policy
9
+
10
+ ## Supported Versions
11
+
12
+ | Version | Supported |
13
+ |---------|-----------|
14
+ | 0.x | Yes |
15
+
16
+ ## Reporting a Vulnerability
17
+
18
+ If you discover a security vulnerability, please report it responsibly.
19
+
20
+ **Do NOT open a public GitHub issue.**
21
+
22
+ Instead, email: **security@mushimushi.dev**
23
+
24
+ Include:
25
+ - Description of the vulnerability
26
+ - Steps to reproduce
27
+ - Impact assessment
28
+ - Suggested fix (if any)
29
+
30
+ We will acknowledge receipt within 48 hours and aim to release a patch within 7 days for critical issues.
31
+
32
+ ## Scope
33
+
34
+ - All `@mushi-mushi/*` npm packages
35
+ - Supabase Edge Functions (server-side)
36
+ - Admin console application
37
+ - CLI tool
38
+
39
+ ## Out of Scope
40
+
41
+ - Self-hosted deployments configured by the user
42
+ - Third-party integrations (Jira, Linear, PagerDuty)
43
+ - Vulnerabilities requiring physical access
44
+
45
+ ## Security Best Practices for Users
46
+
47
+ - **Never commit your API keys** — use environment variables
48
+ - **Rotate API keys** regularly via the admin console
49
+ - **Enable SSO** for team projects (Enterprise tier)
50
+ - **Review audit logs** periodically for suspicious activity
package/dist/index.js CHANGED
@@ -2,44 +2,46 @@
2
2
 
3
3
  // src/index.ts
4
4
  import { runInit } from "@mushi-mushi/cli/init";
5
+ import { FRAMEWORK_IDS, isFrameworkId } from "@mushi-mushi/cli/detect";
6
+ var VERSION = true ? "0.5.1" : "0.0.0-dev";
7
+ var MIN_NODE_MAJOR = 18;
8
+ var ISSUES_URL = "https://github.com/kensaurus/mushi-mushi/issues";
5
9
  var HELP = `create-mushi-mushi \u2014 add Mushi Mushi to your existing project
6
10
 
7
11
  Usage:
8
12
  npm create mushi-mushi run the setup wizard
9
13
  npm create mushi-mushi -- --help show all flags
10
14
 
15
+ Note: \`npm create\` requires the \`--\` separator before flags.
16
+ \`yarn create mushi-mushi --help\` works without it on Yarn 1.
17
+ \`pnpm create mushi-mushi -- --help\` mirrors npm.
18
+ \`bun create mushi-mushi --help\` works without it.
19
+
11
20
  Flags (forwarded to the wizard):
12
21
  --project-id <id> skip the project ID prompt
13
- --api-key <key> skip the API key prompt
14
- --framework <id> force a framework (next, react, vue, nuxt,
15
- svelte, sveltekit, angular, expo,
16
- react-native, capacitor, vanilla)
22
+ --api-key <key> skip the API key prompt (CI only)
23
+ --framework <id> force a framework (${FRAMEWORK_IDS.join(", ")})
17
24
  --skip-install print the install command instead of running it
25
+ --skip-test-report don't offer to send a test report at the end
26
+ --cwd <path> run in a different directory
27
+ --endpoint <url> override the Mushi API endpoint (self-hosted)
18
28
  -y, --yes accept the detected framework without prompting
29
+ -v, --version print the version and exit
19
30
 
20
31
  Docs: https://github.com/kensaurus/mushi-mushi
21
32
  Console: https://kensaur.us/mushi-mushi/`;
22
- var VALID_FRAMEWORKS = [
23
- "next",
24
- "react",
25
- "vue",
26
- "nuxt",
27
- "svelte",
28
- "sveltekit",
29
- "angular",
30
- "expo",
31
- "react-native",
32
- "capacitor",
33
- "vanilla"
34
- ];
35
33
  function parseArgs(args) {
36
- const out = { showHelp: false };
34
+ const out = { showHelp: false, showVersion: false };
37
35
  for (let i = 0; i < args.length; i++) {
38
36
  const a = args[i];
39
37
  if (a === "-h" || a === "--help") {
40
38
  out.showHelp = true;
41
39
  continue;
42
40
  }
41
+ if (a === "-v" || a === "--version") {
42
+ out.showVersion = true;
43
+ continue;
44
+ }
43
45
  if (a === "-y" || a === "--yes") {
44
46
  out.yes = true;
45
47
  continue;
@@ -48,6 +50,10 @@ function parseArgs(args) {
48
50
  out.skipInstall = true;
49
51
  continue;
50
52
  }
53
+ if (a === "--skip-test-report") {
54
+ out.skipTestReport = true;
55
+ continue;
56
+ }
51
57
  if (a === "--project-id") {
52
58
  out.projectId = args[++i];
53
59
  continue;
@@ -56,10 +62,18 @@ function parseArgs(args) {
56
62
  out.apiKey = args[++i];
57
63
  continue;
58
64
  }
65
+ if (a === "--cwd") {
66
+ out.cwd = args[++i];
67
+ continue;
68
+ }
69
+ if (a === "--endpoint") {
70
+ out.endpoint = args[++i];
71
+ continue;
72
+ }
59
73
  if (a === "--framework") {
60
74
  const fw = args[++i];
61
- if (!VALID_FRAMEWORKS.includes(fw)) {
62
- throw new Error(`Unknown framework: ${fw}. Valid: ${VALID_FRAMEWORKS.join(", ")}`);
75
+ if (!isFrameworkId(fw)) {
76
+ throw new Error(`Unknown framework: ${fw}. Valid: ${FRAMEWORK_IDS.join(", ")}`);
63
77
  }
64
78
  out.framework = fw;
65
79
  continue;
@@ -70,16 +84,33 @@ function parseArgs(args) {
70
84
  }
71
85
  return out;
72
86
  }
87
+ function assertNodeVersion() {
88
+ const major = Number(process.versions.node.split(".")[0]);
89
+ if (!Number.isFinite(major) || major < MIN_NODE_MAJOR) {
90
+ process.stderr.write(
91
+ `create-mushi-mushi requires Node.js ${MIN_NODE_MAJOR} or newer. You are on ${process.versions.node}.
92
+ Upgrade Node (https://nodejs.org/) and try again.
93
+ `
94
+ );
95
+ process.exit(1);
96
+ }
97
+ }
73
98
  async function main() {
99
+ assertNodeVersion();
74
100
  let parsed;
75
101
  try {
76
102
  parsed = parseArgs(process.argv.slice(2));
77
103
  } catch (err) {
78
- console.error(err instanceof Error ? err.message : String(err));
104
+ process.stderr.write(`${err instanceof Error ? err.message : String(err)}
105
+ `);
79
106
  process.exit(1);
80
107
  }
81
108
  if (parsed.showHelp) {
82
- console.log(HELP);
109
+ process.stdout.write(HELP + "\n");
110
+ return;
111
+ }
112
+ if (parsed.showVersion) {
113
+ process.stdout.write(VERSION + "\n");
83
114
  return;
84
115
  }
85
116
  await runInit({
@@ -87,10 +118,22 @@ async function main() {
87
118
  apiKey: parsed.apiKey,
88
119
  framework: parsed.framework,
89
120
  skipInstall: parsed.skipInstall,
90
- yes: parsed.yes
121
+ yes: parsed.yes,
122
+ cwd: parsed.cwd,
123
+ endpoint: parsed.endpoint,
124
+ sendTestReport: parsed.skipTestReport ? false : void 0
91
125
  });
92
126
  }
93
127
  main().catch((err) => {
94
- console.error(err instanceof Error ? err.message : String(err));
128
+ const message = err instanceof Error ? err.message : String(err);
129
+ process.stderr.write(`
130
+ create-mushi-mushi: ${message}
131
+ `);
132
+ if (process.env.DEBUG?.includes("mushi") && err instanceof Error && err.stack) {
133
+ process.stderr.write(err.stack + "\n");
134
+ }
135
+ process.stderr.write(`
136
+ If this is a bug, please report it at ${ISSUES_URL}
137
+ `);
95
138
  process.exit(1);
96
139
  });
package/package.json CHANGED
@@ -1,19 +1,20 @@
1
1
  {
2
2
  "name": "create-mushi-mushi",
3
- "version": "0.4.0",
3
+ "version": "0.5.1",
4
4
  "license": "MIT",
5
5
  "description": "Run `npm create mushi-mushi` to add the Mushi Mushi bug-reporting SDK to your existing project — the wizard auto-detects your framework (React, Vue, Svelte, Angular, React Native, Expo, Capacitor) and installs the right package.",
6
6
  "bin": {
7
7
  "create-mushi-mushi": "./dist/index.js"
8
8
  },
9
9
  "dependencies": {
10
- "@mushi-mushi/cli": "^0.4.0"
10
+ "@mushi-mushi/cli": "^0.5.1"
11
11
  },
12
12
  "devDependencies": {
13
13
  "@types/node": "^22.15.3",
14
14
  "eslint": "^10.2.0",
15
15
  "tsup": "^8.5.1",
16
16
  "typescript": "^6.0.2",
17
+ "vitest": "^4.1.4",
17
18
  "@mushi-mushi/eslint-config": "0.0.0"
18
19
  },
19
20
  "author": "Kenji Sakuramoto",
@@ -26,13 +27,21 @@
26
27
  "bugs": {
27
28
  "url": "https://github.com/kensaurus/mushi-mushi/issues"
28
29
  },
30
+ "funding": {
31
+ "type": "github",
32
+ "url": "https://github.com/sponsors/kensaurus"
33
+ },
29
34
  "publishConfig": {
30
- "access": "public"
35
+ "access": "public",
36
+ "provenance": true
31
37
  },
32
38
  "files": [
33
39
  "dist",
34
40
  "README.md",
35
- "LICENSE"
41
+ "LICENSE",
42
+ "CONTRIBUTING.md",
43
+ "CODE_OF_CONDUCT.md",
44
+ "SECURITY.md"
36
45
  ],
37
46
  "sideEffects": false,
38
47
  "keywords": [
@@ -66,6 +75,7 @@
66
75
  "scripts": {
67
76
  "build": "tsup",
68
77
  "lint": "eslint src/",
78
+ "test": "vitest run",
69
79
  "typecheck": "tsc --noEmit"
70
80
  }
71
81
  }