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