onto-mcp 0.3.2 → 0.4.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 (300) hide show
  1. package/.onto/processes/reconstruct/actionable-ontology-seed-recomposition-design.md +447 -0
  2. package/.onto/processes/reconstruct/foundry-style-ontology-seed-contract.md +934 -0
  3. package/.onto/processes/reconstruct/reconstruct-boundary-contract.md +303 -725
  4. package/.onto/processes/reconstruct/reconstruct-contract-registry.yaml +1645 -0
  5. package/.onto/processes/reconstruct/reconstruct-execution-ux-contract.md +26 -22
  6. package/.onto/processes/reconstruct/source-profile-contract.md +49 -23
  7. package/.onto/processes/reconstruct/source-profiles/code.md +6 -3
  8. package/.onto/processes/reconstruct/source-profiles/database.md +5 -2
  9. package/.onto/processes/reconstruct/source-profiles/document.md +5 -2
  10. package/.onto/processes/reconstruct/source-profiles/spreadsheet.md +5 -4
  11. package/.onto/processes/review/review-execution-ux-contract.md +40 -0
  12. package/.onto/processes/shared/pipeline-execution-ledger-contract.md +26 -10
  13. package/.onto/processes/shared/target-material-kind-contract.md +29 -16
  14. package/AGENTS.md +6 -4
  15. package/README.md +149 -76
  16. package/dist/cli.js +8 -8
  17. package/dist/core-api/reconstruct-api.js +117 -31
  18. package/dist/core-api/review-api.js +47 -0
  19. package/dist/core-runtime/cli/codex-review-unit-executor.js +39 -2
  20. package/dist/core-runtime/cli/complete-review-session.js +2 -2
  21. package/dist/core-runtime/cli/mock-review-unit-executor.js +1 -1
  22. package/dist/core-runtime/cli/review-invoke.js +9 -9
  23. package/dist/core-runtime/cli/run-review-prompt-execution.js +39 -5
  24. package/dist/core-runtime/cli/spawn-watcher.js +266 -47
  25. package/dist/core-runtime/cli/start-review-session.js +3 -3
  26. package/dist/core-runtime/llm/llm-caller.js +11 -0
  27. package/dist/core-runtime/llm/llm-tool-loop.js +2 -0
  28. package/dist/core-runtime/observability/runtime-stream-observation.js +118 -0
  29. package/dist/core-runtime/onboard/cli-host.js +174 -0
  30. package/dist/core-runtime/onboard/host-target.js +22 -0
  31. package/dist/core-runtime/onboard/json-config-host.js +122 -0
  32. package/dist/core-runtime/onboard/path-scan.js +26 -0
  33. package/dist/core-runtime/onboard/prompt.js +51 -0
  34. package/dist/core-runtime/onboard/register.js +214 -0
  35. package/dist/core-runtime/onboard/types.js +27 -0
  36. package/dist/core-runtime/reconstruct/actionable-seed-validation.js +1777 -0
  37. package/dist/core-runtime/reconstruct/artifact-types.js +10 -4
  38. package/dist/core-runtime/reconstruct/contract-registry.js +623 -0
  39. package/dist/core-runtime/reconstruct/domain-id.js +10 -0
  40. package/dist/core-runtime/reconstruct/governing-snapshot.js +716 -0
  41. package/dist/core-runtime/reconstruct/material-profile-validation.js +191 -0
  42. package/dist/core-runtime/reconstruct/materialize-preparation.js +49 -11
  43. package/dist/core-runtime/reconstruct/pipeline-execution-ledger.js +269 -79
  44. package/dist/core-runtime/reconstruct/post-seed-validation.js +1194 -51
  45. package/dist/core-runtime/reconstruct/record.js +104 -20
  46. package/dist/core-runtime/reconstruct/run.js +2107 -413
  47. package/dist/core-runtime/reconstruct/seed-claim-projections.js +268 -0
  48. package/dist/core-runtime/reconstruct/source-profiles.js +93 -4
  49. package/dist/core-runtime/reconstruct/terminal-validation.js +807 -0
  50. package/dist/core-runtime/review/review-invocation-runner.js +4 -4
  51. package/dist/mcp/server.js +110 -38
  52. package/dist/mcp/tool-schemas.js +20 -6
  53. package/package.json +8 -17
  54. package/scripts/onto-review-watch.sh +486 -0
  55. package/scripts/onto-runtime-watch.sh +122 -0
  56. package/scripts/postinstall-hint.js +22 -0
  57. package/.onto/processes/reconstruct/top-level-concept-discovery-contract.md +0 -387
  58. package/dist/core-runtime/cli/bootstrap-review-binding.js +0 -186
  59. package/dist/core-runtime/cli/codex-nested-dispatch.test.js +0 -390
  60. package/dist/core-runtime/cli/codex-nested-teamlead-executor.test.js +0 -335
  61. package/dist/core-runtime/cli/coordinator-helpers.js +0 -583
  62. package/dist/core-runtime/cli/coordinator-state-machine-deliberation.test.js +0 -167
  63. package/dist/core-runtime/cli/coordinator-state-machine.js +0 -794
  64. package/dist/core-runtime/cli/e2e-codex-multi-agent-fixes.test.js +0 -615
  65. package/dist/core-runtime/cli/e2e-start-review-session.test.js +0 -312
  66. package/dist/core-runtime/cli/health.js +0 -44
  67. package/dist/core-runtime/cli/inline-http-review-unit-executor.test.js +0 -567
  68. package/dist/core-runtime/cli/materialize-review-execution-preparation.js +0 -104
  69. package/dist/core-runtime/cli/migrate-session-roots.js +0 -118
  70. package/dist/core-runtime/cli/repo-layout-migration-replace.smoke.test.js +0 -106
  71. package/dist/core-runtime/cli/review-invoke-auto-resolution.test.js +0 -268
  72. package/dist/core-runtime/cli/review-invoke-coordinator-topology.test.js +0 -136
  73. package/dist/core-runtime/cli/review-invoke-resolver-caching.test.js +0 -201
  74. package/dist/core-runtime/cli/review-invoke-topology-dispatch.test.js +0 -192
  75. package/dist/core-runtime/cli/session-root-guard.js +0 -168
  76. package/dist/core-runtime/cli/spawn-watcher.test.js +0 -457
  77. package/dist/core-runtime/cli/strip-wrapping-code-fence.test.js +0 -79
  78. package/dist/core-runtime/cli/teamcreate-lens-deliberation-executor.js +0 -412
  79. package/dist/core-runtime/cli/teamcreate-lens-deliberation-executor.test.js +0 -351
  80. package/dist/core-runtime/cli/topology-executor-mapping.js +0 -139
  81. package/dist/core-runtime/cli/topology-executor-mapping.test.js +0 -173
  82. package/dist/core-runtime/cli/write-review-interpretation.js +0 -81
  83. package/dist/core-runtime/config/onto-config-cli.js +0 -278
  84. package/dist/core-runtime/config/onto-config-key-path.js +0 -288
  85. package/dist/core-runtime/config/onto-config-key-path.test.js +0 -195
  86. package/dist/core-runtime/config/onto-config-preview.js +0 -108
  87. package/dist/core-runtime/config/onto-config-preview.test.js +0 -132
  88. package/dist/core-runtime/discovery/config-chain.js +0 -118
  89. package/dist/core-runtime/discovery/config-chain.test.js +0 -103
  90. package/dist/core-runtime/discovery/config-profile.js +0 -199
  91. package/dist/core-runtime/discovery/config-profile.test.js +0 -233
  92. package/dist/core-runtime/discovery/host-detection.test.js +0 -186
  93. package/dist/core-runtime/discovery/installation-paths.test.js +0 -65
  94. package/dist/core-runtime/discovery/lens-registry.test.js +0 -81
  95. package/dist/core-runtime/discovery/path-normalization.test.js +0 -22
  96. package/dist/core-runtime/discovery/plugin-path.js +0 -72
  97. package/dist/core-runtime/discovery/plugin-path.test.js +0 -95
  98. package/dist/core-runtime/evolve/adapters/code-product/compile/compile-defense.js +0 -344
  99. package/dist/core-runtime/evolve/adapters/code-product/compile/compile-defense.test.js +0 -915
  100. package/dist/core-runtime/evolve/adapters/code-product/compile/compile.js +0 -564
  101. package/dist/core-runtime/evolve/adapters/code-product/compile/compile.test.js +0 -708
  102. package/dist/core-runtime/evolve/adapters/code-product/parsers/brief-parser.js +0 -165
  103. package/dist/core-runtime/evolve/adapters/code-product/parsers/brief-parser.test.js +0 -227
  104. package/dist/core-runtime/evolve/adapters/code-product/validators/validate.js +0 -59
  105. package/dist/core-runtime/evolve/adapters/code-product/validators/validate.test.js +0 -205
  106. package/dist/core-runtime/evolve/adapters/methodology/adapter.js +0 -16
  107. package/dist/core-runtime/evolve/adapters/methodology/adapter.test.js +0 -9
  108. package/dist/core-runtime/evolve/adapters/methodology/perspectives/authority-consistency.js +0 -298
  109. package/dist/core-runtime/evolve/adapters/methodology/perspectives/authority-consistency.test.js +0 -70
  110. package/dist/core-runtime/evolve/adapters/methodology/scope-types/process.js +0 -46
  111. package/dist/core-runtime/evolve/adapters/methodology/scope-types/process.test.js +0 -73
  112. package/dist/core-runtime/evolve/adapters/registry.js +0 -47
  113. package/dist/core-runtime/evolve/adapters/registry.test.js +0 -67
  114. package/dist/core-runtime/evolve/cli.js +0 -256
  115. package/dist/core-runtime/evolve/commands/align.js +0 -194
  116. package/dist/core-runtime/evolve/commands/align.test.js +0 -82
  117. package/dist/core-runtime/evolve/commands/apply.js +0 -161
  118. package/dist/core-runtime/evolve/commands/apply.test.js +0 -138
  119. package/dist/core-runtime/evolve/commands/close.js +0 -39
  120. package/dist/core-runtime/evolve/commands/close.test.js +0 -99
  121. package/dist/core-runtime/evolve/commands/defer.js +0 -40
  122. package/dist/core-runtime/evolve/commands/defer.test.js +0 -134
  123. package/dist/core-runtime/evolve/commands/draft.js +0 -323
  124. package/dist/core-runtime/evolve/commands/draft.test.js +0 -178
  125. package/dist/core-runtime/evolve/commands/e2e-evolve-full-cycle.test.js +0 -208
  126. package/dist/core-runtime/evolve/commands/error-messages.js +0 -125
  127. package/dist/core-runtime/evolve/commands/error-messages.test.js +0 -167
  128. package/dist/core-runtime/evolve/commands/propose-align.js +0 -222
  129. package/dist/core-runtime/evolve/commands/propose-align.test.js +0 -136
  130. package/dist/core-runtime/evolve/commands/reconstruct.js +0 -330
  131. package/dist/core-runtime/evolve/commands/reconstruct.test.js +0 -278
  132. package/dist/core-runtime/evolve/commands/shared.js +0 -22
  133. package/dist/core-runtime/evolve/commands/stale-check.js +0 -103
  134. package/dist/core-runtime/evolve/commands/stale-check.test.js +0 -84
  135. package/dist/core-runtime/evolve/commands/start.js +0 -887
  136. package/dist/core-runtime/evolve/commands/start.test.js +0 -396
  137. package/dist/core-runtime/evolve/config/project-config.js +0 -99
  138. package/dist/core-runtime/evolve/config/project-config.test.js +0 -170
  139. package/dist/core-runtime/evolve/renderers/align-packet.js +0 -280
  140. package/dist/core-runtime/evolve/renderers/align-packet.test.js +0 -332
  141. package/dist/core-runtime/evolve/renderers/draft-packet.js +0 -303
  142. package/dist/core-runtime/evolve/renderers/draft-packet.test.js +0 -377
  143. package/dist/core-runtime/evolve/renderers/format.js +0 -5
  144. package/dist/core-runtime/evolve/renderers/scope-md.js +0 -237
  145. package/dist/core-runtime/evolve/renderers/scope-md.test.js +0 -306
  146. package/dist/core-runtime/govern/cli.js +0 -369
  147. package/dist/core-runtime/govern/cli.test.js +0 -314
  148. package/dist/core-runtime/govern/drift-engine.js +0 -103
  149. package/dist/core-runtime/govern/drift-engine.test.js +0 -319
  150. package/dist/core-runtime/govern/promote-principle.js +0 -206
  151. package/dist/core-runtime/govern/promote-principle.test.js +0 -368
  152. package/dist/core-runtime/govern/queue.js +0 -81
  153. package/dist/core-runtime/govern/types.js +0 -16
  154. package/dist/core-runtime/install/cli.js +0 -530
  155. package/dist/core-runtime/install/detect.js +0 -128
  156. package/dist/core-runtime/install/detect.test.js +0 -155
  157. package/dist/core-runtime/install/gitignore-update.js +0 -74
  158. package/dist/core-runtime/install/gitignore-update.test.js +0 -64
  159. package/dist/core-runtime/install/install-integration.test.js +0 -373
  160. package/dist/core-runtime/install/prompts.js +0 -389
  161. package/dist/core-runtime/install/prompts.test.js +0 -293
  162. package/dist/core-runtime/install/types.js +0 -26
  163. package/dist/core-runtime/install/validation.js +0 -295
  164. package/dist/core-runtime/install/validation.test.js +0 -313
  165. package/dist/core-runtime/install/writer.js +0 -254
  166. package/dist/core-runtime/install/writer.test.js +0 -218
  167. package/dist/core-runtime/learning/extractor.js +0 -461
  168. package/dist/core-runtime/learning/feedback.js +0 -179
  169. package/dist/core-runtime/learning/health-report.js +0 -165
  170. package/dist/core-runtime/learning/health-report.test.js +0 -169
  171. package/dist/core-runtime/learning/loader.js +0 -388
  172. package/dist/core-runtime/learning/loader.test.js +0 -102
  173. package/dist/core-runtime/learning/promote/apply-state.js +0 -240
  174. package/dist/core-runtime/learning/promote/audit-obligation.js +0 -195
  175. package/dist/core-runtime/learning/promote/collector.js +0 -432
  176. package/dist/core-runtime/learning/promote/degraded-state.js +0 -125
  177. package/dist/core-runtime/learning/promote/domain-doc-proposer.js +0 -166
  178. package/dist/core-runtime/learning/promote/e2e-promote.test.js +0 -6385
  179. package/dist/core-runtime/learning/promote/health-snapshot.js +0 -150
  180. package/dist/core-runtime/learning/promote/insight-reclassifier.js +0 -544
  181. package/dist/core-runtime/learning/promote/judgment-auditor.js +0 -517
  182. package/dist/core-runtime/learning/promote/panel-reviewer.js +0 -1158
  183. package/dist/core-runtime/learning/promote/promote-executor.js +0 -1675
  184. package/dist/core-runtime/learning/promote/promoter.js +0 -307
  185. package/dist/core-runtime/learning/promote/retirement.js +0 -122
  186. package/dist/core-runtime/learning/promote/types.js +0 -23
  187. package/dist/core-runtime/learning/prompt-sections.js +0 -51
  188. package/dist/core-runtime/learning/shared/artifact-registry-init.js +0 -45
  189. package/dist/core-runtime/learning/shared/artifact-registry.js +0 -254
  190. package/dist/core-runtime/learning/shared/audit-obligation-kernel.js +0 -73
  191. package/dist/core-runtime/learning/shared/audit-state.js +0 -99
  192. package/dist/core-runtime/learning/shared/duplicate-check.js +0 -28
  193. package/dist/core-runtime/learning/shared/llm-caller.js +0 -831
  194. package/dist/core-runtime/learning/shared/llm-caller.test.js +0 -601
  195. package/dist/core-runtime/learning/shared/llm-tool-loop.js +0 -393
  196. package/dist/core-runtime/learning/shared/mode.js +0 -25
  197. package/dist/core-runtime/learning/shared/paths.js +0 -84
  198. package/dist/core-runtime/learning/shared/paths.test.js +0 -79
  199. package/dist/core-runtime/learning/shared/patterns.js +0 -37
  200. package/dist/core-runtime/learning/shared/recoverability.js +0 -355
  201. package/dist/core-runtime/learning/shared/recovery-context.js +0 -374
  202. package/dist/core-runtime/learning/shared/scope.js +0 -1
  203. package/dist/core-runtime/learning/shared/semantic-classifier.js +0 -94
  204. package/dist/core-runtime/learning/shared/specs/apply-execution-state-spec.js +0 -42
  205. package/dist/core-runtime/learning/shared/specs/audit-state-spec.js +0 -37
  206. package/dist/core-runtime/learning/shared/specs/backup-metadata-spec.js +0 -39
  207. package/dist/core-runtime/learning/shared/specs/emergency-log-spec.js +0 -41
  208. package/dist/core-runtime/learning/shared/specs/layout-version-spec.js +0 -38
  209. package/dist/core-runtime/learning/shared/specs/promote-decisions-spec.js +0 -43
  210. package/dist/core-runtime/learning/shared/specs/promote-report-spec.js +0 -113
  211. package/dist/core-runtime/learning/shared/specs/prune-log-spec.js +0 -36
  212. package/dist/core-runtime/learning/shared/specs/recovery-resolution-spec.js +0 -48
  213. package/dist/core-runtime/learning/shared/specs/restore-manifest-spec.js +0 -43
  214. package/dist/core-runtime/learning/shared/specs/spec-helpers.js +0 -64
  215. package/dist/core-runtime/learning/usage-tracker.js +0 -190
  216. package/dist/core-runtime/learning/usage-tracker.test.js +0 -176
  217. package/dist/core-runtime/onboard/detect-review-axes.js +0 -122
  218. package/dist/core-runtime/onboard/detect-review-axes.test.js +0 -127
  219. package/dist/core-runtime/onboard/write-review-block.js +0 -188
  220. package/dist/core-runtime/onboard/write-review-block.test.js +0 -240
  221. package/dist/core-runtime/readers/brownfield-builder.js +0 -150
  222. package/dist/core-runtime/readers/brownfield-builder.test.js +0 -136
  223. package/dist/core-runtime/readers/code-chunk-collector.js +0 -53
  224. package/dist/core-runtime/readers/code-chunk-collector.test.js +0 -136
  225. package/dist/core-runtime/readers/file-utils.js +0 -240
  226. package/dist/core-runtime/readers/file-utils.test.js +0 -146
  227. package/dist/core-runtime/readers/lexicon-citation-check.js +0 -93
  228. package/dist/core-runtime/readers/lexicon-citation-check.test.js +0 -77
  229. package/dist/core-runtime/readers/mcp-figma.js +0 -30
  230. package/dist/core-runtime/readers/mcp-figma.test.js +0 -82
  231. package/dist/core-runtime/readers/mcp-generic.js +0 -31
  232. package/dist/core-runtime/readers/mcp-generic.test.js +0 -76
  233. package/dist/core-runtime/readers/ontology-index.js +0 -148
  234. package/dist/core-runtime/readers/ontology-index.test.js +0 -245
  235. package/dist/core-runtime/readers/ontology-query.js +0 -168
  236. package/dist/core-runtime/readers/ontology-query.test.js +0 -311
  237. package/dist/core-runtime/readers/ontology-resolve.js +0 -48
  238. package/dist/core-runtime/readers/ontology-resolve.test.js +0 -48
  239. package/dist/core-runtime/readers/patterns/index.js +0 -7
  240. package/dist/core-runtime/readers/review-log.js +0 -213
  241. package/dist/core-runtime/readers/review-log.test.js +0 -313
  242. package/dist/core-runtime/readers/scan-local.js +0 -102
  243. package/dist/core-runtime/readers/scan-local.test.js +0 -102
  244. package/dist/core-runtime/readers/scan-tarball.js +0 -121
  245. package/dist/core-runtime/readers/scan-tarball.test.js +0 -283
  246. package/dist/core-runtime/readers/scan-vault.js +0 -34
  247. package/dist/core-runtime/readers/scan-vault.test.js +0 -81
  248. package/dist/core-runtime/readers/types.js +0 -42
  249. package/dist/core-runtime/readers/types.test.js +0 -94
  250. package/dist/core-runtime/readers/viewpoint-collectors.js +0 -229
  251. package/dist/core-runtime/reconstruct/seed-candidate-validation.js +0 -385
  252. package/dist/core-runtime/review/citation-audit.test.js +0 -165
  253. package/dist/core-runtime/review/execution-plan-resolver.js +0 -247
  254. package/dist/core-runtime/review/execution-plan-resolver.test.js +0 -243
  255. package/dist/core-runtime/review/execution-topology-resolver-axis-first.test.js +0 -246
  256. package/dist/core-runtime/review/execution-topology-resolver.js +0 -401
  257. package/dist/core-runtime/review/execution-topology-resolver.test.js +0 -315
  258. package/dist/core-runtime/review/inline-context-embedder.test.js +0 -154
  259. package/dist/core-runtime/review/legacy-mode-policy.js +0 -88
  260. package/dist/core-runtime/review/materializers-effort-persist.test.js +0 -79
  261. package/dist/core-runtime/review/ontology-path-classifier.js +0 -179
  262. package/dist/core-runtime/review/ontology-path-classifier.test.js +0 -216
  263. package/dist/core-runtime/review/packet-boundary-policy.test.js +0 -107
  264. package/dist/core-runtime/review/participating-lens-paths.test.js +0 -73
  265. package/dist/core-runtime/review/review-config-legacy-translate.js +0 -244
  266. package/dist/core-runtime/review/review-config-legacy-translate.test.js +0 -161
  267. package/dist/core-runtime/review/review-config-validator.js +0 -289
  268. package/dist/core-runtime/review/review-config-validator.test.js +0 -236
  269. package/dist/core-runtime/review/shape-pipeline-audit.test.js +0 -311
  270. package/dist/core-runtime/review/shape-to-topology-id.js +0 -117
  271. package/dist/core-runtime/review/shape-to-topology-id.test.js +0 -132
  272. package/dist/core-runtime/review/topology-shape-derivation.js +0 -155
  273. package/dist/core-runtime/review/topology-shape-derivation.test.js +0 -195
  274. package/dist/core-runtime/scope-runtime/constants.js +0 -12
  275. package/dist/core-runtime/scope-runtime/constraint-pool.js +0 -166
  276. package/dist/core-runtime/scope-runtime/constraint-pool.test.js +0 -674
  277. package/dist/core-runtime/scope-runtime/domain-validation-log.js +0 -135
  278. package/dist/core-runtime/scope-runtime/domain-validation-log.test.js +0 -156
  279. package/dist/core-runtime/scope-runtime/eval-persistence.js +0 -65
  280. package/dist/core-runtime/scope-runtime/eval-persistence.test.js +0 -84
  281. package/dist/core-runtime/scope-runtime/event-pipeline.js +0 -64
  282. package/dist/core-runtime/scope-runtime/event-pipeline.test.js +0 -450
  283. package/dist/core-runtime/scope-runtime/event-store.js +0 -39
  284. package/dist/core-runtime/scope-runtime/event-store.test.js +0 -95
  285. package/dist/core-runtime/scope-runtime/gate-guard.js +0 -348
  286. package/dist/core-runtime/scope-runtime/gate-guard.test.js +0 -1047
  287. package/dist/core-runtime/scope-runtime/hash.js +0 -4
  288. package/dist/core-runtime/scope-runtime/hash.test.js +0 -33
  289. package/dist/core-runtime/scope-runtime/id.js +0 -4
  290. package/dist/core-runtime/scope-runtime/id.test.js +0 -17
  291. package/dist/core-runtime/scope-runtime/reducer.js +0 -297
  292. package/dist/core-runtime/scope-runtime/reducer.test.js +0 -759
  293. package/dist/core-runtime/scope-runtime/scope-manager.js +0 -161
  294. package/dist/core-runtime/scope-runtime/state-machine.js +0 -309
  295. package/dist/core-runtime/scope-runtime/state-machine.test.js +0 -704
  296. package/dist/core-runtime/scope-runtime/types.js +0 -116
  297. package/dist/core-runtime/scope-runtime/types.test.js +0 -69
  298. package/dist/core-runtime/translate/render-for-user.js +0 -169
  299. package/dist/core-runtime/translate/render-for-user.test.js +0 -122
  300. package/dist/providers/capability-contract.js +0 -1
