berget 1.4.0 → 2.0.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 (66) hide show
  1. package/.env.example +5 -0
  2. package/AGENTS.md +184 -0
  3. package/TODO.md +2 -0
  4. package/blog-post.md +176 -0
  5. package/dist/index.js +11 -8
  6. package/dist/package.json +7 -2
  7. package/dist/src/commands/api-keys.js +4 -2
  8. package/dist/src/commands/chat.js +21 -11
  9. package/dist/src/commands/code.js +1424 -0
  10. package/dist/src/commands/index.js +2 -0
  11. package/dist/src/constants/command-structure.js +12 -0
  12. package/dist/src/schemas/opencode-schema.json +1121 -0
  13. package/dist/src/services/cluster-service.js +1 -1
  14. package/dist/src/utils/default-api-key.js +2 -2
  15. package/dist/src/utils/env-manager.js +86 -0
  16. package/dist/src/utils/error-handler.js +10 -3
  17. package/dist/src/utils/markdown-renderer.js +4 -4
  18. package/dist/src/utils/opencode-validator.js +122 -0
  19. package/dist/src/utils/token-manager.js +2 -2
  20. package/dist/tests/commands/chat.test.js +20 -18
  21. package/dist/tests/commands/code.test.js +414 -0
  22. package/dist/tests/utils/env-manager.test.js +148 -0
  23. package/dist/tests/utils/opencode-validator.test.js +103 -0
  24. package/index.ts +67 -32
  25. package/opencode.json +182 -0
  26. package/package.json +7 -2
  27. package/src/client.ts +20 -20
  28. package/src/commands/api-keys.ts +93 -60
  29. package/src/commands/auth.ts +4 -2
  30. package/src/commands/billing.ts +6 -3
  31. package/src/commands/chat.ts +149 -107
  32. package/src/commands/clusters.ts +2 -2
  33. package/src/commands/code.ts +1696 -0
  34. package/src/commands/index.ts +2 -0
  35. package/src/commands/models.ts +3 -3
  36. package/src/commands/users.ts +2 -2
  37. package/src/constants/command-structure.ts +112 -58
  38. package/src/schemas/opencode-schema.json +991 -0
  39. package/src/services/api-key-service.ts +1 -1
  40. package/src/services/auth-service.ts +27 -25
  41. package/src/services/chat-service.ts +26 -23
  42. package/src/services/cluster-service.ts +5 -5
  43. package/src/services/collaborator-service.ts +3 -3
  44. package/src/services/flux-service.ts +2 -2
  45. package/src/services/helm-service.ts +2 -2
  46. package/src/services/kubectl-service.ts +3 -6
  47. package/src/types/api.d.ts +1032 -1010
  48. package/src/types/json.d.ts +3 -3
  49. package/src/utils/default-api-key.ts +54 -42
  50. package/src/utils/env-manager.ts +98 -0
  51. package/src/utils/error-handler.ts +24 -15
  52. package/src/utils/logger.ts +12 -12
  53. package/src/utils/markdown-renderer.ts +18 -18
  54. package/src/utils/opencode-validator.ts +134 -0
  55. package/src/utils/token-manager.ts +35 -23
  56. package/tests/commands/chat.test.ts +43 -31
  57. package/tests/commands/code.test.ts +505 -0
  58. package/tests/utils/env-manager.test.ts +199 -0
  59. package/tests/utils/opencode-validator.test.ts +118 -0
  60. package/tsconfig.json +8 -8
  61. package/-27b-it +0 -0
  62. package/examples/README.md +0 -95
  63. package/examples/ai-review.sh +0 -30
  64. package/examples/install-global-security-hook.sh +0 -170
  65. package/examples/security-check.sh +0 -102
  66. package/examples/smart-commit.sh +0 -26
@@ -7,6 +7,7 @@ import { registerModelCommands } from './models'
7
7
  import { registerUserCommands } from './users'
8
8
  import { registerChatCommands } from './chat'
9
9
  import { registerAutocompleteCommands } from './autocomplete'
10
+ import { registerCodeCommands } from './code'
10
11
 
