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.
- package/.onto/authority/core-lens-registry.yaml +134 -0
- package/.onto/authority/core-lexicon.yaml +1562 -0
- package/.onto/authority/diagnostic-codes.yaml +94 -0
- package/.onto/domains/accounting/competency_qs.md +384 -0
- package/.onto/domains/accounting/concepts.md +186 -0
- package/.onto/domains/accounting/conciseness_rules.md +160 -0
- package/.onto/domains/accounting/dependency_rules.md +239 -0
- package/.onto/domains/accounting/domain_scope.md +213 -0
- package/.onto/domains/accounting/extension_cases.md +416 -0
- package/.onto/domains/accounting/logic_rules.md +226 -0
- package/.onto/domains/accounting/structure_spec.md +298 -0
- package/.onto/domains/accounting-kr/competency_qs.md +562 -0
- package/.onto/domains/accounting-kr/concepts.md +187 -0
- package/.onto/domains/accounting-kr/conciseness_rules.md +125 -0
- package/.onto/domains/accounting-kr/dependency_rules.md +93 -0
- package/.onto/domains/accounting-kr/domain_scope.md +140 -0
- package/.onto/domains/accounting-kr/extension_cases.md +343 -0
- package/.onto/domains/accounting-kr/logic_rules.md +160 -0
- package/.onto/domains/accounting-kr/structure_spec.md +85 -0
- package/.onto/domains/business/competency_qs.md +263 -0
- package/.onto/domains/business/concepts.md +200 -0
- package/.onto/domains/business/conciseness_rules.md +135 -0
- package/.onto/domains/business/dependency_rules.md +113 -0
- package/.onto/domains/business/domain_scope.md +240 -0
- package/.onto/domains/business/extension_cases.md +249 -0
- package/.onto/domains/business/logic_rules.md +134 -0
- package/.onto/domains/business/structure_spec.md +114 -0
- package/.onto/domains/finance/competency_qs.md +362 -0
- package/.onto/domains/finance/concepts.md +194 -0
- package/.onto/domains/finance/conciseness_rules.md +155 -0
- package/.onto/domains/finance/dependency_rules.md +171 -0
- package/.onto/domains/finance/domain_scope.md +215 -0
- package/.onto/domains/finance/extension_cases.md +350 -0
- package/.onto/domains/finance/logic_rules.md +191 -0
- package/.onto/domains/finance/structure_spec.md +182 -0
- package/.onto/domains/llm-native-development/competency_qs.md +430 -0
- package/.onto/domains/llm-native-development/concepts.md +242 -0
- package/.onto/domains/llm-native-development/conciseness_rules.md +163 -0
- package/.onto/domains/llm-native-development/dependency_rules.md +216 -0
- package/.onto/domains/llm-native-development/domain_scope.md +197 -0
- package/.onto/domains/llm-native-development/extension_cases.md +474 -0
- package/.onto/domains/llm-native-development/logic_rules.md +123 -0
- package/.onto/domains/llm-native-development/prompt_interface.md +49 -0
- package/.onto/domains/llm-native-development/structure_spec.md +245 -0
- package/.onto/domains/market-intelligence/competency_qs.md +274 -0
- package/.onto/domains/market-intelligence/concepts.md +233 -0
- package/.onto/domains/market-intelligence/conciseness_rules.md +165 -0
- package/.onto/domains/market-intelligence/dependency_rules.md +197 -0
- package/.onto/domains/market-intelligence/domain_scope.md +231 -0
- package/.onto/domains/market-intelligence/extension_cases.md +425 -0
- package/.onto/domains/market-intelligence/logic_rules.md +247 -0
- package/.onto/domains/market-intelligence/structure_spec.md +209 -0
- package/.onto/domains/ontology/competency_qs.md +394 -0
- package/.onto/domains/ontology/concepts.md +172 -0
- package/.onto/domains/ontology/conciseness_rules.md +134 -0
- package/.onto/domains/ontology/dependency_rules.md +125 -0
- package/.onto/domains/ontology/domain_scope.md +114 -0
- package/.onto/domains/ontology/extension_cases.md +501 -0
- package/.onto/domains/ontology/logic_rules.md +114 -0
- package/.onto/domains/ontology/problem_framing_profile.md +67 -0
- package/.onto/domains/ontology/structure_spec.md +115 -0
- package/.onto/domains/palantir-foundry/RESEARCH_NOTES.md +911 -0
- package/.onto/domains/palantir-foundry/competency_qs.md +191 -0
- package/.onto/domains/palantir-foundry/competitive_comparison.md +329 -0
- package/.onto/domains/palantir-foundry/concepts.md +197 -0
- package/.onto/domains/palantir-foundry/conciseness_rules.md +245 -0
- package/.onto/domains/palantir-foundry/dependency_rules.md +135 -0
- package/.onto/domains/palantir-foundry/domain_scope.md +395 -0
- package/.onto/domains/palantir-foundry/extension_cases.md +210 -0
- package/.onto/domains/palantir-foundry/logic_rules.md +172 -0
- package/.onto/domains/palantir-foundry/structure_spec.md +291 -0
- package/.onto/domains/software-engineering/competency_qs.md +538 -0
- package/.onto/domains/software-engineering/concepts.md +238 -0
- package/.onto/domains/software-engineering/conciseness_rules.md +167 -0
- package/.onto/domains/software-engineering/dependency_rules.md +216 -0
- package/.onto/domains/software-engineering/domain_scope.md +183 -0
- package/.onto/domains/software-engineering/extension_cases.md +551 -0
- package/.onto/domains/software-engineering/logic_rules.md +240 -0
- package/.onto/domains/software-engineering/problem_framing_profile.md +68 -0
- package/.onto/domains/software-engineering/structure_spec.md +185 -0
- package/.onto/domains/ui-design/competency_qs.md +567 -0
- package/.onto/domains/ui-design/concepts.md +194 -0
- package/.onto/domains/ui-design/conciseness_rules.md +190 -0
- package/.onto/domains/ui-design/dependency_rules.md +323 -0
- package/.onto/domains/ui-design/domain_scope.md +340 -0
- package/.onto/domains/ui-design/extension_cases.md +563 -0
- package/.onto/domains/ui-design/logic_rules.md +349 -0
- package/.onto/domains/ui-design/structure_spec.md +252 -0
- package/.onto/domains/visual-design/competency_qs.md +472 -0
- package/.onto/domains/visual-design/concepts.md +147 -0
- package/.onto/domains/visual-design/conciseness_rules.md +186 -0
- package/.onto/domains/visual-design/dependency_rules.md +282 -0
- package/.onto/domains/visual-design/domain_scope.md +290 -0
- package/.onto/domains/visual-design/extension_cases.md +480 -0
- package/.onto/domains/visual-design/logic_rules.md +232 -0
- package/.onto/domains/visual-design/structure_spec.md +213 -0
- package/.onto/principles/llm-native-development-guideline.md +401 -0
- package/.onto/principles/llm-runtime-interface-principles.md +665 -0
- package/.onto/principles/non-specialist-communication-guideline.md +74 -0
- package/.onto/principles/ontology-as-code-guideline.md +243 -0
- package/.onto/principles/ontology-as-code-naming-charter.md +130 -0
- package/.onto/principles/product-locality-principle.md +129 -0
- package/.onto/principles/productization-charter.md +569 -0
- package/.onto/processes/evolve/material-kind-adapter-contract.md +113 -0
- package/.onto/processes/reconstruct/reconstruct-boundary-contract.md +366 -0
- package/.onto/processes/reconstruct/source-profile-contract.md +107 -0
- package/.onto/processes/reconstruct/source-profiles/code.md +72 -0
- package/.onto/processes/reconstruct/source-profiles/database.md +74 -0
- package/.onto/processes/reconstruct/source-profiles/document.md +71 -0
- package/.onto/processes/reconstruct/source-profiles/spreadsheet.md +79 -0
- package/.onto/processes/review/binding-contract.md +270 -0
- package/.onto/processes/review/execution-preparation-artifacts.md +281 -0
- package/.onto/processes/review/interpretation-contract.md +245 -0
- package/.onto/processes/review/issue-stance-deliberation-contract.md +761 -0
- package/.onto/processes/review/lens-prompt-contract.md +402 -0
- package/.onto/processes/review/lens-registry.md +127 -0
- package/.onto/processes/review/pre-dispatch-contracts.md +428 -0
- package/.onto/processes/review/productized-live-path.md +398 -0
- package/.onto/processes/review/prompt-execution-runner-contract.md +187 -0
- package/.onto/processes/review/record-contract.md +427 -0
- package/.onto/processes/review/record-field-mapping.md +337 -0
- package/.onto/processes/review/review-context-manifest-contract.md +356 -0
- package/.onto/processes/review/review-execution-ux-contract.md +809 -0
- package/.onto/processes/review/review-target-profile-contract.md +259 -0
- package/.onto/processes/review/shared-phenomenon-contract.md +129 -0
- package/.onto/processes/review/synthesize-prompt-contract.md +343 -0
- package/.onto/processes/shared/target-material-kind-contract.md +198 -0
- package/.onto/roles/axiology.md +81 -0
- package/.onto/roles/conciseness.md +36 -0
- package/.onto/roles/coverage.md +34 -0
- package/.onto/roles/dependency.md +37 -0
- package/.onto/roles/evolution.md +35 -0
- package/.onto/roles/logic.md +104 -0
- package/.onto/roles/pragmatics.md +32 -0
- package/.onto/roles/semantics.md +36 -0
- package/.onto/roles/structure.md +33 -0
- package/.onto/roles/synthesize.md +92 -0
- package/AGENTS.md +240 -0
- package/CLAUDE.md +39 -0
- package/README.md +287 -0
- package/bin/onto +92 -0
- package/dist/cli.js +101 -0
- package/dist/core-api/reconstruct-api.js +222 -0
- package/dist/core-api/review-api.js +1271 -0
- package/dist/core-runtime/cli/assemble-review-record.js +431 -0
- package/dist/core-runtime/cli/bootstrap-review-binding.js +186 -0
- package/dist/core-runtime/cli/codex-nested-dispatch.js +226 -0
- package/dist/core-runtime/cli/codex-nested-dispatch.test.js +390 -0
- package/dist/core-runtime/cli/codex-nested-teamlead-executor.js +464 -0
- package/dist/core-runtime/cli/codex-nested-teamlead-executor.test.js +335 -0
- package/dist/core-runtime/cli/codex-review-unit-executor.js +228 -0
- package/dist/core-runtime/cli/complete-review-session.js +64 -0
- package/dist/core-runtime/cli/complexity-assessment.js +153 -0
- package/dist/core-runtime/cli/coordinator-helpers.js +583 -0
- package/dist/core-runtime/cli/coordinator-state-machine-deliberation.test.js +167 -0
- package/dist/core-runtime/cli/coordinator-state-machine.js +794 -0
- package/dist/core-runtime/cli/e2e-codex-multi-agent-fixes.test.js +615 -0
- package/dist/core-runtime/cli/e2e-start-review-session.test.js +312 -0
- package/dist/core-runtime/cli/health.js +44 -0
- package/dist/core-runtime/cli/inline-http-review-unit-executor.js +656 -0
- package/dist/core-runtime/cli/inline-http-review-unit-executor.test.js +567 -0
- package/dist/core-runtime/cli/materialize-review-execution-preparation.js +104 -0
- package/dist/core-runtime/cli/materialize-review-prompt-packets.js +952 -0
- package/dist/core-runtime/cli/migrate-session-roots.js +118 -0
- package/dist/core-runtime/cli/mock-review-unit-executor.js +285 -0
- package/dist/core-runtime/cli/onto-tools.js +369 -0
- package/dist/core-runtime/cli/prepare-review-session.js +272 -0
- package/dist/core-runtime/cli/render-review-final-output.js +350 -0
- package/dist/core-runtime/cli/repo-layout-migration-replace.smoke.test.js +106 -0
- package/dist/core-runtime/cli/review-invoke-auto-resolution.test.js +268 -0
- package/dist/core-runtime/cli/review-invoke-coordinator-topology.test.js +136 -0
- package/dist/core-runtime/cli/review-invoke-resolver-caching.test.js +201 -0
- package/dist/core-runtime/cli/review-invoke-topology-dispatch.test.js +192 -0
- package/dist/core-runtime/cli/review-invoke.js +2030 -0
- package/dist/core-runtime/cli/run-review-prompt-execution.js +2152 -0
- package/dist/core-runtime/cli/session-root-guard.js +168 -0
- package/dist/core-runtime/cli/spawn-watcher.js +173 -0
- package/dist/core-runtime/cli/spawn-watcher.test.js +457 -0
- package/dist/core-runtime/cli/start-review-session.js +68 -0
- package/dist/core-runtime/cli/strip-wrapping-code-fence.js +56 -0
- package/dist/core-runtime/cli/strip-wrapping-code-fence.test.js +79 -0
- package/dist/core-runtime/cli/teamcreate-lens-deliberation-executor.js +412 -0
- package/dist/core-runtime/cli/teamcreate-lens-deliberation-executor.test.js +351 -0
- package/dist/core-runtime/cli/topology-executor-mapping.js +139 -0
- package/dist/core-runtime/cli/topology-executor-mapping.test.js +173 -0
- package/dist/core-runtime/cli/write-review-interpretation.js +81 -0
- package/dist/core-runtime/config/onto-config-cli.js +278 -0
- package/dist/core-runtime/config/onto-config-key-path.js +288 -0
- package/dist/core-runtime/config/onto-config-key-path.test.js +195 -0
- package/dist/core-runtime/config/onto-config-preview.js +108 -0
- package/dist/core-runtime/config/onto-config-preview.test.js +132 -0
- package/dist/core-runtime/discovery/config-chain.js +118 -0
- package/dist/core-runtime/discovery/config-chain.test.js +103 -0
- package/dist/core-runtime/discovery/config-profile.js +199 -0
- package/dist/core-runtime/discovery/config-profile.test.js +233 -0
- package/dist/core-runtime/discovery/host-detection.js +33 -0
- package/dist/core-runtime/discovery/host-detection.test.js +186 -0
- package/dist/core-runtime/discovery/installation-paths.js +21 -0
- package/dist/core-runtime/discovery/installation-paths.test.js +65 -0
- package/dist/core-runtime/discovery/lens-registry.js +60 -0
- package/dist/core-runtime/discovery/lens-registry.test.js +81 -0
- package/dist/core-runtime/discovery/onto-home.js +71 -0
- package/dist/core-runtime/discovery/path-normalization.js +28 -0
- package/dist/core-runtime/discovery/path-normalization.test.js +22 -0
- package/dist/core-runtime/discovery/plugin-path.js +72 -0
- package/dist/core-runtime/discovery/plugin-path.test.js +95 -0
- package/dist/core-runtime/discovery/project-root.js +47 -0
- package/dist/core-runtime/discovery/settings-chain.js +353 -0
- package/dist/core-runtime/discovery/walk-up.js +17 -0
- package/dist/core-runtime/evolve/adapters/code-product/compile/compile-defense.js +344 -0
- package/dist/core-runtime/evolve/adapters/code-product/compile/compile-defense.test.js +915 -0
- package/dist/core-runtime/evolve/adapters/code-product/compile/compile.js +564 -0
- package/dist/core-runtime/evolve/adapters/code-product/compile/compile.test.js +708 -0
- package/dist/core-runtime/evolve/adapters/code-product/parsers/brief-parser.js +165 -0
- package/dist/core-runtime/evolve/adapters/code-product/parsers/brief-parser.test.js +227 -0
- package/dist/core-runtime/evolve/adapters/code-product/validators/validate.js +59 -0
- package/dist/core-runtime/evolve/adapters/code-product/validators/validate.test.js +205 -0
- package/dist/core-runtime/evolve/adapters/methodology/adapter.js +16 -0
- package/dist/core-runtime/evolve/adapters/methodology/adapter.test.js +9 -0
- package/dist/core-runtime/evolve/adapters/methodology/perspectives/authority-consistency.js +298 -0
- package/dist/core-runtime/evolve/adapters/methodology/perspectives/authority-consistency.test.js +70 -0
- package/dist/core-runtime/evolve/adapters/methodology/scope-types/process.js +46 -0
- package/dist/core-runtime/evolve/adapters/methodology/scope-types/process.test.js +73 -0
- package/dist/core-runtime/evolve/adapters/registry.js +47 -0
- package/dist/core-runtime/evolve/adapters/registry.test.js +67 -0
- package/dist/core-runtime/evolve/cli.js +256 -0
- package/dist/core-runtime/evolve/commands/align.js +194 -0
- package/dist/core-runtime/evolve/commands/align.test.js +82 -0
- package/dist/core-runtime/evolve/commands/apply.js +161 -0
- package/dist/core-runtime/evolve/commands/apply.test.js +138 -0
- package/dist/core-runtime/evolve/commands/close.js +39 -0
- package/dist/core-runtime/evolve/commands/close.test.js +99 -0
- package/dist/core-runtime/evolve/commands/defer.js +40 -0
- package/dist/core-runtime/evolve/commands/defer.test.js +134 -0
- package/dist/core-runtime/evolve/commands/draft.js +323 -0
- package/dist/core-runtime/evolve/commands/draft.test.js +178 -0
- package/dist/core-runtime/evolve/commands/e2e-evolve-full-cycle.test.js +208 -0
- package/dist/core-runtime/evolve/commands/error-messages.js +125 -0
- package/dist/core-runtime/evolve/commands/error-messages.test.js +167 -0
- package/dist/core-runtime/evolve/commands/propose-align.js +222 -0
- package/dist/core-runtime/evolve/commands/propose-align.test.js +136 -0
- package/dist/core-runtime/evolve/commands/reconstruct.js +330 -0
- package/dist/core-runtime/evolve/commands/reconstruct.test.js +278 -0
- package/dist/core-runtime/evolve/commands/shared.js +22 -0
- package/dist/core-runtime/evolve/commands/stale-check.js +103 -0
- package/dist/core-runtime/evolve/commands/stale-check.test.js +84 -0
- package/dist/core-runtime/evolve/commands/start.js +887 -0
- package/dist/core-runtime/evolve/commands/start.test.js +396 -0
- package/dist/core-runtime/evolve/config/project-config.js +99 -0
- package/dist/core-runtime/evolve/config/project-config.test.js +170 -0
- package/dist/core-runtime/evolve/renderers/align-packet.js +280 -0
- package/dist/core-runtime/evolve/renderers/align-packet.test.js +332 -0
- package/dist/core-runtime/evolve/renderers/draft-packet.js +303 -0
- package/dist/core-runtime/evolve/renderers/draft-packet.test.js +377 -0
- package/dist/core-runtime/evolve/renderers/format.js +5 -0
- package/dist/core-runtime/evolve/renderers/scope-md.js +237 -0
- package/dist/core-runtime/evolve/renderers/scope-md.test.js +306 -0
- package/dist/core-runtime/govern/cli.js +369 -0
- package/dist/core-runtime/govern/cli.test.js +314 -0
- package/dist/core-runtime/govern/drift-engine.js +103 -0
- package/dist/core-runtime/govern/drift-engine.test.js +319 -0
- package/dist/core-runtime/govern/promote-principle.js +206 -0
- package/dist/core-runtime/govern/promote-principle.test.js +368 -0
- package/dist/core-runtime/govern/queue.js +81 -0
- package/dist/core-runtime/govern/types.js +16 -0
- package/dist/core-runtime/install/cli.js +530 -0
- package/dist/core-runtime/install/detect.js +128 -0
- package/dist/core-runtime/install/detect.test.js +155 -0
- package/dist/core-runtime/install/gitignore-update.js +74 -0
- package/dist/core-runtime/install/gitignore-update.test.js +64 -0
- package/dist/core-runtime/install/install-integration.test.js +373 -0
- package/dist/core-runtime/install/prompts.js +389 -0
- package/dist/core-runtime/install/prompts.test.js +293 -0
- package/dist/core-runtime/install/types.js +26 -0
- package/dist/core-runtime/install/validation.js +295 -0
- package/dist/core-runtime/install/validation.test.js +313 -0
- package/dist/core-runtime/install/writer.js +254 -0
- package/dist/core-runtime/install/writer.test.js +218 -0
- package/dist/core-runtime/learning/extractor.js +461 -0
- package/dist/core-runtime/learning/feedback.js +179 -0
- package/dist/core-runtime/learning/health-report.js +165 -0
- package/dist/core-runtime/learning/health-report.test.js +169 -0
- package/dist/core-runtime/learning/loader.js +388 -0
- package/dist/core-runtime/learning/loader.test.js +102 -0
- package/dist/core-runtime/learning/promote/apply-state.js +240 -0
- package/dist/core-runtime/learning/promote/audit-obligation.js +195 -0
- package/dist/core-runtime/learning/promote/collector.js +432 -0
- package/dist/core-runtime/learning/promote/degraded-state.js +125 -0
- package/dist/core-runtime/learning/promote/domain-doc-proposer.js +166 -0
- package/dist/core-runtime/learning/promote/e2e-promote.test.js +6385 -0
- package/dist/core-runtime/learning/promote/health-snapshot.js +150 -0
- package/dist/core-runtime/learning/promote/insight-reclassifier.js +544 -0
- package/dist/core-runtime/learning/promote/judgment-auditor.js +517 -0
- package/dist/core-runtime/learning/promote/panel-reviewer.js +1158 -0
- package/dist/core-runtime/learning/promote/promote-executor.js +1675 -0
- package/dist/core-runtime/learning/promote/promoter.js +307 -0
- package/dist/core-runtime/learning/promote/retirement.js +122 -0
- package/dist/core-runtime/learning/promote/types.js +23 -0
- package/dist/core-runtime/learning/prompt-sections.js +51 -0
- package/dist/core-runtime/learning/shared/artifact-registry-init.js +45 -0
- package/dist/core-runtime/learning/shared/artifact-registry.js +254 -0
- package/dist/core-runtime/learning/shared/audit-obligation-kernel.js +73 -0
- package/dist/core-runtime/learning/shared/audit-state.js +99 -0
- package/dist/core-runtime/learning/shared/duplicate-check.js +28 -0
- package/dist/core-runtime/learning/shared/llm-caller.js +831 -0
- package/dist/core-runtime/learning/shared/llm-caller.test.js +601 -0
- package/dist/core-runtime/learning/shared/llm-tool-loop.js +393 -0
- package/dist/core-runtime/learning/shared/mode.js +25 -0
- package/dist/core-runtime/learning/shared/paths.js +84 -0
- package/dist/core-runtime/learning/shared/paths.test.js +79 -0
- package/dist/core-runtime/learning/shared/patterns.js +37 -0
- package/dist/core-runtime/learning/shared/recoverability.js +355 -0
- package/dist/core-runtime/learning/shared/recovery-context.js +374 -0
- package/dist/core-runtime/learning/shared/scope.js +1 -0
- package/dist/core-runtime/learning/shared/semantic-classifier.js +94 -0
- package/dist/core-runtime/learning/shared/specs/apply-execution-state-spec.js +42 -0
- package/dist/core-runtime/learning/shared/specs/audit-state-spec.js +37 -0
- package/dist/core-runtime/learning/shared/specs/backup-metadata-spec.js +39 -0
- package/dist/core-runtime/learning/shared/specs/emergency-log-spec.js +41 -0
- package/dist/core-runtime/learning/shared/specs/layout-version-spec.js +38 -0
- package/dist/core-runtime/learning/shared/specs/promote-decisions-spec.js +43 -0
- package/dist/core-runtime/learning/shared/specs/promote-report-spec.js +113 -0
- package/dist/core-runtime/learning/shared/specs/prune-log-spec.js +36 -0
- package/dist/core-runtime/learning/shared/specs/recovery-resolution-spec.js +48 -0
- package/dist/core-runtime/learning/shared/specs/restore-manifest-spec.js +43 -0
- package/dist/core-runtime/learning/shared/specs/spec-helpers.js +64 -0
- package/dist/core-runtime/learning/usage-tracker.js +190 -0
- package/dist/core-runtime/learning/usage-tracker.test.js +176 -0
- package/dist/core-runtime/llm/llm-caller.js +649 -0
- package/dist/core-runtime/llm/llm-tool-loop.js +401 -0
- package/dist/core-runtime/llm/model-switcher.js +62 -0
- package/dist/core-runtime/logger.js +22 -0
- package/dist/core-runtime/onboard/detect-review-axes.js +122 -0
- package/dist/core-runtime/onboard/detect-review-axes.test.js +127 -0
- package/dist/core-runtime/onboard/write-review-block.js +188 -0
- package/dist/core-runtime/onboard/write-review-block.test.js +240 -0
- package/dist/core-runtime/readers/brownfield-builder.js +150 -0
- package/dist/core-runtime/readers/brownfield-builder.test.js +136 -0
- package/dist/core-runtime/readers/code-chunk-collector.js +53 -0
- package/dist/core-runtime/readers/code-chunk-collector.test.js +136 -0
- package/dist/core-runtime/readers/file-utils.js +240 -0
- package/dist/core-runtime/readers/file-utils.test.js +146 -0
- package/dist/core-runtime/readers/lexicon-citation-check.js +93 -0
- package/dist/core-runtime/readers/lexicon-citation-check.test.js +77 -0
- package/dist/core-runtime/readers/mcp-figma.js +30 -0
- package/dist/core-runtime/readers/mcp-figma.test.js +82 -0
- package/dist/core-runtime/readers/mcp-generic.js +31 -0
- package/dist/core-runtime/readers/mcp-generic.test.js +76 -0
- package/dist/core-runtime/readers/ontology-index.js +148 -0
- package/dist/core-runtime/readers/ontology-index.test.js +245 -0
- package/dist/core-runtime/readers/ontology-query.js +168 -0
- package/dist/core-runtime/readers/ontology-query.test.js +311 -0
- package/dist/core-runtime/readers/ontology-resolve.js +48 -0
- package/dist/core-runtime/readers/ontology-resolve.test.js +48 -0
- package/dist/core-runtime/readers/patterns/index.js +7 -0
- package/dist/core-runtime/readers/review-log.js +213 -0
- package/dist/core-runtime/readers/review-log.test.js +313 -0
- package/dist/core-runtime/readers/scan-local.js +102 -0
- package/dist/core-runtime/readers/scan-local.test.js +102 -0
- package/dist/core-runtime/readers/scan-tarball.js +121 -0
- package/dist/core-runtime/readers/scan-tarball.test.js +283 -0
- package/dist/core-runtime/readers/scan-vault.js +34 -0
- package/dist/core-runtime/readers/scan-vault.test.js +81 -0
- package/dist/core-runtime/readers/types.js +42 -0
- package/dist/core-runtime/readers/types.test.js +94 -0
- package/dist/core-runtime/readers/viewpoint-collectors.js +229 -0
- package/dist/core-runtime/reconstruct/artifact-types.js +1 -0
- package/dist/core-runtime/reconstruct/directive-validation.js +123 -0
- package/dist/core-runtime/reconstruct/materialize-preparation.js +251 -0
- package/dist/core-runtime/reconstruct/record.js +198 -0
- package/dist/core-runtime/reconstruct/run.js +578 -0
- package/dist/core-runtime/reconstruct/seed-candidate-validation.js +356 -0
- package/dist/core-runtime/reconstruct/source-observations.js +62 -0
- package/dist/core-runtime/reconstruct/source-profiles.js +73 -0
- package/dist/core-runtime/release-channel/release-channel.js +90 -0
- package/dist/core-runtime/review/artifact-types.js +13 -0
- package/dist/core-runtime/review/citation-audit.js +204 -0
- package/dist/core-runtime/review/citation-audit.test.js +165 -0
- package/dist/core-runtime/review/controlled-lens-deliberation.js +125 -0
- package/dist/core-runtime/review/execution-plan-resolver.js +247 -0
- package/dist/core-runtime/review/execution-plan-resolver.test.js +243 -0
- package/dist/core-runtime/review/execution-topology-resolver-axis-first.test.js +246 -0
- package/dist/core-runtime/review/execution-topology-resolver.js +401 -0
- package/dist/core-runtime/review/execution-topology-resolver.test.js +315 -0
- package/dist/core-runtime/review/failure-records.js +57 -0
- package/dist/core-runtime/review/inline-context-embedder.js +141 -0
- package/dist/core-runtime/review/inline-context-embedder.test.js +154 -0
- package/dist/core-runtime/review/issue-artifact-runtime.js +859 -0
- package/dist/core-runtime/review/legacy-mode-policy.js +88 -0
- package/dist/core-runtime/review/lens-completion-policy.js +17 -0
- package/dist/core-runtime/review/materializers-effort-persist.test.js +79 -0
- package/dist/core-runtime/review/materializers.js +963 -0
- package/dist/core-runtime/review/ontology-path-classifier.js +179 -0
- package/dist/core-runtime/review/ontology-path-classifier.test.js +216 -0
- package/dist/core-runtime/review/packet-boundary-policy.js +215 -0
- package/dist/core-runtime/review/packet-boundary-policy.test.js +107 -0
- package/dist/core-runtime/review/participating-lens-paths.js +61 -0
- package/dist/core-runtime/review/participating-lens-paths.test.js +73 -0
- package/dist/core-runtime/review/review-artifact-utils.js +287 -0
- package/dist/core-runtime/review/review-config-legacy-translate.js +244 -0
- package/dist/core-runtime/review/review-config-legacy-translate.test.js +161 -0
- package/dist/core-runtime/review/review-config-validator.js +289 -0
- package/dist/core-runtime/review/review-config-validator.test.js +236 -0
- package/dist/core-runtime/review/review-execution-profile.js +193 -0
- package/dist/core-runtime/review/review-execution-route.js +52 -0
- package/dist/core-runtime/review/review-progress-contract.js +123 -0
- package/dist/core-runtime/review/review-record-validation.js +251 -0
- package/dist/core-runtime/review/review-result-classification.js +379 -0
- package/dist/core-runtime/review/review-state-machine.js +39 -0
- package/dist/core-runtime/review/route-visibility.js +125 -0
- package/dist/core-runtime/review/shape-pipeline-audit.test.js +311 -0
- package/dist/core-runtime/review/shape-to-topology-id.js +117 -0
- package/dist/core-runtime/review/shape-to-topology-id.test.js +132 -0
- package/dist/core-runtime/review/topology-shape-derivation.js +155 -0
- package/dist/core-runtime/review/topology-shape-derivation.test.js +195 -0
- package/dist/core-runtime/scope-runtime/constants.js +12 -0
- package/dist/core-runtime/scope-runtime/constraint-pool.js +166 -0
- package/dist/core-runtime/scope-runtime/constraint-pool.test.js +674 -0
- package/dist/core-runtime/scope-runtime/domain-validation-log.js +135 -0
- package/dist/core-runtime/scope-runtime/domain-validation-log.test.js +156 -0
- package/dist/core-runtime/scope-runtime/eval-persistence.js +65 -0
- package/dist/core-runtime/scope-runtime/eval-persistence.test.js +84 -0
- package/dist/core-runtime/scope-runtime/event-pipeline.js +64 -0
- package/dist/core-runtime/scope-runtime/event-pipeline.test.js +450 -0
- package/dist/core-runtime/scope-runtime/event-store.js +39 -0
- package/dist/core-runtime/scope-runtime/event-store.test.js +95 -0
- package/dist/core-runtime/scope-runtime/gate-guard.js +348 -0
- package/dist/core-runtime/scope-runtime/gate-guard.test.js +1047 -0
- package/dist/core-runtime/scope-runtime/hash.js +4 -0
- package/dist/core-runtime/scope-runtime/hash.test.js +33 -0
- package/dist/core-runtime/scope-runtime/id.js +4 -0
- package/dist/core-runtime/scope-runtime/id.test.js +17 -0
- package/dist/core-runtime/scope-runtime/reducer.js +297 -0
- package/dist/core-runtime/scope-runtime/reducer.test.js +759 -0
- package/dist/core-runtime/scope-runtime/scope-manager.js +161 -0
- package/dist/core-runtime/scope-runtime/state-machine.js +309 -0
- package/dist/core-runtime/scope-runtime/state-machine.test.js +704 -0
- package/dist/core-runtime/scope-runtime/types.js +116 -0
- package/dist/core-runtime/scope-runtime/types.test.js +69 -0
- package/dist/core-runtime/target-material-kind.js +256 -0
- package/dist/core-runtime/translate/render-for-user.js +169 -0
- package/dist/core-runtime/translate/render-for-user.test.js +122 -0
- package/dist/mcp/server.js +1011 -0
- package/dist/mcp/tool-schemas.js +93 -0
- package/dist/providers/capability-contract.js +1 -0
- package/package.json +68 -0
- 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
|
+
}
|