@the-open-engine/zeroshot 6.38.1 → 6.39.1

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 (383) hide show
  1. package/README.md +6 -0
  2. package/cli/event-copy.js +8 -7
  3. package/cli/event-copy.ts +12 -0
  4. package/cli/index.js +67 -48
  5. package/cli/json-export.js +61 -64
  6. package/cli/json-export.ts +112 -0
  7. package/cli/message-formatter-utils.js +68 -56
  8. package/cli/message-formatter-utils.ts +121 -0
  9. package/cli/message-formatters-normal.js +124 -259
  10. package/cli/message-formatters-normal.ts +250 -0
  11. package/cli/message-formatters-watch.js +81 -84
  12. package/cli/message-formatters-watch.ts +189 -0
  13. package/lib/cluster/generated/protocol-schema.cjs +1 -1
  14. package/lib/cluster/generated/protocol-schema.mjs +1 -1
  15. package/lib/cluster/generated/protocol.d.cts +8 -0
  16. package/lib/cluster/generated/protocol.d.mts +8 -0
  17. package/lib/cluster/generated/protocol.d.ts +8 -0
  18. package/lib/clusters-registry.d.ts +23 -0
  19. package/lib/clusters-registry.js +17 -29
  20. package/lib/completion.d.ts +12 -0
  21. package/lib/completion.js +84 -94
  22. package/lib/compose-utils.d.ts +32 -0
  23. package/lib/compose-utils.js +57 -72
  24. package/lib/detached-startup.d.ts +84 -0
  25. package/lib/detached-startup.js +232 -302
  26. package/lib/docker-config.d.ts +43 -0
  27. package/lib/docker-config.js +150 -325
  28. package/lib/docker-env-auth.d.ts +17 -0
  29. package/lib/docker-env-auth.js +75 -0
  30. package/lib/git-remote-utils.d.ts +48 -0
  31. package/lib/git-remote-utils.js +147 -213
  32. package/lib/id-detector.d.ts +15 -0
  33. package/lib/id-detector.js +37 -41
  34. package/lib/path-check.d.ts +30 -0
  35. package/lib/path-check.js +42 -45
  36. package/lib/process-liveness.d.ts +16 -0
  37. package/lib/process-liveness.js +19 -12
  38. package/lib/provider-credential-path.d.ts +16 -0
  39. package/lib/provider-credential-path.js +31 -29
  40. package/lib/provider-defaults.d.ts +30 -0
  41. package/lib/provider-defaults.js +47 -42
  42. package/lib/provider-detection.d.ts +11 -0
  43. package/lib/provider-detection.js +91 -54
  44. package/lib/provider-names.d.ts +38 -0
  45. package/lib/provider-names.js +56 -64
  46. package/lib/repo-settings.d.ts +28 -0
  47. package/lib/repo-settings.js +83 -59
  48. package/lib/run-mode.d.ts +21 -0
  49. package/lib/run-mode.js +21 -20
  50. package/lib/run-plan.d.ts +28 -0
  51. package/lib/run-plan.js +17 -16
  52. package/lib/settings/claude-auth.d.ts +35 -0
  53. package/lib/settings/claude-auth.js +30 -47
  54. package/lib/settings-defaults.d.ts +20 -0
  55. package/lib/settings-defaults.js +149 -0
  56. package/lib/settings-error.d.ts +7 -0
  57. package/lib/settings-error.js +8 -0
  58. package/lib/settings-issue-providers.d.ts +10 -0
  59. package/lib/settings-issue-providers.js +12 -0
  60. package/lib/settings-models.d.ts +22 -0
  61. package/lib/settings-models.js +93 -0
  62. package/lib/settings-storage.d.ts +23 -0
  63. package/lib/settings-storage.js +205 -0
  64. package/lib/settings-validation.d.ts +7 -0
  65. package/lib/settings-validation.js +182 -0
  66. package/lib/settings.d.ts +29 -0
  67. package/lib/settings.js +41 -736
  68. package/lib/setup-apply-types.d.ts +66 -0
  69. package/lib/setup-apply-types.js +2 -0
  70. package/lib/setup-apply.d.ts +39 -0
  71. package/lib/setup-apply.js +267 -264
  72. package/lib/setup-journal.d.ts +41 -0
  73. package/lib/setup-journal.js +119 -76
  74. package/lib/setup-plan-types.d.ts +102 -0
  75. package/lib/setup-plan-types.js +2 -0
  76. package/lib/setup-plan.d.ts +30 -0
  77. package/lib/setup-plan.js +300 -324
  78. package/lib/setup-undo.d.ts +44 -0
  79. package/lib/setup-undo.js +61 -74
  80. package/lib/start-cluster-config.d.ts +26 -0
  81. package/lib/start-cluster-config.js +56 -0
  82. package/lib/start-cluster-environment.d.ts +41 -0
  83. package/lib/start-cluster-environment.js +134 -0
  84. package/lib/start-cluster-run-options.d.ts +54 -0
  85. package/lib/start-cluster-run-options.js +148 -0
  86. package/lib/start-cluster.d.ts +64 -0
  87. package/lib/start-cluster.js +98 -454
  88. package/lib/stream-json-parser.d.ts +17 -0
  89. package/lib/stream-json-parser.js +51 -52
  90. package/npm-shrinkwrap.json +6 -8
  91. package/package.json +14 -8
  92. package/scripts/postinstall.js +27 -0
  93. package/scripts/rust-distribution.js +36 -45
  94. package/src/agent/agent-command-proofs-context.js +35 -45
  95. package/src/agent/agent-command-proofs-context.ts +87 -0
  96. package/src/agent/agent-config-settings.js +19 -0
  97. package/src/agent/agent-config-settings.ts +41 -0
  98. package/src/agent/agent-config.js +122 -231
  99. package/src/agent/agent-config.ts +285 -0
  100. package/src/agent/agent-context-builder.js +38 -273
  101. package/src/agent/agent-context-builder.ts +51 -0
  102. package/src/agent/agent-context-environment-sections.js +105 -0
  103. package/src/agent/agent-context-environment-sections.ts +134 -0
  104. package/src/agent/agent-context-packs.js +165 -0
  105. package/src/agent/agent-context-packs.ts +296 -0
  106. package/src/agent/agent-context-prompt-sections.js +100 -0
  107. package/src/agent/agent-context-prompt-sections.ts +148 -0
  108. package/src/agent/agent-context-sections.js +25 -334
  109. package/src/agent/agent-context-sections.ts +36 -0
  110. package/src/agent/agent-context-sources.js +96 -149
  111. package/src/agent/agent-context-sources.ts +253 -0
  112. package/src/agent/agent-context-types.js +2 -0
  113. package/src/agent/agent-context-types.ts +132 -0
  114. package/src/agent/agent-context-validation-sections.js +73 -0
  115. package/src/agent/agent-context-validation-sections.ts +129 -0
  116. package/src/agent/agent-input-injector.js +99 -118
  117. package/src/agent/agent-input-injector.ts +195 -0
  118. package/src/agent/agent-liveness-poll.js +74 -78
  119. package/src/agent/agent-liveness-poll.ts +163 -0
  120. package/src/agent/agent-quality-gate-schema.js +77 -86
  121. package/src/agent/agent-quality-gate-schema.ts +135 -0
  122. package/src/agent/agent-quality-gates-context.js +44 -50
  123. package/src/agent/agent-quality-gates-context.ts +91 -0
  124. package/src/agent/agent-stuck-detector.js +171 -239
  125. package/src/agent/agent-stuck-detector.ts +288 -0
  126. package/src/agent/agent-trigger-evaluator.js +29 -46
  127. package/src/agent/agent-trigger-evaluator.ts +98 -0
  128. package/src/agent/context-metrics.js +110 -141
  129. package/src/agent/context-metrics.ts +261 -0
  130. package/src/agent/context-pack-builder.js +72 -358
  131. package/src/agent/context-pack-builder.ts +105 -0
  132. package/src/agent/context-pack-core.js +70 -0
  133. package/src/agent/context-pack-core.ts +96 -0
  134. package/src/agent/context-pack-selection.js +119 -0
  135. package/src/agent/context-pack-selection.ts +187 -0
  136. package/src/agent/context-pack-truncation.js +139 -0
  137. package/src/agent/context-pack-truncation.ts +208 -0
  138. package/src/agent/context-pack-types.js +2 -0
  139. package/src/agent/context-pack-types.ts +98 -0
  140. package/src/agent/context-replay-policy.js +30 -39
  141. package/src/agent/context-replay-policy.ts +71 -0
  142. package/src/agent/critical-agent-policy.js +6 -10
  143. package/src/agent/critical-agent-policy.ts +20 -0
  144. package/src/agent/guidance-queue.js +74 -87
  145. package/src/agent/guidance-queue.ts +166 -0
  146. package/src/agent/output-extraction-error-detail.js +45 -0
  147. package/src/agent/output-extraction-error-detail.ts +49 -0
  148. package/src/agent/output-extraction-failures.js +125 -0
  149. package/src/agent/output-extraction-failures.ts +149 -0
  150. package/src/agent/output-extraction-json.js +234 -0
  151. package/src/agent/output-extraction-json.ts +235 -0
  152. package/src/agent/output-extraction-pi.js +124 -0
  153. package/src/agent/output-extraction-pi.ts +137 -0
  154. package/src/agent/output-extraction-types.js +2 -0
  155. package/src/agent/output-extraction-types.ts +49 -0
  156. package/src/agent/output-extraction.js +17 -617
  157. package/src/agent/output-extraction.ts +30 -0
  158. package/src/agent/output-reformatter-errors.js +83 -0
  159. package/src/agent/output-reformatter-errors.ts +106 -0
  160. package/src/agent/output-reformatter-types.js +2 -0
  161. package/src/agent/output-reformatter-types.ts +86 -0
  162. package/src/agent/output-reformatter.js +140 -185
  163. package/src/agent/output-reformatter.ts +238 -0
  164. package/src/agent/pi-terminal-lifecycle-types.js +2 -0
  165. package/src/agent/pi-terminal-lifecycle-types.ts +41 -0
  166. package/src/agent/pi-terminal-lifecycle.js +186 -206
  167. package/src/agent/pi-terminal-lifecycle.ts +297 -0
  168. package/src/agent/provider-control-plane.js +22 -21
  169. package/src/agent/provider-control-plane.ts +52 -0
  170. package/src/agent/provider-terminal-failure-types.js +2 -0
  171. package/src/agent/provider-terminal-failure-types.ts +60 -0
  172. package/src/agent/provider-terminal-failure.js +194 -191
  173. package/src/agent/provider-terminal-failure.ts +262 -0
  174. package/src/agent/rate-limit-backoff.js +31 -74
  175. package/src/agent/rate-limit-backoff.ts +71 -0
  176. package/src/agent/schema-utils.js +85 -125
  177. package/src/agent/schema-utils.ts +148 -0
  178. package/src/agent/structured-output-error.js +34 -33
  179. package/src/agent/structured-output-error.ts +105 -0
  180. package/src/agent/validation-platform.js +27 -27
  181. package/src/agent/validation-platform.ts +49 -0
  182. package/src/agents/git-pusher-template.js +17 -34
  183. package/src/attach/attach-client.js +232 -405
  184. package/src/attach/attach-client.ts +300 -0
  185. package/src/attach/attach-server-cleanup.js +43 -0
  186. package/src/attach/attach-server-cleanup.ts +39 -0
  187. package/src/attach/attach-server-clients.js +117 -0
  188. package/src/attach/attach-server-clients.ts +122 -0
  189. package/src/attach/attach-server-events.js +38 -0
  190. package/src/attach/attach-server-events.ts +36 -0
  191. package/src/attach/attach-server-pty.js +45 -0
  192. package/src/attach/attach-server-pty.ts +64 -0
  193. package/src/attach/attach-server-runtime.js +73 -0
  194. package/src/attach/attach-server-runtime.ts +62 -0
  195. package/src/attach/attach-server-socket.js +28 -0
  196. package/src/attach/attach-server-socket.ts +23 -0
  197. package/src/attach/attach-server-types.js +2 -0
  198. package/src/attach/attach-server-types.ts +82 -0
  199. package/src/attach/attach-server.js +106 -523
  200. package/src/attach/attach-server.ts +158 -0
  201. package/src/attach/index.js +18 -35
  202. package/src/attach/index.ts +18 -0
  203. package/src/attach/protocol.js +95 -184
  204. package/src/attach/protocol.ts +181 -0
  205. package/src/attach/ring-buffer.js +76 -102
  206. package/src/attach/ring-buffer.ts +109 -0
  207. package/src/attach/send-input.js +64 -75
  208. package/src/attach/send-input.ts +94 -0
  209. package/src/attach/socket-discovery.js +164 -218
  210. package/src/attach/socket-discovery.ts +230 -0
  211. package/src/attach/socket-paths.js +42 -61
  212. package/src/attach/socket-paths.ts +81 -0
  213. package/src/claude-credentials.js +51 -54
  214. package/src/claude-credentials.ts +89 -0
  215. package/src/cluster/generated/protocol-schema.ts +1 -1
  216. package/src/cluster/generated/protocol.ts +2 -1
  217. package/src/command-proofs.js +110 -141
  218. package/src/command-proofs.ts +216 -0
  219. package/src/config-router.js +81 -73
  220. package/src/config-router.ts +131 -0
  221. package/src/copy-containment.js +191 -0
  222. package/src/copy-containment.ts +259 -0
  223. package/src/copy-worker.js +53 -30
  224. package/src/copy-worker.ts +88 -0
  225. package/src/darwin-keychain-boundary.js +80 -111
  226. package/src/darwin-keychain-boundary.ts +148 -0
  227. package/src/guidance-topics.js +4 -5
  228. package/src/guidance-topics.ts +10 -0
  229. package/src/input-helpers.js +33 -54
  230. package/src/input-helpers.ts +58 -0
  231. package/src/isolation-manager.js +59 -20
  232. package/src/ledger-sequence.js +45 -48
  233. package/src/ledger-sequence.ts +63 -0
  234. package/src/legacy-lib/clusters-registry.ts +40 -0
  235. package/src/legacy-lib/completion.ts +148 -0
  236. package/src/legacy-lib/compose-utils.ts +102 -0
  237. package/src/legacy-lib/detached-startup.ts +451 -0
  238. package/src/legacy-lib/docker-config.ts +282 -0
  239. package/src/legacy-lib/docker-env-auth.ts +116 -0
  240. package/src/legacy-lib/git-remote-utils.ts +244 -0
  241. package/src/legacy-lib/id-detector.ts +57 -0
  242. package/src/legacy-lib/js-yaml.d.ts +3 -0
  243. package/src/legacy-lib/omelette.d.ts +15 -0
  244. package/src/legacy-lib/path-check.ts +89 -0
  245. package/src/legacy-lib/process-liveness.ts +36 -0
  246. package/src/legacy-lib/provider-credential-path.ts +57 -0
  247. package/src/legacy-lib/provider-defaults.ts +114 -0
  248. package/src/legacy-lib/provider-detection.ts +67 -0
  249. package/src/legacy-lib/provider-names.ts +126 -0
  250. package/src/legacy-lib/repo-settings.ts +88 -0
  251. package/src/legacy-lib/run-mode.ts +58 -0
  252. package/src/legacy-lib/run-plan.ts +49 -0
  253. package/src/legacy-lib/settings/claude-auth.ts +80 -0
  254. package/src/legacy-lib/settings-defaults.ts +212 -0
  255. package/src/legacy-lib/settings-error.ts +8 -0
  256. package/src/legacy-lib/settings-issue-providers.ts +18 -0
  257. package/src/legacy-lib/settings-models.ts +124 -0
  258. package/src/legacy-lib/settings-storage.ts +277 -0
  259. package/src/legacy-lib/settings-validation.ts +220 -0
  260. package/src/legacy-lib/settings.ts +87 -0
  261. package/src/legacy-lib/setup-apply-types.ts +70 -0
  262. package/src/legacy-lib/setup-apply.ts +456 -0
  263. package/src/legacy-lib/setup-journal.ts +185 -0
  264. package/src/legacy-lib/setup-plan-types.ts +96 -0
  265. package/src/legacy-lib/setup-plan.ts +500 -0
  266. package/src/legacy-lib/setup-undo.ts +142 -0
  267. package/src/legacy-lib/start-cluster-config.ts +124 -0
  268. package/src/legacy-lib/start-cluster-environment.ts +166 -0
  269. package/src/legacy-lib/start-cluster-run-options.ts +281 -0
  270. package/src/legacy-lib/start-cluster.ts +237 -0
  271. package/src/legacy-lib/stream-json-parser.ts +88 -0
  272. package/src/message-buffer.js +55 -71
  273. package/src/message-buffer.ts +107 -0
  274. package/src/message-bus-bridge.js +92 -133
  275. package/src/message-bus-bridge.ts +149 -0
  276. package/src/name-generator-shared.js +220 -0
  277. package/src/name-generator-shared.ts +231 -0
  278. package/src/name-generator.js +8 -217
  279. package/src/name-generator.ts +27 -0
  280. package/src/omp-blob-root.js +83 -64
  281. package/src/omp-blob-root.ts +116 -0
  282. package/src/omp-config-overlay.js +65 -38
  283. package/src/omp-config-overlay.ts +110 -0
  284. package/src/omp-execution-fingerprint.js +38 -43
  285. package/src/omp-execution-fingerprint.ts +92 -0
  286. package/src/omp-session-limits.js +10 -15
  287. package/src/omp-session-limits.ts +53 -0
  288. package/src/omp-session-partition.js +2 -2
  289. package/src/omp-session-verifier.js +1 -1
  290. package/src/orchestrator.js +32 -7
  291. package/src/pr-body-template.js +71 -0
  292. package/src/providers/anthropic/index.js +3 -1
  293. package/src/providers/anthropic/index.ts +13 -0
  294. package/src/providers/capabilities.js +19 -27
  295. package/src/providers/capabilities.ts +44 -0
  296. package/src/providers/google/index.js +3 -1
  297. package/src/providers/google/index.ts +13 -0
  298. package/src/providers/openai/index.js +3 -1
  299. package/src/providers/openai/index.ts +13 -0
  300. package/src/providers/opencode/index.js +3 -1
  301. package/src/providers/opencode/index.ts +13 -0
  302. package/src/quality-gates.js +67 -127
  303. package/src/quality-gates.ts +149 -0
  304. package/src/repo-settings-access.js +40 -0
  305. package/src/repo-settings-access.ts +64 -0
  306. package/src/schemas/sub-cluster.js +127 -183
  307. package/src/schemas/sub-cluster.ts +238 -0
  308. package/src/state-snapshot-normalization.js +224 -0
  309. package/src/state-snapshot-normalization.ts +222 -0
  310. package/src/state-snapshot.js +192 -359
  311. package/src/state-snapshot.ts +291 -0
  312. package/src/state-snapshotter.js +118 -130
  313. package/src/state-snapshotter.ts +167 -0
  314. package/src/sub-cluster-wrapper.js +4 -13
  315. package/src/task-run-model-args.js +87 -124
  316. package/src/task-run-model-args.ts +204 -0
  317. package/src/task-runner.js +5 -25
  318. package/src/task-runner.ts +28 -0
  319. package/src/task-startup-error.js +73 -58
  320. package/src/task-startup-error.ts +126 -0
  321. package/src/template-validation/consensus-gate-contracts.js +2 -0
  322. package/src/template-validation/consensus-gate-contracts.ts +70 -0
  323. package/src/template-validation/consensus-gate-scenarios.js +76 -0
  324. package/src/template-validation/consensus-gate-scenarios.ts +130 -0
  325. package/src/template-validation/consensus-gate-stage.js +34 -0
  326. package/src/template-validation/consensus-gate-stage.ts +56 -0
  327. package/src/template-validation/random-topology-contracts.js +2 -0
  328. package/src/template-validation/random-topology-contracts.ts +54 -0
  329. package/src/template-validation/random-topology-dispatch.js +25 -0
  330. package/src/template-validation/random-topology-dispatch.ts +33 -0
  331. package/src/template-validation/random-topology-message-loop.js +53 -0
  332. package/src/template-validation/random-topology-message-loop.ts +73 -0
  333. package/src/template-validation/random-topology-operations.js +79 -0
  334. package/src/template-validation/random-topology-operations.ts +101 -0
  335. package/src/template-validation/random-topology-runtime.js +25 -0
  336. package/src/template-validation/random-topology-runtime.ts +43 -0
  337. package/src/template-validation/random-topology-scenario.js +52 -0
  338. package/src/template-validation/random-topology-scenario.ts +57 -0
  339. package/src/template-validation/random-topology-schema.js +159 -0
  340. package/src/template-validation/random-topology-schema.ts +190 -0
  341. package/src/template-validation/random-topology-state.js +28 -0
  342. package/src/template-validation/random-topology-state.ts +30 -0
  343. package/src/template-validation/random-topology-trigger-evaluation.js +45 -0
  344. package/src/template-validation/random-topology-trigger-evaluation.ts +65 -0
  345. package/src/template-validation/random-topology-trigger.js +75 -0
  346. package/src/template-validation/random-topology-trigger.ts +88 -0
  347. package/src/template-validation/report-formatter.js +40 -46
  348. package/src/template-validation/report-formatter.ts +101 -0
  349. package/src/template-validation/simulate-consensus-gates.js +111 -302
  350. package/src/template-validation/simulate-consensus-gates.ts +196 -0
  351. package/src/template-validation/simulate-random-topology.js +26 -519
  352. package/src/template-validation/simulate-random-topology.ts +57 -0
  353. package/src/template-validation/simulate-two-stage-validation.js +41 -265
  354. package/src/template-validation/simulate-two-stage-validation.ts +55 -0
  355. package/src/template-validation/simulation-agent-runtime.js +25 -0
  356. package/src/template-validation/simulation-agent-runtime.ts +40 -0
  357. package/src/template-validation/simulation-agent.js +29 -0
  358. package/src/template-validation/simulation-agent.ts +73 -0
  359. package/src/template-validation/simulation-runtime.js +34 -0
  360. package/src/template-validation/simulation-runtime.ts +72 -0
  361. package/src/template-validation/two-stage-contracts.js +2 -0
  362. package/src/template-validation/two-stage-contracts.ts +41 -0
  363. package/src/template-validation/two-stage-inputs.js +21 -0
  364. package/src/template-validation/two-stage-inputs.ts +29 -0
  365. package/src/template-validation/two-stage-results.js +30 -0
  366. package/src/template-validation/two-stage-results.ts +40 -0
  367. package/src/template-validation/two-stage-scenario.js +86 -0
  368. package/src/template-validation/two-stage-scenario.ts +120 -0
  369. package/src/worktree-claude-config.js +182 -220
  370. package/src/worktree-claude-config.ts +272 -0
  371. package/src/worktree-tooling-env.js +103 -125
  372. package/src/worktree-tooling-env.ts +142 -0
  373. package/task-lib/completion.js +2 -3
  374. package/task-lib/completion.ts +9 -0
  375. package/task-lib/config.js +1 -4
  376. package/task-lib/config.ts +11 -0
  377. package/task-lib/name-generator.js +4 -226
  378. package/task-lib/name-generator.ts +11 -0
  379. package/task-lib/omp-session-cleanup.js +1 -1
  380. package/task-lib/omp-storage-root.js +8 -12
  381. package/task-lib/omp-storage-root.ts +62 -0
  382. package/task-lib/process-termination.js +143 -166
  383. package/task-lib/process-termination.ts +268 -0