11
12
  /**
12
13
  * Register all command groups with the program
@@ -20,4 +21,5 @@ export function registerCommands(program: Command): void {
20
21
  registerUserCommands(program)
21
22
  registerChatCommands(program)
22
23
  registerAutocompleteCommands(program)
24
+ registerCodeCommands(program)
23
25
  }
@@ -36,7 +36,7 @@ export function registerModelCommands(program: Command): void {
36
36
 
37
37
  console.log('Available Models:')
38
38
  console.log(
39
- 'ID OWNED BY CAPABILITIES'
39
+ 'ID OWNED BY CAPABILITIES',
40
40
  )
41
41
  // Ensure response has the expected structure
42
42
  const modelData = response as { data?: any[] }
@@ -50,8 +50,8 @@ export function registerModelCommands(program: Command): void {
50
50
 
51
51
  console.log(
52
52
  `${model.root.padEnd(50)} ${model.owned_by.padEnd(
53
- 24
54
- )} ${capabilities.join(', ')}`
53
+ 24,
54
+ )} ${capabilities.join(', ')}`,
55
55
  )
56
56
  })
57
57
  }
@@ -23,11 +23,11 @@ export function registerUserCommands(program: Command): void {
23
23
 
24
24
  console.log('Team Members:')
25
25
  console.log(
26
- 'NAME EMAIL ROLE'
26
+ 'NAME EMAIL ROLE',
27
27
  )
28
28
  data.forEach((user: any) => {
29
29
  console.log(
30
- `${user.name.padEnd(24)} ${user.email.padEnd(30)} ${user.role}`
30
+ `${user.name.padEnd(24)} ${user.email.padEnd(30)} ${user.role}`,
31
31
  )
32
32
  })
33
33
  } catch (error) {
@@ -16,6 +16,7 @@ export const COMMAND_GROUPS = {
16
16
  USERS: 'users',
17
17
  BILLING: 'billing',
18
18
  CHAT: 'chat',
19
+ CODE: 'code',
19
20
  }
20
21
 
21
22
  // Subcommands for each group
@@ -26,13 +27,20 @@ export const SUBCOMMANDS = {
26
27
  LOGOUT: 'logout',
27
28
  WHOAMI: 'whoami',
28
29
  },
29
-
30
+
30
31
  // Chat commands
31
32
  CHAT: {
32
33
  RUN: 'run',
33
34
  LIST: 'list',
34
35
  },
35
-
36
+
37
+ // Code commands
38
+ CODE: {
39
+ INIT: 'init',
40
+ RUN: 'run',
41
+ UPDATE: 'update',
42
+ },
43
+
36
44
  // API Keys commands
37
45
  API_KEYS: {
38
46
  LIST: 'list',
@@ -43,14 +51,14 @@ export const SUBCOMMANDS = {
43
51
  SET_DEFAULT: 'set-default',
44
52
  GET_DEFAULT: 'get-default',
45
53
  },
46
-
54
+
47
55
  // Clusters commands
48
56
  CLUSTERS: {
49
57
  LIST: 'list',
50
58
  DESCRIBE: 'describe',
51
59
  GET_USAGE: 'get-usage',
52
60
  },
53
-
61
+
54
62
  // Apps commands
55
63
  APPS: {
56
64
  LIST_TEMPLATES: 'list-templates',
@@ -60,32 +68,32 @@ export const SUBCOMMANDS = {
60
68
  UNINSTALL: 'uninstall',
61
69
  DESCRIBE_INSTALLATION: 'describe-installation',
62
70
  },
63
-
71
+
64
72
  // Models commands
65
73
  MODELS: {
66
74
  LIST: 'list',
67
75
  DESCRIBE: 'describe',
68
76
  },
69
-
77
+
70
78
  // Helm commands
71
79
  HELM: {
72
80
  ADD_REPO: 'add-repo',
73
81
  INSTALL: 'install',
74
82
  },
75
-
83
+
76
84
  // Kubectl commands
77
85
  KUBECTL: {
78
86
  CREATE_NAMESPACE: 'create-namespace',
79
87
  APPLY: 'apply',
80
88
  GET: 'get',
81
89
  },
82
-
90
+
83
91
  // Flux commands
84
92
  FLUX: {
85
93
  INSTALL: 'install',
86
94
  BOOTSTRAP: 'bootstrap',
87
95
  },
88
-
96
+
89
97
  // Users commands
90
98
  USERS: {
91
99
  LIST: 'list',
@@ -93,7 +101,7 @@ export const SUBCOMMANDS = {
93
101
  UPDATE: 'update',
94
102
  INVITE: 'invite',
95
103
  },
96
-
104
+
97
105
  // Billing commands
98
106
  BILLING: {
99
107
  GET_USAGE: 'get-usage',
@@ -111,74 +119,120 @@ export const COMMAND_DESCRIPTIONS = {
111
119
  // Auth group
112
120
  [COMMAND_GROUPS.AUTH]: 'Manage authentication and authorization',
113
121
  [`${COMMAND_GROUPS.AUTH} ${SUBCOMMANDS.AUTH.LOGIN}`]: 'Log in to Berget AI',
114
- [`${COMMAND_GROUPS.AUTH} ${SUBCOMMANDS.AUTH.LOGOUT}`]: 'Log out from Berget AI',
115
- [`${COMMAND_GROUPS.AUTH} ${SUBCOMMANDS.AUTH.WHOAMI}`]: 'Display current user information',
116
-
122
+ [`${COMMAND_GROUPS.AUTH} ${SUBCOMMANDS.AUTH.LOGOUT}`]:
123
+ 'Log out from Berget AI',
124
+ [`${COMMAND_GROUPS.AUTH} ${SUBCOMMANDS.AUTH.WHOAMI}`]:
125
+ 'Display current user information',
126
+
117
127
  // API Keys group
118
128
  [COMMAND_GROUPS.API_KEYS]: 'Manage API keys',
119
- [`${COMMAND_GROUPS.API_KEYS} ${SUBCOMMANDS.API_KEYS.LIST}`]: 'List all API keys',
120
- [`${COMMAND_GROUPS.API_KEYS} ${SUBCOMMANDS.API_KEYS.CREATE}`]: 'Create a new API key',
121
- [`${COMMAND_GROUPS.API_KEYS} ${SUBCOMMANDS.API_KEYS.DELETE}`]: 'Delete an API key',
122
- [`${COMMAND_GROUPS.API_KEYS} ${SUBCOMMANDS.API_KEYS.ROTATE}`]: 'Rotate an API key',
123
- [`${COMMAND_GROUPS.API_KEYS} ${SUBCOMMANDS.API_KEYS.DESCRIBE}`]: 'Get usage statistics for an API key',
124
- [`${COMMAND_GROUPS.API_KEYS} ${SUBCOMMANDS.API_KEYS.SET_DEFAULT}`]: 'Set an API key as the default for chat commands',
125
- [`${COMMAND_GROUPS.API_KEYS} ${SUBCOMMANDS.API_KEYS.GET_DEFAULT}`]: 'Show the current default API key',
126
-
129
+ [`${COMMAND_GROUPS.API_KEYS} ${SUBCOMMANDS.API_KEYS.LIST}`]:
130
+ 'List all API keys',
131
+ [`${COMMAND_GROUPS.API_KEYS} ${SUBCOMMANDS.API_KEYS.CREATE}`]:
132
+ 'Create a new API key',
133
+ [`${COMMAND_GROUPS.API_KEYS} ${SUBCOMMANDS.API_KEYS.DELETE}`]:
134
+ 'Delete an API key',
135
+ [`${COMMAND_GROUPS.API_KEYS} ${SUBCOMMANDS.API_KEYS.ROTATE}`]:
136
+ 'Rotate an API key',
137
+ [`${COMMAND_GROUPS.API_KEYS} ${SUBCOMMANDS.API_KEYS.DESCRIBE}`]:
138
+ 'Get usage statistics for an API key',
139
+ [`${COMMAND_GROUPS.API_KEYS} ${SUBCOMMANDS.API_KEYS.SET_DEFAULT}`]:
140
+ 'Set an API key as the default for chat commands',
141
+ [`${COMMAND_GROUPS.API_KEYS} ${SUBCOMMANDS.API_KEYS.GET_DEFAULT}`]:
142
+ 'Show the current default API key',
143
+
127
144
  // Clusters group
128
145
  [COMMAND_GROUPS.CLUSTERS]: 'Manage Kubernetes clusters',
129
- [`${COMMAND_GROUPS.CLUSTERS} ${SUBCOMMANDS.CLUSTERS.LIST}`]: 'List all clusters',
130
- [`${COMMAND_GROUPS.CLUSTERS} ${SUBCOMMANDS.CLUSTERS.DESCRIBE}`]: 'Get detailed information about a cluster',
131
- [`${COMMAND_GROUPS.CLUSTERS} ${SUBCOMMANDS.CLUSTERS.GET_USAGE}`]: 'Get resource usage for a cluster',
132
-
146
+ [`${COMMAND_GROUPS.CLUSTERS} ${SUBCOMMANDS.CLUSTERS.LIST}`]:
147
+ 'List all clusters',
148
+ [`${COMMAND_GROUPS.CLUSTERS} ${SUBCOMMANDS.CLUSTERS.DESCRIBE}`]:
149
+ 'Get detailed information about a cluster',
150
+ [`${COMMAND_GROUPS.CLUSTERS} ${SUBCOMMANDS.CLUSTERS.GET_USAGE}`]:
151
+ 'Get resource usage for a cluster',
152
+
133
153
  // Apps group
134
154
  [COMMAND_GROUPS.APPS]: 'Manage applications',
135
- [`${COMMAND_GROUPS.APPS} ${SUBCOMMANDS.APPS.LIST_TEMPLATES}`]: 'List available application templates',
136
- [`${COMMAND_GROUPS.APPS} ${SUBCOMMANDS.APPS.DESCRIBE_TEMPLATE}`]: 'Get detailed information about an application template',
137
- [`${COMMAND_GROUPS.APPS} ${SUBCOMMANDS.APPS.LIST_INSTALLATIONS}`]: 'List installed applications',
138
- [`${COMMAND_GROUPS.APPS} ${SUBCOMMANDS.APPS.INSTALL}`]: 'Install an application',
139
- [`${COMMAND_GROUPS.APPS} ${SUBCOMMANDS.APPS.UNINSTALL}`]: 'Uninstall an application',
140
- [`${COMMAND_GROUPS.APPS} ${SUBCOMMANDS.APPS.DESCRIBE_INSTALLATION}`]: 'Get detailed information about an installed application',
141
-
155
+ [`${COMMAND_GROUPS.APPS} ${SUBCOMMANDS.APPS.LIST_TEMPLATES}`]:
156
+ 'List available application templates',
157
+ [`${COMMAND_GROUPS.APPS} ${SUBCOMMANDS.APPS.DESCRIBE_TEMPLATE}`]:
158
+ 'Get detailed information about an application template',
159
+ [`${COMMAND_GROUPS.APPS} ${SUBCOMMANDS.APPS.LIST_INSTALLATIONS}`]:
160
+ 'List installed applications',
161
+ [`${COMMAND_GROUPS.APPS} ${SUBCOMMANDS.APPS.INSTALL}`]:
162
+ 'Install an application',
163
+ [`${COMMAND_GROUPS.APPS} ${SUBCOMMANDS.APPS.UNINSTALL}`]:
164
+ 'Uninstall an application',
165
+ [`${COMMAND_GROUPS.APPS} ${SUBCOMMANDS.APPS.DESCRIBE_INSTALLATION}`]:
166
+ 'Get detailed information about an installed application',
167
+
142
168
  // Models group
143
169
  [COMMAND_GROUPS.MODELS]: 'Manage AI models',
144
- [`${COMMAND_GROUPS.MODELS} ${SUBCOMMANDS.MODELS.LIST}`]: 'List available AI models',
145
- [`${COMMAND_GROUPS.MODELS} ${SUBCOMMANDS.MODELS.DESCRIBE}`]: 'Get detailed information about an AI model',
146
-
170
+ [`${COMMAND_GROUPS.MODELS} ${SUBCOMMANDS.MODELS.LIST}`]:
171
+ 'List available AI models',
172
+ [`${COMMAND_GROUPS.MODELS} ${SUBCOMMANDS.MODELS.DESCRIBE}`]:
173
+ 'Get detailed information about an AI model',
174
+
147
175
  // Helm group
148
176
  [COMMAND_GROUPS.HELM]: 'Manage Helm charts',
149
- [`${COMMAND_GROUPS.HELM} ${SUBCOMMANDS.HELM.ADD_REPO}`]: 'Add a Helm repository',
150
- [`${COMMAND_GROUPS.HELM} ${SUBCOMMANDS.HELM.INSTALL}`]: 'Install a Helm chart',
151
-
177
+ [`${COMMAND_GROUPS.HELM} ${SUBCOMMANDS.HELM.ADD_REPO}`]:
178
+ 'Add a Helm repository',
179
+ [`${COMMAND_GROUPS.HELM} ${SUBCOMMANDS.HELM.INSTALL}`]:
180
+ 'Install a Helm chart',
181
+
152
182
  // Kubectl group
153
183
  [COMMAND_GROUPS.KUBECTL]: 'Manage Kubernetes resources',
154
- [`${COMMAND_GROUPS.KUBECTL} ${SUBCOMMANDS.KUBECTL.CREATE_NAMESPACE}`]: 'Create a Kubernetes namespace',
155
- [`${COMMAND_GROUPS.KUBECTL} ${SUBCOMMANDS.KUBECTL.APPLY}`]: 'Apply a Kubernetes configuration',
156
- [`${COMMAND_GROUPS.KUBECTL} ${SUBCOMMANDS.KUBECTL.GET}`]: 'Get Kubernetes resources',
157
-
184
+ [`${COMMAND_GROUPS.KUBECTL} ${SUBCOMMANDS.KUBECTL.CREATE_NAMESPACE}`]:
185
+ 'Create a Kubernetes namespace',
186
+ [`${COMMAND_GROUPS.KUBECTL} ${SUBCOMMANDS.KUBECTL.APPLY}`]:
187
+ 'Apply a Kubernetes configuration',
188
+ [`${COMMAND_GROUPS.KUBECTL} ${SUBCOMMANDS.KUBECTL.GET}`]:
189
+ 'Get Kubernetes resources',
190
+
158
191
  // Flux group
159
192
  [COMMAND_GROUPS.FLUX]: 'Manage Flux CD',
160
193
  [`${COMMAND_GROUPS.FLUX} ${SUBCOMMANDS.FLUX.INSTALL}`]: 'Install Flux CD',
161
194
  [`${COMMAND_GROUPS.FLUX} ${SUBCOMMANDS.FLUX.BOOTSTRAP}`]: 'Bootstrap Flux CD',
162
-
195
+
163
196
  // Users group
164
197
  [COMMAND_GROUPS.USERS]: 'Manage users',
165
- [`${COMMAND_GROUPS.USERS} ${SUBCOMMANDS.USERS.LIST}`]: 'List all users in your organization',
166
- [`${COMMAND_GROUPS.USERS} ${SUBCOMMANDS.USERS.DESCRIBE}`]: 'Get detailed information about a user',
167
- [`${COMMAND_GROUPS.USERS} ${SUBCOMMANDS.USERS.UPDATE}`]: 'Update user information',
168
- [`${COMMAND_GROUPS.USERS} ${SUBCOMMANDS.USERS.INVITE}`]: 'Invite a new user to your organization',
169
-
198
+ [`${COMMAND_GROUPS.USERS} ${SUBCOMMANDS.USERS.LIST}`]:
199
+ 'List all users in your organization',
200
+ [`${COMMAND_GROUPS.USERS} ${SUBCOMMANDS.USERS.DESCRIBE}`]:
201
+ 'Get detailed information about a user',
202
+ [`${COMMAND_GROUPS.USERS} ${SUBCOMMANDS.USERS.UPDATE}`]:
203
+ 'Update user information',
204
+ [`${COMMAND_GROUPS.USERS} ${SUBCOMMANDS.USERS.INVITE}`]:
205
+ 'Invite a new user to your organization',
206
+
170
207
  // Billing group
171
208
  [COMMAND_GROUPS.BILLING]: 'Manage billing and usage',
172
- [`${COMMAND_GROUPS.BILLING} ${SUBCOMMANDS.BILLING.GET_USAGE}`]: 'Get current usage metrics',
173
- [`${COMMAND_GROUPS.BILLING} ${SUBCOMMANDS.BILLING.LIST_INVOICES}`]: 'List all invoices',
174
- [`${COMMAND_GROUPS.BILLING} ${SUBCOMMANDS.BILLING.DESCRIBE_INVOICE}`]: 'Get detailed information about an invoice',
175
- [`${COMMAND_GROUPS.BILLING} ${SUBCOMMANDS.BILLING.LIST_PAYMENT_METHODS}`]: 'List all payment methods',
176
- [`${COMMAND_GROUPS.BILLING} ${SUBCOMMANDS.BILLING.ADD_PAYMENT_METHOD}`]: 'Add a new payment method',
177
- [`${COMMAND_GROUPS.BILLING} ${SUBCOMMANDS.BILLING.REMOVE_PAYMENT_METHOD}`]: 'Remove a payment method',
178
- [`${COMMAND_GROUPS.BILLING} ${SUBCOMMANDS.BILLING.UPDATE_SUBSCRIPTION}`]: 'Update subscription plan',
179
-
209
+ [`${COMMAND_GROUPS.BILLING} ${SUBCOMMANDS.BILLING.GET_USAGE}`]:
210
+ 'Get current usage metrics',
211
+ [`${COMMAND_GROUPS.BILLING} ${SUBCOMMANDS.BILLING.LIST_INVOICES}`]:
212
+ 'List all invoices',
213
+ [`${COMMAND_GROUPS.BILLING} ${SUBCOMMANDS.BILLING.DESCRIBE_INVOICE}`]:
214
+ 'Get detailed information about an invoice',
215
+ [`${COMMAND_GROUPS.BILLING} ${SUBCOMMANDS.BILLING.LIST_PAYMENT_METHODS}`]:
216
+ 'List all payment methods',
217
+ [`${COMMAND_GROUPS.BILLING} ${SUBCOMMANDS.BILLING.ADD_PAYMENT_METHOD}`]:
218
+ 'Add a new payment method',
219
+ [`${COMMAND_GROUPS.BILLING} ${SUBCOMMANDS.BILLING.REMOVE_PAYMENT_METHOD}`]:
220
+ 'Remove a payment method',
221
+ [`${COMMAND_GROUPS.BILLING} ${SUBCOMMANDS.BILLING.UPDATE_SUBSCRIPTION}`]:
222
+ 'Update subscription plan',
223
+
180
224
  // Chat group
181
225
  [COMMAND_GROUPS.CHAT]: 'Interact with AI chat models',
182
- [`${COMMAND_GROUPS.CHAT} ${SUBCOMMANDS.CHAT.RUN}`]: 'Run a chat session with a specified model',
183
- [`${COMMAND_GROUPS.CHAT} ${SUBCOMMANDS.CHAT.LIST}`]: 'List available chat models',
226
+ [`${COMMAND_GROUPS.CHAT} ${SUBCOMMANDS.CHAT.RUN}`]:
227
+ 'Run a chat session with a specified model',
228
+ [`${COMMAND_GROUPS.CHAT} ${SUBCOMMANDS.CHAT.LIST}`]:
229
+ 'List available chat models',
230
+
231
+ // Code group
232
+ [COMMAND_GROUPS.CODE]: 'AI-powered coding assistant with OpenCode',
233
+ [`${COMMAND_GROUPS.CODE} ${SUBCOMMANDS.CODE.INIT}`]:
234
+ 'Initialize project for AI coding assistant',
235
+ [`${COMMAND_GROUPS.CODE} ${SUBCOMMANDS.CODE.RUN}`]: 'Run AI coding assistant',
236
+ [`${COMMAND_GROUPS.CODE} ${SUBCOMMANDS.CODE.UPDATE}`]:
237
+ 'Update OpenCode and agents to latest versions',
184
238
  }