@ch4p/cli 0.1.3 → 0.1.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.
Files changed (44) hide show
  1. package/dist/agent-6WIHK7NM.js +767 -0
  2. package/dist/agent-ANIZYPPF.js +767 -0
  3. package/dist/agent-HSAJ5EBN.js +761 -0
  4. package/dist/audit-HLOQBMBT.js +12 -0
  5. package/dist/audit-UIGPH3FK.js +12 -0
  6. package/dist/canvas-3VTC4XPV.js +313 -0
  7. package/dist/canvas-4FMNW6FZ.js +313 -0
  8. package/dist/canvas-XQHVCY27.js +313 -0
  9. package/dist/chunk-3XAW4XHG.js +185 -0
  10. package/dist/chunk-4IRZQCRN.js +1832 -0
  11. package/dist/chunk-AORLXQHZ.js +304 -0
  12. package/dist/chunk-BMEBRUYL.js +6995 -0
  13. package/dist/chunk-IN2I6XRM.js +185 -0
  14. package/dist/chunk-TB4IZ7F7.js +301 -0
  15. package/dist/chunk-U7S375OS.js +1841 -0
  16. package/dist/dist-37TB6EWP.js +25 -0
  17. package/dist/dist-CIJPZC2B.js +25 -0
  18. package/dist/doctor-5M3ZB435.js +274 -0
  19. package/dist/doctor-IQ3MWQSN.js +274 -0
  20. package/dist/gateway-DV5OL45G.js +2164 -0
  21. package/dist/gateway-LUCG72YX.js +2129 -0
  22. package/dist/gateway-O3QNSZKF.js +2123 -0
  23. package/dist/gateway-OJW7RY3H.js +2094 -0
  24. package/dist/gateway-PBLJEK5I.js +2165 -0
  25. package/dist/gateway-PHPRQTZP.js +2165 -0
  26. package/dist/gateway-YKKJ4DZE.js +2115 -0
  27. package/dist/gateway-Z65DCM2Q.js +2097 -0
  28. package/dist/gateway-ZSXTAYPF.js +2157 -0
  29. package/dist/identity-RHQFPSDS.js +215 -0
  30. package/dist/identity-VGDDAKBY.js +215 -0
  31. package/dist/index.js +12 -12
  32. package/dist/install-6LV7B2SV.js +378 -0
  33. package/dist/install-NAUPXVCI.js +378 -0
  34. package/dist/message-TGAPVVI4.js +189 -0
  35. package/dist/message-YQGIARNE.js +189 -0
  36. package/dist/onboard-CN56V5P6.js +849 -0
  37. package/dist/onboard-LJFC6HXD.js +849 -0
  38. package/dist/pairing-ARWQYATE.js +147 -0
  39. package/dist/pairing-PXCJMCT2.js +147 -0
  40. package/dist/skills-4EELFYO2.js +138 -0
  41. package/dist/skills-KXRTDSF2.js +138 -0
  42. package/dist/status-2ZJPK3VL.js +94 -0
  43. package/dist/status-W2OXOSH4.js +94 -0
  44. package/package.json +24 -24