@@ -1,148 +1,88 @@
1
- const { readRepoSettings } = require('../lib/repo-settings');
2
-
3
- function hasOwn(value, key) {
4
- return Object.prototype.hasOwnProperty.call(value || {}, key);
5
- }
6
-
7
- function hasDefinedOwn(value, key) {
8
- return hasOwn(value, key) && value[key] !== undefined;
9
- }
10
-
1
+ "use strict";
2
+ const repoSettingsAccess = require("./repo-settings-access");
3
+ const { isRecord, propertyValue, readRepoSettingsValue, selectOwnProperty } = repoSettingsAccess;
11
4
  function getGateId(gate) {
12
- if (typeof gate.id === 'string' && gate.id.trim()) {
13
- return gate.id.trim();
14
- }
15
-
16
- if (typeof gate.name === 'string' && gate.name.trim()) {
17
- return gate.name.trim();
18
- }
19
-
20
- return null;
5
+ if (typeof gate.id === 'string' && gate.id.trim()) {
6
+ return gate.id.trim();
7
+ }
8
+ if (typeof gate.name === 'string' && gate.name.trim()) {
9
+ return gate.name.trim();
10
+ }
11
+ return null;
21
12
  }
22
-
23
13
  function normalizeStringGate(gate) {
24
- const id = gate.trim();
25
- return id ? { id } : null;
14
+ const id = gate.trim();
15
+ return id ? { id } : null;
26
16
  }
