@closedloop-ai/cli 0.2.3 → 0.3.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 +106 -258
- package/dist/THIRD_PARTY_NOTICES.txt +24 -0
- package/dist/closedloop.js +156 -0
- package/package.json +31 -62
- package/CONTRIBUTING.md +0 -437
- package/LICENSE +0 -21
- package/docs/CLI_COMMANDS.md +0 -508
- package/packages/cli/dist/__tests__/cli.test.js +0 -37
- package/packages/cli/dist/__tests__/cli.test.js.map +0 -1
- package/packages/cli/dist/__tests__/config.test.js +0 -33
- package/packages/cli/dist/__tests__/config.test.js.map +0 -1
- package/packages/cli/dist/__tests__/errors.test.js +0 -109
- package/packages/cli/dist/__tests__/errors.test.js.map +0 -1
- package/packages/cli/dist/__tests__/setup.js +0 -20
- package/packages/cli/dist/__tests__/setup.js.map +0 -1
- package/packages/cli/dist/__tests__/validation.test.js +0 -124
- package/packages/cli/dist/__tests__/validation.test.js.map +0 -1
- package/packages/cli/dist/api/auth.js +0 -27
- package/packages/cli/dist/api/auth.js.map +0 -1
- package/packages/cli/dist/api/feedback.js +0 -70
- package/packages/cli/dist/api/feedback.js.map +0 -1
- package/packages/cli/dist/api/input.js +0 -60
- package/packages/cli/dist/api/input.js.map +0 -1
- package/packages/cli/dist/api/team.js +0 -45
- package/packages/cli/dist/api/team.js.map +0 -1
- package/packages/cli/dist/api/usage.js +0 -49
- package/packages/cli/dist/api/usage.js.map +0 -1
- package/packages/cli/dist/cli.js +0 -163
- package/packages/cli/dist/cli.js.map +0 -1
- package/packages/cli/dist/commands/config.js +0 -186
- package/packages/cli/dist/commands/config.js.map +0 -1
- package/packages/cli/dist/commands/feedback.js +0 -234
- package/packages/cli/dist/commands/feedback.js.map +0 -1
- package/packages/cli/dist/commands/input.js +0 -370
- package/packages/cli/dist/commands/input.js.map +0 -1
- package/packages/cli/dist/commands/list.js +0 -81
- package/packages/cli/dist/commands/list.js.map +0 -1
- package/packages/cli/dist/commands/status.js +0 -93
- package/packages/cli/dist/commands/status.js.map +0 -1
- package/packages/cli/dist/commands/submit.js +0 -225
- package/packages/cli/dist/commands/submit.js.map +0 -1
- package/packages/cli/dist/commands/team.js +0 -44
- package/packages/cli/dist/commands/team.js.map +0 -1
- package/packages/cli/dist/commands/usage.js +0 -168
- package/packages/cli/dist/commands/usage.js.map +0 -1
- package/packages/cli/dist/config/constants.js +0 -37
- package/packages/cli/dist/config/constants.js.map +0 -1
- package/packages/cli/dist/config/index.js +0 -84
- package/packages/cli/dist/config/index.js.map +0 -1
- package/packages/cli/dist/types/index.js +0 -3
- package/packages/cli/dist/types/index.js.map +0 -1
- package/packages/cli/dist/utils/config.js +0 -55
- package/packages/cli/dist/utils/config.js.map +0 -1
- package/packages/cli/dist/utils/errors.js +0 -70
- package/packages/cli/dist/utils/errors.js.map +0 -1
- package/packages/cli/dist/utils/validation.js +0 -133
- package/packages/cli/dist/utils/validation.js.map +0 -1
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.ConfigManager = void 0;
|
|
7
|
-
const fs_1 = __importDefault(require("fs"));
|
|
8
|
-
const path_1 = __importDefault(require("path"));
|
|
9
|
-
const os_1 = __importDefault(require("os"));
|
|
10
|
-
class ConfigManager {
|
|
11
|
-
constructor() {
|
|
12
|
-
this.config = {};
|
|
13
|
-
// Use XDG config directory if available, fallback to home directory
|
|
14
|
-
const configDir = process.env.XDG_CONFIG_HOME || path_1.default.join(os_1.default.homedir(), '.config');
|
|
15
|
-
const cliDir = path_1.default.join(configDir, 'closedloop');
|
|
16
|
-
// Ensure directory exists
|
|
17
|
-
if (!fs_1.default.existsSync(cliDir)) {
|
|
18
|
-
fs_1.default.mkdirSync(cliDir, { recursive: true });
|
|
19
|
-
}
|
|
20
|
-
this.configPath = path_1.default.join(cliDir, 'config.json');
|
|
21
|
-
this.loadConfig();
|
|
22
|
-
}
|
|
23
|
-
loadConfig() {
|
|
24
|
-
try {
|
|
25
|
-
if (fs_1.default.existsSync(this.configPath)) {
|
|
26
|
-
const data = fs_1.default.readFileSync(this.configPath, 'utf8');
|
|
27
|
-
this.config = JSON.parse(data);
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
catch (error) {
|
|
31
|
-
// If config file is corrupted, start fresh
|
|
32
|
-
this.config = {};
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
saveConfig() {
|
|
36
|
-
try {
|
|
37
|
-
fs_1.default.writeFileSync(this.configPath, JSON.stringify(this.config, null, 2));
|
|
38
|
-
}
|
|
39
|
-
catch (error) {
|
|
40
|
-
throw new Error(`Failed to save config: ${error}`);
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
getConfig() {
|
|
44
|
-
return { ...this.config };
|
|
45
|
-
}
|
|
46
|
-
setConfig(newConfig) {
|
|
47
|
-
this.config = { ...this.config, ...newConfig };
|
|
48
|
-
this.saveConfig();
|
|
49
|
-
}
|
|
50
|
-
getConfigPath() {
|
|
51
|
-
return this.configPath;
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
exports.ConfigManager = ConfigManager;
|
|
55
|
-
//# sourceMappingURL=config.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":";;;;;;AAAA,4CAAoB;AACpB,gDAAwB;AACxB,4CAAoB;AAEpB,MAAa,aAAa;IAIxB;QAFQ,WAAM,GAAQ,EAAE,CAAC;QAGvB,oEAAoE;QACpE,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,cAAI,CAAC,IAAI,CAAC,YAAE,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;QACpF,MAAM,MAAM,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;QAElD,0BAA0B;QAC1B,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3B,YAAE,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5C,CAAC;QAED,IAAI,CAAC,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;QACnD,IAAI,CAAC,UAAU,EAAE,CAAC;IACpB,CAAC;IAEO,UAAU;QAChB,IAAI,CAAC;YACH,IAAI,YAAE,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;gBACnC,MAAM,IAAI,GAAG,YAAE,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;gBACtD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,2CAA2C;YAC3C,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;QACnB,CAAC;IACH,CAAC;IAEO,UAAU;QAChB,IAAI,CAAC;YACH,YAAE,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC1E,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,0BAA0B,KAAK,EAAE,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IAED,SAAS;QACP,OAAO,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;IAC5B,CAAC;IAED,SAAS,CAAC,SAAc;QACtB,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,SAAS,EAAE,CAAC;QAC/C,IAAI,CAAC,UAAU,EAAE,CAAC;IACpB,CAAC;IAED,aAAa;QACX,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;CACF;AAlDD,sCAkDC"}
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ERROR_CODES = exports.CliError = void 0;
|
|
4
|
-
exports.handleApiError = handleApiError;
|
|
5
|
-
exports.handleValidationError = handleValidationError;
|
|
6
|
-
exports.handleInputError = handleInputError;
|
|
7
|
-
exports.handleProcessingError = handleProcessingError;
|
|
8
|
-
class CliError extends Error {
|
|
9
|
-
constructor(message, code, exitCode = 1) {
|
|
10
|
-
super(message);
|
|
11
|
-
this.code = code;
|
|
12
|
-
this.exitCode = exitCode;
|
|
13
|
-
this.name = 'CliError';
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
exports.CliError = CliError;
|
|
17
|
-
exports.ERROR_CODES = {
|
|
18
|
-
NO_API_KEY: 'NO_API_KEY',
|
|
19
|
-
INVALID_API_KEY: 'INVALID_API_KEY',
|
|
20
|
-
INVALID_INPUT: 'INVALID_INPUT',
|
|
21
|
-
API_ERROR: 'API_ERROR',
|
|
22
|
-
VALIDATION_ERROR: 'VALIDATION_ERROR',
|
|
23
|
-
CONNECTION_ERROR: 'CONNECTION_ERROR',
|
|
24
|
-
PROCESSING_ERROR: 'PROCESSING_ERROR',
|
|
25
|
-
NOT_FOUND: 'NOT_FOUND',
|
|
26
|
-
UNAUTHORIZED: 'UNAUTHORIZED',
|
|
27
|
-
RATE_LIMITED: 'RATE_LIMITED',
|
|
28
|
-
SERVER_ERROR: 'SERVER_ERROR',
|
|
29
|
-
UNKNOWN_ERROR: 'UNKNOWN_ERROR'
|
|
30
|
-
};
|
|
31
|
-
function handleApiError(error) {
|
|
32
|
-
if (error.response) {
|
|
33
|
-
const status = error.response.status;
|
|
34
|
-
const data = error.response.data;
|
|
35
|
-
switch (status) {
|
|
36
|
-
case 401:
|
|
37
|
-
return new CliError('Invalid API key. Please check your configuration.', exports.ERROR_CODES.UNAUTHORIZED, 1);
|
|
38
|
-
case 404:
|
|
39
|
-
return new CliError('Resource not found. Please check the ID and try again.', exports.ERROR_CODES.NOT_FOUND, 1);
|
|
40
|
-
case 429:
|
|
41
|
-
return new CliError('Rate limit exceeded. Please wait a moment and try again.', exports.ERROR_CODES.RATE_LIMITED, 1);
|
|
42
|
-
case 500:
|
|
43
|
-
case 502:
|
|
44
|
-
case 503:
|
|
45
|
-
case 504:
|
|
46
|
-
return new CliError('Server error. Please try again later.', exports.ERROR_CODES.SERVER_ERROR, 1);
|
|
47
|
-
default:
|
|
48
|
-
return new CliError(data?.message || `API error (${status})`, exports.ERROR_CODES.API_ERROR, 1);
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
else if (error.code === 'ENOTFOUND' || error.code === 'ECONNREFUSED') {
|
|
52
|
-
return new CliError('Cannot connect to ClosedLoop AI servers. Please check your internet connection.', exports.ERROR_CODES.CONNECTION_ERROR, 1);
|
|
53
|
-
}
|
|
54
|
-
else if (error.code === 'ETIMEDOUT') {
|
|
55
|
-
return new CliError('Request timed out. Please try again.', exports.ERROR_CODES.CONNECTION_ERROR, 1);
|
|
56
|
-
}
|
|
57
|
-
else {
|
|
58
|
-
return new CliError(error.message || 'An unknown error occurred', exports.ERROR_CODES.UNKNOWN_ERROR, 1);
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
function handleValidationError(message) {
|
|
62
|
-
return new CliError(message, exports.ERROR_CODES.VALIDATION_ERROR, 1);
|
|
63
|
-
}
|
|
64
|
-
function handleInputError(message) {
|
|
65
|
-
return new CliError(message, exports.ERROR_CODES.INVALID_INPUT, 1);
|
|
66
|
-
}
|
|
67
|
-
function handleProcessingError(message) {
|
|
68
|
-
return new CliError(message, exports.ERROR_CODES.PROCESSING_ERROR, 1);
|
|
69
|
-
}
|
|
70
|
-
//# sourceMappingURL=errors.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,133 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.validateUuid = validateUuid;
|
|
4
|
-
exports.validateInputContent = validateInputContent;
|
|
5
|
-
exports.validateApiKey = validateApiKey;
|
|
6
|
-
exports.validateEmail = validateEmail;
|
|
7
|
-
exports.validateUrl = validateUrl;
|
|
8
|
-
exports.validatePagination = validatePagination;
|
|
9
|
-
exports.validateTitle = validateTitle;
|
|
10
|
-
exports.validateCustomerId = validateCustomerId;
|
|
11
|
-
exports.validateName = validateName;
|
|
12
|
-
exports.sanitizeInput = sanitizeInput;
|
|
13
|
-
exports.validateAndSanitizeInput = validateAndSanitizeInput;
|
|
14
|
-
const errors_1 = require("./errors");
|
|
15
|
-
const constants_1 = require("../config/constants");
|
|
16
|
-
// UUID validation
|
|
17
|
-
function validateUuid(id) {
|
|
18
|
-
const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
19
|
-
return uuidRegex.test(id);
|
|
20
|
-
}
|
|
21
|
-
// Content validation
|
|
22
|
-
function validateInputContent(content) {
|
|
23
|
-
if (!content || content.trim().length === 0) {
|
|
24
|
-
throw (0, errors_1.handleInputError)('Content cannot be empty');
|
|
25
|
-
}
|
|
26
|
-
if (content.length > constants_1.CONFIG.MAX_CONTENT_LENGTH) {
|
|
27
|
-
throw (0, errors_1.handleInputError)(`Content too long (max ${constants_1.CONFIG.MAX_CONTENT_LENGTH} characters)`);
|
|
28
|
-
}
|
|
29
|
-
return content.trim();
|
|
30
|
-
}
|
|
31
|
-
// API key validation
|
|
32
|
-
function validateApiKey(apiKey) {
|
|
33
|
-
if (!apiKey || apiKey.trim().length === 0 || apiKey.length < constants_1.CONFIG.MIN_API_KEY_LENGTH) {
|
|
34
|
-
throw (0, errors_1.handleValidationError)('Invalid API key. Get your free API key at https://closedloop.sh');
|
|
35
|
-
}
|
|
36
|
-
return apiKey.trim();
|
|
37
|
-
}
|
|
38
|
-
// Email validation
|
|
39
|
-
function validateEmail(email) {
|
|
40
|
-
if (!email || email.trim().length === 0) {
|
|
41
|
-
throw (0, errors_1.handleValidationError)('Email cannot be empty');
|
|
42
|
-
}
|
|
43
|
-
const trimmedEmail = email.trim();
|
|
44
|
-
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
45
|
-
if (!emailRegex.test(trimmedEmail)) {
|
|
46
|
-
throw (0, errors_1.handleValidationError)('Invalid email format');
|
|
47
|
-
}
|
|
48
|
-
return trimmedEmail.toLowerCase();
|
|
49
|
-
}
|
|
50
|
-
// URL validation
|
|
51
|
-
function validateUrl(url) {
|
|
52
|
-
if (!url || url.trim().length === 0) {
|
|
53
|
-
throw (0, errors_1.handleValidationError)('URL cannot be empty');
|
|
54
|
-
}
|
|
55
|
-
try {
|
|
56
|
-
const urlObj = new URL(url);
|
|
57
|
-
if (!['http:', 'https:'].includes(urlObj.protocol)) {
|
|
58
|
-
throw (0, errors_1.handleValidationError)('URL must use HTTP or HTTPS protocol');
|
|
59
|
-
}
|
|
60
|
-
return urlObj.toString();
|
|
61
|
-
}
|
|
62
|
-
catch (error) {
|
|
63
|
-
throw (0, errors_1.handleValidationError)('Invalid URL format');
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
// Pagination validation
|
|
67
|
-
function validatePagination(page, limit) {
|
|
68
|
-
const validatedPage = Math.max(1, page || 1);
|
|
69
|
-
const validatedLimit = Math.min(Math.max(1, limit || constants_1.CONFIG.DEFAULT_PAGE_SIZE), constants_1.CONFIG.MAX_PAGE_SIZE);
|
|
70
|
-
return { page: validatedPage, limit: validatedLimit };
|
|
71
|
-
}
|
|
72
|
-
// Title validation
|
|
73
|
-
function validateTitle(title) {
|
|
74
|
-
if (!title || title.trim().length === 0) {
|
|
75
|
-
throw (0, errors_1.handleValidationError)('Title cannot be empty');
|
|
76
|
-
}
|
|
77
|
-
if (title.length > 200) {
|
|
78
|
-
throw (0, errors_1.handleValidationError)('Title too long (max 200 characters)');
|
|
79
|
-
}
|
|
80
|
-
return title.trim();
|
|
81
|
-
}
|
|
82
|
-
// Customer ID validation
|
|
83
|
-
function validateCustomerId(customerId) {
|
|
84
|
-
if (!customerId || customerId.trim().length === 0) {
|
|
85
|
-
throw (0, errors_1.handleValidationError)('Customer ID cannot be empty');
|
|
86
|
-
}
|
|
87
|
-
if (customerId.length > 100) {
|
|
88
|
-
throw (0, errors_1.handleValidationError)('Customer ID too long (max 100 characters)');
|
|
89
|
-
}
|
|
90
|
-
return customerId.trim();
|
|
91
|
-
}
|
|
92
|
-
// Name validation
|
|
93
|
-
function validateName(name) {
|
|
94
|
-
if (!name || name.trim().length === 0) {
|
|
95
|
-
throw (0, errors_1.handleValidationError)('Name cannot be empty');
|
|
96
|
-
}
|
|
97
|
-
if (name.length > 100) {
|
|
98
|
-
throw (0, errors_1.handleValidationError)('Name too long (max 100 characters)');
|
|
99
|
-
}
|
|
100
|
-
return name.trim();
|
|
101
|
-
}
|
|
102
|
-
// Sanitize input to prevent XSS
|
|
103
|
-
function sanitizeInput(input) {
|
|
104
|
-
return input
|
|
105
|
-
.replace(/[<>]/g, '') // Remove < and >
|
|
106
|
-
.replace(/javascript:/gi, '') // Remove javascript: protocol
|
|
107
|
-
.replace(/on\w+=/gi, '') // Remove event handlers
|
|
108
|
-
.trim();
|
|
109
|
-
}
|
|
110
|
-
// Validate and sanitize all input data
|
|
111
|
-
function validateAndSanitizeInput(data) {
|
|
112
|
-
const validated = {};
|
|
113
|
-
// Required fields
|
|
114
|
-
validated.content = sanitizeInput(validateInputContent(data.content));
|
|
115
|
-
// Optional fields
|
|
116
|
-
if (data.title) {
|
|
117
|
-
validated.title = sanitizeInput(validateTitle(data.title));
|
|
118
|
-
}
|
|
119
|
-
if (data.source_url) {
|
|
120
|
-
validated.source_url = validateUrl(data.source_url);
|
|
121
|
-
}
|
|
122
|
-
if (data.customer_id) {
|
|
123
|
-
validated.customer_id = sanitizeInput(validateCustomerId(data.customer_id));
|
|
124
|
-
}
|
|
125
|
-
if (data.reporter_name) {
|
|
126
|
-
validated.reporter_name = sanitizeInput(validateName(data.reporter_name));
|
|
127
|
-
}
|
|
128
|
-
if (data.reporter_email) {
|
|
129
|
-
validated.reporter_email = validateEmail(data.reporter_email);
|
|
130
|
-
}
|
|
131
|
-
return validated;
|
|
132
|
-
}
|
|
133
|
-
//# sourceMappingURL=validation.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"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"}
|