@mushi-mushi/cli 0.20.0 → 0.22.0

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.
package/CONTRIBUTING.md CHANGED
@@ -70,7 +70,7 @@ packages/
70
70
  react-native/ React Native SDK (MIT)
71
71
  cli/ CLI tool (MIT)
72
72
  mcp/ MCP server for coding agents (MIT)
73
- server/ Supabase Edge Functions (AGPLv3)
73
+ server/ Supabase Edge Functions (AGPLv3; ee/ is commercial)
74
74
  agents/ Agentic fix pipeline (AGPLv3)
75
75
  verify/ Fix verification (AGPLv3)
76
76
  apps/
@@ -81,6 +81,18 @@ tooling/
81
81
  tsconfig/ Shared TypeScript configs
82
82
  ```
83
83
 
84
+ ## What we don't accept
85
+
86
+ Knowing this upfront saves everyone time.
87
+
88
+ - **Automated / bulk / AI-slop PRs** — any PR that was opened by a script, an LLM agent acting without meaningful human review, or as part of a parallel bounty-farming sweep is closed on sight. The commit history, branch name, or helper scripts included in the PR make this obvious.
89
+ - **PRs that target the wrong base** — all PRs must branch from and target `master`. PRs targeting `main` or any other branch are closed (and will show an inflated diff that is not your work).
90
+ - **One PR per issue, one issue per PR** — splitting or duplicating work just to collect acknowledgements isn't welcome.
91
+ - **Good-first-issues without claiming first** — comment on the issue to claim it before starting. If two people open PRs for the same issue, the one that commented first is prioritised.
92
+ - **Documentation-only PRs that merely duplicate existing content** — if the information already exists (e.g. in another file in this repo), adding a redundant copy adds noise without value.
93
+
94
+ If a PR violates these policies it will be closed with a brief explanation. No hard feelings — a genuine contribution on the same issue is always welcome.
95
+
84
96
  ## Making Changes
85
97
 
86
98
  1. Create a feature branch from `master`
@@ -199,7 +211,7 @@ chore: bump dependencies
199
211
  ## License
200
212
 
201
213
  - SDK packages are MIT — your contributions will be MIT-licensed
202
- - Server/agents/verify are AGPLv3 — contributions to those packages fall under AGPLv3
214
+ - Server/agents/verify are AGPLv3 — contributions to those packages fall under AGPLv3. A [commercial license](./COMMERCIAL-LICENSE.md) is available for hosted-SaaS use cases that cannot publish modifications. The `packages/server/ee/` directory is source-available but commercial (production use needs a license); contributions there are accepted under the same EE terms.
203
215
 
204
216
  ## Questions?
205
217
 
package/README.md CHANGED
@@ -1,9 +1,16 @@
1
1
  # @mushi-mushi/cli
2
2
 
3
3
  > **Your AI wrote it. Mushi tells you why it broke.**
4
- > Plain-English diagnosis + a paste-ready fix, right inside Cursor. MIT-licensed SDKs · self-hostable · no second LLM key.
5
4
 
6
- CLI for Mushi Mushi — set up the SDK in one command, wire Cursor MCP, then triage reports and monitor the pipeline from your terminal.
5
+ Set up the Mushi SDK, wire Cursor MCP, and triage reports from your terminal.
6
+
7
+ Positioning and product overview: [docs site](https://github.com/kensaurus/mushi-mushi/blob/master/apps/docs/content/quickstart/index.mdx) · [VISION.md](https://github.com/kensaurus/mushi-mushi/blob/master/VISION.md)
8
+
9
+ ## Quick start
10
+
11
+ ```bash
12
+ npx @mushi-mushi/cli init
13
+ ```
7
14
 
8
15
  ## Console ↔ CLI loop
9
16
 
@@ -320,7 +327,7 @@ mushi tdd improve
320
327
  mushi qa stories
321
328
  mushi qa runs <storyId>
322
329
  mushi qa run <storyId>
323
- mushi qa audit
330
+ mushi audit
324
331
  ```
325
332
 
326
333
  ---
