berget 2.2.6 → 2.2.8

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 (145) hide show
  1. package/.github/workflows/publish.yml +2 -2
  2. package/.github/workflows/test.yml +10 -4
  3. package/.husky/pre-commit +1 -0
  4. package/.prettierignore +15 -0
  5. package/.prettierrc +7 -3
  6. package/CONTRIBUTING.md +38 -0
  7. package/README.md +2 -148
  8. package/dist/index.js +10 -11
  9. package/dist/package.json +30 -2
  10. package/dist/src/agents/app.js +28 -0
  11. package/dist/src/agents/backend.js +25 -0
  12. package/dist/src/agents/devops.js +34 -0
  13. package/dist/src/agents/frontend.js +25 -0
  14. package/dist/src/agents/fullstack.js +25 -0
  15. package/dist/src/agents/index.js +61 -0
  16. package/dist/src/agents/quality.js +70 -0
  17. package/dist/src/agents/security.js +26 -0
  18. package/dist/src/agents/types.js +2 -0
  19. package/dist/src/client.js +97 -117
  20. package/dist/src/commands/api-keys.js +75 -90
  21. package/dist/src/commands/auth.js +7 -16
  22. package/dist/src/commands/autocomplete.js +1 -1
  23. package/dist/src/commands/billing.js +6 -17
  24. package/dist/src/commands/chat.js +68 -101
  25. package/dist/src/commands/clusters.js +9 -18
  26. package/dist/src/commands/code/__tests__/auth-sync.test.js +351 -0
  27. package/dist/src/commands/code/__tests__/fake-api-key-service.js +13 -0
  28. package/dist/src/commands/code/__tests__/fake-auth-service.js +47 -0
  29. package/dist/src/commands/code/__tests__/fake-command-runner.js +21 -34
  30. package/dist/src/commands/code/__tests__/fake-file-store.js +20 -33
  31. package/dist/src/commands/code/__tests__/fake-prompter.js +83 -57
  32. package/dist/src/commands/code/__tests__/setup-flow.test.js +359 -92
  33. package/dist/src/commands/code/adapters/clack-prompter.js +15 -22
  34. package/dist/src/commands/code/adapters/fs-file-store.js +26 -40
  35. package/dist/src/commands/code/adapters/spawn-command-runner.js +27 -37
  36. package/dist/src/commands/code/auth-sync.js +270 -0
  37. package/dist/src/commands/code/errors.js +12 -9
  38. package/dist/src/commands/code/ports/auth-services.js +2 -0
  39. package/dist/src/commands/code/setup.js +387 -281
  40. package/dist/src/commands/code.js +205 -332
  41. package/dist/src/commands/index.js +5 -5
  42. package/dist/src/commands/models.js +6 -17
  43. package/dist/src/commands/users.js +5 -16
  44. package/dist/src/constants/command-structure.js +104 -104
  45. package/dist/src/services/api-key-service.js +132 -157
  46. package/dist/src/services/auth-service.js +89 -342
  47. package/dist/src/services/browser-auth.js +268 -0
  48. package/dist/src/services/chat-service.js +371 -401
  49. package/dist/src/services/cluster-service.js +47 -62
  50. package/dist/src/services/collaborator-service.js +10 -25
  51. package/dist/src/services/flux-service.js +14 -29
  52. package/dist/src/services/helm-service.js +10 -25
  53. package/dist/src/services/kubectl-service.js +16 -33
  54. package/dist/src/utils/config-checker.js +3 -3
  55. package/dist/src/utils/config-loader.js +95 -95
  56. package/dist/src/utils/default-api-key.js +124 -134
  57. package/dist/src/utils/env-manager.js +55 -66
  58. package/dist/src/utils/error-handler.js +20 -21
  59. package/dist/src/utils/logger.js +72 -65
  60. package/dist/src/utils/markdown-renderer.js +27 -27
  61. package/dist/src/utils/opencode-validator.js +63 -68
  62. package/dist/src/utils/token-manager.js +74 -45
  63. package/dist/tests/commands/chat.test.js +16 -25
  64. package/dist/tests/commands/code.test.js +95 -104
  65. package/dist/tests/utils/config-loader.test.js +48 -48
  66. package/dist/tests/utils/env-manager.test.js +43 -52
  67. package/dist/tests/utils/opencode-validator.test.js +22 -21
  68. package/dist/vitest.config.js +1 -1
  69. package/eslint.config.mjs +67 -0
  70. package/index.ts +35 -42
  71. package/package.json +30 -2
  72. package/src/agents/app.ts +27 -0
  73. package/src/agents/backend.ts +24 -0
  74. package/src/agents/devops.ts +33 -0
  75. package/src/agents/frontend.ts +24 -0
  76. package/src/agents/fullstack.ts +24 -0
  77. package/src/agents/index.ts +73 -0
  78. package/src/agents/quality.ts +69 -0
  79. package/src/agents/security.ts +26 -0
  80. package/src/agents/types.ts +17 -0
  81. package/src/client.ts +118 -152
  82. package/src/commands/api-keys.ts +241 -333
  83. package/src/commands/auth.ts +22 -27
  84. package/src/commands/autocomplete.ts +9 -9
  85. package/src/commands/billing.ts +20 -24
  86. package/src/commands/chat.ts +248 -338
  87. package/src/commands/clusters.ts +27 -26
  88. package/src/commands/code/__tests__/auth-sync.test.ts +482 -0
  89. package/src/commands/code/__tests__/fake-api-key-service.ts +13 -0
  90. package/src/commands/code/__tests__/fake-auth-service.ts +50 -0
  91. package/src/commands/code/__tests__/fake-command-runner.ts +45 -42
  92. package/src/commands/code/__tests__/fake-file-store.ts +32 -23
  93. package/src/commands/code/__tests__/fake-prompter.ts +116 -77
  94. package/src/commands/code/__tests__/setup-flow.test.ts +624 -268
  95. package/src/commands/code/adapters/clack-prompter.ts +53 -39
  96. package/src/commands/code/adapters/fs-file-store.ts +32 -27
  97. package/src/commands/code/adapters/spawn-command-runner.ts +38 -29
  98. package/src/commands/code/auth-sync.ts +329 -0
  99. package/src/commands/code/errors.ts +18 -18
  100. package/src/commands/code/ports/auth-services.ts +14 -0
  101. package/src/commands/code/ports/command-runner.ts +8 -4
  102. package/src/commands/code/ports/file-store.ts +5 -4
  103. package/src/commands/code/ports/prompter.ts +24 -18
  104. package/src/commands/code/setup.ts +570 -340
  105. package/src/commands/code.ts +338 -539
  106. package/src/commands/index.ts +20 -19
  107. package/src/commands/models.ts +28 -32
  108. package/src/commands/users.ts +15 -21
  109. package/src/constants/command-structure.ts +134 -157
  110. package/src/services/api-key-service.ts +105 -122
  111. package/src/services/auth-service.ts +99 -345
  112. package/src/services/browser-auth.ts +296 -0
  113. package/src/services/chat-service.ts +265 -299
  114. package/src/services/cluster-service.ts +42 -45
  115. package/src/services/collaborator-service.ts +14 -19
  116. package/src/services/flux-service.ts +23 -25
  117. package/src/services/helm-service.ts +19 -21
  118. package/src/services/kubectl-service.ts +17 -19
  119. package/src/types/api.d.ts +1905 -1907
  120. package/src/types/json.d.ts +2 -2
  121. package/src/utils/config-checker.ts +10 -10
  122. package/src/utils/config-loader.ts +162 -178
  123. package/src/utils/default-api-key.ts +114 -125
  124. package/src/utils/env-manager.ts +53 -57
  125. package/src/utils/error-handler.ts +61 -56
  126. package/src/utils/logger.ts +79 -73
  127. package/src/utils/markdown-renderer.ts +31 -31
  128. package/src/utils/opencode-validator.ts +85 -89
  129. package/src/utils/token-manager.ts +108 -87
  130. package/templates/agents/app.md +1 -0
  131. package/templates/agents/backend.md +1 -0
  132. package/templates/agents/devops.md +2 -0
  133. package/templates/agents/frontend.md +1 -0
  134. package/templates/agents/fullstack.md +1 -0
  135. package/templates/agents/quality.md +45 -40
  136. package/templates/agents/security.md +1 -0
  137. package/tests/commands/chat.test.ts +53 -62
  138. package/tests/commands/code.test.ts +265 -310
  139. package/tests/utils/config-loader.test.ts +189 -188
  140. package/tests/utils/env-manager.test.ts +110 -113
  141. package/tests/utils/opencode-validator.test.ts +52 -56
  142. package/tsconfig.json +4 -3
  143. package/vitest.config.ts +3 -3
  144. package/AGENTS.md +0 -374
  145. package/TODO.md +0 -19
