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,15 +1,6 @@
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
- exports.FakePrompter = exports.confirm = exports.select = exports.CANCEL = void 0;
3
+ exports.FakePrompter = exports.multiselect = exports.confirm = exports.text = exports.select = exports.CANCEL = void 0;
13
4
  const errors_1 = require("../errors");
14
5
  exports.CANCEL = Symbol('cancel');
15
6
  const select = (value, match) => ({
@@ -18,74 +9,109 @@ const select = (value, match) => ({
18
9
  response: typeof value === 'symbol' ? value : String(value),
19
10
  });
20
11
  exports.select = select;
12
+ const text = (value, match) => ({
13
+ kind: 'text',
14
+ match: typeof match === 'string' ? new RegExp(match) : match,
15
+ response: value,
16
+ });
17
+ exports.text = text;
21
18
  const confirm = (value, match) => ({
22
19
  kind: 'confirm',
23
20
  match: typeof match === 'string' ? new RegExp(match) : match,
24
21
  response: value,
25
22
  });
26
23
  exports.confirm = confirm;
24
+ const multiselect = (values, match) => ({
25
+ kind: 'multiselect',
26
+ match: typeof match === 'string' ? new RegExp(match) : match,
27
+ response: values === exports.CANCEL ? [exports.CANCEL] : values.map(String),
28
+ });
29
+ exports.multiselect = multiselect;
27
30
  class FakePrompter {
31
+ _script;
32
+ get calls() {
33
+ return this._calls;
34
+ }
35
+ _calls = [];
36
+ _cursor = 0;
28
37
  constructor(_script) {
29
38
  this._script = _script;
30
- this._calls = [];
31
- this._cursor = 0;
39
+ }
40
+ assertExhausted() {
41
+ if (this._cursor !== this._script.length) {
42
+ throw new Error(`Script not exhausted: ${this._script.length - this._cursor} entries left`);
43
+ }
44
+ }
45
+ async confirm(options) {
46
+ this._calls.push({ args: options, method: 'confirm' });
47
+ const entry = this._script[this._cursor++];
48
+ if (!entry)
49
+ throw new Error(`No script entry for confirm #${this._cursor} (${options.message})`);
50
+ if (entry.kind !== 'confirm')
51
+ throw new Error(`Expected confirm, got ${entry.kind} for ${options.message}`);
52
+ if (entry.match && !entry.match.test(options.message))
53
+ throw new Error(`Message mismatch: got "${options.message}"`);
54
+ if (entry.response === exports.CANCEL)
55
+ throw new errors_1.CancelledError();
56
+ return entry.response;
32
57
  }
33
58
  intro(message) {
34
- this._calls.push({ method: 'intro', args: { message } });
59
+ this._calls.push({ args: { message }, method: 'intro' });
35
60
  }
36
- outro(message) {
37
- this._calls.push({ method: 'outro', args: { message } });
61
+ async multiselect(options) {
62
+ this._calls.push({ args: options, method: 'multiselect' });
63
+ const entry = this._script[this._cursor++];
64
+ if (!entry)
65
+ throw new Error(`No script entry for multiselect #${this._cursor} (${options.message})`);
66
+ if (entry.kind !== 'multiselect')
67
+ throw new Error(`Expected multiselect, got ${entry.kind} for ${options.message}`);
68
+ if (entry.match && !entry.match.test(options.message))
69
+ throw new Error(`Message mismatch: got "${options.message}"`);
70
+ if (entry.response.includes(exports.CANCEL))
71
+ throw new errors_1.CancelledError();
72
+ return entry.response;
38
73
  }
39
74
  note(message, title) {
40
- this._calls.push({ method: 'note', args: { message, title } });
75
+ this._calls.push({ args: { message, title }, method: 'note' });
76
+ }
77
+ outro(message) {
78
+ this._calls.push({ args: { message }, method: 'outro' });
79
+ }
80
+ async select(options) {
81
+ this._calls.push({ args: options, method: 'select' });
82
+ const entry = this._script[this._cursor++];
83
+ if (!entry)
84
+ throw new Error(`No script entry for select #${this._cursor} (${options.message})`);
85
+ if (entry.kind !== 'select')
86
+ throw new Error(`Expected select, got ${entry.kind} for ${options.message}`);
87
+ if (entry.match && !entry.match.test(options.message))
88
+ throw new Error(`Message mismatch: got "${options.message}"`);
89
+ if (entry.response === exports.CANCEL)
90
+ throw new errors_1.CancelledError();
91
+ return entry.response;
41
92
  }
42
93
  spinner() {
43
94
  return {
44
- start: (msg) => {
45
- this._calls.push({ method: 'spinner.start', args: { message: msg } });
95
+ start: (message) => {
96
+ this._calls.push({ args: { message: message }, method: 'spinner.start' });
46
97
  },
47
- stop: (msg) => {
48
- this._calls.push({ method: 'spinner.stop', args: { message: msg } });
98
+ stop: (message) => {
99
+ this._calls.push({ args: { message: message }, method: 'spinner.stop' });
49
100
  },
50
101
  };
51
102
  }
52
- select(opts) {
53
- return __awaiter(this, void 0, void 0, function* () {
54
- this._calls.push({ method: 'select', args: opts });
55
- const entry = this._script[this._cursor++];
56
- if (!entry)
57
- throw new Error(`No script entry for select #${this._cursor} (${opts.message})`);
58
- if (entry.kind !== 'select')
59
- throw new Error(`Expected confirm, got select for ${opts.message}`);
60
- if (entry.match && !entry.match.test(opts.message))
61
- throw new Error(`Message mismatch: got "${opts.message}"`);
62
- if (entry.response === exports.CANCEL)
63
- throw new errors_1.CancelledError();
64
- return entry.response;
65
- });
66
- }
67
- confirm(opts) {
68
- return __awaiter(this, void 0, void 0, function* () {
69
- this._calls.push({ method: 'confirm', args: opts });
70
- const entry = this._script[this._cursor++];
71
- if (!entry)
72
- throw new Error(`No script entry for confirm #${this._cursor} (${opts.message})`);
73
- if (entry.kind !== 'confirm')
74
- throw new Error(`Expected select, got confirm for ${opts.message}`);
75
- if (entry.match && !entry.match.test(opts.message))
76
- throw new Error(`Message mismatch: got "${opts.message}"`);
77
- if (entry.response === exports.CANCEL)
78
- throw new errors_1.CancelledError();
79
- return entry.response;
80
- });
81
- }
82
- get calls() {
83
- return this._calls;
84
- }
85
- assertExhausted() {
86
- if (this._cursor !== this._script.length) {
87
- throw new Error(`Script not exhausted: ${this._script.length - this._cursor} entries left`);
88
- }
103
+ async text(options) {
104
+ this._calls.push({ args: options, method: 'text' });
105
+ const entry = this._script[this._cursor++];
106
+ if (!entry)
107
+ throw new Error(`No script entry for text #${this._cursor} (${options.message})`);
108
+ if (entry.kind !== 'text')
109
+ throw new Error(`Expected text, got ${entry.kind} for ${options.message}`);
110
+ if (entry.match && !entry.match.test(options.message))
111
+ throw new Error(`Message mismatch: got "${options.message}"`);
112
+ if (entry.response === exports.CANCEL)
113
+ throw new errors_1.CancelledError();
114
+ return entry.response;
89
115
  }
90
116
  }
91
117
  exports.FakePrompter = FakePrompter;