@cortexmemory/cli 0.1.0
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 +325 -0
- package/dist/commands/conversations.d.ts +16 -0
- package/dist/commands/conversations.d.ts.map +1 -0
- package/dist/commands/conversations.js +421 -0
- package/dist/commands/conversations.js.map +1 -0
- package/dist/commands/convex.d.ts +17 -0
- package/dist/commands/convex.d.ts.map +1 -0
- package/dist/commands/convex.js +442 -0
- package/dist/commands/convex.js.map +1 -0
- package/dist/commands/db.d.ts +16 -0
- package/dist/commands/db.d.ts.map +1 -0
- package/dist/commands/db.js +371 -0
- package/dist/commands/db.js.map +1 -0
- package/dist/commands/dev.d.ts +16 -0
- package/dist/commands/dev.d.ts.map +1 -0
- package/dist/commands/dev.js +558 -0
- package/dist/commands/dev.js.map +1 -0
- package/dist/commands/facts.d.ts +17 -0
- package/dist/commands/facts.d.ts.map +1 -0
- package/dist/commands/facts.js +386 -0
- package/dist/commands/facts.js.map +1 -0
- package/dist/commands/memory.d.ts +18 -0
- package/dist/commands/memory.d.ts.map +1 -0
- package/dist/commands/memory.js +486 -0
- package/dist/commands/memory.js.map +1 -0
- package/dist/commands/setup.d.ts +14 -0
- package/dist/commands/setup.d.ts.map +1 -0
- package/dist/commands/setup.js +494 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/commands/spaces.d.ts +18 -0
- package/dist/commands/spaces.d.ts.map +1 -0
- package/dist/commands/spaces.js +553 -0
- package/dist/commands/spaces.js.map +1 -0
- package/dist/commands/users.d.ts +18 -0
- package/dist/commands/users.d.ts.map +1 -0
- package/dist/commands/users.js +486 -0
- package/dist/commands/users.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +70 -0
- package/dist/index.js.map +1 -0
- package/dist/types.d.ts +144 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/__tests__/config.test.d.ts +5 -0
- package/dist/utils/__tests__/config.test.d.ts.map +1 -0
- package/dist/utils/__tests__/config.test.js +127 -0
- package/dist/utils/__tests__/config.test.js.map +1 -0
- package/dist/utils/__tests__/formatting.test.d.ts +5 -0
- package/dist/utils/__tests__/formatting.test.d.ts.map +1 -0
- package/dist/utils/__tests__/formatting.test.js +132 -0
- package/dist/utils/__tests__/formatting.test.js.map +1 -0
- package/dist/utils/__tests__/validation.test.d.ts +5 -0
- package/dist/utils/__tests__/validation.test.d.ts.map +1 -0
- package/dist/utils/__tests__/validation.test.js +207 -0
- package/dist/utils/__tests__/validation.test.js.map +1 -0
- package/dist/utils/client.d.ts +42 -0
- package/dist/utils/client.d.ts.map +1 -0
- package/dist/utils/client.js +108 -0
- package/dist/utils/client.js.map +1 -0
- package/dist/utils/config.d.ts +67 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +261 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/formatting.d.ts +81 -0
- package/dist/utils/formatting.d.ts.map +1 -0
- package/dist/utils/formatting.js +239 -0
- package/dist/utils/formatting.js.map +1 -0
- package/dist/utils/validation.d.ts +83 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +243 -0
- package/dist/utils/validation.js.map +1 -0
- package/package.json +72 -0
- package/templates/.cortexrc.template +15 -0
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration Management
|
|
3
|
+
*
|
|
4
|
+
* Handles loading, saving, and managing CLI configuration from multiple sources:
|
|
5
|
+
* 1. CLI flags (highest priority)
|
|
6
|
+
* 2. Environment variables
|
|
7
|
+
* 3. Project config (./cortex.config.json)
|
|
8
|
+
* 4. User config (~/.cortexrc)
|
|
9
|
+
*/
|
|
10
|
+
import { cosmiconfig } from "cosmiconfig";
|
|
11
|
+
import { readFile, writeFile, mkdir } from "fs/promises";
|
|
12
|
+
import { existsSync } from "fs";
|
|
13
|
+
import { homedir } from "os";
|
|
14
|
+
import { join, dirname } from "path";
|
|
15
|
+
/**
|
|
16
|
+
* Default configuration
|
|
17
|
+
*/
|
|
18
|
+
const DEFAULT_CONFIG = {
|
|
19
|
+
deployments: {
|
|
20
|
+
local: {
|
|
21
|
+
url: "http://127.0.0.1:3210",
|
|
22
|
+
deployment: "anonymous:anonymous-cortex-sdk-local",
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
default: "local",
|
|
26
|
+
format: "table",
|
|
27
|
+
confirmDangerous: true,
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* Explorer for loading configuration from various sources
|
|
31
|
+
*/
|
|
32
|
+
const explorer = cosmiconfig("cortex", {
|
|
33
|
+
searchPlaces: [
|
|
34
|
+
"cortex.config.json",
|
|
35
|
+
"cortex.config.js",
|
|
36
|
+
".cortexrc",
|
|
37
|
+
".cortexrc.json",
|
|
38
|
+
"package.json",
|
|
39
|
+
],
|
|
40
|
+
});
|
|
41
|
+
/**
|
|
42
|
+
* Get the path to the user config file
|
|
43
|
+
*/
|
|
44
|
+
export function getUserConfigPath() {
|
|
45
|
+
return join(homedir(), ".cortexrc");
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Get the path to the project config file
|
|
49
|
+
*/
|
|
50
|
+
export function getProjectConfigPath() {
|
|
51
|
+
return join(process.cwd(), "cortex.config.json");
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Load configuration from all sources
|
|
55
|
+
*/
|
|
56
|
+
export async function loadConfig() {
|
|
57
|
+
let config = { ...DEFAULT_CONFIG };
|
|
58
|
+
// Try to load from cosmiconfig (searches up directory tree)
|
|
59
|
+
try {
|
|
60
|
+
const result = await explorer.search();
|
|
61
|
+
if (result && result.config) {
|
|
62
|
+
config = mergeConfig(config, result.config);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
// No config file found, use defaults
|
|
67
|
+
}
|
|
68
|
+
// Try to load user config from ~/.cortexrc
|
|
69
|
+
const userConfigPath = getUserConfigPath();
|
|
70
|
+
if (existsSync(userConfigPath)) {
|
|
71
|
+
try {
|
|
72
|
+
const userConfigContent = await readFile(userConfigPath, "utf-8");
|
|
73
|
+
const userConfig = JSON.parse(userConfigContent);
|
|
74
|
+
config = mergeConfig(config, userConfig);
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
// Invalid user config, skip
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
// Override with environment variables
|
|
81
|
+
config = applyEnvOverrides(config);
|
|
82
|
+
return config;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Merge two configurations, with source overriding target
|
|
86
|
+
*/
|
|
87
|
+
function mergeConfig(target, source) {
|
|
88
|
+
return {
|
|
89
|
+
deployments: {
|
|
90
|
+
...target.deployments,
|
|
91
|
+
...source.deployments,
|
|
92
|
+
},
|
|
93
|
+
default: source.default ?? target.default,
|
|
94
|
+
format: source.format ?? target.format,
|
|
95
|
+
confirmDangerous: source.confirmDangerous ?? target.confirmDangerous,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Apply environment variable overrides
|
|
100
|
+
*/
|
|
101
|
+
function applyEnvOverrides(config) {
|
|
102
|
+
// If CONVEX_URL is set, create/update a deployment called "env"
|
|
103
|
+
const convexUrl = process.env.CONVEX_URL;
|
|
104
|
+
const convexKey = process.env.CONVEX_DEPLOY_KEY;
|
|
105
|
+
if (convexUrl) {
|
|
106
|
+
config.deployments.env = {
|
|
107
|
+
url: convexUrl,
|
|
108
|
+
key: convexKey,
|
|
109
|
+
};
|
|
110
|
+
// If no default is set, use env
|
|
111
|
+
if (!config.default || config.default === "local") {
|
|
112
|
+
config.default = "env";
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
// Check for local-specific env vars
|
|
116
|
+
const localUrl = process.env.LOCAL_CONVEX_URL;
|
|
117
|
+
const localDeployment = process.env.LOCAL_CONVEX_DEPLOYMENT;
|
|
118
|
+
if (localUrl) {
|
|
119
|
+
config.deployments.local = {
|
|
120
|
+
url: localUrl,
|
|
121
|
+
deployment: localDeployment,
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
// Check for cloud-specific env vars
|
|
125
|
+
const cloudUrl = process.env.CLOUD_CONVEX_URL;
|
|
126
|
+
const cloudKey = process.env.CLOUD_CONVEX_DEPLOY_KEY;
|
|
127
|
+
if (cloudUrl) {
|
|
128
|
+
config.deployments.cloud = {
|
|
129
|
+
url: cloudUrl,
|
|
130
|
+
key: cloudKey,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
return config;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Save configuration to user config file
|
|
137
|
+
*/
|
|
138
|
+
export async function saveUserConfig(config) {
|
|
139
|
+
const configPath = getUserConfigPath();
|
|
140
|
+
const configDir = dirname(configPath);
|
|
141
|
+
// Ensure directory exists
|
|
142
|
+
if (!existsSync(configDir)) {
|
|
143
|
+
await mkdir(configDir, { recursive: true });
|
|
144
|
+
}
|
|
145
|
+
await writeFile(configPath, JSON.stringify(config, null, 2), "utf-8");
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Save configuration to project config file
|
|
149
|
+
*/
|
|
150
|
+
export async function saveProjectConfig(config) {
|
|
151
|
+
const configPath = getProjectConfigPath();
|
|
152
|
+
await writeFile(configPath, JSON.stringify(config, null, 2), "utf-8");
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Get a specific deployment configuration
|
|
156
|
+
*/
|
|
157
|
+
export function getDeployment(config, name) {
|
|
158
|
+
const deploymentName = name ?? config.default;
|
|
159
|
+
return config.deployments[deploymentName] ?? null;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Resolve final configuration from global options and config
|
|
163
|
+
*/
|
|
164
|
+
export function resolveConfig(config, options) {
|
|
165
|
+
// CLI flags have highest priority
|
|
166
|
+
if (options.url) {
|
|
167
|
+
return {
|
|
168
|
+
url: options.url,
|
|
169
|
+
key: options.key,
|
|
170
|
+
format: options.format ?? config.format,
|
|
171
|
+
quiet: options.quiet ?? false,
|
|
172
|
+
debug: options.debug ?? false,
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
// Look up deployment from config
|
|
176
|
+
const deploymentConfig = getDeployment(config, options.deployment);
|
|
177
|
+
if (!deploymentConfig) {
|
|
178
|
+
throw new Error(`Deployment "${options.deployment ?? config.default}" not found in configuration. ` +
|
|
179
|
+
`Run 'cortex setup' to configure deployments.`);
|
|
180
|
+
}
|
|
181
|
+
return {
|
|
182
|
+
url: deploymentConfig.url,
|
|
183
|
+
key: deploymentConfig.key ?? options.key,
|
|
184
|
+
deployment: deploymentConfig.deployment,
|
|
185
|
+
format: options.format ?? config.format,
|
|
186
|
+
quiet: options.quiet ?? false,
|
|
187
|
+
debug: options.debug ?? false,
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Update a single deployment in the config
|
|
192
|
+
*/
|
|
193
|
+
export async function updateDeployment(name, deployment, saveToUser = true) {
|
|
194
|
+
const config = await loadConfig();
|
|
195
|
+
config.deployments[name] = deployment;
|
|
196
|
+
if (saveToUser) {
|
|
197
|
+
await saveUserConfig(config);
|
|
198
|
+
}
|
|
199
|
+
return config;
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Set the default deployment
|
|
203
|
+
*/
|
|
204
|
+
export async function setDefaultDeployment(name) {
|
|
205
|
+
const config = await loadConfig();
|
|
206
|
+
if (!config.deployments[name]) {
|
|
207
|
+
throw new Error(`Deployment "${name}" not found`);
|
|
208
|
+
}
|
|
209
|
+
config.default = name;
|
|
210
|
+
await saveUserConfig(config);
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Set a configuration value
|
|
214
|
+
*/
|
|
215
|
+
export async function setConfigValue(key, value) {
|
|
216
|
+
const config = await loadConfig();
|
|
217
|
+
switch (key) {
|
|
218
|
+
case "default":
|
|
219
|
+
if (!config.deployments[value]) {
|
|
220
|
+
throw new Error(`Deployment "${value}" not found`);
|
|
221
|
+
}
|
|
222
|
+
config.default = value;
|
|
223
|
+
break;
|
|
224
|
+
case "format":
|
|
225
|
+
if (!["table", "json", "csv"].includes(value)) {
|
|
226
|
+
throw new Error(`Invalid format: ${value}. Use table, json, or csv`);
|
|
227
|
+
}
|
|
228
|
+
config.format = value;
|
|
229
|
+
break;
|
|
230
|
+
case "confirmDangerous":
|
|
231
|
+
config.confirmDangerous = value === "true";
|
|
232
|
+
break;
|
|
233
|
+
case "convex-url":
|
|
234
|
+
config.deployments[config.default] = {
|
|
235
|
+
...config.deployments[config.default],
|
|
236
|
+
url: value,
|
|
237
|
+
};
|
|
238
|
+
break;
|
|
239
|
+
case "convex-key":
|
|
240
|
+
config.deployments[config.default] = {
|
|
241
|
+
...config.deployments[config.default],
|
|
242
|
+
key: value,
|
|
243
|
+
};
|
|
244
|
+
break;
|
|
245
|
+
default:
|
|
246
|
+
throw new Error(`Unknown config key: ${key}`);
|
|
247
|
+
}
|
|
248
|
+
await saveUserConfig(config);
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* List all deployments
|
|
252
|
+
*/
|
|
253
|
+
export function listDeployments(config) {
|
|
254
|
+
return Object.entries(config.deployments).map(([name, deployment]) => ({
|
|
255
|
+
name,
|
|
256
|
+
url: deployment.url,
|
|
257
|
+
isDefault: name === config.default,
|
|
258
|
+
hasKey: Boolean(deployment.key),
|
|
259
|
+
}));
|
|
260
|
+
}
|
|
261
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Output Formatting Utilities
|
|
3
|
+
*
|
|
4
|
+
* Handles formatting data for display in various formats:
|
|
5
|
+
* - Table (default, human-readable)
|
|
6
|
+
* - JSON (machine-readable)
|
|
7
|
+
* - CSV (for exports)
|
|
8
|
+
*/
|
|
9
|
+
import type { OutputFormat } from "../types.js";
|
|
10
|
+
/**
|
|
11
|
+
* Format data based on the specified format
|
|
12
|
+
*/
|
|
13
|
+
export declare function formatOutput(data: unknown, format: OutputFormat, options?: {
|
|
14
|
+
headers?: string[];
|
|
15
|
+
title?: string;
|
|
16
|
+
}): string;
|
|
17
|
+
/**
|
|
18
|
+
* Format data as JSON
|
|
19
|
+
*/
|
|
20
|
+
export declare function formatJSON(data: unknown): string;
|
|
21
|
+
/**
|
|
22
|
+
* Format data as CSV
|
|
23
|
+
*/
|
|
24
|
+
export declare function formatCSV(data: unknown, headers?: string[]): string;
|
|
25
|
+
/**
|
|
26
|
+
* Format data as a table
|
|
27
|
+
*/
|
|
28
|
+
export declare function formatTable(data: unknown, headers?: string[], title?: string): string;
|
|
29
|
+
/**
|
|
30
|
+
* Format a timestamp for display
|
|
31
|
+
*/
|
|
32
|
+
export declare function formatTimestamp(timestamp: number): string;
|
|
33
|
+
/**
|
|
34
|
+
* Format a relative time (e.g., "2 hours ago")
|
|
35
|
+
*/
|
|
36
|
+
export declare function formatRelativeTime(timestamp: number): string;
|
|
37
|
+
/**
|
|
38
|
+
* Format bytes to human-readable size
|
|
39
|
+
*/
|
|
40
|
+
export declare function formatBytes(bytes: number): string;
|
|
41
|
+
/**
|
|
42
|
+
* Format a count with proper pluralization
|
|
43
|
+
*/
|
|
44
|
+
export declare function formatCount(count: number, singular: string, plural?: string): string;
|
|
45
|
+
/**
|
|
46
|
+
* Print a success message
|
|
47
|
+
*/
|
|
48
|
+
export declare function printSuccess(message: string): void;
|
|
49
|
+
/**
|
|
50
|
+
* Print an error message
|
|
51
|
+
*/
|
|
52
|
+
export declare function printError(message: string): void;
|
|
53
|
+
/**
|
|
54
|
+
* Print a warning message
|
|
55
|
+
*/
|
|
56
|
+
export declare function printWarning(message: string): void;
|
|
57
|
+
/**
|
|
58
|
+
* Print an info message
|
|
59
|
+
*/
|
|
60
|
+
export declare function printInfo(message: string): void;
|
|
61
|
+
/**
|
|
62
|
+
* Print a header/title
|
|
63
|
+
*/
|
|
64
|
+
export declare function printHeader(title: string): void;
|
|
65
|
+
/**
|
|
66
|
+
* Print a key-value pair
|
|
67
|
+
*/
|
|
68
|
+
export declare function printKeyValue(key: string, value: unknown): void;
|
|
69
|
+
/**
|
|
70
|
+
* Print a section with key-value pairs
|
|
71
|
+
*/
|
|
72
|
+
export declare function printSection(title: string, data: Record<string, unknown>): void;
|
|
73
|
+
/**
|
|
74
|
+
* Print a divider line
|
|
75
|
+
*/
|
|
76
|
+
export declare function printDivider(): void;
|
|
77
|
+
/**
|
|
78
|
+
* Create a simple progress indicator
|
|
79
|
+
*/
|
|
80
|
+
export declare function createProgressText(current: number, total: number): string;
|
|
81
|
+
//# sourceMappingURL=formatting.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatting.d.ts","sourceRoot":"","sources":["../../src/utils/formatting.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD;;GAEG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,OAAO,EACb,MAAM,EAAE,YAAY,EACpB,OAAO,CAAC,EAAE;IACR,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GACA,MAAM,CAUR;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAEhD;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAkCnE;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,IAAI,EAAE,OAAO,EACb,OAAO,CAAC,EAAE,MAAM,EAAE,EAClB,KAAK,CAAC,EAAE,MAAM,GACb,MAAM,CAuCR;AAwCD;;GAEG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAGzD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAmB5D;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAWjD;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,MAAM,GACd,MAAM,CAGR;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAElD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAEhD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAElD;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE/C;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAI/C;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAE/D;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,IAAI,CAMN;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,IAAI,CAEnC;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAKzE"}
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Output Formatting Utilities
|
|
3
|
+
*
|
|
4
|
+
* Handles formatting data for display in various formats:
|
|
5
|
+
* - Table (default, human-readable)
|
|
6
|
+
* - JSON (machine-readable)
|
|
7
|
+
* - CSV (for exports)
|
|
8
|
+
*/
|
|
9
|
+
import Table from "cli-table3";
|
|
10
|
+
import pc from "picocolors";
|
|
11
|
+
/**
|
|
12
|
+
* Format data based on the specified format
|
|
13
|
+
*/
|
|
14
|
+
export function formatOutput(data, format, options) {
|
|
15
|
+
switch (format) {
|
|
16
|
+
case "json":
|
|
17
|
+
return formatJSON(data);
|
|
18
|
+
case "csv":
|
|
19
|
+
return formatCSV(data, options?.headers);
|
|
20
|
+
case "table":
|
|
21
|
+
default:
|
|
22
|
+
return formatTable(data, options?.headers, options?.title);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Format data as JSON
|
|
27
|
+
*/
|
|
28
|
+
export function formatJSON(data) {
|
|
29
|
+
return JSON.stringify(data, null, 2);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Format data as CSV
|
|
33
|
+
*/
|
|
34
|
+
export function formatCSV(data, headers) {
|
|
35
|
+
if (!Array.isArray(data)) {
|
|
36
|
+
data = [data];
|
|
37
|
+
}
|
|
38
|
+
const rows = data;
|
|
39
|
+
if (rows.length === 0) {
|
|
40
|
+
return "";
|
|
41
|
+
}
|
|
42
|
+
// Determine headers from first row if not provided
|
|
43
|
+
const columnHeaders = headers ?? Object.keys(rows[0]);
|
|
44
|
+
// Create CSV content
|
|
45
|
+
const csvRows = [
|
|
46
|
+
columnHeaders.join(","),
|
|
47
|
+
...rows.map((row) => columnHeaders
|
|
48
|
+
.map((header) => {
|
|
49
|
+
const value = row[header];
|
|
50
|
+
// Handle values that need quoting
|
|
51
|
+
if (typeof value === "string" &&
|
|
52
|
+
(value.includes(",") || value.includes('"') || value.includes("\n"))) {
|
|
53
|
+
return `"${value.replace(/"/g, '""')}"`;
|
|
54
|
+
}
|
|
55
|
+
return String(value ?? "");
|
|
56
|
+
})
|
|
57
|
+
.join(",")),
|
|
58
|
+
];
|
|
59
|
+
return csvRows.join("\n");
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Format data as a table
|
|
63
|
+
*/
|
|
64
|
+
export function formatTable(data, headers, title) {
|
|
65
|
+
if (!Array.isArray(data)) {
|
|
66
|
+
data = [data];
|
|
67
|
+
}
|
|
68
|
+
const rows = data;
|
|
69
|
+
if (rows.length === 0) {
|
|
70
|
+
return pc.dim("No data to display");
|
|
71
|
+
}
|
|
72
|
+
// Determine headers from first row if not provided
|
|
73
|
+
const columnHeaders = headers ?? Object.keys(rows[0]);
|
|
74
|
+
// Create table
|
|
75
|
+
const table = new Table({
|
|
76
|
+
head: columnHeaders.map((h) => pc.cyan(h)),
|
|
77
|
+
style: {
|
|
78
|
+
head: [],
|
|
79
|
+
border: [],
|
|
80
|
+
},
|
|
81
|
+
});
|
|
82
|
+
// Add rows
|
|
83
|
+
for (const row of rows) {
|
|
84
|
+
table.push(columnHeaders.map((header) => {
|
|
85
|
+
const value = row[header];
|
|
86
|
+
return formatValue(value);
|
|
87
|
+
}));
|
|
88
|
+
}
|
|
89
|
+
let output = "";
|
|
90
|
+
if (title) {
|
|
91
|
+
output += pc.bold(pc.white(title)) + "\n\n";
|
|
92
|
+
}
|
|
93
|
+
output += table.toString();
|
|
94
|
+
return output;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Format a single value for display
|
|
98
|
+
*/
|
|
99
|
+
function formatValue(value) {
|
|
100
|
+
if (value === null || value === undefined) {
|
|
101
|
+
return pc.dim("-");
|
|
102
|
+
}
|
|
103
|
+
if (typeof value === "boolean") {
|
|
104
|
+
return value ? pc.green("✓") : pc.red("✗");
|
|
105
|
+
}
|
|
106
|
+
if (typeof value === "number") {
|
|
107
|
+
return pc.yellow(String(value));
|
|
108
|
+
}
|
|
109
|
+
if (value instanceof Date) {
|
|
110
|
+
return formatTimestamp(value.getTime());
|
|
111
|
+
}
|
|
112
|
+
if (typeof value === "object") {
|
|
113
|
+
if (Array.isArray(value)) {
|
|
114
|
+
if (value.length === 0) {
|
|
115
|
+
return pc.dim("[]");
|
|
116
|
+
}
|
|
117
|
+
return value.slice(0, 3).join(", ") + (value.length > 3 ? "..." : "");
|
|
118
|
+
}
|
|
119
|
+
return pc.dim("[object]");
|
|
120
|
+
}
|
|
121
|
+
const str = String(value);
|
|
122
|
+
// Truncate long strings
|
|
123
|
+
if (str.length > 50) {
|
|
124
|
+
return str.substring(0, 47) + "...";
|
|
125
|
+
}
|
|
126
|
+
return str;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Format a timestamp for display
|
|
130
|
+
*/
|
|
131
|
+
export function formatTimestamp(timestamp) {
|
|
132
|
+
const date = new Date(timestamp);
|
|
133
|
+
return date.toLocaleString();
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Format a relative time (e.g., "2 hours ago")
|
|
137
|
+
*/
|
|
138
|
+
export function formatRelativeTime(timestamp) {
|
|
139
|
+
const now = Date.now();
|
|
140
|
+
const diff = now - timestamp;
|
|
141
|
+
const seconds = Math.floor(diff / 1000);
|
|
142
|
+
const minutes = Math.floor(seconds / 60);
|
|
143
|
+
const hours = Math.floor(minutes / 60);
|
|
144
|
+
const days = Math.floor(hours / 24);
|
|
145
|
+
if (days > 0) {
|
|
146
|
+
return `${days}d ago`;
|
|
147
|
+
}
|
|
148
|
+
if (hours > 0) {
|
|
149
|
+
return `${hours}h ago`;
|
|
150
|
+
}
|
|
151
|
+
if (minutes > 0) {
|
|
152
|
+
return `${minutes}m ago`;
|
|
153
|
+
}
|
|
154
|
+
return "just now";
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Format bytes to human-readable size
|
|
158
|
+
*/
|
|
159
|
+
export function formatBytes(bytes) {
|
|
160
|
+
const units = ["B", "KB", "MB", "GB", "TB"];
|
|
161
|
+
let unitIndex = 0;
|
|
162
|
+
let size = bytes;
|
|
163
|
+
while (size >= 1024 && unitIndex < units.length - 1) {
|
|
164
|
+
size /= 1024;
|
|
165
|
+
unitIndex++;
|
|
166
|
+
}
|
|
167
|
+
return `${size.toFixed(1)} ${units[unitIndex]}`;
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Format a count with proper pluralization
|
|
171
|
+
*/
|
|
172
|
+
export function formatCount(count, singular, plural) {
|
|
173
|
+
const word = count === 1 ? singular : (plural ?? `${singular}s`);
|
|
174
|
+
return `${count.toLocaleString()} ${word}`;
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Print a success message
|
|
178
|
+
*/
|
|
179
|
+
export function printSuccess(message) {
|
|
180
|
+
console.log(pc.green(`✔ ${message}`));
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Print an error message
|
|
184
|
+
*/
|
|
185
|
+
export function printError(message) {
|
|
186
|
+
console.error(pc.red(`✖ ${message}`));
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Print a warning message
|
|
190
|
+
*/
|
|
191
|
+
export function printWarning(message) {
|
|
192
|
+
console.warn(pc.yellow(`⚠ ${message}`));
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Print an info message
|
|
196
|
+
*/
|
|
197
|
+
export function printInfo(message) {
|
|
198
|
+
console.log(pc.blue(`ℹ ${message}`));
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Print a header/title
|
|
202
|
+
*/
|
|
203
|
+
export function printHeader(title) {
|
|
204
|
+
console.log();
|
|
205
|
+
console.log(pc.bold(pc.white(title)));
|
|
206
|
+
console.log(pc.dim("─".repeat(title.length)));
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Print a key-value pair
|
|
210
|
+
*/
|
|
211
|
+
export function printKeyValue(key, value) {
|
|
212
|
+
console.log(` ${pc.cyan(key)}: ${formatValue(value)}`);
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Print a section with key-value pairs
|
|
216
|
+
*/
|
|
217
|
+
export function printSection(title, data) {
|
|
218
|
+
printHeader(title);
|
|
219
|
+
for (const [key, value] of Object.entries(data)) {
|
|
220
|
+
printKeyValue(key, value);
|
|
221
|
+
}
|
|
222
|
+
console.log();
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Print a divider line
|
|
226
|
+
*/
|
|
227
|
+
export function printDivider() {
|
|
228
|
+
console.log(pc.dim("─".repeat(40)));
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Create a simple progress indicator
|
|
232
|
+
*/
|
|
233
|
+
export function createProgressText(current, total) {
|
|
234
|
+
const percentage = Math.round((current / total) * 100);
|
|
235
|
+
const filled = Math.round(percentage / 5);
|
|
236
|
+
const bar = "█".repeat(filled) + "░".repeat(20 - filled);
|
|
237
|
+
return `[${bar}] ${percentage}%`;
|
|
238
|
+
}
|
|
239
|
+
//# sourceMappingURL=formatting.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatting.js","sourceRoot":"","sources":["../../src/utils/formatting.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Input Validation Utilities
|
|
3
|
+
*
|
|
4
|
+
* Provides validation functions for CLI inputs
|
|
5
|
+
*/
|
|
6
|
+
import type { MemorySpaceType, MemorySpaceStatus, FactType, OutputFormat } from "../types.js";
|
|
7
|
+
/**
|
|
8
|
+
* Validation error
|
|
9
|
+
*/
|
|
10
|
+
export declare class ValidationError extends Error {
|
|
11
|
+
constructor(message: string);
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Validate a memory space ID
|
|
15
|
+
*/
|
|
16
|
+
export declare function validateMemorySpaceId(id: string): void;
|
|
17
|
+
/**
|
|
18
|
+
* Validate a user ID
|
|
19
|
+
*/
|
|
20
|
+
export declare function validateUserId(id: string): void;
|
|
21
|
+
/**
|
|
22
|
+
* Validate a memory ID
|
|
23
|
+
*/
|
|
24
|
+
export declare function validateMemoryId(id: string): void;
|
|
25
|
+
/**
|
|
26
|
+
* Validate a conversation ID
|
|
27
|
+
*/
|
|
28
|
+
export declare function validateConversationId(id: string): void;
|
|
29
|
+
/**
|
|
30
|
+
* Validate a fact ID
|
|
31
|
+
*/
|
|
32
|
+
export declare function validateFactId(id: string): void;
|
|
33
|
+
/**
|
|
34
|
+
* Validate memory space type
|
|
35
|
+
*/
|
|
36
|
+
export declare function validateMemorySpaceType(type: string): MemorySpaceType;
|
|
37
|
+
/**
|
|
38
|
+
* Validate memory space status
|
|
39
|
+
*/
|
|
40
|
+
export declare function validateMemorySpaceStatus(status: string): MemorySpaceStatus;
|
|
41
|
+
/**
|
|
42
|
+
* Validate fact type
|
|
43
|
+
*/
|
|
44
|
+
export declare function validateFactType(type: string): FactType;
|
|
45
|
+
/**
|
|
46
|
+
* Validate output format
|
|
47
|
+
*/
|
|
48
|
+
export declare function validateOutputFormat(format: string): OutputFormat;
|
|
49
|
+
/**
|
|
50
|
+
* Validate a limit (pagination)
|
|
51
|
+
*/
|
|
52
|
+
export declare function validateLimit(limit: number, max?: number): number;
|
|
53
|
+
/**
|
|
54
|
+
* Validate a URL
|
|
55
|
+
*/
|
|
56
|
+
export declare function validateUrl(url: string): void;
|
|
57
|
+
/**
|
|
58
|
+
* Validate file path
|
|
59
|
+
*/
|
|
60
|
+
export declare function validateFilePath(path: string): void;
|
|
61
|
+
/**
|
|
62
|
+
* Validate search query
|
|
63
|
+
*/
|
|
64
|
+
export declare function validateSearchQuery(query: string): void;
|
|
65
|
+
/**
|
|
66
|
+
* Require confirmation for dangerous operations
|
|
67
|
+
*/
|
|
68
|
+
export declare function requireConfirmation(message: string, options?: {
|
|
69
|
+
confirmDangerous?: boolean;
|
|
70
|
+
}): Promise<boolean>;
|
|
71
|
+
/**
|
|
72
|
+
* Require exact text confirmation for very dangerous operations
|
|
73
|
+
*/
|
|
74
|
+
export declare function requireExactConfirmation(expectedText: string, message?: string): Promise<boolean>;
|
|
75
|
+
/**
|
|
76
|
+
* Parse array argument from comma-separated string
|
|
77
|
+
*/
|
|
78
|
+
export declare function parseArrayArg(value: string): string[];
|
|
79
|
+
/**
|
|
80
|
+
* Parse key-value pairs from "key=value" format
|
|
81
|
+
*/
|
|
82
|
+
export declare function parseKeyValueArg(value: string): Record<string, string>;
|
|
83
|
+
//# sourceMappingURL=validation.d.ts.map
|