@bobsworkshop/cli 0.2.0 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/bob.js CHANGED
@@ -1,4 +1,3 @@
1
- #!/usr/bin/env node
2
1
  import {
3
2
  buildLocalContext,
4
3
  callCloudFunction,
@@ -20,7 +19,7 @@ import {
20
19
 
21
20
  // bin/bob.ts
22
21
  import { Command } from "commander";
23
- import chalk23 from "chalk";
22
+ import chalk24 from "chalk";
24
23
  import * as path13 from "path";
25
24
 
26
25
  // src/commands/config.ts
@@ -108,7 +107,7 @@ function registerConfigCommand(program2) {
108
107
  }
109
108
 
110
109
  // src/commands/chat.ts
111
- import chalk8 from "chalk";
110
+ import chalk9 from "chalk";
112
111
  import * as fs6 from "fs";
113
112
  import * as path7 from "path";
114
113
  import * as readline2 from "readline";
@@ -1626,15 +1625,66 @@ function sleep3(ms) {
1626
1625
  return new Promise((resolve2) => setTimeout(resolve2, ms));
1627
1626
  }
1628
1627
 
1629
- // src/commands/chat.ts
1630
- var BRAND_PRIMARY4 = chalk8.hex("#E66F24");
1631
- var BRAND_SECONDARY5 = chalk8.hex("#FFAB00");
1628
+ // src/core/provider-detect.ts
1629
+ import chalk8 from "chalk";
1632
1630
  var SUCCESS5 = chalk8.hex("#66BB6A");
1633
- var INFO5 = chalk8.hex("#26C6DA");
1634
1631
  var WARNING4 = chalk8.hex("#FFC107");
1635
- var ERROR4 = chalk8.hex("#EF5350");
1636
1632
  var MUTED5 = chalk8.hex("#78909C");
1637
- var MODE_CHAT3 = chalk8.hex("#26C6DA");
1633
+ var INFO5 = chalk8.hex("#26C6DA");
1634
+ var BRAND_SECONDARY5 = chalk8.hex("#FFAB00");
1635
+ var OLLAMA_DEFAULT_ENDPOINT = "http://127.0.0.1:11434/api/chat";
1636
+ var OLLAMA_TAGS_URL = "http://127.0.0.1:11434/api/tags";
1637
+ async function detectOllama() {
1638
+ try {
1639
+ const response = await fetch(OLLAMA_TAGS_URL, {
1640
+ signal: AbortSignal.timeout(2e3)
1641
+ });
1642
+ return response.ok;
1643
+ } catch {
1644
+ return false;
1645
+ }
1646
+ }
1647
+ async function ensureProvider() {
1648
+ const config = getConfig();
1649
+ if (config.provider && config.localEndpoint) {
1650
+ return true;
1651
+ }
1652
+ if (config.loggedIn && config.authToken) {
1653
+ return true;
1654
+ }
1655
+ const ollamaRunning = await detectOllama();
1656
+ if (ollamaRunning) {
1657
+ setConfigValue("provider", "local");
1658
+ setConfigValue("localEndpoint", OLLAMA_DEFAULT_ENDPOINT);
1659
+ console.log("");
1660
+ console.log(SUCCESS5(" \u2705 Ollama detected. Using local model (free, private)."));
1661
+ console.log(MUTED5(" Change anytime: bob config set provider <name>"));
1662
+ console.log("");
1663
+ return true;
1664
+ }
1665
+ console.log("");
1666
+ console.log(WARNING4(" \u26A0\uFE0F No AI provider configured."));
1667
+ console.log("");
1668
+ console.log(MUTED5(" For free local use:"));
1669
+ console.log(BRAND_SECONDARY5(" \u25B8 Install Ollama: ") + INFO5("https://ollama.com"));
1670
+ console.log(BRAND_SECONDARY5(" \u25B8 Run: ") + chalk8.white("ollama serve"));
1671
+ console.log(BRAND_SECONDARY5(" \u25B8 Then: ") + chalk8.white('bob chat "hello"'));
1672
+ console.log("");
1673
+ console.log(MUTED5(" For platform features:"));
1674
+ console.log(BRAND_SECONDARY5(" \u25B8 bob login"));
1675
+ console.log("");
1676
+ return false;
1677
+ }
1678
+
1679
+ // src/commands/chat.ts
1680
+ var BRAND_PRIMARY4 = chalk9.hex("#E66F24");
1681
+ var BRAND_SECONDARY6 = chalk9.hex("#FFAB00");
1682
+ var SUCCESS6 = chalk9.hex("#66BB6A");
1683
+ var INFO6 = chalk9.hex("#26C6DA");
1684
+ var WARNING5 = chalk9.hex("#FFC107");
1685
+ var ERROR4 = chalk9.hex("#EF5350");
1686
+ var MUTED6 = chalk9.hex("#78909C");
1687
+ var MODE_CHAT3 = chalk9.hex("#26C6DA");
1638
1688
  var lastConstraints = [];
1639
1689
  function registerChatCommand(program2) {
1640
1690
  program2.command("chat [message]").description("Chat with Bob \u2014 code-friendly engineering partner").option("-f, --file <path>", "Include a specific file as context").option("--no-context", "Skip local directory context").option("--personalized", "Use personalization mode (Tier 3 only)").option("--new", "Start a fresh conversation").option("-i, --interactive", "Enter interactive conversation mode").action(async (message, options) => {
@@ -1657,7 +1707,7 @@ function registerChatCommand(program2) {
1657
1707
  ${fileContent}
1658
1708
  --- END FILE ---`;
1659
1709
  } else {
1660
- console.log(WARNING4(` \u26A0\uFE0F Could not read file: ${options.file}`));
1710
+ console.log(WARNING5(` \u26A0\uFE0F Could not read file: ${options.file}`));
1661
1711
  }
1662
1712
  }
1663
1713
  if (options.interactive || !message || options.personalized) {
@@ -1672,6 +1722,9 @@ ${fileContent}
1672
1722
  });
1673
1723
  }
1674
1724
  async function sendMessage(message, config, conversationId, localContext, personalized, mode, history, existingRl) {
1725
+ const providerReady = await ensureProvider();
1726
+ if (!providerReady) return "";
1727
+ config = getConfig();
1675
1728
  renderUserMessage(message);
1676
1729
  startElapsedTimer();
1677
1730
  let selectedFiles = [];
@@ -1744,7 +1797,7 @@ ${fullContext}` : "") },
1744
1797
  if (!config.loggedIn || !config.authToken) {
1745
1798
  stopElapsedTimer();
1746
1799
  console.log(ERROR4(" \u274C Not logged in."));
1747
- console.log(MUTED5(" Run `bob login` to authenticate, or set provider to local."));
1800
+ console.log(MUTED6(" Run `bob login` to authenticate, or set provider to local."));
1748
1801
  return "";
1749
1802
  }
1750
1803
  const result = await callCloudFunction("chatWithBobStream", { userEmail: config.email, userId: config.uid, conversationId, userMessage: message, useContext: true, consultantModelId: "gemini-2.5-flash", useOrgContext: false, isPassalongActive: false, linkedConvoId: null, localContext: fullContext || null });
@@ -1796,7 +1849,7 @@ async function runInteractiveSession(config, conversationId, localContext, perso
1796
1849
  }
1797
1850
  }
1798
1851
  const prompt = () => {
1799
- rl.question(SUCCESS5(" You: "), async (input) => {
1852
+ rl.question(SUCCESS6(" You: "), async (input) => {
1800
1853
  const trimmed = input.trim();
1801
1854
  if (!trimmed) {
1802
1855
  prompt();
@@ -1804,11 +1857,11 @@ async function runInteractiveSession(config, conversationId, localContext, perso
1804
1857
  }
1805
1858
  if (trimmed === "/exit" || trimmed === "/quit") {
1806
1859
  console.log("");
1807
- console.log(MUTED5(` \u{1F4BE} Session: ${conversationId.slice(0, 24)}...`));
1860
+ console.log(MUTED6(` \u{1F4BE} Session: ${conversationId.slice(0, 24)}...`));
1808
1861
  if (config.tier === "platform" && config.provider !== "local") {
1809
- console.log(MUTED5(` \u{1F517} https://bobs-workshop.web.app/#/bobcodeassistant/${conversationId}`));
1862
+ console.log(MUTED6(` \u{1F517} https://bobs-workshop.web.app/#/bobcodeassistant/${conversationId}`));
1810
1863
  }
1811
- console.log(MUTED5(" \u{1F44B} See you next time."));
1864
+ console.log(MUTED6(" \u{1F44B} See you next time."));
1812
1865
  console.log("");
1813
1866
  rl.close();
1814
1867
  return;
@@ -1818,7 +1871,7 @@ async function runInteractiveSession(config, conversationId, localContext, perso
1818
1871
  lastConstraints = [];
1819
1872
  conversationId = `cli_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;
1820
1873
  setConfigValue("conversationId", conversationId);
1821
- console.log(INFO5(" \u{1F504} New session started."));
1874
+ console.log(INFO6(" \u{1F504} New session started."));
1822
1875
  console.log("");
1823
1876
  prompt();
1824
1877
  return;
@@ -1843,7 +1896,7 @@ async function runInteractiveSession(config, conversationId, localContext, perso
1843
1896
  --- INCLUDED FILE: ${filePath} ---
1844
1897
  ${content}
1845
1898
  --- END FILE ---`;
1846
- console.log(SUCCESS5(` \u{1F4C4} Loaded: ${filePath} (${content.split("\n").length} lines)`));
1899
+ console.log(SUCCESS6(` \u{1F4C4} Loaded: ${filePath} (${content.split("\n").length} lines)`));
1847
1900
  } else {
1848
1901
  console.log(ERROR4(` \u274C Could not read: ${filePath}`));
1849
1902
  }
@@ -1887,13 +1940,13 @@ ${content}
1887
1940
  if (!fs6.existsSync(backupDir)) fs6.mkdirSync(backupDir, { recursive: true });
1888
1941
  fs6.copyFileSync(absolutePath, path7.join(backupDir, filePath.replace(/[\/\\]/g, "_") + `.${Date.now()}.deleted`));
1889
1942
  fs6.unlinkSync(absolutePath);
1890
- console.log(SUCCESS5(` \u2705 Deleted: ${filePath}`));
1891
- console.log(MUTED5(` \u{1F4E6} Backup saved to .bob-backups/`));
1943
+ console.log(SUCCESS6(` \u2705 Deleted: ${filePath}`));
1944
+ console.log(MUTED6(` \u{1F4E6} Backup saved to .bob-backups/`));
1892
1945
  } catch (e) {
1893
1946
  console.log(ERROR4(` \u274C Delete failed: ${e.message}`));
1894
1947
  }
1895
1948
  } else {
1896
- console.log(MUTED5(" Cancelled."));
1949
+ console.log(MUTED6(" Cancelled."));
1897
1950
  }
1898
1951
  console.log("");
1899
1952
  prompt();
@@ -1916,15 +1969,15 @@ ${content}
1916
1969
  }
1917
1970
 
1918
1971
  // src/commands/consult.ts
1919
- import chalk9 from "chalk";
1972
+ import chalk10 from "chalk";
1920
1973
  import * as readline3 from "readline";
1921
- var BRAND_SECONDARY6 = chalk9.hex("#FFAB00");
1922
- var SUCCESS6 = chalk9.hex("#66BB6A");
1923
- var INFO6 = chalk9.hex("#26C6DA");
1924
- var WARNING5 = chalk9.hex("#FFC107");
1925
- var ERROR5 = chalk9.hex("#EF5350");
1926
- var MUTED6 = chalk9.hex("#78909C");
1927
- var MODE_CONSULTANT4 = chalk9.hex("#AB47BC");
1974
+ var BRAND_SECONDARY7 = chalk10.hex("#FFAB00");
1975
+ var SUCCESS7 = chalk10.hex("#66BB6A");
1976
+ var INFO7 = chalk10.hex("#26C6DA");
1977
+ var WARNING6 = chalk10.hex("#FFC107");
1978
+ var ERROR5 = chalk10.hex("#EF5350");
1979
+ var MUTED7 = chalk10.hex("#78909C");
1980
+ var MODE_CONSULTANT4 = chalk10.hex("#AB47BC");
1928
1981
  var lastConstraints2 = [];
1929
1982
  function registerConsultCommand(program2) {
1930
1983
  program2.command("consult [message]").description("Consult with Bob \u2014 strategic advice only, no code").option("-f, --file <path>", "Include a specific file as context").option("--no-context", "Skip local directory context").option("--new", "Start a fresh conversation").option("-i, --interactive", "Enter interactive consultant session").action(async (message, options) => {
@@ -1947,7 +2000,7 @@ function registerConsultCommand(program2) {
1947
2000
  ${fileContent}
1948
2001
  --- END FILE ---`;
1949
2002
  } else {
1950
- console.log(WARNING5(` \u26A0\uFE0F Could not read file: ${options.file}`));
2003
+ console.log(WARNING6(` \u26A0\uFE0F Could not read file: ${options.file}`));
1951
2004
  }
1952
2005
  }
1953
2006
  if (options.interactive || !message) {
@@ -1958,6 +2011,9 @@ ${fileContent}
1958
2011
  });
1959
2012
  }
1960
2013
  async function sendConsultMessage(message, config, conversationId, localContext, history, existingRl) {
2014
+ const providerReady = await ensureProvider();
2015
+ if (!providerReady) return "";
2016
+ config = getConfig();
1961
2017
  renderUserMessage(message);
1962
2018
  startElapsedTimer();
1963
2019
  let selectedFiles = [];
@@ -2047,11 +2103,11 @@ async function runInteractiveSession2(config, conversationId, localContext) {
2047
2103
  }
2048
2104
  if (trimmed === "/exit" || trimmed === "/quit") {
2049
2105
  console.log("");
2050
- console.log(MUTED6(` \u{1F4BE} Session: ${conversationId.slice(0, 24)}...`));
2106
+ console.log(MUTED7(` \u{1F4BE} Session: ${conversationId.slice(0, 24)}...`));
2051
2107
  if (config.tier === "platform" && config.provider !== "local") {
2052
- console.log(MUTED6(` \u{1F517} https://bobs-workshop.web.app/#/bobcodeassistant/${conversationId}`));
2108
+ console.log(MUTED7(` \u{1F517} https://bobs-workshop.web.app/#/bobcodeassistant/${conversationId}`));
2053
2109
  }
2054
- console.log(MUTED6(" \u{1F44B} See you next time."));
2110
+ console.log(MUTED7(" \u{1F44B} See you next time."));
2055
2111
  console.log("");
2056
2112
  rl.close();
2057
2113
  return;
@@ -2091,7 +2147,7 @@ async function runInteractiveSession2(config, conversationId, localContext) {
2091
2147
  --- INCLUDED FILE: ${filePath} ---
2092
2148
  ${content}
2093
2149
  --- END FILE ---`;
2094
- console.log(SUCCESS6(` \u{1F4C4} Loaded: ${filePath} (${content.split("\n").length} lines)`));
2150
+ console.log(SUCCESS7(` \u{1F4C4} Loaded: ${filePath} (${content.split("\n").length} lines)`));
2095
2151
  } else {
2096
2152
  console.log(ERROR5(` \u274C Could not read: ${filePath}`));
2097
2153
  }
@@ -2111,9 +2167,16 @@ ${content}
2111
2167
  }
2112
2168
 
2113
2169
  // src/commands/index.ts
2114
- import chalk10 from "chalk";
2170
+ import chalk11 from "chalk";
2115
2171
  import * as fs7 from "fs";
2116
2172
  import * as path8 from "path";
2173
+ var BRAND_PRIMARY5 = chalk11.hex("#E66F24");
2174
+ var BRAND_SECONDARY8 = chalk11.hex("#FFAB00");
2175
+ var SUCCESS8 = chalk11.hex("#66BB6A");
2176
+ var INFO8 = chalk11.hex("#26C6DA");
2177
+ var WARNING7 = chalk11.hex("#FFC107");
2178
+ var ERROR6 = chalk11.hex("#EF5350");
2179
+ var MUTED8 = chalk11.hex("#78909C");
2117
2180
  var IGNORE_DIRS = ["node_modules", ".git", "dist", "build", ".dart_tool", ".idea", ".gradle", ".pub-cache", ".bob"];
2118
2181
  var CODE_EXTENSIONS = /* @__PURE__ */ new Set([".dart", ".js", ".ts", ".html", ".css", ".json", ".yaml", ".yml", ".xml", ".sh", ".md"]);
2119
2182
  function registerIndexCommand(program2) {
@@ -2123,23 +2186,23 @@ function registerIndexCommand(program2) {
2123
2186
  const projectName = getProjectName(cwd);
2124
2187
  if (config.provider !== "local" || !config.localEndpoint) {
2125
2188
  console.log("");
2126
- console.log(chalk10.red(" \u274C Indexing requires a local model."));
2127
- console.log(chalk10.gray(" Run `bob config set provider local`"));
2128
- console.log(chalk10.gray(" Run `bob config set localEndpoint http://127.0.0.1:11434/api/chat`"));
2189
+ console.log(ERROR6(" \u274C Indexing requires a local model."));
2190
+ console.log(MUTED8(" Run `bob config set provider local`"));
2191
+ console.log(MUTED8(" Run `bob config set localEndpoint http://127.0.0.1:11434/api/chat`"));
2129
2192
  console.log("");
2130
2193
  return;
2131
2194
  }
2132
2195
  console.log("");
2133
- console.log(chalk10.bold.cyan(` \u26A1 Indexing project: ${projectName}`));
2134
- console.log(chalk10.gray(` \u{1F4C1} ${cwd}`));
2135
- console.log(chalk10.gray(" \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));
2196
+ console.log(chalk11.bold(INFO8(` \u26A1 Indexing project: ${projectName}`)));
2197
+ console.log(MUTED8(` \u{1F4C1} ${cwd}`));
2198
+ console.log(MUTED8(" \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));
2136
2199
  console.log("");
2137
2200
  const files = scanProjectFiles(cwd);
2138
2201
  if (files.length === 0) {
2139
- console.log(chalk10.yellow(" \u26A0\uFE0F No code files found to index."));
2202
+ console.log(WARNING7(" \u26A0\uFE0F No code files found to index."));
2140
2203
  return;
2141
2204
  }
2142
- console.log(chalk10.gray(` Found ${files.length} files to analyze.`));
2205
+ console.log(MUTED8(` Found ${files.length} files to analyze.`));
2143
2206
  console.log("");
2144
2207
  console.log("");
2145
2208
  console.log("");
@@ -2154,7 +2217,7 @@ function registerIndexCommand(program2) {
2154
2217
  try {
2155
2218
  content = fs7.readFileSync(absolutePath, "utf-8");
2156
2219
  } catch {
2157
- console.log(chalk10.red(` \u274C Could not read: ${filePath}`));
2220
+ console.log(ERROR6(` \u274C Could not read: ${filePath}`));
2158
2221
  continue;
2159
2222
  }
2160
2223
  if (content.length > 5e4) {
@@ -2182,20 +2245,20 @@ ${content}`
2182
2245
  }
2183
2246
  ];
2184
2247
  const summary = await callLocalModel(config.localEndpoint, messages);
2185
- summaries[filePath] = summary.trim();
2186
- completeTask(tasksDir, filePath, summary.trim());
2248
+ summaries[filePath] = summary.text ? summary.text.trim() : String(summary).trim();
2249
+ completeTask(tasksDir, filePath, summaries[filePath]);
2187
2250
  completed++;
2188
2251
  updateManifestProgress(runDir, completed);
2189
- printProgress(completed, files.length, filePath, summary.trim(), [], options.verbose);
2252
+ printProgress(completed, files.length, filePath, summaries[filePath], [], options.verbose);
2190
2253
  } catch (error) {
2191
- console.log(chalk10.red(` \u274C Failed: ${filePath} \u2014 ${error.message}`));
2254
+ console.log(ERROR6(` \u274C Failed: ${filePath} \u2014 ${error.message}`));
2192
2255
  completed++;
2193
2256
  updateManifestProgress(runDir, completed);
2194
2257
  }
2195
2258
  }
2196
2259
  console.log("");
2197
2260
  console.log("");
2198
- console.log(chalk10.cyan(" \u{1F517} Generating dependency map..."));
2261
+ console.log(INFO8(" \u{1F517} Generating dependency map..."));
2199
2262
  try {
2200
2263
  const summaryContext = Object.entries(summaries).map(([fp, summary]) => `[${fp}]: ${summary}`).join("\n\n");
2201
2264
  const messages = [
@@ -2214,14 +2277,15 @@ Respond with ONLY the JSON object:`
2214
2277
  }
2215
2278
  ];
2216
2279
  const depResponse = await callLocalModel(config.localEndpoint, messages);
2280
+ const depText = depResponse.text ? depResponse.text : String(depResponse);
2217
2281
  let dependencies = {};
2218
2282
  try {
2219
- const jsonMatch = depResponse.match(/\{[\s\S]*\}/);
2283
+ const jsonMatch = depText.match(/\{[\s\S]*\}/);
2220
2284
  if (jsonMatch) {
2221
2285
  dependencies = JSON.parse(jsonMatch[0]);
2222
2286
  }
2223
2287
  } catch {
2224
- console.log(chalk10.yellow(" \u26A0\uFE0F Could not parse dependency map. Saving empty map."));
2288
+ console.log(WARNING7(" \u26A0\uFE0F Could not parse dependency map. Saving empty map."));
2225
2289
  dependencies = {};
2226
2290
  }
2227
2291
  saveSummaries(cwd, summaries);
@@ -2236,17 +2300,17 @@ Respond with ONLY the JSON object:`
2236
2300
  }
2237
2301
  }
2238
2302
  updateManifestProgress(runDir, completed, "completed");
2239
- console.log(chalk10.green(` \u2705 Dependency map generated for ${Object.keys(dependencies).length} files.`));
2303
+ console.log(SUCCESS8(` \u2705 Dependency map generated for ${Object.keys(dependencies).length} files.`));
2240
2304
  } catch (error) {
2241
- console.log(chalk10.red(` \u274C Dependency mapping failed: ${error.message}`));
2305
+ console.log(ERROR6(` \u274C Dependency mapping failed: ${error.message}`));
2242
2306
  saveSummaries(cwd, summaries);
2243
2307
  saveDependencies(cwd, {});
2244
2308
  updateManifestProgress(runDir, completed, "completed_partial");
2245
2309
  }
2246
2310
  console.log("");
2247
- console.log(chalk10.bold.green(` \u2705 Indexing complete: ${projectName}`));
2248
- console.log(chalk10.gray(` \u{1F4C4} ${Object.keys(summaries).length} files summarized`));
2249
- console.log(chalk10.gray(` \u{1F4BE} Saved to: ~/.bob/projects/${projectName}/analysis/`));
2311
+ console.log(chalk11.bold(SUCCESS8(` \u2705 Indexing complete: ${projectName}`)));
2312
+ console.log(MUTED8(` \u{1F4C4} ${Object.keys(summaries).length} files summarized`));
2313
+ console.log(MUTED8(` \u{1F4BE} Saved to: ~/.bob/projects/${projectName}/analysis/`));
2250
2314
  console.log("");
2251
2315
  });
2252
2316
  }
@@ -2280,50 +2344,55 @@ function printProgress(completed, total, filePath, summary, dependencies, verbos
2280
2344
  const filled = Math.round(percent * barLength);
2281
2345
  let barColor;
2282
2346
  if (percent < 0.25) {
2283
- barColor = chalk10.red;
2347
+ barColor = chalk11.hex("#EF5350");
2284
2348
  } else if (percent < 0.5) {
2285
- barColor = chalk10.hex("#FF8C00");
2349
+ barColor = chalk11.hex("#FF8C00");
2286
2350
  } else if (percent < 0.75) {
2287
- barColor = chalk10.yellow;
2351
+ barColor = chalk11.hex("#FFC107");
2288
2352
  } else {
2289
- barColor = chalk10.green;
2353
+ barColor = chalk11.hex("#66BB6A");
2290
2354
  }
2291
2355
  const filledBar = barColor("\u2588".repeat(filled));
2292
- const emptyBar = chalk10.gray("\u2591".repeat(barLength - filled));
2356
+ const emptyBar = MUTED8("\u2591".repeat(barLength - filled));
2293
2357
  const percentText = barColor(`${Math.round(percent * 100)}%`);
2294
2358
  process.stdout.write("\x1B[2K\x1B[1A\x1B[2K\x1B[1A\x1B[2K\x1B[1A\x1B[2K\r");
2295
- console.log(` ${chalk10.cyan("\u26A1")} Indexing [${filledBar}${emptyBar}] ${completed}/${total} ${percentText}`);
2296
- console.log(chalk10.green(` \u2705 ${filePath}`));
2359
+ console.log(` ${INFO8("\u26A1")} Indexing [${filledBar}${emptyBar}] ${completed}/${total} ${percentText}`);
2360
+ console.log(SUCCESS8(` \u2705 ${filePath}`));
2297
2361
  if (verbose) {
2298
- console.log(chalk10.gray(` "${summary.slice(0, 120)}${summary.length > 120 ? "..." : ""}"`));
2362
+ console.log(MUTED8(` "${summary.slice(0, 120)}${summary.length > 120 ? "..." : ""}"`));
2299
2363
  if (dependencies.length > 0) {
2300
- console.log(chalk10.gray(` \u2192 depends on: ${dependencies.join(", ")}`));
2364
+ console.log(MUTED8(` \u2192 depends on: ${dependencies.join(", ")}`));
2301
2365
  } else {
2302
- console.log(chalk10.gray(` \u2192 depends on: (mapping after all summaries)`));
2366
+ console.log(MUTED8(` \u2192 depends on: (mapping after all summaries)`));
2303
2367
  }
2304
2368
  } else {
2305
- console.log(chalk10.gray(` "${summary.slice(0, 80)}${summary.length > 80 ? "..." : ""}"`));
2369
+ console.log(MUTED8(` "${summary.slice(0, 80)}${summary.length > 80 ? "..." : ""}"`));
2306
2370
  console.log("");
2307
2371
  }
2308
2372
  }
2309
2373
 
2310
2374
  // src/commands/push.ts
2311
- import chalk11 from "chalk";
2375
+ import chalk12 from "chalk";
2312
2376
  import ora2 from "ora";
2313
2377
  import simpleGit from "simple-git";
2378
+ var SUCCESS9 = chalk12.hex("#66BB6A");
2379
+ var INFO9 = chalk12.hex("#26C6DA");
2380
+ var WARNING8 = chalk12.hex("#FFC107");
2381
+ var ERROR7 = chalk12.hex("#EF5350");
2382
+ var MUTED9 = chalk12.hex("#78909C");
2314
2383
  function registerPushCommand(program2) {
2315
2384
  program2.command("push <message>").description("Stage all changes, commit, and push to remote").option("--no-stage", "Skip staging (commit only tracked changes)").option("-b, --branch <name>", "Push to a specific branch").action(async (message, options) => {
2316
2385
  const git = simpleGit(process.cwd());
2317
2386
  const isRepo = await git.checkIsRepo();
2318
2387
  if (!isRepo) {
2319
2388
  console.log("");
2320
- console.log(chalk11.red(" \u274C Not a git repository."));
2321
- console.log(chalk11.gray(" Run this command from inside a git project."));
2389
+ console.log(ERROR7(" \u274C Not a git repository."));
2390
+ console.log(MUTED9(" Run this command from inside a git project."));
2322
2391
  console.log("");
2323
2392
  return;
2324
2393
  }
2325
2394
  const spinner = ora2({
2326
- text: chalk11.cyan(" Preparing commit..."),
2395
+ text: INFO9(" Preparing commit..."),
2327
2396
  spinner: "dots"
2328
2397
  }).start();
2329
2398
  try {
@@ -2331,18 +2400,18 @@ function registerPushCommand(program2) {
2331
2400
  if (status.files.length === 0) {
2332
2401
  spinner.stop();
2333
2402
  console.log("");
2334
- console.log(chalk11.yellow(" \u26A0\uFE0F Nothing to commit. Working tree is clean."));
2403
+ console.log(WARNING8(" \u26A0\uFE0F Nothing to commit. Working tree is clean."));
2335
2404
  console.log("");
2336
2405
  return;
2337
2406
  }
2338
2407
  if (options.stage !== false) {
2339
- spinner.text = chalk11.cyan(` Staging ${status.files.length} file(s)...`);
2408
+ spinner.text = INFO9(` Staging ${status.files.length} file(s)...`);
2340
2409
  await git.add(".");
2341
2410
  }
2342
- spinner.text = chalk11.cyan(" Committing...");
2411
+ spinner.text = INFO9(" Committing...");
2343
2412
  const commitResult = await git.commit(message);
2344
2413
  const commitHash = commitResult.commit ? commitResult.commit.slice(0, 7) : "unknown";
2345
- spinner.text = chalk11.cyan(" Pushing to remote...");
2414
+ spinner.text = INFO9(" Pushing to remote...");
2346
2415
  const currentBranch = options.branch || (await git.branchLocal()).current;
2347
2416
  try {
2348
2417
  await git.push("origin", currentBranch);
@@ -2355,34 +2424,34 @@ function registerPushCommand(program2) {
2355
2424
  }
2356
2425
  spinner.stop();
2357
2426
  console.log("");
2358
- console.log(chalk11.green(" \u2705 Pushed successfully"));
2359
- console.log(chalk11.gray(" \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));
2360
- console.log(` ${chalk11.cyan("Commit:")} ${commitHash}`);
2361
- console.log(` ${chalk11.cyan("Branch:")} ${currentBranch}`);
2362
- console.log(` ${chalk11.cyan("Message:")} ${message}`);
2363
- console.log(` ${chalk11.cyan("Files:")} ${status.files.length} changed`);
2364
- console.log(chalk11.gray(" \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));
2427
+ console.log(SUCCESS9(" \u2705 Pushed successfully"));
2428
+ console.log(MUTED9(" \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));
2429
+ console.log(` ${INFO9("Commit:")} ${commitHash}`);
2430
+ console.log(` ${INFO9("Branch:")} ${currentBranch}`);
2431
+ console.log(` ${INFO9("Message:")} ${message}`);
2432
+ console.log(` ${INFO9("Files:")} ${status.files.length} changed`);
2433
+ console.log(MUTED9(" \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));
2365
2434
  console.log("");
2366
2435
  if (status.files.length <= 10) {
2367
2436
  for (const file of status.files) {
2368
2437
  const icon = file.index === "?" ? "\u2795" : file.index === "D" ? "\u{1F5D1}\uFE0F" : "\u270F\uFE0F";
2369
- console.log(chalk11.gray(` ${icon} ${file.path}`));
2438
+ console.log(MUTED9(` ${icon} ${file.path}`));
2370
2439
  }
2371
2440
  console.log("");
2372
2441
  } else {
2373
- console.log(chalk11.gray(` ${status.created.length} added, ${status.modified.length} modified, ${status.deleted.length} deleted`));
2442
+ console.log(MUTED9(` ${status.created.length} added, ${status.modified.length} modified, ${status.deleted.length} deleted`));
2374
2443
  console.log("");
2375
2444
  }
2376
2445
  } catch (error) {
2377
2446
  spinner.stop();
2378
2447
  console.log("");
2379
- console.log(chalk11.red(` \u274C Push failed: ${error.message}`));
2448
+ console.log(ERROR7(` \u274C Push failed: ${error.message}`));
2380
2449
  if (error.message?.includes("Authentication failed") || error.message?.includes("could not read Username")) {
2381
- console.log(chalk11.gray(" Make sure your git credentials are configured."));
2382
- console.log(chalk11.gray(" Run: git config --global credential.helper store"));
2450
+ console.log(MUTED9(" Make sure your git credentials are configured."));
2451
+ console.log(MUTED9(" Run: git config --global credential.helper store"));
2383
2452
  }
2384
2453
  if (error.message?.includes("conflict") || error.message?.includes("rejected")) {
2385
- console.log(chalk11.gray(" There may be remote changes. Try: git pull --rebase"));
2454
+ console.log(MUTED9(" There may be remote changes. Try: git pull --rebase"));
2386
2455
  }
2387
2456
  console.log("");
2388
2457
  }
@@ -2390,9 +2459,15 @@ function registerPushCommand(program2) {
2390
2459
  }
2391
2460
 
2392
2461
  // src/commands/byok.ts
2393
- import chalk12 from "chalk";
2462
+ import chalk13 from "chalk";
2394
2463
  import ora3 from "ora";
2395
2464
  import * as readline4 from "readline";
2465
+ var BRAND_SECONDARY9 = chalk13.hex("#FFAB00");
2466
+ var SUCCESS10 = chalk13.hex("#66BB6A");
2467
+ var INFO10 = chalk13.hex("#26C6DA");
2468
+ var WARNING9 = chalk13.hex("#FFC107");
2469
+ var ERROR8 = chalk13.hex("#EF5350");
2470
+ var MUTED10 = chalk13.hex("#78909C");
2396
2471
  var VALID_PROVIDERS2 = ["google", "bedrock", "claude", "openai", "grok"];
2397
2472
  function registerByokCommand(program2) {
2398
2473
  const byokCmd = program2.command("byok").description("Manage your Bring Your Own Key (BYOK) configuration");
@@ -2400,20 +2475,20 @@ function registerByokCommand(program2) {
2400
2475
  const config = getConfig();
2401
2476
  if (!config.loggedIn || !config.authToken) {
2402
2477
  console.log("");
2403
- console.log(chalk12.red(" \u274C Not logged in."));
2404
- console.log(chalk12.gray(" Run `bob login` first."));
2478
+ console.log(ERROR8(" \u274C Not logged in."));
2479
+ console.log(MUTED10(" Run `bob login` first."));
2405
2480
  console.log("");
2406
2481
  return;
2407
2482
  }
2408
2483
  if (!VALID_PROVIDERS2.includes(provider.toLowerCase())) {
2409
2484
  console.log("");
2410
- console.log(chalk12.red(` \u274C Invalid provider: "${provider}"`));
2411
- console.log(chalk12.gray(` Valid providers: ${VALID_PROVIDERS2.join(", ")}`));
2485
+ console.log(ERROR8(` \u274C Invalid provider: "${provider}"`));
2486
+ console.log(MUTED10(` Valid providers: ${VALID_PROVIDERS2.join(", ")}`));
2412
2487
  console.log("");
2413
2488
  return;
2414
2489
  }
2415
2490
  const spinner = ora3({
2416
- text: chalk12.cyan(" Saving key..."),
2491
+ text: INFO10(" Saving key..."),
2417
2492
  spinner: "dots"
2418
2493
  }).start();
2419
2494
  try {
@@ -2424,21 +2499,21 @@ function registerByokCommand(program2) {
2424
2499
  });
2425
2500
  spinner.stop();
2426
2501
  console.log("");
2427
- console.log(chalk12.green(` \u2705 ${result.message}`));
2428
- console.log(chalk12.gray(` Provider: ${provider.toLowerCase()}`));
2429
- console.log(chalk12.gray(" Key stored securely on the platform."));
2502
+ console.log(SUCCESS10(` \u2705 ${result.message}`));
2503
+ console.log(MUTED10(` Provider: ${provider.toLowerCase()}`));
2504
+ console.log(MUTED10(" Key stored securely on the platform."));
2430
2505
  console.log("");
2431
2506
  } catch (error) {
2432
2507
  spinner.stop();
2433
2508
  if (error.message?.includes("ORG_USER_BLOCKED") || error.response?.data?.error?.message?.includes("ORG_USER_BLOCKED")) {
2434
2509
  console.log("");
2435
- console.log(chalk12.yellow(" \u26A0\uFE0F BYOK configuration for Organization accounts is managed by your admin."));
2436
- console.log(chalk12.gray(" Contact your administrator to update keys from the Admin Dashboard:"));
2437
- console.log(chalk12.cyan(" https://bobs-workshop.web.app/#/bobsadmindashboard"));
2510
+ console.log(WARNING9(" \u26A0\uFE0F BYOK configuration for Organization accounts is managed by your admin."));
2511
+ console.log(MUTED10(" Contact your administrator to update keys from the Admin Dashboard:"));
2512
+ console.log(INFO10(" https://bobs-workshop.web.app/#/bobsadmindashboard"));
2438
2513
  console.log("");
2439
2514
  } else {
2440
2515
  console.log("");
2441
- console.log(chalk12.red(` \u274C ${error.message || "Failed to save key."}`));
2516
+ console.log(ERROR8(` \u274C ${error.message || "Failed to save key."}`));
2442
2517
  console.log("");
2443
2518
  }
2444
2519
  }
@@ -2447,29 +2522,29 @@ function registerByokCommand(program2) {
2447
2522
  const config = getConfig();
2448
2523
  if (!config.loggedIn || !config.authToken) {
2449
2524
  console.log("");
2450
- console.log(chalk12.red(" \u274C Not logged in."));
2451
- console.log(chalk12.gray(" Run `bob login` first."));
2525
+ console.log(ERROR8(" \u274C Not logged in."));
2526
+ console.log(MUTED10(" Run `bob login` first."));
2452
2527
  console.log("");
2453
2528
  return;
2454
2529
  }
2455
2530
  if (!VALID_PROVIDERS2.includes(provider.toLowerCase())) {
2456
2531
  console.log("");
2457
- console.log(chalk12.red(` \u274C Invalid provider: "${provider}"`));
2458
- console.log(chalk12.gray(` Valid providers: ${VALID_PROVIDERS2.join(", ")}`));
2532
+ console.log(ERROR8(` \u274C Invalid provider: "${provider}"`));
2533
+ console.log(MUTED10(` Valid providers: ${VALID_PROVIDERS2.join(", ")}`));
2459
2534
  console.log("");
2460
2535
  return;
2461
2536
  }
2462
2537
  const rl = readline4.createInterface({ input: process.stdin, output: process.stdout });
2463
2538
  const answer = await new Promise((resolve2) => {
2464
- rl.question(chalk12.yellow(` Remove ${provider} key? (y/n): `), resolve2);
2539
+ rl.question(WARNING9(` Remove ${provider} key? (y/n): `), resolve2);
2465
2540
  });
2466
2541
  rl.close();
2467
2542
  if (answer.toLowerCase() !== "y" && answer.toLowerCase() !== "yes") {
2468
- console.log(chalk12.gray(" Cancelled."));
2543
+ console.log(MUTED10(" Cancelled."));
2469
2544
  return;
2470
2545
  }
2471
2546
  const spinner = ora3({
2472
- text: chalk12.cyan(" Removing key..."),
2547
+ text: INFO10(" Removing key..."),
2473
2548
  spinner: "dots"
2474
2549
  }).start();
2475
2550
  try {
@@ -2479,19 +2554,19 @@ function registerByokCommand(program2) {
2479
2554
  });
2480
2555
  spinner.stop();
2481
2556
  console.log("");
2482
- console.log(chalk12.green(` \u2705 ${result.message}`));
2557
+ console.log(SUCCESS10(` \u2705 ${result.message}`));
2483
2558
  console.log("");
2484
2559
  } catch (error) {
2485
2560
  spinner.stop();
2486
2561
  if (error.message?.includes("ORG_USER_BLOCKED") || error.response?.data?.error?.message?.includes("ORG_USER_BLOCKED")) {
2487
2562
  console.log("");
2488
- console.log(chalk12.yellow(" \u26A0\uFE0F BYOK configuration for Organization accounts is managed by your admin."));
2489
- console.log(chalk12.gray(" Contact your administrator to update keys from the Admin Dashboard:"));
2490
- console.log(chalk12.cyan(" https://bobs-workshop.web.app/#/bobsadmindashboard"));
2563
+ console.log(WARNING9(" \u26A0\uFE0F BYOK configuration for Organization accounts is managed by your admin."));
2564
+ console.log(MUTED10(" Contact your administrator to update keys from the Admin Dashboard:"));
2565
+ console.log(INFO10(" https://bobs-workshop.web.app/#/bobsadmindashboard"));
2491
2566
  console.log("");
2492
2567
  } else {
2493
2568
  console.log("");
2494
- console.log(chalk12.red(` \u274C ${error.message || "Failed to remove key."}`));
2569
+ console.log(ERROR8(` \u274C ${error.message || "Failed to remove key."}`));
2495
2570
  console.log("");
2496
2571
  }
2497
2572
  }
@@ -2500,13 +2575,13 @@ function registerByokCommand(program2) {
2500
2575
  const config = getConfig();
2501
2576
  if (!config.loggedIn || !config.authToken) {
2502
2577
  console.log("");
2503
- console.log(chalk12.red(" \u274C Not logged in."));
2504
- console.log(chalk12.gray(" Run `bob login` first."));
2578
+ console.log(ERROR8(" \u274C Not logged in."));
2579
+ console.log(MUTED10(" Run `bob login` first."));
2505
2580
  console.log("");
2506
2581
  return;
2507
2582
  }
2508
2583
  const spinner = ora3({
2509
- text: chalk12.cyan(" Checking BYOK status..."),
2584
+ text: INFO10(" Checking BYOK status..."),
2510
2585
  spinner: "dots"
2511
2586
  }).start();
2512
2587
  try {
@@ -2516,31 +2591,31 @@ function registerByokCommand(program2) {
2516
2591
  spinner.stop();
2517
2592
  const keys = result.keys || [];
2518
2593
  console.log("");
2519
- console.log(chalk12.bold(" \u{1F511} BYOK Status"));
2520
- console.log(chalk12.gray(" \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));
2594
+ console.log(chalk13.bold(BRAND_SECONDARY9(" \u{1F511} BYOK Status")));
2595
+ console.log(MUTED10(" \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));
2521
2596
  if (keys.length === 0) {
2522
- console.log(chalk12.gray(" No keys configured."));
2523
- console.log(chalk12.gray(" Run `bob byok set <provider> <key>` to add one."));
2597
+ console.log(MUTED10(" No keys configured."));
2598
+ console.log(MUTED10(" Run `bob byok set <provider> <key>` to add one."));
2524
2599
  } else {
2525
2600
  for (const key of keys) {
2526
- const statusIcon = key.isActive ? chalk12.green("\u25CF") : chalk12.red("\u25CB");
2527
- const statusText = key.isActive ? chalk12.green("Active") : chalk12.red("Inactive");
2528
- console.log(` ${statusIcon} ${chalk12.cyan(key.provider.padEnd(12))} ${statusText} (via ${key.source})`);
2601
+ const statusIcon = key.isActive ? SUCCESS10("\u25CF") : ERROR8("\u25CB");
2602
+ const statusText = key.isActive ? SUCCESS10("Active") : ERROR8("Inactive");
2603
+ console.log(` ${statusIcon} ${INFO10(key.provider.padEnd(12))} ${statusText} (via ${key.source})`);
2529
2604
  }
2530
2605
  }
2531
- console.log(chalk12.gray(" \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));
2606
+ console.log(MUTED10(" \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));
2532
2607
  console.log("");
2533
2608
  } catch (error) {
2534
2609
  spinner.stop();
2535
2610
  if (error.message?.includes("ORG_USER_BLOCKED") || error.response?.data?.error?.message?.includes("ORG_USER_BLOCKED")) {
2536
2611
  console.log("");
2537
- console.log(chalk12.yellow(" \u26A0\uFE0F BYOK configuration for Organization accounts is managed by your admin."));
2538
- console.log(chalk12.gray(" Contact your administrator to update keys from the Admin Dashboard:"));
2539
- console.log(chalk12.cyan(" https://bobs-workshop.web.app/#/bobsadmindashboard"));
2612
+ console.log(WARNING9(" \u26A0\uFE0F BYOK configuration for Organization accounts is managed by your admin."));
2613
+ console.log(MUTED10(" Contact your administrator to update keys from the Admin Dashboard:"));
2614
+ console.log(INFO10(" https://bobs-workshop.web.app/#/bobsadmindashboard"));
2540
2615
  console.log("");
2541
2616
  } else {
2542
2617
  console.log("");
2543
- console.log(chalk12.red(` \u274C ${error.message || "Failed to check status."}`));
2618
+ console.log(ERROR8(` \u274C ${error.message || "Failed to check status."}`));
2544
2619
  console.log("");
2545
2620
  }
2546
2621
  }
@@ -2548,43 +2623,43 @@ function registerByokCommand(program2) {
2548
2623
  }
2549
2624
 
2550
2625
  // src/commands/conversations.ts
2551
- import chalk13 from "chalk";
2626
+ import chalk14 from "chalk";
2552
2627
  import ora4 from "ora";
2553
2628
  import * as readline5 from "readline";
2554
- var BRAND_PRIMARY5 = chalk13.hex("#E66F24");
2555
- var BRAND_SECONDARY7 = chalk13.hex("#FFAB00");
2556
- var SUCCESS7 = chalk13.hex("#66BB6A");
2557
- var INFO7 = chalk13.hex("#26C6DA");
2558
- var WARNING6 = chalk13.hex("#FFC107");
2559
- var ERROR6 = chalk13.hex("#EF5350");
2560
- var MUTED7 = chalk13.hex("#78909C");
2561
- var BORDER2 = chalk13.hex("#455A64");
2562
- var MODE_CONSULTANT5 = chalk13.hex("#AB47BC");
2563
- var MODE_DEEPDIVE4 = chalk13.hex("#0097A7");
2564
- var MODE_PERSONALIZATION = chalk13.hex("#CE93D8");
2565
- var ACTIVE_BG = chalk13.bgHex("#1A2E1A");
2566
- var ACTIVE_INDICATOR = SUCCESS7("\u25B6");
2629
+ var BRAND_PRIMARY6 = chalk14.hex("#E66F24");
2630
+ var BRAND_SECONDARY10 = chalk14.hex("#FFAB00");
2631
+ var SUCCESS11 = chalk14.hex("#66BB6A");
2632
+ var INFO11 = chalk14.hex("#26C6DA");
2633
+ var WARNING10 = chalk14.hex("#FFC107");
2634
+ var ERROR9 = chalk14.hex("#EF5350");
2635
+ var MUTED11 = chalk14.hex("#78909C");
2636
+ var BORDER2 = chalk14.hex("#455A64");
2637
+ var MODE_CONSULTANT5 = chalk14.hex("#AB47BC");
2638
+ var MODE_DEEPDIVE4 = chalk14.hex("#0097A7");
2639
+ var MODE_PERSONALIZATION = chalk14.hex("#CE93D8");
2640
+ var ACTIVE_BG = chalk14.bgHex("#1A2E1A");
2641
+ var ACTIVE_INDICATOR = SUCCESS11("\u25B6");
2567
2642
  function getModeIcon(convo) {
2568
2643
  if (convo.mode === "consultant") return MODE_CONSULTANT5("\u25C6");
2569
2644
  if (convo.mode === "personalized") return MODE_PERSONALIZATION("\u25C6");
2570
2645
  if (convo.mode === "deepdive") return MODE_DEEPDIVE4("\u25C6");
2571
- return INFO7("\u25C6");
2646
+ return INFO11("\u25C6");
2572
2647
  }
2573
2648
  function getSourceIcon(source) {
2574
- return source === "cli" ? MUTED7("\u2328") : MUTED7("\u{1F310}");
2649
+ return source === "cli" ? MUTED11("\u2328") : MUTED11("\u{1F310}");
2575
2650
  }
2576
2651
  function registerConversationsCommand(program2) {
2577
2652
  const convosCmd = program2.command("conversations").description("List, search, and join existing conversations").option("-p, --page <number>", "Page number", "1").option("-s, --search <query>", "Search conversations by title or content").action(async (options) => {
2578
2653
  const config = getConfig();
2579
2654
  if (!config.loggedIn || !config.authToken) {
2580
2655
  console.log("");
2581
- console.log(ERROR6(" \u274C Not logged in."));
2582
- console.log(MUTED7(" Run `bob login` first."));
2656
+ console.log(ERROR9(" \u274C Not logged in."));
2657
+ console.log(MUTED11(" Run `bob login` first."));
2583
2658
  console.log("");
2584
2659
  return;
2585
2660
  }
2586
2661
  const spinner = ora4({
2587
- text: INFO7(" Loading conversations..."),
2662
+ text: INFO11(" Loading conversations..."),
2588
2663
  spinner: "dots"
2589
2664
  }).start();
2590
2665
  try {
@@ -2597,9 +2672,9 @@ function registerConversationsCommand(program2) {
2597
2672
  const conversations = result.conversations || [];
2598
2673
  if (conversations.length === 0) {
2599
2674
  console.log("");
2600
- console.log(WARNING6(" \u26A0\uFE0F No conversations found."));
2675
+ console.log(WARNING10(" \u26A0\uFE0F No conversations found."));
2601
2676
  if (options.search) {
2602
- console.log(MUTED7(` Search: "${options.search}"`));
2677
+ console.log(MUTED11(` Search: "${options.search}"`));
2603
2678
  }
2604
2679
  console.log("");
2605
2680
  return;
@@ -2608,7 +2683,7 @@ function registerConversationsCommand(program2) {
2608
2683
  } catch (error) {
2609
2684
  spinner.stop();
2610
2685
  console.log("");
2611
- console.log(ERROR6(` \u274C ${error.message}`));
2686
+ console.log(ERROR9(` \u274C ${error.message}`));
2612
2687
  console.log("");
2613
2688
  }
2614
2689
  });
@@ -2616,13 +2691,13 @@ function registerConversationsCommand(program2) {
2616
2691
  const config = getConfig();
2617
2692
  if (!config.loggedIn || !config.authToken) {
2618
2693
  console.log("");
2619
- console.log(ERROR6(" \u274C Not logged in."));
2620
- console.log(MUTED7(" Run `bob login` first."));
2694
+ console.log(ERROR9(" \u274C Not logged in."));
2695
+ console.log(MUTED11(" Run `bob login` first."));
2621
2696
  console.log("");
2622
2697
  return;
2623
2698
  }
2624
2699
  const spinner = ora4({
2625
- text: INFO7(" Loading conversations..."),
2700
+ text: INFO11(" Loading conversations..."),
2626
2701
  spinner: "dots"
2627
2702
  }).start();
2628
2703
  try {
@@ -2635,38 +2710,38 @@ function registerConversationsCommand(program2) {
2635
2710
  const conversations = result.conversations || [];
2636
2711
  if (conversations.length === 0) {
2637
2712
  console.log("");
2638
- console.log(WARNING6(" \u26A0\uFE0F No conversations found."));
2713
+ console.log(WARNING10(" \u26A0\uFE0F No conversations found."));
2639
2714
  console.log("");
2640
2715
  return;
2641
2716
  }
2642
2717
  renderConversationList(conversations, config.conversationId, options.search, result, true);
2643
2718
  const rl = readline5.createInterface({ input: process.stdin, output: process.stdout });
2644
2719
  const answer = await new Promise((resolve2) => {
2645
- rl.question(INFO7(" Select (1-" + conversations.length + ") or 0 to cancel: "), resolve2);
2720
+ rl.question(INFO11(" Select (1-" + conversations.length + ") or 0 to cancel: "), resolve2);
2646
2721
  });
2647
2722
  rl.close();
2648
2723
  const selection = parseInt(answer.trim());
2649
2724
  if (isNaN(selection) || selection === 0) {
2650
- console.log(MUTED7(" Cancelled."));
2725
+ console.log(MUTED11(" Cancelled."));
2651
2726
  console.log("");
2652
2727
  return;
2653
2728
  }
2654
2729
  if (selection < 1 || selection > conversations.length) {
2655
- console.log(ERROR6(" \u274C Invalid selection."));
2730
+ console.log(ERROR9(" \u274C Invalid selection."));
2656
2731
  console.log("");
2657
2732
  return;
2658
2733
  }
2659
2734
  const selected = conversations[selection - 1];
2660
2735
  setConfigValue("conversationId", selected.id);
2661
2736
  console.log("");
2662
- console.log(SUCCESS7(` \u2705 Joined: "${selected.title}"`));
2663
- console.log(MUTED7(` Session ID: ${selected.id}`));
2664
- console.log(MUTED7(" Your next `bob chat` message will continue this conversation."));
2737
+ console.log(SUCCESS11(` \u2705 Joined: "${selected.title}"`));
2738
+ console.log(MUTED11(` Session ID: ${selected.id}`));
2739
+ console.log(MUTED11(" Your next `bob chat` message will continue this conversation."));
2665
2740
  console.log("");
2666
2741
  } catch (error) {
2667
2742
  spinner.stop();
2668
2743
  console.log("");
2669
- console.log(ERROR6(` \u274C ${error.message}`));
2744
+ console.log(ERROR9(` \u274C ${error.message}`));
2670
2745
  console.log("");
2671
2746
  }
2672
2747
  });
@@ -2674,19 +2749,19 @@ function registerConversationsCommand(program2) {
2674
2749
  function renderConversationList(conversations, activeConvoId, search, result, isJoinMode = false) {
2675
2750
  const groups = groupByTime(conversations);
2676
2751
  console.log("");
2677
- console.log(BRAND_SECONDARY7(` \u{1F4AC} ${isJoinMode ? "Select a Conversation" : "Your Conversations"}`) + MUTED7(` (${result.total || conversations.length} total)`));
2752
+ console.log(BRAND_SECONDARY10(` \u{1F4AC} ${isJoinMode ? "Select a Conversation" : "Your Conversations"}`) + MUTED11(` (${result.total || conversations.length} total)`));
2678
2753
  if (search) {
2679
- console.log(MUTED7(` Search: "${search}"`));
2754
+ console.log(MUTED11(` Search: "${search}"`));
2680
2755
  }
2681
- console.log(MUTED7(" \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));
2756
+ console.log(MUTED11(" \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));
2682
2757
  console.log("");
2683
- console.log(MUTED7(" # Title Source Time Meta"));
2684
- console.log(MUTED7(" \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));
2758
+ console.log(MUTED11(" # Title Source Time Meta"));
2759
+ console.log(MUTED11(" \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));
2685
2760
  let globalIndex = 0;
2686
2761
  for (const group of groups) {
2687
2762
  if (group.conversations.length === 0) continue;
2688
2763
  console.log("");
2689
- console.log(BRAND_SECONDARY7(` \u250C\u2500 ${group.label}`));
2764
+ console.log(BRAND_SECONDARY10(` \u250C\u2500 ${group.label}`));
2690
2765
  console.log("");
2691
2766
  for (const convo of group.conversations) {
2692
2767
  globalIndex++;
@@ -2695,17 +2770,17 @@ function renderConversationList(conversations, activeConvoId, search, result, is
2695
2770
  }
2696
2771
  }
2697
2772
  console.log("");
2698
- console.log(MUTED7(" \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));
2773
+ console.log(MUTED11(" \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));
2699
2774
  if (result.totalPages && result.totalPages > 1) {
2700
- console.log(MUTED7(` Page ${result.page}/${result.totalPages}`));
2775
+ console.log(MUTED11(` Page ${result.page}/${result.totalPages}`));
2701
2776
  if (result.page < result.totalPages) {
2702
- console.log(MUTED7(` \u25B8 bob conversations --page ${result.page + 1}`));
2777
+ console.log(MUTED11(` \u25B8 bob conversations --page ${result.page + 1}`));
2703
2778
  }
2704
2779
  }
2705
2780
  if (!isJoinMode) {
2706
2781
  console.log("");
2707
- console.log(MUTED7(" \u25B8 bob conversations join \u2014 Pick a conversation to continue"));
2708
- console.log(MUTED7(' \u25B8 bob conversations -s "q" \u2014 Search by keyword'));
2782
+ console.log(MUTED11(" \u25B8 bob conversations join \u2014 Pick a conversation to continue"));
2783
+ console.log(MUTED11(' \u25B8 bob conversations -s "q" \u2014 Search by keyword'));
2709
2784
  }
2710
2785
  console.log("");
2711
2786
  }
@@ -2715,14 +2790,14 @@ function renderConversationTile(convo, index, isActive) {
2715
2790
  const timeAgo = convo.lastUpdated ? getTimeAgo(convo.lastUpdated) : "?";
2716
2791
  const title = (convo.title || "Untitled").slice(0, 38);
2717
2792
  const paddedTitle = title + (title.length < 38 ? " ".repeat(38 - title.length) : "");
2718
- const msgCount = convo.messageCount ? MUTED7(`${convo.messageCount}\u{1F4AC}`) : "";
2719
- const forkCount = convo.forkCount ? BRAND_SECONDARY7(`${convo.forkCount}\u{1F374}`) : "";
2720
- const projectIcon = convo.hasProject ? SUCCESS7("\u{1F4C1}") : "";
2793
+ const msgCount = convo.messageCount ? MUTED11(`${convo.messageCount}\u{1F4AC}`) : "";
2794
+ const forkCount = convo.forkCount ? BRAND_SECONDARY10(`${convo.forkCount}\u{1F374}`) : "";
2795
+ const projectIcon = convo.hasProject ? SUCCESS11("\u{1F4C1}") : "";
2721
2796
  const meta = [msgCount, forkCount, projectIcon].filter(Boolean).join(" ");
2722
2797
  const indicator = isActive ? ACTIVE_INDICATOR : " ";
2723
- const numStr = INFO7(String(index).padStart(2));
2724
- const timeStr = MUTED7(timeAgo.padEnd(8));
2725
- const line = ` ${indicator} ${numStr}. ${modeIcon} ${chalk13.white(paddedTitle)} ${sourceIcon} ${timeStr} ${meta}`;
2798
+ const numStr = INFO11(String(index).padStart(2));
2799
+ const timeStr = MUTED11(timeAgo.padEnd(8));
2800
+ const line = ` ${indicator} ${numStr}. ${modeIcon} ${chalk14.white(paddedTitle)} ${sourceIcon} ${timeStr} ${meta}`;
2726
2801
  if (isActive) {
2727
2802
  console.log(ACTIVE_BG(line));
2728
2803
  } else {
@@ -2768,10 +2843,10 @@ function getTimeAgo(isoDate) {
2768
2843
  }
2769
2844
 
2770
2845
  // src/commands/fork.ts
2771
- import chalk15 from "chalk";
2846
+ import chalk16 from "chalk";
2772
2847
 
2773
2848
  // src/ui/animations/fork-split.ts
2774
- import chalk14 from "chalk";
2849
+ import chalk15 from "chalk";
2775
2850
  var FRAME_DELAY_MS = 350;
2776
2851
  var FRAMES = [
2777
2852
  `
@@ -2856,7 +2931,7 @@ function renderFrame2(frame) {
2856
2931
  for (let i = lines.length; i < FRAME_HEIGHT2; i++) {
2857
2932
  console.log("");
2858
2933
  }
2859
- console.log(chalk14.magenta(" \u26A1 Fork initializing..."));
2934
+ console.log(chalk15.magenta(" \u26A1 Fork initializing..."));
2860
2935
  console.log("");
2861
2936
  }
2862
2937
  function renderFinalFrame(parentTitle, forkTitle) {
@@ -2866,12 +2941,12 @@ function renderFinalFrame(parentTitle, forkTitle) {
2866
2941
  process.stdout.write("\x1B[2K\n");
2867
2942
  }
2868
2943
  process.stdout.write(`\x1B[${totalHeight}A`);
2869
- console.log(chalk14.gray(" \u{1F374}"));
2870
- console.log(chalk14.gray(" \u2571 \u2572"));
2871
- console.log(` ${chalk14.green("\u25CB")} ${chalk14.gray(truncate(parentTitle, 18))} ${chalk14.magenta("\u26A1")} ${chalk14.bold(truncate(forkTitle, 18))}`);
2872
- console.log(chalk14.gray(" \u2571 \u2572"));
2873
- console.log(chalk14.gray(" \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));
2874
- console.log(chalk14.green(" \u2705 Fork created!"));
2944
+ console.log(chalk15.gray(" \u{1F374}"));
2945
+ console.log(chalk15.gray(" \u2571 \u2572"));
2946
+ console.log(` ${chalk15.green("\u25CB")} ${chalk15.gray(truncate(parentTitle, 18))} ${chalk15.magenta("\u26A1")} ${chalk15.bold(truncate(forkTitle, 18))}`);
2947
+ console.log(chalk15.gray(" \u2571 \u2572"));
2948
+ console.log(chalk15.gray(" \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));
2949
+ console.log(chalk15.green(" \u2705 Fork created!"));
2875
2950
  console.log("");
2876
2951
  console.log("");
2877
2952
  }
@@ -2883,27 +2958,35 @@ function sleep4(ms) {
2883
2958
  }
2884
2959
 
2885
2960
  // src/commands/fork.ts
2961
+ var BRAND_PRIMARY7 = chalk16.hex("#E66F24");
2962
+ var BRAND_SECONDARY11 = chalk16.hex("#FFAB00");
2963
+ var SUCCESS12 = chalk16.hex("#66BB6A");
2964
+ var INFO12 = chalk16.hex("#26C6DA");
2965
+ var WARNING11 = chalk16.hex("#FFC107");
2966
+ var ERROR10 = chalk16.hex("#EF5350");
2967
+ var MUTED12 = chalk16.hex("#78909C");
2968
+ var MODE_CONSULTANT6 = chalk16.hex("#AB47BC");
2886
2969
  function registerForkCommand(program2) {
2887
2970
  program2.command("fork <title>").description("Fork the current conversation into a focused sub-project").action(async (title) => {
2888
2971
  const config = getConfig();
2889
2972
  if (!config.loggedIn || !config.authToken) {
2890
2973
  console.log("");
2891
- console.log(chalk15.red(" \u274C Not logged in. Forks require Tier 3 (platform)."));
2892
- console.log(chalk15.gray(" Run `bob login` to authenticate."));
2974
+ console.log(ERROR10(" \u274C Not logged in. Forks require Tier 3 (platform)."));
2975
+ console.log(MUTED12(" Run `bob login` to authenticate."));
2893
2976
  console.log("");
2894
2977
  return;
2895
2978
  }
2896
2979
  if (!config.conversationId) {
2897
2980
  console.log("");
2898
- console.log(chalk15.red(" \u274C No active conversation to fork from."));
2899
- console.log(chalk15.gray(" Start a conversation first with `bob chat`, or join one with `bob conversations join`."));
2981
+ console.log(ERROR10(" \u274C No active conversation to fork from."));
2982
+ console.log(MUTED12(" Start a conversation first with `bob chat`, or join one with `bob conversations join`."));
2900
2983
  console.log("");
2901
2984
  return;
2902
2985
  }
2903
2986
  const parentConvoId = config.conversationId;
2904
2987
  console.log("");
2905
- console.log(chalk15.bold.magenta(` \u26A1 Forking: "${title}"`));
2906
- console.log(chalk15.gray(` From: ${parentConvoId.slice(0, 24)}...`));
2988
+ console.log(chalk16.bold(MODE_CONSULTANT6(` \u26A1 Forking: "${title}"`)));
2989
+ console.log(MUTED12(` From: ${parentConvoId.slice(0, 24)}...`));
2907
2990
  console.log("");
2908
2991
  const forkPromise = callCloudFunction("createConversationFork", {
2909
2992
  parentConversationId: parentConvoId,
@@ -2919,39 +3002,39 @@ function registerForkCommand(program2) {
2919
3002
  if (result?.conversationId) {
2920
3003
  setConfigValue("conversationId", result.conversationId);
2921
3004
  console.log("");
2922
- console.log(chalk15.green(` \u2705 Fork created: "${title}"`));
2923
- console.log(chalk15.gray(` Session: ${result.conversationId.slice(0, 24)}...`));
2924
- console.log(chalk15.gray(" Your next `bob chat` message continues in this fork."));
2925
- console.log(chalk15.gray(` \u{1F517} https://bobs-workshop.web.app/#/bobcodeassistant/${result.conversationId}`));
3005
+ console.log(SUCCESS12(` \u2705 Fork created: "${title}"`));
3006
+ console.log(MUTED12(` Session: ${result.conversationId.slice(0, 24)}...`));
3007
+ console.log(MUTED12(" Your next `bob chat` message continues in this fork."));
3008
+ console.log(MUTED12(` \u{1F517} https://bobs-workshop.web.app/#/bobcodeassistant/${result.conversationId}`));
2926
3009
  console.log("");
2927
3010
  if (result.kickstartMessage) {
2928
- console.log(chalk15.gray(" \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));
2929
- console.log(chalk15.bold.cyan(" \u{1F916} Bob:"));
3011
+ console.log(MUTED12(" \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));
3012
+ console.log(chalk16.bold(INFO12(" \u{1F916} Bob:")));
2930
3013
  console.log("");
2931
3014
  for (const line of result.kickstartMessage.split("\n")) {
2932
3015
  console.log(` ${line}`);
2933
3016
  }
2934
3017
  console.log("");
2935
- console.log(chalk15.gray(" \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));
3018
+ console.log(MUTED12(" \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));
2936
3019
  console.log("");
2937
3020
  }
2938
3021
  if (result.keyPoints && result.keyPoints.length > 0) {
2939
- console.log(chalk15.gray(" \u{1F4CB} Context carried forward:"));
3022
+ console.log(MUTED12(" \u{1F4CB} Context carried forward:"));
2940
3023
  for (const point of result.keyPoints.slice(0, 4)) {
2941
- console.log(chalk15.gray(` \u2022 ${point}`));
3024
+ console.log(MUTED12(` \u2022 ${point}`));
2942
3025
  }
2943
3026
  console.log("");
2944
3027
  }
2945
3028
  } else {
2946
3029
  console.log("");
2947
- console.log(chalk15.red(" \u274C Fork failed \u2014 no conversation ID returned."));
3030
+ console.log(ERROR10(" \u274C Fork failed \u2014 no conversation ID returned."));
2948
3031
  console.log("");
2949
3032
  }
2950
3033
  } catch (error) {
2951
3034
  animation.stop();
2952
3035
  await new Promise((resolve2) => setTimeout(resolve2, 200));
2953
3036
  console.log("");
2954
- console.log(chalk15.red(` \u274C Fork failed: ${error.message}`));
3037
+ console.log(ERROR10(` \u274C Fork failed: ${error.message}`));
2955
3038
  console.log("");
2956
3039
  }
2957
3040
  });
@@ -2959,62 +3042,62 @@ function registerForkCommand(program2) {
2959
3042
  const config = getConfig();
2960
3043
  if (!config.loggedIn || !config.authToken) {
2961
3044
  console.log("");
2962
- console.log(chalk15.red(" \u274C Not logged in."));
3045
+ console.log(ERROR10(" \u274C Not logged in."));
2963
3046
  console.log("");
2964
3047
  return;
2965
3048
  }
2966
3049
  if (!config.conversationId) {
2967
3050
  console.log("");
2968
- console.log(chalk15.red(" \u274C No active conversation."));
3051
+ console.log(ERROR10(" \u274C No active conversation."));
2969
3052
  console.log("");
2970
3053
  return;
2971
3054
  }
2972
3055
  console.log("");
2973
- console.log(chalk15.bold.magenta(" \u{1F500} Loading forks..."));
3056
+ console.log(chalk16.bold(MODE_CONSULTANT6(" \u{1F500} Loading forks...")));
2974
3057
  try {
2975
3058
  const result = await callCloudFunction("listConversationForks", {
2976
3059
  conversationId: config.conversationId
2977
3060
  });
2978
3061
  const forks = result.forks || [];
2979
3062
  console.log("");
2980
- console.log(chalk15.bold.magenta(" \u{1F500} Forks"));
2981
- console.log(chalk15.gray(" \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));
3063
+ console.log(chalk16.bold(MODE_CONSULTANT6(" \u{1F500} Forks")));
3064
+ console.log(MUTED12(" \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));
2982
3065
  if (forks.length === 0) {
2983
- console.log(chalk15.gray(" No forks yet."));
2984
- console.log(chalk15.gray(' Run `bob fork "title"` to create one.'));
3066
+ console.log(MUTED12(" No forks yet."));
3067
+ console.log(MUTED12(' Run `bob fork "title"` to create one.'));
2985
3068
  } else {
2986
3069
  for (const fork of forks) {
2987
- console.log(` ${chalk15.magenta("\u26A1")} ${chalk15.white(fork.title || "Untitled")}`);
2988
- console.log(chalk15.gray(` ${fork.summary?.slice(0, 60) || "No summary"}${fork.summary?.length > 60 ? "..." : ""}`));
2989
- console.log(chalk15.gray(` ID: ${fork.forkConversationId?.slice(0, 24) || fork.id.slice(0, 24)}...`));
3070
+ console.log(` ${MODE_CONSULTANT6("\u26A1")} ${chalk16.white(fork.title || "Untitled")}`);
3071
+ console.log(MUTED12(` ${fork.summary?.slice(0, 60) || "No summary"}${fork.summary?.length > 60 ? "..." : ""}`));
3072
+ console.log(MUTED12(` ID: ${fork.forkConversationId?.slice(0, 24) || fork.id.slice(0, 24)}...`));
2990
3073
  console.log("");
2991
3074
  }
2992
3075
  }
2993
- console.log(chalk15.gray(" \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));
2994
- console.log(chalk15.gray(" Join a fork: bob conversations join \u2192 select it"));
3076
+ console.log(MUTED12(" \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));
3077
+ console.log(MUTED12(" Join a fork: bob conversations join \u2192 select it"));
2995
3078
  console.log("");
2996
3079
  } catch (error) {
2997
3080
  console.log("");
2998
- console.log(chalk15.red(` \u274C ${error.message}`));
3081
+ console.log(ERROR10(` \u274C ${error.message}`));
2999
3082
  console.log("");
3000
3083
  }
3001
3084
  });
3002
3085
  }
3003
3086
 
3004
3087
  // src/commands/analyse.ts
3005
- import chalk16 from "chalk";
3088
+ import chalk17 from "chalk";
3006
3089
  import ora5 from "ora";
3007
3090
  import * as fs8 from "fs";
3008
3091
  import * as path9 from "path";
3009
- var BRAND_PRIMARY6 = chalk16.hex("#E66F24");
3010
- var BRAND_SECONDARY8 = chalk16.hex("#FFAB00");
3011
- var SUCCESS8 = chalk16.hex("#66BB6A");
3012
- var INFO8 = chalk16.hex("#26C6DA");
3013
- var WARNING7 = chalk16.hex("#FFC107");
3014
- var ERROR7 = chalk16.hex("#EF5350");
3015
- var MUTED8 = chalk16.hex("#78909C");
3016
- var MODE_CONSULTANT6 = chalk16.hex("#AB47BC");
3017
- var BORDER3 = chalk16.hex("#455A64");
3092
+ var BRAND_PRIMARY8 = chalk17.hex("#E66F24");
3093
+ var BRAND_SECONDARY12 = chalk17.hex("#FFAB00");
3094
+ var SUCCESS13 = chalk17.hex("#66BB6A");
3095
+ var INFO13 = chalk17.hex("#26C6DA");
3096
+ var WARNING12 = chalk17.hex("#FFC107");
3097
+ var ERROR11 = chalk17.hex("#EF5350");
3098
+ var MUTED13 = chalk17.hex("#78909C");
3099
+ var MODE_CONSULTANT7 = chalk17.hex("#AB47BC");
3100
+ var BORDER3 = chalk17.hex("#455A64");
3018
3101
  function registerAnalyseCommand(program2) {
3019
3102
  program2.command("analyse").description("Analyse the current project for bugs, features, improvements, and upgrades").option("--results", "Show analysis dashboard or filtered list").option("--bugs", "Show bugs list (interactive)").option("--features", "Show features list (interactive)").option("--improvements", "Show improvements list (interactive)").option("--upgrades", "Show upgrades list (interactive)").option("--sort <method>", "Sort by: priority (default) or file").option("--search <query>", "Filter results by keyword").option("--status", "Show current analysis job status").option("--auto", "Auto-fix mode: Bob triages and MiniBob implements").option("--confidence <number>", "Confidence gate for auto-fix (default: 90)", "90").option("--priority <level>", "Priority gate for auto-fix: critical, high, medium, low (default: critical)", "critical").action(async (options) => {
3020
3103
  const config = getConfig();
@@ -3084,21 +3167,21 @@ function row(content) {
3084
3167
  return BORDER3(" \u2551") + content + (pad3 > 0 ? " ".repeat(pad3) : "") + BORDER3("\u2551");
3085
3168
  }
3086
3169
  async function showDashboard() {
3087
- const spinner = ora5({ text: INFO8(" Loading analysis results..."), spinner: "dots" }).start();
3170
+ const spinner = ora5({ text: INFO13(" Loading analysis results..."), spinner: "dots" }).start();
3088
3171
  try {
3089
3172
  const counts = loadLocalCounts();
3090
3173
  spinner.stop();
3091
3174
  if (!counts) {
3092
3175
  console.log("");
3093
- console.log(WARNING7(" \u26A0\uFE0F No analysis results found."));
3094
- console.log(MUTED8(" Run `bob analyse` first to analyse your project."));
3176
+ console.log(WARNING12(" \u26A0\uFE0F No analysis results found."));
3177
+ console.log(MUTED13(" Run `bob analyse` first to analyse your project."));
3095
3178
  console.log("");
3096
3179
  return;
3097
3180
  }
3098
3181
  renderAnalysisDashboard(counts);
3099
3182
  } catch (error) {
3100
3183
  spinner.stop();
3101
- console.log(ERROR7(` \u274C ${error.message}`));
3184
+ console.log(ERROR11(` \u274C ${error.message}`));
3102
3185
  console.log("");
3103
3186
  }
3104
3187
  }
@@ -3109,55 +3192,55 @@ function renderAnalysisDashboard(counts) {
3109
3192
  const completionPercent = totalFound === 0 ? 100 : Math.round(addressed / totalFound * 100);
3110
3193
  console.log("");
3111
3194
  console.log(topRule());
3112
- console.log(row(BRAND_SECONDARY8(" \u25C6 MINIBOB ANALYSIS DASHBOARD")));
3195
+ console.log(row(BRAND_SECONDARY12(" \u25C6 MINIBOB ANALYSIS DASHBOARD")));
3113
3196
  console.log(midRule());
3114
3197
  console.log(row(""));
3115
- const bugLabel = ERROR7(` \u{1F534} BUGS`);
3116
- const featLabel = MODE_CONSULTANT6(` \u{1F7E3} FEATURES`);
3117
- const imprLabel = INFO8(` \u{1F535} IMPROVEMENTS`);
3118
- const upgrLabel = SUCCESS8(` \u{1F7E2} UPGRADES`);
3198
+ const bugLabel = ERROR11(` \u{1F534} BUGS`);
3199
+ const featLabel = MODE_CONSULTANT7(` \u{1F7E3} FEATURES`);
3200
+ const imprLabel = INFO13(` \u{1F535} IMPROVEMENTS`);
3201
+ const upgrLabel = SUCCESS13(` \u{1F7E2} UPGRADES`);
3119
3202
  console.log(row(bugLabel + " " + featLabel + " " + imprLabel + " " + upgrLabel));
3120
3203
  console.log(row(""));
3121
- const bugCount = ERROR7(String(counts.bugs).padStart(6));
3122
- const featCount = MODE_CONSULTANT6(String(counts.features).padStart(6));
3123
- const imprCount = INFO8(String(counts.improvements).padStart(6));
3124
- const upgrCount = SUCCESS8(String(counts.upgrades).padStart(6));
3204
+ const bugCount = ERROR11(String(counts.bugs).padStart(6));
3205
+ const featCount = MODE_CONSULTANT7(String(counts.features).padStart(6));
3206
+ const imprCount = INFO13(String(counts.improvements).padStart(6));
3207
+ const upgrCount = SUCCESS13(String(counts.upgrades).padStart(6));
3125
3208
  console.log(row(bugCount + " " + featCount + " " + imprCount + " " + upgrCount));
3126
3209
  console.log(row(""));
3127
3210
  const barWidth = 50;
3128
3211
  const filled = Math.round(completionPercent / 100 * barWidth);
3129
3212
  const empty = barWidth - filled;
3130
3213
  let barColor;
3131
- if (completionPercent >= 75) barColor = chalk16.hex("#66BB6A");
3132
- else if (completionPercent >= 50) barColor = chalk16.hex("#FFAB00");
3133
- else if (completionPercent >= 25) barColor = chalk16.hex("#E66F24");
3134
- else barColor = chalk16.hex("#EF5350");
3135
- const progressBar = barColor("\u2588".repeat(filled)) + chalk16.hex("#333333")("\u2591".repeat(empty));
3214
+ if (completionPercent >= 75) barColor = chalk17.hex("#66BB6A");
3215
+ else if (completionPercent >= 50) barColor = chalk17.hex("#FFAB00");
3216
+ else if (completionPercent >= 25) barColor = chalk17.hex("#E66F24");
3217
+ else barColor = chalk17.hex("#EF5350");
3218
+ const progressBar = barColor("\u2588".repeat(filled)) + chalk17.hex("#333333")("\u2591".repeat(empty));
3136
3219
  console.log(row(` Progress: [${progressBar}] ${barColor(completionPercent + "%")}`));
3137
- console.log(row(MUTED8(` ${addressed} addressed \xB7 ${total} remaining`)));
3220
+ console.log(row(MUTED13(` ${addressed} addressed \xB7 ${total} remaining`)));
3138
3221
  console.log(row(""));
3139
3222
  console.log(botRule());
3140
3223
  console.log("");
3141
- console.log(MUTED8(" View details (interactive):"));
3142
- console.log(MUTED8(" \u25B8 bob analyse --bugs"));
3143
- console.log(MUTED8(" \u25B8 bob analyse --features"));
3144
- console.log(MUTED8(" \u25B8 bob analyse --improvements"));
3145
- console.log(MUTED8(" \u25B8 bob analyse --upgrades"));
3224
+ console.log(MUTED13(" View details (interactive):"));
3225
+ console.log(MUTED13(" \u25B8 bob analyse --bugs"));
3226
+ console.log(MUTED13(" \u25B8 bob analyse --features"));
3227
+ console.log(MUTED13(" \u25B8 bob analyse --improvements"));
3228
+ console.log(MUTED13(" \u25B8 bob analyse --upgrades"));
3146
3229
  console.log("");
3147
- console.log(MUTED8(" Auto-fix:"));
3148
- console.log(MUTED8(" \u25B8 bob analyse --auto"));
3149
- console.log(MUTED8(" \u25B8 bob analyse --auto --bugs --confidence 80"));
3150
- console.log(MUTED8(" \u25B8 bob analyse --auto --priority high"));
3230
+ console.log(MUTED13(" Auto-fix:"));
3231
+ console.log(MUTED13(" \u25B8 bob analyse --auto"));
3232
+ console.log(MUTED13(" \u25B8 bob analyse --auto --bugs --confidence 80"));
3233
+ console.log(MUTED13(" \u25B8 bob analyse --auto --priority high"));
3151
3234
  console.log("");
3152
3235
  }
3153
3236
  async function showStatus(config) {
3154
3237
  if (!config.loggedIn || !config.authToken || !config.conversationId) {
3155
3238
  console.log("");
3156
- console.log(WARNING7(" \u26A0\uFE0F Status check requires Tier 3 with an active conversation."));
3239
+ console.log(WARNING12(" \u26A0\uFE0F Status check requires Tier 3 with an active conversation."));
3157
3240
  console.log("");
3158
3241
  return;
3159
3242
  }
3160
- const spinner = ora5({ text: INFO8(" Checking analysis status..."), spinner: "dots" }).start();
3243
+ const spinner = ora5({ text: INFO13(" Checking analysis status..."), spinner: "dots" }).start();
3161
3244
  try {
3162
3245
  const result = await callCloudFunction("getCLIAnalysisResults", {
3163
3246
  conversationId: config.conversationId,
@@ -3166,28 +3249,28 @@ async function showStatus(config) {
3166
3249
  spinner.stop();
3167
3250
  if (result?.status) {
3168
3251
  console.log("");
3169
- console.log(BRAND_SECONDARY8(` \u25C6 Analysis Status: ${result.status.toUpperCase()}`));
3252
+ console.log(BRAND_SECONDARY12(` \u25C6 Analysis Status: ${result.status.toUpperCase()}`));
3170
3253
  if (result.progress) {
3171
3254
  const pct = Math.round(result.progress.completed / result.progress.total * 100);
3172
3255
  const barLen = 30;
3173
3256
  const filled = Math.round(pct / 100 * barLen);
3174
3257
  let barColor;
3175
- if (pct < 25) barColor = chalk16.red;
3176
- else if (pct < 50) barColor = chalk16.hex("#FF8C00");
3177
- else if (pct < 75) barColor = chalk16.yellow;
3178
- else barColor = chalk16.green;
3179
- const bar2 = barColor("\u2588".repeat(filled)) + MUTED8("\u2591".repeat(barLen - filled));
3258
+ if (pct < 25) barColor = chalk17.red;
3259
+ else if (pct < 50) barColor = chalk17.hex("#FF8C00");
3260
+ else if (pct < 75) barColor = chalk17.yellow;
3261
+ else barColor = chalk17.green;
3262
+ const bar2 = barColor("\u2588".repeat(filled)) + MUTED13("\u2591".repeat(barLen - filled));
3180
3263
  console.log(` [${bar2}] ${result.progress.completed}/${result.progress.total} (${pct}%)`);
3181
3264
  }
3182
3265
  console.log("");
3183
3266
  } else {
3184
3267
  console.log("");
3185
- console.log(MUTED8(" No active analysis job found."));
3268
+ console.log(MUTED13(" No active analysis job found."));
3186
3269
  console.log("");
3187
3270
  }
3188
3271
  } catch (error) {
3189
3272
  spinner.stop();
3190
- console.log(ERROR7(` \u274C ${error.message}`));
3273
+ console.log(ERROR11(` \u274C ${error.message}`));
3191
3274
  console.log("");
3192
3275
  }
3193
3276
  }
@@ -3195,35 +3278,35 @@ async function runAnalysis(config) {
3195
3278
  const cwd = process.cwd();
3196
3279
  const projectName = getProjectName(cwd);
3197
3280
  console.log("");
3198
- console.log(chalk16.bold(INFO8(` \u26A1 Analysing project: ${projectName}`)));
3199
- console.log(MUTED8(` \u{1F4C1} ${cwd}`));
3200
- console.log(MUTED8(" \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));
3281
+ console.log(chalk17.bold(INFO13(` \u26A1 Analysing project: ${projectName}`)));
3282
+ console.log(MUTED13(` \u{1F4C1} ${cwd}`));
3283
+ console.log(MUTED13(" \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));
3201
3284
  console.log("");
3202
3285
  const provider = config.provider || "local";
3203
3286
  if (provider === "local" && !config.localEndpoint) {
3204
- console.log(ERROR7(" \u274C Local analysis requires a local model."));
3205
- console.log(MUTED8(" Run `bob config set provider local`"));
3206
- console.log(MUTED8(" Run `bob config set localEndpoint http://127.0.0.1:11434/api/chat`"));
3287
+ console.log(ERROR11(" \u274C Local analysis requires a local model."));
3288
+ console.log(MUTED13(" Run `bob config set provider local`"));
3289
+ console.log(MUTED13(" Run `bob config set localEndpoint http://127.0.0.1:11434/api/chat`"));
3207
3290
  console.log("");
3208
3291
  return;
3209
3292
  }
3210
3293
  if (provider !== "local" && (!config.loggedIn || !config.authToken)) {
3211
- console.log(ERROR7(" \u274C Platform providers require authentication."));
3212
- console.log(MUTED8(" Run `bob login` to authenticate."));
3213
- console.log(MUTED8(" Or set provider to local: `bob config set provider local`"));
3294
+ console.log(ERROR11(" \u274C Platform providers require authentication."));
3295
+ console.log(MUTED13(" Run `bob login` to authenticate."));
3296
+ console.log(MUTED13(" Or set provider to local: `bob config set provider local`"));
3214
3297
  console.log("");
3215
3298
  return;
3216
3299
  }
3217
3300
  const summaries = loadSummaries(cwd);
3218
3301
  if (!summaries || Object.keys(summaries).length === 0) {
3219
- console.log(WARNING7(" \u26A0\uFE0F Project not indexed. Run `bob index` first."));
3302
+ console.log(WARNING12(" \u26A0\uFE0F Project not indexed. Run `bob index` first."));
3220
3303
  console.log("");
3221
3304
  return;
3222
3305
  }
3223
3306
  const dependencies = loadDependencies(cwd) || {};
3224
3307
  const files = Object.keys(summaries);
3225
- console.log(INFO8(` \u{1F527} Provider: ${provider}`));
3226
- console.log(MUTED8(` Found ${files.length} indexed files. Starting deep analysis...`));
3308
+ console.log(INFO13(` \u{1F527} Provider: ${provider}`));
3309
+ console.log(MUTED13(` Found ${files.length} indexed files. Starting deep analysis...`));
3227
3310
  console.log("");
3228
3311
  console.log("");
3229
3312
  console.log("");
@@ -3239,7 +3322,7 @@ async function runAnalysis(config) {
3239
3322
  try {
3240
3323
  content = fs8.readFileSync(absolutePath, "utf-8");
3241
3324
  } catch (error) {
3242
- console.error(ERROR7(` \u274C Could not read file ${filePath}: ${error.message}`));
3325
+ console.error(ERROR11(` \u274C Could not read file ${filePath}: ${error.message}`));
3243
3326
  completed++;
3244
3327
  continue;
3245
3328
  }
@@ -3324,10 +3407,10 @@ ${content}`;
3324
3407
  }, null, 2));
3325
3408
  console.log("");
3326
3409
  console.log("");
3327
- console.log(chalk16.bold(SUCCESS8(` \u2705 Analysis complete: ${projectName}`)));
3328
- console.log(MUTED8(` \u{1F4BE} Saved to: ~/.bob/projects/${projectName}/analysis/results/`));
3329
- console.log(MUTED8(" Run `bob analyse --results` to view the dashboard."));
3330
- console.log(MUTED8(" Run `bob analyse --auto` for auto-fix mode."));
3410
+ console.log(chalk17.bold(SUCCESS13(` \u2705 Analysis complete: ${projectName}`)));
3411
+ console.log(MUTED13(` \u{1F4BE} Saved to: ~/.bob/projects/${projectName}/analysis/results/`));
3412
+ console.log(MUTED13(" Run `bob analyse --results` to view the dashboard."));
3413
+ console.log(MUTED13(" Run `bob analyse --auto` for auto-fix mode."));
3331
3414
  console.log("");
3332
3415
  }
3333
3416
  function loadLocalCounts() {
@@ -3366,34 +3449,34 @@ function printProgress2(completed, total, filePath, info) {
3366
3449
  const barLength = 30;
3367
3450
  const filled = Math.round(percent * barLength);
3368
3451
  let barColor;
3369
- if (percent < 0.25) barColor = chalk16.red;
3370
- else if (percent < 0.5) barColor = chalk16.hex("#FF8C00");
3371
- else if (percent < 0.75) barColor = chalk16.yellow;
3372
- else barColor = chalk16.green;
3452
+ if (percent < 0.25) barColor = chalk17.red;
3453
+ else if (percent < 0.5) barColor = chalk17.hex("#FF8C00");
3454
+ else if (percent < 0.75) barColor = chalk17.yellow;
3455
+ else barColor = chalk17.green;
3373
3456
  const filledBar = barColor("\u2588".repeat(filled));
3374
- const emptyBar = MUTED8("\u2591".repeat(barLength - filled));
3457
+ const emptyBar = MUTED13("\u2591".repeat(barLength - filled));
3375
3458
  const percentText = barColor(`${Math.round(percent * 100)}%`);
3376
3459
  process.stdout.write("\x1B[2K\x1B[1A\x1B[2K\x1B[1A\x1B[2K\x1B[1A\x1B[2K\r");
3377
- console.log(` ${INFO8("\u26A1")} Analysing [${filledBar}${emptyBar}] ${completed}/${total} ${percentText}`);
3378
- console.log(SUCCESS8(` \u2705 ${filePath}`));
3379
- console.log(MUTED8(` ${info}`));
3460
+ console.log(` ${INFO13("\u26A1")} Analysing [${filledBar}${emptyBar}] ${completed}/${total} ${percentText}`);
3461
+ console.log(SUCCESS13(` \u2705 ${filePath}`));
3462
+ console.log(MUTED13(` ${info}`));
3380
3463
  console.log("");
3381
3464
  }
3382
3465
 
3383
3466
  // src/commands/autonomy.ts
3384
- import chalk17 from "chalk";
3467
+ import chalk18 from "chalk";
3385
3468
  import ora6 from "ora";
3386
3469
  import * as readline6 from "readline";
3387
3470
  import simpleGit2 from "simple-git";
3388
3471
  import * as fs9 from "fs";
3389
3472
  import * as path10 from "path";
3390
- var RED = chalk17.hex("#EF5350");
3391
- var GREEN = chalk17.hex("#66BB6A");
3392
- var AMBER2 = chalk17.hex("#FFAB00");
3393
- var BLUE = chalk17.hex("#42A5F5");
3394
- var GRAY = chalk17.gray;
3395
- var BORDER4 = chalk17.hex("#455A64");
3396
- var CYAN = chalk17.cyan;
3473
+ var RED = chalk18.hex("#EF5350");
3474
+ var GREEN = chalk18.hex("#66BB6A");
3475
+ var AMBER2 = chalk18.hex("#FFAB00");
3476
+ var BLUE = chalk18.hex("#42A5F5");
3477
+ var GRAY = chalk18.gray;
3478
+ var BORDER4 = chalk18.hex("#455A64");
3479
+ var CYAN = chalk18.cyan;
3397
3480
  function registerAutonomyCommand(program2) {
3398
3481
  program2.command("autonomy").description("Launch autonomous repair mode \u2014 MiniBob fixes all analysed issues").option("--status", "Check current autonomy run progress (Tier 3)").option("--stop", "Stop the current autonomy run (Tier 3)").option("--category <cat>", "Limit to: bugs, features, improvements, upgrades").option("--priority <level>", "Minimum priority: critical, high, medium, low (default: high)", "high").option("--no-push", "Skip git push after completion").action(async (options) => {
3399
3482
  const config = getConfig();
@@ -3402,7 +3485,7 @@ function registerAutonomyCommand(program2) {
3402
3485
  return;
3403
3486
  }
3404
3487
  if (options.stop) {
3405
- console.log(chalk17.yellow(" \u26A0\uFE0F Stop command not yet implemented for Tier 3."));
3488
+ console.log(chalk18.yellow(" \u26A0\uFE0F Stop command not yet implemented for Tier 3."));
3406
3489
  return;
3407
3490
  }
3408
3491
  if (config.tier === "platform" && config.provider !== "local" && config.loggedIn && config.conversationId) {
@@ -3414,7 +3497,7 @@ function registerAutonomyCommand(program2) {
3414
3497
  }
3415
3498
  async function runTier3Autonomy(config) {
3416
3499
  console.log("");
3417
- console.log(chalk17.bold.cyan(" \u26A1 MiniBob Autonomy Mode (Platform)"));
3500
+ console.log(chalk18.bold.cyan(" \u26A1 MiniBob Autonomy Mode (Platform)"));
3418
3501
  console.log(GRAY(" \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));
3419
3502
  console.log(GRAY(` \u{1F4E1} Conversation: ${config.conversationId?.slice(0, 24)}...`));
3420
3503
  console.log(GRAY(` \u{1F517} https://bobs-workshop.web.app/#/bobcodeassistant/${config.conversationId}`));
@@ -3537,7 +3620,7 @@ async function runTier1Autonomy(config, options) {
3537
3620
  const priorityGate = options.priority || "high";
3538
3621
  const shouldPush = options.push !== false;
3539
3622
  console.log("");
3540
- console.log(chalk17.bold.cyan(" \u26A1 MiniBob Autonomy Mode (Local)"));
3623
+ console.log(chalk18.bold.cyan(" \u26A1 MiniBob Autonomy Mode (Local)"));
3541
3624
  console.log(GRAY(" \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));
3542
3625
  console.log(GRAY(` Priority gate: ${priorityGate}+`));
3543
3626
  console.log(GRAY(` Categories: ${categories.join(", ")}`));
@@ -3642,7 +3725,7 @@ Autonomous repair by Bob's CLI.`;
3642
3725
  }
3643
3726
  async function showAutonomyStatus(config) {
3644
3727
  if (!config.loggedIn || !config.conversationId) {
3645
- console.log(chalk17.yellow(" \u26A0\uFE0F Status requires Tier 3 with an active conversation."));
3728
+ console.log(chalk18.yellow(" \u26A0\uFE0F Status requires Tier 3 with an active conversation."));
3646
3729
  return;
3647
3730
  }
3648
3731
  const spinner = ora6({ text: CYAN(" Checking autonomy status..."), spinner: "dots" }).start();
@@ -3762,10 +3845,10 @@ function renderTickerHUD(done, total, bugs, features, improvements, upgrades, to
3762
3845
  const barLen = 30;
3763
3846
  const filled = Math.round(percent * barLen);
3764
3847
  let barColor;
3765
- if (percent < 0.25) barColor = chalk17.red;
3766
- else if (percent < 0.5) barColor = chalk17.hex("#FF8C00");
3767
- else if (percent < 0.75) barColor = chalk17.yellow;
3768
- else barColor = chalk17.green;
3848
+ if (percent < 0.25) barColor = chalk18.red;
3849
+ else if (percent < 0.5) barColor = chalk18.hex("#FF8C00");
3850
+ else if (percent < 0.75) barColor = chalk18.yellow;
3851
+ else barColor = chalk18.green;
3769
3852
  const bar2 = barColor("\u2588".repeat(filled)) + GRAY("\u2591".repeat(barLen - filled));
3770
3853
  console.log(` \u26A1 [${bar2}] ${done}/${total} ${barColor(Math.round(percent * 100) + "%")}`);
3771
3854
  console.log(GRAY(` \u{1F41B} ${bugs} \u2B50 ${features} \u{1F527} ${improvements} \u2B06\uFE0F ${upgrades} | Tokens: ${tokens.toLocaleString()}`));
@@ -3811,10 +3894,10 @@ function renderLocalTodoList(queue) {
3811
3894
  const barLen = 30;
3812
3895
  const filled = Math.round(percent * barLen);
3813
3896
  let barColor;
3814
- if (percent < 0.25) barColor = chalk17.red;
3815
- else if (percent < 0.5) barColor = chalk17.hex("#FF8C00");
3816
- else if (percent < 0.75) barColor = chalk17.yellow;
3817
- else barColor = chalk17.green;
3897
+ if (percent < 0.25) barColor = chalk18.red;
3898
+ else if (percent < 0.5) barColor = chalk18.hex("#FF8C00");
3899
+ else if (percent < 0.75) barColor = chalk18.yellow;
3900
+ else barColor = chalk18.green;
3818
3901
  lines.push("");
3819
3902
  lines.push(` [${barColor("\u2588".repeat(filled))}${GRAY("\u2591".repeat(barLen - filled))}] ${completed}/${total} ${barColor(Math.round(percent * 100) + "%")}`);
3820
3903
  lines.push("");
@@ -3832,16 +3915,16 @@ function renderLocalTodoList(queue) {
3832
3915
  }
3833
3916
 
3834
3917
  // src/commands/serve.ts
3835
- import chalk18 from "chalk";
3918
+ import chalk19 from "chalk";
3836
3919
  import * as os3 from "os";
3837
3920
  import * as path11 from "path";
3838
- var GREEN2 = chalk18.hex("#66BB6A");
3839
- var AMBER3 = chalk18.hex("#FFAB00");
3840
- var BLUE2 = chalk18.hex("#42A5F5");
3841
- var RED2 = chalk18.hex("#EF5350");
3842
- var GRAY2 = chalk18.gray;
3843
- var CYAN2 = chalk18.cyan;
3844
- var BORDER5 = chalk18.hex("#455A64");
3921
+ var GREEN2 = chalk19.hex("#66BB6A");
3922
+ var AMBER3 = chalk19.hex("#FFAB00");
3923
+ var BLUE2 = chalk19.hex("#42A5F5");
3924
+ var RED2 = chalk19.hex("#EF5350");
3925
+ var GRAY2 = chalk19.gray;
3926
+ var CYAN2 = chalk19.cyan;
3927
+ var BORDER5 = chalk19.hex("#455A64");
3845
3928
  var TIER_CONFIGS = {
3846
3929
  "Power": {
3847
3930
  activeInterval: 2e3,
@@ -4192,24 +4275,24 @@ async function executePush(payload) {
4192
4275
  }
4193
4276
 
4194
4277
  // src/commands/remote.ts
4195
- import chalk19 from "chalk";
4278
+ import chalk20 from "chalk";
4196
4279
  import ora7 from "ora";
4197
4280
  import * as readline7 from "readline";
4198
- var BRAND_PRIMARY7 = chalk19.hex("#E66F24");
4199
- var BRAND_SECONDARY9 = chalk19.hex("#FFAB00");
4200
- var SUCCESS9 = chalk19.hex("#66BB6A");
4201
- var INFO9 = chalk19.hex("#26C6DA");
4202
- var WARNING8 = chalk19.hex("#FFC107");
4203
- var ERROR8 = chalk19.hex("#EF5350");
4204
- var MUTED9 = chalk19.hex("#78909C");
4205
- var BORDER6 = chalk19.hex("#455A64");
4281
+ var BRAND_PRIMARY9 = chalk20.hex("#E66F24");
4282
+ var BRAND_SECONDARY13 = chalk20.hex("#FFAB00");
4283
+ var SUCCESS14 = chalk20.hex("#66BB6A");
4284
+ var INFO14 = chalk20.hex("#26C6DA");
4285
+ var WARNING13 = chalk20.hex("#FFC107");
4286
+ var ERROR12 = chalk20.hex("#EF5350");
4287
+ var MUTED14 = chalk20.hex("#78909C");
4288
+ var BORDER6 = chalk20.hex("#455A64");
4206
4289
  function registerRemoteCommand(program2) {
4207
4290
  program2.command("remote [type] [message]").description("Send commands to an Active Bob on a remote machine").option("--new", "Discover and connect to a different Active Bob").option("--auto", "For analyse: run auto-fix mode").option("-i, --interactive", "Enter interactive remote session").option("--session <id>", "Target a specific Active Bob session").action(async (type, message, options) => {
4208
4291
  const config = getConfig();
4209
4292
  if (!config.loggedIn || !config.authToken) {
4210
4293
  console.log("");
4211
- console.log(ERROR8(" \u274C Not logged in."));
4212
- console.log(MUTED9(" Run `bob login` to authenticate."));
4294
+ console.log(ERROR12(" \u274C Not logged in."));
4295
+ console.log(MUTED14(" Run `bob login` to authenticate."));
4213
4296
  console.log("");
4214
4297
  return;
4215
4298
  }
@@ -4228,8 +4311,8 @@ function registerRemoteCommand(program2) {
4228
4311
  const validTypes = ["chat", "consult", "index", "analyse", "push", "autonomy"];
4229
4312
  if (!validTypes.includes(type)) {
4230
4313
  console.log("");
4231
- console.log(ERROR8(` \u274C Invalid command type: "${type}"`));
4232
- console.log(MUTED9(` Valid types: ${validTypes.join(", ")}`));
4314
+ console.log(ERROR12(` \u274C Invalid command type: "${type}"`));
4315
+ console.log(MUTED14(` Valid types: ${validTypes.join(", ")}`));
4233
4316
  console.log("");
4234
4317
  return;
4235
4318
  }
@@ -4238,8 +4321,8 @@ function registerRemoteCommand(program2) {
4238
4321
  if (options.auto) payload.auto = true;
4239
4322
  if ((type === "chat" || type === "consult" || type === "push") && !message) {
4240
4323
  console.log("");
4241
- console.log(ERROR8(` \u274C ${type} requires a message.`));
4242
- console.log(MUTED9(` Example: bob remote ${type} "your message here"`));
4324
+ console.log(ERROR12(` \u274C ${type} requires a message.`));
4325
+ console.log(MUTED14(` Example: bob remote ${type} "your message here"`));
4243
4326
  console.log("");
4244
4327
  return;
4245
4328
  }
@@ -4247,7 +4330,7 @@ function registerRemoteCommand(program2) {
4247
4330
  });
4248
4331
  }
4249
4332
  async function runInteractiveRemote(config, targetSession) {
4250
- const spinner = ora7({ text: INFO9(" Connecting to Active Bob..."), spinner: "dots" }).start();
4333
+ const spinner = ora7({ text: INFO14(" Connecting to Active Bob..."), spinner: "dots" }).start();
4251
4334
  let activeBobName = "Unknown";
4252
4335
  try {
4253
4336
  const result = await callCloudFunction("listActiveBobs", {
@@ -4257,8 +4340,8 @@ async function runInteractiveRemote(config, targetSession) {
4257
4340
  if (sessions.length === 0) {
4258
4341
  spinner.stop();
4259
4342
  console.log("");
4260
- console.log(ERROR8(" \u{1F534} No Active Bob found on this conversation."));
4261
- console.log(MUTED9(" Run `bob serve` on the target machine first."));
4343
+ console.log(ERROR12(" \u{1F534} No Active Bob found on this conversation."));
4344
+ console.log(MUTED14(" Run `bob serve` on the target machine first."));
4262
4345
  console.log("");
4263
4346
  return;
4264
4347
  }
@@ -4266,22 +4349,22 @@ async function runInteractiveRemote(config, targetSession) {
4266
4349
  spinner.stop();
4267
4350
  } catch (error) {
4268
4351
  spinner.stop();
4269
- console.log(ERROR8(` \u274C ${error.message}`));
4352
+ console.log(ERROR12(` \u274C ${error.message}`));
4270
4353
  return;
4271
4354
  }
4272
4355
  console.log("");
4273
4356
  console.log(BORDER6(" \u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557"));
4274
- console.log(BORDER6(" \u2551") + INFO9(` \u{1F310} Active Bob \u2014 Remote Session`) + MUTED9(` (${activeBobName})`));
4357
+ console.log(BORDER6(" \u2551") + INFO14(` \u{1F310} Active Bob \u2014 Remote Session`) + MUTED14(` (${activeBobName})`));
4275
4358
  console.log(BORDER6(" \u2560\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2563"));
4276
- console.log(BORDER6(" \u2551") + MUTED9(` Conversation: ${config.conversationId?.slice(0, 28)}...`));
4277
- console.log(BORDER6(" \u2551") + MUTED9(" Commands dispatched to the remote machine."));
4359
+ console.log(BORDER6(" \u2551") + MUTED14(` Conversation: ${config.conversationId?.slice(0, 28)}...`));
4360
+ console.log(BORDER6(" \u2551") + MUTED14(" Commands dispatched to the remote machine."));
4278
4361
  console.log(BORDER6(" \u2551"));
4279
- console.log(BORDER6(" \u2551") + chalk19.white(" Slash Commands:"));
4280
- console.log(BORDER6(" \u2551") + MUTED9(' \u25B8 /consult "msg" \u2014 Strategic advice'));
4281
- console.log(BORDER6(" \u2551") + MUTED9(' \u25B8 /push "msg" \u2014 Git commit & push'));
4282
- console.log(BORDER6(" \u2551") + MUTED9(" \u25B8 /index \u2014 Re-index project"));
4283
- console.log(BORDER6(" \u2551") + MUTED9(" \u25B8 /analyse \u2014 Run analysis"));
4284
- console.log(BORDER6(" \u2551") + MUTED9(" \u25B8 /exit \u2014 Disconnect"));
4362
+ console.log(BORDER6(" \u2551") + chalk20.white(" Slash Commands:"));
4363
+ console.log(BORDER6(" \u2551") + MUTED14(' \u25B8 /consult "msg" \u2014 Strategic advice'));
4364
+ console.log(BORDER6(" \u2551") + MUTED14(' \u25B8 /push "msg" \u2014 Git commit & push'));
4365
+ console.log(BORDER6(" \u2551") + MUTED14(" \u25B8 /index \u2014 Re-index project"));
4366
+ console.log(BORDER6(" \u2551") + MUTED14(" \u25B8 /analyse \u2014 Run analysis"));
4367
+ console.log(BORDER6(" \u2551") + MUTED14(" \u25B8 /exit \u2014 Disconnect"));
4285
4368
  console.log(BORDER6(" \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D"));
4286
4369
  console.log("");
4287
4370
  const rl = readline7.createInterface({
@@ -4289,7 +4372,7 @@ async function runInteractiveRemote(config, targetSession) {
4289
4372
  output: process.stdout
4290
4373
  });
4291
4374
  const prompt = () => {
4292
- rl.question(INFO9(" You (remote): "), async (input) => {
4375
+ rl.question(INFO14(" You (remote): "), async (input) => {
4293
4376
  const trimmed = input.trim();
4294
4377
  if (!trimmed) {
4295
4378
  prompt();
@@ -4297,7 +4380,7 @@ async function runInteractiveRemote(config, targetSession) {
4297
4380
  }
4298
4381
  if (trimmed === "/exit" || trimmed === "/quit") {
4299
4382
  console.log("");
4300
- console.log(MUTED9(" \u{1F4E1} Disconnected from remote session."));
4383
+ console.log(MUTED14(" \u{1F4E1} Disconnected from remote session."));
4301
4384
  console.log("");
4302
4385
  rl.close();
4303
4386
  return;
@@ -4307,7 +4390,7 @@ async function runInteractiveRemote(config, targetSession) {
4307
4390
  if (msg) {
4308
4391
  await dispatchAndShow(config, "consult", { message: msg, conversationId: config.conversationId }, targetSession);
4309
4392
  } else {
4310
- console.log(ERROR8(' \u274C Provide a message: /consult "your question"'));
4393
+ console.log(ERROR12(' \u274C Provide a message: /consult "your question"'));
4311
4394
  }
4312
4395
  prompt();
4313
4396
  return;
@@ -4317,7 +4400,7 @@ async function runInteractiveRemote(config, targetSession) {
4317
4400
  if (msg) {
4318
4401
  await dispatchAndShow(config, "push", { message: msg, conversationId: config.conversationId }, targetSession);
4319
4402
  } else {
4320
- console.log(ERROR8(' \u274C Provide a commit message: /push "your message"'));
4403
+ console.log(ERROR12(' \u274C Provide a commit message: /push "your message"'));
4321
4404
  }
4322
4405
  prompt();
4323
4406
  return;
@@ -4339,7 +4422,7 @@ async function runInteractiveRemote(config, targetSession) {
4339
4422
  prompt();
4340
4423
  }
4341
4424
  async function dispatchAndShow(config, type, payload, targetSession) {
4342
- const spinner = ora7({ text: BRAND_SECONDARY9(` \u{1F4E1} Active Bob executing: ${type}...`), spinner: "dots" }).start();
4425
+ const spinner = ora7({ text: BRAND_SECONDARY13(` \u{1F4E1} Active Bob executing: ${type}...`), spinner: "dots" }).start();
4343
4426
  try {
4344
4427
  const result = await callCloudFunction("sendRemoteCommand", {
4345
4428
  conversationId: config.conversationId,
@@ -4349,7 +4432,7 @@ async function dispatchAndShow(config, type, payload, targetSession) {
4349
4432
  });
4350
4433
  if (!result?.success) {
4351
4434
  spinner.stop();
4352
- console.log(ERROR8(` \u274C ${result?.message || "Failed to dispatch."}`));
4435
+ console.log(ERROR12(` \u274C ${result?.message || "Failed to dispatch."}`));
4353
4436
  console.log("");
4354
4437
  return;
4355
4438
  }
@@ -4365,23 +4448,23 @@ async function dispatchAndShow(config, type, payload, targetSession) {
4365
4448
  if (pollResult.result?.text) {
4366
4449
  const rendered = renderMarkdown(pollResult.result.text);
4367
4450
  console.log("");
4368
- console.log(MUTED9(" \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));
4369
- console.log(chalk19.bold(INFO9(" \u{1F916} Bob (Remote):")));
4451
+ console.log(MUTED14(" \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));
4452
+ console.log(chalk20.bold(INFO14(" \u{1F916} Bob (Remote):")));
4370
4453
  console.log("");
4371
4454
  for (const line of rendered.split("\n")) {
4372
4455
  console.log(` ${line}`);
4373
4456
  }
4374
4457
  console.log("");
4375
4458
  if (pollResult.result?.referencedFiles?.length > 0) {
4376
- console.log(MUTED9(` \u2514\u2500 \u{1F4C2} Referenced: ${pollResult.result.referencedFiles.join(", ")}`));
4459
+ console.log(MUTED14(` \u2514\u2500 \u{1F4C2} Referenced: ${pollResult.result.referencedFiles.join(", ")}`));
4377
4460
  }
4378
- console.log(MUTED9(" \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));
4461
+ console.log(MUTED14(" \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));
4379
4462
  } else if (pollResult.result?.message) {
4380
4463
  console.log("");
4381
- console.log(SUCCESS9(` \u2705 ${pollResult.result.message}`));
4464
+ console.log(SUCCESS14(` \u2705 ${pollResult.result.message}`));
4382
4465
  } else if (pollResult.result?.error) {
4383
4466
  console.log("");
4384
- console.log(ERROR8(` \u274C ${pollResult.result.error}`));
4467
+ console.log(ERROR12(` \u274C ${pollResult.result.error}`));
4385
4468
  }
4386
4469
  console.log("");
4387
4470
  return;
@@ -4389,7 +4472,7 @@ async function dispatchAndShow(config, type, payload, targetSession) {
4389
4472
  if (pollResult?.status === "failed") {
4390
4473
  spinner.stop();
4391
4474
  console.log("");
4392
- console.log(ERROR8(` \u274C ${pollResult.result?.error || "Command failed."}`));
4475
+ console.log(ERROR12(` \u274C ${pollResult.result?.error || "Command failed."}`));
4393
4476
  console.log("");
4394
4477
  return;
4395
4478
  }
@@ -4399,19 +4482,19 @@ async function dispatchAndShow(config, type, payload, targetSession) {
4399
4482
  }
4400
4483
  } catch (error) {
4401
4484
  spinner.stop();
4402
- console.log(ERROR8(` \u274C ${error.message}`));
4485
+ console.log(ERROR12(` \u274C ${error.message}`));
4403
4486
  console.log("");
4404
4487
  }
4405
4488
  }
4406
4489
  async function showConnectionStatus(config) {
4407
4490
  if (!config.conversationId) {
4408
4491
  console.log("");
4409
- console.log(ERROR8(" \u{1F534} No conversation selected."));
4410
- console.log(MUTED9(" Run `bob remote --new` to find and connect to an Active Bob."));
4492
+ console.log(ERROR12(" \u{1F534} No conversation selected."));
4493
+ console.log(MUTED14(" Run `bob remote --new` to find and connect to an Active Bob."));
4411
4494
  console.log("");
4412
4495
  return;
4413
4496
  }
4414
- const spinner = ora7({ text: INFO9(" Checking Active Bob status..."), spinner: "dots" }).start();
4497
+ const spinner = ora7({ text: INFO14(" Checking Active Bob status..."), spinner: "dots" }).start();
4415
4498
  try {
4416
4499
  const result = await callCloudFunction("listActiveBobs", {
4417
4500
  conversationId: config.conversationId
@@ -4421,83 +4504,83 @@ async function showConnectionStatus(config) {
4421
4504
  const activeSessions = sessions.filter((s) => s.active);
4422
4505
  console.log("");
4423
4506
  console.log(BORDER6(" \u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557"));
4424
- console.log(BORDER6(" \u2551") + INFO9(" \u{1F310} Remote Connection Status"));
4507
+ console.log(BORDER6(" \u2551") + INFO14(" \u{1F310} Remote Connection Status"));
4425
4508
  console.log(BORDER6(" \u2560\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2563"));
4426
- console.log(BORDER6(" \u2551") + MUTED9(` Conversation: ${config.conversationId?.slice(0, 28)}...`));
4509
+ console.log(BORDER6(" \u2551") + MUTED14(` Conversation: ${config.conversationId?.slice(0, 28)}...`));
4427
4510
  console.log(BORDER6(" \u2551"));
4428
4511
  if (activeSessions.length === 0) {
4429
- console.log(BORDER6(" \u2551") + ERROR8(" \u{1F534} No Active Bob found on this conversation."));
4430
- console.log(BORDER6(" \u2551") + MUTED9(" Run `bob serve` on the target machine."));
4512
+ console.log(BORDER6(" \u2551") + ERROR12(" \u{1F534} No Active Bob found on this conversation."));
4513
+ console.log(BORDER6(" \u2551") + MUTED14(" Run `bob serve` on the target machine."));
4431
4514
  } else {
4432
4515
  for (const session of activeSessions) {
4433
4516
  const ago = session.lastHeartbeat ? getTimeAgo2(session.lastHeartbeat) : "unknown";
4434
- console.log(BORDER6(" \u2551") + SUCCESS9(` \u{1F7E2} ${session.machineId}`) + MUTED9(` (${session.projectName}) \u2014 ${ago}`));
4517
+ console.log(BORDER6(" \u2551") + SUCCESS14(` \u{1F7E2} ${session.machineId}`) + MUTED14(` (${session.projectName}) \u2014 ${ago}`));
4435
4518
  }
4436
4519
  }
4437
4520
  console.log(BORDER6(" \u2551"));
4438
4521
  console.log(BORDER6(" \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D"));
4439
4522
  console.log("");
4440
4523
  if (activeSessions.length > 0) {
4441
- console.log(MUTED9(" Commands:"));
4442
- console.log(MUTED9(" \u25B8 bob remote --interactive \u2014 Persistent session"));
4443
- console.log(MUTED9(' \u25B8 bob remote chat "message" \u2014 One-shot'));
4444
- console.log(MUTED9(' \u25B8 bob remote consult "msg" \u2014 Strategic advice'));
4445
- console.log(MUTED9(' \u25B8 bob remote push "msg" \u2014 Git push'));
4446
- console.log(MUTED9(" \u25B8 bob remote index \u2014 Re-index"));
4447
- console.log(MUTED9(" \u25B8 bob remote analyse \u2014 Run analysis"));
4524
+ console.log(MUTED14(" Commands:"));
4525
+ console.log(MUTED14(" \u25B8 bob remote --interactive \u2014 Persistent session"));
4526
+ console.log(MUTED14(' \u25B8 bob remote chat "message" \u2014 One-shot'));
4527
+ console.log(MUTED14(' \u25B8 bob remote consult "msg" \u2014 Strategic advice'));
4528
+ console.log(MUTED14(' \u25B8 bob remote push "msg" \u2014 Git push'));
4529
+ console.log(MUTED14(" \u25B8 bob remote index \u2014 Re-index"));
4530
+ console.log(MUTED14(" \u25B8 bob remote analyse \u2014 Run analysis"));
4448
4531
  console.log("");
4449
4532
  }
4450
4533
  } catch (error) {
4451
4534
  spinner.stop();
4452
- console.log(ERROR8(` \u274C ${error.message}`));
4535
+ console.log(ERROR12(` \u274C ${error.message}`));
4453
4536
  console.log("");
4454
4537
  }
4455
4538
  }
4456
4539
  async function discoverAndConnect(config) {
4457
- const spinner = ora7({ text: INFO9(" Searching for Active Bobs..."), spinner: "dots" }).start();
4540
+ const spinner = ora7({ text: INFO14(" Searching for Active Bobs..."), spinner: "dots" }).start();
4458
4541
  try {
4459
4542
  const result = await callCloudFunction("listActiveBobs", {});
4460
4543
  spinner.stop();
4461
4544
  const bobs = result?.activeBobs || [];
4462
4545
  if (bobs.length === 0) {
4463
4546
  console.log("");
4464
- console.log(WARNING8(" \u26A0\uFE0F No Active Bobs found."));
4465
- console.log(MUTED9(" Run `bob serve` on a machine to start an Active Bob."));
4547
+ console.log(WARNING13(" \u26A0\uFE0F No Active Bobs found."));
4548
+ console.log(MUTED14(" Run `bob serve` on a machine to start an Active Bob."));
4466
4549
  console.log("");
4467
4550
  return;
4468
4551
  }
4469
4552
  console.log("");
4470
4553
  console.log(BORDER6(" \u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557"));
4471
- console.log(BORDER6(" \u2551") + INFO9(" \u{1F310} Active Bobs Available"));
4554
+ console.log(BORDER6(" \u2551") + INFO14(" \u{1F310} Active Bobs Available"));
4472
4555
  console.log(BORDER6(" \u2560\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2563"));
4473
4556
  for (let i = 0; i < bobs.length; i++) {
4474
4557
  const bob = bobs[i];
4475
4558
  const ago = bob.lastHeartbeat ? getTimeAgo2(bob.lastHeartbeat) : "unknown";
4476
- console.log(BORDER6(" \u2551") + ` ${INFO9(String(i + 1).padStart(2))}. ${SUCCESS9("\u{1F7E2}")} ${chalk19.white(bob.machineId)} \u2014 ${MUTED9(bob.projectName)}`);
4477
- console.log(BORDER6(" \u2551") + MUTED9(` Convo: ${bob.conversationTitle || bob.conversationId?.slice(0, 20) + "..."} | ${ago}`));
4559
+ console.log(BORDER6(" \u2551") + ` ${INFO14(String(i + 1).padStart(2))}. ${SUCCESS14("\u{1F7E2}")} ${chalk20.white(bob.machineId)} \u2014 ${MUTED14(bob.projectName)}`);
4560
+ console.log(BORDER6(" \u2551") + MUTED14(` Convo: ${bob.conversationTitle || bob.conversationId?.slice(0, 20) + "..."} | ${ago}`));
4478
4561
  }
4479
4562
  console.log(BORDER6(" \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D"));
4480
4563
  console.log("");
4481
4564
  const rl = readline7.createInterface({ input: process.stdin, output: process.stdout });
4482
4565
  const answer = await new Promise((resolve2) => {
4483
- rl.question(INFO9(" Select (1-" + bobs.length + ") or 0 to cancel: "), resolve2);
4566
+ rl.question(INFO14(" Select (1-" + bobs.length + ") or 0 to cancel: "), resolve2);
4484
4567
  });
4485
4568
  rl.close();
4486
4569
  const selection = parseInt(answer.trim());
4487
4570
  if (isNaN(selection) || selection === 0 || selection < 1 || selection > bobs.length) {
4488
- console.log(MUTED9(" Cancelled."));
4571
+ console.log(MUTED14(" Cancelled."));
4489
4572
  return;
4490
4573
  }
4491
4574
  const selected = bobs[selection - 1];
4492
4575
  setConfigValue("conversationId", selected.conversationId);
4493
4576
  console.log("");
4494
- console.log(SUCCESS9(` \u2705 Connected to: ${selected.machineId} (${selected.projectName})`));
4495
- console.log(MUTED9(` Conversation: ${selected.conversationId?.slice(0, 24)}...`));
4496
- console.log(MUTED9(" Run `bob remote --interactive` for a persistent session."));
4577
+ console.log(SUCCESS14(` \u2705 Connected to: ${selected.machineId} (${selected.projectName})`));
4578
+ console.log(MUTED14(` Conversation: ${selected.conversationId?.slice(0, 24)}...`));
4579
+ console.log(MUTED14(" Run `bob remote --interactive` for a persistent session."));
4497
4580
  console.log("");
4498
4581
  } catch (error) {
4499
4582
  spinner.stop();
4500
- console.log(ERROR8(` \u274C ${error.message}`));
4583
+ console.log(ERROR12(` \u274C ${error.message}`));
4501
4584
  console.log("");
4502
4585
  }
4503
4586
  }
@@ -4517,37 +4600,37 @@ function getTimeAgo2(isoDate) {
4517
4600
  }
4518
4601
 
4519
4602
  // src/commands/profile.ts
4520
- import chalk22 from "chalk";
4603
+ import chalk23 from "chalk";
4521
4604
  import ora10 from "ora";
4522
4605
 
4523
4606
  // src/core/cloud-profiler.ts
4524
- import chalk20 from "chalk";
4607
+ import chalk21 from "chalk";
4525
4608
  import ora8 from "ora";
4526
- var AMBER4 = chalk20.hex("#FFAB00");
4527
- var ORANGE = chalk20.hex("#E66F24");
4528
- var GREEN3 = chalk20.hex("#66BB6A");
4529
- var CYAN3 = chalk20.cyan;
4530
- var RED3 = chalk20.hex("#EF5350");
4531
- var GRAY3 = chalk20.gray;
4532
- var WHITE2 = chalk20.white;
4533
- var BORDER7 = chalk20.hex("#455A64");
4609
+ var AMBER4 = chalk21.hex("#FFAB00");
4610
+ var ORANGE = chalk21.hex("#E66F24");
4611
+ var GREEN3 = chalk21.hex("#66BB6A");
4612
+ var CYAN3 = chalk21.cyan;
4613
+ var RED3 = chalk21.hex("#EF5350");
4614
+ var GRAY3 = chalk21.gray;
4615
+ var WHITE2 = chalk21.white;
4616
+ var BORDER7 = chalk21.hex("#455A64");
4534
4617
  var POLL_INTERVAL = 3e3;
4535
4618
  function renderProgressBar(score, width = 30) {
4536
4619
  const filled = Math.round(score / 100 * width);
4537
4620
  const empty = width - filled;
4538
4621
  let barColor;
4539
- if (score >= 75) barColor = chalk20.hex("#66BB6A");
4540
- else if (score >= 50) barColor = chalk20.hex("#FFAB00");
4541
- else if (score >= 25) barColor = chalk20.hex("#E66F24");
4542
- else barColor = chalk20.hex("#EF5350");
4622
+ if (score >= 75) barColor = chalk21.hex("#66BB6A");
4623
+ else if (score >= 50) barColor = chalk21.hex("#FFAB00");
4624
+ else if (score >= 25) barColor = chalk21.hex("#E66F24");
4625
+ else barColor = chalk21.hex("#EF5350");
4543
4626
  const filledBar = barColor("\u2588".repeat(filled));
4544
- const emptyBar = chalk20.hex("#333333")("\u2591".repeat(empty));
4627
+ const emptyBar = chalk21.hex("#333333")("\u2591".repeat(empty));
4545
4628
  return `${filledBar}${emptyBar} ${barColor(`${score}/100`)}`;
4546
4629
  }
4547
4630
  function renderChunkBar(current, total, width = 30) {
4548
4631
  const filled = Math.round(current / total * width);
4549
4632
  const empty = width - filled;
4550
- return AMBER4("\u2588".repeat(filled)) + chalk20.hex("#333333")("\u2591".repeat(empty)) + GRAY3(` ${current}/${total}`);
4633
+ return AMBER4("\u2588".repeat(filled)) + chalk21.hex("#333333")("\u2591".repeat(empty)) + GRAY3(` ${current}/${total}`);
4551
4634
  }
4552
4635
  function truncate2(text, max) {
4553
4636
  if (!text) return "";
@@ -4607,7 +4690,7 @@ async function runCloudProfiler(options) {
4607
4690
  }
4608
4691
  const jobPath = startResult.jobPath;
4609
4692
  const jobId = startResult.jobId;
4610
- spinner.succeed(GREEN3(` \u{1F680} Job started: ${chalk20.gray(jobId.slice(0, 30))}`));
4693
+ spinner.succeed(GREEN3(` \u{1F680} Job started: ${chalk21.gray(jobId.slice(0, 30))}`));
4611
4694
  let lastSeenLines = 0;
4612
4695
  let currentChunks = 0;
4613
4696
  let totalChunks = 0;
@@ -4908,19 +4991,19 @@ function sleep5(ms) {
4908
4991
  }
4909
4992
 
4910
4993
  // src/ui/profile-dashboard.ts
4911
- import chalk21 from "chalk";
4994
+ import chalk22 from "chalk";
4912
4995
  import ora9 from "ora";
4913
- var BRAND_PRIMARY8 = chalk21.hex("#E66F24");
4914
- var BRAND_SECONDARY10 = chalk21.hex("#FFAB00");
4915
- var SUCCESS10 = chalk21.hex("#66BB6A");
4916
- var INFO10 = chalk21.hex("#26C6DA");
4917
- var WARNING9 = chalk21.hex("#FFC107");
4918
- var ERROR9 = chalk21.hex("#EF5350");
4919
- var MUTED10 = chalk21.hex("#78909C");
4920
- var MODE_CONSULTANT7 = chalk21.hex("#AB47BC");
4921
- var MODE_PERSONALIZATION2 = chalk21.hex("#CE93D8");
4922
- var GOLD = chalk21.hex("#FFD700");
4923
- var BORDER8 = chalk21.hex("#455A64");
4996
+ var BRAND_PRIMARY10 = chalk22.hex("#E66F24");
4997
+ var BRAND_SECONDARY14 = chalk22.hex("#FFAB00");
4998
+ var SUCCESS15 = chalk22.hex("#66BB6A");
4999
+ var INFO15 = chalk22.hex("#26C6DA");
5000
+ var WARNING14 = chalk22.hex("#FFC107");
5001
+ var ERROR13 = chalk22.hex("#EF5350");
5002
+ var MUTED15 = chalk22.hex("#78909C");
5003
+ var MODE_CONSULTANT8 = chalk22.hex("#AB47BC");
5004
+ var MODE_PERSONALIZATION2 = chalk22.hex("#CE93D8");
5005
+ var GOLD = chalk22.hex("#FFD700");
5006
+ var BORDER8 = chalk22.hex("#455A64");
4924
5007
  var DASH_WIDTH2 = 62;
4925
5008
  function topRule2() {
4926
5009
  return BORDER8(" \u2554" + "\u2550".repeat(DASH_WIDTH2) + "\u2557");
@@ -4941,11 +5024,11 @@ function bar(score, width = 25) {
4941
5024
  const filled = Math.round(numScore / 100 * width);
4942
5025
  const empty = width - filled;
4943
5026
  let barColor;
4944
- if (numScore >= 75) barColor = chalk21.hex("#66BB6A");
4945
- else if (numScore >= 50) barColor = chalk21.hex("#FFAB00");
4946
- else if (numScore >= 25) barColor = chalk21.hex("#E66F24");
4947
- else barColor = chalk21.hex("#EF5350");
4948
- return `${barColor("\u2588".repeat(filled))}${chalk21.hex("#333333")("\u2591".repeat(empty))} ${barColor(`${numScore}`)}`;
5027
+ if (numScore >= 75) barColor = chalk22.hex("#66BB6A");
5028
+ else if (numScore >= 50) barColor = chalk22.hex("#FFAB00");
5029
+ else if (numScore >= 25) barColor = chalk22.hex("#E66F24");
5030
+ else barColor = chalk22.hex("#EF5350");
5031
+ return `${barColor("\u2588".repeat(filled))}${chalk22.hex("#333333")("\u2591".repeat(empty))} ${barColor(`${numScore}`)}`;
4949
5032
  }
4950
5033
  function trunc(text, max) {
4951
5034
  if (!text) return "";
@@ -4977,9 +5060,9 @@ function trend(value) {
4977
5060
  const text = typeof value === "string" ? value : value?.direction || value?.trend || "";
4978
5061
  const lower = text.toLowerCase();
4979
5062
  if (lower.includes("undetermined") || lower.includes("insufficient") || lower.includes("unconfirmed")) return "";
4980
- if (lower.includes("rising") || lower.includes("improving")) return SUCCESS10("\u2197 " + text);
4981
- if (lower.includes("falling") || lower.includes("declining")) return ERROR9("\u2198 " + text);
4982
- if (lower.includes("stable")) return MUTED10("\u2192 " + text);
5063
+ if (lower.includes("rising") || lower.includes("improving")) return SUCCESS15("\u2197 " + text);
5064
+ if (lower.includes("falling") || lower.includes("declining")) return ERROR13("\u2198 " + text);
5065
+ if (lower.includes("stable")) return MUTED15("\u2192 " + text);
4983
5066
  return "";
4984
5067
  }
4985
5068
  function extractScore(obj) {
@@ -4990,122 +5073,122 @@ function extractScore(obj) {
4990
5073
  async function renderProfileDashboard() {
4991
5074
  if (!isAuthenticated()) {
4992
5075
  console.log("");
4993
- console.log(ERROR9(" \u274C Dashboard requires authentication."));
4994
- console.log(MUTED10(" Run `bob login` to authenticate."));
5076
+ console.log(ERROR13(" \u274C Dashboard requires authentication."));
5077
+ console.log(MUTED15(" Run `bob login` to authenticate."));
4995
5078
  console.log("");
4996
5079
  return;
4997
5080
  }
4998
- const spinner = ora9({ text: INFO10(" Loading your DNA profile..."), spinner: "dots" }).start();
5081
+ const spinner = ora9({ text: INFO15(" Loading your DNA profile..."), spinner: "dots" }).start();
4999
5082
  try {
5000
5083
  const data = await callCloudFunction("getCLIProfileDashboard", {});
5001
5084
  if (!data?.success) {
5002
- spinner.fail(ERROR9(" \u274C Failed to load profile data."));
5085
+ spinner.fail(ERROR13(" \u274C Failed to load profile data."));
5003
5086
  return;
5004
5087
  }
5005
5088
  spinner.stop();
5006
5089
  const { daily, weekly, monthly } = data;
5007
5090
  if (!daily?.decision && !weekly?.decision && !monthly) {
5008
5091
  console.log("");
5009
- console.log(WARNING9(" \u26A0\uFE0F No profile data found."));
5010
- console.log(MUTED10(" Run `bob profile --cloud` to generate your first profile."));
5092
+ console.log(WARNING14(" \u26A0\uFE0F No profile data found."));
5093
+ console.log(MUTED15(" Run `bob profile --cloud` to generate your first profile."));
5011
5094
  console.log("");
5012
5095
  return;
5013
5096
  }
5014
5097
  console.log("");
5015
5098
  if (daily?.decision || daily?.mood || daily?.behavioral) {
5016
5099
  console.log(topRule2());
5017
- console.log(row2(INFO10(" \u{1F4C5} DAILY PROFILE")));
5100
+ console.log(row2(INFO15(" \u{1F4C5} DAILY PROFILE")));
5018
5101
  console.log(midRule2());
5019
5102
  if (daily.decision) {
5020
5103
  const d = daily.decision;
5021
- console.log(row2(` ${MUTED10("Archetype:")} ${BRAND_SECONDARY10(trunc(d.dailyArchetype || "Unknown", 45))}`));
5022
- console.log(row2(` ${MUTED10("Date:")} ${chalk21.white(d.profileDate || "Unknown")}`));
5104
+ console.log(row2(` ${MUTED15("Archetype:")} ${BRAND_SECONDARY14(trunc(d.dailyArchetype || "Unknown", 45))}`));
5105
+ console.log(row2(` ${MUTED15("Date:")} ${chalk22.white(d.profileDate || "Unknown")}`));
5023
5106
  if (d.psychologicalState) {
5024
5107
  console.log(row2(""));
5025
- console.log(row2(` ${MUTED10("Confidence:")} ${bar(d.psychologicalState.confidence || 0)}`));
5026
- console.log(row2(` ${MUTED10("Autonomy:")} ${bar(d.psychologicalState.autonomy || 0)}`));
5027
- console.log(row2(` ${MUTED10("Clarity:")} ${bar(d.psychologicalState.clarity || 0)}`));
5028
- console.log(row2(` ${MUTED10("Momentum:")} ${bar(d.psychologicalState.momentum || 0)}`));
5108
+ console.log(row2(` ${MUTED15("Confidence:")} ${bar(d.psychologicalState.confidence || 0)}`));
5109
+ console.log(row2(` ${MUTED15("Autonomy:")} ${bar(d.psychologicalState.autonomy || 0)}`));
5110
+ console.log(row2(` ${MUTED15("Clarity:")} ${bar(d.psychologicalState.clarity || 0)}`));
5111
+ console.log(row2(` ${MUTED15("Momentum:")} ${bar(d.psychologicalState.momentum || 0)}`));
5029
5112
  }
5030
5113
  if (d.brutallyHonestAssessment) {
5031
5114
  console.log(row2(""));
5032
- console.log(row2(` ${MUTED10('"' + trunc(d.brutallyHonestAssessment, 50) + '"')}`));
5115
+ console.log(row2(` ${MUTED15('"' + trunc(d.brutallyHonestAssessment, 50) + '"')}`));
5033
5116
  }
5034
5117
  }
5035
5118
  if (daily.primaryEmotion || daily.socialEmotion || daily.cognitiveEmotion) {
5036
5119
  console.log(row2(""));
5037
- console.log(row2(` ${chalk21.white("Emotions:")}`));
5120
+ console.log(row2(` ${chalk22.white("Emotions:")}`));
5038
5121
  if (daily.primaryEmotion?.dominantEmotion) {
5039
- console.log(row2(` ${MUTED10("Primary:")} ${emo(daily.primaryEmotion.dominantEmotion)} ${chalk21.white(daily.primaryEmotion.dominantEmotion)}`));
5122
+ console.log(row2(` ${MUTED15("Primary:")} ${emo(daily.primaryEmotion.dominantEmotion)} ${chalk22.white(daily.primaryEmotion.dominantEmotion)}`));
5040
5123
  }
5041
5124
  if (daily.socialEmotion?.dominantSocialEmotion) {
5042
- console.log(row2(` ${MUTED10("Social:")} ${emo(daily.socialEmotion.dominantSocialEmotion)} ${chalk21.white(daily.socialEmotion.dominantSocialEmotion)}`));
5125
+ console.log(row2(` ${MUTED15("Social:")} ${emo(daily.socialEmotion.dominantSocialEmotion)} ${chalk22.white(daily.socialEmotion.dominantSocialEmotion)}`));
5043
5126
  }
5044
5127
  if (daily.cognitiveEmotion?.dominantCognitiveState) {
5045
- console.log(row2(` ${MUTED10("Cognitive:")} ${emo(daily.cognitiveEmotion.dominantCognitiveState)} ${chalk21.white(trunc(daily.cognitiveEmotion.dominantCognitiveState, 35))}`));
5128
+ console.log(row2(` ${MUTED15("Cognitive:")} ${emo(daily.cognitiveEmotion.dominantCognitiveState)} ${chalk22.white(trunc(daily.cognitiveEmotion.dominantCognitiveState, 35))}`));
5046
5129
  }
5047
5130
  }
5048
5131
  if (daily.mood) {
5049
5132
  console.log(row2(""));
5050
- console.log(row2(` ${chalk21.white("Mood:")} ${trunc(daily.mood.unifiedMood || "", 45)}`));
5051
- console.log(row2(` ${MUTED10("Score:")} ${bar(daily.mood.moodScore || 0)}`));
5133
+ console.log(row2(` ${chalk22.white("Mood:")} ${trunc(daily.mood.unifiedMood || "", 45)}`));
5134
+ console.log(row2(` ${MUTED15("Score:")} ${bar(daily.mood.moodScore || 0)}`));
5052
5135
  }
5053
5136
  if (daily.behavioral) {
5054
5137
  const b = daily.behavioral;
5055
5138
  console.log(row2(""));
5056
- console.log(row2(` ${chalk21.white("Behavior:")}`));
5057
- console.log(row2(` ${MUTED10("Style:")} ${chalk21.white(trunc(b.workStyle || "", 40))}`));
5058
- console.log(row2(` ${MUTED10("Productivity:")} ${bar(b.overallProductivity || 0)}`));
5059
- if (b.consistency) console.log(row2(` ${MUTED10("Consistency:")} ${bar(extractScore(b.consistency))}`));
5060
- if (b.followThrough) console.log(row2(` ${MUTED10("Follow-thru:")} ${bar(extractScore(b.followThrough))}`));
5139
+ console.log(row2(` ${chalk22.white("Behavior:")}`));
5140
+ console.log(row2(` ${MUTED15("Style:")} ${chalk22.white(trunc(b.workStyle || "", 40))}`));
5141
+ console.log(row2(` ${MUTED15("Productivity:")} ${bar(b.overallProductivity || 0)}`));
5142
+ if (b.consistency) console.log(row2(` ${MUTED15("Consistency:")} ${bar(extractScore(b.consistency))}`));
5143
+ if (b.followThrough) console.log(row2(` ${MUTED15("Follow-thru:")} ${bar(extractScore(b.followThrough))}`));
5061
5144
  }
5062
5145
  console.log(botRule2());
5063
5146
  console.log("");
5064
5147
  }
5065
5148
  if (weekly?.decision) {
5066
5149
  console.log(topRule2());
5067
- console.log(row2(MODE_CONSULTANT7(" \u{1F4CA} WEEKLY PROFILE")));
5150
+ console.log(row2(MODE_CONSULTANT8(" \u{1F4CA} WEEKLY PROFILE")));
5068
5151
  console.log(midRule2());
5069
5152
  const w = weekly.decision;
5070
- console.log(row2(` ${MUTED10("Archetype:")} ${BRAND_SECONDARY10(w.archetypeOfWeek || "Unknown")}`));
5071
- console.log(row2(` ${MUTED10("Edge Score:")} ${bar(w.userEdgeScore || 0)}`));
5153
+ console.log(row2(` ${MUTED15("Archetype:")} ${BRAND_SECONDARY14(w.archetypeOfWeek || "Unknown")}`));
5154
+ console.log(row2(` ${MUTED15("Edge Score:")} ${bar(w.userEdgeScore || 0)}`));
5072
5155
  if (w.gritProfile) {
5073
5156
  const gritTrend = trend(w.gritProfile.trend || w.gritProfile);
5074
- console.log(row2(` ${MUTED10("Grit:")} ${bar(extractScore(w.gritProfile))}${gritTrend ? " " + gritTrend : ""}`));
5157
+ console.log(row2(` ${MUTED15("Grit:")} ${bar(extractScore(w.gritProfile))}${gritTrend ? " " + gritTrend : ""}`));
5075
5158
  }
5076
5159
  if (w.innovationProfile) {
5077
5160
  const innovTrend = trend(w.innovationProfile.trend || w.innovationProfile);
5078
- console.log(row2(` ${MUTED10("Innovation:")} ${bar(extractScore(w.innovationProfile))}${innovTrend ? " " + innovTrend : ""}`));
5161
+ console.log(row2(` ${MUTED15("Innovation:")} ${bar(extractScore(w.innovationProfile))}${innovTrend ? " " + innovTrend : ""}`));
5079
5162
  }
5080
5163
  if (w.executionProfile) {
5081
5164
  const execTrend = trend(w.executionProfile.trend || w.executionProfile);
5082
- console.log(row2(` ${MUTED10("Execution:")} ${bar(extractScore(w.executionProfile))}${execTrend ? " " + execTrend : ""}`));
5165
+ console.log(row2(` ${MUTED15("Execution:")} ${bar(extractScore(w.executionProfile))}${execTrend ? " " + execTrend : ""}`));
5083
5166
  }
5084
5167
  if (w.workflowProfile?.style) {
5085
5168
  console.log(row2(""));
5086
- console.log(row2(` ${MUTED10("Work Style:")} ${chalk21.white(trunc(w.workflowProfile.style, 40))}`));
5169
+ console.log(row2(` ${MUTED15("Work Style:")} ${chalk22.white(trunc(w.workflowProfile.style, 40))}`));
5087
5170
  }
5088
5171
  if (w.psychologicalState?.resilience) {
5089
- console.log(row2(` ${MUTED10("Resilience:")} ${bar(w.psychologicalState.resilience)}`));
5172
+ console.log(row2(` ${MUTED15("Resilience:")} ${bar(w.psychologicalState.resilience)}`));
5090
5173
  }
5091
5174
  if (w.strategicAnalysis) {
5092
5175
  console.log(row2(""));
5093
5176
  if (w.strategicAnalysis.biggestWin) {
5094
- console.log(row2(` ${SUCCESS10("+")} ${MUTED10("Win:")} ${trunc(w.strategicAnalysis.biggestWin, 45)}`));
5177
+ console.log(row2(` ${SUCCESS15("+")} ${MUTED15("Win:")} ${trunc(w.strategicAnalysis.biggestWin, 45)}`));
5095
5178
  }
5096
5179
  if (w.strategicAnalysis.biggestMiss) {
5097
- console.log(row2(` ${ERROR9("-")} ${MUTED10("Miss:")} ${trunc(w.strategicAnalysis.biggestMiss, 45)}`));
5180
+ console.log(row2(` ${ERROR13("-")} ${MUTED15("Miss:")} ${trunc(w.strategicAnalysis.biggestMiss, 45)}`));
5098
5181
  }
5099
5182
  if (w.strategicAnalysis.blindSpot) {
5100
- console.log(row2(` ${BRAND_PRIMARY8("?")} ${MUTED10("Blind:")} ${trunc(w.strategicAnalysis.blindSpot, 45)}`));
5183
+ console.log(row2(` ${BRAND_PRIMARY10("?")} ${MUTED15("Blind:")} ${trunc(w.strategicAnalysis.blindSpot, 45)}`));
5101
5184
  }
5102
5185
  if (w.strategicAnalysis.growthEdge) {
5103
- console.log(row2(` ${INFO10("\u2197")} ${MUTED10("Growth:")} ${trunc(w.strategicAnalysis.growthEdge, 45)}`));
5186
+ console.log(row2(` ${INFO15("\u2197")} ${MUTED15("Growth:")} ${trunc(w.strategicAnalysis.growthEdge, 45)}`));
5104
5187
  }
5105
5188
  }
5106
5189
  if (w.weekSummary) {
5107
5190
  console.log(row2(""));
5108
- console.log(row2(` ${MUTED10('"' + trunc(w.weekSummary, 50) + '"')}`));
5191
+ console.log(row2(` ${MUTED15('"' + trunc(w.weekSummary, 50) + '"')}`));
5109
5192
  }
5110
5193
  console.log(botRule2());
5111
5194
  console.log("");
@@ -5114,83 +5197,83 @@ async function renderProfileDashboard() {
5114
5197
  console.log(topRule2());
5115
5198
  console.log(row2(GOLD(" \u{1F3C6} MONTHLY DNA")));
5116
5199
  console.log(midRule2());
5117
- console.log(row2(` ${MUTED10("Archetype:")} ${BRAND_SECONDARY10(monthly.monthlyArchetype || "Unknown")}`));
5200
+ console.log(row2(` ${MUTED15("Archetype:")} ${BRAND_SECONDARY14(monthly.monthlyArchetype || "Unknown")}`));
5118
5201
  if (monthly.trendAnalysis) {
5119
5202
  const gritT = trend(monthly.trendAnalysis.gritTrend);
5120
5203
  const innovT = trend(monthly.trendAnalysis.innovationTrend);
5121
5204
  const execT = trend(monthly.trendAnalysis.executionTrend);
5122
5205
  if (gritT || innovT || execT) {
5123
5206
  console.log(row2(""));
5124
- if (gritT) console.log(row2(` ${MUTED10("Grit:")} ${gritT}`));
5125
- if (innovT) console.log(row2(` ${MUTED10("Innovation:")} ${innovT}`));
5126
- if (execT) console.log(row2(` ${MUTED10("Execution:")} ${execT}`));
5207
+ if (gritT) console.log(row2(` ${MUTED15("Grit:")} ${gritT}`));
5208
+ if (innovT) console.log(row2(` ${MUTED15("Innovation:")} ${innovT}`));
5209
+ if (execT) console.log(row2(` ${MUTED15("Execution:")} ${execT}`));
5127
5210
  }
5128
5211
  }
5129
5212
  if (monthly.trendAnalysis?.overallTrajectory) {
5130
5213
  console.log(row2(""));
5131
- console.log(row2(` ${MUTED10('"' + trunc(monthly.trendAnalysis.overallTrajectory, 50) + '"')}`));
5214
+ console.log(row2(` ${MUTED15('"' + trunc(monthly.trendAnalysis.overallTrajectory, 50) + '"')}`));
5132
5215
  }
5133
5216
  if (monthly.personalityDNA) {
5134
5217
  const dna = monthly.personalityDNA;
5135
5218
  console.log(row2(""));
5136
- console.log(row2(` ${chalk21.white("Personality DNA:")}`));
5137
- if (dna.coreMotivation) console.log(row2(` ${MUTED10("Motivation:")} ${trunc(dna.coreMotivation, 42)}`));
5138
- if (dna.workIdentity) console.log(row2(` ${MUTED10("Work Identity:")} ${trunc(dna.workIdentity, 42)}`));
5139
- if (dna.stressResponse) console.log(row2(` ${MUTED10("Under Stress:")} ${trunc(dna.stressResponse, 42)}`));
5140
- if (dna.learningStyle) console.log(row2(` ${MUTED10("Learning:")} ${trunc(dna.learningStyle, 42)}`));
5219
+ console.log(row2(` ${chalk22.white("Personality DNA:")}`));
5220
+ if (dna.coreMotivation) console.log(row2(` ${MUTED15("Motivation:")} ${trunc(dna.coreMotivation, 42)}`));
5221
+ if (dna.workIdentity) console.log(row2(` ${MUTED15("Work Identity:")} ${trunc(dna.workIdentity, 42)}`));
5222
+ if (dna.stressResponse) console.log(row2(` ${MUTED15("Under Stress:")} ${trunc(dna.stressResponse, 42)}`));
5223
+ if (dna.learningStyle) console.log(row2(` ${MUTED15("Learning:")} ${trunc(dna.learningStyle, 42)}`));
5141
5224
  }
5142
5225
  if (monthly.psychologicalState) {
5143
5226
  const ps = monthly.psychologicalState;
5144
5227
  console.log(row2(""));
5145
- console.log(row2(` ${chalk21.white("State:")}`));
5146
- if (ps.confidence) console.log(row2(` ${MUTED10("Confidence:")} ${bar(ps.confidence)}`));
5147
- if (ps.resilience) console.log(row2(` ${MUTED10("Resilience:")} ${bar(ps.resilience)}`));
5148
- if (ps.burnoutRisk) console.log(row2(` ${MUTED10("Burnout:")} ${bar(ps.burnoutRisk)}`));
5228
+ console.log(row2(` ${chalk22.white("State:")}`));
5229
+ if (ps.confidence) console.log(row2(` ${MUTED15("Confidence:")} ${bar(ps.confidence)}`));
5230
+ if (ps.resilience) console.log(row2(` ${MUTED15("Resilience:")} ${bar(ps.resilience)}`));
5231
+ if (ps.burnoutRisk) console.log(row2(` ${MUTED15("Burnout:")} ${bar(ps.burnoutRisk)}`));
5149
5232
  if (ps.overallWellbeing && typeof ps.overallWellbeing === "string" && ps.overallWellbeing.length < 30) {
5150
- console.log(row2(` ${MUTED10("Wellbeing:")} ${chalk21.white(ps.overallWellbeing)}`));
5233
+ console.log(row2(` ${MUTED15("Wellbeing:")} ${chalk22.white(ps.overallWellbeing)}`));
5151
5234
  }
5152
5235
  }
5153
5236
  if (monthly.predictiveInsights) {
5154
5237
  const pi = monthly.predictiveInsights;
5155
5238
  console.log(row2(""));
5156
- console.log(row2(` ${chalk21.white("Predictions:")}`));
5239
+ console.log(row2(` ${chalk22.white("Predictions:")}`));
5157
5240
  if (pi.likelyNextMonthArchetype) {
5158
- console.log(row2(` ${MUTED10("Next Month:")} ${BRAND_SECONDARY10(trunc(pi.likelyNextMonthArchetype, 40))}`));
5241
+ console.log(row2(` ${MUTED15("Next Month:")} ${BRAND_SECONDARY14(trunc(pi.likelyNextMonthArchetype, 40))}`));
5159
5242
  }
5160
5243
  if (pi.communicationStrategy) {
5161
- console.log(row2(` ${MUTED10("Strategy:")} ${trunc(pi.communicationStrategy, 42)}`));
5244
+ console.log(row2(` ${MUTED15("Strategy:")} ${trunc(pi.communicationStrategy, 42)}`));
5162
5245
  }
5163
5246
  }
5164
5247
  if (monthly.monthSummary) {
5165
5248
  console.log(row2(""));
5166
- console.log(row2(` ${MUTED10('"' + trunc(monthly.monthSummary, 50) + '"')}`));
5249
+ console.log(row2(` ${MUTED15('"' + trunc(monthly.monthSummary, 50) + '"')}`));
5167
5250
  }
5168
5251
  console.log(botRule2());
5169
5252
  console.log("");
5170
5253
  }
5171
- console.log(MUTED10(" Commands:"));
5172
- console.log(MUTED10(" \u25B8 bob profile --cloud \u2014 Refresh daily profile"));
5173
- console.log(MUTED10(" \u25B8 bob profile --cloud-weekly \u2014 Refresh weekly synthesis"));
5174
- console.log(MUTED10(" \u25B8 bob profile --cloud-monthly \u2014 Refresh monthly DNA"));
5175
- console.log(MUTED10(" \u25B8 bob chat --personalized \u2014 Chat with DNA-aware Bob"));
5254
+ console.log(MUTED15(" Commands:"));
5255
+ console.log(MUTED15(" \u25B8 bob profile --cloud \u2014 Refresh daily profile"));
5256
+ console.log(MUTED15(" \u25B8 bob profile --cloud-weekly \u2014 Refresh weekly synthesis"));
5257
+ console.log(MUTED15(" \u25B8 bob profile --cloud-monthly \u2014 Refresh monthly DNA"));
5258
+ console.log(MUTED15(" \u25B8 bob chat --personalized \u2014 Chat with DNA-aware Bob"));
5176
5259
  console.log("");
5177
5260
  } catch (error) {
5178
5261
  spinner.stop();
5179
5262
  console.log("");
5180
- console.log(ERROR9(` \u274C ${error.message}`));
5263
+ console.log(ERROR13(` \u274C ${error.message}`));
5181
5264
  console.log("");
5182
5265
  }
5183
5266
  }
5184
5267
 
5185
5268
  // src/commands/profile.ts
5186
5269
  import * as path12 from "path";
5187
- var AMBER5 = chalk22.hex("#FFAB00");
5188
- var GREEN4 = chalk22.hex("#66BB6A");
5189
- var BLUE3 = chalk22.hex("#42A5F5");
5190
- var GRAY4 = chalk22.gray;
5191
- var CYAN4 = chalk22.cyan;
5192
- var RED4 = chalk22.hex("#EF5350");
5193
- var BORDER9 = chalk22.hex("#455A64");
5270
+ var AMBER5 = chalk23.hex("#FFAB00");
5271
+ var GREEN4 = chalk23.hex("#66BB6A");
5272
+ var BLUE3 = chalk23.hex("#42A5F5");
5273
+ var GRAY4 = chalk23.gray;
5274
+ var CYAN4 = chalk23.cyan;
5275
+ var RED4 = chalk23.hex("#EF5350");
5276
+ var BORDER9 = chalk23.hex("#455A64");
5194
5277
  function registerProfileCommand(program2) {
5195
5278
  program2.command("profile").description("Generate and view your behavioral profile \u2014 how you work, think, and communicate").option("--today", "Generate today's profile from today's conversations").option("--week", "Synthesize the last 7 daily profiles into a weekly profile").option("--month", "Synthesize all dailies + weeklies into a monthly profile").option("--cloud", "Run cloud-powered profiling (Power tier only)").option("--cloud-weekly", "Run cloud weekly synthesis (Power tier only)").option("--cloud-monthly", "Run cloud monthly synthesis (Power tier only)").option("--view", "View your DNA dashboard").action(async (options) => {
5196
5279
  const config = getConfig();
@@ -5638,24 +5721,117 @@ function getWeekNumber(date) {
5638
5721
  }
5639
5722
 
5640
5723
  // bin/bob.ts
5724
+ var BRAND_PRIMARY11 = chalk24.hex("#E66F24");
5725
+ var BRAND_SECONDARY15 = chalk24.hex("#FFAB00");
5726
+ var SUCCESS16 = chalk24.hex("#66BB6A");
5727
+ var INFO16 = chalk24.hex("#26C6DA");
5728
+ var MUTED16 = chalk24.hex("#78909C");
5729
+ var MODE_CONSULTANT9 = chalk24.hex("#AB47BC");
5641
5730
  var program = new Command();
5642
- program.name("bob").description("Bob's CLI \u2014 AI coding assistant and Forge orchestrator").version("0.1.3");
5731
+ program.name("bob").description("Bob's CLI \u2014 AI coding assistant and Forge orchestrator").version("0.2.0").helpOption(false).addHelpCommand(false);
5732
+ program.option("-h, --help", "Print this usage information").on("option:help", () => {
5733
+ printCustomHelp();
5734
+ process.exit(0);
5735
+ });
5736
+ program.command("help").description("Display help for Bob's CLI").action(() => {
5737
+ printCustomHelp();
5738
+ });
5739
+ function printCustomHelp() {
5740
+ console.log("");
5741
+ console.log(BRAND_PRIMARY11(" \u25C9 Bob's CLI") + MUTED16(" \u2014 Your AI Engineering Partner, In Your Terminal."));
5742
+ console.log("");
5743
+ console.log(chalk24.white(" Common commands:"));
5744
+ console.log("");
5745
+ console.log(BRAND_SECONDARY15(' bob chat "message"'));
5746
+ console.log(MUTED16(" Chat with Bob \u2014 code-friendly engineering partner with file awareness."));
5747
+ console.log("");
5748
+ console.log(BRAND_SECONDARY15(' bob consult "message"'));
5749
+ console.log(MUTED16(" Strategic advice only \u2014 no code, just architectural guidance."));
5750
+ console.log("");
5751
+ console.log(BRAND_SECONDARY15(" bob index"));
5752
+ console.log(MUTED16(" Index your project \u2014 generates summaries and dependency map for context."));
5753
+ console.log("");
5754
+ console.log(chalk24.white(" Usage: ") + INFO16("bob <command> [arguments]"));
5755
+ console.log("");
5756
+ console.log(chalk24.white(" Global options:"));
5757
+ console.log(MUTED16(" -h, --help Print this usage information."));
5758
+ console.log(MUTED16(" -V, --version Output the version number."));
5759
+ console.log("");
5760
+ console.log(chalk24.white(" Available commands:"));
5761
+ console.log("");
5762
+ console.log(INFO16(" Conversation"));
5763
+ printCmd("chat [message]", "Chat with Bob \u2014 code-friendly engineering partner");
5764
+ printCmd("consult [message]", "Strategic advice only, no code output");
5765
+ printCmd("conversations", "List, search, and join existing conversations");
5766
+ printCmd("fork <title>", "Branch conversation into a focused sub-project");
5767
+ printCmd("forks", "List all forks of the current conversation");
5768
+ printCmd("deepdive", "Sandboxed exploration on a specific Bob message");
5769
+ printCmd("deepdives", "List all deep dives in the current conversation");
5770
+ printCmd("deepdives-join", "Re-enter an existing deep dive");
5771
+ console.log("");
5772
+ console.log(SUCCESS16(" Project Tools"));
5773
+ printCmd("index", "Index your project \u2014 AI-powered summaries + dependency map");
5774
+ printCmd("analyse", "Full QA code review \u2014 bugs, features, improvements, upgrades");
5775
+ printCmd("analyse --auto", "Auto-fix mode \u2014 Bob triages, MiniBob implements");
5776
+ printCmd("autonomy", "Full autonomous repair across entire codebase");
5777
+ printCmd("push <message>", "Git stage + commit + push in one command");
5778
+ console.log("");
5779
+ console.log(BRAND_PRIMARY11(" Remote (SovereignLink)"));
5780
+ printCmd("serve", "Start Active Bob \u2014 receive commands from any device");
5781
+ printCmd("remote [type] [msg]", "Send commands to a remote Active Bob");
5782
+ console.log("");
5783
+ console.log(MODE_CONSULTANT9(" Profile & Identity"));
5784
+ printCmd("profile", "View your behavioral DNA dashboard");
5785
+ printCmd("profile --cloud", "Generate cloud-powered daily profile");
5786
+ printCmd("byok", "Manage Bring Your Own Key configuration");
5787
+ console.log("");
5788
+ console.log(MUTED16(" Configuration"));
5789
+ printCmd("config show", "Display current configuration");
5790
+ printCmd("config set <key> <val>", "Update a configuration value");
5791
+ printCmd("login", "Authenticate with Bob's Workshop via browser");
5792
+ printCmd("logout", "Sign out and clear stored credentials");
5793
+ printCmd("whoami", "Show current auth status and project info");
5794
+ console.log("");
5795
+ console.log(chalk24.white(" Interactive slash commands ") + MUTED16("(inside a chat/consult session):"));
5796
+ console.log("");
5797
+ printCmd("/exit", "End the session");
5798
+ printCmd("/new", "Start a fresh conversation");
5799
+ printCmd("/clear", "Clear the terminal");
5800
+ printCmd("/include <path>", "Load a file into active context");
5801
+ printCmd("/delete <path>", "Delete a file (with backup)");
5802
+ printCmd("/deepdive", "Deep dive on the last Bob message");
5803
+ printCmd("/constraints", "View active negative constraints");
5804
+ console.log("");
5805
+ console.log(MUTED16(" \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));
5806
+ console.log("");
5807
+ console.log(MUTED16(" Run ") + INFO16("bob <command> --help") + MUTED16(" for details on a specific command."));
5808
+ console.log("");
5809
+ console.log(MUTED16(" \u{1F4D6} Full docs:"));
5810
+ console.log(INFO16(" https://seedling-io.gitbook.io/bob-cli/bobs-cli-product-wiki-and-user-guide/command-reference"));
5811
+ console.log("");
5812
+ console.log(MUTED16(" Built by ") + BRAND_PRIMARY11("Bob's Workshop") + MUTED16(" \u2014 A Seedling Company."));
5813
+ console.log("");
5814
+ }
5815
+ function printCmd(cmd, desc) {
5816
+ const padded = cmd.padEnd(24);
5817
+ console.log(BRAND_SECONDARY15(` ${padded}`) + MUTED16(desc));
5818
+ }
5643
5819
  program.command("whoami").description("Show current authentication status and configuration").action(() => {
5644
5820
  const config = getConfig();
5645
5821
  const projectName = path13.basename(process.cwd());
5646
5822
  console.log("");
5647
- console.log(chalk23.bold(" \u{1F916} Bob's CLI"));
5648
- console.log(chalk23.gray(" \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));
5649
- console.log(` ${chalk23.cyan("Status:")} ${config.loggedIn ? chalk23.green("Logged in as " + config.email) : "Not logged in"}`);
5650
- console.log(` ${chalk23.cyan("Tier:")} ${config.tier === "platform" ? "Platform (Tier 3)" : "Local-first (Tier 1)"}`);
5651
- console.log(` ${chalk23.cyan("Provider:")} ${config.provider || "Not configured"}`);
5652
- console.log(` ${chalk23.cyan("Mode:")} ${config.personalizationMode ? "Personalized" : config.consultantMode ? "Consultant" : "Standard"}`);
5653
- console.log(` ${chalk23.cyan("IDRP:")} ${config.idrp ? "Enabled" : "Disabled"}`);
5654
- console.log(` ${chalk23.cyan("Project:")} ${projectName} (${process.cwd()})`);
5655
- console.log(` ${chalk23.cyan("Session:")} ${config.conversationId ? config.conversationId.slice(0, 20) + "..." : "None"}`);
5823
+ console.log(chalk24.bold(" \u{1F916} Bob's CLI"));
5824
+ console.log(chalk24.gray(" \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));
5825
+ console.log(` ${chalk24.cyan("Status:")} ${config.loggedIn ? chalk24.green("Logged in as " + config.email) : "Not logged in"}`);
5826
+ console.log(` ${chalk24.cyan("Tier:")} ${config.tier === "platform" ? "Platform (Tier 3)" : "Local-first (Tier 1)"}`);
5827
+ console.log(` ${chalk24.cyan("Provider:")} ${config.provider || "Not configured"}`);
5828
+ console.log(` ${chalk24.cyan("Mode:")} ${config.personalizationMode ? "Personalized" : config.consultantMode ? "Consultant" : "Standard"}`);
5829
+ console.log(` ${chalk24.cyan("IDRP:")} ${config.idrp ? "Enabled" : "Disabled"}`);
5830
+ console.log(` ${chalk24.cyan("Project:")} ${projectName} (${process.cwd()})`);
5831
+ console.log(` ${chalk24.cyan("Session:")} ${config.conversationId ? config.conversationId.slice(0, 20) + "..." : "None"}`);
5656
5832
  console.log("");
5657
5833
  if (!config.loggedIn) {
5658
- console.log(chalk23.gray(" Run `bob login` to authenticate."));
5834
+ console.log(chalk24.gray(" Run `bob login` to authenticate."));
5659
5835
  console.log("");
5660
5836
  }
5661
5837
  });
@@ -5674,4 +5850,24 @@ registerAutonomyCommand(program);
5674
5850
  registerServeCommand(program);
5675
5851
  registerRemoteCommand(program);
5676
5852
  registerProfileCommand(program);
5853
+ process.on("uncaughtException", (error) => {
5854
+ console.error("");
5855
+ console.error(chalk24.hex("#EF5350")(" \u274C An unexpected error occurred."));
5856
+ console.error(chalk24.hex("#78909C")(` ${error.message || "Unknown error"}`));
5857
+ console.error("");
5858
+ console.error(chalk24.hex("#78909C")(" If this persists, please report it:"));
5859
+ console.error(chalk24.hex("#26C6DA")(" https://github.com/bobsworkshop/bob-cli/issues"));
5860
+ console.error("");
5861
+ process.exit(1);
5862
+ });
5863
+ process.on("unhandledRejection", (reason) => {
5864
+ console.error("");
5865
+ console.error(chalk24.hex("#EF5350")(" \u274C An unexpected error occurred."));
5866
+ console.error(chalk24.hex("#78909C")(` ${reason?.message || reason || "Unknown error"}`));
5867
+ console.error("");
5868
+ console.error(chalk24.hex("#78909C")(" If this persists, please report it:"));
5869
+ console.error(chalk24.hex("#26C6DA")(" https://github.com/bobsworkshop/bob-cli/issues"));
5870
+ console.error("");
5871
+ process.exit(1);
5872
+ });
5677
5873
  program.parse();