@linzumi/cli 0.0.49-beta → 0.0.50-beta

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 (3) hide show
  1. package/README.md +1 -1
  2. package/dist/index.js +146 -62
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -62,7 +62,7 @@ Install the CLI or run it with `npx`:
62
62
  ```bash
63
63
  npm install -g @linzumi/cli@latest
64
64
  npx -y @linzumi/cli@latest signup
65
- npx -y @linzumi/cli@0.0.49-beta --version
65
+ npx -y @linzumi/cli@0.0.50-beta --version
66
66
  linzumi --version
67
67
  ```
68
68
 
package/dist/index.js CHANGED
@@ -18,7 +18,7 @@ var __toESM = (mod, isNodeMode, target) => {
18
18
  var __commonJS = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports);
19
19
  var __require = /* @__PURE__ */ createRequire(import.meta.url);
20
20
 
21
- // ../../node_modules/yoctocolors-cjs/index.js
21
+ // ../../node_modules/.bun/yoctocolors-cjs@2.1.3/node_modules/yoctocolors-cjs/index.js
22
22
  var require_yoctocolors_cjs = __commonJS((exports, module) => {
23
23
  var tty = __require("node:tty");
24
24
  var hasColors = tty?.WriteStream?.prototype?.hasColors?.() ?? false;
@@ -92,7 +92,7 @@ var require_yoctocolors_cjs = __commonJS((exports, module) => {
92
92
  module.exports = colors;
93
93
  });
94
94
 
95
- // ../../node_modules/cli-width/index.js
95
+ // ../../node_modules/.bun/cli-width@4.1.0/node_modules/cli-width/index.js
96
96
  var require_cli_width = __commonJS((exports, module) => {
97
97
  module.exports = cliWidth;
98
98
  function normalizeOpts(options) {
@@ -132,7 +132,7 @@ var require_cli_width = __commonJS((exports, module) => {
132
132
  }
133
133
  });
134
134
 
135
- // ../../node_modules/ansi-regex/index.js
135
+ // ../../node_modules/.bun/ansi-regex@5.0.1/node_modules/ansi-regex/index.js
136
136
  var require_ansi_regex = __commonJS((exports, module) => {
137
137
  module.exports = ({ onlyFirst = false } = {}) => {
138
138
  const pattern = [
@@ -143,13 +143,13 @@ var require_ansi_regex = __commonJS((exports, module) => {
143
143
  };
144
144
  });
145
145
 
146
- // ../../node_modules/strip-ansi/index.js
146
+ // ../../node_modules/.bun/strip-ansi@6.0.1/node_modules/strip-ansi/index.js
147
147
  var require_strip_ansi = __commonJS((exports, module) => {
148
148
  var ansiRegex = require_ansi_regex();
149
149
  module.exports = (string) => typeof string === "string" ? string.replace(ansiRegex(), "") : string;
150
150
  });
151
151
 
152
- // ../../node_modules/string-width/node_modules/is-fullwidth-code-point/index.js
152
+ // ../../node_modules/.bun/is-fullwidth-code-point@3.0.0/node_modules/is-fullwidth-code-point/index.js
153
153
  var require_is_fullwidth_code_point = __commonJS((exports, module) => {
154
154
  var isFullwidthCodePoint = (codePoint) => {
155
155
  if (Number.isNaN(codePoint)) {
@@ -164,14 +164,14 @@ var require_is_fullwidth_code_point = __commonJS((exports, module) => {
164
164
  module.exports.default = isFullwidthCodePoint;
165
165
  });
166
166
 
167
- // ../../node_modules/string-width/node_modules/emoji-regex/index.js
167
+ // ../../node_modules/.bun/emoji-regex@8.0.0/node_modules/emoji-regex/index.js
168
168
  var require_emoji_regex = __commonJS((exports, module) => {
169
169
  module.exports = function() {
170
170
  return /\uD83C\uDFF4\uDB40\uDC67\uDB40\uDC62(?:\uDB40\uDC65\uDB40\uDC6E\uDB40\uDC67|\uDB40\uDC73\uDB40\uDC63\uDB40\uDC74|\uDB40\uDC77\uDB40\uDC6C\uDB40\uDC73)\uDB40\uDC7F|\uD83D\uDC68(?:\uD83C\uDFFC\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68\uD83C\uDFFB|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFE])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFD])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFC])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83D\uDC68|(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D[\uDC66\uDC67])|[\u2695\u2696\u2708]\uFE0F|\uD83D[\uDC66\uDC67]|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|(?:\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708])\uFE0F|\uD83C\uDFFB\u200D(?:\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C[\uDFFB-\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFB\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFC\u200D\uD83E\uDD1D\u200D\uD83D\uDC69)\uD83C\uDFFB|\uD83E\uDDD1(?:\uD83C\uDFFF\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1(?:\uD83C[\uDFFB-\uDFFF])|\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1)|(?:\uD83E\uDDD1\uD83C\uDFFE\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFF\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB-\uDFFE])|(?:\uD83E\uDDD1\uD83C\uDFFC\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFD\u200D\uD83E\uDD1D\u200D\uD83D\uDC69)(?:\uD83C[\uDFFB\uDFFC])|\uD83D\uDC69(?:\uD83C\uDFFE\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFD\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFD-\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFB\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFC-\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|(?:\uD83E\uDDD1\uD83C\uDFFD\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFE\u200D\uD83E\uDD1D\u200D\uD83D\uDC69)(?:\uD83C[\uDFFB-\uDFFD])|\uD83D\uDC69\u200D\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D[\uDC66\uDC67])|(?:\uD83D\uDC41\uFE0F\u200D\uD83D\uDDE8|\uD83D\uDC69(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|(?:(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)\uFE0F|\uD83D\uDC6F|\uD83E[\uDD3C\uDDDE\uDDDF])\u200D[\u2640\u2642]|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD6-\uDDDD])(?:(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|\u200D[\u2640\u2642])|\uD83C\uDFF4\u200D\u2620)\uFE0F|\uD83D\uDC69\u200D\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|\uD83C\uDFF3\uFE0F\u200D\uD83C\uDF08|\uD83D\uDC15\u200D\uD83E\uDDBA|\uD83D\uDC69\u200D\uD83D\uDC66|\uD83D\uDC69\u200D\uD83D\uDC67|\uD83C\uDDFD\uD83C\uDDF0|\uD83C\uDDF4\uD83C\uDDF2|\uD83C\uDDF6\uD83C\uDDE6|[#\*0-9]\uFE0F\u20E3|\uD83C\uDDE7(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF])|\uD83C\uDDF9(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF])|\uD83C\uDDEA(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA])|\uD83E\uDDD1(?:\uD83C[\uDFFB-\uDFFF])|\uD83C\uDDF7(?:\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC])|\uD83D\uDC69(?:\uD83C[\uDFFB-\uDFFF])|\uD83C\uDDF2(?:\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF])|\uD83C\uDDE6(?:\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF])|\uD83C\uDDF0(?:\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF])|\uD83C\uDDED(?:\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA])|\uD83C\uDDE9(?:\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF])|\uD83C\uDDFE(?:\uD83C[\uDDEA\uDDF9])|\uD83C\uDDEC(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE])|\uD83C\uDDF8(?:\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF])|\uD83C\uDDEB(?:\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7])|\uD83C\uDDF5(?:\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE])|\uD83C\uDDFB(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA])|\uD83C\uDDF3(?:\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF])|\uD83C\uDDE8(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF])|\uD83C\uDDF1(?:\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE])|\uD83C\uDDFF(?:\uD83C[\uDDE6\uDDF2\uDDFC])|\uD83C\uDDFC(?:\uD83C[\uDDEB\uDDF8])|\uD83C\uDDFA(?:\uD83C[\uDDE6\uDDEC\uDDF2\uDDF3\uDDF8\uDDFE\uDDFF])|\uD83C\uDDEE(?:\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9])|\uD83C\uDDEF(?:\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5])|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u261D\u270A-\u270D]|\uD83C[\uDF85\uDFC2\uDFC7]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC70\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDCAA\uDD74\uDD7A\uDD90\uDD95\uDD96\uDE4C\uDE4F\uDEC0\uDECC]|\uD83E[\uDD0F\uDD18-\uDD1C\uDD1E\uDD1F\uDD30-\uDD36\uDDB5\uDDB6\uDDBB\uDDD2-\uDDD5])(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u270A\u270B\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55]|\uD83C[\uDC04\uDCCF\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF7C\uDF7E-\uDF93\uDFA0-\uDFCA\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF4\uDFF8-\uDFFF]|\uD83D[\uDC00-\uDC3E\uDC40\uDC42-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDD7A\uDD95\uDD96\uDDA4\uDDFB-\uDE4F\uDE80-\uDEC5\uDECC\uDED0-\uDED2\uDED5\uDEEB\uDEEC\uDEF4-\uDEFA\uDFE0-\uDFEB]|\uD83E[\uDD0D-\uDD3A\uDD3C-\uDD45\uDD47-\uDD71\uDD73-\uDD76\uDD7A-\uDDA2\uDDA5-\uDDAA\uDDAE-\uDDCA\uDDCD-\uDDFF\uDE70-\uDE73\uDE78-\uDE7A\uDE80-\uDE82\uDE90-\uDE95])|(?:[#\*0-9\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692-\u2697\u2699\u269B\u269C\u26A0\u26A1\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299]|\uD83C[\uDC04\uDCCF\uDD70\uDD71\uDD7E\uDD7F\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE02\uDE1A\uDE2F\uDE32-\uDE3A\uDE50\uDE51\uDF00-\uDF21\uDF24-\uDF93\uDF96\uDF97\uDF99-\uDF9B\uDF9E-\uDFF0\uDFF3-\uDFF5\uDFF7-\uDFFF]|\uD83D[\uDC00-\uDCFD\uDCFF-\uDD3D\uDD49-\uDD4E\uDD50-\uDD67\uDD6F\uDD70\uDD73-\uDD7A\uDD87\uDD8A-\uDD8D\uDD90\uDD95\uDD96\uDDA4\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA-\uDE4F\uDE80-\uDEC5\uDECB-\uDED2\uDED5\uDEE0-\uDEE5\uDEE9\uDEEB\uDEEC\uDEF0\uDEF3-\uDEFA\uDFE0-\uDFEB]|\uD83E[\uDD0D-\uDD3A\uDD3C-\uDD45\uDD47-\uDD71\uDD73-\uDD76\uDD7A-\uDDA2\uDDA5-\uDDAA\uDDAE-\uDDCA\uDDCD-\uDDFF\uDE70-\uDE73\uDE78-\uDE7A\uDE80-\uDE82\uDE90-\uDE95])\uFE0F|(?:[\u261D\u26F9\u270A-\u270D]|\uD83C[\uDF85\uDFC2-\uDFC4\uDFC7\uDFCA-\uDFCC]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66-\uDC78\uDC7C\uDC81-\uDC83\uDC85-\uDC87\uDC8F\uDC91\uDCAA\uDD74\uDD75\uDD7A\uDD90\uDD95\uDD96\uDE45-\uDE47\uDE4B-\uDE4F\uDEA3\uDEB4-\uDEB6\uDEC0\uDECC]|\uD83E[\uDD0F\uDD18-\uDD1F\uDD26\uDD30-\uDD39\uDD3C-\uDD3E\uDDB5\uDDB6\uDDB8\uDDB9\uDDBB\uDDCD-\uDDCF\uDDD1-\uDDDD])/g;
171
171
  };
172
172
  });
173
173
 
174
- // ../../node_modules/string-width/index.js
174
+ // ../../node_modules/.bun/string-width@4.2.3/node_modules/string-width/index.js
175
175
  var require_string_width = __commonJS((exports, module) => {
176
176
  var stripAnsi = require_strip_ansi();
177
177
  var isFullwidthCodePoint = require_is_fullwidth_code_point();
@@ -205,7 +205,7 @@ var require_string_width = __commonJS((exports, module) => {
205
205
  module.exports.default = stringWidth;
206
206
  });
207
207
 
208
- // ../../node_modules/color-name/index.js
208
+ // ../../node_modules/.bun/color-name@1.1.4/node_modules/color-name/index.js
209
209
  var require_color_name = __commonJS((exports, module) => {
210
210
  module.exports = {
211
211
  aliceblue: [240, 248, 255],
@@ -359,7 +359,7 @@ var require_color_name = __commonJS((exports, module) => {
359
359
  };
360
360
  });
361
361
 
362
- // ../../node_modules/color-convert/conversions.js
362
+ // ../../node_modules/.bun/color-convert@2.0.1/node_modules/color-convert/conversions.js
363
363
  var require_conversions = __commonJS((exports, module) => {
364
364
  var cssKeywords = require_color_name();
365
365
  var reverseKeywords = {};
@@ -1028,7 +1028,7 @@ var require_conversions = __commonJS((exports, module) => {
1028
1028
  };
1029
1029
  });
1030
1030
 
1031
- // ../../node_modules/color-convert/route.js
1031
+ // ../../node_modules/.bun/color-convert@2.0.1/node_modules/color-convert/route.js
1032
1032
  var require_route = __commonJS((exports, module) => {
1033
1033
  var conversions = require_conversions();
1034
1034
  function buildGraph() {
@@ -1094,7 +1094,7 @@ var require_route = __commonJS((exports, module) => {
1094
1094
  };
1095
1095
  });
1096
1096
 
1097
- // ../../node_modules/color-convert/index.js
1097
+ // ../../node_modules/.bun/color-convert@2.0.1/node_modules/color-convert/index.js
1098
1098
  var require_color_convert = __commonJS((exports, module) => {
1099
1099
  var conversions = require_conversions();
1100
1100
  var route = require_route();
@@ -1153,7 +1153,7 @@ var require_color_convert = __commonJS((exports, module) => {
1153
1153
  module.exports = convert;
1154
1154
  });
1155
1155
 
1156
- // ../../node_modules/ansi-styles/index.js
1156
+ // ../../node_modules/.bun/ansi-styles@4.3.0/node_modules/ansi-styles/index.js
1157
1157
  var require_ansi_styles = __commonJS((exports, module) => {
1158
1158
  var wrapAnsi16 = (fn, offset) => (...args) => {
1159
1159
  const code = fn(...args);
@@ -1289,7 +1289,7 @@ var require_ansi_styles = __commonJS((exports, module) => {
1289
1289
  });
1290
1290
  });
1291
1291
 
1292
- // ../../node_modules/@inquirer/core/node_modules/wrap-ansi/index.js
1292
+ // ../../node_modules/.bun/wrap-ansi@6.2.0/node_modules/wrap-ansi/index.js
1293
1293
  var require_wrap_ansi = __commonJS((exports, module) => {
1294
1294
  var stringWidth = require_string_width();
1295
1295
  var stripAnsi = require_strip_ansi();
@@ -1425,7 +1425,7 @@ var require_wrap_ansi = __commonJS((exports, module) => {
1425
1425
  };
1426
1426
  });
1427
1427
 
1428
- // ../../node_modules/mute-stream/lib/index.js
1428
+ // ../../node_modules/.bun/mute-stream@2.0.0/node_modules/mute-stream/lib/index.js
1429
1429
  var require_lib = __commonJS((exports, module) => {
1430
1430
  var Stream = __require("stream");
1431
1431
 
@@ -10152,7 +10152,7 @@ function realpathOrResolved(pathValue) {
10152
10152
  }
10153
10153
 
10154
10154
  // src/version.ts
10155
- var linzumiCliVersion = "0.0.49-beta";
10155
+ var linzumiCliVersion = "0.0.50-beta";
10156
10156
  var linzumiCliVersionText = `linzumi ${linzumiCliVersion}`;
10157
10157
 
10158
10158
  // src/runnerLock.ts
@@ -13378,7 +13378,7 @@ To kick the agent off:
13378
13378
  3. Paste into the thread. Codex will pick it up and start editing this folder.
13379
13379
  `;
13380
13380
 
13381
- // ../../node_modules/@inquirer/core/dist/esm/lib/key.js
13381
+ // ../../node_modules/.bun/@inquirer+core@10.3.2/node_modules/@inquirer/core/dist/esm/lib/key.js
13382
13382
  var isUpKey = (key, keybindings = []) => key.name === "up" || keybindings.includes("vim") && key.name === "k" || keybindings.includes("emacs") && key.ctrl && key.name === "p";
13383
13383
  var isDownKey = (key, keybindings = []) => key.name === "down" || keybindings.includes("vim") && key.name === "j" || keybindings.includes("emacs") && key.ctrl && key.name === "n";
13384
13384
  var isSpaceKey = (key) => key.name === "space";
@@ -13386,7 +13386,7 @@ var isBackspaceKey = (key) => key.name === "backspace";
13386
13386
  var isTabKey = (key) => key.name === "tab";
13387
13387
  var isNumberKey = (key) => "1234567890".includes(key.name);
13388
13388
  var isEnterKey = (key) => key.name === "enter" || key.name === "return";
13389
- // ../../node_modules/@inquirer/core/dist/esm/lib/errors.js
13389
+ // ../../node_modules/.bun/@inquirer+core@10.3.2/node_modules/@inquirer/core/dist/esm/lib/errors.js
13390
13390
  class AbortPromptError extends Error {
13391
13391
  name = "AbortPromptError";
13392
13392
  message = "Prompt was aborted";
@@ -13412,10 +13412,10 @@ class HookError extends Error {
13412
13412
  class ValidationError extends Error {
13413
13413
  name = "ValidationError";
13414
13414
  }
13415
- // ../../node_modules/@inquirer/core/dist/esm/lib/use-state.js
13415
+ // ../../node_modules/.bun/@inquirer+core@10.3.2/node_modules/@inquirer/core/dist/esm/lib/use-state.js
13416
13416
  import { AsyncResource as AsyncResource2 } from "node:async_hooks";
13417
13417
 
13418
- // ../../node_modules/@inquirer/core/dist/esm/lib/hook-engine.js
13418
+ // ../../node_modules/.bun/@inquirer+core@10.3.2/node_modules/@inquirer/core/dist/esm/lib/hook-engine.js
13419
13419
  import { AsyncLocalStorage, AsyncResource } from "node:async_hooks";
13420
13420
  var hookStorage = new AsyncLocalStorage;
13421
13421
  function createStore(rl) {
@@ -13520,7 +13520,7 @@ var effectScheduler = {
13520
13520
  }
13521
13521
  };
13522
13522
 
13523
- // ../../node_modules/@inquirer/core/dist/esm/lib/use-state.js
13523
+ // ../../node_modules/.bun/@inquirer+core@10.3.2/node_modules/@inquirer/core/dist/esm/lib/use-state.js
13524
13524
  function useState(defaultValue) {
13525
13525
  return withPointer((pointer) => {
13526
13526
  const setState = AsyncResource2.bind(function setState2(newValue) {
@@ -13538,7 +13538,7 @@ function useState(defaultValue) {
13538
13538
  });
13539
13539
  }
13540
13540
 
13541
- // ../../node_modules/@inquirer/core/dist/esm/lib/use-effect.js
13541
+ // ../../node_modules/.bun/@inquirer+core@10.3.2/node_modules/@inquirer/core/dist/esm/lib/use-effect.js
13542
13542
  function useEffect(cb, depArray) {
13543
13543
  withPointer((pointer) => {
13544
13544
  const oldDeps = pointer.get();
@@ -13550,10 +13550,10 @@ function useEffect(cb, depArray) {
13550
13550
  });
13551
13551
  }
13552
13552
 
13553
- // ../../node_modules/@inquirer/core/dist/esm/lib/theme.js
13553
+ // ../../node_modules/.bun/@inquirer+core@10.3.2/node_modules/@inquirer/core/dist/esm/lib/theme.js
13554
13554
  var import_yoctocolors_cjs = __toESM(require_yoctocolors_cjs(), 1);
13555
13555
 
13556
- // ../../node_modules/@inquirer/figures/dist/esm/index.js
13556
+ // ../../node_modules/.bun/@inquirer+figures@1.0.15/node_modules/@inquirer/figures/dist/esm/index.js
13557
13557
  import process2 from "node:process";
13558
13558
  function isUnicodeSupported() {
13559
13559
  if (process2.platform !== "win32") {
@@ -13842,7 +13842,7 @@ var figures = shouldUseMain ? mainSymbols : fallbackSymbols;
13842
13842
  var esm_default = figures;
13843
13843
  var replacements = Object.entries(specialMainSymbols);
13844
13844
 
13845
- // ../../node_modules/@inquirer/core/dist/esm/lib/theme.js
13845
+ // ../../node_modules/.bun/@inquirer+core@10.3.2/node_modules/@inquirer/core/dist/esm/lib/theme.js
13846
13846
  var defaultTheme = {
13847
13847
  prefix: {
13848
13848
  idle: import_yoctocolors_cjs.default.blue("?"),
@@ -13863,7 +13863,7 @@ var defaultTheme = {
13863
13863
  }
13864
13864
  };
13865
13865
 
13866
- // ../../node_modules/@inquirer/core/dist/esm/lib/make-theme.js
13866
+ // ../../node_modules/.bun/@inquirer+core@10.3.2/node_modules/@inquirer/core/dist/esm/lib/make-theme.js
13867
13867
  function isPlainObject(value) {
13868
13868
  if (typeof value !== "object" || value === null)
13869
13869
  return false;
@@ -13891,7 +13891,7 @@ function makeTheme(...themes) {
13891
13891
  return deepMerge(...themesToMerge);
13892
13892
  }
13893
13893
 
13894
- // ../../node_modules/@inquirer/core/dist/esm/lib/use-prefix.js
13894
+ // ../../node_modules/.bun/@inquirer+core@10.3.2/node_modules/@inquirer/core/dist/esm/lib/use-prefix.js
13895
13895
  function usePrefix({ status = "idle", theme }) {
13896
13896
  const [showLoader, setShowLoader] = useState(false);
13897
13897
  const [tick, setTick] = useState(0);
@@ -13921,7 +13921,7 @@ function usePrefix({ status = "idle", theme }) {
13921
13921
  const iconName = status === "loading" ? "idle" : status;
13922
13922
  return typeof prefix === "string" ? prefix : prefix[iconName] ?? prefix["idle"];
13923
13923
  }
13924
- // ../../node_modules/@inquirer/core/dist/esm/lib/use-memo.js
13924
+ // ../../node_modules/.bun/@inquirer+core@10.3.2/node_modules/@inquirer/core/dist/esm/lib/use-memo.js
13925
13925
  function useMemo(fn, dependencies) {
13926
13926
  return withPointer((pointer) => {
13927
13927
  const prev = pointer.get();
@@ -13933,11 +13933,11 @@ function useMemo(fn, dependencies) {
13933
13933
  return prev.value;
13934
13934
  });
13935
13935
  }
13936
- // ../../node_modules/@inquirer/core/dist/esm/lib/use-ref.js
13936
+ // ../../node_modules/.bun/@inquirer+core@10.3.2/node_modules/@inquirer/core/dist/esm/lib/use-ref.js
13937
13937
  function useRef(val) {
13938
13938
  return useState({ current: val })[0];
13939
13939
  }
13940
- // ../../node_modules/@inquirer/core/dist/esm/lib/use-keypress.js
13940
+ // ../../node_modules/.bun/@inquirer+core@10.3.2/node_modules/@inquirer/core/dist/esm/lib/use-keypress.js
13941
13941
  function useKeypress(userHandler) {
13942
13942
  const signal = useRef(userHandler);
13943
13943
  signal.current = userHandler;
@@ -13955,7 +13955,7 @@ function useKeypress(userHandler) {
13955
13955
  };
13956
13956
  }, []);
13957
13957
  }
13958
- // ../../node_modules/@inquirer/core/dist/esm/lib/utils.js
13958
+ // ../../node_modules/.bun/@inquirer+core@10.3.2/node_modules/@inquirer/core/dist/esm/lib/utils.js
13959
13959
  var import_cli_width = __toESM(require_cli_width(), 1);
13960
13960
  var import_wrap_ansi = __toESM(require_wrap_ansi(), 1);
13961
13961
  function breakLines(content, width) {
@@ -13968,7 +13968,7 @@ function readlineWidth() {
13968
13968
  return import_cli_width.default({ defaultWidth: 80, output: readline().output });
13969
13969
  }
13970
13970
 
13971
- // ../../node_modules/@inquirer/core/dist/esm/lib/pagination/use-pagination.js
13971
+ // ../../node_modules/.bun/@inquirer+core@10.3.2/node_modules/@inquirer/core/dist/esm/lib/pagination/use-pagination.js
13972
13972
  function usePointerPosition({ active, renderedItems, pageSize, loop }) {
13973
13973
  const state = useRef({
13974
13974
  lastPointer: active,
@@ -14034,12 +14034,12 @@ function usePagination({ items, active, renderItem, pageSize, loop = true }) {
14034
14034
  return pageBuffer.filter((line) => typeof line === "string").join(`
14035
14035
  `);
14036
14036
  }
14037
- // ../../node_modules/@inquirer/core/dist/esm/lib/create-prompt.js
14037
+ // ../../node_modules/.bun/@inquirer+core@10.3.2/node_modules/@inquirer/core/dist/esm/lib/create-prompt.js
14038
14038
  var import_mute_stream = __toESM(require_lib(), 1);
14039
14039
  import * as readline2 from "node:readline";
14040
14040
  import { AsyncResource as AsyncResource3 } from "node:async_hooks";
14041
14041
 
14042
- // ../../node_modules/@inquirer/core/node_modules/signal-exit/dist/mjs/signals.js
14042
+ // ../../node_modules/.bun/signal-exit@4.1.0/node_modules/signal-exit/dist/mjs/signals.js
14043
14043
  var signals = [];
14044
14044
  signals.push("SIGHUP", "SIGINT", "SIGTERM");
14045
14045
  if (process.platform !== "win32") {
@@ -14049,7 +14049,7 @@ if (process.platform === "linux") {
14049
14049
  signals.push("SIGIO", "SIGPOLL", "SIGPWR", "SIGSTKFLT");
14050
14050
  }
14051
14051
 
14052
- // ../../node_modules/@inquirer/core/node_modules/signal-exit/dist/mjs/index.js
14052
+ // ../../node_modules/.bun/signal-exit@4.1.0/node_modules/signal-exit/dist/mjs/index.js
14053
14053
  var processOk = (process3) => !!process3 && typeof process3 === "object" && typeof process3.removeListener === "function" && typeof process3.emit === "function" && typeof process3.reallyExit === "function" && typeof process3.listeners === "function" && typeof process3.kill === "function" && typeof process3.pid === "number" && typeof process3.on === "function";
14054
14054
  var kExitEmitter = Symbol.for("signal-exit emitter");
14055
14055
  var global = globalThis;
@@ -14247,10 +14247,10 @@ var {
14247
14247
  unload
14248
14248
  } = signalExitWrap(processOk(process3) ? new SignalExit(process3) : new SignalExitFallback);
14249
14249
 
14250
- // ../../node_modules/@inquirer/core/dist/esm/lib/screen-manager.js
14250
+ // ../../node_modules/.bun/@inquirer+core@10.3.2/node_modules/@inquirer/core/dist/esm/lib/screen-manager.js
14251
14251
  import { stripVTControlCharacters } from "node:util";
14252
14252
 
14253
- // ../../node_modules/@inquirer/ansi/dist/esm/index.js
14253
+ // ../../node_modules/.bun/@inquirer+ansi@1.0.2/node_modules/@inquirer/ansi/dist/esm/index.js
14254
14254
  var ESC = "\x1B[";
14255
14255
  var cursorLeft = ESC + "G";
14256
14256
  var cursorHide = ESC + "?25l";
@@ -14266,7 +14266,7 @@ var cursorTo = (x, y) => {
14266
14266
  var eraseLine = ESC + "2K";
14267
14267
  var eraseLines = (lines) => lines > 0 ? (eraseLine + cursorUp(1)).repeat(lines - 1) + eraseLine + cursorLeft : "";
14268
14268
 
14269
- // ../../node_modules/@inquirer/core/dist/esm/lib/screen-manager.js
14269
+ // ../../node_modules/.bun/@inquirer+core@10.3.2/node_modules/@inquirer/core/dist/esm/lib/screen-manager.js
14270
14270
  var height = (content) => content.split(`
14271
14271
  `).length;
14272
14272
  var lastLine = (content) => content.split(`
@@ -14331,7 +14331,7 @@ class ScreenManager {
14331
14331
  }
14332
14332
  }
14333
14333
 
14334
- // ../../node_modules/@inquirer/core/dist/esm/lib/promise-polyfill.js
14334
+ // ../../node_modules/.bun/@inquirer+core@10.3.2/node_modules/@inquirer/core/dist/esm/lib/promise-polyfill.js
14335
14335
  class PromisePolyfill extends Promise {
14336
14336
  static withResolver() {
14337
14337
  let resolve8;
@@ -14344,7 +14344,7 @@ class PromisePolyfill extends Promise {
14344
14344
  }
14345
14345
  }
14346
14346
 
14347
- // ../../node_modules/@inquirer/core/dist/esm/lib/create-prompt.js
14347
+ // ../../node_modules/.bun/@inquirer+core@10.3.2/node_modules/@inquirer/core/dist/esm/lib/create-prompt.js
14348
14348
  function getCallSites() {
14349
14349
  const _prepareStackTrace = Error.prepareStackTrace;
14350
14350
  let result = [];
@@ -14430,7 +14430,7 @@ function createPrompt(view) {
14430
14430
  };
14431
14431
  return prompt;
14432
14432
  }
14433
- // ../../node_modules/@inquirer/core/dist/esm/lib/Separator.js
14433
+ // ../../node_modules/.bun/@inquirer+core@10.3.2/node_modules/@inquirer/core/dist/esm/lib/Separator.js
14434
14434
  var import_yoctocolors_cjs2 = __toESM(require_yoctocolors_cjs(), 1);
14435
14435
  class Separator {
14436
14436
  separator = import_yoctocolors_cjs2.default.dim(Array.from({ length: 15 }).join(esm_default.line));
@@ -14444,7 +14444,7 @@ class Separator {
14444
14444
  return Boolean(choice && typeof choice === "object" && "type" in choice && choice.type === "separator");
14445
14445
  }
14446
14446
  }
14447
- // ../../node_modules/@inquirer/checkbox/dist/esm/index.js
14447
+ // ../../node_modules/.bun/@inquirer+checkbox@4.3.2/node_modules/@inquirer/checkbox/dist/esm/index.js
14448
14448
  var import_yoctocolors_cjs3 = __toESM(require_yoctocolors_cjs(), 1);
14449
14449
  var checkboxTheme = {
14450
14450
  icon: {
@@ -14631,7 +14631,7 @@ var esm_default2 = createPrompt((config, done) => {
14631
14631
  `).trimEnd();
14632
14632
  return `${lines}${cursorHide}`;
14633
14633
  });
14634
- // ../../node_modules/@inquirer/input/dist/esm/index.js
14634
+ // ../../node_modules/.bun/@inquirer+input@4.3.1/node_modules/@inquirer/input/dist/esm/index.js
14635
14635
  var inputTheme = {
14636
14636
  validationFailureMode: "keep"
14637
14637
  };
@@ -14715,7 +14715,7 @@ var esm_default3 = createPrompt((config, done) => {
14715
14715
  error
14716
14716
  ];
14717
14717
  });
14718
- // ../../node_modules/@inquirer/select/dist/esm/index.js
14718
+ // ../../node_modules/.bun/@inquirer+select@4.4.2/node_modules/@inquirer/select/dist/esm/index.js
14719
14719
  var import_yoctocolors_cjs4 = __toESM(require_yoctocolors_cjs(), 1);
14720
14720
  var selectTheme = {
14721
14721
  icon: { cursor: esm_default.pointer },
@@ -14879,7 +14879,7 @@ var esm_default4 = createPrompt((config, done) => {
14879
14879
  `).trimEnd();
14880
14880
  return `${lines}${cursorHide}`;
14881
14881
  });
14882
- // src/signupMockFlow.ts
14882
+ // src/signupFlow.ts
14883
14883
  import { spawn as spawn7 } from "node:child_process";
14884
14884
  import {
14885
14885
  existsSync as existsSync10,
@@ -15185,7 +15185,7 @@ function booleanValue(record, key) {
15185
15185
  throw new Error(`signup ${key} was incomplete`);
15186
15186
  }
15187
15187
 
15188
- // src/signupMockFlow.ts
15188
+ // src/signupFlow.ts
15189
15189
  var commanderConnectedMarkers = [
15190
15190
  "Connected to Linzumi",
15191
15191
  "Runner connected:",
@@ -15216,7 +15216,7 @@ secure mission control for all your agents on your computers
15216
15216
  `;
15217
15217
  var logoTagline = "secure mission control for all your agents on your computers";
15218
15218
  var signupCancelMessage = "Y'all come back soon, ya hear?";
15219
- function signupMockHelpText() {
15219
+ function signupHelpText() {
15220
15220
  return [
15221
15221
  "Usage:",
15222
15222
  " linzumi signup",
@@ -15286,7 +15286,7 @@ function comparableServiceUrl(value) {
15286
15286
  return trimmed.replace(/\/+$/u, "");
15287
15287
  }
15288
15288
  }
15289
- async function runSignupMockFlow(deps = {}) {
15289
+ async function runSignupFlow(deps = {}) {
15290
15290
  const input = deps.input ?? defaultStdin;
15291
15291
  const output = deps.output ?? defaultStdout;
15292
15292
  const prompts = deps.prompts ?? inquirerPrompts(input, output);
@@ -15363,18 +15363,25 @@ async function runSignupMockFlow(deps = {}) {
15363
15363
  projectDiscovery: { type: "ready", codeRoot: guessedCodeRoot, projects }
15364
15364
  });
15365
15365
  const selectedProjectPaths = await prompts.projectPicker({
15366
- message: "Which projects would you like to add to Linzumi Mission Control?",
15366
+ message: "Pick the first folders where Linzumi should start agents",
15367
15367
  projects,
15368
15368
  defaultSelectedPaths: defaultSelectedProjectPaths(forceSignup ? [] : readConfiguredProjectPaths(serviceUrl))
15369
15369
  });
15370
- if (selectedProjectPaths.length === 0) {
15370
+ const projectPreparation = prepareSelectedSignupProjects(selectedProjectPaths, projects);
15371
+ if (projectPreparation.type === "failed") {
15372
+ writeProjectPreparationFailure(output, projectPreparation.message);
15373
+ writeDebugLaunchPayload(output, state, debugLaunchPayload);
15374
+ return;
15375
+ }
15376
+ const preparedProjectPaths = projectPreparation.selectedProjectPaths;
15377
+ if (preparedProjectPaths.length === 0) {
15371
15378
  writeNoProjectsFound(output);
15372
15379
  writeDebugLaunchPayload(output, state, debugLaunchPayload);
15373
15380
  return;
15374
15381
  }
15375
15382
  state = updateSignupState(state, {
15376
15383
  currentStep: "tasks",
15377
- selectedProjectPaths
15384
+ selectedProjectPaths: preparedProjectPaths
15378
15385
  });
15379
15386
  writeSignupScreen(output, state);
15380
15387
  writePreflightSummary(output, state);
@@ -15407,7 +15414,8 @@ async function runSignupMockFlow(deps = {}) {
15407
15414
  writeSelectedProjectsSummary(output, state);
15408
15415
  writeSelectedTasksSummary(output, state);
15409
15416
  const projectGitEmails = await projectGitEmailsPromise;
15410
- const globalGitEmail = configuredGitEmailFromPreflights(state.preflightChecks);
15417
+ const configuredGitEmail = configuredGitEmailFromPreflights(state.preflightChecks);
15418
+ const globalGitEmail = configuredGitEmail !== undefined && usefulSuggestedEmail(configuredGitEmail) ? configuredGitEmail : undefined;
15411
15419
  const emailCandidates = globalGitEmail === undefined ? uniqueDefinedEmails(projectGitEmails) : [];
15412
15420
  state = updateSignupState(state, { projectGitEmails, emailCandidates });
15413
15421
  const reusedSignupAuth = state.reusedSignupAuth;
@@ -15771,13 +15779,22 @@ function writeProjectPickerIntro(output, state) {
15771
15779
  if (!preflightsFinished(state)) {
15772
15780
  return;
15773
15781
  }
15774
- writeBoundedLine(output, blue("2) Where should Linzumi let your Codex agents work?"));
15782
+ writeBoundedLine(output, blue("2) Where should Linzumi let your Codex agents start?"));
15783
+ writeWrappedPrefixMessage(output, " ", "Pick the first local folders for Mission Control. You can add or remove folders later.", muted);
15775
15784
  }
15776
15785
  function writeNoProjectsFound(output) {
15777
15786
  output.write(`${blue("?")} No projects found yet
15778
15787
 
15779
15788
  `);
15780
15789
  }
15790
+ function writeProjectPreparationFailure(output, message) {
15791
+ output.write(`
15792
+ `);
15793
+ writeBoundedLine(output, blue("We couldn't prepare that project"));
15794
+ writeStatusMessage(output, red("x"), message);
15795
+ writeBoundedLine(output, muted(" Choose another folder or move the conflicting demo directory, then retry:"));
15796
+ writeBoundedLine(output, blue(" npx -y @linzumi/cli@latest signup"));
15797
+ }
15781
15798
  function writeSelectedProjectsSummary(output, state) {
15782
15799
  const selectedProjects = selectedProjectsFromState(state);
15783
15800
  output.write(`
@@ -15891,7 +15908,7 @@ async function chooseTasks(prompts, output, tasks) {
15891
15908
  output.write(`
15892
15909
  `);
15893
15910
  writeBoundedLine(output, blue("4) What should your Codex agents start working on?"));
15894
- writeBoundedLine(output, muted(" Pick up to 5 starting tasks for Linzumi Mission Control."));
15911
+ writeBoundedLine(output, muted(" Pick up to 5 small starter tasks. These just get agents moving."));
15895
15912
  writeBoundedLine(output, muted(" Select suggested tasks, or choose the last row to type your own task."));
15896
15913
  const customTaskChoice = "__custom_task__";
15897
15914
  const checkedTasks = await prompts.checkbox({
@@ -16624,6 +16641,40 @@ function projectPickerRows(projects, selectedPaths, pathInput) {
16624
16641
  const recentRows = projects.filter((project) => !selectedPaths.has(project.path)).slice(0, remainingCount).map((project) => ({ project, selected: false }));
16625
16642
  return [...selectedRows, ...recentRows];
16626
16643
  }
16644
+ function prepareSelectedSignupProjects(selectedProjectPaths, projects) {
16645
+ const normalizedPaths = selectedProjectPaths.map(normalizeProjectPath);
16646
+ const selectedProjectByPath = new Map(normalizedPaths.map((path) => [
16647
+ path,
16648
+ projectFromKnownOrPath(projects, path)
16649
+ ]));
16650
+ for (const [path, project] of selectedProjectByPath) {
16651
+ if (project.source === "hello_linzumi_demo") {
16652
+ try {
16653
+ createHelloLinzumiProject({ rootPath: path });
16654
+ } catch (error) {
16655
+ return {
16656
+ type: "failed",
16657
+ message: demoProjectCreateFailureMessage(path, error)
16658
+ };
16659
+ }
16660
+ }
16661
+ }
16662
+ return {
16663
+ type: "ready",
16664
+ selectedProjectPaths: Array.from(new Set(normalizedPaths))
16665
+ };
16666
+ }
16667
+ function demoProjectCreateFailureMessage(path, error) {
16668
+ const detail = error instanceof Error ? error.message : String(error);
16669
+ return `The Hello Linzumi demo project could not be created at ${path}. ${detail}`;
16670
+ }
16671
+ function helloLinzumiDemoProjectOption() {
16672
+ return {
16673
+ path: normalizeProjectPath(defaultHelloLinzumiProjectDir),
16674
+ language: "Demo",
16675
+ source: "hello_linzumi_demo"
16676
+ };
16677
+ }
16627
16678
  function renderProjectPickerRow(row, index, state) {
16628
16679
  const active = index === state.highlightIndex;
16629
16680
  const marker = active ? blue("›") : " ";
@@ -16631,11 +16682,12 @@ function renderProjectPickerRow(row, index, state) {
16631
16682
  const gitHead = row.project.gitHead;
16632
16683
  const sha = truncateEnd(gitHead?.sha ?? "-----", 5);
16633
16684
  const date = gitHead?.date ?? "----------";
16634
- const message = gitHead?.message ?? "";
16685
+ const message = gitHead?.message ?? (row.project.source === "hello_linzumi_demo" ? "Create a safe demo app" : "");
16635
16686
  return ` ${marker}${selected} ${truncateMiddle(row.project.path, 41).padEnd(41, " ")} ${sha.padEnd(5, " ")} ${date.padEnd(10, " ")} ${truncateEnd(message, 34)}`;
16636
16687
  }
16637
16688
  function projectFromKnownOrPath(projects, path) {
16638
- return projects.find((project) => project.path === path) ?? customProjectOption(path);
16689
+ const normalizedPath = normalizeProjectPath(path);
16690
+ return projects.find((project) => project.path === normalizedPath) ?? (normalizedPath === normalizeProjectPath(defaultHelloLinzumiProjectDir) ? helloLinzumiDemoProjectOption() : undefined) ?? customProjectOption(normalizedPath);
16639
16691
  }
16640
16692
  function selectedProjectsFromState(state) {
16641
16693
  if (state.projectDiscovery.type !== "ready") {
@@ -16866,7 +16918,8 @@ function uniqueEmails(emails) {
16866
16918
  }
16867
16919
  function usefulSuggestedEmail(email) {
16868
16920
  const normalizedEmail = email.trim().toLocaleLowerCase();
16869
- return !(normalizedEmail === "noreply@github.com" || normalizedEmail.endsWith("@users.noreply.github.com") || normalizedEmail.endsWith("@noreply.github.com"));
16921
+ const domain = normalizedEmail.split("@")[1] ?? "";
16922
+ return !(normalizedEmail === "noreply@github.com" || normalizedEmail.endsWith("@users.noreply.github.com") || normalizedEmail.endsWith("@noreply.github.com") || domain === "localhost" || domain.endsWith(".local"));
16870
16923
  }
16871
16924
  function configuredGitEmailFromPreflights(checks) {
16872
16925
  const gitEmailCheck = checks.find((check2) => check2.id === "git_email");
@@ -16945,8 +16998,9 @@ function defaultPreflightRuntime() {
16945
16998
  };
16946
16999
  }
16947
17000
  function defaultProjectDiscoveryRuntime() {
17001
+ const cwd = process.cwd();
16948
17002
  return {
16949
- discoverProjects: async (homeDir) => discoverProjectsFromGuessedRoots(homeDir)
17003
+ discoverProjects: async (homeDir) => discoverProjectsFromSignupRoots(homeDir, cwd)
16950
17004
  };
16951
17005
  }
16952
17006
  function defaultTaskSuggestionRuntime() {
@@ -17093,7 +17147,7 @@ async function resolveSignupCodexCommand(env = process.env, homeDir = homedir8()
17093
17147
  "Set LINZUMI_SIGNUP_CODEX_BIN to a working Codex executable or install Codex in a home-managed location such as ~/.volta/bin/codex."
17094
17148
  ].join(" "));
17095
17149
  }
17096
- throw new Error("Codex task suggestions could not find Codex. Set LINZUMI_SIGNUP_CODEX_BIN to a working Codex executable.");
17150
+ throw new Error("Codex task suggestions could not find Codex. Install Codex first, or set LINZUMI_SIGNUP_CODEX_BIN to a working Codex executable.");
17097
17151
  }
17098
17152
  function firstConfiguredValue(values) {
17099
17153
  return values.find((value) => value !== undefined && value.trim() !== "");
@@ -17439,6 +17493,33 @@ function discoverProjectsUnderRoot(codeRoot) {
17439
17493
  gitHead: cachedGitHeadSummary(project.path)
17440
17494
  })).sort(sortProjectsByRecentGitCommit).slice(0, 20);
17441
17495
  }
17496
+ function discoverProjectsFromSignupRoots(homeDir, cwd) {
17497
+ const currentProjects = discoverProjectsFromCurrentDirectory(cwd);
17498
+ const guessedProjects = discoverProjectsFromGuessedRoots(homeDir);
17499
+ const demoProject = helloLinzumiDemoProjectOption();
17500
+ const [firstCurrentProject, ...remainingCurrentProjects] = currentProjects;
17501
+ const seenPaths = new Set;
17502
+ return [
17503
+ ...firstCurrentProject === undefined ? [] : [firstCurrentProject],
17504
+ demoProject,
17505
+ ...remainingCurrentProjects,
17506
+ ...guessedProjects
17507
+ ].filter((project) => {
17508
+ if (seenPaths.has(project.path)) {
17509
+ return false;
17510
+ }
17511
+ seenPaths.add(project.path);
17512
+ return true;
17513
+ }).slice(0, 24);
17514
+ }
17515
+ function discoverProjectsFromCurrentDirectory(cwd) {
17516
+ const normalizedCwd = normalizeProjectPath(cwd);
17517
+ const cwdProject = directoryExists(normalizedCwd) ? [customProjectOption(normalizedCwd)] : [];
17518
+ const gitRoot = gitTopLevel(normalizedCwd);
17519
+ const gitRootProject = gitRoot !== undefined && gitRoot !== normalizedCwd ? [customProjectOption(gitRoot)] : [];
17520
+ const childProjects = discoverProjectsUnderRoot(normalizedCwd);
17521
+ return [...cwdProject, ...gitRootProject, ...childProjects];
17522
+ }
17442
17523
  function discoverProjectsFromGuessedRoots(homeDir) {
17443
17524
  const guessedRoots = ["src", "code", "projects"].map((name) => join12(homeDir, name));
17444
17525
  const projects = guessedRoots.flatMap((root) => discoverProjectsUnderRoot(root));
@@ -17451,6 +17532,9 @@ function discoverProjectsFromGuessedRoots(homeDir) {
17451
17532
  return true;
17452
17533
  }).sort(sortProjectsByRecentGitCommit).slice(0, 20);
17453
17534
  }
17535
+ function gitTopLevel(cwd) {
17536
+ return spawnSyncGit(["rev-parse", "--show-toplevel"], cwd);
17537
+ }
17454
17538
  function sortProjectsByRecentGitCommit(left, right) {
17455
17539
  const leftTimestamp = left.gitHead?.timestamp ?? 0;
17456
17540
  const rightTimestamp = right.gitHead?.timestamp ?? 0;
@@ -17917,12 +18001,12 @@ async function main(args) {
17917
18001
  return;
17918
18002
  case "signupMock":
17919
18003
  if (parsed.args.includes("--help") || parsed.args.includes("-h")) {
17920
- process.stdout.write(signupMockHelpText());
18004
+ process.stdout.write(signupHelpText());
17921
18005
  return;
17922
18006
  }
17923
18007
  {
17924
18008
  const options = parseSignupTuiOptions(parsed.args);
17925
- await runSignupMockFlow({
18009
+ await runSignupFlow({
17926
18010
  forceSignup: options.forceSignup,
17927
18011
  serviceUrl: options.serviceUrl,
17928
18012
  openBrowser: false,
@@ -17933,12 +18017,12 @@ async function main(args) {
17933
18017
  return;
17934
18018
  case "signup":
17935
18019
  if (parsed.args.includes("--help") || parsed.args.includes("-h")) {
17936
- process.stdout.write(signupMockHelpText());
18020
+ process.stdout.write(signupHelpText());
17937
18021
  return;
17938
18022
  }
17939
18023
  {
17940
18024
  const options = parseSignupTuiOptions(parsed.args);
17941
- await runSignupMockFlow({
18025
+ await runSignupFlow({
17942
18026
  forceSignup: options.forceSignup,
17943
18027
  serviceUrl: options.serviceUrl,
17944
18028
  openBrowser: options.openBrowser,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@linzumi/cli",
3
- "version": "0.0.49-beta",
3
+ "version": "0.0.50-beta",
4
4
  "description": "Linzumi CLI — point a Codex agent at the real code on your laptop, with your team watching and steering from shared threads.",
5
5
  "type": "module",
6
6
  "bin": {