@brainst0rm/cli 0.13.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.
Files changed (55) hide show
  1. package/README.md +32 -0
  2. package/dist/App-DPXJYXKH.js +2794 -0
  3. package/dist/App-DPXJYXKH.js.map +1 -0
  4. package/dist/App-SSKWB7CT.js +2795 -0
  5. package/dist/App-SSKWB7CT.js.map +1 -0
  6. package/dist/brainstorm.js +4636 -0
  7. package/dist/brainstorm.js.map +1 -0
  8. package/dist/chunk-2CHZHDIM.js +391 -0
  9. package/dist/chunk-2CHZHDIM.js.map +1 -0
  10. package/dist/chunk-55ITCWZZ.js +1307 -0
  11. package/dist/chunk-55ITCWZZ.js.map +1 -0
  12. package/dist/chunk-5NA3GH6X.js +1308 -0
  13. package/dist/chunk-5NA3GH6X.js.map +1 -0
  14. package/dist/chunk-7D4SUZUM.js +38 -0
  15. package/dist/chunk-7D4SUZUM.js.map +1 -0
  16. package/dist/chunk-D474E47D.js +148 -0
  17. package/dist/chunk-D474E47D.js.map +1 -0
  18. package/dist/chunk-GJXEX2A3.js +146 -0
  19. package/dist/chunk-GJXEX2A3.js.map +1 -0
  20. package/dist/chunk-OVGL3NJQ.js +307 -0
  21. package/dist/chunk-OVGL3NJQ.js.map +1 -0
  22. package/dist/chunk-VY6MPJXL.js +389 -0
  23. package/dist/chunk-VY6MPJXL.js.map +1 -0
  24. package/dist/chunk-YWXOPUDW.js +305 -0
  25. package/dist/chunk-YWXOPUDW.js.map +1 -0
  26. package/dist/chunk-ZWE3DS7E.js +39 -0
  27. package/dist/chunk-ZWE3DS7E.js.map +1 -0
  28. package/dist/dist-DUDO3RDM.js +9573 -0
  29. package/dist/dist-DUDO3RDM.js.map +1 -0
  30. package/dist/dist-GNHTH2DH.js +292 -0
  31. package/dist/dist-GNHTH2DH.js.map +1 -0
  32. package/dist/dist-JUDVPE7G.js +293 -0
  33. package/dist/dist-JUDVPE7G.js.map +1 -0
  34. package/dist/dist-V5DTSTKJ.js +9572 -0
  35. package/dist/dist-V5DTSTKJ.js.map +1 -0
  36. package/dist/dist-WLTQTLFO.js +14 -0
  37. package/dist/dist-WLTQTLFO.js.map +1 -0
  38. package/dist/dist-YIGU37Q2.js +15 -0
  39. package/dist/dist-YIGU37Q2.js.map +1 -0
  40. package/dist/index.d.ts +3 -0
  41. package/dist/index.js +4635 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/recorder-D6ILEOZP.js +67 -0
  44. package/dist/recorder-D6ILEOZP.js.map +1 -0
  45. package/dist/recorder-SPYYF4DL.js +66 -0
  46. package/dist/recorder-SPYYF4DL.js.map +1 -0
  47. package/dist/roles-2DGF4PZU.js +16 -0
  48. package/dist/roles-2DGF4PZU.js.map +1 -0
  49. package/dist/roles-UIPX7GBC.js +17 -0
  50. package/dist/roles-UIPX7GBC.js.map +1 -0
  51. package/dist/slash-PDWKCZOQ.js +13 -0
  52. package/dist/slash-PDWKCZOQ.js.map +1 -0
  53. package/dist/slash-ZDC4DKL4.js +14 -0
  54. package/dist/slash-ZDC4DKL4.js.map +1 -0
  55. package/package.json +76 -0