27
-
28
17
  function setOptionalString(target, source, key) {
29
- if (typeof source[key] === 'string' && source[key].trim()) {
30
- target[key] = source[key].trim();
31
- }
18
+ const value = source[key];
19
+ if (typeof value === 'string' && value.trim()) {
20
+ target[key] = value.trim();
21
+ }
32
22
  }
33
-
34
23
  function normalizeObjectGate(gate) {
35
- if (!gate || typeof gate !== 'object') {
36
- return null;
37
- }
38
-
39
- const id = getGateId(gate);
40
- if (!id) {
41
- return null;
42
- }
43
-
44
- const normalized = { id };
45
- setOptionalString(normalized, gate, 'scope');
46
- setOptionalString(normalized, gate, 'description');
47
- setOptionalString(normalized, gate, 'command');
48
- setOptionalString(normalized, gate, 'profile');
49
- setOptionalString(normalized, gate, 'proofProfile');
50
- if (gate.commandProof === true) {
51
- normalized.commandProof = true;
52
- }
53
- return normalized;
24
+ if (!isRecord(gate)) {
25
+ return null;
26
+ }
27
+ const id = getGateId(gate);
28
+ if (!id) {
29
+ return null;
30
+ }
31
+ const normalized = { id };
32
+ setOptionalString(normalized, gate, 'scope');
33
+ setOptionalString(normalized, gate, 'description');
34
+ setOptionalString(normalized, gate, 'command');
35
+ setOptionalString(normalized, gate, 'profile');
36
+ setOptionalString(normalized, gate, 'proofProfile');
37
+ if (gate.commandProof === true) {
38
+ normalized.commandProof = true;
39
+ }
40
+ return normalized;
41
+ }
42
+ function isRequiredQualityGate(gate) {
43
+ return gate !== null;
54
44
  }
