@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.
Files changed (151) hide show
  1. package/README.md +50 -383
  2. package/dist/index.d.ts +0 -2
  3. package/dist/index.js +2117 -4
  4. package/dist/index.js.map +1 -1
  5. package/package.json +26 -23
  6. package/.claude/settings.local.json +0 -19
  7. package/.env.example +0 -13
  8. package/.github/workflows/ci.yml +0 -27
  9. package/CLAUDE.md +0 -283
  10. package/LICENSE +0 -201
  11. package/dist/commands/config.d.ts +0 -31
  12. package/dist/commands/config.d.ts.map +0 -1
  13. package/dist/commands/config.js +0 -129
  14. package/dist/commands/config.js.map +0 -1
  15. package/dist/commands/packages/pull.d.ts +0 -11
  16. package/dist/commands/packages/pull.d.ts.map +0 -1
  17. package/dist/commands/packages/pull.js +0 -72
  18. package/dist/commands/packages/pull.js.map +0 -1
  19. package/dist/commands/packages/run.d.ts +0 -47
  20. package/dist/commands/packages/run.d.ts.map +0 -1
  21. package/dist/commands/packages/run.js +0 -419
  22. package/dist/commands/packages/run.js.map +0 -1
  23. package/dist/commands/packages/search.d.ts +0 -12
  24. package/dist/commands/packages/search.d.ts.map +0 -1
  25. package/dist/commands/packages/search.js +0 -63
  26. package/dist/commands/packages/search.js.map +0 -1
  27. package/dist/commands/packages/show.d.ts +0 -8
  28. package/dist/commands/packages/show.d.ts.map +0 -1
  29. package/dist/commands/packages/show.js +0 -109
  30. package/dist/commands/packages/show.js.map +0 -1
  31. package/dist/commands/search.d.ts +0 -12
  32. package/dist/commands/search.d.ts.map +0 -1
  33. package/dist/commands/search.js +0 -144
  34. package/dist/commands/search.js.map +0 -1
  35. package/dist/commands/skills/index.d.ts +0 -8
  36. package/dist/commands/skills/index.d.ts.map +0 -1
  37. package/dist/commands/skills/index.js +0 -8
  38. package/dist/commands/skills/index.js.map +0 -1
  39. package/dist/commands/skills/install.d.ts +0 -9
  40. package/dist/commands/skills/install.d.ts.map +0 -1
  41. package/dist/commands/skills/install.js +0 -110
  42. package/dist/commands/skills/install.js.map +0 -1
  43. package/dist/commands/skills/list.d.ts +0 -8
  44. package/dist/commands/skills/list.d.ts.map +0 -1
  45. package/dist/commands/skills/list.js +0 -89
  46. package/dist/commands/skills/list.js.map +0 -1
  47. package/dist/commands/skills/pack.d.ts +0 -22
  48. package/dist/commands/skills/pack.d.ts.map +0 -1
  49. package/dist/commands/skills/pack.js +0 -116
  50. package/dist/commands/skills/pack.js.map +0 -1
  51. package/dist/commands/skills/pull.d.ts +0 -9
  52. package/dist/commands/skills/pull.d.ts.map +0 -1
  53. package/dist/commands/skills/pull.js +0 -68
  54. package/dist/commands/skills/pull.js.map +0 -1
  55. package/dist/commands/skills/search.d.ts +0 -14
  56. package/dist/commands/skills/search.d.ts.map +0 -1
  57. package/dist/commands/skills/search.js +0 -53
  58. package/dist/commands/skills/search.js.map +0 -1
  59. package/dist/commands/skills/show.d.ts +0 -8
  60. package/dist/commands/skills/show.d.ts.map +0 -1
  61. package/dist/commands/skills/show.js +0 -64
  62. package/dist/commands/skills/show.js.map +0 -1
  63. package/dist/commands/skills/validate.d.ts +0 -25
  64. package/dist/commands/skills/validate.d.ts.map +0 -1
  65. package/dist/commands/skills/validate.js +0 -191
  66. package/dist/commands/skills/validate.js.map +0 -1
  67. package/dist/index.d.ts.map +0 -1
  68. package/dist/lib/api/registry-client.d.ts +0 -63
  69. package/dist/lib/api/registry-client.d.ts.map +0 -1
  70. package/dist/lib/api/registry-client.js +0 -167
  71. package/dist/lib/api/registry-client.js.map +0 -1
  72. package/dist/lib/api/skills-client.d.ts +0 -30
  73. package/dist/lib/api/skills-client.d.ts.map +0 -1
  74. package/dist/lib/api/skills-client.js +0 -110
  75. package/dist/lib/api/skills-client.js.map +0 -1
  76. package/dist/program.d.ts +0 -12
  77. package/dist/program.d.ts.map +0 -1
  78. package/dist/program.js +0 -186
  79. package/dist/program.js.map +0 -1
  80. package/dist/schemas/generated/api-responses.d.ts +0 -541
  81. package/dist/schemas/generated/api-responses.d.ts.map +0 -1
  82. package/dist/schemas/generated/api-responses.js +0 -313
  83. package/dist/schemas/generated/api-responses.js.map +0 -1
  84. package/dist/schemas/generated/auth.d.ts +0 -18
  85. package/dist/schemas/generated/auth.d.ts.map +0 -1
  86. package/dist/schemas/generated/auth.js +0 -18
  87. package/dist/schemas/generated/auth.js.map +0 -1
  88. package/dist/schemas/generated/index.d.ts +0 -5
  89. package/dist/schemas/generated/index.d.ts.map +0 -1
  90. package/dist/schemas/generated/index.js +0 -6
  91. package/dist/schemas/generated/index.js.map +0 -1
  92. package/dist/schemas/generated/package.d.ts +0 -43
  93. package/dist/schemas/generated/package.d.ts.map +0 -1
  94. package/dist/schemas/generated/package.js +0 -20
  95. package/dist/schemas/generated/package.js.map +0 -1
  96. package/dist/schemas/generated/skill.d.ts +0 -381
  97. package/dist/schemas/generated/skill.d.ts.map +0 -1
  98. package/dist/schemas/generated/skill.js +0 -216
  99. package/dist/schemas/generated/skill.js.map +0 -1
  100. package/dist/utils/config-manager.d.ts +0 -66
  101. package/dist/utils/config-manager.d.ts.map +0 -1
  102. package/dist/utils/config-manager.js +0 -193
  103. package/dist/utils/config-manager.js.map +0 -1
  104. package/dist/utils/errors.d.ts +0 -12
  105. package/dist/utils/errors.d.ts.map +0 -1
  106. package/dist/utils/errors.js +0 -27
  107. package/dist/utils/errors.js.map +0 -1
  108. package/dist/utils/version.d.ts +0 -5
  109. package/dist/utils/version.d.ts.map +0 -1
  110. package/dist/utils/version.js +0 -19
  111. package/dist/utils/version.js.map +0 -1
  112. package/eslint.config.js +0 -63
  113. package/src/commands/config.ts +0 -162
  114. package/src/commands/packages/pull.ts +0 -96
  115. package/src/commands/packages/run.test.ts +0 -261
  116. package/src/commands/packages/run.ts +0 -536
  117. package/src/commands/packages/search.ts +0 -83
  118. package/src/commands/packages/show.ts +0 -128
  119. package/src/commands/search.ts +0 -191
  120. package/src/commands/skills/index.ts +0 -7
  121. package/src/commands/skills/install.ts +0 -129
  122. package/src/commands/skills/list.ts +0 -116
  123. package/src/commands/skills/pack.test.ts +0 -260
  124. package/src/commands/skills/pack.ts +0 -145
  125. package/src/commands/skills/pull.ts +0 -88
  126. package/src/commands/skills/search.ts +0 -73
  127. package/src/commands/skills/show.ts +0 -72
  128. package/src/commands/skills/validate.test.ts +0 -466
  129. package/src/commands/skills/validate.ts +0 -227
  130. package/src/index.ts +0 -11
  131. package/src/lib/api/registry-client.ts +0 -223
  132. package/src/lib/api/schema.d.ts +0 -520
  133. package/src/lib/api/skills-client.ts +0 -148
  134. package/src/program.test.ts +0 -22
  135. package/src/program.ts +0 -226
  136. package/src/schemas/config.v1.schema.json +0 -37
  137. package/src/schemas/generated/api-responses.ts +0 -386
  138. package/src/schemas/generated/auth.ts +0 -21
  139. package/src/schemas/generated/index.ts +0 -5
  140. package/src/schemas/generated/package.ts +0 -29
  141. package/src/schemas/generated/skill.ts +0 -271
  142. package/src/utils/config-manager.test.ts +0 -330
  143. package/src/utils/config-manager.ts +0 -272
  144. package/src/utils/errors.test.ts +0 -25
  145. package/src/utils/errors.ts +0 -33
  146. package/src/utils/version.test.ts +0 -16
  147. package/src/utils/version.ts +0 -18
  148. package/test/integration/registry-client.test.ts +0 -180
  149. package/tsconfig.check.json +0 -9
  150. package/tsconfig.json +0 -25
  151. 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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"}
@@ -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"}
@@ -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
@@ -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"}
@@ -1,5 +0,0 @@
1
- /**
2
- * Gets the current version from package.json
3
- */
4
- export declare function getVersion(): string;
5
- //# sourceMappingURL=version.d.ts.map
@@ -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"}
@@ -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
- ];
@@ -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
- }