@@ -1,81 +0,0 @@
1
- #!/usr/bin/env node
2
- import path from "node:path";
3
- import { parseArgs } from "node:util";
4
- import { parseBooleanFlag, } from "../review/review-artifact-utils.js";
5
- import { writeInvocationInterpretationArtifact } from "../review/materializers.js";
6
- import { printOntoReleaseChannelNotice } from "../release-channel/release-channel.js";
7
- function requireString(value, optionName) {
8
- if (typeof value !== "string" || value.length === 0) {
9
- throw new Error(`Missing required option --${optionName}`);
10
- }
11
- return value;
12
- }
13
- function optionalString(value) {
14
- return typeof value === "string" ? value : "";
15
- }
16
- function requireReviewTargetScopeKind(value) {
17
- if (value === "file" || value === "directory" || value === "bundle") {
18
- return value;
19
- }
20
- throw new Error(`Invalid --target-scope-kind: ${value}`);
21
- }
22
- function requireReviewMode(value) {
23
- if (value === "core-axis" || value === "full") {
24
- return value;
25
- }
26
- throw new Error(`Invalid --review-mode-recommendation: ${value}`);
27
- }
28
- async function main() {
29
- await printOntoReleaseChannelNotice();
30
- const { values } = parseArgs({
31
- options: {
32
- "session-root": { type: "string" },
33
- entrypoint: { type: "string", default: "review" },
34
- "target-scope-kind": { type: "string" },
35
- "primary-ref": { type: "string" },
36
- "member-ref": { type: "string", multiple: true, default: [] },
37
- "bundle-kind": { type: "string" },
38
- "intent-summary": { type: "string" },
39
- "domain-recommendation": { type: "string", default: "" },
40
- "domain-selection-required": { type: "string", default: "true" },
41
- "review-mode-recommendation": { type: "string" },
42
- "always-include-lens-id": { type: "string", multiple: true, default: [] },
43
- "recommended-lens-id": { type: "string", multiple: true, default: [] },
44
- rationale: { type: "string", multiple: true, default: [] },
45
- "ambiguity-note": { type: "string", multiple: true, default: [] },
46
- "confirm-value-alignment": { type: "boolean", default: false },
47
- },
48
- strict: true,
49
- allowPositionals: false,
50
- });
51
- const sessionRoot = path.resolve(requireString(values["session-root"], "session-root"));
52
- const targetScopeKind = requireReviewTargetScopeKind(requireString(values["target-scope-kind"], "target-scope-kind"));
53
- const primaryRef = requireString(values["primary-ref"], "primary-ref");
54
- const reviewModeRecommendation = requireReviewMode(requireString(values["review-mode-recommendation"], "review-mode-recommendation"));
55
- const interpretationParams = {
56
- sessionRoot,
57
- entrypoint: requireString(values.entrypoint, "entrypoint"),
58
- targetScopeKind,
59
- primaryRef,
60
- memberRefs: values["member-ref"],
61
- intentSummary: requireString(values["intent-summary"], "intent-summary"),
62
- domainRecommendation: optionalString(values["domain-recommendation"]),
63
- domainSelectionRequired: parseBooleanFlag(values["domain-selection-required"], "domain-selection-required"),
64
- reviewModeRecommendation,
65
- alwaysIncludeLensIds: values["always-include-lens-id"],
66
- recommendedLensIds: values["recommended-lens-id"],
67
- rationale: values.rationale,
68
- ambiguityNotes: values["ambiguity-note"],
69
- valueAlignmentConfirmed: Boolean(values["confirm-value-alignment"]),
70
- ...(typeof values["bundle-kind"] === "string" && values["bundle-kind"].length > 0
71
- ? { bundleKind: values["bundle-kind"] }
72
- : {}),
73
- };
74
- const interpretationArtifactPath = await writeInvocationInterpretationArtifact(interpretationParams);
75
- console.log(interpretationArtifactPath);
76
- return 0;
77
- }
78
- main().then((exitCode) => process.exit(exitCode), (error) => {
79
- console.error(error instanceof Error ? error.message : String(error));
80
- process.exit(1);
81
- });
@@ -1,278 +0,0 @@
1
- import fs from "node:fs/promises";
2
- import path from "node:path";
3
- import { assertNoRetiredConfigFiles, defaultReviewExecution, projectSettingsPath, resolveSettingsChain, } from "../discovery/settings-chain.js";
4
- const SUPPORTED_SET_PATHS = [
5
- "llm.auth",
6
- "llm.provider",
7
- "llm.model",
8
- "llm.effort",
9
- "llm.service_tier",
10
- "llm.base_url",
11
- "llm.api_key_env",
12
- "review.execution.mode",
13
- "review.execution.teamlead.seat",
14
- "review.execution.lens.seat",
15
- "review.execution.max_concurrent_workers",
16
- "output_language",
17
- "review_mode",
18
- ];
19
- export async function handleConfigCli(ontoHome, argv) {
20
- const subcommand = argv[0] ?? "show";
21
- const args = argv.slice(1);
22
- const projectRoot = process.cwd();
23
- try {
24
- switch (subcommand) {
25
- case "show":
26
- return handleShow(ontoHome, projectRoot);
27
- case "validate":
28
- return handleValidate(ontoHome, projectRoot);
29
- case "set":
30
- return handleSet(ontoHome, projectRoot, args);
31
- case "use":
32
- return handleUse(ontoHome, projectRoot, args);
33
- case "--help":
34
- case "-h":
35
- printHelp();
36
- return 0;
37
- default:
38
- throw new Error(`Unknown settings subcommand: ${subcommand}`);
39
- }
40
- }
41
- catch (error) {
42
- console.error(error instanceof Error ? error.message : String(error));
43
- return 1;
44
- }
45
- }
46
- function printHelp() {
47
- console.log([
48
- "onto config - inspect or edit .onto/settings.json",
49
- "",
50
- "Usage:",
51
- " onto config show",
52
- " onto config validate",
53
- " onto config set <path> <value>",
54
- " onto config use main-workers",
55
- " onto config use nested-workers",
56
- "",
57
- "Supported set paths:",
58
- ...SUPPORTED_SET_PATHS.map((keyPath) => ` - ${keyPath}`),
59
- ].join("\n"));
60
- }
61
- async function handleShow(ontoHome, projectRoot) {
62
- const settings = await resolveSettingsChain(ontoHome, projectRoot);
63
- console.log(JSON.stringify({
64
- settings_path: projectSettingsPath(projectRoot),
65
- settings,
66
- }, null, 2));
67
- return 0;
68
- }
69
- async function handleValidate(ontoHome, projectRoot) {
70
- await resolveSettingsChain(ontoHome, projectRoot);
71
- console.log(JSON.stringify({
72
- ok: true,
73
- settings_path: projectSettingsPath(projectRoot),
74
- }, null, 2));
75
- return 0;
76
- }
77
- async function handleSet(ontoHome, projectRoot, argv) {
78
- if (argv.length !== 2) {
79
- throw new Error("onto config set requires <path> and <value>.");
80
- }
81
- const [keyPath, rawValue] = argv;
82
- if (!SUPPORTED_SET_PATHS.includes(keyPath)) {
83
- throw new Error(`Unsupported settings path: ${keyPath}. Supported: ${SUPPORTED_SET_PATHS.join(", ")}`);
84
- }
85
- const settings = await readProjectSettings(projectRoot);
86
- setValue(settings, keyPath, rawValue);
87
- await writeProjectSettings(projectRoot, settings);
88
- await resolveSettingsChain(ontoHome, projectRoot);
89
- console.log(JSON.stringify({
90
- ok: true,
91
- changed: keyPath,
92
- settings_path: projectSettingsPath(projectRoot),
93
- }, null, 2));
94
- return 0;
95
- }
96
- async function handleUse(ontoHome, projectRoot, argv) {
97
- const mode = argv[0];
98
- if (mode !== "main-workers" && mode !== "nested-workers") {
99
- throw new Error("onto config use supports main-workers or nested-workers.");
100
- }
101
- const settings = await readProjectSettings(projectRoot);
102
- const execution = settings.review?.execution ?? defaultReviewExecution();
103
- settings.review = {
104
- ...(settings.review ?? { execution }),
105
- execution: {
106
- ...execution,
107
- mode,
108
- teamlead: {
109
- ...(execution.teamlead ?? { llm: "inherit" }),
110
- seat: mode === "main-workers" ? "main" : "worker",
111
- },
112
- lens: {
113
- ...(execution.lens ?? { llm: "inherit" }),
114
- seat: "worker",
115
- },
116
- deliberation: "controlled-lens-deliberation",
117
- },
118
- };
119
- const maxConcurrent = readOption(argv.slice(1), "max-concurrent-workers");
120
- if (maxConcurrent !== undefined) {
121
- settings.review.execution.max_concurrent_workers =
122
- parsePositiveInteger(maxConcurrent, "--max-concurrent-workers");
123
- }
124
- await writeProjectSettings(projectRoot, settings);
125
- await resolveSettingsChain(ontoHome, projectRoot);
126
- console.log(JSON.stringify({
127
- ok: true,
128
- mode,
129
- settings_path: projectSettingsPath(projectRoot),
130
- }, null, 2));
131
- return 0;
132
- }
133
- async function readProjectSettings(projectRoot) {
134
- await assertNoRetiredConfigFiles(projectRoot);
135
- const settingsPath = projectSettingsPath(projectRoot);
136
- try {
137
- const raw = await fs.readFile(settingsPath, "utf8");
138
- return JSON.parse(raw);
139
- }
140
- catch (error) {
141
- if (error.code === "ENOENT") {
142
- return {};
143
- }
144
- throw new Error(`Failed to read ${settingsPath}: ${error instanceof Error ? error.message : String(error)}`);
145
- }
146
- }
147
- async function writeProjectSettings(projectRoot, settings) {
148
- const settingsPath = projectSettingsPath(projectRoot);
149
- await fs.mkdir(path.dirname(settingsPath), { recursive: true });
150
- await fs.writeFile(settingsPath, `${JSON.stringify(settings, null, 2)}\n`, "utf8");
151
- }
152
- function setValue(settings, keyPath, rawValue) {
153
- switch (keyPath) {
154
- case "llm.auth":
155
- settings.llm = { ...(settings.llm ?? {}), auth: parseAuth(rawValue) };
156
- return;
157
- case "llm.provider":
158
- settings.llm = { ...(settings.llm ?? {}), provider: parseProvider(rawValue) };
159
- return;
160
- case "llm.model":
161
- settings.llm = { ...(settings.llm ?? {}), model: requireNonEmpty(rawValue, keyPath) };
162
- return;
163
- case "llm.effort":
164
- settings.llm = { ...(settings.llm ?? {}), effort: requireNonEmpty(rawValue, keyPath) };
165
- return;
166
- case "llm.service_tier":
167
- settings.llm = { ...(settings.llm ?? {}), service_tier: requireNonEmpty(rawValue, keyPath) };
168
- return;
169
- case "llm.base_url":
170
- settings.llm = { ...(settings.llm ?? {}), base_url: requireNonEmpty(rawValue, keyPath) };
171
- return;
172
- case "llm.api_key_env":
173
- settings.llm = { ...(settings.llm ?? {}), api_key_env: requireNonEmpty(rawValue, keyPath) };
174
- return;
175
- case "review.execution.mode":
176
- ensureExecution(settings).mode = parseMode(rawValue);
177
- normalizeExecutionSeats(settings);
178
- return;
179
- case "review.execution.teamlead.seat":
180
- ensureExecution(settings).teamlead = {
181
- ...ensureExecution(settings).teamlead,
182
- seat: parseSeat(rawValue),
183
- };
184
- return;
185
- case "review.execution.lens.seat":
186
- ensureExecution(settings).lens = {
187
- ...ensureExecution(settings).lens,
188
- seat: parseSeat(rawValue),
189
- };
190
- return;
191
- case "review.execution.max_concurrent_workers":
192
- ensureExecution(settings).max_concurrent_workers =
193
- parsePositiveInteger(rawValue, keyPath);
194
- return;
195
- case "output_language":
196
- settings.output_language = requireNonEmpty(rawValue, keyPath);
197
- return;
198
- case "review_mode":
199
- if (rawValue !== "core-axis" && rawValue !== "full") {
200
- throw new Error("review_mode must be core-axis or full.");
201
- }
202
- settings.review_mode = rawValue;
203
- return;
204
- }
205
- }
206
- function ensureExecution(settings) {
207
- const execution = settings.review?.execution ?? defaultReviewExecution();
208
- settings.review = {
209
- ...(settings.review ?? { execution }),
210
- execution,
211
- };
212
- return settings.review.execution;
213
- }
214
- function normalizeExecutionSeats(settings) {
215
- const execution = ensureExecution(settings);
216
- execution.teamlead = {
217
- ...execution.teamlead,
218
- seat: execution.mode === "main-workers" ? "main" : "worker",
219
- };
220
- execution.lens = {
221
- ...execution.lens,
222
- seat: "worker",
223
- };
224
- }
225
- function parseAuth(rawValue) {
226
- if (rawValue === "api_key" || rawValue === "oauth" || rawValue === "local") {
227
- return rawValue;
228
- }
229
- throw new Error("llm.auth must be api_key, oauth, or local.");
230
- }
231
- function parseProvider(rawValue) {
232
- if (rawValue === "openai" ||
233
- rawValue === "anthropic" ||
234
- rawValue === "grok" ||
235
- rawValue === "lmstudio") {
236
- return rawValue;
237
- }
238
- throw new Error("llm.provider must be openai, anthropic, grok, or lmstudio.");
239
- }
240
- function parseMode(rawValue) {
241
- if (rawValue === "main-workers" || rawValue === "nested-workers") {
242
- return rawValue;
243
- }
244
- throw new Error("review.execution.mode must be main-workers or nested-workers.");
245
- }
246
- function parseSeat(rawValue) {
247
- if (rawValue === "main" || rawValue === "worker") {
248
- return rawValue;
249
- }
250
- throw new Error("review execution seat must be main or worker.");
251
- }
252
- function parsePositiveInteger(rawValue, label) {
253
- if (!/^\d+$/.test(rawValue)) {
254
- throw new Error(`${label} must be a positive integer.`);
255
- }
256
- const value = Number.parseInt(rawValue, 10);
257
- if (value < 1) {
258
- throw new Error(`${label} must be >= 1.`);
259
- }
260
- return value;
261
- }
262
- function requireNonEmpty(rawValue, label) {
263
- if (rawValue.length === 0) {
264
- throw new Error(`${label} cannot be empty.`);
265
- }
266
- return rawValue;
267
- }
268
- function readOption(argv, name) {
269
- const token = `--${name}`;
270
- const index = argv.indexOf(token);
271
- if (index < 0)
272
- return undefined;
273
- const value = argv[index + 1];
274
- if (!value || value.startsWith("--")) {
275
- throw new Error(`${token} requires a value.`);
276
- }
277
- return value;
278
- }
@@ -1,288 +0,0 @@
1
- /**
2
- * Review UX Redesign P5 — pure helper for `onto config set <key> <value>`.
3
- *
4
- * # What this module is
5
- *
6
- * A small set of pure functions that translate the user-facing key-path
7
- * vocabulary (`subagent.provider`, `max_concurrent_lenses`,
8
- * `teamlead.model`, etc.) into mutations on an `OntoReviewConfig` object.
9
- * Callers pass the current config + key + raw string value; the helper
10
- * returns the mutated config OR a structured error explaining why the
11
- * assignment is invalid.
12
- *
13
- * # Why it exists
14
- *
15
- * `onto config set subagent.provider codex` must (1) type-coerce the value,
16
- * (2) respect the discriminated-union semantics of `SubagentSpec`, and
17
- * (3) refuse paths that would produce an invalid config even before calling
18
- * the main validator. Putting this in a pure module lets both the `set`
19
- * subcommand and the `edit` subcommand share the exact same write semantics
20
- * without duplicating coercion logic.
21
- *
22
- * # How it relates
23
- *
24
- * - Input : current `OntoReviewConfig` + dotted key path + raw string value.
25
- * - Output: `{ ok: true, config }` or `{ ok: false, error }`.
26
- * - Next stage: caller feeds the returned config into `validateReviewConfig`
27
- * then `writeReviewBlock`. This helper performs SHAPE coercion only;
28
- * semantic constraints are the validator's job.
29
- */
30
- /**
31
- * Supported user-facing key paths. `set` rejects anything else with a hint
32
- * pointing to the `edit` subcommand for fields that need richer input
33
- * (notably external-teamlead spec objects).
34
- */
35
- export const SUPPORTED_SET_PATHS = [
36
- "teamlead.model",
37
- "teamlead.model.provider",
38
- "teamlead.model.model_id",
39
- "teamlead.model.effort",
40
- "subagent.provider",
41
- "subagent.model_id",
42
- "subagent.effort",
43
- "max_concurrent_lenses",
44
- "lens_deliberation",
45
- ];
46
- const SUBAGENT_PROVIDER_VALUES = [
47
- "main-native",
48
- "codex",
49
- ];
50
- const FOREIGN_PROVIDER_VALUES = ["codex"];
51
- const LENS_DELIBERATION_VALUES = [
52
- "controlled-lens-deliberation",
53
- ];
54
- /**
55
- * Apply a `set key value` mutation and return the resulting config.
56
- *
57
- * Does NOT invoke `validateReviewConfig` — the caller is responsible for
58
- * running the full validator against the returned object before writing.
59
- * This separation lets `edit` (which performs multiple sets in a session)
60
- * validate once at the end, and `set` (single-shot) validate immediately.
61
- */
62
- export function applySet(current, path, rawValue) {
63
- if (!isSupportedPath(path)) {
64
- return {
65
- ok: false,
66
- error: `Unknown key path "${path}". Supported paths: ${SUPPORTED_SET_PATHS.join(", ")}. ` +
67
- "For external teamlead specs or multi-field changes, use `onto config edit`.",
68
- };
69
- }
70
- // Deep-clone the current config so the mutation is pure.
71
- const next = structuredClone(current);
72
- switch (path) {
73
- case "teamlead.model":
74
- return setTeamleadModel(next, rawValue);
75
- case "teamlead.model.provider":
76
- return setTeamleadModelProvider(next, rawValue);
77
- case "teamlead.model.model_id":
78
- return setTeamleadModelId(next, rawValue);
79
- case "teamlead.model.effort":
80
- return setTeamleadEffort(next, rawValue);
81
- case "subagent.provider":
82
- return setSubagentProvider(next, rawValue);
83
- case "subagent.model_id":
84
- return setSubagentModelId(next, rawValue);
85
- case "subagent.effort":
86
- return setSubagentEffort(next, rawValue);
87
- case "max_concurrent_lenses":
88
- return setMaxConcurrentLenses(next, rawValue);
89
- case "lens_deliberation":
90
- return setLensDeliberation(next, rawValue);
91
- }
92
- }
93
- // ---------------------------------------------------------------------------
94
- // Per-path handlers
95
- // ---------------------------------------------------------------------------
96
- function setTeamleadModel(config, rawValue) {
97
- if (rawValue === "main") {
98
- config.teamlead = { model: "main" };
99
- return { ok: true, config };
100
- }
101
- return {
102
- ok: false,
103
- error: `teamlead.model via \`set\` only accepts "main" (the host main session). ` +
104
- "Use `onto config edit` to configure an external teamlead provider " +
105
- "(requires provider + model_id + optional effort).",
106
- };
107
- }
108
- function getExistingExternalTeamleadModel(config) {
109
- const model = config.teamlead?.model;
110
- if (!model || model === "main")
111
- return null;
112
- return model;
113
- }
114
- function setTeamleadModelProvider(config, rawValue) {
115
- if (!FOREIGN_PROVIDER_VALUES.includes(rawValue)) {
116
- return {
117
- ok: false,
118
- error: `teamlead.model.provider must be one of: ${FOREIGN_PROVIDER_VALUES.join(", ")} (got "${rawValue}").`,
119
- };
120
- }
121
- const provider = rawValue;
122
- const prev = getExistingExternalTeamleadModel(config);
123
- config.teamlead = {
124
- model: {
125
- provider,
126
- model_id: prev?.model_id ?? "",
127
- ...(prev?.effort !== undefined ? { effort: prev.effort } : {}),
128
- },
129
- };
130
- return { ok: true, config };
131
- }
132
- function setTeamleadModelId(config, rawValue) {
133
- if (rawValue.length === 0) {
134
- return {
135
- ok: false,
136
- error: "teamlead.model.model_id cannot be empty.",
137
- };
138
- }
139
- const prev = getExistingExternalTeamleadModel(config);
140
- if (!prev) {
141
- return {
142
- ok: false,
143
- error: "teamlead.model.model_id can only be set when teamlead.model.provider is codex. " +
144
- "Set teamlead.model.provider first, or use `onto config use codex-nested --model <id>`.",
145
- };
146
- }
147
- config.teamlead = {
148
- model: {
149
- provider: prev.provider,
150
- model_id: rawValue,
151
- ...(prev.effort !== undefined ? { effort: prev.effort } : {}),
152
- },
153
- };
154
- return { ok: true, config };
155
- }
156
- function setTeamleadEffort(config, rawValue) {
157
- if (rawValue.length === 0) {
158
- return {
159
- ok: false,
160
- error: "teamlead.model.effort cannot be empty (omit the field to clear it).",
161
- };
162
- }
163
- const prev = getExistingExternalTeamleadModel(config);
164
- if (!prev) {
165
- return {
166
- ok: false,
167
- error: "teamlead.model.effort can only be set when teamlead.model.provider is codex. " +
168
- "For main teamlead, effort is host-managed.",
169
- };
170
- }
171
- config.teamlead = {
172
- model: {
173
- provider: prev.provider,
174
- model_id: prev.model_id,
175
- effort: rawValue,
176
- },
177
- };
178
- return { ok: true, config };
179
- }
180
- function setSubagentProvider(config, rawValue) {
181
- if (!SUBAGENT_PROVIDER_VALUES.includes(rawValue)) {
182
- return {
183
- ok: false,
184
- error: `subagent.provider must be one of: ${SUBAGENT_PROVIDER_VALUES.join(", ")} (got "${rawValue}").`,
185
- };
186
- }
187
- const provider = rawValue;
188
- const prev = config.subagent;
189
- if (provider === "main-native") {
190
- // Switching to main-native drops any model_id / effort from the
191
- // foreign branch — they are not allowed under the main-native branch
192
- // per the discriminated union.
193
- config.subagent = { provider: "main-native" };
194
- return { ok: true, config };
195
- }
196
- // Foreign provider — carry over model_id/effort if previously set (same
197
- // provider or different foreign provider). Missing model_id is caught
198
- // later by `validateReviewConfig`, not here, because the user may be
199
- // composing the change in multiple `set` calls.
200
- const prevModelId = prev && prev.provider !== "main-native" ? prev.model_id : "";
201
- const prevEffort = prev && prev.provider !== "main-native" ? prev.effort : undefined;
202
- const nextSpec = {
203
- provider,
204
- model_id: prevModelId,
205
- ...(prevEffort !== undefined ? { effort: prevEffort } : {}),
206
- };
207
- config.subagent = nextSpec;
208
- return { ok: true, config };
209
- }
210
- function setSubagentModelId(config, rawValue) {
211
- if (rawValue.length === 0) {
212
- return {
213
- ok: false,
214
- error: "subagent.model_id cannot be empty.",
215
- };
216
- }
217
- const prev = config.subagent;
218
- if (!prev || prev.provider === "main-native") {
219
- return {
220
- ok: false,
221
- error: "subagent.model_id can only be set when subagent.provider is codex. " +
222
- "Set subagent.provider first, or use `onto config edit`.",
223
- };
224
- }
225
- // Type narrowing: prev.provider is ForeignProvider here, so model_id is required.
226
- config.subagent = {
227
- provider: prev.provider,
228
- model_id: rawValue,
229
- ...(prev.effort !== undefined ? { effort: prev.effort } : {}),
230
- };
231
- return { ok: true, config };
232
- }
233
- function setSubagentEffort(config, rawValue) {
234
- if (rawValue.length === 0) {
235
- return {
236
- ok: false,
237
- error: "subagent.effort cannot be empty (omit the field to clear it).",
238
- };
239
- }
240
- const prev = config.subagent;
241
- if (!prev || prev.provider === "main-native") {
242
- return {
243
- ok: false,
244
- error: "subagent.effort can only be set when subagent.provider is a foreign provider. " +
245
- "For main-native, effort is host-managed (not expressible in OntoReviewConfig).",
246
- };
247
- }
248
- config.subagent = {
249
- provider: prev.provider,
250
- model_id: prev.model_id,
251
- effort: rawValue,
252
- };
253
- return { ok: true, config };
254
- }
255
- function setMaxConcurrentLenses(config, rawValue) {
256
- // Accept decimal integers only. Reject floats, hex, negative, zero.
257
- if (!/^\d+$/.test(rawValue)) {
258
- return {
259
- ok: false,
260
- error: `max_concurrent_lenses must be a positive decimal integer (got "${rawValue}").`,
261
- };
262
- }
263
- const n = Number.parseInt(rawValue, 10);
264
- if (n < 1) {
265
- return {
266
- ok: false,
267
- error: "max_concurrent_lenses must be >= 1.",
268
- };
269
- }
270
- config.max_concurrent_lenses = n;
271
- return { ok: true, config };
272
- }
273
- function setLensDeliberation(config, rawValue) {
274
- if (!LENS_DELIBERATION_VALUES.includes(rawValue)) {
275
- return {
276
- ok: false,
277
- error: `lens_deliberation must be one of: ${LENS_DELIBERATION_VALUES.join(", ")} (got "${rawValue}").`,
278
- };
279
- }
280
- config.lens_deliberation = rawValue;
281
- return { ok: true, config };
282
- }
283
- // ---------------------------------------------------------------------------
284
- // Helpers
285
- // ---------------------------------------------------------------------------
286
- function isSupportedPath(path) {
287
- return SUPPORTED_SET_PATHS.includes(path);
288
- }