@open-agent-toolkit/cli 0.2.40 → 0.2.45

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 (213) hide show
  1. package/assets/agents/oat-codebase-mapper.md +15 -3
  2. package/assets/agents/oat-phase-implementer.md +34 -9
  3. package/assets/agents/oat-reviewer.md +2 -2
  4. package/assets/bundle-metadata.json +1 -1
  5. package/assets/docs/cli-utilities/configuration.md +11 -1
  6. package/assets/docs/cli-utilities/tool-packs.md +8 -0
  7. package/assets/docs/contributing/skills.md +67 -14
  8. package/assets/docs/quickstart.md +9 -0
  9. package/assets/docs/reference/cli-reference.md +56 -1
  10. package/assets/docs/reference/file-locations.md +18 -1
  11. package/assets/docs/reference/oat-directory-structure.md +20 -4
  12. package/assets/docs/workflows/projects/artifacts.md +27 -1
  13. package/assets/docs/workflows/projects/implementation-execution.md +22 -0
  14. package/assets/docs/workflows/projects/index.md +6 -0
  15. package/assets/docs/workflows/projects/lifecycle.md +19 -5
  16. package/assets/docs/workflows/projects/picking-up-projects.md +75 -0
  17. package/assets/docs/workflows/projects/pr-flow.md +22 -1
  18. package/assets/docs/workflows/projects/reviewing-oat-prs.md +60 -0
  19. package/assets/public-package-versions.json +4 -4
  20. package/assets/skills/analyze/SKILL.md +13 -5
  21. package/assets/skills/compare/SKILL.md +11 -2
  22. package/assets/skills/oat-brainstorm/SKILL.md +135 -32
  23. package/assets/skills/oat-brainstorm/references/destinations.md +9 -6
  24. package/assets/skills/oat-cursor-cloud-projects/SKILL.md +11 -1
  25. package/assets/skills/oat-dispatch-subagents/SKILL.md +19 -6
  26. package/assets/skills/oat-doctor/SKILL.md +8 -1
  27. package/assets/skills/oat-project-autonomous/SKILL.md +45 -1
  28. package/assets/skills/oat-project-autonomous/references/gate-inventory.md +8 -8
  29. package/assets/skills/oat-project-capture/SKILL.md +29 -9
  30. package/assets/skills/oat-project-complete/SKILL.md +610 -38
  31. package/assets/skills/oat-project-complete/scripts/parse-completion-retry-fields.mjs +265 -0
  32. package/assets/skills/oat-project-complete/scripts/recover-completion-receipts.mjs +764 -0
  33. package/assets/skills/oat-project-complete/scripts/resolve-completion-retry.mjs +134 -0
  34. package/assets/skills/oat-project-complete/scripts/validate-nonarchive-lifecycle-receipt.mjs +160 -0
  35. package/assets/skills/oat-project-design/SKILL.md +33 -9
  36. package/assets/skills/oat-project-discover/SKILL.md +16 -3
  37. package/assets/skills/oat-project-document/SKILL.md +10 -4
  38. package/assets/skills/oat-project-document/references/docs/autonomy-contract.md +8 -8
  39. package/assets/skills/oat-project-implement/SKILL.md +14 -3
  40. package/assets/skills/oat-project-implement/references/completion-and-closeout.md +18 -6
  41. package/assets/skills/oat-project-implement/references/docs/autonomy-contract.md +8 -8
  42. package/assets/skills/oat-project-implement/references/phase-execution.md +9 -3
  43. package/assets/skills/oat-project-implement/references/plan-and-resume.md +3 -0
  44. package/assets/skills/oat-project-import-plan/SKILL.md +15 -9
  45. package/assets/skills/oat-project-new/SKILL.md +7 -5
  46. package/assets/skills/oat-project-next/SKILL.md +32 -10
  47. package/assets/skills/oat-project-plan/SKILL.md +18 -3
  48. package/assets/skills/oat-project-pr-final/SKILL.md +23 -2
  49. package/assets/skills/oat-project-pr-final/references/docs/autonomy-contract.md +8 -8
  50. package/assets/skills/oat-project-pr-progress/SKILL.md +23 -2
  51. package/assets/skills/oat-project-progress/SKILL.md +23 -9
  52. package/assets/skills/oat-project-promote-spec-driven/SKILL.md +20 -2
  53. package/assets/skills/oat-project-quick-start/SKILL.md +48 -18
  54. package/assets/skills/oat-project-quick-start/references/docs/autonomy-contract.md +8 -8
  55. package/assets/skills/oat-project-reconcile/SKILL.md +14 -10
  56. package/assets/skills/oat-project-retro/SKILL.md +3 -3
  57. package/assets/skills/oat-project-retro/references/apply-procedure.md +102 -6
  58. package/assets/skills/oat-project-retro-file/SKILL.md +57 -6
  59. package/assets/skills/oat-project-review-provide/SKILL.md +56 -6
  60. package/assets/skills/oat-project-review-receive/SKILL.md +16 -7
  61. package/assets/skills/oat-project-review-receive-remote/SKILL.md +9 -3
  62. package/assets/skills/oat-project-revise/SKILL.md +12 -3
  63. package/assets/skills/oat-project-spec/SKILL.md +16 -3
  64. package/assets/skills/oat-project-summary/SKILL.md +113 -13
  65. package/assets/skills/oat-repo-improve/SKILL.md +18 -7
  66. package/assets/skills/oat-review-provide-remote/SKILL.md +11 -2
  67. package/assets/skills/oat-wave-execute/SKILL.md +34 -2
  68. package/assets/skills/oat-worktree-bootstrap/SKILL.md +13 -1
  69. package/assets/skills/oat-worktree-bootstrap-auto/SKILL.md +13 -1
  70. package/dist/commands/config/index.d.ts +1 -0
  71. package/dist/commands/config/index.d.ts.map +1 -1
  72. package/dist/commands/config/index.js +30 -2
  73. package/dist/commands/doctor/index.d.ts +2 -0
  74. package/dist/commands/doctor/index.d.ts.map +1 -1
  75. package/dist/commands/doctor/index.js +27 -3
  76. package/dist/commands/doctor/synced-projects.d.ts +12 -0
  77. package/dist/commands/doctor/synced-projects.d.ts.map +1 -0
  78. package/dist/commands/doctor/synced-projects.js +208 -0
  79. package/dist/commands/init/gitattributes.d.ts +4 -0
  80. package/dist/commands/init/gitattributes.d.ts.map +1 -0
  81. package/dist/commands/init/gitattributes.js +12 -0
  82. package/dist/commands/init/gitignore.d.ts +8 -1
  83. package/dist/commands/init/gitignore.d.ts.map +1 -1
  84. package/dist/commands/init/gitignore.js +146 -41
  85. package/dist/commands/init/index.d.ts +2 -0
  86. package/dist/commands/init/index.d.ts.map +1 -1
  87. package/dist/commands/init/index.js +3 -0
  88. package/dist/commands/init/managed-block.d.ts +10 -0
  89. package/dist/commands/init/managed-block.d.ts.map +1 -0
  90. package/dist/commands/init/managed-block.js +40 -0
  91. package/dist/commands/init/tools/workflows/install-workflows.js +1 -1
  92. package/dist/commands/local/index.d.ts.map +1 -1
  93. package/dist/commands/local/index.js +5 -1
  94. package/dist/commands/local/sync.d.ts +4 -0
  95. package/dist/commands/local/sync.d.ts.map +1 -1
  96. package/dist/commands/local/sync.js +123 -2
  97. package/dist/commands/pjm/adoption.d.ts +2 -0
  98. package/dist/commands/pjm/adoption.d.ts.map +1 -1
  99. package/dist/commands/pjm/adoption.js +1 -1
  100. package/dist/commands/project/archive/archive-utils.d.ts +24 -0
  101. package/dist/commands/project/archive/archive-utils.d.ts.map +1 -1
  102. package/dist/commands/project/archive/archive-utils.js +349 -22
  103. package/dist/commands/project/archive/index.d.ts.map +1 -1
  104. package/dist/commands/project/archive/index.js +1 -0
  105. package/dist/commands/project/archive/push-runner.d.ts +5 -1
  106. package/dist/commands/project/archive/push-runner.d.ts.map +1 -1
  107. package/dist/commands/project/archive/push-runner.js +33 -4
  108. package/dist/commands/project/complete-state/index.d.ts.map +1 -1
  109. package/dist/commands/project/complete-state/index.js +3 -1
  110. package/dist/commands/project/index.d.ts.map +1 -1
  111. package/dist/commands/project/index.js +12 -0
  112. package/dist/commands/project/links/compute.d.ts +9 -0
  113. package/dist/commands/project/links/compute.d.ts.map +1 -0
  114. package/dist/commands/project/links/compute.js +27 -0
  115. package/dist/commands/project/links/index.d.ts +17 -0
  116. package/dist/commands/project/links/index.d.ts.map +1 -0
  117. package/dist/commands/project/links/index.js +72 -0
  118. package/dist/commands/project/links/refresh.d.ts +26 -0
  119. package/dist/commands/project/links/refresh.d.ts.map +1 -0
  120. package/dist/commands/project/links/refresh.js +92 -0
  121. package/dist/commands/project/links/render.d.ts +24 -0
  122. package/dist/commands/project/links/render.d.ts.map +1 -0
  123. package/dist/commands/project/links/render.js +68 -0
  124. package/dist/commands/project/list.d.ts +5 -0
  125. package/dist/commands/project/list.d.ts.map +1 -1
  126. package/dist/commands/project/list.js +182 -9
  127. package/dist/commands/project/migrate/index.d.ts +22 -0
  128. package/dist/commands/project/migrate/index.d.ts.map +1 -0
  129. package/dist/commands/project/migrate/index.js +79 -0
  130. package/dist/commands/project/new/index.d.ts +2 -0
  131. package/dist/commands/project/new/index.d.ts.map +1 -1
  132. package/dist/commands/project/new/index.js +14 -2
  133. package/dist/commands/project/new/scaffold.d.ts +22 -1
  134. package/dist/commands/project/new/scaffold.d.ts.map +1 -1
  135. package/dist/commands/project/new/scaffold.js +287 -69
  136. package/dist/commands/project/open/index.d.ts +16 -0
  137. package/dist/commands/project/open/index.d.ts.map +1 -1
  138. package/dist/commands/project/open/index.js +151 -19
  139. package/dist/commands/project/pause/index.d.ts +8 -0
  140. package/dist/commands/project/pause/index.d.ts.map +1 -1
  141. package/dist/commands/project/pause/index.js +129 -19
  142. package/dist/commands/project/prune/index.d.ts +21 -0
  143. package/dist/commands/project/prune/index.d.ts.map +1 -0
  144. package/dist/commands/project/prune/index.js +95 -0
  145. package/dist/commands/project/pull/index.d.ts +28 -0
  146. package/dist/commands/project/pull/index.d.ts.map +1 -0
  147. package/dist/commands/project/pull/index.js +157 -0
  148. package/dist/commands/project/push/index.d.ts +22 -0
  149. package/dist/commands/project/push/index.d.ts.map +1 -0
  150. package/dist/commands/project/push/index.js +100 -0
  151. package/dist/commands/project/scope/index.d.ts +17 -0
  152. package/dist/commands/project/scope/index.d.ts.map +1 -0
  153. package/dist/commands/project/scope/index.js +107 -0
  154. package/dist/commands/project/split/run.d.ts +4 -0
  155. package/dist/commands/project/split/run.d.ts.map +1 -1
  156. package/dist/commands/project/split/run.js +48 -10
  157. package/dist/commands/project/sync/git.d.ts +18 -0
  158. package/dist/commands/project/sync/git.d.ts.map +1 -0
  159. package/dist/commands/project/sync/git.js +60 -0
  160. package/dist/commands/project/sync/record.d.ts +22 -0
  161. package/dist/commands/project/sync/record.d.ts.map +1 -0
  162. package/dist/commands/project/sync/record.js +133 -0
  163. package/dist/commands/project/sync/ref-sync.d.ts +120 -0
  164. package/dist/commands/project/sync/ref-sync.d.ts.map +1 -0
  165. package/dist/commands/project/sync/ref-sync.js +962 -0
  166. package/dist/commands/project/sync/resolve-target.d.ts +27 -0
  167. package/dist/commands/project/sync/resolve-target.d.ts.map +1 -0
  168. package/dist/commands/project/sync/resolve-target.js +159 -0
  169. package/dist/commands/shared/oat-paths.d.ts +4 -1
  170. package/dist/commands/shared/oat-paths.d.ts.map +1 -1
  171. package/dist/commands/shared/oat-paths.js +2 -2
  172. package/dist/commands/shared/project-scope.d.ts +23 -0
  173. package/dist/commands/shared/project-scope.d.ts.map +1 -0
  174. package/dist/commands/shared/project-scope.js +106 -0
  175. package/dist/commands/tools/migrate/index.js +1 -1
  176. package/dist/commands/tools/shared/pack-inventory.d.ts.map +1 -1
  177. package/dist/commands/tools/shared/pack-inventory.js +11 -0
  178. package/dist/commands/tools/shared/pack-lifecycle.js +1 -1
  179. package/dist/commands/tools/shared/pack-reconcile.d.ts.map +1 -1
  180. package/dist/commands/tools/shared/pack-reconcile.js +4 -1
  181. package/dist/commands/tools/update/index.d.ts.map +1 -1
  182. package/dist/commands/tools/update/index.js +20 -10
  183. package/dist/commands/tools/update/update-tools.d.ts +2 -0
  184. package/dist/commands/tools/update/update-tools.d.ts.map +1 -1
  185. package/dist/config/oat-config.d.ts +6 -3
  186. package/dist/config/oat-config.d.ts.map +1 -1
  187. package/dist/config/oat-config.js +41 -7
  188. package/dist/config/resolve.d.ts.map +1 -1
  189. package/dist/config/resolve.js +2 -1
  190. package/dist/fs/io.d.ts +2 -1
  191. package/dist/fs/io.d.ts.map +1 -1
  192. package/dist/fs/io.js +5 -2
  193. package/dist/projects/split/finalize.d.ts.map +1 -1
  194. package/dist/projects/split/finalize.js +55 -2
  195. package/dist/projects/split/resume.d.ts +3 -0
  196. package/dist/projects/split/resume.d.ts.map +1 -1
  197. package/dist/projects/split/resume.js +34 -7
  198. package/dist/projects/split/seed-children.d.ts.map +1 -1
  199. package/dist/projects/split/seed-children.js +6 -0
  200. package/dist/projects/split/write-parent.d.ts +7 -0
  201. package/dist/projects/split/write-parent.d.ts.map +1 -1
  202. package/dist/projects/split/write-parent.js +7 -4
  203. package/dist/release/public-package-contract.d.ts.map +1 -1
  204. package/dist/release/public-package-contract.js +1 -0
  205. package/dist/validation/skills.d.ts.map +1 -1
  206. package/dist/validation/skills.js +434 -0
  207. package/package.json +4 -4
  208. package/dist/__tests__/skills/split-flow-fixtures.d.ts +0 -50
  209. package/dist/__tests__/skills/split-flow-fixtures.d.ts.map +0 -1
  210. package/dist/__tests__/skills/split-flow-fixtures.js +0 -161
  211. package/dist/commands/__tests__/helpers.d.ts +0 -12
  212. package/dist/commands/__tests__/helpers.d.ts.map +0 -1
  213. package/dist/commands/__tests__/helpers.js +0 -36
