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,168 @@
1
+ /**
2
+ * Session Root Guard — DD-8 (Step 11a).
3
+ *
4
+ * Design authority:
5
+ * - learn-phase3-design-v9.md DD-8 (.layout-version.yaml + runtime gate)
6
+ * - learn-phase3-design-v5.md DD-8 (UF-SYN-05/06 — marker rename + version gate)
7
+ * - learn-phase3-design-v4.md DD-8 (case taxonomy: new user / legacy / mixed)
8
+ *
9
+ * Responsibility:
10
+ * - Inspect `<projectRoot>/.onto/.layout-version.yaml` and decide whether
11
+ * the session layout is ready for Phase 3 commands (promote /
12
+ * reclassify-insights / migrate-session-roots).
13
+ * - Detect legacy session directories that match the pre-v3 pattern
14
+ * (`.onto/sessions/{id}/` directly, no `review/` subdir).
15
+ * - Surface 4 cases with deterministic actions:
16
+ * 1. New user (no marker, no legacy) → write marker, allow
17
+ * 2. Legacy + no marker → MigrationRequiredError
18
+ * 3. Marker present + legacy still exists → warn but allow (operator
19
+ * should re-run migration)
20
+ * 4. Marker present + no legacy → allow
21
+ * - Reject the marker when its layout_version doesn't match SUPPORTED.
22
+ *
23
+ * Modes:
24
+ * - "enforce" (default): write marker on first run, throw on legacy.
25
+ * - "inspect": pure read, no I/O writes, no throw. Used by diagnostics
26
+ * that should not trigger migration as a side effect.
27
+ *
28
+ * Why a separate module:
29
+ * - Phase 3 commands (promote, reclassify-insights) call this from src/cli.ts
30
+ * before doing anything else, so the gate is the first thing they hit.
31
+ * - The migrate-session-roots command also uses inspectMigrationStatus()
32
+ * to compute what would be migrated.
33
+ */
34
+ import fs from "node:fs";
35
+ import path from "node:path";
36
+ import { REGISTRY } from "../learning/shared/artifact-registry.js";
37
+ // ---------------------------------------------------------------------------
38
+ // Constants
39
+ // ---------------------------------------------------------------------------
40
+ export const SUPPORTED_LAYOUT_VERSION = "v3";
41
+ export const LAYOUT_MARKER_FILENAME = ".layout-version.yaml";
42
+ const KNOWN_SESSION_SUBDIRS = ["review", "promote", "reclassify-insights"];
43
+ /** Legacy session id pattern: YYYYMMDD-{6+ hex}. */
44
+ const LEGACY_SESSION_PATTERN = /^\d{8}-[a-f0-9]{6,}$/;
45
+ // ---------------------------------------------------------------------------
46
+ // Path helpers
47
+ // ---------------------------------------------------------------------------
48
+ export function getLayoutMarkerPath(projectRoot) {
49
+ return path.join(projectRoot, ".onto", LAYOUT_MARKER_FILENAME);
50
+ }
51
+ export function getSessionsDir(projectRoot) {
52
+ return path.join(projectRoot, ".onto", "sessions");
53
+ }
54
+ /**
55
+ * Pure read of layout marker + legacy directory enumeration.
56
+ *
57
+ * Performs no I/O writes and never throws on missing files. The caller
58
+ * decides what to do with the resulting status.
59
+ */
60
+ export function inspectMigrationStatus(projectRoot) {
61
+ const markerPath = getLayoutMarkerPath(projectRoot);
62
+ const status = {
63
+ marker_present: false,
64
+ marker_path: markerPath,
65
+ marker_compatible: false,
66
+ marker_layout_version: null,
67
+ legacy_session_count: 0,
68
+ legacy_session_ids: [],
69
+ };
70
+ if (fs.existsSync(markerPath)) {
71
+ status.marker_present = true;
72
+ try {
73
+ const marker = REGISTRY.loadFromFile("layout_version", markerPath);
74
+ status.marker_layout_version = marker.layout_version;
75
+ status.marker_compatible = marker.layout_version === SUPPORTED_LAYOUT_VERSION;
76
+ }
77
+ catch {
78
+ // Marker file exists but is malformed. Treat as incompatible.
79
+ status.marker_compatible = false;
80
+ }
81
+ }
82
+ const sessionsDir = getSessionsDir(projectRoot);
83
+ if (fs.existsSync(sessionsDir)) {
84
+ const entries = fs.readdirSync(sessionsDir, { withFileTypes: true });
85
+ const legacy = entries.filter((e) => e.isDirectory() &&
86
+ !KNOWN_SESSION_SUBDIRS.includes(e.name) &&
87
+ LEGACY_SESSION_PATTERN.test(e.name));
88
+ status.legacy_session_count = legacy.length;
89
+ status.legacy_session_ids = legacy.map((e) => e.name).sort();
90
+ }
91
+ return status;
92
+ }
93
+ // ---------------------------------------------------------------------------
94
+ // Marker writer
95
+ // ---------------------------------------------------------------------------
96
+ export function writeLayoutMarker(projectRoot) {
97
+ const markerPath = getLayoutMarkerPath(projectRoot);
98
+ fs.mkdirSync(path.dirname(markerPath), { recursive: true });
99
+ const marker = {
100
+ schema_version: "1",
101
+ layout_version: SUPPORTED_LAYOUT_VERSION,
102
+ written_at: new Date().toISOString(),
103
+ };
104
+ REGISTRY.saveToFile("layout_version", markerPath, marker);
105
+ }
106
+ // ---------------------------------------------------------------------------
107
+ // Errors
108
+ // ---------------------------------------------------------------------------
109
+ export class MigrationRequiredError extends Error {
110
+ status;
111
+ constructor(message, status) {
112
+ super(message);
113
+ this.status = status;
114
+ this.name = "MigrationRequiredError";
115
+ }
116
+ }
117
+ export class IncompatibleLayoutError extends Error {
118
+ status;
119
+ constructor(message, status) {
120
+ super(message);
121
+ this.status = status;
122
+ this.name = "IncompatibleLayoutError";
123
+ }
124
+ }
125
+ /**
126
+ * Phase 3 command entry guard. Call from src/cli.ts BEFORE any promote /
127
+ * reclassify-insights / promote --apply / migrate-session-roots subcommand.
128
+ *
129
+ * Returns the inspected status so callers can log or branch on it.
130
+ *
131
+ * Throws:
132
+ * - `MigrationRequiredError` when legacy sessions exist without a marker
133
+ * (case 2). The operator must run `onto migrate-session-roots`.
134
+ * - `IncompatibleLayoutError` when the marker exists but its
135
+ * layout_version is not the supported one (forward-compat guard).
136
+ */
137
+ export function ensureSessionRootsMigrated(projectRoot, mode = "enforce") {
138
+ const status = inspectMigrationStatus(projectRoot);
139
+ if (mode === "inspect")
140
+ return status;
141
+ // Case 1: new user — write marker and allow.
142
+ if (!status.marker_present && status.legacy_session_count === 0) {
143
+ writeLayoutMarker(projectRoot);
144
+ return inspectMigrationStatus(projectRoot);
145
+ }
146
+ // Case 2: legacy + no marker — hard fail.
147
+ if (!status.marker_present && status.legacy_session_count > 0) {
148
+ const sample = status.legacy_session_ids.slice(0, 5).join(", ");
149
+ const more = status.legacy_session_count > 5
150
+ ? ` ... and ${status.legacy_session_count - 5} more`
151
+ : "";
152
+ throw new MigrationRequiredError(`Legacy session roots detected (${status.legacy_session_count} session(s)). ` +
153
+ `Run 'onto migrate-session-roots' before continuing.\n` +
154
+ `Affected: ${sample}${more}`, status);
155
+ }
156
+ // Case 3: marker present + legacy still exists — warn (re-run migration).
157
+ if (status.marker_present && status.legacy_session_count > 0) {
158
+ process.stderr.write(`[onto] warning: ${status.legacy_session_count} legacy session(s) found ` +
159
+ `despite layout marker. Re-run 'onto migrate-session-roots' to clean up.\n`);
160
+ }
161
+ // Case 4: marker present + no legacy → check version compat.
162
+ if (status.marker_present && !status.marker_compatible) {
163
+ throw new IncompatibleLayoutError(`Layout marker version "${status.marker_layout_version}" is not ` +
164
+ `supported (expected "${SUPPORTED_LAYOUT_VERSION}"). ` +
165
+ `Upgrade Phase 3 tooling or restore a compatible marker.`, status);
166
+ }
167
+ return status;
168
+ }
@@ -0,0 +1,173 @@
1
+ import { spawnSync } from "node:child_process";
2
+ import fs from "node:fs";
3
+ import path from "node:path";
4
+ /**
5
+ * Attempt to spawn the onto:review live watcher in a side pane / split / new tab
6
+ * using the most appropriate terminal multiplexer detected from the environment.
7
+ *
8
+ * Detection priority (most universal first):
9
+ * 1. tmux (any OS, via $TMUX env var) — splits the pane identified by
10
+ * `$TMUX_PANE` so the watcher stays beside the invoking pane even if
11
+ * the user has switched panes during startReviewSession.
12
+ * 2. iTerm2 on macOS (via $TERM_PROGRAM === 'iTerm.app') — targets the
13
+ * session identified by `$ITERM_SESSION_ID`, which is inherited from
14
+ * the invoking session at process start, so splits land beside the
15
+ * pane that actually launched onto:review. If the env var is missing
16
+ * or no matching session is found, the spawn is refused (returns
17
+ * spawned: false) rather than falling back to the currently-focused
18
+ * tab — a default target would land the watcher on whichever tab happens to
19
+ * be frontmost at spawn time, which is the bug this path exists to
20
+ * avoid.
21
+ * 3. Apple Terminal on macOS (via $TERM_PROGRAM === 'Apple_Terminal')
22
+ * — best effort; Terminal.app lacks a stable session identifier, so
23
+ * the spawn opens a new tab rather than a tab-targeted split.
24
+ *
25
+ * `sessionRoot` is required. It is passed through to the watcher script as
26
+ * an explicit argument, which bypasses the `.onto/review/.latest-session`
27
+ * pointer and therefore avoids the cross-session race that the global
28
+ * pointer would otherwise create under concurrent review invocations.
29
+ *
30
+ * Returns silently with `spawned: false` if no supported mechanism is found.
31
+ * The caller should print an explicit recovery hint in that case.
32
+ *
33
+ * This function never throws — it returns a result object instead, so the
34
+ * runtime continues even if the spawn fails.
35
+ */
36
+ export function spawnWatcherPane(projectRoot, sessionRoot, ontoHome) {
37
+ // Resolution order for the watcher helper:
38
+ // 1. <projectRoot>/scripts/onto-review-watch.sh — co-located with the
39
+ // review target (onto repo invocations, full-repo projects).
40
+ // 2. <ontoHome>/scripts/onto-review-watch.sh — install-local script when
41
+ // projectRoot is an isolated workspace and the watcher helper lives in
42
+ // the repo home.
43
+ // Without the install-local script branch, any invocation with --project-root pointed at a
44
+ // non-repo location silently degrades to "watcher script not found"
45
+ // (observed 2026-04-22 self-review finding). The two-slot search keeps
46
+ // deterministic wrappers viable without forcing them to symlink or copy.
47
+ const candidates = [
48
+ path.join(projectRoot, "scripts", "onto-review-watch.sh"),
49
+ ];
50
+ if (ontoHome && ontoHome !== projectRoot) {
51
+ candidates.push(path.join(ontoHome, "scripts", "onto-review-watch.sh"));
52
+ }
53
+ const watcherScript = candidates.find((c) => fs.existsSync(c));
54
+ if (!watcherScript) {
55
+ return { spawned: false, reason: "watcher script not found" };
56
+ }
57
+ const watcherArgs = `bash "${watcherScript}" "${sessionRoot}"`;
58
+ // Dry-run mode: detect the mechanism that would be used and report it,
59
+ // but skip the actual tmux/osascript spawn call. Intended for smoke
60
+ // tests and CI that want to cover the detection-priority regressions
61
+ // without producing a visible side pane or extra terminal tab on every
62
+ // run. Enabled via `ONTO_WATCHER_DRY_RUN=1`.
63
+ const dryRun = process.env.ONTO_WATCHER_DRY_RUN === "1";
64
+ // Priority 1: tmux (works on any OS, most universal)
65
+ if (process.env.TMUX) {
66
+ if (dryRun) {
67
+ return { spawned: true, mechanism: "tmux", dry_run: true };
68
+ }
69
+ try {
70
+ // Target the originating pane explicitly via $TMUX_PANE so the split
71
+ // does not land on whichever pane happens to be active at spawn time.
72
+ const tmuxArgs = ["split-window", "-h", "-l", "60"];
73
+ const originPane = process.env.TMUX_PANE;
74
+ if (originPane) {
75
+ tmuxArgs.push("-t", originPane);
76
+ }
77
+ tmuxArgs.push(watcherArgs);
78
+ const result = spawnSync("tmux", tmuxArgs, { stdio: "ignore" });
79
+ if (result.status === 0) {
80
+ // Refocus original pane so user keeps typing in Claude Code / shell
81
+ spawnSync("tmux", ["select-pane", "-l"], { stdio: "ignore" });
82
+ return { spawned: true, mechanism: "tmux" };
83
+ }
84
+ }
85
+ catch {
86
+ // fall through
87
+ }
88
+ }
89
+ // Priority 2: iTerm2 on macOS
90
+ // Target the originating session via $ITERM_SESSION_ID (inherited at
91
+ // process start), so the split lands beside the pane that launched
92
+ // onto:review even if the user has since switched tabs or windows.
93
+ //
94
+ // Format note: $ITERM_SESSION_ID is `wXtYpZ:UUID` but AppleScript's
95
+ // `id of session` returns the UUID only. We compare both forms to stay
96
+ // robust across iTerm2 builds, and require the script to print an
97
+ // explicit "matched" sentinel before reporting success. If no match
98
+ // (e.g. the originating tab has been closed, or the env var is absent),
99
+ // we return spawned: false and let the caller print the manual hint —
100
+ // splitting into `current session of current tab` would land on whatever
101
+ // tab happens to be focused at spawn time, which is not the intended UX.
102
+ if (process.platform === "darwin" &&
103
+ process.env.TERM_PROGRAM === "iTerm.app") {
104
+ const rawSessionId = process.env.ITERM_SESSION_ID;
105
+ if (rawSessionId) {
106
+ if (dryRun) {
107
+ return { spawned: true, mechanism: "iterm2", dry_run: true };
108
+ }
109
+ try {
110
+ const sessionUuid = rawSessionId.includes(":")
111
+ ? (rawSessionId.split(":").pop() ?? rawSessionId)
112
+ : rawSessionId;
113
+ const escapedCmd = watcherArgs
114
+ .replace(/\\/g, "\\\\")
115
+ .replace(/"/g, '\\"');
116
+ const escapedFull = rawSessionId
117
+ .replace(/\\/g, "\\\\")
118
+ .replace(/"/g, '\\"');
119
+ const escapedUuid = sessionUuid
120
+ .replace(/\\/g, "\\\\")
121
+ .replace(/"/g, '\\"');
122
+ const script = `tell application "iTerm2"\n` +
123
+ ` repeat with w in windows\n` +
124
+ ` repeat with t in tabs of w\n` +
125
+ ` repeat with s in sessions of t\n` +
126
+ ` if (id of s is "${escapedUuid}") or (id of s is "${escapedFull}") then\n` +
127
+ ` tell s\n` +
128
+ ` split vertically with default profile command "${escapedCmd}"\n` +
129
+ ` end tell\n` +
130
+ ` return "matched"\n` +
131
+ ` end if\n` +
132
+ ` end repeat\n` +
133
+ ` end repeat\n` +
134
+ ` end repeat\n` +
135
+ ` return "no-match"\n` +
136
+ `end tell`;
137
+ const result = spawnSync("osascript", ["-e", script], {
138
+ encoding: "utf8",
139
+ });
140
+ if (result.status === 0 && result.stdout.trim() === "matched") {
141
+ return { spawned: true, mechanism: "iterm2" };
142
+ }
143
+ }
144
+ catch {
145
+ // fall through
146
+ }
147
+ }
148
+ }
149
+ // Priority 3: Apple Terminal on macOS
150
+ if (process.platform === "darwin" &&
151
+ process.env.TERM_PROGRAM === "Apple_Terminal") {
152
+ if (dryRun) {
153
+ return { spawned: true, mechanism: "apple_terminal", dry_run: true };
154
+ }
155
+ try {
156
+ const escapedCmd = watcherArgs.replace(/\\/g, "\\\\").replace(/"/g, '\\"');
157
+ const script = `tell application "Terminal"\n` +
158
+ ` do script "${escapedCmd}"\n` +
159
+ `end tell`;
160
+ const result = spawnSync("osascript", ["-e", script], { stdio: "ignore" });
161
+ if (result.status === 0) {
162
+ return { spawned: true, mechanism: "apple_terminal" };
163
+ }
164
+ }
165
+ catch {
166
+ // fall through
167
+ }
168
+ }
169
+ return {
170
+ spawned: false,
171
+ reason: "no supported terminal multiplexer detected (tmux, iTerm2, Apple Terminal)",
172
+ };
173
+ }