@@ -368,7 +375,7 @@ Config file: `~/.config/mushi/config.json` (Unix mode `0o600`; legacy `~/.mushir
368
375
  - `~/.config/mushi/config.json` is written with mode `0o600` on Unix. Legacy configs with looser permissions are tightened on load.
369
376
  - `--endpoint` values are parsed through `new URL()` and required to use `https://` except for `localhost` / `127.0.0.1` / `*.local`.
370
377
  - The `--api-key` flag leaks into `ps -ef` — prefer the interactive prompt on shared machines.
371
- - Full stack traces on error: `DEBUG=mushi mushi init`.
378
+ - Full stack traces on error: `MUSHI_DEBUG=1 mushi init`.
372
379
 
373
380
  ## Programmatic imports
374
381
 
@@ -383,9 +390,3 @@ The CLI is also importable for tooling (used by `create-mushi-mushi`):
383
390
  ## License
384
391
 
385
392
  MIT
386
-
387
-
388
- <!-- mushi-readme-stats-footer -->
389
- ---
390
-
391
- <sub>Monorepo scale (June 2026): 47 edge functions · 256 SQL migrations · 13 outbound plugins · 11 inbound adapters · 18 pipeline agents. Canonical counts: <a href="https://github.com/kensaurus/mushi-mushi/blob/master/docs/stats.md">docs/stats.md</a> · <code>pnpm docs-stats</code></sub>
package/SECURITY.md CHANGED
@@ -113,7 +113,7 @@ What we treat as in-scope attacker capabilities, and what we don't.
113
113
  | Compromised Supabase service-role key | ❌ | Treated as a tier-0 incident; would require key rotation and audit-log forensics. Not defendable in software. |
114
114
  | Compromise of `kensaurus@gmail.com` | ❌ | Treated as a project-fork event; downstream consumers should pin to the last known-good version and follow the new release channel. |
115
115
  | Physical / OS-level attacker on an end-user device | ❌ | Out of scope. |
116
- | Malicious fork using the Mushi name to ship malware | ❌ (technical) ✅ (legal) | The MIT/BSL grant lets the fork exist; the trademark policy (`TRADEMARK.md`) makes shipping it under the Mushi name an infringement we will pursue. |
116
+ | Malicious fork using the Mushi name to ship malware | ❌ (technical) ✅ (legal) | The MIT / AGPLv3 grant lets the fork exist; the trademark policy (`TRADEMARK.md`) makes shipping it under the Mushi name an infringement we will pursue. |
117
117
 
118
118
  ## Data handling and PII
119
119
 
@@ -0,0 +1,6 @@
1
+ // src/version.ts
2
+ var MUSHI_CLI_VERSION = true ? "0.22.0" : "0.0.0-dev";
3
+
4
+ export {
5
+ MUSHI_CLI_VERSION
6
+ };
@@ -321,30 +321,36 @@ function installCommand(pm, packages) {
321
321
  return `${pm} ${verb} ${packages.join(" ")}`;
322
322
  }
323
323
  var SERVER_FRAMEWORK_IDS = /* @__PURE__ */ new Set(["express", "fastify", "hono"]);
324
- function envVarsToWrite(apiKey, projectId, framework) {
324
+ function envVarsToWrite(apiKey, projectId, framework, endpoint) {
325
+ const CLOUD_ENDPOINT = "https://dxptnwrhwsqckaftyymj.supabase.co/functions/v1/api";
326
+ const endpointLine = endpoint && endpoint !== CLOUD_ENDPOINT ? `MUSHI_API_ENDPOINT=${endpoint}` : null;
325
327
  if (SERVER_FRAMEWORK_IDS.has(framework.id)) {
326
328
  return [
327
329
  `MUSHI_PROJECT_ID=${projectId}`,
328
- `MUSHI_API_KEY=${apiKey}`
329
- ].join("\n");
330
+ `MUSHI_API_KEY=${apiKey}`,
331
+ endpointLine
332
+ ].filter(Boolean).join("\n");
330
333
  }
331
334
  if (framework.id === "react-native") {
332
335
  return [
333
336
  `MUSHI_PROJECT_ID=${projectId}`,
334
- `MUSHI_API_KEY=${apiKey}`
335
- ].join("\n");
337
+ `MUSHI_API_KEY=${apiKey}`,
338
+ endpointLine
339
+ ].filter(Boolean).join("\n");
336
340
  }
337
341
  if (framework.id === "expo") {
338
342
  return [
339
343
  `EXPO_PUBLIC_MUSHI_PROJECT_ID=${projectId}`,
340
- `EXPO_PUBLIC_MUSHI_API_KEY=${apiKey}`
341
- ].join("\n");
344
+ `EXPO_PUBLIC_MUSHI_API_KEY=${apiKey}`,
345
+ endpointLine ? `EXPO_PUBLIC_${endpointLine}` : null
346
+ ].filter(Boolean).join("\n");
342
347
  }
343
348
  const prefix = framework.id === "next" ? "NEXT_PUBLIC_" : framework.id === "nuxt" ? "NUXT_PUBLIC_" : "VITE_";
344
349
  return [
345
350
  `${prefix}MUSHI_PROJECT_ID=${projectId}`,
346
- `${prefix}MUSHI_API_KEY=${apiKey}`
347
- ].join("\n");
351
+ `${prefix}MUSHI_API_KEY=${apiKey}`,
352
+ endpointLine ? `${prefix}${endpointLine}` : null
353
+ ].filter(Boolean).join("\n");
348
354
  }
