@nimblebrain/mpak 0.1.0 → 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 +50 -383
- package/dist/index.d.ts +0 -2
- package/dist/index.js +2117 -4
- package/dist/index.js.map +1 -1
- package/package.json +26 -23
- package/.claude/settings.local.json +0 -19
- package/.env.example +0 -13
- package/.github/workflows/ci.yml +0 -27
- package/CLAUDE.md +0 -283
- package/LICENSE +0 -201
- package/dist/commands/config.d.ts +0 -31
- package/dist/commands/config.d.ts.map +0 -1
- package/dist/commands/config.js +0 -129
- package/dist/commands/config.js.map +0 -1
- package/dist/commands/packages/pull.d.ts +0 -11
- package/dist/commands/packages/pull.d.ts.map +0 -1
- package/dist/commands/packages/pull.js +0 -72
- package/dist/commands/packages/pull.js.map +0 -1
- package/dist/commands/packages/run.d.ts +0 -47
- package/dist/commands/packages/run.d.ts.map +0 -1
- package/dist/commands/packages/run.js +0 -419
- package/dist/commands/packages/run.js.map +0 -1
- package/dist/commands/packages/search.d.ts +0 -12
- package/dist/commands/packages/search.d.ts.map +0 -1
- package/dist/commands/packages/search.js +0 -63
- package/dist/commands/packages/search.js.map +0 -1
- package/dist/commands/packages/show.d.ts +0 -8
- package/dist/commands/packages/show.d.ts.map +0 -1
- package/dist/commands/packages/show.js +0 -109
- package/dist/commands/packages/show.js.map +0 -1
- package/dist/commands/search.d.ts +0 -12
- package/dist/commands/search.d.ts.map +0 -1
- package/dist/commands/search.js +0 -144
- package/dist/commands/search.js.map +0 -1
- package/dist/commands/skills/index.d.ts +0 -8
- package/dist/commands/skills/index.d.ts.map +0 -1
- package/dist/commands/skills/index.js +0 -8
- package/dist/commands/skills/index.js.map +0 -1
- package/dist/commands/skills/install.d.ts +0 -9
- package/dist/commands/skills/install.d.ts.map +0 -1
- package/dist/commands/skills/install.js +0 -110
- package/dist/commands/skills/install.js.map +0 -1
- package/dist/commands/skills/list.d.ts +0 -8
- package/dist/commands/skills/list.d.ts.map +0 -1
- package/dist/commands/skills/list.js +0 -89
- package/dist/commands/skills/list.js.map +0 -1
- package/dist/commands/skills/pack.d.ts +0 -22
- package/dist/commands/skills/pack.d.ts.map +0 -1
- package/dist/commands/skills/pack.js +0 -116
- package/dist/commands/skills/pack.js.map +0 -1
- package/dist/commands/skills/pull.d.ts +0 -9
- package/dist/commands/skills/pull.d.ts.map +0 -1
- package/dist/commands/skills/pull.js +0 -68
- package/dist/commands/skills/pull.js.map +0 -1
- package/dist/commands/skills/search.d.ts +0 -14
- package/dist/commands/skills/search.d.ts.map +0 -1
- package/dist/commands/skills/search.js +0 -53
- package/dist/commands/skills/search.js.map +0 -1
- package/dist/commands/skills/show.d.ts +0 -8
- package/dist/commands/skills/show.d.ts.map +0 -1
- package/dist/commands/skills/show.js +0 -64
- package/dist/commands/skills/show.js.map +0 -1
- package/dist/commands/skills/validate.d.ts +0 -25
- package/dist/commands/skills/validate.d.ts.map +0 -1
- package/dist/commands/skills/validate.js +0 -191
- package/dist/commands/skills/validate.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/lib/api/registry-client.d.ts +0 -63
- package/dist/lib/api/registry-client.d.ts.map +0 -1
- package/dist/lib/api/registry-client.js +0 -167
- package/dist/lib/api/registry-client.js.map +0 -1
- package/dist/lib/api/skills-client.d.ts +0 -30
- package/dist/lib/api/skills-client.d.ts.map +0 -1
- package/dist/lib/api/skills-client.js +0 -110
- package/dist/lib/api/skills-client.js.map +0 -1
- package/dist/program.d.ts +0 -12
- package/dist/program.d.ts.map +0 -1
- package/dist/program.js +0 -186
- package/dist/program.js.map +0 -1
- package/dist/schemas/generated/api-responses.d.ts +0 -541
- package/dist/schemas/generated/api-responses.d.ts.map +0 -1
- package/dist/schemas/generated/api-responses.js +0 -313
- package/dist/schemas/generated/api-responses.js.map +0 -1
- package/dist/schemas/generated/auth.d.ts +0 -18
- package/dist/schemas/generated/auth.d.ts.map +0 -1
- package/dist/schemas/generated/auth.js +0 -18
- package/dist/schemas/generated/auth.js.map +0 -1
- package/dist/schemas/generated/index.d.ts +0 -5
- package/dist/schemas/generated/index.d.ts.map +0 -1
- package/dist/schemas/generated/index.js +0 -6
- package/dist/schemas/generated/index.js.map +0 -1
- package/dist/schemas/generated/package.d.ts +0 -43
- package/dist/schemas/generated/package.d.ts.map +0 -1
- package/dist/schemas/generated/package.js +0 -20
- package/dist/schemas/generated/package.js.map +0 -1
- package/dist/schemas/generated/skill.d.ts +0 -381
- package/dist/schemas/generated/skill.d.ts.map +0 -1
- package/dist/schemas/generated/skill.js +0 -216
- package/dist/schemas/generated/skill.js.map +0 -1
- package/dist/utils/config-manager.d.ts +0 -66
- package/dist/utils/config-manager.d.ts.map +0 -1
- package/dist/utils/config-manager.js +0 -193
- package/dist/utils/config-manager.js.map +0 -1
- package/dist/utils/errors.d.ts +0 -12
- package/dist/utils/errors.d.ts.map +0 -1
- package/dist/utils/errors.js +0 -27
- package/dist/utils/errors.js.map +0 -1
- package/dist/utils/version.d.ts +0 -5
- package/dist/utils/version.d.ts.map +0 -1
- package/dist/utils/version.js +0 -19
- package/dist/utils/version.js.map +0 -1
- package/eslint.config.js +0 -63
- package/src/commands/config.ts +0 -162
- package/src/commands/packages/pull.ts +0 -96
- package/src/commands/packages/run.test.ts +0 -261
- package/src/commands/packages/run.ts +0 -536
- package/src/commands/packages/search.ts +0 -83
- package/src/commands/packages/show.ts +0 -128
- package/src/commands/search.ts +0 -191
- package/src/commands/skills/index.ts +0 -7
- package/src/commands/skills/install.ts +0 -129
- package/src/commands/skills/list.ts +0 -116
- package/src/commands/skills/pack.test.ts +0 -260
- package/src/commands/skills/pack.ts +0 -145
- package/src/commands/skills/pull.ts +0 -88
- package/src/commands/skills/search.ts +0 -73
- package/src/commands/skills/show.ts +0 -72
- package/src/commands/skills/validate.test.ts +0 -466
- package/src/commands/skills/validate.ts +0 -227
- package/src/index.ts +0 -11
- package/src/lib/api/registry-client.ts +0 -223
- package/src/lib/api/schema.d.ts +0 -520
- package/src/lib/api/skills-client.ts +0 -148
- package/src/program.test.ts +0 -22
- package/src/program.ts +0 -226
- package/src/schemas/config.v1.schema.json +0 -37
- package/src/schemas/generated/api-responses.ts +0 -386
- package/src/schemas/generated/auth.ts +0 -21
- package/src/schemas/generated/index.ts +0 -5
- package/src/schemas/generated/package.ts +0 -29
- package/src/schemas/generated/skill.ts +0 -271
- package/src/utils/config-manager.test.ts +0 -330
- package/src/utils/config-manager.ts +0 -272
- package/src/utils/errors.test.ts +0 -25
- package/src/utils/errors.ts +0 -33
- package/src/utils/version.test.ts +0 -16
- package/src/utils/version.ts +0 -18
- package/test/integration/registry-client.test.ts +0 -180
- package/tsconfig.check.json +0 -9
- package/tsconfig.json +0 -25
- package/vitest.config.ts +0 -14
|
@@ -1,193 +0,0 @@
|
|
|
1
|
-
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';
|
|
2
|
-
import { homedir } from 'os';
|
|
3
|
-
import { join } from 'path';
|
|
4
|
-
/**
|
|
5
|
-
* Current config schema version
|
|
6
|
-
*/
|
|
7
|
-
export const CONFIG_VERSION = '1.0.0';
|
|
8
|
-
/**
|
|
9
|
-
* Error thrown when config file is corrupted or invalid
|
|
10
|
-
*/
|
|
11
|
-
export class ConfigCorruptedError extends Error {
|
|
12
|
-
configPath;
|
|
13
|
-
cause;
|
|
14
|
-
constructor(message, configPath, cause) {
|
|
15
|
-
super(message);
|
|
16
|
-
this.configPath = configPath;
|
|
17
|
-
this.cause = cause;
|
|
18
|
-
this.name = 'ConfigCorruptedError';
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
/**
|
|
22
|
-
* Validates that a parsed object conforms to the MpakConfig schema
|
|
23
|
-
*/
|
|
24
|
-
function validateConfig(data, configPath) {
|
|
25
|
-
if (typeof data !== 'object' || data === null) {
|
|
26
|
-
throw new ConfigCorruptedError('Config file must be a JSON object', configPath);
|
|
27
|
-
}
|
|
28
|
-
const obj = data;
|
|
29
|
-
// Required fields
|
|
30
|
-
if (typeof obj.version !== 'string') {
|
|
31
|
-
throw new ConfigCorruptedError('Config missing required field: version (string)', configPath);
|
|
32
|
-
}
|
|
33
|
-
if (typeof obj.lastUpdated !== 'string') {
|
|
34
|
-
throw new ConfigCorruptedError('Config missing required field: lastUpdated (string)', configPath);
|
|
35
|
-
}
|
|
36
|
-
// Optional fields with type validation
|
|
37
|
-
if (obj.registryUrl !== undefined && typeof obj.registryUrl !== 'string') {
|
|
38
|
-
throw new ConfigCorruptedError('Config field registryUrl must be a string', configPath);
|
|
39
|
-
}
|
|
40
|
-
if (obj.packages !== undefined) {
|
|
41
|
-
if (typeof obj.packages !== 'object' || obj.packages === null) {
|
|
42
|
-
throw new ConfigCorruptedError('Config field packages must be an object', configPath);
|
|
43
|
-
}
|
|
44
|
-
// Validate each package config
|
|
45
|
-
for (const [pkgName, pkgConfig] of Object.entries(obj.packages)) {
|
|
46
|
-
if (typeof pkgConfig !== 'object' || pkgConfig === null) {
|
|
47
|
-
throw new ConfigCorruptedError(`Config packages.${pkgName} must be an object`, configPath);
|
|
48
|
-
}
|
|
49
|
-
for (const [key, value] of Object.entries(pkgConfig)) {
|
|
50
|
-
if (typeof value !== 'string') {
|
|
51
|
-
throw new ConfigCorruptedError(`Config packages.${pkgName}.${key} must be a string`, configPath);
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
// Check for unknown fields (additionalProperties: false in schema)
|
|
57
|
-
const knownFields = new Set(['version', 'lastUpdated', 'registryUrl', 'packages']);
|
|
58
|
-
for (const key of Object.keys(obj)) {
|
|
59
|
-
if (!knownFields.has(key)) {
|
|
60
|
-
throw new ConfigCorruptedError(`Config contains unknown field: ${key}`, configPath);
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
return data;
|
|
64
|
-
}
|
|
65
|
-
/**
|
|
66
|
-
* Configuration manager for CLI settings in ~/.mpak/config.json
|
|
67
|
-
*/
|
|
68
|
-
export class ConfigManager {
|
|
69
|
-
configDir;
|
|
70
|
-
configFile;
|
|
71
|
-
config = null;
|
|
72
|
-
constructor() {
|
|
73
|
-
this.configDir = join(homedir(), '.mpak');
|
|
74
|
-
this.configFile = join(this.configDir, 'config.json');
|
|
75
|
-
this.ensureConfigDir();
|
|
76
|
-
}
|
|
77
|
-
ensureConfigDir() {
|
|
78
|
-
if (!existsSync(this.configDir)) {
|
|
79
|
-
mkdirSync(this.configDir, { recursive: true, mode: 0o700 });
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
loadConfig() {
|
|
83
|
-
if (this.config) {
|
|
84
|
-
return this.config;
|
|
85
|
-
}
|
|
86
|
-
if (!existsSync(this.configFile)) {
|
|
87
|
-
this.config = {
|
|
88
|
-
version: CONFIG_VERSION,
|
|
89
|
-
lastUpdated: new Date().toISOString(),
|
|
90
|
-
};
|
|
91
|
-
this.saveConfig();
|
|
92
|
-
return this.config;
|
|
93
|
-
}
|
|
94
|
-
let configJson;
|
|
95
|
-
try {
|
|
96
|
-
configJson = readFileSync(this.configFile, 'utf8');
|
|
97
|
-
}
|
|
98
|
-
catch (err) {
|
|
99
|
-
throw new ConfigCorruptedError(`Failed to read config file: ${err instanceof Error ? err.message : String(err)}`, this.configFile, err instanceof Error ? err : undefined);
|
|
100
|
-
}
|
|
101
|
-
let parsed;
|
|
102
|
-
try {
|
|
103
|
-
parsed = JSON.parse(configJson);
|
|
104
|
-
}
|
|
105
|
-
catch (err) {
|
|
106
|
-
throw new ConfigCorruptedError(`Config file contains invalid JSON: ${err instanceof Error ? err.message : String(err)}`, this.configFile, err instanceof Error ? err : undefined);
|
|
107
|
-
}
|
|
108
|
-
// Validate structure against schema
|
|
109
|
-
this.config = validateConfig(parsed, this.configFile);
|
|
110
|
-
return this.config;
|
|
111
|
-
}
|
|
112
|
-
saveConfig() {
|
|
113
|
-
if (!this.config) {
|
|
114
|
-
return;
|
|
115
|
-
}
|
|
116
|
-
this.config.lastUpdated = new Date().toISOString();
|
|
117
|
-
const configJson = JSON.stringify(this.config, null, 2);
|
|
118
|
-
writeFileSync(this.configFile, configJson, { mode: 0o600 });
|
|
119
|
-
}
|
|
120
|
-
setRegistryUrl(url) {
|
|
121
|
-
const config = this.loadConfig();
|
|
122
|
-
config.registryUrl = url;
|
|
123
|
-
this.saveConfig();
|
|
124
|
-
}
|
|
125
|
-
getRegistryUrl() {
|
|
126
|
-
const config = this.loadConfig();
|
|
127
|
-
return config.registryUrl || process.env.MPAK_REGISTRY_URL || 'https://api.mpak.dev';
|
|
128
|
-
}
|
|
129
|
-
/**
|
|
130
|
-
* Get all stored config values for a package
|
|
131
|
-
*/
|
|
132
|
-
getPackageConfig(packageName) {
|
|
133
|
-
const config = this.loadConfig();
|
|
134
|
-
return config.packages?.[packageName];
|
|
135
|
-
}
|
|
136
|
-
/**
|
|
137
|
-
* Get a specific config value for a package
|
|
138
|
-
*/
|
|
139
|
-
getPackageConfigValue(packageName, key) {
|
|
140
|
-
const packageConfig = this.getPackageConfig(packageName);
|
|
141
|
-
return packageConfig?.[key];
|
|
142
|
-
}
|
|
143
|
-
/**
|
|
144
|
-
* Set a config value for a package
|
|
145
|
-
*/
|
|
146
|
-
setPackageConfigValue(packageName, key, value) {
|
|
147
|
-
const config = this.loadConfig();
|
|
148
|
-
if (!config.packages) {
|
|
149
|
-
config.packages = {};
|
|
150
|
-
}
|
|
151
|
-
if (!config.packages[packageName]) {
|
|
152
|
-
config.packages[packageName] = {};
|
|
153
|
-
}
|
|
154
|
-
config.packages[packageName][key] = value;
|
|
155
|
-
this.saveConfig();
|
|
156
|
-
}
|
|
157
|
-
/**
|
|
158
|
-
* Clear all config values for a package
|
|
159
|
-
*/
|
|
160
|
-
clearPackageConfig(packageName) {
|
|
161
|
-
const config = this.loadConfig();
|
|
162
|
-
if (config.packages?.[packageName]) {
|
|
163
|
-
delete config.packages[packageName];
|
|
164
|
-
this.saveConfig();
|
|
165
|
-
return true;
|
|
166
|
-
}
|
|
167
|
-
return false;
|
|
168
|
-
}
|
|
169
|
-
/**
|
|
170
|
-
* Clear a specific config value for a package
|
|
171
|
-
*/
|
|
172
|
-
clearPackageConfigValue(packageName, key) {
|
|
173
|
-
const config = this.loadConfig();
|
|
174
|
-
if (config.packages?.[packageName]?.[key] !== undefined) {
|
|
175
|
-
delete config.packages[packageName][key];
|
|
176
|
-
// Clean up empty package entries
|
|
177
|
-
if (Object.keys(config.packages[packageName]).length === 0) {
|
|
178
|
-
delete config.packages[packageName];
|
|
179
|
-
}
|
|
180
|
-
this.saveConfig();
|
|
181
|
-
return true;
|
|
182
|
-
}
|
|
183
|
-
return false;
|
|
184
|
-
}
|
|
185
|
-
/**
|
|
186
|
-
* List all packages with stored config
|
|
187
|
-
*/
|
|
188
|
-
listPackagesWithConfig() {
|
|
189
|
-
const config = this.loadConfig();
|
|
190
|
-
return Object.keys(config.packages || {});
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
//# sourceMappingURL=config-manager.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"config-manager.js","sourceRoot":"","sources":["../../src/utils/config-manager.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/errors.d.ts
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Custom error class for CLI errors
|
|
3
|
-
*/
|
|
4
|
-
export declare class CLIError extends Error {
|
|
5
|
-
readonly exitCode: number;
|
|
6
|
-
constructor(message: string, exitCode?: number);
|
|
7
|
-
}
|
|
8
|
-
/**
|
|
9
|
-
* Handles errors gracefully and exits with appropriate code
|
|
10
|
-
*/
|
|
11
|
-
export declare function handleError(error: unknown): never;
|
|
12
|
-
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,qBAAa,QAAS,SAAQ,KAAK;IACjC,SAAgB,QAAQ,EAAE,MAAM,CAAC;gBAG/B,OAAO,EAAE,MAAM,EACf,QAAQ,GAAE,MAAU;CAMvB;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,CAajD"}
|
package/dist/utils/errors.js
DELETED
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Custom error class for CLI errors
|
|
3
|
-
*/
|
|
4
|
-
export class CLIError extends Error {
|
|
5
|
-
exitCode;
|
|
6
|
-
constructor(message, exitCode = 1) {
|
|
7
|
-
super(message);
|
|
8
|
-
this.name = 'CLIError';
|
|
9
|
-
this.exitCode = exitCode;
|
|
10
|
-
}
|
|
11
|
-
}
|
|
12
|
-
/**
|
|
13
|
-
* Handles errors gracefully and exits with appropriate code
|
|
14
|
-
*/
|
|
15
|
-
export function handleError(error) {
|
|
16
|
-
if (error instanceof CLIError) {
|
|
17
|
-
console.error(`Error: ${error.message}`);
|
|
18
|
-
process.exit(error.exitCode);
|
|
19
|
-
}
|
|
20
|
-
if (error instanceof Error) {
|
|
21
|
-
console.error(`Error: ${error.message}`);
|
|
22
|
-
process.exit(1);
|
|
23
|
-
}
|
|
24
|
-
console.error('An unexpected error occurred');
|
|
25
|
-
process.exit(1);
|
|
26
|
-
}
|
|
27
|
-
//# sourceMappingURL=errors.js.map
|
package/dist/utils/errors.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,OAAO,QAAS,SAAQ,KAAK;IACjB,QAAQ,CAAS;IAEjC,YACE,OAAe,EACf,WAAmB,CAAC;QAEpB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;QACvB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,KAAc;IACxC,IAAI,KAAK,YAAY,QAAQ,EAAE,CAAC;QAC9B,OAAO,CAAC,KAAK,CAAC,UAAU,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACzC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC/B,CAAC;IAED,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,OAAO,CAAC,KAAK,CAAC,UAAU,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACzC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAC9C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC"}
|
package/dist/utils/version.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/utils/version.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,wBAAgB,UAAU,IAAI,MAAM,CAUnC"}
|
package/dist/utils/version.js
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import { readFileSync } from 'fs';
|
|
2
|
-
import { fileURLToPath } from 'url';
|
|
3
|
-
import { dirname, join } from 'path';
|
|
4
|
-
/**
|
|
5
|
-
* Gets the current version from package.json
|
|
6
|
-
*/
|
|
7
|
-
export function getVersion() {
|
|
8
|
-
try {
|
|
9
|
-
const __filename = fileURLToPath(import.meta.url);
|
|
10
|
-
const __dirname = dirname(__filename);
|
|
11
|
-
const packageJsonPath = join(__dirname, '../../package.json');
|
|
12
|
-
const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));
|
|
13
|
-
return packageJson.version;
|
|
14
|
-
}
|
|
15
|
-
catch (_error) {
|
|
16
|
-
return 'unknown';
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
//# sourceMappingURL=version.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/utils/version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAErC;;GAEG;AACH,MAAM,UAAU,UAAU;IACxB,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;QACtC,MAAM,eAAe,GAAG,IAAI,CAAC,SAAS,EAAE,oBAAoB,CAAC,CAAC;QAC9D,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC,CAAC;QACvE,OAAO,WAAW,CAAC,OAAO,CAAC;IAC7B,CAAC;IAAC,OAAO,MAAM,EAAE,CAAC;QAChB,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC"}
|
package/eslint.config.js
DELETED
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
import js from '@eslint/js';
|
|
2
|
-
import typescript from '@typescript-eslint/eslint-plugin';
|
|
3
|
-
import typescriptParser from '@typescript-eslint/parser';
|
|
4
|
-
|
|
5
|
-
export default [
|
|
6
|
-
js.configs.recommended,
|
|
7
|
-
{
|
|
8
|
-
files: ['src/**/*.ts'],
|
|
9
|
-
languageOptions: {
|
|
10
|
-
parser: typescriptParser,
|
|
11
|
-
parserOptions: {
|
|
12
|
-
ecmaVersion: 2022,
|
|
13
|
-
sourceType: 'module'
|
|
14
|
-
},
|
|
15
|
-
globals: {
|
|
16
|
-
console: 'readonly',
|
|
17
|
-
process: 'readonly',
|
|
18
|
-
Buffer: 'readonly',
|
|
19
|
-
__dirname: 'readonly',
|
|
20
|
-
__filename: 'readonly',
|
|
21
|
-
global: 'readonly',
|
|
22
|
-
fetch: 'readonly',
|
|
23
|
-
setTimeout: 'readonly',
|
|
24
|
-
setInterval: 'readonly',
|
|
25
|
-
clearTimeout: 'readonly',
|
|
26
|
-
clearInterval: 'readonly',
|
|
27
|
-
setImmediate: 'readonly',
|
|
28
|
-
Blob: 'readonly',
|
|
29
|
-
FormData: 'readonly',
|
|
30
|
-
URLSearchParams: 'readonly',
|
|
31
|
-
NodeJS: 'readonly'
|
|
32
|
-
}
|
|
33
|
-
},
|
|
34
|
-
plugins: {
|
|
35
|
-
'@typescript-eslint': typescript
|
|
36
|
-
},
|
|
37
|
-
rules: {
|
|
38
|
-
// TypeScript specific rules
|
|
39
|
-
'@typescript-eslint/no-unused-vars': ['error', { argsIgnorePattern: '^_', varsIgnorePattern: '^_', caughtErrors: 'all', caughtErrorsIgnorePattern: '^_' }],
|
|
40
|
-
'no-unused-vars': ['error', { argsIgnorePattern: '^_', varsIgnorePattern: '^_', caughtErrors: 'all', caughtErrorsIgnorePattern: '^_' }],
|
|
41
|
-
'@typescript-eslint/no-explicit-any': 'warn',
|
|
42
|
-
|
|
43
|
-
// General JavaScript rules
|
|
44
|
-
'no-console': 'off', // CLI needs console output
|
|
45
|
-
'prefer-const': 'error',
|
|
46
|
-
'no-var': 'error',
|
|
47
|
-
'eqeqeq': 'error',
|
|
48
|
-
'no-trailing-spaces': 'error',
|
|
49
|
-
'no-multiple-empty-lines': ['error', { max: 2 }],
|
|
50
|
-
|
|
51
|
-
// Import/export rules
|
|
52
|
-
'no-duplicate-imports': 'error'
|
|
53
|
-
}
|
|
54
|
-
},
|
|
55
|
-
{
|
|
56
|
-
ignores: [
|
|
57
|
-
'dist/**',
|
|
58
|
-
'node_modules/**',
|
|
59
|
-
'*.js',
|
|
60
|
-
'examples/**'
|
|
61
|
-
]
|
|
62
|
-
}
|
|
63
|
-
];
|
package/src/commands/config.ts
DELETED
|
@@ -1,162 +0,0 @@
|
|
|
1
|
-
import { ConfigManager, PackageConfig } from '../utils/config-manager.js';
|
|
2
|
-
|
|
3
|
-
export interface ConfigSetOptions {
|
|
4
|
-
// Future options like --global could go here
|
|
5
|
-
}
|
|
6
|
-
|
|
7
|
-
export interface ConfigGetOptions {
|
|
8
|
-
json?: boolean;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
export interface ConfigClearOptions {
|
|
12
|
-
// Future options
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* Mask sensitive values for display (show first 4 chars, rest as *)
|
|
17
|
-
*/
|
|
18
|
-
function maskValue(value: string): string {
|
|
19
|
-
if (value.length <= 4) {
|
|
20
|
-
return '*'.repeat(value.length);
|
|
21
|
-
}
|
|
22
|
-
return value.substring(0, 4) + '*'.repeat(value.length - 4);
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* Set config value(s) for a package
|
|
27
|
-
* @example mpak config set @scope/name api_key=xxx
|
|
28
|
-
* @example mpak config set @scope/name api_key=xxx other_key=yyy
|
|
29
|
-
*/
|
|
30
|
-
export async function handleConfigSet(
|
|
31
|
-
packageName: string,
|
|
32
|
-
keyValuePairs: string[],
|
|
33
|
-
_options: ConfigSetOptions = {}
|
|
34
|
-
): Promise<void> {
|
|
35
|
-
if (keyValuePairs.length === 0) {
|
|
36
|
-
process.stderr.write('Error: At least one key=value pair is required\n');
|
|
37
|
-
process.stderr.write('Usage: mpak config set <package> <key>=<value> [<key>=<value>...]\n');
|
|
38
|
-
process.exit(1);
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
const configManager = new ConfigManager();
|
|
42
|
-
let setCount = 0;
|
|
43
|
-
|
|
44
|
-
for (const pair of keyValuePairs) {
|
|
45
|
-
const eqIndex = pair.indexOf('=');
|
|
46
|
-
if (eqIndex === -1) {
|
|
47
|
-
process.stderr.write(`Error: Invalid format "${pair}". Expected key=value\n`);
|
|
48
|
-
process.exit(1);
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
const key = pair.substring(0, eqIndex);
|
|
52
|
-
const value = pair.substring(eqIndex + 1);
|
|
53
|
-
|
|
54
|
-
if (!key) {
|
|
55
|
-
process.stderr.write(`Error: Empty key in "${pair}"\n`);
|
|
56
|
-
process.exit(1);
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
configManager.setPackageConfigValue(packageName, key, value);
|
|
60
|
-
setCount++;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
console.log(`Set ${setCount} config value(s) for ${packageName}`);
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
/**
|
|
67
|
-
* Get config values for a package
|
|
68
|
-
* @example mpak config get @scope/name
|
|
69
|
-
* @example mpak config get @scope/name --json
|
|
70
|
-
*/
|
|
71
|
-
export async function handleConfigGet(
|
|
72
|
-
packageName: string,
|
|
73
|
-
options: ConfigGetOptions = {}
|
|
74
|
-
): Promise<void> {
|
|
75
|
-
const configManager = new ConfigManager();
|
|
76
|
-
const config = configManager.getPackageConfig(packageName);
|
|
77
|
-
|
|
78
|
-
if (!config || Object.keys(config).length === 0) {
|
|
79
|
-
if (options.json) {
|
|
80
|
-
console.log(JSON.stringify({}, null, 2));
|
|
81
|
-
} else {
|
|
82
|
-
console.log(`No config stored for ${packageName}`);
|
|
83
|
-
}
|
|
84
|
-
return;
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
if (options.json) {
|
|
88
|
-
// Mask values in JSON output too
|
|
89
|
-
const masked: PackageConfig = {};
|
|
90
|
-
for (const [key, value] of Object.entries(config)) {
|
|
91
|
-
masked[key] = maskValue(value);
|
|
92
|
-
}
|
|
93
|
-
console.log(JSON.stringify(masked, null, 2));
|
|
94
|
-
} else {
|
|
95
|
-
console.log(`Config for ${packageName}:`);
|
|
96
|
-
for (const [key, value] of Object.entries(config)) {
|
|
97
|
-
console.log(` ${key}: ${maskValue(value)}`);
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
/**
|
|
103
|
-
* List all packages with stored config
|
|
104
|
-
* @example mpak config list
|
|
105
|
-
*/
|
|
106
|
-
export async function handleConfigList(
|
|
107
|
-
options: ConfigGetOptions = {}
|
|
108
|
-
): Promise<void> {
|
|
109
|
-
const configManager = new ConfigManager();
|
|
110
|
-
const packages = configManager.listPackagesWithConfig();
|
|
111
|
-
|
|
112
|
-
if (packages.length === 0) {
|
|
113
|
-
if (options.json) {
|
|
114
|
-
console.log(JSON.stringify([], null, 2));
|
|
115
|
-
} else {
|
|
116
|
-
console.log('No packages have stored config');
|
|
117
|
-
}
|
|
118
|
-
return;
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
if (options.json) {
|
|
122
|
-
console.log(JSON.stringify(packages, null, 2));
|
|
123
|
-
} else {
|
|
124
|
-
console.log('Packages with stored config:');
|
|
125
|
-
for (const pkg of packages) {
|
|
126
|
-
const config = configManager.getPackageConfig(pkg);
|
|
127
|
-
const keyCount = config ? Object.keys(config).length : 0;
|
|
128
|
-
console.log(` ${pkg} (${keyCount} value${keyCount === 1 ? '' : 's'})`);
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
/**
|
|
134
|
-
* Clear config for a package
|
|
135
|
-
* @example mpak config clear @scope/name # clears all
|
|
136
|
-
* @example mpak config clear @scope/name api_key # clears specific key
|
|
137
|
-
*/
|
|
138
|
-
export async function handleConfigClear(
|
|
139
|
-
packageName: string,
|
|
140
|
-
key?: string,
|
|
141
|
-
_options: ConfigClearOptions = {}
|
|
142
|
-
): Promise<void> {
|
|
143
|
-
const configManager = new ConfigManager();
|
|
144
|
-
|
|
145
|
-
if (key) {
|
|
146
|
-
// Clear specific key
|
|
147
|
-
const cleared = configManager.clearPackageConfigValue(packageName, key);
|
|
148
|
-
if (cleared) {
|
|
149
|
-
console.log(`Cleared ${key} for ${packageName}`);
|
|
150
|
-
} else {
|
|
151
|
-
console.log(`No value found for ${key} in ${packageName}`);
|
|
152
|
-
}
|
|
153
|
-
} else {
|
|
154
|
-
// Clear all config for package
|
|
155
|
-
const cleared = configManager.clearPackageConfig(packageName);
|
|
156
|
-
if (cleared) {
|
|
157
|
-
console.log(`Cleared all config for ${packageName}`);
|
|
158
|
-
} else {
|
|
159
|
-
console.log(`No config found for ${packageName}`);
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
}
|
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
import { resolve } from 'path';
|
|
2
|
-
import { RegistryClient } from '../../lib/api/registry-client.js';
|
|
3
|
-
|
|
4
|
-
export interface PullOptions {
|
|
5
|
-
output?: string;
|
|
6
|
-
json?: boolean;
|
|
7
|
-
os?: string;
|
|
8
|
-
arch?: string;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* Parse package specification into name and version
|
|
13
|
-
* Examples:
|
|
14
|
-
* @scope/name -> { name: '@scope/name', version: undefined }
|
|
15
|
-
* @scope/name@1.0.0 -> { name: '@scope/name', version: '1.0.0' }
|
|
16
|
-
*/
|
|
17
|
-
function parsePackageSpec(spec: string): { name: string; version?: string } {
|
|
18
|
-
// Find the last @ which separates version from package name
|
|
19
|
-
// Package names start with @, so we need to find the second @
|
|
20
|
-
const lastAtIndex = spec.lastIndexOf('@');
|
|
21
|
-
|
|
22
|
-
if (lastAtIndex <= 0) {
|
|
23
|
-
// No version specified or invalid format
|
|
24
|
-
return { name: spec };
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
const name = spec.substring(0, lastAtIndex);
|
|
28
|
-
const version = spec.substring(lastAtIndex + 1);
|
|
29
|
-
|
|
30
|
-
// Validate that the name still starts with @
|
|
31
|
-
if (!name.startsWith('@')) {
|
|
32
|
-
// This means the @ was part of the package name, not a version separator
|
|
33
|
-
return { name: spec };
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
return { name, version };
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
/**
|
|
40
|
-
* Pull (download) a package from the registry
|
|
41
|
-
*/
|
|
42
|
-
export async function handlePull(
|
|
43
|
-
packageSpec: string,
|
|
44
|
-
options: PullOptions = {}
|
|
45
|
-
): Promise<void> {
|
|
46
|
-
try {
|
|
47
|
-
const { name, version } = parsePackageSpec(packageSpec);
|
|
48
|
-
|
|
49
|
-
const client = new RegistryClient();
|
|
50
|
-
|
|
51
|
-
// Detect platform (or use explicit overrides)
|
|
52
|
-
const detectedPlatform = RegistryClient.detectPlatform();
|
|
53
|
-
const platform = {
|
|
54
|
-
os: options.os || detectedPlatform.os,
|
|
55
|
-
arch: options.arch || detectedPlatform.arch,
|
|
56
|
-
};
|
|
57
|
-
|
|
58
|
-
console.log(`=> Fetching ${version ? `${name}@${version}` : `${name} (latest)`}...`);
|
|
59
|
-
console.log(` Platform: ${platform.os}-${platform.arch}`);
|
|
60
|
-
|
|
61
|
-
// Get download info with platform
|
|
62
|
-
const downloadInfo = await client.getDownloadInfo(name, version, platform);
|
|
63
|
-
|
|
64
|
-
if (options.json) {
|
|
65
|
-
console.log(JSON.stringify(downloadInfo, null, 2));
|
|
66
|
-
return;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
const bundle = downloadInfo.bundle;
|
|
70
|
-
console.log(` Version: ${bundle.version}`);
|
|
71
|
-
console.log(` Artifact: ${bundle.platform.os}-${bundle.platform.arch}`);
|
|
72
|
-
console.log(` Size: ${(bundle.size / (1024 * 1024)).toFixed(2)} MB`);
|
|
73
|
-
|
|
74
|
-
// Determine output filename (include platform in name)
|
|
75
|
-
const platformSuffix = `${bundle.platform.os}-${bundle.platform.arch}`;
|
|
76
|
-
const defaultFilename = `${name.replace('@', '').replace('/', '-')}-${bundle.version}-${platformSuffix}.mcpb`;
|
|
77
|
-
const outputPath = options.output
|
|
78
|
-
? resolve(options.output)
|
|
79
|
-
: resolve(defaultFilename);
|
|
80
|
-
|
|
81
|
-
console.log(`\n=> Downloading to ${outputPath}...`);
|
|
82
|
-
|
|
83
|
-
// Download the bundle
|
|
84
|
-
await client.downloadBundle(downloadInfo.url, outputPath);
|
|
85
|
-
|
|
86
|
-
console.log(`\n=> Bundle downloaded successfully!`);
|
|
87
|
-
console.log(` File: ${outputPath}`);
|
|
88
|
-
console.log(` SHA256: ${bundle.sha256.substring(0, 16)}...`);
|
|
89
|
-
} catch (error) {
|
|
90
|
-
console.error('\n=> Failed to pull bundle');
|
|
91
|
-
if (error instanceof Error) {
|
|
92
|
-
console.error(` ${error.message}`);
|
|
93
|
-
}
|
|
94
|
-
process.exit(1);
|
|
95
|
-
}
|
|
96
|
-
}
|