@@ -0,0 +1,265 @@
1
+ import { pathToFileURL } from 'node:url';
2
+
3
+ const FULL_SHA = /^[0-9a-f]{40}$/;
4
+ const PR_ARTIFACT = /^pr\/project-pr-[^/\s]+\.md$/;
5
+ const RETAINED_REF = /^refs\/oat\/projects\/[^/\s]+$/;
6
+ const SKIPPED_MUTATIONS = [
7
+ 'project-log',
8
+ 'review-move',
9
+ 'complete-state',
10
+ 'active-pointer',
11
+ 'pr-artifact',
12
+ ];
13
+
14
+ function completionRetryFieldsError(message) {
15
+ const error = new Error(message);
16
+ error.code = 'E_COMPLETION_RETRY_FIELDS';
17
+ return error;
18
+ }
19
+
20
+ function requireExactKeys(value, expected) {
21
+ const actual = Object.keys(value).sort();
22
+ const sortedExpected = [...expected].sort();
23
+ if (
24
+ actual.length !== sortedExpected.length ||
25
+ actual.some((key, index) => key !== sortedExpected[index])
26
+ ) {
27
+ throw completionRetryFieldsError(
28
+ `Completion retry result fields ${JSON.stringify(actual)} do not match ${JSON.stringify(sortedExpected)}.`,
29
+ );
30
+ }
31
+ }
32
+
33
+ function requireSkippedMutations(value) {
34
+ if (
35
+ !Array.isArray(value) ||
36
+ value.length !== SKIPPED_MUTATIONS.length ||
37
+ value.some((mutation, index) => mutation !== SKIPPED_MUTATIONS[index])
38
+ ) {
39
+ throw completionRetryFieldsError(
40
+ 'Recovered completion retry result has invalid skipped mutations.',
41
+ );
42
+ }
43
+ }
44
+
45
+ export function parseCompletionRetryFields(input) {
46
+ let value;
47
+ try {
48
+ value = JSON.parse(input);
49
+ } catch (error) {
50
+ throw completionRetryFieldsError(
51
+ `Completion retry result is not valid JSON: ${error.message}`,
52
+ );
53
+ }
54
+
55
+ if (value === null || typeof value !== 'object' || Array.isArray(value)) {
56
+ throw completionRetryFieldsError(
57
+ 'Completion retry result must be a JSON object.',
58
+ );
59
+ }
60
+
61
+ if (value.status === 'continue') {
62
+ requireExactKeys(value, [
63
+ 'candidate',
64
+ 'nextStep',
65
+ 'route',
66
+ 'skipMutations',
67
+ 'skippedMutations',
68
+ 'status',
69
+ ]);
70
+ if (
71
+ value.route !== 'normal' ||
72
+ value.candidate !== false ||
73
+ value.nextStep !== '3.7' ||
74
+ value.skipMutations !== false ||
75
+ !Array.isArray(value.skippedMutations) ||
76
+ value.skippedMutations.length !== 0
77
+ ) {
78
+ throw completionRetryFieldsError(
79
+ 'Normal completion retry result is contradictory or malformed.',
80
+ );
81
+ }
82
+ return 'normal';
83
+ }
84
+
85
+ if (value.route === 'pin-source') {
86
+ requireExactKeys(value, [
87
+ 'candidate',
88
+ 'localCommit',
89
+ 'nextStep',
90
+ 'prArtifactPath',
91
+ 'projectLinksPinCommit',
92
+ 'remoteCommit',
93
+ 'retainedRef',
94
+ 'route',
95
+ 'skipMutations',
96
+ 'skippedMutations',
97
+ 'status',
98
+ ]);
99
+ if (
100
+ value.status !== 'recovered' ||
101
+ value.candidate !== true ||
102
+ value.nextStep !== '8.6' ||
103
+ value.skipMutations !== true
104
+ ) {
105
+ throw completionRetryFieldsError(
106
+ 'Recovered pin-source retry result is contradictory or malformed.',
107
+ );
108
+ }
109
+ requireSkippedMutations(value.skippedMutations);
110
+ if (
111
+ !FULL_SHA.test(value.localCommit) ||
112
+ value.remoteCommit !== value.localCommit ||
113
+ value.projectLinksPinCommit !== value.localCommit
114
+ ) {
115
+ throw completionRetryFieldsError(
116
+ 'Recovered pin-source retry receipts must be equal full commit SHAs.',
117
+ );
118
+ }
119
+ if (
120
+ typeof value.retainedRef !== 'string' ||
121
+ !RETAINED_REF.test(value.retainedRef)
122
+ ) {
123
+ throw completionRetryFieldsError(
124
+ 'Recovered pin-source retry retained ref is malformed.',
125
+ );
126
+ }
127
+ if (
128
+ typeof value.prArtifactPath !== 'string' ||
129
+ !PR_ARTIFACT.test(value.prArtifactPath)
130
+ ) {
131
+ throw completionRetryFieldsError(
132
+ 'Recovered pin-source retry PR artifact path is malformed.',
133
+ );
134
+ }
135
+ return [
136
+ 'pin-source',
137
+ value.projectLinksPinCommit,
138
+ value.prArtifactPath,
139
+ ].join('\t');
140
+ }
141
+
142
+ requireExactKeys(value, [
143
+ 'candidate',
144
+ 'evidenceCommit',
145
+ 'evidencePushRequired',
146
+ 'localCommit',
147
+ 'nextStep',
148
+ 'prArtifactPath',
149
+ 'projectLinksPinCommit',
150
+ 'projectRefCommit',
151
+ 'remoteCommit',
152
+ 'retainedRef',
153
+ 'route',
154
+ 'skipMutations',
155
+ 'skippedMutations',
156
+ 'status',
157
+ ]);
158
+ if (
159
+ value.status !== 'recovered' ||
160
+ value.route !== 'recovery' ||
161
+ value.candidate !== true ||
162
+ value.nextStep !== '7.5' ||
163
+ value.skipMutations !== true
164
+ ) {
165
+ throw completionRetryFieldsError(
166
+ 'Recovered completion retry result is contradictory or malformed.',
167
+ );
168
+ }
169
+ requireSkippedMutations(value.skippedMutations);
170
+ if (
171
+ !FULL_SHA.test(value.localCommit) ||
172
+ !FULL_SHA.test(value.remoteCommit) ||
173
+ !FULL_SHA.test(value.projectLinksPinCommit) ||
174
+ !FULL_SHA.test(value.projectRefCommit)
175
+ ) {
176
+ throw completionRetryFieldsError(
177
+ 'Recovered completion retry receipts must use full commit SHAs.',
178
+ );
179
+ }
180
+ if (value.evidenceCommit !== null && !FULL_SHA.test(value.evidenceCommit)) {
181
+ throw completionRetryFieldsError(
182
+ 'Recovered completion retry evidence receipt must be null or a full commit SHA.',
183
+ );
184
+ }
185
+ if (typeof value.evidencePushRequired !== 'boolean') {
186
+ throw completionRetryFieldsError(
187
+ 'Recovered completion retry evidence push flag must be boolean.',
188
+ );
189
+ }
190
+ if (
191
+ typeof value.retainedRef !== 'string' ||
192
+ !RETAINED_REF.test(value.retainedRef)
193
+ ) {
194
+ throw completionRetryFieldsError(
195
+ 'Recovered completion retry retained ref is malformed.',
196
+ );
197
+ }
198
+ if (
199
+ typeof value.prArtifactPath !== 'string' ||
200
+ !PR_ARTIFACT.test(value.prArtifactPath)
201
+ ) {
202
+ throw completionRetryFieldsError(
203
+ 'Recovered completion retry PR artifact path is malformed.',
204
+ );
205
+ }
206
+ if (value.evidenceCommit === null) {
207
+ if (
208
+ value.evidencePushRequired ||
209
+ value.localCommit !== value.projectRefCommit ||
210
+ value.remoteCommit !== value.projectRefCommit
211
+ ) {
212
+ throw completionRetryFieldsError(
213
+ 'Recovered completion retry receipts are contradictory without evidence.',
214
+ );
215
+ }
216
+ } else if (value.evidencePushRequired) {
217
+ if (
218
+ value.localCommit !== value.evidenceCommit ||
219
+ value.remoteCommit !== value.projectRefCommit
220
+ ) {
221
+ throw completionRetryFieldsError(
222
+ 'Recovered unpublished evidence receipts are contradictory.',
223
+ );
224
+ }
225
+ } else if (
226
+ value.localCommit !== value.evidenceCommit ||
227
+ value.remoteCommit !== value.evidenceCommit
228
+ ) {
229
+ throw completionRetryFieldsError(
230
+ 'Recovered published evidence receipts are contradictory.',
231
+ );
232
+ }
233
+
234
+ return [
235
+ 'recovery',
236
+ value.projectLinksPinCommit,
237
+ value.projectRefCommit,
238
+ value.evidenceCommit ?? '-',
239
+ String(value.evidencePushRequired),
240
+ value.prArtifactPath,
241
+ ].join('\t');
242
+ }
243
+
244
+ function main(argv) {
245
+ if (argv.length !== 1) {
246
+ throw completionRetryFieldsError(
247
+ 'Expected exactly one completion retry JSON argument.',
248
+ );
249
+ }
250
+ return parseCompletionRetryFields(argv[0]);
251
+ }
252
+
253
+ if (
254
+ process.argv[1] &&
255
+ import.meta.url === pathToFileURL(process.argv[1]).href
256
+ ) {
257
+ try {
258
+ process.stdout.write(`${main(process.argv.slice(2))}\n`);
259
+ } catch (error) {
260
+ process.stderr.write(
261
+ `${JSON.stringify({ ok: false, code: error.code, message: error.message })}\n`,
262
+ );
263
+ process.exitCode = 1;
264
+ }
265
+ }