0xkobold 0.0.2 → 0.0.4
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 +59 -5
- package/dist/package.json +7 -5
- package/dist/src/cli/commands/setup.js +144 -0
- package/dist/src/cli/commands/setup.js.map +1 -0
- package/dist/src/cli/program.js +3 -0
- package/dist/src/cli/program.js.map +1 -1
- package/dist/src/extensions/core/auto-compact-on-error-extension.js +244 -0
- package/dist/src/extensions/core/auto-compact-on-error-extension.js.map +1 -0
- package/dist/src/extensions/core/diagnostics-extension.js +215 -0
- package/dist/src/extensions/core/diagnostics-extension.js.map +1 -0
- package/dist/src/extensions/core/extension-scaffold-extension.js +449 -0
- package/dist/src/extensions/core/extension-scaffold-extension.js.map +1 -0
- package/dist/src/extensions/core/git-commit-extension.js +527 -0
- package/dist/src/extensions/core/git-commit-extension.js.map +1 -0
- package/dist/src/extensions/core/heartbeat-extension.js +43 -0
- package/dist/src/extensions/core/heartbeat-extension.js.map +1 -1
- package/dist/src/extensions/core/memory-extension.js +120 -0
- package/dist/src/extensions/core/memory-extension.js.map +1 -0
- package/dist/src/extensions/core/memory-synthesis-extension.js +137 -0
- package/dist/src/extensions/core/memory-synthesis-extension.js.map +1 -0
- package/dist/src/extensions/core/mode-manager-extension.js +19 -0
- package/dist/src/extensions/core/mode-manager-extension.js.map +1 -1
- package/dist/src/extensions/core/ollama-cloud-extension.js +132 -0
- package/dist/src/extensions/core/ollama-cloud-extension.js.map +1 -0
- package/dist/src/extensions/core/ollama-router-extension.js +100 -0
- package/dist/src/extensions/core/ollama-router-extension.js.map +1 -0
- package/dist/src/extensions/core/perennial-memory-extension.js +449 -0
- package/dist/src/extensions/core/perennial-memory-extension.js.map +1 -0
- package/dist/src/index.js +7 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/llm/ollama.js +80 -9
- package/dist/src/llm/ollama.js.map +1 -1
- package/package.json +7 -5
- package/scripts/postinstall.js +71 -0
package/dist/src/llm/ollama.js
CHANGED
|
@@ -3,13 +3,28 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Local LLM via Ollama HTTP API.
|
|
5
5
|
*/
|
|
6
|
-
|
|
6
|
+
import { shouldUseCloud } from '../extensions/core/ollama-router-extension';
|
|
7
|
+
const LOCAL_BASE_URL = process.env.OLLAMA_URL ?? 'http://localhost:11434';
|
|
8
|
+
const CLOUD_BASE_URL = 'https://ollama.com';
|
|
7
9
|
/**
|
|
8
|
-
*
|
|
10
|
+
* Get Ollama base URL based on mode
|
|
11
|
+
*/
|
|
12
|
+
function getOllamaBaseUrl() {
|
|
13
|
+
return shouldUseCloud() ? CLOUD_BASE_URL : LOCAL_BASE_URL;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Get Ollama API key for cloud mode
|
|
17
|
+
*/
|
|
18
|
+
async function getOllamaApiKey() {
|
|
19
|
+
// Will be populated by framework from auth.json
|
|
20
|
+
return process.env.OLLAMA_API_KEY;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Check if Ollama is running (local mode)
|
|
9
24
|
*/
|
|
10
25
|
export async function isOllamaRunning() {
|
|
11
26
|
try {
|
|
12
|
-
const res = await fetch(`${
|
|
27
|
+
const res = await fetch(`${LOCAL_BASE_URL}/api/tags`, {
|
|
13
28
|
method: 'GET',
|
|
14
29
|
});
|
|
15
30
|
return res.ok;
|
|
@@ -18,12 +33,30 @@ export async function isOllamaRunning() {
|
|
|
18
33
|
return false;
|
|
19
34
|
}
|
|
20
35
|
}
|
|
36
|
+
/**
|
|
37
|
+
* Check if Ollama Cloud is available
|
|
38
|
+
*/
|
|
39
|
+
export async function isOllamaCloudAvailable() {
|
|
40
|
+
try {
|
|
41
|
+
const apiKey = await getOllamaApiKey();
|
|
42
|
+
if (!apiKey)
|
|
43
|
+
return false;
|
|
44
|
+
const res = await fetch(`${CLOUD_BASE_URL}/api/tags`, {
|
|
45
|
+
headers: { 'Authorization': `Bearer ${apiKey}` },
|
|
46
|
+
});
|
|
47
|
+
return res.ok;
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
21
53
|
/**
|
|
22
54
|
* List available Ollama models
|
|
23
55
|
*/
|
|
24
56
|
export async function listOllamaModels() {
|
|
25
57
|
try {
|
|
26
|
-
const
|
|
58
|
+
const baseUrl = getOllamaBaseUrl();
|
|
59
|
+
const res = await fetch(`${baseUrl}/api/tags`);
|
|
27
60
|
if (!res.ok)
|
|
28
61
|
return [];
|
|
29
62
|
const data = await res.json();
|
|
@@ -35,15 +68,25 @@ export async function listOllamaModels() {
|
|
|
35
68
|
}
|
|
36
69
|
/**
|
|
37
70
|
* Ollama LLM Provider
|
|
71
|
+
* Supports both local (localhost:11434) and cloud (ollama.com) modes
|
|
38
72
|
*/
|
|
39
73
|
export class OllamaProvider {
|
|
40
74
|
name = 'ollama';
|
|
41
75
|
baseUrl;
|
|
42
|
-
constructor(baseUrl
|
|
43
|
-
this.baseUrl = baseUrl;
|
|
76
|
+
constructor(baseUrl) {
|
|
77
|
+
this.baseUrl = baseUrl ?? getOllamaBaseUrl();
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Update base URL based on current mode
|
|
81
|
+
*/
|
|
82
|
+
updateBaseUrl() {
|
|
83
|
+
this.baseUrl = getOllamaBaseUrl();
|
|
44
84
|
}
|
|
45
85
|
async chat(options) {
|
|
86
|
+
// Ensure we're using correct mode
|
|
87
|
+
this.updateBaseUrl();
|
|
46
88
|
const model = options.model.replace('ollama/', '');
|
|
89
|
+
const isCloud = this.baseUrl === CLOUD_BASE_URL;
|
|
47
90
|
// Convert messages to Ollama format
|
|
48
91
|
const messages = options.messages.map((m) => ({
|
|
49
92
|
role: m.role,
|
|
@@ -72,14 +115,25 @@ export class OllamaProvider {
|
|
|
72
115
|
function: t.function,
|
|
73
116
|
}));
|
|
74
117
|
}
|
|
118
|
+
// Build headers
|
|
119
|
+
const headers = {
|
|
120
|
+
'Content-Type': 'application/json',
|
|
121
|
+
};
|
|
122
|
+
// Add auth header for cloud mode
|
|
123
|
+
if (isCloud) {
|
|
124
|
+
const apiKey = await getOllamaApiKey();
|
|
125
|
+
if (apiKey) {
|
|
126
|
+
headers['Authorization'] = `Bearer ${apiKey}`;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
75
129
|
const res = await fetch(`${this.baseUrl}/api/chat`, {
|
|
76
130
|
method: 'POST',
|
|
77
|
-
headers
|
|
131
|
+
headers,
|
|
78
132
|
body: JSON.stringify(body),
|
|
79
133
|
});
|
|
80
134
|
if (!res.ok) {
|
|
81
135
|
const err = await res.text();
|
|
82
|
-
throw new Error(`Ollama error: ${err}`);
|
|
136
|
+
throw new Error(`Ollama ${isCloud ? 'Cloud' : 'Local'} error: ${err}`);
|
|
83
137
|
}
|
|
84
138
|
const data = await res.json();
|
|
85
139
|
// Parse tool calls from response
|
|
@@ -101,7 +155,24 @@ export class OllamaProvider {
|
|
|
101
155
|
};
|
|
102
156
|
}
|
|
103
157
|
async listModels() {
|
|
104
|
-
|
|
158
|
+
this.updateBaseUrl();
|
|
159
|
+
const isCloud = this.baseUrl === CLOUD_BASE_URL;
|
|
160
|
+
try {
|
|
161
|
+
const headers = {};
|
|
162
|
+
if (isCloud) {
|
|
163
|
+
const apiKey = await getOllamaApiKey();
|
|
164
|
+
if (apiKey)
|
|
165
|
+
headers['Authorization'] = `Bearer ${apiKey}`;
|
|
166
|
+
}
|
|
167
|
+
const res = await fetch(`${this.baseUrl}/api/tags`, { headers });
|
|
168
|
+
if (!res.ok)
|
|
169
|
+
return [];
|
|
170
|
+
const data = await res.json();
|
|
171
|
+
return (data.models ?? []).map((m) => m.name);
|
|
172
|
+
}
|
|
173
|
+
catch {
|
|
174
|
+
return [];
|
|
175
|
+
}
|
|
105
176
|
}
|
|
106
177
|
}
|
|
107
178
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ollama.js","sourceRoot":"","sources":["../../../src/llm/ollama.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"ollama.js","sourceRoot":"","sources":["../../../src/llm/ollama.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,4CAA4C,CAAC;AAE5E,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,wBAAwB,CAAC;AAC1E,MAAM,cAAc,GAAG,oBAAoB,CAAC;AAE5C;;GAEG;AACH,SAAS,gBAAgB;IACvB,OAAO,cAAc,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,cAAc,CAAC;AAC5D,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,eAAe;IAC5B,gDAAgD;IAChD,OAAO,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;AACpC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,cAAc,WAAW,EAAE;YACpD,MAAM,EAAE,KAAK;SACd,CAAC,CAAC;QACH,OAAO,GAAG,CAAC,EAAE,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB;IAC1C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,eAAe,EAAE,CAAC;QACvC,IAAI,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QAE1B,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,cAAc,WAAW,EAAE;YACpD,OAAO,EAAE,EAAE,eAAe,EAAE,UAAU,MAAM,EAAE,EAAE;SACjD,CAAC,CAAC;QACH,OAAO,GAAG,CAAC,EAAE,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,gBAAgB,EAAE,CAAC;QACnC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,WAAW,CAAC,CAAC;QAC/C,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,OAAO,EAAE,CAAC;QAEvB,MAAM,IAAI,GAAQ,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QACnC,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACrD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,OAAO,cAAc;IACzB,IAAI,GAAG,QAAQ,CAAC;IACR,OAAO,CAAS;IAExB,YAAY,OAAgB;QAC1B,IAAI,CAAC,OAAO,GAAG,OAAO,IAAI,gBAAgB,EAAE,CAAC;IAC/C,CAAC;IAED;;OAEG;IACH,aAAa;QACX,IAAI,CAAC,OAAO,GAAG,gBAAgB,EAAE,CAAC;IACpC,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,OAAoB;QAC7B,kCAAkC;QAClC,IAAI,CAAC,aAAa,EAAE,CAAC;QAErB,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QACnD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,KAAK,cAAc,CAAC;QAEhD,oCAAoC;QACpC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAU,EAAE,EAAE,CAAC,CAAC;YACrD,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,UAAU,EAAE,CAAC,CAAC,SAAS,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;gBAClC,QAAQ,EAAE;oBACR,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI;oBACtB,SAAS,EAAE,EAAE,CAAC,QAAQ,CAAC,SAAS;iBACjC;aACF,CAAC,CAAC;SACJ,CAAC,CAAC,CAAC;QAEJ,gBAAgB;QAChB,MAAM,IAAI,GAAQ;YAChB,KAAK;YACL,QAAQ;YACR,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,KAAK;YAC/B,OAAO,EAAE;gBACP,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,GAAG;gBACvC,WAAW,EAAE,OAAO,CAAC,SAAS,IAAI,IAAI;aACvC;SACF,CAAC;QAEF,wBAAwB;QACxB,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9C,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBACnC,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,QAAQ,EAAE,CAAC,CAAC,QAAQ;aACrB,CAAC,CAAC,CAAC;QACN,CAAC;QAED,gBAAgB;QAChB,MAAM,OAAO,GAA2B;YACtC,cAAc,EAAE,kBAAkB;SACnC,CAAC;QAEF,iCAAiC;QACjC,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,MAAM,GAAG,MAAM,eAAe,EAAE,CAAC;YACvC,IAAI,MAAM,EAAE,CAAC;gBACX,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,MAAM,EAAE,CAAC;YAChD,CAAC;QACH,CAAC;QAED,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,WAAW,EAAE;YAClD,MAAM,EAAE,MAAM;YACd,OAAO;YACP,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SAC3B,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,UAAU,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,WAAW,GAAG,EAAE,CAAC,CAAC;QACzE,CAAC;QAED,MAAM,IAAI,GAAQ,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAEnC,iCAAiC;QACjC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC,EAAO,EAAE,EAAE,CAAC,CAAC;YAC5D,EAAE,EAAE,QAAQ,IAAI,CAAC,GAAG,EAAE,EAAE;YACxB,QAAQ,EAAE;gBACR,IAAI,EAAE,EAAE,CAAC,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC,QAAQ;gBACtC,SAAS,EAAE,EAAE,CAAC,QAAQ,EAAE,SAAS,IAAI,EAAE;aACxC;SACF,CAAC,CAAC,CAAC;QAEJ,OAAO;YACL,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,IAAI,EAAE;YACpC,SAAS;YACT,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,KAAK,EAAE;gBACL,WAAW,EAAE,IAAI,CAAC,iBAAiB,IAAI,CAAC;gBACxC,YAAY,EAAE,IAAI,CAAC,UAAU,IAAI,CAAC;aACnC;SACF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,UAAU;QACd,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,KAAK,cAAc,CAAC;QAEhD,IAAI,CAAC;YACH,MAAM,OAAO,GAA2B,EAAE,CAAC;YAC3C,IAAI,OAAO,EAAE,CAAC;gBACZ,MAAM,MAAM,GAAG,MAAM,eAAe,EAAE,CAAC;gBACvC,IAAI,MAAM;oBAAE,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,MAAM,EAAE,CAAC;YAC5D,CAAC;YAED,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,WAAW,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;YACjE,IAAI,CAAC,GAAG,CAAC,EAAE;gBAAE,OAAO,EAAE,CAAC;YAEvB,MAAM,IAAI,GAAQ,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;YACnC,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACrD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB;IAClC,OAAO,IAAI,cAAc,EAAE,CAAC;AAC9B,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "0xkobold",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.4",
|
|
4
4
|
"description": "Your digital familiar - a personal AI assistant that learns and evolves",
|
|
5
5
|
"main": "dist/src/index.js",
|
|
6
6
|
"types": "dist/src/index.d.ts",
|
|
@@ -28,15 +28,16 @@
|
|
|
28
28
|
"update:install": "bun run src/cli/index.ts update install",
|
|
29
29
|
"update:framework": "bun run src/cli/index.ts update framework",
|
|
30
30
|
"setup-hooks": "bash scripts/install-hooks.sh",
|
|
31
|
-
"prepublishOnly": "bun run build"
|
|
31
|
+
"prepublishOnly": "bun run build",
|
|
32
|
+
"postinstall": "node scripts/postinstall.js || echo 'Welcome to 0xKobold! Run: 0xkobold setup'"
|
|
32
33
|
},
|
|
33
34
|
"keywords": ["ai", "assistant", "cli", "agent", "kobold"],
|
|
34
35
|
"author": "0xKobold Team",
|
|
35
36
|
"license": "MIT",
|
|
36
37
|
"dependencies": {
|
|
37
|
-
"@mariozechner/pi-agent-core": "0.57.
|
|
38
|
-
"@mariozechner/pi-coding-agent": "0.57.
|
|
39
|
-
"@mariozechner/pi-tui": "0.57.
|
|
38
|
+
"@mariozechner/pi-agent-core": "0.57.1",
|
|
39
|
+
"@mariozechner/pi-coding-agent": "0.57.1",
|
|
40
|
+
"@mariozechner/pi-tui": "0.57.1",
|
|
40
41
|
"ajv": "^8.18.0",
|
|
41
42
|
"blessed": "^0.1.81",
|
|
42
43
|
"commander": "^11.1.0",
|
|
@@ -63,6 +64,7 @@
|
|
|
63
64
|
"private": false,
|
|
64
65
|
"files": [
|
|
65
66
|
"dist",
|
|
67
|
+
"scripts/postinstall.js",
|
|
66
68
|
"README.md",
|
|
67
69
|
"LICENSE",
|
|
68
70
|
"package.json",
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Post-install welcome message
|
|
4
|
+
* Shows when users install 0xKobold via npm
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { homedir } from "node:os";
|
|
8
|
+
import { join } from "node:path";
|
|
9
|
+
import { existsSync } from "node:fs";
|
|
10
|
+
|
|
11
|
+
const isCiEnvironment = () => {
|
|
12
|
+
return process.env.CI ||
|
|
13
|
+
process.env.CONTINUOUS_INTEGRATION ||
|
|
14
|
+
process.env.NODE_ENV === "test";
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
const showWelcome = () => {
|
|
18
|
+
const configPath = join(homedir(), ".0xkobold", "config.json");
|
|
19
|
+
const isConfigured = existsSync(configPath);
|
|
20
|
+
|
|
21
|
+
console.log(`
|
|
22
|
+
╔════════════════════════════════════════════════════════╗
|
|
23
|
+
║ 🐲 0xKobold Installed ║
|
|
24
|
+
╚════════════════════════════════════════════════════════╝
|
|
25
|
+
|
|
26
|
+
Your personal AI assistant with multi-agent capabilities
|
|
27
|
+
|
|
28
|
+
`);
|
|
29
|
+
|
|
30
|
+
if (!isConfigured) {
|
|
31
|
+
console.log(` Quick start:
|
|
32
|
+
────────────
|
|
33
|
+
1. Configure 0xKobold:
|
|
34
|
+
0xkobold setup
|
|
35
|
+
|
|
36
|
+
2. Start the TUI:
|
|
37
|
+
0xkobold
|
|
38
|
+
|
|
39
|
+
3. Or start in specific mode:
|
|
40
|
+
0xkobold --mode plan # For planning/research
|
|
41
|
+
0xkobold --mode build # For implementation
|
|
42
|
+
|
|
43
|
+
Requirements:
|
|
44
|
+
─────────────
|
|
45
|
+
• Bun runtime required (0xKobold will check for it)
|
|
46
|
+
• Install Bun: curl -fsSL https://bun.sh/install | bash
|
|
47
|
+
|
|
48
|
+
Documentation:
|
|
49
|
+
──────────────
|
|
50
|
+
• GitHub: https://github.com/kobolds/0xKobolds
|
|
51
|
+
• Usage: 0xkobold --help
|
|
52
|
+
• VPS: https://github.com/kobolds/0xKobolds/blob/main/docs/VPS-DEPLOYMENT.md
|
|
53
|
+
|
|
54
|
+
`);
|
|
55
|
+
} else {
|
|
56
|
+
console.log(` Your 0xKobold is configured.
|
|
57
|
+
|
|
58
|
+
Start with: 0xkobold
|
|
59
|
+
Gateway: 0xkobold gateway start
|
|
60
|
+
Status: 0xkobold status
|
|
61
|
+
|
|
62
|
+
`);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
if (isCiEnvironment()) {
|
|
66
|
+
process.exit(0);
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
// Only show in actual install, not CI
|
|
71
|
+
showWelcome();
|