@@ -0,0 +1,67 @@
1
+ #!/usr/bin/env node
2
+ import "./chunk-ZWE3DS7E.js";
3
+
4
+ // src/voice/recorder.ts
5
+ import { spawn, execFileSync } from "child_process";
6
+ import { tmpdir } from "os";
7
+ import { join } from "path";
8
+ import { randomUUID } from "crypto";
9
+ import { existsSync } from "fs";
10
+ var AudioRecorder = class {
11
+ process = null;
12
+ outputPath = "";
13
+ /** Check if sox is available. */
14
+ static isAvailable() {
15
+ try {
16
+ execFileSync("sox", ["--version"], {
17
+ encoding: "utf-8",
18
+ stdio: ["ignore", "pipe", "pipe"]
19
+ });
20
+ return true;
21
+ } catch {
22
+ return false;
23
+ }
24
+ }
25
+ /** Start recording audio. Returns the path where audio will be saved. */
26
+ start() {
27
+ if (this.process) {
28
+ throw new Error("Already recording. Call stop() first.");
29
+ }
30
+ this.outputPath = join(
31
+ tmpdir(),
32
+ `brainstorm-voice-${randomUUID().slice(0, 8)}.wav`
33
+ );
34
+ this.process = spawn(
35
+ "sox",
36
+ ["-d", "-r", "16000", "-c", "1", "-b", "16", this.outputPath],
37
+ {
38
+ stdio: ["ignore", "pipe", "pipe"]
39
+ }
40
+ );
41
+ this.process.on("error", (err) => {
42
+ console.error(`Recording error: ${err.message}`);
43
+ this.process = null;
44
+ });
45
+ return this.outputPath;
46
+ }
47
+ /** Stop recording and return the audio file path. */
48
+ stop() {
49
+ if (!this.process) {
50
+ throw new Error("Not recording. Call start() first.");
51
+ }
52
+ this.process.kill("SIGTERM");
53
+ this.process = null;
54
+ if (!existsSync(this.outputPath)) {
55
+ throw new Error("Recording failed \u2014 no audio file produced.");
56
+ }
57
+ return this.outputPath;
58
+ }
59
+ /** Check if currently recording. */
60
+ isRecording() {
61
+ return this.process !== null && !this.process.killed;
62
+ }
63
+ };
64
+ export {
65
+ AudioRecorder
66
+ };
67
+ //# sourceMappingURL=recorder-D6ILEOZP.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/voice/recorder.ts"],"sourcesContent":["import { spawn, execFileSync, type ChildProcess } from \"node:child_process\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { randomUUID } from \"node:crypto\";\nimport { existsSync } from \"node:fs\";\n\n/**\n * Audio recorder using sox (cross-platform).\n *\n * Records audio from the default microphone to a temp WAV file.\n * Requires `sox` to be installed (brew install sox / apt install sox).\n */\nexport class AudioRecorder {\n private process: ChildProcess | null = null;\n private outputPath: string = \"\";\n\n /** Check if sox is available. */\n static isAvailable(): boolean {\n try {\n execFileSync(\"sox\", [\"--version\"], {\n encoding: \"utf-8\",\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n return true;\n } catch {\n return false;\n }\n }\n\n /** Start recording audio. Returns the path where audio will be saved. */\n start(): string {\n if (this.process) {\n throw new Error(\"Already recording. Call stop() first.\");\n }\n\n this.outputPath = join(\n tmpdir(),\n `brainstorm-voice-${randomUUID().slice(0, 8)}.wav`,\n );\n\n // sox -d = default audio device, -r 16000 = 16kHz (Whisper optimal), -c 1 = mono\n this.process = spawn(\n \"sox\",\n [\"-d\", \"-r\", \"16000\", \"-c\", \"1\", \"-b\", \"16\", this.outputPath],\n {\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n },\n );\n\n this.process.on(\"error\", (err) => {\n console.error(`Recording error: ${err.message}`);\n this.process = null;\n });\n\n return this.outputPath;\n }\n\n /** Stop recording and return the audio file path. */\n stop(): string {\n if (!this.process) {\n throw new Error(\"Not recording. Call start() first.\");\n }\n\n this.process.kill(\"SIGTERM\");\n this.process = null;\n\n if (!existsSync(this.outputPath)) {\n throw new Error(\"Recording failed — no audio file produced.\");\n }\n\n return this.outputPath;\n }\n\n /** Check if currently recording. */\n isRecording(): boolean {\n return this.process !== null && !this.process.killed;\n }\n}\n"],"mappings":";;;;AAAA,SAAS,OAAO,oBAAuC;AACvD,SAAS,cAAc;AACvB,SAAS,YAAY;AACrB,SAAS,kBAAkB;AAC3B,SAAS,kBAAkB;AAQpB,IAAM,gBAAN,MAAoB;AAAA,EACjB,UAA+B;AAAA,EAC/B,aAAqB;AAAA;AAAA,EAG7B,OAAO,cAAuB;AAC5B,QAAI;AACF,mBAAa,OAAO,CAAC,WAAW,GAAG;AAAA,QACjC,UAAU;AAAA,QACV,OAAO,CAAC,UAAU,QAAQ,MAAM;AAAA,MAClC,CAAC;AACD,aAAO;AAAA,IACT,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA,EAGA,QAAgB;AACd,QAAI,KAAK,SAAS;AAChB,YAAM,IAAI,MAAM,uCAAuC;AAAA,IACzD;AAEA,SAAK,aAAa;AAAA,MAChB,OAAO;AAAA,MACP,oBAAoB,WAAW,EAAE,MAAM,GAAG,CAAC,CAAC;AAAA,IAC9C;AAGA,SAAK,UAAU;AAAA,MACb;AAAA,MACA,CAAC,MAAM,MAAM,SAAS,MAAM,KAAK,MAAM,MAAM,KAAK,UAAU;AAAA,MAC5D;AAAA,QACE,OAAO,CAAC,UAAU,QAAQ,MAAM;AAAA,MAClC;AAAA,IACF;AAEA,SAAK,QAAQ,GAAG,SAAS,CAAC,QAAQ;AAChC,cAAQ,MAAM,oBAAoB,IAAI,OAAO,EAAE;AAC/C,WAAK,UAAU;AAAA,IACjB,CAAC;AAED,WAAO,KAAK;AAAA,EACd;AAAA;AAAA,EAGA,OAAe;AACb,QAAI,CAAC,KAAK,SAAS;AACjB,YAAM,IAAI,MAAM,oCAAoC;AAAA,IACtD;AAEA,SAAK,QAAQ,KAAK,SAAS;AAC3B,SAAK,UAAU;AAEf,QAAI,CAAC,WAAW,KAAK,UAAU,GAAG;AAChC,YAAM,IAAI,MAAM,iDAA4C;AAAA,IAC9D;AAEA,WAAO,KAAK;AAAA,EACd;AAAA;AAAA,EAGA,cAAuB;AACrB,WAAO,KAAK,YAAY,QAAQ,CAAC,KAAK,QAAQ;AAAA,EAChD;AACF;","names":[]}
@@ -0,0 +1,66 @@
1
+ import "./chunk-7D4SUZUM.js";
2
+
3
+ // src/voice/recorder.ts
4
+ import { spawn, execFileSync } from "child_process";
5
+ import { tmpdir } from "os";
6
+ import { join } from "path";
7
+ import { randomUUID } from "crypto";
8
+ import { existsSync } from "fs";
9
+ var AudioRecorder = class {
10
+ process = null;
11
+ outputPath = "";
12
+ /** Check if sox is available. */
13
+ static isAvailable() {
14
+ try {
15
+ execFileSync("sox", ["--version"], {
16
+ encoding: "utf-8",
17
+ stdio: ["ignore", "pipe", "pipe"]
18
+ });
19
+ return true;
20
+ } catch {
21
+ return false;
22
+ }
23
+ }
24
+ /** Start recording audio. Returns the path where audio will be saved. */
25
+ start() {
26
+ if (this.process) {
27
+ throw new Error("Already recording. Call stop() first.");
28
+ }
29
+ this.outputPath = join(
30
+ tmpdir(),
31
+ `brainstorm-voice-${randomUUID().slice(0, 8)}.wav`
32
+ );
33
+ this.process = spawn(
34
+ "sox",
35
+ ["-d", "-r", "16000", "-c", "1", "-b", "16", this.outputPath],
36
+ {
37
+ stdio: ["ignore", "pipe", "pipe"]
38
+ }
39
+ );
40
+ this.process.on("error", (err) => {
41
+ console.error(`Recording error: ${err.message}`);
42
+ this.process = null;
43
+ });
44
+ return this.outputPath;
45
+ }
46
+ /** Stop recording and return the audio file path. */
47
+ stop() {
48
+ if (!this.process) {
49
+ throw new Error("Not recording. Call start() first.");
50
+ }
51
+ this.process.kill("SIGTERM");
52
+ this.process = null;
53
+ if (!existsSync(this.outputPath)) {
54
+ throw new Error("Recording failed \u2014 no audio file produced.");
55
+ }
56
+ return this.outputPath;
57
+ }
58
+ /** Check if currently recording. */
59
+ isRecording() {
60
+ return this.process !== null && !this.process.killed;
61
+ }
62
+ };
63
+ export {
64
+ AudioRecorder
65
+ };
66
+ //# sourceMappingURL=recorder-SPYYF4DL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/voice/recorder.ts"],"sourcesContent":["import { spawn, execFileSync, type ChildProcess } from \"node:child_process\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { randomUUID } from \"node:crypto\";\nimport { existsSync } from \"node:fs\";\n\n/**\n * Audio recorder using sox (cross-platform).\n *\n * Records audio from the default microphone to a temp WAV file.\n * Requires `sox` to be installed (brew install sox / apt install sox).\n */\nexport class AudioRecorder {\n private process: ChildProcess | null = null;\n private outputPath: string = \"\";\n\n /** Check if sox is available. */\n static isAvailable(): boolean {\n try {\n execFileSync(\"sox\", [\"--version\"], {\n encoding: \"utf-8\",\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n return true;\n } catch {\n return false;\n }\n }\n\n /** Start recording audio. Returns the path where audio will be saved. */\n start(): string {\n if (this.process) {\n throw new Error(\"Already recording. Call stop() first.\");\n }\n\n this.outputPath = join(\n tmpdir(),\n `brainstorm-voice-${randomUUID().slice(0, 8)}.wav`,\n );\n\n // sox -d = default audio device, -r 16000 = 16kHz (Whisper optimal), -c 1 = mono\n this.process = spawn(\n \"sox\",\n [\"-d\", \"-r\", \"16000\", \"-c\", \"1\", \"-b\", \"16\", this.outputPath],\n {\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n },\n );\n\n this.process.on(\"error\", (err) => {\n console.error(`Recording error: ${err.message}`);\n this.process = null;\n });\n\n return this.outputPath;\n }\n\n /** Stop recording and return the audio file path. */\n stop(): string {\n if (!this.process) {\n throw new Error(\"Not recording. Call start() first.\");\n }\n\n this.process.kill(\"SIGTERM\");\n this.process = null;\n\n if (!existsSync(this.outputPath)) {\n throw new Error(\"Recording failed — no audio file produced.\");\n }\n\n return this.outputPath;\n }\n\n /** Check if currently recording. */\n isRecording(): boolean {\n return this.process !== null && !this.process.killed;\n }\n}\n"],"mappings":";;;AAAA,SAAS,OAAO,oBAAuC;AACvD,SAAS,cAAc;AACvB,SAAS,YAAY;AACrB,SAAS,kBAAkB;AAC3B,SAAS,kBAAkB;AAQpB,IAAM,gBAAN,MAAoB;AAAA,EACjB,UAA+B;AAAA,EAC/B,aAAqB;AAAA;AAAA,EAG7B,OAAO,cAAuB;AAC5B,QAAI;AACF,mBAAa,OAAO,CAAC,WAAW,GAAG;AAAA,QACjC,UAAU;AAAA,QACV,OAAO,CAAC,UAAU,QAAQ,MAAM;AAAA,MAClC,CAAC;AACD,aAAO;AAAA,IACT,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA,EAGA,QAAgB;AACd,QAAI,KAAK,SAAS;AAChB,YAAM,IAAI,MAAM,uCAAuC;AAAA,IACzD;AAEA,SAAK,aAAa;AAAA,MAChB,OAAO;AAAA,MACP,oBAAoB,WAAW,EAAE,MAAM,GAAG,CAAC,CAAC;AAAA,IAC9C;AAGA,SAAK,UAAU;AAAA,MACb;AAAA,MACA,CAAC,MAAM,MAAM,SAAS,MAAM,KAAK,MAAM,MAAM,KAAK,UAAU;AAAA,MAC5D;AAAA,QACE,OAAO,CAAC,UAAU,QAAQ,MAAM;AAAA,MAClC;AAAA,IACF;AAEA,SAAK,QAAQ,GAAG,SAAS,CAAC,QAAQ;AAChC,cAAQ,MAAM,oBAAoB,IAAI,OAAO,EAAE;AAC/C,WAAK,UAAU;AAAA,IACjB,CAAC;AAED,WAAO,KAAK;AAAA,EACd;AAAA;AAAA,EAGA,OAAe;AACb,QAAI,CAAC,KAAK,SAAS;AACjB,YAAM,IAAI,MAAM,oCAAoC;AAAA,IACtD;AAEA,SAAK,QAAQ,KAAK,SAAS;AAC3B,SAAK,UAAU;AAEf,QAAI,CAAC,WAAW,KAAK,UAAU,GAAG;AAChC,YAAM,IAAI,MAAM,iDAA4C;AAAA,IAC9D;AAEA,WAAO,KAAK;AAAA,EACd;AAAA;AAAA,EAGA,cAAuB;AACrB,WAAO,KAAK,YAAY,QAAQ,CAAC,KAAK,QAAQ;AAAA,EAChD;AACF;","names":[]}
@@ -0,0 +1,16 @@
1
+ import {
2
+ ROLES,
3
+ formatModelMenu,
4
+ formatRoleConfirmation,
5
+ getModelForRole,
6
+ getRolePrompt
7
+ } from "./chunk-YWXOPUDW.js";
8
+ import "./chunk-7D4SUZUM.js";
9
+ export {
10
+ ROLES,
11
+ formatModelMenu,
12
+ formatRoleConfirmation,
13
+ getModelForRole,
14
+ getRolePrompt
15
+ };
16
+ //# sourceMappingURL=roles-2DGF4PZU.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ ROLES,
4
+ formatModelMenu,
5
+ formatRoleConfirmation,
6
+ getModelForRole,
7
+ getRolePrompt
8
+ } from "./chunk-OVGL3NJQ.js";
9
+ import "./chunk-ZWE3DS7E.js";
10
+ export {
11
+ ROLES,
12
+ formatModelMenu,
13
+ formatRoleConfirmation,
14
+ getModelForRole,
15
+ getRolePrompt
16
+ };
17
+ //# sourceMappingURL=roles-UIPX7GBC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,13 @@
1
+ import {
2
+ executeSlashCommand,
3
+ getSlashCommands,
4
+ isSlashCommand
5
+ } from "./chunk-55ITCWZZ.js";
6
+ import "./chunk-YWXOPUDW.js";
7
+ import "./chunk-7D4SUZUM.js";
8
+ export {
9
+ executeSlashCommand,
10
+ getSlashCommands,
11
+ isSlashCommand
12
+ };
13
+ //# sourceMappingURL=slash-PDWKCZOQ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ executeSlashCommand,
4
+ getSlashCommands,
5
+ isSlashCommand
6
+ } from "./chunk-5NA3GH6X.js";
7
+ import "./chunk-OVGL3NJQ.js";
8
+ import "./chunk-ZWE3DS7E.js";
9
+ export {
10
+ executeSlashCommand,
11
+ getSlashCommands,
12
+ isSlashCommand
13
+ };
14
+ //# sourceMappingURL=slash-ZDC4DKL4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
package/package.json ADDED
@@ -0,0 +1,76 @@
1
+ {
2
+ "name": "@brainst0rm/cli",
3
+ "version": "0.13.0",
4
+ "description": "Open-source AI coding assistant with intelligent multi-model routing",
5
+ "type": "module",
6
+ "license": "Apache-2.0",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://github.com/justinjilg/brainstorm.git",
10
+ "directory": "packages/cli"
11
+ },
12
+ "homepage": "https://brainstorm.co",
13
+ "keywords": [
14
+ "ai",
15
+ "coding-assistant",
16
+ "llm",
17
+ "multi-model",
18
+ "routing",
19
+ "agent",
20
+ "developer-tools",
21
+ "brainstorm"
22
+ ],
23
+ "files": [
24
+ "dist"
25
+ ],
26
+ "bin": {
27
+ "brainstorm": "./dist/brainstorm.js",
28
+ "storm": "./dist/brainstorm.js"
29
+ },
30
+ "scripts": {
31
+ "build": "tsup",
32
+ "dev": "tsup --watch",
33
+ "typecheck": "tsc --noEmit",
34
+ "test": "vitest run"
35
+ },
36
+ "dependencies": {
37
+ "@brainst0rm/agents": "0.13.0",
38
+ "@brainst0rm/config": "0.13.0",
39
+ "@brainst0rm/core": "0.13.0",
40
+ "@brainst0rm/db": "0.13.0",
41
+ "@brainst0rm/docgen": "0.13.0",
42
+ "@brainst0rm/ingest": "0.13.0",
43
+ "@brainst0rm/eval": "0.13.0",
44
+ "@brainst0rm/gateway": "0.13.0",
45
+ "@brainst0rm/mcp": "0.13.0",
46
+ "@brainst0rm/providers": "0.13.0",
47
+ "@brainst0rm/router": "0.13.0",
48
+ "@brainst0rm/shared": "0.13.0",
49
+ "@brainst0rm/tools": "0.13.0",
50
+ "@brainst0rm/vault": "0.13.0",
51
+ "@brainst0rm/workflow": "0.13.0",
52
+ "chalk": "^5",
53
+ "cli-highlight": "^2.1.11",
54
+ "commander": "^13",
55
+ "ink": "^5",
56
+ "ink-spinner": "^5",
57
+ "ink-text-input": "^6",
58
+ "marked": "^17.0.5",
59
+ "marked-terminal": "^7.3.0",
60
+ "react": "^18",
61
+ "streamdown": "^2.5.0"
62
+ },
63
+ "devDependencies": {
64
+ "@types/react": "^18",
65
+ "@xterm/headless": "^5.5.0",
66
+ "ink-testing-library": "^4.0.0",
67
+ "node-pty": "^1.1.0",
68
+ "strip-ansi": "^7.2.0",
69
+ "tsup": "^8",
70
+ "typescript": "^5.7",
71
+ "yaml": "^2.8.3"
72
+ },
73
+ "publishConfig": {
74
+ "access": "public"
75
+ }
76
+ }