349
355
  function collectDeps(pkg) {
350
356
  if (!pkg) return /* @__PURE__ */ new Set();
@@ -405,30 +405,36 @@ function installCommand(pm, packages) {
405
405
  return `${pm} ${verb} ${packages.join(" ")}`;
406
406
  }
407
407
  var SERVER_FRAMEWORK_IDS = /* @__PURE__ */ new Set(["express", "fastify", "hono"]);
408
- function envVarsToWrite(apiKey, projectId, framework) {
408
+ function envVarsToWrite(apiKey, projectId, framework, endpoint) {
409
+ const CLOUD_ENDPOINT = "https://dxptnwrhwsqckaftyymj.supabase.co/functions/v1/api";
410
+ const endpointLine = endpoint && endpoint !== CLOUD_ENDPOINT ? `MUSHI_API_ENDPOINT=${endpoint}` : null;
409
411
  if (SERVER_FRAMEWORK_IDS.has(framework.id)) {
410
412
  return [
411
413
  `MUSHI_PROJECT_ID=${projectId}`,
412
- `MUSHI_API_KEY=${apiKey}`
413
- ].join("\n");
414
+ `MUSHI_API_KEY=${apiKey}`,
415
+ endpointLine
416
+ ].filter(Boolean).join("\n");
414
417
  }
415
418
  if (framework.id === "react-native") {
416
419
  return [
417
420
  `MUSHI_PROJECT_ID=${projectId}`,
418
- `MUSHI_API_KEY=${apiKey}`
419
- ].join("\n");
421
+ `MUSHI_API_KEY=${apiKey}`,
422
+ endpointLine
423
+ ].filter(Boolean).join("\n");
420
424
  }
421
425
  if (framework.id === "expo") {
422
426
  return [
423
427
  `EXPO_PUBLIC_MUSHI_PROJECT_ID=${projectId}`,
424
- `EXPO_PUBLIC_MUSHI_API_KEY=${apiKey}`
425
- ].join("\n");
428
+ `EXPO_PUBLIC_MUSHI_API_KEY=${apiKey}`,
429
+ endpointLine ? `EXPO_PUBLIC_${endpointLine}` : null
430
+ ].filter(Boolean).join("\n");
426
431
  }
427
432
  const prefix = framework.id === "next" ? "NEXT_PUBLIC_" : framework.id === "nuxt" ? "NUXT_PUBLIC_" : "VITE_";
428
433
  return [
429
434
  `${prefix}MUSHI_PROJECT_ID=${projectId}`,
430
- `${prefix}MUSHI_API_KEY=${apiKey}`
431
- ].join("\n");
435
+ `${prefix}MUSHI_API_KEY=${apiKey}`,
436
+ endpointLine ? `${prefix}${endpointLine}` : null
437
+ ].filter(Boolean).join("\n");
432
438
  }
433
439
  function collectDeps(pkg) {
434
440
  if (!pkg) return /* @__PURE__ */ new Set();
@@ -8,7 +8,7 @@ import {
8
8
  detectFramework,
9
9
  envVarsToWrite,
10
10
  readPackageJson
11
- } from "./chunk-7Q44KWGN.js";
11
+ } from "./chunk-JAUKBLPK.js";
12
12
 
13
13
  // src/connect.ts
14
14
  import { appendFile, readFile as readFile2, writeFile as writeFile2 } from "fs/promises";
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  runConnect
4
- } from "./chunk-D5IDNBJO.js";
4
+ } from "./chunk-R2HPR2FV.js";
5
5
  import "./chunk-LDPFTQLE.js";
6
6
  export {
7
7
  runConnect
package/dist/detect.d.ts CHANGED
@@ -25,6 +25,6 @@ declare function readPackageJson(cwd: string): PackageJson | null;
25
25
  declare function detectFramework(cwd: string, pkg: PackageJson | null): Framework;
26
26
  declare function detectPackageManager(cwd: string): PackageManager;
27
27
  declare function installCommand(pm: PackageManager, packages: string[]): string;
28
- declare function envVarsToWrite(apiKey: string, projectId: string, framework: Framework): string;
28
+ declare function envVarsToWrite(apiKey: string, projectId: string, framework: Framework, endpoint?: string): string;
29
29
 
30
30
  export { FRAMEWORKS, FRAMEWORK_IDS, type Framework, type FrameworkId, type PackageJson, type PackageManager, detectFramework, detectPackageManager, envVarsToWrite, installCommand, isFrameworkId, readPackageJson };
package/dist/detect.js CHANGED
@@ -7,7 +7,7 @@ import {
7
7
  installCommand,
8
8
  isFrameworkId,
9
9
  readPackageJson
10
- } from "./chunk-7Q44KWGN.js";
10
+ } from "./chunk-JAUKBLPK.js";
11
11
  export {
12
12
  FRAMEWORKS,
13
13
  FRAMEWORK_IDS,