55
-
56
45
  function normalizeRequiredQualityGates(value) {
57
- if (!Array.isArray(value)) {
58
- return [];
59
- }
60
-
61
- return value
62
- .map((gate) => {
63
- if (typeof gate === 'string') {
64
- return normalizeStringGate(gate);
65
- }
66
- return normalizeObjectGate(gate);
46
+ if (!Array.isArray(value)) {
47
+ return [];
48
+ }
49
+ return value
50
+ .map((gate) => {
51
+ if (typeof gate === 'string') {
52
+ return normalizeStringGate(gate);
53
+ }
54
+ return normalizeObjectGate(gate);
67
55
  })
68
- .filter(Boolean);
56
+ .filter(isRequiredQualityGate);
69
57
  }
70
-
71
58
  function getRequiredQualityGateSource(options, repoSettings) {
72
- if (hasDefinedOwn(options, 'requiredQualityGates')) {
73
- return options.requiredQualityGates;
74
- }
75
-
76
- if (
77
- options.ship &&
78
- typeof options.ship === 'object' &&
79
- hasDefinedOwn(options.ship, 'requiredQualityGates')
80
- ) {
81
- return options.ship.requiredQualityGates;
82
- }
83
-
84
- const settingsShip = repoSettings?.ship;
85
- if (
86
- settingsShip &&
87
- typeof settingsShip === 'object' &&
88
- hasOwn(settingsShip, 'requiredQualityGates')
89
- ) {
90
- return settingsShip.requiredQualityGates;
91
- }
92
-
93
- if (hasOwn(repoSettings, 'requiredQualityGates')) {
94
- return repoSettings.requiredQualityGates;
95
- }
96
-
97
- return [];
59
+ const explicitSource = selectOwnProperty('requiredQualityGates', [options, propertyValue(options, 'ship')], { skipUndefined: true });
60
+ if (explicitSource !== undefined) {
61
+ return explicitSource;
62
+ }
63
+ const repoSource = selectOwnProperty('requiredQualityGates', [
64
+ propertyValue(repoSettings, 'ship'),
65
+ repoSettings,
66
+ ]);
67
+ return repoSource === undefined ? [] : repoSource;
98
68
  }
99
-
100
69
  function resolveRequiredQualityGates(options = {}) {
101
- const repoSettingsResult = readRepoSettings(options.cwd || process.cwd());
102
- const repoSettings = repoSettingsResult.settings || {};
103
- const source = getRequiredQualityGateSource(options, repoSettings);
104
- return normalizeRequiredQualityGates(source);
70
+ const repoSettings = readRepoSettingsValue(options.cwd || process.cwd());
71
+ const source = getRequiredQualityGateSource(options, repoSettings);
72
+ return normalizeRequiredQualityGates(source);
105
73
  }
106
-
107
74
  function getClusterRequiredQualityGateSource(config, options) {
108
- if (hasDefinedOwn(options, 'requiredQualityGates')) {
109
- return options.requiredQualityGates;
110
- }
111
-
112
- if (
113
- options.ship &&
114
- typeof options.ship === 'object' &&
115
- hasDefinedOwn(options.ship, 'requiredQualityGates')
116
- ) {
117
- return options.ship.requiredQualityGates;
118
- }
119
-
120
- if (
121
- config?.ship &&
122
- typeof config.ship === 'object' &&
123
- hasDefinedOwn(config.ship, 'requiredQualityGates')
124
- ) {
125
- return config.ship.requiredQualityGates;
126
- }
127
-
128
- if (hasDefinedOwn(config, 'requiredQualityGates')) {
129
- return config.requiredQualityGates;
130
- }
131
-
132
- return undefined;
75
+ return selectOwnProperty('requiredQualityGates', [options, propertyValue(options, 'ship'), propertyValue(config, 'ship'), config], { skipUndefined: true });
133
76
  }
134
-
135
77
  function resolveClusterRequiredQualityGates(config = {}, options = {}) {
136
- const configuredSource = getClusterRequiredQualityGateSource(config, options);
137
- if (configuredSource !== undefined) {
138
- return normalizeRequiredQualityGates(configuredSource);
139
- }
140
-
141
- return resolveRequiredQualityGates({ ...options, cwd: options.cwd || process.cwd() });
78
+ const configuredSource = getClusterRequiredQualityGateSource(config, options);
79
+ if (configuredSource !== undefined) {
80
+ return normalizeRequiredQualityGates(configuredSource);
81
+ }
82
+ return resolveRequiredQualityGates({ ...options, cwd: options.cwd || process.cwd() });
142
83
  }
143
-
144
84
  module.exports = {
145
- normalizeRequiredQualityGates,
146
- resolveRequiredQualityGates,
147
- resolveClusterRequiredQualityGates,
85
+ normalizeRequiredQualityGates,
86
+ resolveRequiredQualityGates,
87
+ resolveClusterRequiredQualityGates,
148
88
  };
@@ -0,0 +1,149 @@
1
+ import repoSettingsAccess = require('./repo-settings-access');
2
+
3
+ type StringGateField = 'scope' | 'description' | 'command' | 'profile' | 'proofProfile';
4
+
5
+ interface RequiredQualityGate {
6
+ id: string;
7
+ scope?: string;
8
+ description?: string;
9
+ command?: string;
10
+ profile?: string;
11
+ proofProfile?: string;
12
+ commandProof?: true;
13
+ }
14
+
15
+ interface QualityGateOptions {
16
+ cwd?: string;
17
+ requiredQualityGates?: unknown;
18
+ ship?: unknown;
19
+ [key: string]: unknown;
20
+ }
21
+
22
+ interface QualityGateConfig {
23
+ requiredQualityGates?: unknown;
24
+ ship?: unknown;
25
+ [key: string]: unknown;
26
+ }
27
+
28
+ const { isRecord, propertyValue, readRepoSettingsValue, selectOwnProperty } = repoSettingsAccess;
29
+
30
+ function getGateId(gate: Record<string, unknown>): string | null {
31
+ if (typeof gate.id === 'string' && gate.id.trim()) {
32
+ return gate.id.trim();
33
+ }
34
+
35
+ if (typeof gate.name === 'string' && gate.name.trim()) {
36
+ return gate.name.trim();
37
+ }
38
+
39
+ return null;
40
+ }
41
+
42
+ function normalizeStringGate(gate: string): RequiredQualityGate | null {
43
+ const id = gate.trim();
44
+ return id ? { id } : null;
45
+ }
46
+
47
+ function setOptionalString(
48
+ target: RequiredQualityGate,
49
+ source: Record<string, unknown>,
50
+ key: StringGateField
51
+ ): void {
52
+ const value = source[key];
53
+ if (typeof value === 'string' && value.trim()) {
54
+ target[key] = value.trim();
55
+ }
56
+ }
57
+
58
+ function normalizeObjectGate(gate: unknown): RequiredQualityGate | null {
59
+ if (!isRecord(gate)) {
60
+ return null;
61
+ }
62
+
63
+ const id = getGateId(gate);
64
+ if (!id) {
65
+ return null;
66
+ }
67
+
68
+ const normalized: RequiredQualityGate = { id };
69
+ setOptionalString(normalized, gate, 'scope');
70
+ setOptionalString(normalized, gate, 'description');
71
+ setOptionalString(normalized, gate, 'command');
72
+ setOptionalString(normalized, gate, 'profile');
73
+ setOptionalString(normalized, gate, 'proofProfile');
74
+ if (gate.commandProof === true) {
75
+ normalized.commandProof = true;
76
+ }
77
+ return normalized;
78
+ }
79
+
80
+ function isRequiredQualityGate(gate: RequiredQualityGate | null): gate is RequiredQualityGate {
81
+ return gate !== null;
82
+ }
83
+
84
+ function normalizeRequiredQualityGates(value: unknown): RequiredQualityGate[] {
85
+ if (!Array.isArray(value)) {
86
+ return [];
87
+ }
88
+
89
+ return value
90
+ .map((gate) => {
91
+ if (typeof gate === 'string') {
92
+ return normalizeStringGate(gate);
93
+ }
94
+ return normalizeObjectGate(gate);
95
+ })
96
+ .filter(isRequiredQualityGate);
97
+ }
98
+
99
+ function getRequiredQualityGateSource(options: QualityGateOptions, repoSettings: unknown): unknown {
100
+ const explicitSource = selectOwnProperty(
101
+ 'requiredQualityGates',
102
+ [options, propertyValue(options, 'ship')],
103
+ { skipUndefined: true }
104
+ );
105
+ if (explicitSource !== undefined) {
106
+ return explicitSource;
107
+ }
108
+
109
+ const repoSource = selectOwnProperty('requiredQualityGates', [
110
+ propertyValue(repoSettings, 'ship'),
111
+ repoSettings,
112
+ ]);
113
+ return repoSource === undefined ? [] : repoSource;
114
+ }
115
+
116
+ function resolveRequiredQualityGates(options: QualityGateOptions = {}): RequiredQualityGate[] {
117
+ const repoSettings = readRepoSettingsValue(options.cwd || process.cwd());
118
+ const source = getRequiredQualityGateSource(options, repoSettings);
119
+ return normalizeRequiredQualityGates(source);
120
+ }
121
+
122
+ function getClusterRequiredQualityGateSource(
123
+ config: QualityGateConfig,
124
+ options: QualityGateOptions
125
+ ): unknown {
126
+ return selectOwnProperty(
127
+ 'requiredQualityGates',
128
+ [options, propertyValue(options, 'ship'), propertyValue(config, 'ship'), config],
129
+ { skipUndefined: true }
130
+ );
131
+ }
132
+
133
+ function resolveClusterRequiredQualityGates(
134
+ config: QualityGateConfig = {},
135
+ options: QualityGateOptions = {}
136
+ ): RequiredQualityGate[] {
137
+ const configuredSource = getClusterRequiredQualityGateSource(config, options);
138
+ if (configuredSource !== undefined) {
139
+ return normalizeRequiredQualityGates(configuredSource);
140
+ }
141
+
142
+ return resolveRequiredQualityGates({ ...options, cwd: options.cwd || process.cwd() });
143
+ }
144
+
145
+ export = {
146
+ normalizeRequiredQualityGates,
147
+ resolveRequiredQualityGates,
148
+ resolveClusterRequiredQualityGates,
149
+ };
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ function isRepoSettingsModule(value) {
3
+ return (typeof value === 'object' &&
4
+ value !== null &&
5
+ 'readRepoSettings' in value &&
6
+ typeof value.readRepoSettings === 'function');
7
+ }
8
+ const repoSettingsModule = require('../lib/repo-settings');
9
+ if (!isRepoSettingsModule(repoSettingsModule)) {
10
+ throw new TypeError('repo-settings must export readRepoSettings');
11
+ }
12
+ const readRepoSettings = repoSettingsModule.readRepoSettings;
13
+ function isRecord(value) {
14
+ return typeof value === 'object' && value !== null;
15
+ }
16
+ function propertyValue(value, key) {
17
+ return isRecord(value) ? value[key] : undefined;
18
+ }
19
+ function selectOwnProperty(key, candidates, options = {}) {
20
+ for (const candidate of candidates) {
21
+ if (!Object.prototype.hasOwnProperty.call(candidate || {}, key)) {
22
+ continue;
23
+ }
24
+ const value = propertyValue(candidate, key);
25
+ if (options.skipUndefined && value === undefined) {
26
+ continue;
27
+ }
28
+ return value;
29
+ }
30
+ return undefined;
31
+ }
32
+ function readRepoSettingsValue(startDir) {
33
+ return readRepoSettings(startDir).settings || {};
34
+ }
35
+ module.exports = {
36
+ isRecord,
37
+ propertyValue,
38
+ readRepoSettingsValue,
39
+ selectOwnProperty,
40
+ };
@@ -0,0 +1,64 @@
1
+ interface RepoSettingsResult {
2
+ settings?: unknown;
3
+ }
4
+
5
+ interface RepoSettingsModule {
6
+ readRepoSettings(startDir: string): RepoSettingsResult;
7
+ }
8
+
9
+ interface PropertySelectionOptions {
10
+ skipUndefined?: boolean;
11
+ }
12
+
13
+ function isRepoSettingsModule(value: unknown): value is RepoSettingsModule {
14
+ return (
15
+ typeof value === 'object' &&
16
+ value !== null &&
17
+ 'readRepoSettings' in value &&
18
+ typeof value.readRepoSettings === 'function'
19
+ );
20
+ }
21
+
22
+ const repoSettingsModule: unknown = require('../lib/repo-settings');
23
+ if (!isRepoSettingsModule(repoSettingsModule)) {
24
+ throw new TypeError('repo-settings must export readRepoSettings');
25
+ }
26
+ const readRepoSettings = repoSettingsModule.readRepoSettings;
27
+
28
+ function isRecord(value: unknown): value is Record<string, unknown> {
29
+ return typeof value === 'object' && value !== null;
30
+ }
31
+
32
+ function propertyValue(value: unknown, key: string): unknown {
33
+ return isRecord(value) ? value[key] : undefined;
34
+ }
35
+
36
+ function selectOwnProperty(
37
+ key: string,
38
+ candidates: readonly unknown[],
39
+ options: PropertySelectionOptions = {}
40
+ ): unknown {
41
+ for (const candidate of candidates) {
42
+ if (!Object.prototype.hasOwnProperty.call(candidate || {}, key)) {
43
+ continue;
44
+ }
45
+
46
+ const value = propertyValue(candidate, key);
47
+ if (options.skipUndefined && value === undefined) {
48
+ continue;
49
+ }
50
+ return value;
51
+ }
52
+ return undefined;
53
+ }
54
+
55
+ function readRepoSettingsValue(startDir: string): unknown {
56
+ return readRepoSettings(startDir).settings || {};
57
+ }
58
+
59
+ export = {
60
+ isRecord,
61
+ propertyValue,
62
+ readRepoSettingsValue,
63
+ selectOwnProperty,
64
+ };