@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/README.md +103 -54
- package/dist/bin/analyse-auto-HYYDD4OQ.js +529 -0
- package/dist/bin/analyse-results-7TS24WG7.js +8 -0
- package/dist/bin/bob.js +5873 -0
- package/dist/bin/chunk-CI36GGK2.js +1000 -0
- package/dist/bob.js +701 -505
- package/package.json +1 -1
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
|
|
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
|
|
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/
|
|
1630
|
-
|
|
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
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
1860
|
+
console.log(MUTED6(` \u{1F4BE} Session: ${conversationId.slice(0, 24)}...`));
|
|
1808
1861
|
if (config.tier === "platform" && config.provider !== "local") {
|
|
1809
|
-
console.log(
|
|
1862
|
+
console.log(MUTED6(` \u{1F517} https://bobs-workshop.web.app/#/bobcodeassistant/${conversationId}`));
|
|
1810
1863
|
}
|
|
1811
|
-
console.log(
|
|
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(
|
|
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(
|
|
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(
|
|
1891
|
-
console.log(
|
|
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(
|
|
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
|
|
1972
|
+
import chalk10 from "chalk";
|
|
1920
1973
|
import * as readline3 from "readline";
|
|
1921
|
-
var
|
|
1922
|
-
var
|
|
1923
|
-
var
|
|
1924
|
-
var
|
|
1925
|
-
var ERROR5 =
|
|
1926
|
-
var
|
|
1927
|
-
var MODE_CONSULTANT4 =
|
|
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(
|
|
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(
|
|
2106
|
+
console.log(MUTED7(` \u{1F4BE} Session: ${conversationId.slice(0, 24)}...`));
|
|
2051
2107
|
if (config.tier === "platform" && config.provider !== "local") {
|
|
2052
|
-
console.log(
|
|
2108
|
+
console.log(MUTED7(` \u{1F517} https://bobs-workshop.web.app/#/bobcodeassistant/${conversationId}`));
|
|
2053
2109
|
}
|
|
2054
|
-
console.log(
|
|
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(
|
|
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
|
|
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(
|
|
2127
|
-
console.log(
|
|
2128
|
-
console.log(
|
|
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(
|
|
2134
|
-
console.log(
|
|
2135
|
-
console.log(
|
|
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(
|
|
2202
|
+
console.log(WARNING7(" \u26A0\uFE0F No code files found to index."));
|
|
2140
2203
|
return;
|
|
2141
2204
|
}
|
|
2142
|
-
console.log(
|
|
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(
|
|
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,
|
|
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,
|
|
2252
|
+
printProgress(completed, files.length, filePath, summaries[filePath], [], options.verbose);
|
|
2190
2253
|
} catch (error) {
|
|
2191
|
-
console.log(
|
|
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(
|
|
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 =
|
|
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(
|
|
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(
|
|
2303
|
+
console.log(SUCCESS8(` \u2705 Dependency map generated for ${Object.keys(dependencies).length} files.`));
|
|
2240
2304
|
} catch (error) {
|
|
2241
|
-
console.log(
|
|
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(
|
|
2248
|
-
console.log(
|
|
2249
|
-
console.log(
|
|
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 =
|
|
2347
|
+
barColor = chalk11.hex("#EF5350");
|
|
2284
2348
|
} else if (percent < 0.5) {
|
|
2285
|
-
barColor =
|
|
2349
|
+
barColor = chalk11.hex("#FF8C00");
|
|
2286
2350
|
} else if (percent < 0.75) {
|
|
2287
|
-
barColor =
|
|
2351
|
+
barColor = chalk11.hex("#FFC107");
|
|
2288
2352
|
} else {
|
|
2289
|
-
barColor =
|
|
2353
|
+
barColor = chalk11.hex("#66BB6A");
|
|
2290
2354
|
}
|
|
2291
2355
|
const filledBar = barColor("\u2588".repeat(filled));
|
|
2292
|
-
const emptyBar =
|
|
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(` ${
|
|
2296
|
-
console.log(
|
|
2359
|
+
console.log(` ${INFO8("\u26A1")} Indexing [${filledBar}${emptyBar}] ${completed}/${total} ${percentText}`);
|
|
2360
|
+
console.log(SUCCESS8(` \u2705 ${filePath}`));
|
|
2297
2361
|
if (verbose) {
|
|
2298
|
-
console.log(
|
|
2362
|
+
console.log(MUTED8(` "${summary.slice(0, 120)}${summary.length > 120 ? "..." : ""}"`));
|
|
2299
2363
|
if (dependencies.length > 0) {
|
|
2300
|
-
console.log(
|
|
2364
|
+
console.log(MUTED8(` \u2192 depends on: ${dependencies.join(", ")}`));
|
|
2301
2365
|
} else {
|
|
2302
|
-
console.log(
|
|
2366
|
+
console.log(MUTED8(` \u2192 depends on: (mapping after all summaries)`));
|
|
2303
2367
|
}
|
|
2304
2368
|
} else {
|
|
2305
|
-
console.log(
|
|
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
|
|
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(
|
|
2321
|
-
console.log(
|
|
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:
|
|
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(
|
|
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 =
|
|
2408
|
+
spinner.text = INFO9(` Staging ${status.files.length} file(s)...`);
|
|
2340
2409
|
await git.add(".");
|
|
2341
2410
|
}
|
|
2342
|
-
spinner.text =
|
|
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 =
|
|
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(
|
|
2359
|
-
console.log(
|
|
2360
|
-
console.log(` ${
|
|
2361
|
-
console.log(` ${
|
|
2362
|
-
console.log(` ${
|
|
2363
|
-
console.log(` ${
|
|
2364
|
-
console.log(
|
|
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(
|
|
2438
|
+
console.log(MUTED9(` ${icon} ${file.path}`));
|
|
2370
2439
|
}
|
|
2371
2440
|
console.log("");
|
|
2372
2441
|
} else {
|
|
2373
|
-
console.log(
|
|
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(
|
|
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(
|
|
2382
|
-
console.log(
|
|
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(
|
|
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
|
|
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(
|
|
2404
|
-
console.log(
|
|
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(
|
|
2411
|
-
console.log(
|
|
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:
|
|
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(
|
|
2428
|
-
console.log(
|
|
2429
|
-
console.log(
|
|
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(
|
|
2436
|
-
console.log(
|
|
2437
|
-
console.log(
|
|
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(
|
|
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(
|
|
2451
|
-
console.log(
|
|
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(
|
|
2458
|
-
console.log(
|
|
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(
|
|
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(
|
|
2543
|
+
console.log(MUTED10(" Cancelled."));
|
|
2469
2544
|
return;
|
|
2470
2545
|
}
|
|
2471
2546
|
const spinner = ora3({
|
|
2472
|
-
text:
|
|
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(
|
|
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(
|
|
2489
|
-
console.log(
|
|
2490
|
-
console.log(
|
|
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(
|
|
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(
|
|
2504
|
-
console.log(
|
|
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:
|
|
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(
|
|
2520
|
-
console.log(
|
|
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(
|
|
2523
|
-
console.log(
|
|
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 ?
|
|
2527
|
-
const statusText = key.isActive ?
|
|
2528
|
-
console.log(` ${statusIcon} ${
|
|
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(
|
|
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(
|
|
2538
|
-
console.log(
|
|
2539
|
-
console.log(
|
|
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(
|
|
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
|
|
2626
|
+
import chalk14 from "chalk";
|
|
2552
2627
|
import ora4 from "ora";
|
|
2553
2628
|
import * as readline5 from "readline";
|
|
2554
|
-
var
|
|
2555
|
-
var
|
|
2556
|
-
var
|
|
2557
|
-
var
|
|
2558
|
-
var
|
|
2559
|
-
var
|
|
2560
|
-
var
|
|
2561
|
-
var BORDER2 =
|
|
2562
|
-
var MODE_CONSULTANT5 =
|
|
2563
|
-
var MODE_DEEPDIVE4 =
|
|
2564
|
-
var MODE_PERSONALIZATION =
|
|
2565
|
-
var ACTIVE_BG =
|
|
2566
|
-
var ACTIVE_INDICATOR =
|
|
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
|
|
2646
|
+
return INFO11("\u25C6");
|
|
2572
2647
|
}
|
|
2573
2648
|
function getSourceIcon(source) {
|
|
2574
|
-
return source === "cli" ?
|
|
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(
|
|
2582
|
-
console.log(
|
|
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:
|
|
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(
|
|
2675
|
+
console.log(WARNING10(" \u26A0\uFE0F No conversations found."));
|
|
2601
2676
|
if (options.search) {
|
|
2602
|
-
console.log(
|
|
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(
|
|
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(
|
|
2620
|
-
console.log(
|
|
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:
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
2663
|
-
console.log(
|
|
2664
|
-
console.log(
|
|
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(
|
|
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(
|
|
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(
|
|
2754
|
+
console.log(MUTED11(` Search: "${search}"`));
|
|
2680
2755
|
}
|
|
2681
|
-
console.log(
|
|
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(
|
|
2684
|
-
console.log(
|
|
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(
|
|
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(
|
|
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(
|
|
2775
|
+
console.log(MUTED11(` Page ${result.page}/${result.totalPages}`));
|
|
2701
2776
|
if (result.page < result.totalPages) {
|
|
2702
|
-
console.log(
|
|
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(
|
|
2708
|
-
console.log(
|
|
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 ?
|
|
2719
|
-
const forkCount = convo.forkCount ?
|
|
2720
|
-
const projectIcon = convo.hasProject ?
|
|
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 =
|
|
2724
|
-
const timeStr =
|
|
2725
|
-
const line = ` ${indicator} ${numStr}. ${modeIcon} ${
|
|
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
|
|
2846
|
+
import chalk16 from "chalk";
|
|
2772
2847
|
|
|
2773
2848
|
// src/ui/animations/fork-split.ts
|
|
2774
|
-
import
|
|
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(
|
|
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(
|
|
2870
|
-
console.log(
|
|
2871
|
-
console.log(` ${
|
|
2872
|
-
console.log(
|
|
2873
|
-
console.log(
|
|
2874
|
-
console.log(
|
|
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(
|
|
2892
|
-
console.log(
|
|
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(
|
|
2899
|
-
console.log(
|
|
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(
|
|
2906
|
-
console.log(
|
|
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(
|
|
2923
|
-
console.log(
|
|
2924
|
-
console.log(
|
|
2925
|
-
console.log(
|
|
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(
|
|
2929
|
-
console.log(
|
|
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(
|
|
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(
|
|
3022
|
+
console.log(MUTED12(" \u{1F4CB} Context carried forward:"));
|
|
2940
3023
|
for (const point of result.keyPoints.slice(0, 4)) {
|
|
2941
|
-
console.log(
|
|
3024
|
+
console.log(MUTED12(` \u2022 ${point}`));
|
|
2942
3025
|
}
|
|
2943
3026
|
console.log("");
|
|
2944
3027
|
}
|
|
2945
3028
|
} else {
|
|
2946
3029
|
console.log("");
|
|
2947
|
-
console.log(
|
|
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(
|
|
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(
|
|
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(
|
|
3051
|
+
console.log(ERROR10(" \u274C No active conversation."));
|
|
2969
3052
|
console.log("");
|
|
2970
3053
|
return;
|
|
2971
3054
|
}
|
|
2972
3055
|
console.log("");
|
|
2973
|
-
console.log(
|
|
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(
|
|
2981
|
-
console.log(
|
|
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(
|
|
2984
|
-
console.log(
|
|
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(` ${
|
|
2988
|
-
console.log(
|
|
2989
|
-
console.log(
|
|
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(
|
|
2994
|
-
console.log(
|
|
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(
|
|
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
|
|
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
|
|
3010
|
-
var
|
|
3011
|
-
var
|
|
3012
|
-
var
|
|
3013
|
-
var
|
|
3014
|
-
var
|
|
3015
|
-
var
|
|
3016
|
-
var
|
|
3017
|
-
var BORDER3 =
|
|
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:
|
|
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(
|
|
3094
|
-
console.log(
|
|
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(
|
|
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(
|
|
3195
|
+
console.log(row(BRAND_SECONDARY12(" \u25C6 MINIBOB ANALYSIS DASHBOARD")));
|
|
3113
3196
|
console.log(midRule());
|
|
3114
3197
|
console.log(row(""));
|
|
3115
|
-
const bugLabel =
|
|
3116
|
-
const featLabel =
|
|
3117
|
-
const imprLabel =
|
|
3118
|
-
const upgrLabel =
|
|
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 =
|
|
3122
|
-
const featCount =
|
|
3123
|
-
const imprCount =
|
|
3124
|
-
const upgrCount =
|
|
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 =
|
|
3132
|
-
else if (completionPercent >= 50) barColor =
|
|
3133
|
-
else if (completionPercent >= 25) barColor =
|
|
3134
|
-
else barColor =
|
|
3135
|
-
const progressBar = barColor("\u2588".repeat(filled)) +
|
|
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(
|
|
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(
|
|
3142
|
-
console.log(
|
|
3143
|
-
console.log(
|
|
3144
|
-
console.log(
|
|
3145
|
-
console.log(
|
|
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(
|
|
3148
|
-
console.log(
|
|
3149
|
-
console.log(
|
|
3150
|
-
console.log(
|
|
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(
|
|
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:
|
|
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(
|
|
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 =
|
|
3176
|
-
else if (pct < 50) barColor =
|
|
3177
|
-
else if (pct < 75) barColor =
|
|
3178
|
-
else barColor =
|
|
3179
|
-
const bar2 = barColor("\u2588".repeat(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(
|
|
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(
|
|
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(
|
|
3199
|
-
console.log(
|
|
3200
|
-
console.log(
|
|
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(
|
|
3205
|
-
console.log(
|
|
3206
|
-
console.log(
|
|
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(
|
|
3212
|
-
console.log(
|
|
3213
|
-
console.log(
|
|
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(
|
|
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(
|
|
3226
|
-
console.log(
|
|
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(
|
|
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(
|
|
3328
|
-
console.log(
|
|
3329
|
-
console.log(
|
|
3330
|
-
console.log(
|
|
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 =
|
|
3370
|
-
else if (percent < 0.5) barColor =
|
|
3371
|
-
else if (percent < 0.75) barColor =
|
|
3372
|
-
else barColor =
|
|
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 =
|
|
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(` ${
|
|
3378
|
-
console.log(
|
|
3379
|
-
console.log(
|
|
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
|
|
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 =
|
|
3391
|
-
var GREEN =
|
|
3392
|
-
var AMBER2 =
|
|
3393
|
-
var BLUE =
|
|
3394
|
-
var GRAY =
|
|
3395
|
-
var BORDER4 =
|
|
3396
|
-
var 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(
|
|
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(
|
|
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(
|
|
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(
|
|
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 =
|
|
3766
|
-
else if (percent < 0.5) barColor =
|
|
3767
|
-
else if (percent < 0.75) barColor =
|
|
3768
|
-
else barColor =
|
|
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 =
|
|
3815
|
-
else if (percent < 0.5) barColor =
|
|
3816
|
-
else if (percent < 0.75) barColor =
|
|
3817
|
-
else barColor =
|
|
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
|
|
3918
|
+
import chalk19 from "chalk";
|
|
3836
3919
|
import * as os3 from "os";
|
|
3837
3920
|
import * as path11 from "path";
|
|
3838
|
-
var GREEN2 =
|
|
3839
|
-
var AMBER3 =
|
|
3840
|
-
var BLUE2 =
|
|
3841
|
-
var RED2 =
|
|
3842
|
-
var GRAY2 =
|
|
3843
|
-
var CYAN2 =
|
|
3844
|
-
var BORDER5 =
|
|
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
|
|
4278
|
+
import chalk20 from "chalk";
|
|
4196
4279
|
import ora7 from "ora";
|
|
4197
4280
|
import * as readline7 from "readline";
|
|
4198
|
-
var
|
|
4199
|
-
var
|
|
4200
|
-
var
|
|
4201
|
-
var
|
|
4202
|
-
var
|
|
4203
|
-
var
|
|
4204
|
-
var
|
|
4205
|
-
var BORDER6 =
|
|
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(
|
|
4212
|
-
console.log(
|
|
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(
|
|
4232
|
-
console.log(
|
|
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(
|
|
4242
|
-
console.log(
|
|
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:
|
|
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(
|
|
4261
|
-
console.log(
|
|
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(
|
|
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") +
|
|
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") +
|
|
4277
|
-
console.log(BORDER6(" \u2551") +
|
|
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") +
|
|
4280
|
-
console.log(BORDER6(" \u2551") +
|
|
4281
|
-
console.log(BORDER6(" \u2551") +
|
|
4282
|
-
console.log(BORDER6(" \u2551") +
|
|
4283
|
-
console.log(BORDER6(" \u2551") +
|
|
4284
|
-
console.log(BORDER6(" \u2551") +
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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:
|
|
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(
|
|
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(
|
|
4369
|
-
console.log(
|
|
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(
|
|
4459
|
+
console.log(MUTED14(` \u2514\u2500 \u{1F4C2} Referenced: ${pollResult.result.referencedFiles.join(", ")}`));
|
|
4377
4460
|
}
|
|
4378
|
-
console.log(
|
|
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(
|
|
4464
|
+
console.log(SUCCESS14(` \u2705 ${pollResult.result.message}`));
|
|
4382
4465
|
} else if (pollResult.result?.error) {
|
|
4383
4466
|
console.log("");
|
|
4384
|
-
console.log(
|
|
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(
|
|
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(
|
|
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(
|
|
4410
|
-
console.log(
|
|
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:
|
|
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") +
|
|
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") +
|
|
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") +
|
|
4430
|
-
console.log(BORDER6(" \u2551") +
|
|
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") +
|
|
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(
|
|
4442
|
-
console.log(
|
|
4443
|
-
console.log(
|
|
4444
|
-
console.log(
|
|
4445
|
-
console.log(
|
|
4446
|
-
console.log(
|
|
4447
|
-
console.log(
|
|
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(
|
|
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:
|
|
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(
|
|
4465
|
-
console.log(
|
|
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") +
|
|
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") + ` ${
|
|
4477
|
-
console.log(BORDER6(" \u2551") +
|
|
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(
|
|
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(
|
|
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(
|
|
4495
|
-
console.log(
|
|
4496
|
-
console.log(
|
|
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(
|
|
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
|
|
4603
|
+
import chalk23 from "chalk";
|
|
4521
4604
|
import ora10 from "ora";
|
|
4522
4605
|
|
|
4523
4606
|
// src/core/cloud-profiler.ts
|
|
4524
|
-
import
|
|
4607
|
+
import chalk21 from "chalk";
|
|
4525
4608
|
import ora8 from "ora";
|
|
4526
|
-
var AMBER4 =
|
|
4527
|
-
var ORANGE =
|
|
4528
|
-
var GREEN3 =
|
|
4529
|
-
var CYAN3 =
|
|
4530
|
-
var RED3 =
|
|
4531
|
-
var GRAY3 =
|
|
4532
|
-
var WHITE2 =
|
|
4533
|
-
var BORDER7 =
|
|
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 =
|
|
4540
|
-
else if (score >= 50) barColor =
|
|
4541
|
-
else if (score >= 25) barColor =
|
|
4542
|
-
else barColor =
|
|
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 =
|
|
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)) +
|
|
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: ${
|
|
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
|
|
4994
|
+
import chalk22 from "chalk";
|
|
4912
4995
|
import ora9 from "ora";
|
|
4913
|
-
var
|
|
4914
|
-
var
|
|
4915
|
-
var
|
|
4916
|
-
var
|
|
4917
|
-
var
|
|
4918
|
-
var
|
|
4919
|
-
var
|
|
4920
|
-
var
|
|
4921
|
-
var MODE_PERSONALIZATION2 =
|
|
4922
|
-
var GOLD =
|
|
4923
|
-
var BORDER8 =
|
|
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 =
|
|
4945
|
-
else if (numScore >= 50) barColor =
|
|
4946
|
-
else if (numScore >= 25) barColor =
|
|
4947
|
-
else barColor =
|
|
4948
|
-
return `${barColor("\u2588".repeat(filled))}${
|
|
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
|
|
4981
|
-
if (lower.includes("falling") || lower.includes("declining")) return
|
|
4982
|
-
if (lower.includes("stable")) return
|
|
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(
|
|
4994
|
-
console.log(
|
|
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:
|
|
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(
|
|
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(
|
|
5010
|
-
console.log(
|
|
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(
|
|
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(` ${
|
|
5022
|
-
console.log(row2(` ${
|
|
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(` ${
|
|
5026
|
-
console.log(row2(` ${
|
|
5027
|
-
console.log(row2(` ${
|
|
5028
|
-
console.log(row2(` ${
|
|
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(` ${
|
|
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(` ${
|
|
5120
|
+
console.log(row2(` ${chalk22.white("Emotions:")}`));
|
|
5038
5121
|
if (daily.primaryEmotion?.dominantEmotion) {
|
|
5039
|
-
console.log(row2(` ${
|
|
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(` ${
|
|
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(` ${
|
|
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(` ${
|
|
5051
|
-
console.log(row2(` ${
|
|
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(` ${
|
|
5057
|
-
console.log(row2(` ${
|
|
5058
|
-
console.log(row2(` ${
|
|
5059
|
-
if (b.consistency) console.log(row2(` ${
|
|
5060
|
-
if (b.followThrough) console.log(row2(` ${
|
|
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(
|
|
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(` ${
|
|
5071
|
-
console.log(row2(` ${
|
|
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(` ${
|
|
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(` ${
|
|
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(` ${
|
|
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(` ${
|
|
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(` ${
|
|
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(` ${
|
|
5177
|
+
console.log(row2(` ${SUCCESS15("+")} ${MUTED15("Win:")} ${trunc(w.strategicAnalysis.biggestWin, 45)}`));
|
|
5095
5178
|
}
|
|
5096
5179
|
if (w.strategicAnalysis.biggestMiss) {
|
|
5097
|
-
console.log(row2(` ${
|
|
5180
|
+
console.log(row2(` ${ERROR13("-")} ${MUTED15("Miss:")} ${trunc(w.strategicAnalysis.biggestMiss, 45)}`));
|
|
5098
5181
|
}
|
|
5099
5182
|
if (w.strategicAnalysis.blindSpot) {
|
|
5100
|
-
console.log(row2(` ${
|
|
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(` ${
|
|
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(` ${
|
|
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(` ${
|
|
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(` ${
|
|
5125
|
-
if (innovT) console.log(row2(` ${
|
|
5126
|
-
if (execT) console.log(row2(` ${
|
|
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(` ${
|
|
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(` ${
|
|
5137
|
-
if (dna.coreMotivation) console.log(row2(` ${
|
|
5138
|
-
if (dna.workIdentity) console.log(row2(` ${
|
|
5139
|
-
if (dna.stressResponse) console.log(row2(` ${
|
|
5140
|
-
if (dna.learningStyle) console.log(row2(` ${
|
|
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(` ${
|
|
5146
|
-
if (ps.confidence) console.log(row2(` ${
|
|
5147
|
-
if (ps.resilience) console.log(row2(` ${
|
|
5148
|
-
if (ps.burnoutRisk) console.log(row2(` ${
|
|
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(` ${
|
|
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(` ${
|
|
5239
|
+
console.log(row2(` ${chalk22.white("Predictions:")}`));
|
|
5157
5240
|
if (pi.likelyNextMonthArchetype) {
|
|
5158
|
-
console.log(row2(` ${
|
|
5241
|
+
console.log(row2(` ${MUTED15("Next Month:")} ${BRAND_SECONDARY14(trunc(pi.likelyNextMonthArchetype, 40))}`));
|
|
5159
5242
|
}
|
|
5160
5243
|
if (pi.communicationStrategy) {
|
|
5161
|
-
console.log(row2(` ${
|
|
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(` ${
|
|
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(
|
|
5172
|
-
console.log(
|
|
5173
|
-
console.log(
|
|
5174
|
-
console.log(
|
|
5175
|
-
console.log(
|
|
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(
|
|
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 =
|
|
5188
|
-
var GREEN4 =
|
|
5189
|
-
var BLUE3 =
|
|
5190
|
-
var GRAY4 =
|
|
5191
|
-
var CYAN4 =
|
|
5192
|
-
var RED4 =
|
|
5193
|
-
var BORDER9 =
|
|
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.
|
|
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(
|
|
5648
|
-
console.log(
|
|
5649
|
-
console.log(` ${
|
|
5650
|
-
console.log(` ${
|
|
5651
|
-
console.log(` ${
|
|
5652
|
-
console.log(` ${
|
|
5653
|
-
console.log(` ${
|
|
5654
|
-
console.log(` ${
|
|
5655
|
-
console.log(` ${
|
|
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(
|
|
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();
|