@@ -0,0 +1,25 @@
1
+ import {
2
+ AgentLoop,
3
+ ContextManager,
4
+ FormatVerifier,
5
+ LLMVerifier,
6
+ NAMED_STRATEGIES,
7
+ Session,
8
+ SteeringQueue,
9
+ ToolWorkerPool,
10
+ createAutoRecallHook,
11
+ createAutoSummarizeHook
12
+ } from "./chunk-U7S375OS.js";
13
+ import "./chunk-YSCX2QQQ.js";
14
+ export {
15
+ AgentLoop,
16
+ ContextManager,
17
+ FormatVerifier,
18
+ LLMVerifier,
19
+ NAMED_STRATEGIES,
20
+ Session,
21
+ SteeringQueue,
22
+ ToolWorkerPool,
23
+ createAutoRecallHook,
24
+ createAutoSummarizeHook
25
+ };
@@ -0,0 +1,25 @@
1
+ import {
2
+ AgentLoop,
3
+ ContextManager,
4
+ FormatVerifier,
5
+ LLMVerifier,
6
+ NAMED_STRATEGIES,
7
+ Session,
8
+ SteeringQueue,
9
+ ToolWorkerPool,
10
+ createAutoRecallHook,
11
+ createAutoSummarizeHook
12
+ } from "./chunk-4IRZQCRN.js";
13
+ import "./chunk-YSCX2QQQ.js";
14
+ export {
15
+ AgentLoop,
16
+ ContextManager,
17
+ FormatVerifier,
18
+ LLMVerifier,
19
+ NAMED_STRATEGIES,
20
+ Session,
21
+ SteeringQueue,
22
+ ToolWorkerPool,
23
+ createAutoRecallHook,
24
+ createAutoSummarizeHook
25
+ };
@@ -0,0 +1,274 @@
1
+ import {
2
+ performAudit
3
+ } from "./chunk-3XAW4XHG.js";
4
+ import {
5
+ configExists,
6
+ getCh4pDir,
7
+ getConfigPath,
8
+ loadConfig
9
+ } from "./chunk-AORLXQHZ.js";
10
+ import {
11
+ BOLD,
12
+ DIM,
13
+ GREEN,
14
+ RED,
15
+ RESET,
16
+ TEAL,
17
+ YELLOW,
18
+ separator
19
+ } from "./chunk-NMGPBPNU.js";
20
+
21
+ // src/commands/doctor.ts
22
+ import { existsSync } from "fs";
23
+ import { execSync } from "child_process";
24
+ function statusIcon(s) {
25
+ switch (s) {
26
+ case "ok":
27
+ return `${GREEN}OK${RESET}`;
28
+ case "warn":
29
+ return `${YELLOW}WARN${RESET}`;
30
+ case "fail":
31
+ return `${RED}FAIL${RESET}`;
32
+ }
33
+ }
34
+ function statusPrefix(s) {
35
+ switch (s) {
36
+ case "ok":
37
+ return `${GREEN}+${RESET}`;
38
+ case "warn":
39
+ return `${YELLOW}~${RESET}`;
40
+ case "fail":
41
+ return `${RED}x${RESET}`;
42
+ }
43
+ }
44
+ function checkNodeVersion() {
45
+ const version = process.version;
46
+ const major = parseInt(version.slice(1).split(".")[0], 10);
47
+ if (major >= 22) {
48
+ return {
49
+ name: "Node.js version",
50
+ status: "ok",
51
+ message: `Node.js ${version} (>= 22 required)`
52
+ };
53
+ }
54
+ return {
55
+ name: "Node.js version",
56
+ status: "fail",
57
+ message: `Node.js ${version} detected. Version >= 22 is required.`
58
+ };
59
+ }
60
+ function checkConfigFile() {
61
+ const path = getConfigPath();
62
+ if (!configExists()) {
63
+ return {
64
+ name: "Config file",
65
+ status: "fail",
66
+ message: `Not found at ${path}. Run 'ch4p onboard' to create.`
67
+ };
68
+ }
69
+ try {
70
+ loadConfig();
71
+ return {
72
+ name: "Config file",
73
+ status: "ok",
74
+ message: `Valid config at ${path}`
75
+ };
76
+ } catch (err) {
77
+ const message = err instanceof Error ? err.message : String(err);
78
+ return {
79
+ name: "Config file",
80
+ status: "fail",
81
+ message: `Invalid config: ${message}`
82
+ };
83
+ }
84
+ }
85
+ function checkDataDir() {
86
+ const dir = getCh4pDir();
87
+ if (existsSync(dir)) {
88
+ return {
89
+ name: "Data directory",
90
+ status: "ok",
91
+ message: `Exists at ${dir}`
92
+ };
93
+ }
94
+ return {
95
+ name: "Data directory",
96
+ status: "warn",
97
+ message: `Not found at ${dir}. Will be created on first use.`
98
+ };
99
+ }
100
+ function checkMemoryDatabase() {
101
+ const dir = getCh4pDir();
102
+ if (!existsSync(dir)) {
103
+ return {
104
+ name: "Memory database",
105
+ status: "warn",
106
+ message: "Data directory does not exist yet. Memory will be initialized on first use."
107
+ };
108
+ }
109
+ return {
110
+ name: "Memory database",
111
+ status: "ok",
112
+ message: "Data directory accessible. SQLite will initialize on first use."
113
+ };
114
+ }
115
+ function checkApiKeys() {
116
+ if (!configExists()) {
117
+ return {
118
+ name: "API keys",
119
+ status: "warn",
120
+ message: "No config file. Cannot check API keys."
121
+ };
122
+ }
123
+ try {
124
+ const config = loadConfig();
125
+ const engineDefault = config.engines?.default ?? "native";
126
+ if (engineDefault === "claude-cli" || engineDefault === "codex-cli") {
127
+ return {
128
+ name: "API keys",
129
+ status: "ok",
130
+ message: `Using ${engineDefault} engine. Auth handled by CLI tool.`
131
+ };
132
+ }
133
+ if (config.agent?.provider === "ollama") {
134
+ return {
135
+ name: "API keys",
136
+ status: "ok",
137
+ message: "Using Ollama provider. No API key required (local inference)."
138
+ };
139
+ }
140
+ const providerName = config.agent?.provider ?? "anthropic";
141
+ const providerConfig = config.providers?.[providerName];
142
+ const apiKey = providerConfig?.["apiKey"];
143
+ const envKey = process.env[`${providerName.toUpperCase()}_API_KEY`];
144
+ const hasKey = typeof apiKey === "string" && apiKey.length > 0 && !apiKey.includes("${") || typeof envKey === "string" && envKey.length > 0;
145
+ if (hasKey) {
146
+ return {
147
+ name: "API keys",
148
+ status: "ok",
149
+ message: `${providerName} key configured.`
150
+ };
151
+ }
152
+ return {
153
+ name: "API keys",
154
+ status: "fail",
155
+ message: `No API key for configured provider "${providerName}". Set ${providerName.toUpperCase()}_API_KEY or run 'ch4p onboard'.`
156
+ };
157
+ } catch {
158
+ return {
159
+ name: "API keys",
160
+ status: "warn",
161
+ message: "Could not load config to check keys."
162
+ };
163
+ }
164
+ }
165
+ function checkSubprocessEngine(engineId) {
166
+ const command = engineId === "claude-cli" ? "claude" : engineId === "codex-cli" ? "codex" : engineId;
167
+ try {
168
+ execSync(`${command} --version`, { timeout: 5e3, stdio: "pipe" });
169
+ return {
170
+ name: `${engineId} binary`,
171
+ status: "ok",
172
+ message: `${command} found on PATH. Auth verified on first use.`
173
+ };
174
+ } catch {
175
+ const hint = engineId === "claude-cli" ? "Install Claude Code from https://claude.ai/download, then run /login." : engineId === "codex-cli" ? "Install Codex CLI: npm install -g @openai/codex" : `Ensure ${command} is installed and on your PATH.`;
176
+ return {
177
+ name: `${engineId} binary`,
178
+ status: "fail",
179
+ message: `${command} not found or not responding. ${hint}`
180
+ };
181
+ }
182
+ }
183
+ function checkSecurityAudit() {
184
+ if (!configExists()) {
185
+ return {
186
+ name: "Security audit",
187
+ status: "warn",
188
+ message: "No config file. Cannot run audit."
189
+ };
190
+ }
191
+ try {
192
+ const config = loadConfig();
193
+ const results = performAudit(config);
194
+ const passed = results.filter((r) => r.severity === "pass").length;
195
+ const warned = results.filter((r) => r.severity === "warn").length;
196
+ const failed = results.filter((r) => r.severity === "fail").length;
197
+ if (failed > 0) {
198
+ return {
199
+ name: "Security audit",
200
+ status: "fail",
201
+ message: `${passed} passed, ${warned} warnings, ${failed} failed. Run 'ch4p audit' for details.`
202
+ };
203
+ }
204
+ if (warned > 0) {
205
+ return {
206
+ name: "Security audit",
207
+ status: "warn",
208
+ message: `${passed} passed, ${warned} warnings. Run 'ch4p audit' for details.`
209
+ };
210
+ }
211
+ return {
212
+ name: "Security audit",
213
+ status: "ok",
214
+ message: `All ${results.length} checks passed.`
215
+ };
216
+ } catch {
217
+ return {
218
+ name: "Security audit",
219
+ status: "warn",
220
+ message: "Could not load config to run audit."
221
+ };
222
+ }
223
+ }
224
+ async function doctor() {
225
+ console.log(`
226
+ ${TEAL}${BOLD}ch4p Doctor${RESET}`);
227
+ console.log(separator());
228
+ console.log("");
229
+ const checks = [
230
+ checkNodeVersion(),
231
+ checkConfigFile(),
232
+ checkDataDir(),
233
+ checkMemoryDatabase(),
234
+ checkApiKeys(),
235
+ checkSecurityAudit()
236
+ ];
237
+ if (configExists()) {
238
+ try {
239
+ const config = loadConfig();
240
+ const engineDefault = config.engines?.default ?? "native";
241
+ if (engineDefault === "claude-cli" || engineDefault === "codex-cli") {
242
+ checks.splice(checks.length - 1, 0, checkSubprocessEngine(engineDefault));
243
+ }
244
+ } catch {
245
+ }
246
+ }
247
+ for (const check of checks) {
248
+ const padName = check.name.padEnd(20, " ");
249
+ console.log(` ${statusPrefix(check.status)} ${padName} ${check.message}`);
250
+ }
251
+ const okCount = checks.filter((c) => c.status === "ok").length;
252
+ const warnCount = checks.filter((c) => c.status === "warn").length;
253
+ const failCount = checks.filter((c) => c.status === "fail").length;
254
+ console.log(`
255
+ ${separator()}`);
256
+ console.log(
257
+ ` ${statusIcon("ok")} ${okCount} ${statusIcon("warn")} ${warnCount} ${statusIcon("fail")} ${failCount} ${DIM}(${checks.length} checks)${RESET}`
258
+ );
259
+ if (failCount > 0) {
260
+ console.log(`
261
+ ${RED}${BOLD}Issues found.${RESET} Fix the failures above to ensure ch4p works correctly.`);
262
+ process.exitCode = 1;
263
+ } else if (warnCount > 0) {
264
+ console.log(`
265
+ ${YELLOW}Warnings found.${RESET} ch4p will work, but consider addressing them.`);
266
+ } else {
267
+ console.log(`
268
+ ${GREEN}${BOLD}All checks passed.${RESET} ch4p is healthy.`);
269
+ }
270
+ console.log("");
271
+ }
272
+ export {
273
+ doctor
274
+ };
@@ -0,0 +1,274 @@
1
+ import {
2
+ performAudit
3
+ } from "./chunk-IN2I6XRM.js";
4
+ import {
5
+ configExists,
6
+ getCh4pDir,
7
+ getConfigPath,
8
+ loadConfig
9
+ } from "./chunk-TB4IZ7F7.js";
10
+ import {
11
+ BOLD,
12
+ DIM,
13
+ GREEN,
14
+ RED,
15
+ RESET,
16
+ TEAL,
17
+ YELLOW,
18
+ separator
19
+ } from "./chunk-NMGPBPNU.js";
20
+
21
+ // src/commands/doctor.ts
22
+ import { existsSync } from "fs";
23
+ import { execSync } from "child_process";
24
+ function statusIcon(s) {
25
+ switch (s) {
26
+ case "ok":
27
+ return `${GREEN}OK${RESET}`;
28
+ case "warn":
29
+ return `${YELLOW}WARN${RESET}`;
30
+ case "fail":
31
+ return `${RED}FAIL${RESET}`;
32
+ }
33
+ }
34
+ function statusPrefix(s) {
35
+ switch (s) {
36
+ case "ok":
37
+ return `${GREEN}+${RESET}`;
38
+ case "warn":
39
+ return `${YELLOW}~${RESET}`;
40
+ case "fail":
41
+ return `${RED}x${RESET}`;
42
+ }
43
+ }
44
+ function checkNodeVersion() {
45
+ const version = process.version;
46
+ const major = parseInt(version.slice(1).split(".")[0], 10);
47
+ if (major >= 22) {
48
+ return {
49
+ name: "Node.js version",
50
+ status: "ok",
51
+ message: `Node.js ${version} (>= 22 required)`
52
+ };
53
+ }
54
+ return {
55
+ name: "Node.js version",
56
+ status: "fail",
57
+ message: `Node.js ${version} detected. Version >= 22 is required.`
58
+ };
59
+ }
60
+ function checkConfigFile() {
61
+ const path = getConfigPath();
62
+ if (!configExists()) {
63
+ return {
64
+ name: "Config file",
65
+ status: "fail",
66
+ message: `Not found at ${path}. Run 'ch4p onboard' to create.`
67
+ };
68
+ }
69
+ try {
70
+ loadConfig();
71
+ return {
72
+ name: "Config file",
73
+ status: "ok",
74
+ message: `Valid config at ${path}`
75
+ };
76
+ } catch (err) {
77
+ const message = err instanceof Error ? err.message : String(err);
78
+ return {
79
+ name: "Config file",
80
+ status: "fail",
81
+ message: `Invalid config: ${message}`
82
+ };
83
+ }
84
+ }
85
+ function checkDataDir() {
86
+ const dir = getCh4pDir();
87
+ if (existsSync(dir)) {
88
+ return {
89
+ name: "Data directory",
90
+ status: "ok",
91
+ message: `Exists at ${dir}`
92
+ };
93
+ }
94
+ return {
95
+ name: "Data directory",
96
+ status: "warn",
97
+ message: `Not found at ${dir}. Will be created on first use.`
98
+ };
99
+ }
100
+ function checkMemoryDatabase() {
101
+ const dir = getCh4pDir();
102
+ if (!existsSync(dir)) {
103
+ return {
104
+ name: "Memory database",
105
+ status: "warn",
106
+ message: "Data directory does not exist yet. Memory will be initialized on first use."
107
+ };
108
+ }
109
+ return {
110
+ name: "Memory database",
111
+ status: "ok",
112
+ message: "Data directory accessible. SQLite will initialize on first use."
113
+ };
114
+ }
115
+ function checkApiKeys() {
116
+ if (!configExists()) {
117
+ return {
118
+ name: "API keys",
119
+ status: "warn",
120
+ message: "No config file. Cannot check API keys."
121
+ };
122
+ }
123
+ try {
124
+ const config = loadConfig();
125
+ const engineDefault = config.engines?.default ?? "native";
126
+ if (engineDefault === "claude-cli" || engineDefault === "codex-cli") {
127
+ return {
128
+ name: "API keys",
129
+ status: "ok",
130
+ message: `Using ${engineDefault} engine. Auth handled by CLI tool.`
131
+ };
132
+ }
133
+ if (config.agent?.provider === "ollama") {
134
+ return {
135
+ name: "API keys",
136
+ status: "ok",
137
+ message: "Using Ollama provider. No API key required (local inference)."
138
+ };
139
+ }
140
+ const providerName = config.agent?.provider ?? "anthropic";
141
+ const providerConfig = config.providers?.[providerName];
142
+ const apiKey = providerConfig?.["apiKey"];
143
+ const envKey = process.env[`${providerName.toUpperCase()}_API_KEY`];
144
+ const hasKey = typeof apiKey === "string" && apiKey.length > 0 && !apiKey.includes("${") || typeof envKey === "string" && envKey.length > 0;
145
+ if (hasKey) {
146
+ return {
147
+ name: "API keys",
148
+ status: "ok",
149
+ message: `${providerName} key configured.`
150
+ };
151
+ }
152
+ return {
153
+ name: "API keys",
154
+ status: "fail",
155
+ message: `No API key for configured provider "${providerName}". Set ${providerName.toUpperCase()}_API_KEY or run 'ch4p onboard'.`
156
+ };
157
+ } catch {
158
+ return {
159
+ name: "API keys",
160
+ status: "warn",
161
+ message: "Could not load config to check keys."
162
+ };
163
+ }
164
+ }
165
+ function checkSubprocessEngine(engineId) {
166
+ const command = engineId === "claude-cli" ? "claude" : engineId === "codex-cli" ? "codex" : engineId;
167
+ try {
168
+ execSync(`${command} --version`, { timeout: 5e3, stdio: "pipe" });
169
+ return {
170
+ name: `${engineId} binary`,
171
+ status: "ok",
172
+ message: `${command} found on PATH. Auth verified on first use.`
173
+ };
174
+ } catch {
175
+ const hint = engineId === "claude-cli" ? "Install Claude Code from https://claude.ai/download, then run /login." : engineId === "codex-cli" ? "Install Codex CLI: npm install -g @openai/codex" : `Ensure ${command} is installed and on your PATH.`;
176
+ return {
177
+ name: `${engineId} binary`,
178
+ status: "fail",
179
+ message: `${command} not found or not responding. ${hint}`
180
+ };
181
+ }
182
+ }
183
+ function checkSecurityAudit() {
184
+ if (!configExists()) {
185
+ return {
186
+ name: "Security audit",
187
+ status: "warn",
188
+ message: "No config file. Cannot run audit."
189
+ };
190
+ }
191
+ try {
192
+ const config = loadConfig();
193
+ const results = performAudit(config);
194
+ const passed = results.filter((r) => r.severity === "pass").length;
195
+ const warned = results.filter((r) => r.severity === "warn").length;
196
+ const failed = results.filter((r) => r.severity === "fail").length;
197
+ if (failed > 0) {
198
+ return {
199
+ name: "Security audit",
200
+ status: "fail",
201
+ message: `${passed} passed, ${warned} warnings, ${failed} failed. Run 'ch4p audit' for details.`
202
+ };
203
+ }
204
+ if (warned > 0) {
205
+ return {
206
+ name: "Security audit",
207
+ status: "warn",
208
+ message: `${passed} passed, ${warned} warnings. Run 'ch4p audit' for details.`
209
+ };
210
+ }
211
+ return {
212
+ name: "Security audit",
213
+ status: "ok",
214
+ message: `All ${results.length} checks passed.`
215
+ };
216
+ } catch {
217
+ return {
218
+ name: "Security audit",
219
+ status: "warn",
220
+ message: "Could not load config to run audit."
221
+ };
222
+ }
223
+ }
224
+ async function doctor() {
225
+ console.log(`
226
+ ${TEAL}${BOLD}ch4p Doctor${RESET}`);
227
+ console.log(separator());
228
+ console.log("");
229
+ const checks = [
230
+ checkNodeVersion(),
231
+ checkConfigFile(),
232
+ checkDataDir(),
233
+ checkMemoryDatabase(),
234
+ checkApiKeys(),
235
+ checkSecurityAudit()
236
+ ];
237
+ if (configExists()) {
238
+ try {
239
+ const config = loadConfig();
240
+ const engineDefault = config.engines?.default ?? "native";
241
+ if (engineDefault === "claude-cli" || engineDefault === "codex-cli") {
242
+ checks.splice(checks.length - 1, 0, checkSubprocessEngine(engineDefault));
243
+ }
244
+ } catch {
245
+ }
246
+ }
247
+ for (const check of checks) {
248
+ const padName = check.name.padEnd(20, " ");
249
+ console.log(` ${statusPrefix(check.status)} ${padName} ${check.message}`);
250
+ }
251
+ const okCount = checks.filter((c) => c.status === "ok").length;
252
+ const warnCount = checks.filter((c) => c.status === "warn").length;
253
+ const failCount = checks.filter((c) => c.status === "fail").length;
254
+ console.log(`
255
+ ${separator()}`);
256
+ console.log(
257
+ ` ${statusIcon("ok")} ${okCount} ${statusIcon("warn")} ${warnCount} ${statusIcon("fail")} ${failCount} ${DIM}(${checks.length} checks)${RESET}`
258
+ );
259
+ if (failCount > 0) {
260
+ console.log(`
261
+ ${RED}${BOLD}Issues found.${RESET} Fix the failures above to ensure ch4p works correctly.`);
262
+ process.exitCode = 1;
263
+ } else if (warnCount > 0) {
264
+ console.log(`
265
+ ${YELLOW}Warnings found.${RESET} ch4p will work, but consider addressing them.`);
266
+ } else {
267
+ console.log(`
268
+ ${GREEN}${BOLD}All checks passed.${RESET} ch4p is healthy.`);
269
+ }
270
+ console.log("");
271
+ }
272
+ export {
273
+ doctor
274
+ };