onto-mcp 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (447) hide show
  1. package/.onto/authority/core-lens-registry.yaml +134 -0
  2. package/.onto/authority/core-lexicon.yaml +1562 -0
  3. package/.onto/authority/diagnostic-codes.yaml +94 -0
  4. package/.onto/domains/accounting/competency_qs.md +384 -0
  5. package/.onto/domains/accounting/concepts.md +186 -0
  6. package/.onto/domains/accounting/conciseness_rules.md +160 -0
  7. package/.onto/domains/accounting/dependency_rules.md +239 -0
  8. package/.onto/domains/accounting/domain_scope.md +213 -0
  9. package/.onto/domains/accounting/extension_cases.md +416 -0
  10. package/.onto/domains/accounting/logic_rules.md +226 -0
  11. package/.onto/domains/accounting/structure_spec.md +298 -0
  12. package/.onto/domains/accounting-kr/competency_qs.md +562 -0
  13. package/.onto/domains/accounting-kr/concepts.md +187 -0
  14. package/.onto/domains/accounting-kr/conciseness_rules.md +125 -0
  15. package/.onto/domains/accounting-kr/dependency_rules.md +93 -0
  16. package/.onto/domains/accounting-kr/domain_scope.md +140 -0
  17. package/.onto/domains/accounting-kr/extension_cases.md +343 -0
  18. package/.onto/domains/accounting-kr/logic_rules.md +160 -0
  19. package/.onto/domains/accounting-kr/structure_spec.md +85 -0
  20. package/.onto/domains/business/competency_qs.md +263 -0
  21. package/.onto/domains/business/concepts.md +200 -0
  22. package/.onto/domains/business/conciseness_rules.md +135 -0
  23. package/.onto/domains/business/dependency_rules.md +113 -0
  24. package/.onto/domains/business/domain_scope.md +240 -0
  25. package/.onto/domains/business/extension_cases.md +249 -0
  26. package/.onto/domains/business/logic_rules.md +134 -0
  27. package/.onto/domains/business/structure_spec.md +114 -0
  28. package/.onto/domains/finance/competency_qs.md +362 -0
  29. package/.onto/domains/finance/concepts.md +194 -0
  30. package/.onto/domains/finance/conciseness_rules.md +155 -0
  31. package/.onto/domains/finance/dependency_rules.md +171 -0
  32. package/.onto/domains/finance/domain_scope.md +215 -0
  33. package/.onto/domains/finance/extension_cases.md +350 -0
  34. package/.onto/domains/finance/logic_rules.md +191 -0
  35. package/.onto/domains/finance/structure_spec.md +182 -0
  36. package/.onto/domains/llm-native-development/competency_qs.md +430 -0
  37. package/.onto/domains/llm-native-development/concepts.md +242 -0
  38. package/.onto/domains/llm-native-development/conciseness_rules.md +163 -0
  39. package/.onto/domains/llm-native-development/dependency_rules.md +216 -0
  40. package/.onto/domains/llm-native-development/domain_scope.md +197 -0
  41. package/.onto/domains/llm-native-development/extension_cases.md +474 -0
  42. package/.onto/domains/llm-native-development/logic_rules.md +123 -0
  43. package/.onto/domains/llm-native-development/prompt_interface.md +49 -0
  44. package/.onto/domains/llm-native-development/structure_spec.md +245 -0
  45. package/.onto/domains/market-intelligence/competency_qs.md +274 -0
  46. package/.onto/domains/market-intelligence/concepts.md +233 -0
  47. package/.onto/domains/market-intelligence/conciseness_rules.md +165 -0
  48. package/.onto/domains/market-intelligence/dependency_rules.md +197 -0
  49. package/.onto/domains/market-intelligence/domain_scope.md +231 -0
  50. package/.onto/domains/market-intelligence/extension_cases.md +425 -0
  51. package/.onto/domains/market-intelligence/logic_rules.md +247 -0
  52. package/.onto/domains/market-intelligence/structure_spec.md +209 -0
  53. package/.onto/domains/ontology/competency_qs.md +394 -0
  54. package/.onto/domains/ontology/concepts.md +172 -0
  55. package/.onto/domains/ontology/conciseness_rules.md +134 -0
  56. package/.onto/domains/ontology/dependency_rules.md +125 -0
  57. package/.onto/domains/ontology/domain_scope.md +114 -0
  58. package/.onto/domains/ontology/extension_cases.md +501 -0
  59. package/.onto/domains/ontology/logic_rules.md +114 -0
  60. package/.onto/domains/ontology/problem_framing_profile.md +67 -0
  61. package/.onto/domains/ontology/structure_spec.md +115 -0
  62. package/.onto/domains/palantir-foundry/RESEARCH_NOTES.md +911 -0
  63. package/.onto/domains/palantir-foundry/competency_qs.md +191 -0
  64. package/.onto/domains/palantir-foundry/competitive_comparison.md +329 -0
  65. package/.onto/domains/palantir-foundry/concepts.md +197 -0
  66. package/.onto/domains/palantir-foundry/conciseness_rules.md +245 -0
  67. package/.onto/domains/palantir-foundry/dependency_rules.md +135 -0
  68. package/.onto/domains/palantir-foundry/domain_scope.md +395 -0
  69. package/.onto/domains/palantir-foundry/extension_cases.md +210 -0
  70. package/.onto/domains/palantir-foundry/logic_rules.md +172 -0
  71. package/.onto/domains/palantir-foundry/structure_spec.md +291 -0
  72. package/.onto/domains/software-engineering/competency_qs.md +538 -0
  73. package/.onto/domains/software-engineering/concepts.md +238 -0
  74. package/.onto/domains/software-engineering/conciseness_rules.md +167 -0
  75. package/.onto/domains/software-engineering/dependency_rules.md +216 -0
  76. package/.onto/domains/software-engineering/domain_scope.md +183 -0
  77. package/.onto/domains/software-engineering/extension_cases.md +551 -0
  78. package/.onto/domains/software-engineering/logic_rules.md +240 -0
  79. package/.onto/domains/software-engineering/problem_framing_profile.md +68 -0
  80. package/.onto/domains/software-engineering/structure_spec.md +185 -0
  81. package/.onto/domains/ui-design/competency_qs.md +567 -0
  82. package/.onto/domains/ui-design/concepts.md +194 -0
  83. package/.onto/domains/ui-design/conciseness_rules.md +190 -0
  84. package/.onto/domains/ui-design/dependency_rules.md +323 -0
  85. package/.onto/domains/ui-design/domain_scope.md +340 -0
  86. package/.onto/domains/ui-design/extension_cases.md +563 -0
  87. package/.onto/domains/ui-design/logic_rules.md +349 -0
  88. package/.onto/domains/ui-design/structure_spec.md +252 -0
  89. package/.onto/domains/visual-design/competency_qs.md +472 -0
  90. package/.onto/domains/visual-design/concepts.md +147 -0
  91. package/.onto/domains/visual-design/conciseness_rules.md +186 -0
  92. package/.onto/domains/visual-design/dependency_rules.md +282 -0
  93. package/.onto/domains/visual-design/domain_scope.md +290 -0
  94. package/.onto/domains/visual-design/extension_cases.md +480 -0
  95. package/.onto/domains/visual-design/logic_rules.md +232 -0
  96. package/.onto/domains/visual-design/structure_spec.md +213 -0
  97. package/.onto/principles/llm-native-development-guideline.md +401 -0
  98. package/.onto/principles/llm-runtime-interface-principles.md +665 -0
  99. package/.onto/principles/non-specialist-communication-guideline.md +74 -0
  100. package/.onto/principles/ontology-as-code-guideline.md +243 -0
  101. package/.onto/principles/ontology-as-code-naming-charter.md +130 -0
  102. package/.onto/principles/product-locality-principle.md +129 -0
  103. package/.onto/principles/productization-charter.md +569 -0
  104. package/.onto/processes/evolve/material-kind-adapter-contract.md +113 -0
  105. package/.onto/processes/reconstruct/reconstruct-boundary-contract.md +366 -0
  106. package/.onto/processes/reconstruct/source-profile-contract.md +107 -0
  107. package/.onto/processes/reconstruct/source-profiles/code.md +72 -0
  108. package/.onto/processes/reconstruct/source-profiles/database.md +74 -0
  109. package/.onto/processes/reconstruct/source-profiles/document.md +71 -0
  110. package/.onto/processes/reconstruct/source-profiles/spreadsheet.md +79 -0
  111. package/.onto/processes/review/binding-contract.md +270 -0
  112. package/.onto/processes/review/execution-preparation-artifacts.md +281 -0
  113. package/.onto/processes/review/interpretation-contract.md +245 -0
  114. package/.onto/processes/review/issue-stance-deliberation-contract.md +761 -0
  115. package/.onto/processes/review/lens-prompt-contract.md +402 -0
  116. package/.onto/processes/review/lens-registry.md +127 -0
  117. package/.onto/processes/review/pre-dispatch-contracts.md +428 -0
  118. package/.onto/processes/review/productized-live-path.md +398 -0
  119. package/.onto/processes/review/prompt-execution-runner-contract.md +187 -0
  120. package/.onto/processes/review/record-contract.md +427 -0
  121. package/.onto/processes/review/record-field-mapping.md +337 -0
  122. package/.onto/processes/review/review-context-manifest-contract.md +356 -0
  123. package/.onto/processes/review/review-execution-ux-contract.md +809 -0
  124. package/.onto/processes/review/review-target-profile-contract.md +259 -0
  125. package/.onto/processes/review/shared-phenomenon-contract.md +129 -0
  126. package/.onto/processes/review/synthesize-prompt-contract.md +343 -0
  127. package/.onto/processes/shared/target-material-kind-contract.md +198 -0
  128. package/.onto/roles/axiology.md +81 -0
  129. package/.onto/roles/conciseness.md +36 -0
  130. package/.onto/roles/coverage.md +34 -0
  131. package/.onto/roles/dependency.md +37 -0
  132. package/.onto/roles/evolution.md +35 -0
  133. package/.onto/roles/logic.md +104 -0
  134. package/.onto/roles/pragmatics.md +32 -0
  135. package/.onto/roles/semantics.md +36 -0
  136. package/.onto/roles/structure.md +33 -0
  137. package/.onto/roles/synthesize.md +92 -0
  138. package/AGENTS.md +240 -0
  139. package/CLAUDE.md +39 -0
  140. package/README.md +287 -0
  141. package/bin/onto +92 -0
  142. package/dist/cli.js +101 -0
  143. package/dist/core-api/reconstruct-api.js +222 -0
  144. package/dist/core-api/review-api.js +1271 -0
  145. package/dist/core-runtime/cli/assemble-review-record.js +431 -0
  146. package/dist/core-runtime/cli/bootstrap-review-binding.js +186 -0
  147. package/dist/core-runtime/cli/codex-nested-dispatch.js +226 -0
  148. package/dist/core-runtime/cli/codex-nested-dispatch.test.js +390 -0
  149. package/dist/core-runtime/cli/codex-nested-teamlead-executor.js +464 -0
  150. package/dist/core-runtime/cli/codex-nested-teamlead-executor.test.js +335 -0
  151. package/dist/core-runtime/cli/codex-review-unit-executor.js +228 -0
  152. package/dist/core-runtime/cli/complete-review-session.js +64 -0
  153. package/dist/core-runtime/cli/complexity-assessment.js +153 -0
  154. package/dist/core-runtime/cli/coordinator-helpers.js +583 -0
  155. package/dist/core-runtime/cli/coordinator-state-machine-deliberation.test.js +167 -0
  156. package/dist/core-runtime/cli/coordinator-state-machine.js +794 -0
  157. package/dist/core-runtime/cli/e2e-codex-multi-agent-fixes.test.js +615 -0
  158. package/dist/core-runtime/cli/e2e-start-review-session.test.js +312 -0
  159. package/dist/core-runtime/cli/health.js +44 -0
  160. package/dist/core-runtime/cli/inline-http-review-unit-executor.js +656 -0
  161. package/dist/core-runtime/cli/inline-http-review-unit-executor.test.js +567 -0
  162. package/dist/core-runtime/cli/materialize-review-execution-preparation.js +104 -0
  163. package/dist/core-runtime/cli/materialize-review-prompt-packets.js +952 -0
  164. package/dist/core-runtime/cli/migrate-session-roots.js +118 -0
  165. package/dist/core-runtime/cli/mock-review-unit-executor.js +285 -0
  166. package/dist/core-runtime/cli/onto-tools.js +369 -0
  167. package/dist/core-runtime/cli/prepare-review-session.js +272 -0
  168. package/dist/core-runtime/cli/render-review-final-output.js +350 -0
  169. package/dist/core-runtime/cli/repo-layout-migration-replace.smoke.test.js +106 -0
  170. package/dist/core-runtime/cli/review-invoke-auto-resolution.test.js +268 -0
  171. package/dist/core-runtime/cli/review-invoke-coordinator-topology.test.js +136 -0
  172. package/dist/core-runtime/cli/review-invoke-resolver-caching.test.js +201 -0
  173. package/dist/core-runtime/cli/review-invoke-topology-dispatch.test.js +192 -0
  174. package/dist/core-runtime/cli/review-invoke.js +2030 -0
  175. package/dist/core-runtime/cli/run-review-prompt-execution.js +2152 -0
  176. package/dist/core-runtime/cli/session-root-guard.js +168 -0
  177. package/dist/core-runtime/cli/spawn-watcher.js +173 -0
  178. package/dist/core-runtime/cli/spawn-watcher.test.js +457 -0
  179. package/dist/core-runtime/cli/start-review-session.js +68 -0
  180. package/dist/core-runtime/cli/strip-wrapping-code-fence.js +56 -0
  181. package/dist/core-runtime/cli/strip-wrapping-code-fence.test.js +79 -0
  182. package/dist/core-runtime/cli/teamcreate-lens-deliberation-executor.js +412 -0
  183. package/dist/core-runtime/cli/teamcreate-lens-deliberation-executor.test.js +351 -0
  184. package/dist/core-runtime/cli/topology-executor-mapping.js +139 -0
  185. package/dist/core-runtime/cli/topology-executor-mapping.test.js +173 -0
  186. package/dist/core-runtime/cli/write-review-interpretation.js +81 -0
  187. package/dist/core-runtime/config/onto-config-cli.js +278 -0
  188. package/dist/core-runtime/config/onto-config-key-path.js +288 -0
  189. package/dist/core-runtime/config/onto-config-key-path.test.js +195 -0
  190. package/dist/core-runtime/config/onto-config-preview.js +108 -0
  191. package/dist/core-runtime/config/onto-config-preview.test.js +132 -0
  192. package/dist/core-runtime/discovery/config-chain.js +118 -0
  193. package/dist/core-runtime/discovery/config-chain.test.js +103 -0
  194. package/dist/core-runtime/discovery/config-profile.js +199 -0
  195. package/dist/core-runtime/discovery/config-profile.test.js +233 -0
  196. package/dist/core-runtime/discovery/host-detection.js +33 -0
  197. package/dist/core-runtime/discovery/host-detection.test.js +186 -0
  198. package/dist/core-runtime/discovery/installation-paths.js +21 -0
  199. package/dist/core-runtime/discovery/installation-paths.test.js +65 -0
  200. package/dist/core-runtime/discovery/lens-registry.js +60 -0
  201. package/dist/core-runtime/discovery/lens-registry.test.js +81 -0
  202. package/dist/core-runtime/discovery/onto-home.js +71 -0
  203. package/dist/core-runtime/discovery/path-normalization.js +28 -0
  204. package/dist/core-runtime/discovery/path-normalization.test.js +22 -0
  205. package/dist/core-runtime/discovery/plugin-path.js +72 -0
  206. package/dist/core-runtime/discovery/plugin-path.test.js +95 -0
  207. package/dist/core-runtime/discovery/project-root.js +47 -0
  208. package/dist/core-runtime/discovery/settings-chain.js +353 -0
  209. package/dist/core-runtime/discovery/walk-up.js +17 -0
  210. package/dist/core-runtime/evolve/adapters/code-product/compile/compile-defense.js +344 -0
  211. package/dist/core-runtime/evolve/adapters/code-product/compile/compile-defense.test.js +915 -0
  212. package/dist/core-runtime/evolve/adapters/code-product/compile/compile.js +564 -0
  213. package/dist/core-runtime/evolve/adapters/code-product/compile/compile.test.js +708 -0
  214. package/dist/core-runtime/evolve/adapters/code-product/parsers/brief-parser.js +165 -0
  215. package/dist/core-runtime/evolve/adapters/code-product/parsers/brief-parser.test.js +227 -0
  216. package/dist/core-runtime/evolve/adapters/code-product/validators/validate.js +59 -0
  217. package/dist/core-runtime/evolve/adapters/code-product/validators/validate.test.js +205 -0
  218. package/dist/core-runtime/evolve/adapters/methodology/adapter.js +16 -0
  219. package/dist/core-runtime/evolve/adapters/methodology/adapter.test.js +9 -0
  220. package/dist/core-runtime/evolve/adapters/methodology/perspectives/authority-consistency.js +298 -0
  221. package/dist/core-runtime/evolve/adapters/methodology/perspectives/authority-consistency.test.js +70 -0
  222. package/dist/core-runtime/evolve/adapters/methodology/scope-types/process.js +46 -0
  223. package/dist/core-runtime/evolve/adapters/methodology/scope-types/process.test.js +73 -0
  224. package/dist/core-runtime/evolve/adapters/registry.js +47 -0
  225. package/dist/core-runtime/evolve/adapters/registry.test.js +67 -0
  226. package/dist/core-runtime/evolve/cli.js +256 -0
  227. package/dist/core-runtime/evolve/commands/align.js +194 -0
  228. package/dist/core-runtime/evolve/commands/align.test.js +82 -0
  229. package/dist/core-runtime/evolve/commands/apply.js +161 -0
  230. package/dist/core-runtime/evolve/commands/apply.test.js +138 -0
  231. package/dist/core-runtime/evolve/commands/close.js +39 -0
  232. package/dist/core-runtime/evolve/commands/close.test.js +99 -0
  233. package/dist/core-runtime/evolve/commands/defer.js +40 -0
  234. package/dist/core-runtime/evolve/commands/defer.test.js +134 -0
  235. package/dist/core-runtime/evolve/commands/draft.js +323 -0
  236. package/dist/core-runtime/evolve/commands/draft.test.js +178 -0
  237. package/dist/core-runtime/evolve/commands/e2e-evolve-full-cycle.test.js +208 -0
  238. package/dist/core-runtime/evolve/commands/error-messages.js +125 -0
  239. package/dist/core-runtime/evolve/commands/error-messages.test.js +167 -0
  240. package/dist/core-runtime/evolve/commands/propose-align.js +222 -0
  241. package/dist/core-runtime/evolve/commands/propose-align.test.js +136 -0
  242. package/dist/core-runtime/evolve/commands/reconstruct.js +330 -0
  243. package/dist/core-runtime/evolve/commands/reconstruct.test.js +278 -0
  244. package/dist/core-runtime/evolve/commands/shared.js +22 -0
  245. package/dist/core-runtime/evolve/commands/stale-check.js +103 -0
  246. package/dist/core-runtime/evolve/commands/stale-check.test.js +84 -0
  247. package/dist/core-runtime/evolve/commands/start.js +887 -0
  248. package/dist/core-runtime/evolve/commands/start.test.js +396 -0
  249. package/dist/core-runtime/evolve/config/project-config.js +99 -0
  250. package/dist/core-runtime/evolve/config/project-config.test.js +170 -0
  251. package/dist/core-runtime/evolve/renderers/align-packet.js +280 -0
  252. package/dist/core-runtime/evolve/renderers/align-packet.test.js +332 -0
  253. package/dist/core-runtime/evolve/renderers/draft-packet.js +303 -0
  254. package/dist/core-runtime/evolve/renderers/draft-packet.test.js +377 -0
  255. package/dist/core-runtime/evolve/renderers/format.js +5 -0
  256. package/dist/core-runtime/evolve/renderers/scope-md.js +237 -0
  257. package/dist/core-runtime/evolve/renderers/scope-md.test.js +306 -0
  258. package/dist/core-runtime/govern/cli.js +369 -0
  259. package/dist/core-runtime/govern/cli.test.js +314 -0
  260. package/dist/core-runtime/govern/drift-engine.js +103 -0
  261. package/dist/core-runtime/govern/drift-engine.test.js +319 -0
  262. package/dist/core-runtime/govern/promote-principle.js +206 -0
  263. package/dist/core-runtime/govern/promote-principle.test.js +368 -0
  264. package/dist/core-runtime/govern/queue.js +81 -0
  265. package/dist/core-runtime/govern/types.js +16 -0
  266. package/dist/core-runtime/install/cli.js +530 -0
  267. package/dist/core-runtime/install/detect.js +128 -0
  268. package/dist/core-runtime/install/detect.test.js +155 -0
  269. package/dist/core-runtime/install/gitignore-update.js +74 -0
  270. package/dist/core-runtime/install/gitignore-update.test.js +64 -0
  271. package/dist/core-runtime/install/install-integration.test.js +373 -0
  272. package/dist/core-runtime/install/prompts.js +389 -0
  273. package/dist/core-runtime/install/prompts.test.js +293 -0
  274. package/dist/core-runtime/install/types.js +26 -0
  275. package/dist/core-runtime/install/validation.js +295 -0
  276. package/dist/core-runtime/install/validation.test.js +313 -0
  277. package/dist/core-runtime/install/writer.js +254 -0
  278. package/dist/core-runtime/install/writer.test.js +218 -0
  279. package/dist/core-runtime/learning/extractor.js +461 -0
  280. package/dist/core-runtime/learning/feedback.js +179 -0
  281. package/dist/core-runtime/learning/health-report.js +165 -0
  282. package/dist/core-runtime/learning/health-report.test.js +169 -0
  283. package/dist/core-runtime/learning/loader.js +388 -0
  284. package/dist/core-runtime/learning/loader.test.js +102 -0
  285. package/dist/core-runtime/learning/promote/apply-state.js +240 -0
  286. package/dist/core-runtime/learning/promote/audit-obligation.js +195 -0
  287. package/dist/core-runtime/learning/promote/collector.js +432 -0
  288. package/dist/core-runtime/learning/promote/degraded-state.js +125 -0
  289. package/dist/core-runtime/learning/promote/domain-doc-proposer.js +166 -0
  290. package/dist/core-runtime/learning/promote/e2e-promote.test.js +6385 -0
  291. package/dist/core-runtime/learning/promote/health-snapshot.js +150 -0
  292. package/dist/core-runtime/learning/promote/insight-reclassifier.js +544 -0
  293. package/dist/core-runtime/learning/promote/judgment-auditor.js +517 -0
  294. package/dist/core-runtime/learning/promote/panel-reviewer.js +1158 -0
  295. package/dist/core-runtime/learning/promote/promote-executor.js +1675 -0
  296. package/dist/core-runtime/learning/promote/promoter.js +307 -0
  297. package/dist/core-runtime/learning/promote/retirement.js +122 -0
  298. package/dist/core-runtime/learning/promote/types.js +23 -0
  299. package/dist/core-runtime/learning/prompt-sections.js +51 -0
  300. package/dist/core-runtime/learning/shared/artifact-registry-init.js +45 -0
  301. package/dist/core-runtime/learning/shared/artifact-registry.js +254 -0
  302. package/dist/core-runtime/learning/shared/audit-obligation-kernel.js +73 -0
  303. package/dist/core-runtime/learning/shared/audit-state.js +99 -0
  304. package/dist/core-runtime/learning/shared/duplicate-check.js +28 -0
  305. package/dist/core-runtime/learning/shared/llm-caller.js +831 -0
  306. package/dist/core-runtime/learning/shared/llm-caller.test.js +601 -0
  307. package/dist/core-runtime/learning/shared/llm-tool-loop.js +393 -0
  308. package/dist/core-runtime/learning/shared/mode.js +25 -0
  309. package/dist/core-runtime/learning/shared/paths.js +84 -0
  310. package/dist/core-runtime/learning/shared/paths.test.js +79 -0
  311. package/dist/core-runtime/learning/shared/patterns.js +37 -0
  312. package/dist/core-runtime/learning/shared/recoverability.js +355 -0
  313. package/dist/core-runtime/learning/shared/recovery-context.js +374 -0
  314. package/dist/core-runtime/learning/shared/scope.js +1 -0
  315. package/dist/core-runtime/learning/shared/semantic-classifier.js +94 -0
  316. package/dist/core-runtime/learning/shared/specs/apply-execution-state-spec.js +42 -0
  317. package/dist/core-runtime/learning/shared/specs/audit-state-spec.js +37 -0
  318. package/dist/core-runtime/learning/shared/specs/backup-metadata-spec.js +39 -0
  319. package/dist/core-runtime/learning/shared/specs/emergency-log-spec.js +41 -0
  320. package/dist/core-runtime/learning/shared/specs/layout-version-spec.js +38 -0
  321. package/dist/core-runtime/learning/shared/specs/promote-decisions-spec.js +43 -0
  322. package/dist/core-runtime/learning/shared/specs/promote-report-spec.js +113 -0
  323. package/dist/core-runtime/learning/shared/specs/prune-log-spec.js +36 -0
  324. package/dist/core-runtime/learning/shared/specs/recovery-resolution-spec.js +48 -0
  325. package/dist/core-runtime/learning/shared/specs/restore-manifest-spec.js +43 -0
  326. package/dist/core-runtime/learning/shared/specs/spec-helpers.js +64 -0
  327. package/dist/core-runtime/learning/usage-tracker.js +190 -0
  328. package/dist/core-runtime/learning/usage-tracker.test.js +176 -0
  329. package/dist/core-runtime/llm/llm-caller.js +649 -0
  330. package/dist/core-runtime/llm/llm-tool-loop.js +401 -0
  331. package/dist/core-runtime/llm/model-switcher.js +62 -0
  332. package/dist/core-runtime/logger.js +22 -0
  333. package/dist/core-runtime/onboard/detect-review-axes.js +122 -0
  334. package/dist/core-runtime/onboard/detect-review-axes.test.js +127 -0
  335. package/dist/core-runtime/onboard/write-review-block.js +188 -0
  336. package/dist/core-runtime/onboard/write-review-block.test.js +240 -0
  337. package/dist/core-runtime/readers/brownfield-builder.js +150 -0
  338. package/dist/core-runtime/readers/brownfield-builder.test.js +136 -0
  339. package/dist/core-runtime/readers/code-chunk-collector.js +53 -0
  340. package/dist/core-runtime/readers/code-chunk-collector.test.js +136 -0
  341. package/dist/core-runtime/readers/file-utils.js +240 -0
  342. package/dist/core-runtime/readers/file-utils.test.js +146 -0
  343. package/dist/core-runtime/readers/lexicon-citation-check.js +93 -0
  344. package/dist/core-runtime/readers/lexicon-citation-check.test.js +77 -0
  345. package/dist/core-runtime/readers/mcp-figma.js +30 -0
  346. package/dist/core-runtime/readers/mcp-figma.test.js +82 -0
  347. package/dist/core-runtime/readers/mcp-generic.js +31 -0
  348. package/dist/core-runtime/readers/mcp-generic.test.js +76 -0
  349. package/dist/core-runtime/readers/ontology-index.js +148 -0
  350. package/dist/core-runtime/readers/ontology-index.test.js +245 -0
  351. package/dist/core-runtime/readers/ontology-query.js +168 -0
  352. package/dist/core-runtime/readers/ontology-query.test.js +311 -0
  353. package/dist/core-runtime/readers/ontology-resolve.js +48 -0
  354. package/dist/core-runtime/readers/ontology-resolve.test.js +48 -0
  355. package/dist/core-runtime/readers/patterns/index.js +7 -0
  356. package/dist/core-runtime/readers/review-log.js +213 -0
  357. package/dist/core-runtime/readers/review-log.test.js +313 -0
  358. package/dist/core-runtime/readers/scan-local.js +102 -0
  359. package/dist/core-runtime/readers/scan-local.test.js +102 -0
  360. package/dist/core-runtime/readers/scan-tarball.js +121 -0
  361. package/dist/core-runtime/readers/scan-tarball.test.js +283 -0
  362. package/dist/core-runtime/readers/scan-vault.js +34 -0
  363. package/dist/core-runtime/readers/scan-vault.test.js +81 -0
  364. package/dist/core-runtime/readers/types.js +42 -0
  365. package/dist/core-runtime/readers/types.test.js +94 -0
  366. package/dist/core-runtime/readers/viewpoint-collectors.js +229 -0
  367. package/dist/core-runtime/reconstruct/artifact-types.js +1 -0
  368. package/dist/core-runtime/reconstruct/directive-validation.js +123 -0
  369. package/dist/core-runtime/reconstruct/materialize-preparation.js +251 -0
  370. package/dist/core-runtime/reconstruct/record.js +198 -0
  371. package/dist/core-runtime/reconstruct/run.js +578 -0
  372. package/dist/core-runtime/reconstruct/seed-candidate-validation.js +356 -0
  373. package/dist/core-runtime/reconstruct/source-observations.js +62 -0
  374. package/dist/core-runtime/reconstruct/source-profiles.js +73 -0
  375. package/dist/core-runtime/release-channel/release-channel.js +90 -0
  376. package/dist/core-runtime/review/artifact-types.js +13 -0
  377. package/dist/core-runtime/review/citation-audit.js +204 -0
  378. package/dist/core-runtime/review/citation-audit.test.js +165 -0
  379. package/dist/core-runtime/review/controlled-lens-deliberation.js +125 -0
  380. package/dist/core-runtime/review/execution-plan-resolver.js +247 -0
  381. package/dist/core-runtime/review/execution-plan-resolver.test.js +243 -0
  382. package/dist/core-runtime/review/execution-topology-resolver-axis-first.test.js +246 -0
  383. package/dist/core-runtime/review/execution-topology-resolver.js +401 -0
  384. package/dist/core-runtime/review/execution-topology-resolver.test.js +315 -0
  385. package/dist/core-runtime/review/failure-records.js +57 -0
  386. package/dist/core-runtime/review/inline-context-embedder.js +141 -0
  387. package/dist/core-runtime/review/inline-context-embedder.test.js +154 -0
  388. package/dist/core-runtime/review/issue-artifact-runtime.js +859 -0
  389. package/dist/core-runtime/review/legacy-mode-policy.js +88 -0
  390. package/dist/core-runtime/review/lens-completion-policy.js +17 -0
  391. package/dist/core-runtime/review/materializers-effort-persist.test.js +79 -0
  392. package/dist/core-runtime/review/materializers.js +963 -0
  393. package/dist/core-runtime/review/ontology-path-classifier.js +179 -0
  394. package/dist/core-runtime/review/ontology-path-classifier.test.js +216 -0
  395. package/dist/core-runtime/review/packet-boundary-policy.js +215 -0
  396. package/dist/core-runtime/review/packet-boundary-policy.test.js +107 -0
  397. package/dist/core-runtime/review/participating-lens-paths.js +61 -0
  398. package/dist/core-runtime/review/participating-lens-paths.test.js +73 -0
  399. package/dist/core-runtime/review/review-artifact-utils.js +287 -0
  400. package/dist/core-runtime/review/review-config-legacy-translate.js +244 -0
  401. package/dist/core-runtime/review/review-config-legacy-translate.test.js +161 -0
  402. package/dist/core-runtime/review/review-config-validator.js +289 -0
  403. package/dist/core-runtime/review/review-config-validator.test.js +236 -0
  404. package/dist/core-runtime/review/review-execution-profile.js +193 -0
  405. package/dist/core-runtime/review/review-execution-route.js +52 -0
  406. package/dist/core-runtime/review/review-progress-contract.js +123 -0
  407. package/dist/core-runtime/review/review-record-validation.js +251 -0
  408. package/dist/core-runtime/review/review-result-classification.js +379 -0
  409. package/dist/core-runtime/review/review-state-machine.js +39 -0
  410. package/dist/core-runtime/review/route-visibility.js +125 -0
  411. package/dist/core-runtime/review/shape-pipeline-audit.test.js +311 -0
  412. package/dist/core-runtime/review/shape-to-topology-id.js +117 -0
  413. package/dist/core-runtime/review/shape-to-topology-id.test.js +132 -0
  414. package/dist/core-runtime/review/topology-shape-derivation.js +155 -0
  415. package/dist/core-runtime/review/topology-shape-derivation.test.js +195 -0
  416. package/dist/core-runtime/scope-runtime/constants.js +12 -0
  417. package/dist/core-runtime/scope-runtime/constraint-pool.js +166 -0
  418. package/dist/core-runtime/scope-runtime/constraint-pool.test.js +674 -0
  419. package/dist/core-runtime/scope-runtime/domain-validation-log.js +135 -0
  420. package/dist/core-runtime/scope-runtime/domain-validation-log.test.js +156 -0
  421. package/dist/core-runtime/scope-runtime/eval-persistence.js +65 -0
  422. package/dist/core-runtime/scope-runtime/eval-persistence.test.js +84 -0
  423. package/dist/core-runtime/scope-runtime/event-pipeline.js +64 -0
  424. package/dist/core-runtime/scope-runtime/event-pipeline.test.js +450 -0
  425. package/dist/core-runtime/scope-runtime/event-store.js +39 -0
  426. package/dist/core-runtime/scope-runtime/event-store.test.js +95 -0
  427. package/dist/core-runtime/scope-runtime/gate-guard.js +348 -0
  428. package/dist/core-runtime/scope-runtime/gate-guard.test.js +1047 -0
  429. package/dist/core-runtime/scope-runtime/hash.js +4 -0
  430. package/dist/core-runtime/scope-runtime/hash.test.js +33 -0
  431. package/dist/core-runtime/scope-runtime/id.js +4 -0
  432. package/dist/core-runtime/scope-runtime/id.test.js +17 -0
  433. package/dist/core-runtime/scope-runtime/reducer.js +297 -0
  434. package/dist/core-runtime/scope-runtime/reducer.test.js +759 -0
  435. package/dist/core-runtime/scope-runtime/scope-manager.js +161 -0
  436. package/dist/core-runtime/scope-runtime/state-machine.js +309 -0
  437. package/dist/core-runtime/scope-runtime/state-machine.test.js +704 -0
  438. package/dist/core-runtime/scope-runtime/types.js +116 -0
  439. package/dist/core-runtime/scope-runtime/types.test.js +69 -0
  440. package/dist/core-runtime/target-material-kind.js +256 -0
  441. package/dist/core-runtime/translate/render-for-user.js +169 -0
  442. package/dist/core-runtime/translate/render-for-user.test.js +122 -0
  443. package/dist/mcp/server.js +1011 -0
  444. package/dist/mcp/tool-schemas.js +93 -0
  445. package/dist/providers/capability-contract.js +1 -0
  446. package/package.json +68 -0
  447. package/settings.example.json +33 -0
@@ -0,0 +1,81 @@
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
+ });
@@ -0,0 +1,278 @@
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
+ }
@@ -0,0 +1,288 @@
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
+ }