codmir 0.4.0 → 0.4.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.
package/dist/cli/index.js CHANGED
@@ -137,7 +137,7 @@ var require_package = __commonJS({
137
137
  "package.json"(exports2, module2) {
138
138
  module2.exports = {
139
139
  name: "codmir",
140
- version: "0.4.0",
140
+ version: "0.4.1",
141
141
  description: "Official codmir SDK - AI that prevents wasted engineering time. CLI, SDK, voice assistant, codebase analysis, and intelligent automation.",
142
142
  main: "dist/index.js",
143
143
  module: "dist/index.mjs",
@@ -1725,25 +1725,62 @@ var import_clipboardy = __toESM(require("clipboardy"));
1725
1725
  var import_fs6 = __toESM(require("fs"));
1726
1726
  var import_path6 = __toESM(require("path"));
1727
1727
  var import_form_data = __toESM(require("form-data"));
1728
+ var import_readline = __toESM(require("readline"));
1728
1729
  init_config();
1730
+ function renderLogo() {
1731
+ const c1 = import_chalk8.default.hex("#00D4FF");
1732
+ const c2 = import_chalk8.default.hex("#0099FF");
1733
+ const c3 = import_chalk8.default.hex("#7C3AED");
1734
+ const c4 = import_chalk8.default.hex("#EC4899");
1735
+ const c5 = import_chalk8.default.hex("#F472B6");
1736
+ const logo = `
1737
+ ${c1(" \u2588\u2588\u2588\u2588\u2588\u2588\u2557")}${c2(" \u2588\u2588\u2588\u2588\u2588\u2588\u2557 ")}${c2("\u2588\u2588\u2588\u2588\u2588\u2588\u2557 ")}${c3("\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2557")}${c4("\u2588\u2588\u2557")}${c5("\u2588\u2588\u2588\u2588\u2588\u2588\u2557 ")}
1738
+ ${c1(" \u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D")}${c2("\u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557")}${c2("\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557")}${c3("\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2551")}${c4("\u2588\u2588\u2551")}${c5("\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557")}
1739
+ ${c1(" \u2588\u2588\u2551 ")}${c2("\u2588\u2588\u2551 \u2588\u2588\u2551")}${c2("\u2588\u2588\u2551 \u2588\u2588\u2551")}${c3("\u2588\u2588\u2554\u2588\u2588\u2588\u2588\u2554\u2588\u2588\u2551")}${c4("\u2588\u2588\u2551")}${c5("\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D")}
1740
+ ${c1(" \u2588\u2588\u2551 ")}${c2("\u2588\u2588\u2551 \u2588\u2588\u2551")}${c2("\u2588\u2588\u2551 \u2588\u2588\u2551")}${c3("\u2588\u2588\u2551\u255A\u2588\u2588\u2554\u255D\u2588\u2588\u2551")}${c4("\u2588\u2588\u2551")}${c5("\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557")}
1741
+ ${c1(" \u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2557")}${c2("\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D")}${c2("\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D")}${c3("\u2588\u2588\u2551 \u255A\u2550\u255D \u2588\u2588\u2551")}${c4("\u2588\u2588\u2551")}${c5("\u2588\u2588\u2551 \u2588\u2588\u2551")}
1742
+ ${c1(" \u255A\u2550\u2550\u2550\u2550\u2550\u255D")}${c2(" \u255A\u2550\u2550\u2550\u2550\u2550\u255D ")}${c2("\u255A\u2550\u2550\u2550\u2550\u2550\u255D ")}${c3("\u255A\u2550\u255D \u255A\u2550\u255D")}${c4("\u255A\u2550\u255D")}${c5("\u255A\u2550\u255D \u255A\u2550\u255D")}
1743
+ `;
1744
+ console.log(logo);
1745
+ }
1746
+ function renderTips() {
1747
+ console.log(import_chalk8.default.white("Tips for getting started:"));
1748
+ console.log(import_chalk8.default.dim("1. Ask questions, edit files, or run commands."));
1749
+ console.log(import_chalk8.default.dim("2. Be specific for the best results."));
1750
+ console.log(import_chalk8.default.dim("3. Create ") + import_chalk8.default.cyan("CODMIR.md") + import_chalk8.default.dim(" files to customize your interactions with codmir."));
1751
+ console.log(import_chalk8.default.dim("4. ") + import_chalk8.default.cyan("/help") + import_chalk8.default.dim(" for more information."));
1752
+ console.log();
1753
+ }
1754
+ function renderStatusBar(context, model) {
1755
+ const termWidth = process.stdout.columns || 80;
1756
+ const projectInfo = context.isLinkedProject ? import_chalk8.default.cyan(`~/${context.projectConfig?.projectName || "project"}`) : import_chalk8.default.yellow("~/global");
1757
+ const sandboxStatus = import_chalk8.default.dim("no sandbox") + import_chalk8.default.dim(" (see /docs)");
1758
+ const modelInfo = import_chalk8.default.green(`${model}`) + import_chalk8.default.dim(" (100% context left)");
1759
+ console.log();
1760
+ console.log(import_chalk8.default.dim("\u2500".repeat(termWidth)));
1761
+ console.log(`${projectInfo} ${sandboxStatus} ${modelInfo}`);
1762
+ }
1763
+ function renderEditHint() {
1764
+ const termWidth = process.stdout.columns || 80;
1765
+ const hint = import_chalk8.default.dim("accepting edits") + import_chalk8.default.dim(" (shift + tab to toggle)");
1766
+ const padding = " ".repeat(Math.max(0, termWidth - 35));
1767
+ console.log(padding + hint);
1768
+ }
1729
1769
  async function assistantCommand(query, options = {}) {
1730
1770
  const token = getToken();
1771
+ const context = getExecutionContext();
1772
+ const model = options.model || "gpt-4-turbo";
1773
+ console.clear();
1774
+ renderLogo();
1731
1775
  if (!token) {
1732
- console.error(import_chalk8.default.red("\u274C Not authenticated"));
1733
- console.log(import_chalk8.default.dim(" Run"), import_chalk8.default.cyan("codmir login"), import_chalk8.default.dim("first"));
1776
+ console.log(import_chalk8.default.red("\n\u274C Not authenticated"));
1777
+ console.log(import_chalk8.default.dim(" Run ") + import_chalk8.default.cyan("codmir login") + import_chalk8.default.dim(" to get started.\n"));
1734
1778
  process.exit(1);
1735
1779
  }
1780
+ renderTips();
1781
+ renderEditHint();
1736
1782
  const baseUrl = getBaseUrl();
1737
1783
  const conversationHistory = [];
1738
- const context = getExecutionContext();
1739
- if (context.isLinkedProject) {
1740
- console.log(import_chalk8.default.dim(` \u{1F4C1} Project: ${context.projectConfig?.projectName || context.projectConfig?.projectId}`));
1741
- console.log(import_chalk8.default.dim(` \u{1F517} Mode: ${import_chalk8.default.cyan("local")} (linked project)
1742
- `));
1743
- } else {
1744
- console.log(import_chalk8.default.dim(` \u{1F310} Mode: ${import_chalk8.default.yellow("global")}
1745
- `));
1746
- }
1747
1784
  conversationHistory.push({
1748
1785
  role: "system",
1749
1786
  content: `You are codmir, an AI assistant for developers. You help with:
@@ -1754,28 +1791,47 @@ async function assistantCommand(query, options = {}) {
1754
1791
 
1755
1792
  Be concise, practical, and code-focused. Use lowercase "codmir" for the brand.`
1756
1793
  });
1757
- console.log(import_chalk8.default.bold("\n\u{1F916} codmir"));
1758
- console.log(import_chalk8.default.dim(" AI assistant for developers\n"));
1759
1794
  if (query) {
1760
1795
  await handleQuery(query, conversationHistory, baseUrl, token, options);
1796
+ renderStatusBar(context, model);
1761
1797
  return;
1762
1798
  }
1763
- console.log(import_chalk8.default.dim(" Type your question or"), import_chalk8.default.cyan("exit"), import_chalk8.default.dim("to quit"));
1764
- console.log(import_chalk8.default.dim(" \u{1F4CB} Tip: Copy images to clipboard before asking for automatic upload"));
1765
- console.log(import_chalk8.default.dim(' Example: "How do I setup authentication?"\n'));
1766
- while (true) {
1767
- const { userInput } = await (0, import_prompts3.default)({
1768
- type: "text",
1769
- name: "userInput",
1770
- message: import_chalk8.default.cyan("codmir"),
1771
- validate: (value) => value.length > 0 || "Please enter a question"
1799
+ const rl = import_readline.default.createInterface({
1800
+ input: process.stdin,
1801
+ output: process.stdout
1802
+ });
1803
+ const promptUser = () => {
1804
+ rl.question(import_chalk8.default.cyan("> ") + import_chalk8.default.dim("Type your message or @path/to/file "), async (userInput) => {
1805
+ if (!userInput || userInput.toLowerCase() === "exit" || userInput.toLowerCase() === "quit" || userInput === "/exit") {
1806
+ console.log(import_chalk8.default.dim("\nGoodbye! \u{1F44B}\n"));
1807
+ rl.close();
1808
+ return;
1809
+ }
1810
+ if (userInput === "/help") {
1811
+ console.log("\n" + import_chalk8.default.bold("Available commands:"));
1812
+ console.log(import_chalk8.default.cyan(" /help") + import_chalk8.default.dim(" - Show this help message"));
1813
+ console.log(import_chalk8.default.cyan(" /clear") + import_chalk8.default.dim(" - Clear conversation history"));
1814
+ console.log(import_chalk8.default.cyan(" /exit") + import_chalk8.default.dim(" - Exit codmir"));
1815
+ console.log(import_chalk8.default.cyan(" @file") + import_chalk8.default.dim(" - Reference a file in your message"));
1816
+ console.log();
1817
+ promptUser();
1818
+ return;
1819
+ }
1820
+ if (userInput === "/clear") {
1821
+ conversationHistory.length = 1;
1822
+ console.log(import_chalk8.default.dim("\n\u2713 Conversation cleared\n"));
1823
+ promptUser();
1824
+ return;
1825
+ }
1826
+ await handleQuery(userInput, conversationHistory, baseUrl, token, options);
1827
+ console.log();
1828
+ promptUser();
1772
1829
  });
1773
- if (!userInput || userInput.toLowerCase() === "exit" || userInput.toLowerCase() === "quit") {
1774
- console.log(import_chalk8.default.dim("\n Goodbye! \u{1F44B}\n"));
1775
- break;
1776
- }
1777
- await handleQuery(userInput, conversationHistory, baseUrl, token, options);
1778
- }
1830
+ };
1831
+ promptUser();
1832
+ rl.on("close", () => {
1833
+ renderStatusBar(context, model);
1834
+ });
1779
1835
  }
1780
1836
  async function handleQuery(query, conversationHistory, baseUrl, token, options) {
1781
1837
  let imagePaths;
@@ -2601,7 +2657,12 @@ program.command("council [task...]").description("\u{1F3AD} Assemble a council o
2601
2657
  const taskString = task ? task.join(" ") : void 0;
2602
2658
  councilCommand(taskString, options);
2603
2659
  });
2604
- program.parse(process.argv);
2605
- if (!process.argv.slice(2).length) {
2606
- program.outputHelp();
2660
+ if (!process.argv.slice(2).length || process.argv[2] === "--help" || process.argv[2] === "-h") {
2661
+ if (process.argv[2] === "--help" || process.argv[2] === "-h") {
2662
+ program.parse(process.argv);
2663
+ } else {
2664
+ assistantCommand(void 0, {});
2665
+ }
2666
+ } else {
2667
+ program.parse(process.argv);
2607
2668
  }
@@ -25,7 +25,7 @@ var require_package = __commonJS({
25
25
  "package.json"(exports, module) {
26
26
  module.exports = {
27
27
  name: "codmir",
28
- version: "0.4.0",
28
+ version: "0.4.1",
29
29
  description: "Official codmir SDK - AI that prevents wasted engineering time. CLI, SDK, voice assistant, codebase analysis, and intelligent automation.",
30
30
  main: "dist/index.js",
31
31
  module: "dist/index.mjs",
@@ -597,24 +597,61 @@ import clipboardy from "clipboardy";
597
597
  import fs3 from "fs";
598
598
  import path3 from "path";
599
599
  import FormData from "form-data";
600
+ import readline2 from "readline";
601
+ function renderLogo() {
602
+ const c1 = chalk7.hex("#00D4FF");
603
+ const c2 = chalk7.hex("#0099FF");
604
+ const c3 = chalk7.hex("#7C3AED");
605
+ const c4 = chalk7.hex("#EC4899");
606
+ const c5 = chalk7.hex("#F472B6");
607
+ const logo = `
608
+ ${c1(" \u2588\u2588\u2588\u2588\u2588\u2588\u2557")}${c2(" \u2588\u2588\u2588\u2588\u2588\u2588\u2557 ")}${c2("\u2588\u2588\u2588\u2588\u2588\u2588\u2557 ")}${c3("\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2557")}${c4("\u2588\u2588\u2557")}${c5("\u2588\u2588\u2588\u2588\u2588\u2588\u2557 ")}
609
+ ${c1(" \u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D")}${c2("\u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557")}${c2("\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557")}${c3("\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2551")}${c4("\u2588\u2588\u2551")}${c5("\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557")}
610
+ ${c1(" \u2588\u2588\u2551 ")}${c2("\u2588\u2588\u2551 \u2588\u2588\u2551")}${c2("\u2588\u2588\u2551 \u2588\u2588\u2551")}${c3("\u2588\u2588\u2554\u2588\u2588\u2588\u2588\u2554\u2588\u2588\u2551")}${c4("\u2588\u2588\u2551")}${c5("\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D")}
611
+ ${c1(" \u2588\u2588\u2551 ")}${c2("\u2588\u2588\u2551 \u2588\u2588\u2551")}${c2("\u2588\u2588\u2551 \u2588\u2588\u2551")}${c3("\u2588\u2588\u2551\u255A\u2588\u2588\u2554\u255D\u2588\u2588\u2551")}${c4("\u2588\u2588\u2551")}${c5("\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557")}
612
+ ${c1(" \u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2557")}${c2("\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D")}${c2("\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D")}${c3("\u2588\u2588\u2551 \u255A\u2550\u255D \u2588\u2588\u2551")}${c4("\u2588\u2588\u2551")}${c5("\u2588\u2588\u2551 \u2588\u2588\u2551")}
613
+ ${c1(" \u255A\u2550\u2550\u2550\u2550\u2550\u255D")}${c2(" \u255A\u2550\u2550\u2550\u2550\u2550\u255D ")}${c2("\u255A\u2550\u2550\u2550\u2550\u2550\u255D ")}${c3("\u255A\u2550\u255D \u255A\u2550\u255D")}${c4("\u255A\u2550\u255D")}${c5("\u255A\u2550\u255D \u255A\u2550\u255D")}
614
+ `;
615
+ console.log(logo);
616
+ }
617
+ function renderTips() {
618
+ console.log(chalk7.white("Tips for getting started:"));
619
+ console.log(chalk7.dim("1. Ask questions, edit files, or run commands."));
620
+ console.log(chalk7.dim("2. Be specific for the best results."));
621
+ console.log(chalk7.dim("3. Create ") + chalk7.cyan("CODMIR.md") + chalk7.dim(" files to customize your interactions with codmir."));
622
+ console.log(chalk7.dim("4. ") + chalk7.cyan("/help") + chalk7.dim(" for more information."));
623
+ console.log();
624
+ }
625
+ function renderStatusBar(context, model) {
626
+ const termWidth = process.stdout.columns || 80;
627
+ const projectInfo = context.isLinkedProject ? chalk7.cyan(`~/${context.projectConfig?.projectName || "project"}`) : chalk7.yellow("~/global");
628
+ const sandboxStatus = chalk7.dim("no sandbox") + chalk7.dim(" (see /docs)");
629
+ const modelInfo = chalk7.green(`${model}`) + chalk7.dim(" (100% context left)");
630
+ console.log();
631
+ console.log(chalk7.dim("\u2500".repeat(termWidth)));
632
+ console.log(`${projectInfo} ${sandboxStatus} ${modelInfo}`);
633
+ }
634
+ function renderEditHint() {
635
+ const termWidth = process.stdout.columns || 80;
636
+ const hint = chalk7.dim("accepting edits") + chalk7.dim(" (shift + tab to toggle)");
637
+ const padding = " ".repeat(Math.max(0, termWidth - 35));
638
+ console.log(padding + hint);
639
+ }
600
640
  async function assistantCommand(query, options = {}) {
601
641
  const token = getToken();
642
+ const context = getExecutionContext();
643
+ const model = options.model || "gpt-4-turbo";
644
+ console.clear();
645
+ renderLogo();
602
646
  if (!token) {
603
- console.error(chalk7.red("\u274C Not authenticated"));
604
- console.log(chalk7.dim(" Run"), chalk7.cyan("codmir login"), chalk7.dim("first"));
647
+ console.log(chalk7.red("\n\u274C Not authenticated"));
648
+ console.log(chalk7.dim(" Run ") + chalk7.cyan("codmir login") + chalk7.dim(" to get started.\n"));
605
649
  process.exit(1);
606
650
  }
651
+ renderTips();
652
+ renderEditHint();
607
653
  const baseUrl = getBaseUrl();
608
654
  const conversationHistory = [];
609
- const context = getExecutionContext();
610
- if (context.isLinkedProject) {
611
- console.log(chalk7.dim(` \u{1F4C1} Project: ${context.projectConfig?.projectName || context.projectConfig?.projectId}`));
612
- console.log(chalk7.dim(` \u{1F517} Mode: ${chalk7.cyan("local")} (linked project)
613
- `));
614
- } else {
615
- console.log(chalk7.dim(` \u{1F310} Mode: ${chalk7.yellow("global")}
616
- `));
617
- }
618
655
  conversationHistory.push({
619
656
  role: "system",
620
657
  content: `You are codmir, an AI assistant for developers. You help with:
@@ -625,28 +662,47 @@ async function assistantCommand(query, options = {}) {
625
662
 
626
663
  Be concise, practical, and code-focused. Use lowercase "codmir" for the brand.`
627
664
  });
628
- console.log(chalk7.bold("\n\u{1F916} codmir"));
629
- console.log(chalk7.dim(" AI assistant for developers\n"));
630
665
  if (query) {
631
666
  await handleQuery(query, conversationHistory, baseUrl, token, options);
667
+ renderStatusBar(context, model);
632
668
  return;
633
669
  }
634
- console.log(chalk7.dim(" Type your question or"), chalk7.cyan("exit"), chalk7.dim("to quit"));
635
- console.log(chalk7.dim(" \u{1F4CB} Tip: Copy images to clipboard before asking for automatic upload"));
636
- console.log(chalk7.dim(' Example: "How do I setup authentication?"\n'));
637
- while (true) {
638
- const { userInput } = await prompts2({
639
- type: "text",
640
- name: "userInput",
641
- message: chalk7.cyan("codmir"),
642
- validate: (value) => value.length > 0 || "Please enter a question"
670
+ const rl = readline2.createInterface({
671
+ input: process.stdin,
672
+ output: process.stdout
673
+ });
674
+ const promptUser = () => {
675
+ rl.question(chalk7.cyan("> ") + chalk7.dim("Type your message or @path/to/file "), async (userInput) => {
676
+ if (!userInput || userInput.toLowerCase() === "exit" || userInput.toLowerCase() === "quit" || userInput === "/exit") {
677
+ console.log(chalk7.dim("\nGoodbye! \u{1F44B}\n"));
678
+ rl.close();
679
+ return;
680
+ }
681
+ if (userInput === "/help") {
682
+ console.log("\n" + chalk7.bold("Available commands:"));
683
+ console.log(chalk7.cyan(" /help") + chalk7.dim(" - Show this help message"));
684
+ console.log(chalk7.cyan(" /clear") + chalk7.dim(" - Clear conversation history"));
685
+ console.log(chalk7.cyan(" /exit") + chalk7.dim(" - Exit codmir"));
686
+ console.log(chalk7.cyan(" @file") + chalk7.dim(" - Reference a file in your message"));
687
+ console.log();
688
+ promptUser();
689
+ return;
690
+ }
691
+ if (userInput === "/clear") {
692
+ conversationHistory.length = 1;
693
+ console.log(chalk7.dim("\n\u2713 Conversation cleared\n"));
694
+ promptUser();
695
+ return;
696
+ }
697
+ await handleQuery(userInput, conversationHistory, baseUrl, token, options);
698
+ console.log();
699
+ promptUser();
643
700
  });
644
- if (!userInput || userInput.toLowerCase() === "exit" || userInput.toLowerCase() === "quit") {
645
- console.log(chalk7.dim("\n Goodbye! \u{1F44B}\n"));
646
- break;
647
- }
648
- await handleQuery(userInput, conversationHistory, baseUrl, token, options);
649
- }
701
+ };
702
+ promptUser();
703
+ rl.on("close", () => {
704
+ renderStatusBar(context, model);
705
+ });
650
706
  }
651
707
  async function handleQuery(query, conversationHistory, baseUrl, token, options) {
652
708
  let imagePaths;
@@ -1466,7 +1522,12 @@ program.command("council [task...]").description("\u{1F3AD} Assemble a council o
1466
1522
  const taskString = task ? task.join(" ") : void 0;
1467
1523
  councilCommand(taskString, options);
1468
1524
  });
1469
- program.parse(process.argv);
1470
- if (!process.argv.slice(2).length) {
1471
- program.outputHelp();
1525
+ if (!process.argv.slice(2).length || process.argv[2] === "--help" || process.argv[2] === "-h") {
1526
+ if (process.argv[2] === "--help" || process.argv[2] === "-h") {
1527
+ program.parse(process.argv);
1528
+ } else {
1529
+ assistantCommand(void 0, {});
1530
+ }
1531
+ } else {
1532
+ program.parse(process.argv);
1472
1533
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "codmir",
3
- "version": "0.4.0",
3
+ "version": "0.4.1",
4
4
  "description": "Official codmir SDK - AI that prevents wasted engineering time. CLI, SDK, voice assistant, codebase analysis, and intelligent automation.",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",
@@ -31,18 +31,6 @@
31
31
  "LICENSE",
32
32
  "runkit-example.js"
33
33
  ],
34
- "scripts": {
35
- "build": "tsup src/index.ts src/cli/index.ts src/voice-agent/index.ts src/voice-daemon/index.ts --format cjs,esm --dts --clean",
36
- "dev": "tsup src/index.ts src/cli/index.ts --format cjs,esm --dts --watch",
37
- "prepublishOnly": "pnpm build",
38
- "test": "jest",
39
- "test:login": "node scripts/test/login.mjs",
40
- "test:link": "node scripts/test/link.mjs",
41
- "test:projects": "node scripts/test/projects.mjs",
42
- "test:whoami": "node scripts/test/whoami.mjs",
43
- "test:logout": "node scripts/test/logout.mjs",
44
- "test:all": "npm run test:logout && npm run test:login && npm run test:whoami && npm run test:projects"
45
- },
46
34
  "keywords": [
47
35
  "codmir",
48
36
  "sdk",
@@ -109,5 +97,16 @@
109
97
  },
110
98
  "engines": {
111
99
  "node": ">=18.0.0"
100
+ },
101
+ "scripts": {
102
+ "build": "tsup src/index.ts src/cli/index.ts src/voice-agent/index.ts src/voice-daemon/index.ts --format cjs,esm --dts --clean",
103
+ "dev": "tsup src/index.ts src/cli/index.ts --format cjs,esm --dts --watch",
104
+ "test": "jest",
105
+ "test:login": "node scripts/test/login.mjs",
106
+ "test:link": "node scripts/test/link.mjs",
107
+ "test:projects": "node scripts/test/projects.mjs",
108
+ "test:whoami": "node scripts/test/whoami.mjs",
109
+ "test:logout": "node scripts/test/logout.mjs",
110
+ "test:all": "npm run test:logout && npm run test:login && npm run test:whoami && npm run test:projects"
112
111
  }
113
- }
112
+ }