@@ -1,199 +1,174 @@
1
1
  "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
2
  Object.defineProperty(exports, "__esModule", { value: true });
12
3
  exports.ApiKeyService = void 0;
13
4
  const client_1 = require("../client");
14
- const error_handler_1 = require("../utils/error-handler");
15
5
  const command_structure_1 = require("../constants/command-structure");
6
+ const error_handler_1 = require("../utils/error-handler");
16
7
  /**
17
8
  * Service for managing API keys
18
9
  * Command group: api-keys
19
10
  */
20
11
  class ApiKeyService {
21
- constructor() {
22
- this.client = (0, client_1.createAuthenticatedClient)();
23
- }
12
+ // Command group name for this service
13
+ static COMMAND_GROUP = command_structure_1.COMMAND_GROUPS.API_KEYS;
14
+ // Subcommands for this service
15
+ static COMMANDS = command_structure_1.SUBCOMMANDS.API_KEYS;
16
+ static instance;
17
+ client = (0, client_1.createAuthenticatedClient)();
18
+ constructor() { }
24
19
  static getInstance() {
25
20
  if (!ApiKeyService.instance) {
26
21
  ApiKeyService.instance = new ApiKeyService();
27
22
  }
28
23
  return ApiKeyService.instance;
29
24
  }
30
- /**
31
- * List all API keys
32
- * Command: berget api-keys list
33
- */
34
- list() {
35
- return __awaiter(this, void 0, void 0, function* () {
36
- try {
37
- const { data, error } = yield this.client.GET('/v1/api-keys');
38
- if (error)
39
- throw error;
40
- return data || [];
41
- }
42
- catch (error) {
43
- (0, error_handler_1.handleError)('Failed to list API keys', error);
44
- throw error;
45
- }
46
- });
47
- }
48
25
  /**
49
26
  * Create a new API key
50
27
  * Command: berget api-keys create
51
28
  */
52
- create(options) {
53
- var _a, _b, _c, _d, _e;
54
- return __awaiter(this, void 0, void 0, function* () {
55
- try {
56
- // Validate input before sending request
57
- if (!options.name || options.name.trim().length === 0) {
58
- throw new Error('API key name is required and cannot be empty');
59
- }
60
- if (options.name.length > 100) {
61
- throw new Error('API key name must be 100 characters or less');
62
- }
63
- if (options.description && options.description.length > 500) {
64
- throw new Error('API key description must be 500 characters or less');
65
- }
66
- const { data, error } = yield this.client.POST('/v1/api-keys', {
67
- body: options,
68
- });
69
- if (error) {
70
- // Enhanced error handling with specific troubleshooting
71
- // Handle specific error cases
72
- if (typeof error === 'object' && error !== null) {
73
- const errorObj = error;
74
- if (((_a = errorObj.error) === null || _a === void 0 ? void 0 : _a.code) === 'API_KEY_CREATION_FAILED') {
75
- let detailedMessage = 'Failed to create API key. This could be due to:\n';
76
- detailedMessage += '• Account limits or quota restrictions\n';
77
- detailedMessage +=
78
- '• Insufficient permissions for API key creation\n';
79
- detailedMessage += '• Temporary server issues\n';
80
- detailedMessage += '• Billing or subscription issues\n\n';
81
- detailedMessage += 'Troubleshooting steps:\n';
82
- detailedMessage +=
83
- '1. Check if you have reached your API key limit\n';
84
- detailedMessage +=
85
- '2. Verify your account has API key creation permissions\n';
86
- detailedMessage += '3. Check your billing status and subscription\n';
87
- detailedMessage +=
88
- '4. Try again in a few minutes if this is a temporary issue\n';
89
- detailedMessage += '5. Contact support if the problem persists';
90
- throw new Error(detailedMessage);
91
- }
92
- if (((_b = errorObj.error) === null || _b === void 0 ? void 0 : _b.code) === 'USER_NOT_FOUND') {
93
- throw new Error('Your account is still being set up. Please wait a moment and try again.\n\nIf this issue persists, please contact support at support@berget.ai');
94
- }
95
- if (((_c = errorObj.error) === null || _c === void 0 ? void 0 : _c.code) === 'QUOTA_EXCEEDED') {
96
- throw new Error('You have reached your API key limit. Please delete existing keys or contact support to increase your quota.');
97
- }
98
- if (((_d = errorObj.error) === null || _d === void 0 ? void 0 : _d.code) === 'INSUFFICIENT_PERMISSIONS') {
99
- throw new Error('Your account does not have permission to create API keys. Please contact your administrator.');
100
- }
101
- if (((_e = errorObj.error) === null || _e === void 0 ? void 0 : _e.code) === 'BILLING_REQUIRED') {
102
- throw new Error('A valid billing method is required to create API keys. Please add a payment method.');
103
- }
104
- }
105
- throw new Error(JSON.stringify(error));
106
- }
107
- if (!data) {
108
- throw new Error('No data received from server');
109
- }
110
- return data;
29
+ async create(options) {
30
+ try {
31
+ // Validate input before sending request
32
+ if (!options.name || options.name.trim().length === 0) {
33
+ throw new Error('API key name is required and cannot be empty');
34
+ }
35
+ if (options.name.length > 100) {
36
+ throw new Error('API key name must be 100 characters or less');
37
+ }
38
+ if (options.description && options.description.length > 500) {
39
+ throw new Error('API key description must be 500 characters or less');
111
40
  }
112
- catch (error) {
113
- console.error('Failed to create API key:', error);
114
- // Add additional context for common issues
115
- if (error instanceof Error) {
116
- if (error.message.includes('ECONNREFUSED')) {
117
- throw new Error('Cannot connect to Berget API. Please check your internet connection.');
41
+ const { data, error } = await this.client.POST('/v1/api-keys', {
42
+ body: options,
43
+ });
44
+ if (error) {
45
+ // Enhanced error handling with specific troubleshooting
46
+ // Handle specific error cases
47
+ if (typeof error === 'object' && error !== null) {
48
+ const errorObject = error;
49
+ if (errorObject.error?.code === 'API_KEY_CREATION_FAILED') {
50
+ let detailedMessage = 'Failed to create API key. This could be due to:\n';
51
+ detailedMessage += '• Account limits or quota restrictions\n';
52
+ detailedMessage += '• Insufficient permissions for API key creation\n';
53
+ detailedMessage += '• Temporary server issues\n';
54
+ detailedMessage += '• Billing or subscription issues\n\n';
55
+ detailedMessage += 'Troubleshooting steps:\n';
56
+ detailedMessage += '1. Check if you have reached your API key limit\n';
57
+ detailedMessage += '2. Verify your account has API key creation permissions\n';
58
+ detailedMessage += '3. Check your billing status and subscription\n';
59
+ detailedMessage += '4. Try again in a few minutes if this is a temporary issue\n';
60
+ detailedMessage += '5. Contact support if the problem persists';
61
+ throw new Error(detailedMessage);
118
62
  }
119
- if (error.message.includes('ENOTFOUND')) {
120
- throw new Error('Cannot resolve Berget API hostname. Please check your DNS settings.');
63
+ if (errorObject.error?.code === 'USER_NOT_FOUND') {
64
+ throw new Error('Your account is still being set up. Please wait a moment and try again.\n\nIf this issue persists, please contact support at support@berget.ai');
121
65
  }
122
- if (error.message.includes('401') ||
123
- error.message.includes('Unauthorized')) {
124
- throw new Error('Authentication failed. Please run `berget auth login` to log in again.');
66
+ if (errorObject.error?.code === 'QUOTA_EXCEEDED') {
67
+ throw new Error('You have reached your API key limit. Please delete existing keys or contact support to increase your quota.');
125
68
  }
126
- if (error.message.includes('403')) {
127
- throw new Error('Access forbidden. Your account may not have permission to create API keys.');
69
+ if (errorObject.error?.code === 'INSUFFICIENT_PERMISSIONS') {
70
+ throw new Error('Your account does not have permission to create API keys. Please contact your administrator.');
71
+ }
72
+ if (errorObject.error?.code === 'BILLING_REQUIRED') {
73
+ throw new Error('A valid billing method is required to create API keys. Please add a payment method.');
128
74
  }
129
75
  }
130
- throw error;
76
+ throw new Error(JSON.stringify(error));
77
+ }
78
+ if (!data) {
79
+ throw new Error('No data received from server');
131
80
  }
132
- });
81
+ return data;
82
+ }
83
+ catch (error) {
84
+ console.error('Failed to create API key:', error);
85
+ // Add additional context for common issues
86
+ if (error instanceof Error) {
87
+ if (error.message.includes('ECONNREFUSED')) {
88
+ throw new Error('Cannot connect to Berget API. Please check your internet connection.');
89
+ }
90
+ if (error.message.includes('ENOTFOUND')) {
91
+ throw new Error('Cannot resolve Berget API hostname. Please check your DNS settings.');
92
+ }
93
+ if (error.message.includes('401') || error.message.includes('Unauthorized')) {
94
+ throw new Error('Authentication failed. Please run `berget auth login` to log in again.');
95
+ }
96
+ if (error.message.includes('403')) {
97
+ throw new Error('Access forbidden. Your account may not have permission to create API keys.');
98
+ }
99
+ }
100
+ throw error;
101
+ }
133
102
  }
134
103
  /**
135
104
  * Delete an API key
136
105
  * Command: berget api-keys delete
137
106
  */
138
- delete(id) {
139
- return __awaiter(this, void 0, void 0, function* () {
140
- try {
141
- const { error } = yield this.client.DELETE('/v1/api-keys/{id}', {
142
- params: { path: { id } },
143
- });
144
- if (error)
145
- throw new Error(JSON.stringify(error));
146
- return true;
147
- }
148
- catch (error) {
149
- console.error('Failed to delete API key:', error);
150
- throw error;
151
- }
152
- });
107
+ async delete(id) {
108
+ try {
109
+ const { error } = await this.client.DELETE('/v1/api-keys/{id}', {
110
+ params: { path: { id } },
111
+ });
112
+ if (error)
113
+ throw new Error(JSON.stringify(error));
114
+ return true;
115
+ }
116
+ catch (error) {
117
+ console.error('Failed to delete API key:', error);
118
+ throw error;
119
+ }
153
120
  }
154
121
  /**
155
- * Rotate an API key
156
- * Command: berget api-keys rotate
122
+ * Get usage statistics for an API key
123
+ * Command: berget api-keys describe
157
124
  */
158
- rotate(id) {
159
- return __awaiter(this, void 0, void 0, function* () {
160
- try {
161
- const { data, error } = yield this.client.PUT('/v1/api-keys/{id}/rotate', {
162
- params: { path: { id } },
163
- });
164
- if (error)
165
- throw new Error(JSON.stringify(error));
166
- return data;
167
- }
168
- catch (error) {
169
- console.error('Failed to rotate API key:', error);
170
- throw error;
171
- }
172
- });
125
+ async describe(id) {
126
+ try {
127
+ const { data, error } = await this.client.GET('/v1/api-keys/{id}/usage', {
128
+ params: { path: { id } },
129
+ });
130
+ if (error)
131
+ throw new Error(JSON.stringify(error));
132
+ return data;
133
+ }
134
+ catch (error) {
135
+ console.error('Failed to get API key usage:', error);
136
+ throw error;
137
+ }
173
138
  }
174
139
  /**
175
- * Get usage statistics for an API key
176
- * Command: berget api-keys describe
140
+ * List all API keys
141
+ * Command: berget api-keys list
177
142
  */
178
- describe(id) {
179
- return __awaiter(this, void 0, void 0, function* () {
180
- try {
181
- const { data, error } = yield this.client.GET('/v1/api-keys/{id}/usage', {
182
- params: { path: { id } },
183
- });
184
- if (error)
185
- throw new Error(JSON.stringify(error));
186
- return data;
187
- }
188
- catch (error) {
189
- console.error('Failed to get API key usage:', error);
143
+ async list() {
144
+ try {
145
+ const { data, error } = await this.client.GET('/v1/api-keys');
146
+ if (error)
190
147
  throw error;
191
- }
192
- });
148
+ return data || [];
149
+ }
150
+ catch (error) {
151
+ (0, error_handler_1.handleError)('Failed to list API keys', error);
152
+ throw error;
153
+ }
154
+ }
155
+ /**
156
+ * Rotate an API key
157
+ * Command: berget api-keys rotate
158
+ */
159
+ async rotate(id) {
160
+ try {
161
+ const { data, error } = await this.client.PUT('/v1/api-keys/{id}/rotate', {
162
+ params: { path: { id } },
163
+ });
164
+ if (error)
165
+ throw new Error(JSON.stringify(error));
166
+ return data;
167
+ }
168
+ catch (error) {
169
+ console.error('Failed to rotate API key:', error);
170
+ throw error;
171
+ }
193
172
  }
194
173
  }
195
174
  exports.ApiKeyService = ApiKeyService;
196
- // Command group name for this service
197
- ApiKeyService.COMMAND_GROUP = command_structure_1.COMMAND_GROUPS.API_KEYS;
198
- // Subcommands for this service
199
- ApiKeyService.COMMANDS = command_structure_1.SUBCOMMANDS.API_KEYS;