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,369 @@
1
+ /**
2
+ * Onto-defined LLM tools — Phase 3-2 of host runtime decoupling.
3
+ *
4
+ * # What this module is
5
+ *
6
+ * A small toolkit of three file-system inspection tools (`read_file`,
7
+ * `list_directory`, `search_content`) exposed to LLMs that support function
8
+ * calling. The TS process executes each tool call locally and returns the
9
+ * result back to the LLM, enabling a multi-turn loop where the LLM can
10
+ * iteratively explore files within a fixed boundary.
11
+ *
12
+ * # Why it exists
13
+ *
14
+ * Phase 2 inline embedding loads ALL referenced content into the prompt up
15
+ * front. This wastes tokens when the LLM only needs a small slice, and it
16
+ * caps the LLM's exploration to whatever the packet writer pre-selected.
17
+ *
18
+ * Phase 3-2 introduces tool-native execution: instead of inlining everything,
19
+ * we expose a small read-only API and let the LLM ask for what it needs. This
20
+ * matches how worker contexts already work, but using
21
+ * onto-owned tools that the TS process executes — so the same review pipeline
22
+ * can drive any function-calling-capable LLM (Anthropic, OpenAI, Qwen 30B+,
23
+ * etc.) without depending on a host-provided tool ecosystem.
24
+ *
25
+ * # How it relates
26
+ *
27
+ * - `inline-http-review-unit-executor.ts` decides between inline (Tier 2) and
28
+ * tool-native (Tier 1) modes based on `--tool-mode`.
29
+ * - `llm-tool-loop.ts` runs the multi-turn loop by translating OntoTool[] into
30
+ * provider-specific tool schemas (Anthropic vs OpenAI Chat Completions).
31
+ * - The Boundary Policy enforced here is the runtime guarantee. The packet's
32
+ * "Boundary Policy" section is descriptive — this code is normative.
33
+ *
34
+ * # Boundary policy
35
+ *
36
+ * Every tool call is constrained to:
37
+ * 1. Path must resolve INSIDE projectRoot or ontoHome (no escapes via `..`).
38
+ * 2. Symlinks pointing outside the boundary are rejected.
39
+ * 3. Files larger than MAX_FILE_BYTES are read partially with a truncation
40
+ * marker (no error — LLM gets best-effort content + signal).
41
+ * 4. search_content matches are capped at MAX_SEARCH_MATCHES.
42
+ * 5. Hidden directories (.git, node_modules, .onto/sessions) are skipped
43
+ * from list_directory and search_content traversal — they pollute output
44
+ * and are rarely the answer.
45
+ *
46
+ * Boundary violations throw `BoundaryViolationError`. The tool loop catches
47
+ * this and returns the error message to the LLM as the tool result, so the
48
+ * LLM can adapt its next call rather than the entire run failing.
49
+ */
50
+ import fs from "node:fs/promises";
51
+ import path from "node:path";
52
+ const MAX_FILE_BYTES = 1024 * 1024; // 1 MB hard cap per read
53
+ const MAX_FILE_LINES = 2000; // Truncation default for read_file
54
+ const MAX_LIST_ENTRIES = 200; // Per directory
55
+ const MAX_SEARCH_MATCHES = 100; // Total matches per search_content call
56
+ const MAX_SEARCH_TRAVERSAL = 10_000; // File-count safety brake on traversal
57
+ // Always-skipped directory names. .onto is NOT in this set; it is gated
58
+ // per-call via ToolExecutionContext.allowOntoTraversal so synthesize runs
59
+ // can discover lens outputs under .onto/review/<session>/round1 while normal
60
+ // lens runs still avoid the noise of session artifacts.
61
+ const ALWAYS_SKIP_DIR_NAMES = new Set([
62
+ ".git",
63
+ "node_modules",
64
+ "dist",
65
+ "build",
66
+ ".next",
67
+ ".turbo",
68
+ "__pycache__",
69
+ ]);
70
+ function shouldSkipDir(name, ctx) {
71
+ if (ALWAYS_SKIP_DIR_NAMES.has(name))
72
+ return true;
73
+ if (name === ".onto" && !ctx.allowOntoTraversal)
74
+ return true;
75
+ return false;
76
+ }
77
+ export class BoundaryViolationError extends Error {
78
+ constructor(message) {
79
+ super(message);
80
+ this.name = "BoundaryViolationError";
81
+ }
82
+ }
83
+ // ---------------------------------------------------------------------------
84
+ // Path resolution + boundary guard
85
+ // ---------------------------------------------------------------------------
86
+ /**
87
+ * Resolve a user-supplied path against projectRoot/ontoHome and verify it
88
+ * stays inside one of those roots. Returns the absolute path on success.
89
+ *
90
+ * Why both roots: lenses commonly need to read domain docs from ~/.onto/
91
+ * (ontoHome) and source files from the project. Either is in-bounds; anything
92
+ * else is not.
93
+ *
94
+ * Resolution rules:
95
+ * - Absolute paths are accepted as-is (then verified against boundary).
96
+ * - `~/...` expands relative to ontoHome's parent (the user's home dir).
97
+ * We do NOT call os.homedir() — ontoHome's parent is the canonical seat.
98
+ * - Relative paths resolve against projectRoot.
99
+ */
100
+ function resolveInBoundary(rawPath, ctx) {
101
+ if (typeof rawPath !== "string" || rawPath.length === 0) {
102
+ throw new BoundaryViolationError("path must be a non-empty string");
103
+ }
104
+ let candidate;
105
+ if (rawPath.startsWith("~/")) {
106
+ const home = path.dirname(ctx.ontoHome);
107
+ candidate = path.resolve(home, rawPath.slice(2));
108
+ }
109
+ else if (path.isAbsolute(rawPath)) {
110
+ candidate = path.resolve(rawPath);
111
+ }
112
+ else {
113
+ candidate = path.resolve(ctx.projectRoot, rawPath);
114
+ }
115
+ const inProject = isWithin(candidate, ctx.projectRoot);
116
+ const inOntoHome = isWithin(candidate, ctx.ontoHome);
117
+ if (!inProject && !inOntoHome) {
118
+ throw new BoundaryViolationError(`path "${rawPath}" resolves to "${candidate}", which is outside projectRoot (${ctx.projectRoot}) and ontoHome (${ctx.ontoHome}).`);
119
+ }
120
+ return candidate;
121
+ }
122
+ function isWithin(child, parent) {
123
+ const rel = path.relative(parent, child);
124
+ return rel === "" || (!rel.startsWith("..") && !path.isAbsolute(rel));
125
+ }
126
+ // ---------------------------------------------------------------------------
127
+ // Tool 1: read_file
128
+ // ---------------------------------------------------------------------------
129
+ const READ_FILE_TOOL = {
130
+ name: "read_file",
131
+ description: "Read a UTF-8 text file from the project or ontoHome. Returns up to 2000 lines (or 1 MB) per call. Use start_line / end_line to read a slice of large files.",
132
+ input_schema: {
133
+ type: "object",
134
+ properties: {
135
+ path: {
136
+ type: "string",
137
+ description: "Absolute path, ~/-prefixed home path, or path relative to projectRoot. Must resolve inside projectRoot or ontoHome.",
138
+ },
139
+ start_line: {
140
+ type: "number",
141
+ description: "Optional 1-indexed first line (inclusive). Default: 1.",
142
+ },
143
+ end_line: {
144
+ type: "number",
145
+ description: "Optional 1-indexed last line (inclusive). Default: start_line + 2000.",
146
+ },
147
+ },
148
+ required: ["path"],
149
+ },
150
+ async execute(args, ctx) {
151
+ const target = resolveInBoundary(String(args["path"] ?? ""), ctx);
152
+ const stat = await fs.stat(target);
153
+ if (!stat.isFile()) {
154
+ throw new BoundaryViolationError(`"${args["path"]}" is not a regular file.`);
155
+ }
156
+ const startLine = clampPositive(args["start_line"], 1);
157
+ const requestedEnd = optionalPositive(args["end_line"]);
158
+ const endLine = requestedEnd ?? startLine + MAX_FILE_LINES - 1;
159
+ if (endLine < startLine) {
160
+ throw new Error("end_line must be >= start_line");
161
+ }
162
+ if (endLine - startLine + 1 > MAX_FILE_LINES) {
163
+ throw new Error(`Requested range exceeds MAX_FILE_LINES (${MAX_FILE_LINES}). Narrow start_line/end_line.`);
164
+ }
165
+ // Stream-read up to MAX_FILE_BYTES so we never blow the heap on huge files.
166
+ const handle = await fs.open(target, "r");
167
+ try {
168
+ const buffer = Buffer.alloc(Math.min(stat.size, MAX_FILE_BYTES));
169
+ await handle.read(buffer, 0, buffer.length, 0);
170
+ const text = buffer.toString("utf8");
171
+ const lines = text.split("\n");
172
+ const sliced = lines.slice(startLine - 1, endLine);
173
+ const truncated = stat.size > MAX_FILE_BYTES || lines.length > endLine || lines.length < (requestedEnd ?? lines.length);
174
+ const header = `# ${path.relative(ctx.projectRoot, target) || target} (lines ${startLine}-${startLine + sliced.length - 1} of ${lines.length})`;
175
+ const body = sliced.join("\n");
176
+ const trailer = truncated
177
+ ? `\n\n<!-- truncated: file has ${lines.length} lines, ${stat.size} bytes; this view limited to MAX_FILE_LINES=${MAX_FILE_LINES} / MAX_FILE_BYTES=${MAX_FILE_BYTES} -->`
178
+ : "";
179
+ return `${header}\n${body}${trailer}`;
180
+ }
181
+ finally {
182
+ await handle.close();
183
+ }
184
+ },
185
+ };
186
+ // ---------------------------------------------------------------------------
187
+ // Tool 2: list_directory
188
+ // ---------------------------------------------------------------------------
189
+ const LIST_DIRECTORY_TOOL = {
190
+ name: "list_directory",
191
+ description: "List entries (files and subdirectories) in a directory inside projectRoot or ontoHome. Always skips .git, node_modules, dist, build. Skips .onto unless allowOntoTraversal is set in the execution context (synthesize unit). Returns up to 200 entries with [F]/[D] markers and byte sizes.",
192
+ input_schema: {
193
+ type: "object",
194
+ properties: {
195
+ path: {
196
+ type: "string",
197
+ description: "Absolute, ~/-prefixed, or projectRoot-relative directory path. Must resolve inside projectRoot or ontoHome.",
198
+ },
199
+ },
200
+ required: ["path"],
201
+ },
202
+ async execute(args, ctx) {
203
+ const target = resolveInBoundary(String(args["path"] ?? ""), ctx);
204
+ const stat = await fs.stat(target);
205
+ if (!stat.isDirectory()) {
206
+ throw new BoundaryViolationError(`"${args["path"]}" is not a directory.`);
207
+ }
208
+ const entries = await fs.readdir(target, { withFileTypes: true });
209
+ const filtered = entries.filter((e) => !shouldSkipDir(e.name, ctx));
210
+ const trimmed = filtered.slice(0, MAX_LIST_ENTRIES);
211
+ const lines = [
212
+ `# ${path.relative(ctx.projectRoot, target) || target} (${filtered.length} entries${filtered.length > MAX_LIST_ENTRIES ? `, showing first ${MAX_LIST_ENTRIES}` : ""})`,
213
+ ];
214
+ for (const entry of trimmed) {
215
+ const entryPath = path.join(target, entry.name);
216
+ if (entry.isDirectory()) {
217
+ lines.push(`[D] ${entry.name}/`);
218
+ }
219
+ else if (entry.isFile()) {
220
+ try {
221
+ const s = await fs.stat(entryPath);
222
+ lines.push(`[F] ${entry.name} (${s.size} bytes)`);
223
+ }
224
+ catch {
225
+ lines.push(`[F] ${entry.name} (size unavailable)`);
226
+ }
227
+ }
228
+ else {
229
+ lines.push(`[?] ${entry.name}`);
230
+ }
231
+ }
232
+ if (filtered.length > MAX_LIST_ENTRIES) {
233
+ lines.push(`<!-- ${filtered.length - MAX_LIST_ENTRIES} more entries elided -->`);
234
+ }
235
+ return lines.join("\n");
236
+ },
237
+ };
238
+ // ---------------------------------------------------------------------------
239
+ // Tool 3: search_content
240
+ // ---------------------------------------------------------------------------
241
+ const SEARCH_CONTENT_TOOL = {
242
+ name: "search_content",
243
+ description: "Search for a literal substring (case-sensitive by default) inside files under a directory. Returns up to 100 matches as 'path:line: <line>' tuples. Use this to locate references before deciding which file to read in full.",
244
+ input_schema: {
245
+ type: "object",
246
+ properties: {
247
+ pattern: {
248
+ type: "string",
249
+ description: "Literal substring to search for. Regex is NOT supported in this iteration — use plain text.",
250
+ },
251
+ path: {
252
+ type: "string",
253
+ description: "Optional directory to scope the search. Default: projectRoot. Must resolve inside projectRoot or ontoHome.",
254
+ },
255
+ case_insensitive: {
256
+ type: "boolean",
257
+ description: "Optional. Default: false (case-sensitive).",
258
+ },
259
+ },
260
+ required: ["pattern"],
261
+ },
262
+ async execute(args, ctx) {
263
+ const pattern = String(args["pattern"] ?? "");
264
+ if (pattern.length === 0) {
265
+ throw new Error("pattern must be a non-empty string");
266
+ }
267
+ const caseInsensitive = Boolean(args["case_insensitive"]);
268
+ const needle = caseInsensitive ? pattern.toLowerCase() : pattern;
269
+ const rawPath = typeof args["path"] === "string" && args["path"].length > 0
270
+ ? args["path"]
271
+ : ctx.projectRoot;
272
+ const root = resolveInBoundary(rawPath, ctx);
273
+ const stat = await fs.stat(root);
274
+ if (!stat.isDirectory()) {
275
+ throw new BoundaryViolationError(`search root "${rawPath}" is not a directory.`);
276
+ }
277
+ const matches = [];
278
+ const traversed = { count: 0 };
279
+ await walkAndSearch(root, needle, caseInsensitive, ctx, matches, traversed);
280
+ if (matches.length === 0) {
281
+ return `# search_content: no matches for "${pattern}" under ${path.relative(ctx.projectRoot, root) || root}`;
282
+ }
283
+ const limited = matches.slice(0, MAX_SEARCH_MATCHES);
284
+ const trailer = matches.length > MAX_SEARCH_MATCHES
285
+ ? `\n<!-- ${matches.length - MAX_SEARCH_MATCHES} additional matches elided; narrow path or pattern to see them -->`
286
+ : "";
287
+ return [
288
+ `# search_content: ${limited.length} match${limited.length === 1 ? "" : "es"} for "${pattern}"${traversed.count >= MAX_SEARCH_TRAVERSAL ? " (traversal cap hit)" : ""}`,
289
+ ...limited,
290
+ ].join("\n") + trailer;
291
+ },
292
+ };
293
+ async function walkAndSearch(dir, needle, caseInsensitive, ctx, matches, traversed) {
294
+ if (matches.length >= MAX_SEARCH_MATCHES)
295
+ return;
296
+ if (traversed.count >= MAX_SEARCH_TRAVERSAL)
297
+ return;
298
+ let entries;
299
+ try {
300
+ entries = await fs.readdir(dir, { withFileTypes: true });
301
+ }
302
+ catch {
303
+ return; // permission denied, missing — silently skip
304
+ }
305
+ for (const entry of entries) {
306
+ if (matches.length >= MAX_SEARCH_MATCHES)
307
+ return;
308
+ if (traversed.count >= MAX_SEARCH_TRAVERSAL)
309
+ return;
310
+ if (shouldSkipDir(entry.name, ctx))
311
+ continue;
312
+ const full = path.join(dir, entry.name);
313
+ if (entry.isDirectory()) {
314
+ await walkAndSearch(full, needle, caseInsensitive, ctx, matches, traversed);
315
+ }
316
+ else if (entry.isFile()) {
317
+ traversed.count++;
318
+ try {
319
+ const stat = await fs.stat(full);
320
+ if (stat.size > MAX_FILE_BYTES)
321
+ continue; // skip files we couldn't read in read_file either
322
+ const text = await fs.readFile(full, "utf8");
323
+ const lines = text.split("\n");
324
+ for (let i = 0; i < lines.length; i++) {
325
+ const line = lines[i] ?? "";
326
+ const haystack = caseInsensitive ? line.toLowerCase() : line;
327
+ if (haystack.includes(needle)) {
328
+ const rel = path.relative(ctx.projectRoot, full) || full;
329
+ matches.push(`${rel}:${i + 1}: ${line.trim().slice(0, 200)}`);
330
+ if (matches.length >= MAX_SEARCH_MATCHES)
331
+ return;
332
+ }
333
+ }
334
+ }
335
+ catch {
336
+ // binary or unreadable — skip
337
+ }
338
+ }
339
+ }
340
+ }
341
+ // ---------------------------------------------------------------------------
342
+ // Helpers
343
+ // ---------------------------------------------------------------------------
344
+ function clampPositive(value, defaultValue) {
345
+ if (typeof value !== "number" || !Number.isFinite(value) || value < 1)
346
+ return defaultValue;
347
+ return Math.floor(value);
348
+ }
349
+ function optionalPositive(value) {
350
+ if (typeof value !== "number" || !Number.isFinite(value) || value < 1)
351
+ return undefined;
352
+ return Math.floor(value);
353
+ }
354
+ // ---------------------------------------------------------------------------
355
+ // Public registry
356
+ // ---------------------------------------------------------------------------
357
+ /**
358
+ * The default tool set exposed to worker LLMs. Order matters only for
359
+ * prompt formatting (some providers list tools in declaration order in the
360
+ * system message) — keep the most-used tools first.
361
+ */
362
+ export const ONTO_DEFAULT_TOOLS = [
363
+ READ_FILE_TOOL,
364
+ LIST_DIRECTORY_TOOL,
365
+ SEARCH_CONTENT_TOOL,
366
+ ];
367
+ export function findToolByName(name) {
368
+ return ONTO_DEFAULT_TOOLS.find((t) => t.name === name);
369
+ }
@@ -0,0 +1,272 @@
1
+ #!/usr/bin/env node
2
+ import path from "node:path";
3
+ import { parseArgs } from "node:util";
4
+ import { pathToFileURL } from "node:url";
5
+ import { DEFAULT_DIRECTORY_LISTING_OPTIONS, hasOptionFlag, parseBooleanFlag, } from "../review/review-artifact-utils.js";
6
+ import { bootstrapInvocationBindingArtifacts, materializeReviewExecutionPreparationArtifacts, writeInvocationInterpretationArtifact, } from "../review/materializers.js";
7
+ import { printOntoReleaseChannelNotice } from "../release-channel/release-channel.js";
8
+ import { detectCodexEnvSignal } from "../discovery/host-detection.js";
9
+ import { resolveOntoHome } from "../discovery/onto-home.js";
10
+ import { resolveSettingsChain } from "../discovery/settings-chain.js";
11
+ function requireString(value, optionName) {
12
+ if (typeof value !== "string" || value.length === 0) {
13
+ throw new Error(`Missing required option --${optionName}`);
14
+ }
15
+ return value;
16
+ }
17
+ function optionalString(value) {
18
+ return typeof value === "string" ? value : "";
19
+ }
20
+ function requireTargetScopeKind(value) {
21
+ if (value === "file" || value === "directory" || value === "bundle") {
22
+ return value;
23
+ }
24
+ throw new Error(`Invalid target scope kind: ${value}`);
25
+ }
26
+ function requireReviewMode(value) {
27
+ if (value === "core-axis" || value === "full") {
28
+ return value;
29
+ }
30
+ throw new Error(`Invalid review mode: ${value}`);
31
+ }
32
+ function requireExecutionRealization(value) {
33
+ if (value === "worker" || value === "direct-call") {
34
+ return value;
35
+ }
36
+ throw new Error(`Invalid execution realization: ${value}`);
37
+ }
38
+ function normalizeHostRuntime(hostRuntimeValue) {
39
+ if (typeof hostRuntimeValue !== "string" || hostRuntimeValue.length === 0) {
40
+ return undefined;
41
+ }
42
+ if (hostRuntimeValue === "codex") {
43
+ return hostRuntimeValue;
44
+ }
45
+ if (hostRuntimeValue === "standalone" ||
46
+ hostRuntimeValue === "anthropic" ||
47
+ hostRuntimeValue === "openai" ||
48
+ hostRuntimeValue === "grok" ||
49
+ hostRuntimeValue === "lmstudio") {
50
+ return hostRuntimeValue;
51
+ }
52
+ throw new Error(`Invalid host runtime: ${hostRuntimeValue}`);
53
+ }
54
+ function detectHostRuntimeFromEnvironment() {
55
+ // Delegated to canonical seat. Same semantics as bootstrap-review-binding —
56
+ // returns undefined (not "standalone") when no signal is present, so caller
57
+ // can apply its own default.
58
+ if (detectCodexEnvSignal()) {
59
+ return "codex";
60
+ }
61
+ return undefined;
62
+ }
63
+ function resolveHostRuntime(argv, executionRealizationValue, hostRuntimeValue) {
64
+ const explicitHostRuntime = normalizeHostRuntime(hostRuntimeValue);
65
+ if (explicitHostRuntime) {
66
+ return explicitHostRuntime;
67
+ }
68
+ if (hasOptionFlag(argv, "codex")) {
69
+ return "codex";
70
+ }
71
+ const normalizedExecutionRealization = typeof executionRealizationValue === "string" && executionRealizationValue.length > 0
72
+ ? requireExecutionRealization(executionRealizationValue)
73
+ : undefined;
74
+ if (normalizedExecutionRealization) {
75
+ if (normalizedExecutionRealization === "worker")
76
+ return "codex";
77
+ return "standalone";
78
+ }
79
+ return detectHostRuntimeFromEnvironment() ?? "codex";
80
+ }
81
+ function resolveExecutionRealization(argv, executionRealizationValue, hostRuntime) {
82
+ if (typeof executionRealizationValue === "string" &&
83
+ executionRealizationValue.length > 0) {
84
+ return requireExecutionRealization(executionRealizationValue);
85
+ }
86
+ if (hasOptionFlag(argv, "codex")) {
87
+ return "worker";
88
+ }
89
+ if (hostRuntime === "codex")
90
+ return "worker";
91
+ return "direct-call";
92
+ }
93
+ function requireMaterializedInputKind(value) {
94
+ if (value === "single_text" ||
95
+ value === "directory_listing" ||
96
+ value === "bundle_member_texts") {
97
+ return value;
98
+ }
99
+ throw new Error(`Invalid materialized input kind: ${value}`);
100
+ }
101
+ function requireBoundaryAccessPolicy(value, optionName) {
102
+ if (value === "allowed" || value === "denied") {
103
+ return value;
104
+ }
105
+ throw new Error(`Invalid value for --${optionName}: ${value}`);
106
+ }
107
+ async function main() {
108
+ await printOntoReleaseChannelNotice();
109
+ return runPrepareReviewSessionCli(process.argv.slice(2));
110
+ }
111
+ export async function runPrepareReviewSessionCli(argv) {
112
+ const { values } = parseArgs({
113
+ options: {
114
+ "project-root": { type: "string", default: "." },
115
+ "onto-home": { type: "string" },
116
+ "session-id": { type: "string" },
117
+ "requested-target": { type: "string" },
118
+ "requested-domain-token": { type: "string", default: "" },
119
+ entrypoint: { type: "string", default: "review" },
120
+ "target-scope-kind": { type: "string" },
121
+ "primary-ref": { type: "string" },
122
+ "member-ref": { type: "string", multiple: true, default: [] },
123
+ "bundle-kind": { type: "string" },
124
+ "intent-summary": { type: "string" },
125
+ "domain-recommendation": { type: "string", default: "" },
126
+ "domain-selection-required": { type: "string", default: "true" },
127
+ "review-mode-recommendation": { type: "string" },
128
+ "always-include-lens-id": { type: "string", multiple: true, default: [] },
129
+ "recommended-lens-id": { type: "string", multiple: true, default: [] },
130
+ rationale: { type: "string", multiple: true, default: [] },
131
+ "ambiguity-note": { type: "string", multiple: true, default: [] },
132
+ "confirm-value-alignment": { type: "boolean", default: false },
133
+ "resolved-target-ref": { type: "string", multiple: true, default: [] },
134
+ "domain-final-value": { type: "string" },
135
+ "domain-selection-mode": { type: "string" },
136
+ "execution-realization": { type: "string" },
137
+ "execution-mode": { type: "string" },
138
+ "host-runtime": { type: "string" },
139
+ codex: { type: "boolean", default: false },
140
+ "review-mode": { type: "string" },
141
+ "lens-id": { type: "string", multiple: true, default: [] },
142
+ "binding-note": { type: "string", multiple: true, default: [] },
143
+ "web-research-policy": { type: "string", default: "denied" },
144
+ "repo-exploration-policy": { type: "string", default: "allowed" },
145
+ "recursive-reference-expansion-policy": {
146
+ type: "string",
147
+ default: "denied",
148
+ },
149
+ "filesystem-allowed-root": { type: "string", multiple: true, default: [] },
150
+ "materialized-kind": { type: "string" },
151
+ "materialized-ref": { type: "string", multiple: true, default: [] },
152
+ "system-purpose-ref": { type: "string", multiple: true, default: [] },
153
+ "domain-context-ref": { type: "string", multiple: true, default: [] },
154
+ "role-definition-ref": { type: "string", multiple: true, default: [] },
155
+ "execution-rule-ref": { type: "string", multiple: true, default: [] },
156
+ "excluded-name": { type: "string", multiple: true, default: [] },
157
+ "max-listing-depth": { type: "string" },
158
+ "max-listing-entries": { type: "string" },
159
+ "max-embed-lines": { type: "string" },
160
+ },
161
+ strict: true,
162
+ allowPositionals: false,
163
+ args: argv,
164
+ });
165
+ const targetScopeKind = requireTargetScopeKind(requireString(values["target-scope-kind"], "target-scope-kind"));
166
+ const resolvedTargetRefs = values["resolved-target-ref"];
167
+ if (resolvedTargetRefs.length === 0) {
168
+ throw new Error("At least one --resolved-target-ref is required.");
169
+ }
170
+ if (values["lens-id"].length === 0) {
171
+ throw new Error("At least one --lens-id is required.");
172
+ }
173
+ const hostRuntime = resolveHostRuntime(argv, values["execution-realization"] ?? values["execution-mode"], values["host-runtime"]);
174
+ const executionRealization = resolveExecutionRealization(argv, values["execution-realization"] ?? values["execution-mode"], hostRuntime);
175
+ const projectRoot = path.resolve(requireString(values["project-root"], "project-root"));
176
+ const ontoHome = resolveOntoHome(optionalString(values["onto-home"]) || undefined);
177
+ const ontoConfig = await resolveSettingsChain(ontoHome, projectRoot);
178
+ const bindingParams = {
179
+ projectRoot,
180
+ ontoConfig,
181
+ requestedTarget: requireString(values["requested-target"], "requested-target"),
182
+ requestedDomainToken: optionalString(values["requested-domain-token"]),
183
+ targetScopeKind,
184
+ resolvedTargetRefs,
185
+ domainRecommendation: optionalString(values["domain-recommendation"]),
186
+ domainFinalValue: requireString(values["domain-final-value"], "domain-final-value"),
187
+ domainSelectionMode: requireString(values["domain-selection-mode"], "domain-selection-mode"),
188
+ executionRealization,
189
+ hostRuntime,
190
+ reviewMode: requireReviewMode(requireString(values["review-mode"], "review-mode")),
191
+ resolvedLensIds: values["lens-id"],
192
+ webResearchPolicy: requireBoundaryAccessPolicy(requireString(values["web-research-policy"], "web-research-policy"), "web-research-policy"),
193
+ repoExplorationPolicy: requireBoundaryAccessPolicy(requireString(values["repo-exploration-policy"], "repo-exploration-policy"), "repo-exploration-policy"),
194
+ recursiveReferenceExpansionPolicy: requireBoundaryAccessPolicy(requireString(values["recursive-reference-expansion-policy"], "recursive-reference-expansion-policy"), "recursive-reference-expansion-policy"),
195
+ filesystemAllowedRoots: values["filesystem-allowed-root"],
196
+ bindingNotes: values["binding-note"],
197
+ ontoHome,
198
+ ...(typeof values["session-id"] === "string" && values["session-id"].length > 0
199
+ ? { sessionId: values["session-id"] }
200
+ : {}),
201
+ ...(typeof values["bundle-kind"] === "string" && values["bundle-kind"].length > 0
202
+ ? { bundleKind: values["bundle-kind"] }
203
+ : {}),
204
+ };
205
+ const { sessionRoot, sessionMetadataPath, bindingOutputPath } = await bootstrapInvocationBindingArtifacts(bindingParams);
206
+ const executionPlanPath = `${sessionRoot}/execution-plan.yaml`;
207
+ const interpretationParams = {
208
+ sessionRoot,
209
+ entrypoint: requireString(values.entrypoint, "entrypoint"),
210
+ targetScopeKind,
211
+ primaryRef: requireString(values["primary-ref"], "primary-ref"),
212
+ memberRefs: values["member-ref"],
213
+ intentSummary: requireString(values["intent-summary"], "intent-summary"),
214
+ domainRecommendation: optionalString(values["domain-recommendation"]),
215
+ domainSelectionRequired: parseBooleanFlag(values["domain-selection-required"], "domain-selection-required"),
216
+ reviewModeRecommendation: requireReviewMode(requireString(values["review-mode-recommendation"], "review-mode-recommendation")),
217
+ alwaysIncludeLensIds: values["always-include-lens-id"],
218
+ recommendedLensIds: values["recommended-lens-id"],
219
+ rationale: values.rationale,
220
+ ambiguityNotes: values["ambiguity-note"],
221
+ valueAlignmentConfirmed: Boolean(values["confirm-value-alignment"]),
222
+ ...(typeof values["bundle-kind"] === "string" && values["bundle-kind"].length > 0
223
+ ? { bundleKind: values["bundle-kind"] }
224
+ : {}),
225
+ };
226
+ const interpretationArtifactPath = await writeInvocationInterpretationArtifact(interpretationParams);
227
+ const directoryListingOptions = {
228
+ excluded_names: values["excluded-name"].length > 0
229
+ ? values["excluded-name"]
230
+ : DEFAULT_DIRECTORY_LISTING_OPTIONS.excluded_names,
231
+ max_depth: typeof values["max-listing-depth"] === "string"
232
+ ? Number.parseInt(values["max-listing-depth"], 10)
233
+ : DEFAULT_DIRECTORY_LISTING_OPTIONS.max_depth,
234
+ max_entries: typeof values["max-listing-entries"] === "string"
235
+ ? Number.parseInt(values["max-listing-entries"], 10)
236
+ : DEFAULT_DIRECTORY_LISTING_OPTIONS.max_entries,
237
+ };
238
+ const executionPreparationRoot = await materializeReviewExecutionPreparationArtifacts({
239
+ sessionRoot,
240
+ scopeKind: targetScopeKind,
241
+ resolvedTargetRefs,
242
+ materializedKind: requireMaterializedInputKind(requireString(values["materialized-kind"], "materialized-kind")),
243
+ requestedTarget: requireString(values["requested-target"], "requested-target"),
244
+ reviewIntentSummary: requireString(values["intent-summary"], "intent-summary"),
245
+ sessionDomain: requireString(values["domain-final-value"], "domain-final-value"),
246
+ filesystemAllowedRoots: values["filesystem-allowed-root"],
247
+ ...(typeof values["bundle-kind"] === "string" && values["bundle-kind"].length > 0
248
+ ? { bundleKind: values["bundle-kind"] }
249
+ : {}),
250
+ materializedRefs: values["materialized-ref"],
251
+ systemPurposeRefs: values["system-purpose-ref"],
252
+ domainContextRefs: values["domain-context-ref"],
253
+ roleDefinitionRefs: values["role-definition-ref"],
254
+ executionRuleRefs: values["execution-rule-ref"],
255
+ directoryListingOptions,
256
+ });
257
+ console.log(JSON.stringify({
258
+ session_root: sessionRoot,
259
+ interpretation_artifact_path: interpretationArtifactPath,
260
+ binding_output_path: bindingOutputPath,
261
+ session_metadata_path: sessionMetadataPath,
262
+ execution_plan_path: executionPlanPath,
263
+ execution_preparation_root: executionPreparationRoot,
264
+ }, null, 2));
265
+ return 0;
266
+ }
267
+ if (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) {
268
+ main().then((exitCode) => process.exit(exitCode), (error) => {
269
+ console.error(error instanceof Error ? error.message : String(error));
270
+ process.exit(1);
271
+ });
272
+ }